• Home
  • Raw
  • Download

Lines Matching +full:cs +full:- +full:out

41  * gigaset_dbg_buffer() - dump data in ASCII and hex for debugging
56 size_t space = sizeof outbuf - 1; in gigaset_dbg_buffer()
57 unsigned char *out = outbuf; in gigaset_dbg_buffer() local
60 while (numin--) { in gigaset_dbg_buffer()
63 if (!space--) in gigaset_dbg_buffer()
65 *out++ = '\\'; in gigaset_dbg_buffer()
68 if (!space--) in gigaset_dbg_buffer()
70 *out++ = '~'; in gigaset_dbg_buffer()
74 if (!space--) in gigaset_dbg_buffer()
76 *out++ = '^'; in gigaset_dbg_buffer()
79 if (!space--) in gigaset_dbg_buffer()
81 *out++ = c; in gigaset_dbg_buffer()
83 *out = 0; in gigaset_dbg_buffer()
89 static int setflags(struct cardstate *cs, unsigned flags, unsigned delay) in setflags() argument
93 r = cs->ops->set_modem_ctrl(cs, cs->control_state, flags); in setflags()
94 cs->control_state = flags; in setflags()
106 int gigaset_enterconfigmode(struct cardstate *cs) in gigaset_enterconfigmode() argument
110 cs->control_state = TIOCM_RTS; in gigaset_enterconfigmode()
112 r = setflags(cs, TIOCM_DTR, 200); in gigaset_enterconfigmode()
115 r = setflags(cs, 0, 200); in gigaset_enterconfigmode()
119 r = setflags(cs, TIOCM_RTS, 100); in gigaset_enterconfigmode()
122 r = setflags(cs, 0, 100); in gigaset_enterconfigmode()
126 r = setflags(cs, TIOCM_RTS | TIOCM_DTR, 800); in gigaset_enterconfigmode()
133 dev_err(cs->dev, "error %d on setuartbits\n", -r); in gigaset_enterconfigmode()
134 cs->control_state = TIOCM_RTS | TIOCM_DTR; in gigaset_enterconfigmode()
135 cs->ops->set_modem_ctrl(cs, 0, TIOCM_RTS | TIOCM_DTR); in gigaset_enterconfigmode()
137 return -1; in gigaset_enterconfigmode()
142 if (!at_state->timer_expires) in test_timeout()
145 if (--at_state->timer_expires) { in test_timeout()
147 at_state, at_state->timer_expires); in test_timeout()
151 gigaset_add_event(at_state->cs, at_state, EV_TIMEOUT, NULL, in test_timeout()
152 at_state->timer_index, NULL); in test_timeout()
158 struct cardstate *cs = from_timer(cs, t, timer); in timer_tick() local
164 spin_lock_irqsave(&cs->lock, flags); in timer_tick()
166 for (channel = 0; channel < cs->channels; ++channel) in timer_tick()
167 if (test_timeout(&cs->bcs[channel].at_state)) in timer_tick()
170 if (test_timeout(&cs->at_state)) in timer_tick()
173 list_for_each_entry(at_state, &cs->temp_at_states, list) in timer_tick()
177 if (cs->running) { in timer_tick()
178 mod_timer(&cs->timer, jiffies + msecs_to_jiffies(GIG_TICK)); in timer_tick()
181 tasklet_schedule(&cs->event_tasklet); in timer_tick()
185 spin_unlock_irqrestore(&cs->lock, flags); in timer_tick()
192 spin_lock_irqsave(&bcs->cs->lock, flags); in gigaset_get_channel()
193 if (bcs->use_count || !try_module_get(bcs->cs->driver->owner)) { in gigaset_get_channel()
195 bcs->channel); in gigaset_get_channel()
196 spin_unlock_irqrestore(&bcs->cs->lock, flags); in gigaset_get_channel()
197 return -EBUSY; in gigaset_get_channel()
199 ++bcs->use_count; in gigaset_get_channel()
200 bcs->busy = 1; in gigaset_get_channel()
201 gig_dbg(DEBUG_CHANNEL, "allocated channel %d", bcs->channel); in gigaset_get_channel()
202 spin_unlock_irqrestore(&bcs->cs->lock, flags); in gigaset_get_channel()
206 struct bc_state *gigaset_get_free_channel(struct cardstate *cs) in gigaset_get_free_channel() argument
211 spin_lock_irqsave(&cs->lock, flags); in gigaset_get_free_channel()
212 if (!try_module_get(cs->driver->owner)) { in gigaset_get_free_channel()
215 spin_unlock_irqrestore(&cs->lock, flags); in gigaset_get_free_channel()
218 for (i = 0; i < cs->channels; ++i) in gigaset_get_free_channel()
219 if (!cs->bcs[i].use_count) { in gigaset_get_free_channel()
220 ++cs->bcs[i].use_count; in gigaset_get_free_channel()
221 cs->bcs[i].busy = 1; in gigaset_get_free_channel()
222 spin_unlock_irqrestore(&cs->lock, flags); in gigaset_get_free_channel()
224 return cs->bcs + i; in gigaset_get_free_channel()
226 module_put(cs->driver->owner); in gigaset_get_free_channel()
227 spin_unlock_irqrestore(&cs->lock, flags); in gigaset_get_free_channel()
236 spin_lock_irqsave(&bcs->cs->lock, flags); in gigaset_free_channel()
237 if (!bcs->busy) { in gigaset_free_channel()
239 bcs->channel); in gigaset_free_channel()
240 spin_unlock_irqrestore(&bcs->cs->lock, flags); in gigaset_free_channel()
243 --bcs->use_count; in gigaset_free_channel()
244 bcs->busy = 0; in gigaset_free_channel()
245 module_put(bcs->cs->driver->owner); in gigaset_free_channel()
246 gig_dbg(DEBUG_CHANNEL, "freed channel %d", bcs->channel); in gigaset_free_channel()
247 spin_unlock_irqrestore(&bcs->cs->lock, flags); in gigaset_free_channel()
250 int gigaset_get_channels(struct cardstate *cs) in gigaset_get_channels() argument
255 spin_lock_irqsave(&cs->lock, flags); in gigaset_get_channels()
256 for (i = 0; i < cs->channels; ++i) in gigaset_get_channels()
257 if (cs->bcs[i].use_count) { in gigaset_get_channels()
258 spin_unlock_irqrestore(&cs->lock, flags); in gigaset_get_channels()
261 return -EBUSY; in gigaset_get_channels()
263 for (i = 0; i < cs->channels; ++i) in gigaset_get_channels()
264 ++cs->bcs[i].use_count; in gigaset_get_channels()
265 spin_unlock_irqrestore(&cs->lock, flags); in gigaset_get_channels()
272 void gigaset_free_channels(struct cardstate *cs) in gigaset_free_channels() argument
278 spin_lock_irqsave(&cs->lock, flags); in gigaset_free_channels()
279 for (i = 0; i < cs->channels; ++i) in gigaset_free_channels()
280 --cs->bcs[i].use_count; in gigaset_free_channels()
281 spin_unlock_irqrestore(&cs->lock, flags); in gigaset_free_channels()
284 void gigaset_block_channels(struct cardstate *cs) in gigaset_block_channels() argument
290 spin_lock_irqsave(&cs->lock, flags); in gigaset_block_channels()
291 for (i = 0; i < cs->channels; ++i) in gigaset_block_channels()
292 ++cs->bcs[i].use_count; in gigaset_block_channels()
293 spin_unlock_irqrestore(&cs->lock, flags); in gigaset_block_channels()
296 static void clear_events(struct cardstate *cs) in clear_events() argument
302 spin_lock_irqsave(&cs->ev_lock, flags); in clear_events()
304 head = cs->ev_head; in clear_events()
305 tail = cs->ev_tail; in clear_events()
308 ev = cs->events + head; in clear_events()
309 kfree(ev->ptr); in clear_events()
313 cs->ev_head = tail; in clear_events()
315 spin_unlock_irqrestore(&cs->ev_lock, flags); in clear_events()
319 * gigaset_add_event() - add event to device event queue
320 * @cs: device descriptor structure.
332 struct event_t *gigaset_add_event(struct cardstate *cs, in gigaset_add_event() argument
342 spin_lock_irqsave(&cs->ev_lock, flags); in gigaset_add_event()
344 tail = cs->ev_tail; in gigaset_add_event()
346 if (unlikely(next == cs->ev_head)) in gigaset_add_event()
347 dev_err(cs->dev, "event queue full\n"); in gigaset_add_event()
349 event = cs->events + tail; in gigaset_add_event()
350 event->type = type; in gigaset_add_event()
351 event->at_state = at_state; in gigaset_add_event()
352 event->cid = -1; in gigaset_add_event()
353 event->ptr = ptr; in gigaset_add_event()
354 event->arg = arg; in gigaset_add_event()
355 event->parameter = parameter; in gigaset_add_event()
356 cs->ev_tail = next; in gigaset_add_event()
359 spin_unlock_irqrestore(&cs->ev_lock, flags); in gigaset_add_event()
370 kfree(at_state->str_var[i]); in clear_at_state()
371 at_state->str_var[i] = NULL; in clear_at_state()
375 static void dealloc_temp_at_states(struct cardstate *cs) in dealloc_temp_at_states() argument
379 list_for_each_entry_safe(cur, next, &cs->temp_at_states, list) { in dealloc_temp_at_states()
380 list_del(&cur->list); in dealloc_temp_at_states()
390 gig_dbg(DEBUG_INIT, "freeing bcs[%d]->hw", bcs->channel); in gigaset_freebcs()
391 bcs->cs->ops->freebcshw(bcs); in gigaset_freebcs()
393 gig_dbg(DEBUG_INIT, "clearing bcs[%d]->at_state", bcs->channel); in gigaset_freebcs()
394 clear_at_state(&bcs->at_state); in gigaset_freebcs()
395 gig_dbg(DEBUG_INIT, "freeing bcs[%d]->skb", bcs->channel); in gigaset_freebcs()
396 dev_kfree_skb(bcs->rx_skb); in gigaset_freebcs()
397 bcs->rx_skb = NULL; in gigaset_freebcs()
400 kfree(bcs->commands[i]); in gigaset_freebcs()
401 bcs->commands[i] = NULL; in gigaset_freebcs()
409 struct cardstate *cs; in alloc_cs() local
412 spin_lock_irqsave(&drv->lock, flags); in alloc_cs()
413 if (drv->blocked) in alloc_cs()
415 for (i = 0; i < drv->minors; ++i) { in alloc_cs()
416 cs = drv->cs + i; in alloc_cs()
417 if (!(cs->flags & VALID_MINOR)) { in alloc_cs()
418 cs->flags = VALID_MINOR; in alloc_cs()
419 ret = cs; in alloc_cs()
424 spin_unlock_irqrestore(&drv->lock, flags); in alloc_cs()
428 static void free_cs(struct cardstate *cs) in free_cs() argument
430 cs->flags = 0; in free_cs()
433 static void make_valid(struct cardstate *cs, unsigned mask) in make_valid() argument
436 struct gigaset_driver *drv = cs->driver; in make_valid()
437 spin_lock_irqsave(&drv->lock, flags); in make_valid()
438 cs->flags |= mask; in make_valid()
439 spin_unlock_irqrestore(&drv->lock, flags); in make_valid()
442 static void make_invalid(struct cardstate *cs, unsigned mask) in make_invalid() argument
445 struct gigaset_driver *drv = cs->driver; in make_invalid()
446 spin_lock_irqsave(&drv->lock, flags); in make_invalid()
447 cs->flags &= ~mask; in make_invalid()
448 spin_unlock_irqrestore(&drv->lock, flags); in make_invalid()
452 * gigaset_freecs() - free all associated ressources of a device
453 * @cs: device descriptor structure.
457 * @cs and all structures referenced from it.
460 void gigaset_freecs(struct cardstate *cs) in gigaset_freecs() argument
465 if (!cs) in gigaset_freecs()
468 mutex_lock(&cs->mutex); in gigaset_freecs()
470 spin_lock_irqsave(&cs->lock, flags); in gigaset_freecs()
471 cs->running = 0; in gigaset_freecs()
472 spin_unlock_irqrestore(&cs->lock, flags); /* event handler and timer are in gigaset_freecs()
475 tasklet_kill(&cs->event_tasklet); in gigaset_freecs()
476 del_timer_sync(&cs->timer); in gigaset_freecs()
478 switch (cs->cs_init) { in gigaset_freecs()
481 for (i = 0; i < cs->channels; ++i) { in gigaset_freecs()
483 gigaset_freebcs(cs->bcs + i); in gigaset_freecs()
487 gigaset_free_dev_sysfs(cs); in gigaset_freecs()
489 gigaset_if_free(cs); in gigaset_freecs()
492 cs->ops->freecshw(cs); in gigaset_freecs()
497 make_invalid(cs, VALID_ID); in gigaset_freecs()
498 gigaset_isdn_unregdev(cs); in gigaset_freecs()
503 clear_at_state(&cs->at_state); in gigaset_freecs()
504 dealloc_temp_at_states(cs); in gigaset_freecs()
505 clear_events(cs); in gigaset_freecs()
506 tty_port_destroy(&cs->port); in gigaset_freecs()
511 kfree(cs->inbuf); in gigaset_freecs()
512 kfree(cs->bcs); in gigaset_freecs()
515 mutex_unlock(&cs->mutex); in gigaset_freecs()
516 free_cs(cs); in gigaset_freecs()
521 struct cardstate *cs, int cid) in gigaset_at_init() argument
525 INIT_LIST_HEAD(&at_state->list); in gigaset_at_init()
526 at_state->waiting = 0; in gigaset_at_init()
527 at_state->getstring = 0; in gigaset_at_init()
528 at_state->pending_commands = 0; in gigaset_at_init()
529 at_state->timer_expires = 0; in gigaset_at_init()
530 at_state->timer_active = 0; in gigaset_at_init()
531 at_state->timer_index = 0; in gigaset_at_init()
532 at_state->seq_index = 0; in gigaset_at_init()
533 at_state->ConState = 0; in gigaset_at_init()
535 at_state->str_var[i] = NULL; in gigaset_at_init()
536 at_state->int_var[VAR_ZDLE] = 0; in gigaset_at_init()
537 at_state->int_var[VAR_ZCTP] = -1; in gigaset_at_init()
538 at_state->int_var[VAR_ZSAU] = ZSAU_NULL; in gigaset_at_init()
539 at_state->cs = cs; in gigaset_at_init()
540 at_state->bcs = bcs; in gigaset_at_init()
541 at_state->cid = cid; in gigaset_at_init()
543 at_state->replystruct = cs->tabnocid; in gigaset_at_init()
545 at_state->replystruct = cs->tabcid; in gigaset_at_init()
549 static void gigaset_inbuf_init(struct inbuf_t *inbuf, struct cardstate *cs) in gigaset_inbuf_init() argument
550 /* inbuf->read must be allocated before! */ in gigaset_inbuf_init()
552 inbuf->head = 0; in gigaset_inbuf_init()
553 inbuf->tail = 0; in gigaset_inbuf_init()
554 inbuf->cs = cs; in gigaset_inbuf_init()
555 inbuf->inputstate = INS_command; in gigaset_inbuf_init()
559 * gigaset_fill_inbuf() - append received data to input buffer
577 tail = inbuf->tail; in gigaset_fill_inbuf()
578 head = inbuf->head; in gigaset_fill_inbuf()
579 gig_dbg(DEBUG_INTR, "buffer state: %u -> %u", head, tail); in gigaset_fill_inbuf()
583 n = head - 1 - tail; in gigaset_fill_inbuf()
585 n = (RBUFSIZE - 1) - tail; in gigaset_fill_inbuf()
587 n = RBUFSIZE - tail; in gigaset_fill_inbuf()
589 dev_err(inbuf->cs->dev, in gigaset_fill_inbuf()
596 memcpy(inbuf->data + tail, src, n); in gigaset_fill_inbuf()
597 bytesleft -= n; in gigaset_fill_inbuf()
602 inbuf->tail = tail; in gigaset_fill_inbuf()
607 /* Initialize the b-channel structure */
608 static int gigaset_initbcs(struct bc_state *bcs, struct cardstate *cs, in gigaset_initbcs() argument
613 bcs->tx_skb = NULL; in gigaset_initbcs()
615 skb_queue_head_init(&bcs->squeue); in gigaset_initbcs()
617 bcs->corrupted = 0; in gigaset_initbcs()
618 bcs->trans_down = 0; in gigaset_initbcs()
619 bcs->trans_up = 0; in gigaset_initbcs()
621 gig_dbg(DEBUG_INIT, "setting up bcs[%d]->at_state", channel); in gigaset_initbcs()
622 gigaset_at_init(&bcs->at_state, bcs, cs, -1); in gigaset_initbcs()
625 bcs->emptycount = 0; in gigaset_initbcs()
628 bcs->rx_bufsize = 0; in gigaset_initbcs()
629 bcs->rx_skb = NULL; in gigaset_initbcs()
630 bcs->rx_fcs = PPP_INITFCS; in gigaset_initbcs()
631 bcs->inputstate = 0; in gigaset_initbcs()
632 bcs->channel = channel; in gigaset_initbcs()
633 bcs->cs = cs; in gigaset_initbcs()
635 bcs->chstate = 0; in gigaset_initbcs()
636 bcs->use_count = 1; in gigaset_initbcs()
637 bcs->busy = 0; in gigaset_initbcs()
638 bcs->ignore = cs->ignoreframes; in gigaset_initbcs()
641 bcs->commands[i] = NULL; in gigaset_initbcs()
643 spin_lock_init(&bcs->aplock); in gigaset_initbcs()
644 bcs->ap = NULL; in gigaset_initbcs()
645 bcs->apconnstate = 0; in gigaset_initbcs()
647 gig_dbg(DEBUG_INIT, " setting up bcs[%d]->hw", channel); in gigaset_initbcs()
648 return cs->ops->initbcshw(bcs); in gigaset_initbcs()
652 * gigaset_initcs() - initialize device structure
673 struct cardstate *cs; in gigaset_initcs() local
677 gig_dbg(DEBUG_INIT, "allocating cs"); in gigaset_initcs()
678 cs = alloc_cs(drv); in gigaset_initcs()
679 if (!cs) { in gigaset_initcs()
684 cs->cs_init = 0; in gigaset_initcs()
685 cs->channels = channels; in gigaset_initcs()
686 cs->onechannel = onechannel; in gigaset_initcs()
687 cs->ignoreframes = ignoreframes; in gigaset_initcs()
688 INIT_LIST_HEAD(&cs->temp_at_states); in gigaset_initcs()
689 cs->running = 0; in gigaset_initcs()
690 timer_setup(&cs->timer, timer_tick, 0); in gigaset_initcs()
691 spin_lock_init(&cs->ev_lock); in gigaset_initcs()
692 cs->ev_tail = 0; in gigaset_initcs()
693 cs->ev_head = 0; in gigaset_initcs()
695 tasklet_init(&cs->event_tasklet, gigaset_handle_event, in gigaset_initcs()
696 (unsigned long) cs); in gigaset_initcs()
697 tty_port_init(&cs->port); in gigaset_initcs()
698 cs->commands_pending = 0; in gigaset_initcs()
699 cs->cur_at_seq = 0; in gigaset_initcs()
700 cs->gotfwver = -1; in gigaset_initcs()
701 cs->dev = NULL; in gigaset_initcs()
702 cs->tty_dev = NULL; in gigaset_initcs()
703 cs->cidmode = cidmode != 0; in gigaset_initcs()
704 cs->tabnocid = gigaset_tab_nocid; in gigaset_initcs()
705 cs->tabcid = gigaset_tab_cid; in gigaset_initcs()
707 init_waitqueue_head(&cs->waitqueue); in gigaset_initcs()
708 cs->waiting = 0; in gigaset_initcs()
710 cs->mode = M_UNKNOWN; in gigaset_initcs()
711 cs->mstate = MS_UNINITIALIZED; in gigaset_initcs()
713 cs->bcs = kmalloc_array(channels, sizeof(struct bc_state), GFP_KERNEL); in gigaset_initcs()
714 cs->inbuf = kmalloc(sizeof(struct inbuf_t), GFP_KERNEL); in gigaset_initcs()
715 if (!cs->bcs || !cs->inbuf) { in gigaset_initcs()
716 pr_err("out of memory\n"); in gigaset_initcs()
719 ++cs->cs_init; in gigaset_initcs()
722 spin_lock_init(&cs->lock); in gigaset_initcs()
723 gigaset_at_init(&cs->at_state, NULL, cs, 0); in gigaset_initcs()
724 cs->dle = 0; in gigaset_initcs()
725 cs->cbytes = 0; in gigaset_initcs()
728 gigaset_inbuf_init(cs->inbuf, cs); in gigaset_initcs()
730 cs->connected = 0; in gigaset_initcs()
731 cs->isdn_up = 0; in gigaset_initcs()
734 cs->cmdbuf = cs->lastcmdbuf = NULL; in gigaset_initcs()
735 spin_lock_init(&cs->cmdlock); in gigaset_initcs()
736 cs->curlen = 0; in gigaset_initcs()
737 cs->cmdbytes = 0; in gigaset_initcs()
740 if (gigaset_isdn_regdev(cs, modulename) < 0) { in gigaset_initcs()
745 make_valid(cs, VALID_ID); in gigaset_initcs()
746 ++cs->cs_init; in gigaset_initcs()
748 if (cs->ops->initcshw(cs) < 0) in gigaset_initcs()
751 ++cs->cs_init; in gigaset_initcs()
754 gigaset_if_init(cs); in gigaset_initcs()
757 gigaset_init_dev_sysfs(cs); in gigaset_initcs()
762 if (gigaset_initbcs(cs->bcs + i, cs, i) < 0) { in gigaset_initcs()
768 spin_lock_irqsave(&cs->lock, flags); in gigaset_initcs()
769 cs->running = 1; in gigaset_initcs()
770 spin_unlock_irqrestore(&cs->lock, flags); in gigaset_initcs()
771 cs->timer.expires = jiffies + msecs_to_jiffies(GIG_TICK); in gigaset_initcs()
772 add_timer(&cs->timer); in gigaset_initcs()
774 gig_dbg(DEBUG_INIT, "cs initialized"); in gigaset_initcs()
775 return cs; in gigaset_initcs()
779 gigaset_freecs(cs); in gigaset_initcs()
784 /* ReInitialize the b-channel structure on hangup */
788 struct cardstate *cs = bcs->cs; in gigaset_bcs_reinit() local
791 while ((skb = skb_dequeue(&bcs->squeue)) != NULL) in gigaset_bcs_reinit()
794 spin_lock_irqsave(&cs->lock, flags); in gigaset_bcs_reinit()
795 clear_at_state(&bcs->at_state); in gigaset_bcs_reinit()
796 bcs->at_state.ConState = 0; in gigaset_bcs_reinit()
797 bcs->at_state.timer_active = 0; in gigaset_bcs_reinit()
798 bcs->at_state.timer_expires = 0; in gigaset_bcs_reinit()
799 bcs->at_state.cid = -1; /* No CID defined */ in gigaset_bcs_reinit()
800 spin_unlock_irqrestore(&cs->lock, flags); in gigaset_bcs_reinit()
802 bcs->inputstate = 0; in gigaset_bcs_reinit()
805 bcs->emptycount = 0; in gigaset_bcs_reinit()
808 bcs->rx_fcs = PPP_INITFCS; in gigaset_bcs_reinit()
809 bcs->chstate = 0; in gigaset_bcs_reinit()
811 bcs->ignore = cs->ignoreframes; in gigaset_bcs_reinit()
812 dev_kfree_skb(bcs->rx_skb); in gigaset_bcs_reinit()
813 bcs->rx_skb = NULL; in gigaset_bcs_reinit()
815 cs->ops->reinitbcshw(bcs); in gigaset_bcs_reinit()
818 static void cleanup_cs(struct cardstate *cs) in cleanup_cs() argument
824 spin_lock_irqsave(&cs->lock, flags); in cleanup_cs()
826 cs->mode = M_UNKNOWN; in cleanup_cs()
827 cs->mstate = MS_UNINITIALIZED; in cleanup_cs()
829 clear_at_state(&cs->at_state); in cleanup_cs()
830 dealloc_temp_at_states(cs); in cleanup_cs()
831 gigaset_at_init(&cs->at_state, NULL, cs, 0); in cleanup_cs()
833 cs->inbuf->inputstate = INS_command; in cleanup_cs()
834 cs->inbuf->head = 0; in cleanup_cs()
835 cs->inbuf->tail = 0; in cleanup_cs()
837 cb = cs->cmdbuf; in cleanup_cs()
840 cb = cb->next; in cleanup_cs()
843 cs->cmdbuf = cs->lastcmdbuf = NULL; in cleanup_cs()
844 cs->curlen = 0; in cleanup_cs()
845 cs->cmdbytes = 0; in cleanup_cs()
846 cs->gotfwver = -1; in cleanup_cs()
847 cs->dle = 0; in cleanup_cs()
848 cs->cur_at_seq = 0; in cleanup_cs()
849 cs->commands_pending = 0; in cleanup_cs()
850 cs->cbytes = 0; in cleanup_cs()
852 spin_unlock_irqrestore(&cs->lock, flags); in cleanup_cs()
854 for (i = 0; i < cs->channels; ++i) { in cleanup_cs()
855 gigaset_freebcs(cs->bcs + i); in cleanup_cs()
856 if (gigaset_initbcs(cs->bcs + i, cs, i) < 0) in cleanup_cs()
860 if (cs->waiting) { in cleanup_cs()
861 cs->cmd_result = -ENODEV; in cleanup_cs()
862 cs->waiting = 0; in cleanup_cs()
863 wake_up_interruptible(&cs->waitqueue); in cleanup_cs()
869 * gigaset_start() - start device operations
870 * @cs: device descriptor structure.
879 int gigaset_start(struct cardstate *cs) in gigaset_start() argument
883 if (mutex_lock_interruptible(&cs->mutex)) in gigaset_start()
884 return -EBUSY; in gigaset_start()
886 spin_lock_irqsave(&cs->lock, flags); in gigaset_start()
887 cs->connected = 1; in gigaset_start()
888 spin_unlock_irqrestore(&cs->lock, flags); in gigaset_start()
890 if (cs->mstate != MS_LOCKED) { in gigaset_start()
891 cs->ops->set_modem_ctrl(cs, 0, TIOCM_DTR | TIOCM_RTS); in gigaset_start()
892 cs->ops->baud_rate(cs, B115200); in gigaset_start()
893 cs->ops->set_line_ctrl(cs, CS8); in gigaset_start()
894 cs->control_state = TIOCM_DTR | TIOCM_RTS; in gigaset_start()
897 cs->waiting = 1; in gigaset_start()
899 if (!gigaset_add_event(cs, &cs->at_state, EV_START, NULL, 0, NULL)) { in gigaset_start()
900 cs->waiting = 0; in gigaset_start()
903 gigaset_schedule_event(cs); in gigaset_start()
905 wait_event(cs->waitqueue, !cs->waiting); in gigaset_start()
907 mutex_unlock(&cs->mutex); in gigaset_start()
911 mutex_unlock(&cs->mutex); in gigaset_start()
912 return -ENOMEM; in gigaset_start()
917 * gigaset_shutdown() - shut down device operations
918 * @cs: device descriptor structure.
924 * 0 - success, -ENODEV - error (no device associated)
926 int gigaset_shutdown(struct cardstate *cs) in gigaset_shutdown() argument
928 mutex_lock(&cs->mutex); in gigaset_shutdown()
930 if (!(cs->flags & VALID_MINOR)) { in gigaset_shutdown()
931 mutex_unlock(&cs->mutex); in gigaset_shutdown()
932 return -ENODEV; in gigaset_shutdown()
935 cs->waiting = 1; in gigaset_shutdown()
937 if (!gigaset_add_event(cs, &cs->at_state, EV_SHUTDOWN, NULL, 0, NULL)) in gigaset_shutdown()
939 gigaset_schedule_event(cs); in gigaset_shutdown()
941 wait_event(cs->waitqueue, !cs->waiting); in gigaset_shutdown()
943 cleanup_cs(cs); in gigaset_shutdown()
946 mutex_unlock(&cs->mutex); in gigaset_shutdown()
952 * gigaset_stop() - stop device operations
953 * @cs: device descriptor structure.
958 void gigaset_stop(struct cardstate *cs) in gigaset_stop() argument
960 mutex_lock(&cs->mutex); in gigaset_stop()
962 cs->waiting = 1; in gigaset_stop()
964 if (!gigaset_add_event(cs, &cs->at_state, EV_STOP, NULL, 0, NULL)) in gigaset_stop()
966 gigaset_schedule_event(cs); in gigaset_stop()
968 wait_event(cs->waitqueue, !cs->waiting); in gigaset_stop()
970 cleanup_cs(cs); in gigaset_stop()
973 mutex_unlock(&cs->mutex); in gigaset_stop()
984 struct cardstate *cs; in gigaset_get_cs_by_id() local
990 spin_lock(&drv->lock); in gigaset_get_cs_by_id()
991 for (i = 0; i < drv->minors; ++i) { in gigaset_get_cs_by_id()
992 cs = drv->cs + i; in gigaset_get_cs_by_id()
993 if ((cs->flags & VALID_ID) && cs->myid == id) { in gigaset_get_cs_by_id()
994 ret = cs; in gigaset_get_cs_by_id()
998 spin_unlock(&drv->lock); in gigaset_get_cs_by_id()
1015 if (minor < drv->minor || minor >= drv->minor + drv->minors) in gigaset_get_cs_by_minor()
1017 index = minor - drv->minor; in gigaset_get_cs_by_minor()
1018 spin_lock(&drv->lock); in gigaset_get_cs_by_minor()
1019 if (drv->cs[index].flags & VALID_MINOR) in gigaset_get_cs_by_minor()
1020 ret = drv->cs + index; in gigaset_get_cs_by_minor()
1021 spin_unlock(&drv->lock); in gigaset_get_cs_by_minor()
1031 return gigaset_get_cs_by_minor(tty->index + tty->driver->minor_start); in gigaset_get_cs_by_tty()
1035 * gigaset_freedriver() - free all associated ressources of a driver
1047 list_del(&drv->list); in gigaset_freedriver()
1052 kfree(drv->cs); in gigaset_freedriver()
1058 * gigaset_initdriver() - initialize driver structure
1083 drv->have_tty = 0; in gigaset_initdriver()
1084 drv->minor = minor; in gigaset_initdriver()
1085 drv->minors = minors; in gigaset_initdriver()
1086 spin_lock_init(&drv->lock); in gigaset_initdriver()
1087 drv->blocked = 0; in gigaset_initdriver()
1088 drv->ops = ops; in gigaset_initdriver()
1089 drv->owner = owner; in gigaset_initdriver()
1090 INIT_LIST_HEAD(&drv->list); in gigaset_initdriver()
1092 drv->cs = kmalloc_array(minors, sizeof(*drv->cs), GFP_KERNEL); in gigaset_initdriver()
1093 if (!drv->cs) in gigaset_initdriver()
1097 drv->cs[i].flags = 0; in gigaset_initdriver()
1098 drv->cs[i].driver = drv; in gigaset_initdriver()
1099 drv->cs[i].ops = drv->ops; in gigaset_initdriver()
1100 drv->cs[i].minor_index = i; in gigaset_initdriver()
1101 mutex_init(&drv->cs[i].mutex); in gigaset_initdriver()
1107 list_add(&drv->list, &drivers); in gigaset_initdriver()
1119 * gigaset_blockdriver() - block driver
1127 drv->blocked = 1; in gigaset_blockdriver()