Lines Matching refs:cs
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()
151 gigaset_add_event(at_state->cs, at_state, EV_TIMEOUT, NULL, in test_timeout()
158 struct cardstate *cs = (struct cardstate *) data; 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()
196 spin_unlock_irqrestore(&bcs->cs->lock, flags); 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()
240 spin_unlock_irqrestore(&bcs->cs->lock, flags); in gigaset_free_channel()
245 module_put(bcs->cs->driver->owner); 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()
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()
313 cs->ev_head = tail; in clear_events()
315 spin_unlock_irqrestore(&cs->ev_lock, flags); in clear_events()
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()
356 cs->ev_tail = next; in gigaset_add_event()
359 spin_unlock_irqrestore(&cs->ev_lock, flags); in gigaset_add_event()
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()
391 bcs->cs->ops->freebcshw(bcs); in gigaset_freebcs()
409 struct cardstate *cs; in alloc_cs() local
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()
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()
438 cs->flags |= mask; 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()
447 cs->flags &= ~mask; in make_invalid()
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
539 at_state->cs = cs; 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
554 inbuf->cs = cs; in gigaset_inbuf_init()
589 dev_err(inbuf->cs->dev, in gigaset_fill_inbuf()
608 static int gigaset_initbcs(struct bc_state *bcs, struct cardstate *cs, in gigaset_initbcs() argument
622 gigaset_at_init(&bcs->at_state, bcs, cs, -1); in gigaset_initbcs()
633 bcs->cs = cs; in gigaset_initbcs()
638 bcs->ignore = cs->ignoreframes; in gigaset_initbcs()
648 return cs->ops->initbcshw(bcs); in gigaset_initbcs()
673 struct cardstate *cs; in gigaset_initcs() local
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 init_timer(&cs->timer); /* clear next & prev */ 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(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()
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 setup_timer(&cs->timer, timer_tick, (unsigned long) cs); in gigaset_initcs()
772 cs->timer.expires = jiffies + msecs_to_jiffies(GIG_TICK); in gigaset_initcs()
773 add_timer(&cs->timer); in gigaset_initcs()
776 return cs; in gigaset_initcs()
780 gigaset_freecs(cs); in gigaset_initcs()
789 struct cardstate *cs = bcs->cs; in gigaset_bcs_reinit() local
795 spin_lock_irqsave(&cs->lock, flags); in gigaset_bcs_reinit()
801 spin_unlock_irqrestore(&cs->lock, flags); in gigaset_bcs_reinit()
812 bcs->ignore = cs->ignoreframes; in gigaset_bcs_reinit()
816 cs->ops->reinitbcshw(bcs); in gigaset_bcs_reinit()
819 static void cleanup_cs(struct cardstate *cs) in cleanup_cs() argument
825 spin_lock_irqsave(&cs->lock, flags); in cleanup_cs()
827 cs->mode = M_UNKNOWN; in cleanup_cs()
828 cs->mstate = MS_UNINITIALIZED; in cleanup_cs()
830 clear_at_state(&cs->at_state); in cleanup_cs()
831 dealloc_temp_at_states(cs); in cleanup_cs()
832 gigaset_at_init(&cs->at_state, NULL, cs, 0); in cleanup_cs()
834 cs->inbuf->inputstate = INS_command; in cleanup_cs()
835 cs->inbuf->head = 0; in cleanup_cs()
836 cs->inbuf->tail = 0; in cleanup_cs()
838 cb = cs->cmdbuf; in cleanup_cs()
844 cs->cmdbuf = cs->lastcmdbuf = NULL; in cleanup_cs()
845 cs->curlen = 0; in cleanup_cs()
846 cs->cmdbytes = 0; in cleanup_cs()
847 cs->gotfwver = -1; in cleanup_cs()
848 cs->dle = 0; in cleanup_cs()
849 cs->cur_at_seq = 0; in cleanup_cs()
850 cs->commands_pending = 0; in cleanup_cs()
851 cs->cbytes = 0; in cleanup_cs()
853 spin_unlock_irqrestore(&cs->lock, flags); in cleanup_cs()
855 for (i = 0; i < cs->channels; ++i) { in cleanup_cs()
856 gigaset_freebcs(cs->bcs + i); in cleanup_cs()
857 if (gigaset_initbcs(cs->bcs + i, cs, i) < 0) in cleanup_cs()
861 if (cs->waiting) { in cleanup_cs()
862 cs->cmd_result = -ENODEV; in cleanup_cs()
863 cs->waiting = 0; in cleanup_cs()
864 wake_up_interruptible(&cs->waitqueue); in cleanup_cs()
880 int gigaset_start(struct cardstate *cs) in gigaset_start() argument
884 if (mutex_lock_interruptible(&cs->mutex)) in gigaset_start()
887 spin_lock_irqsave(&cs->lock, flags); in gigaset_start()
888 cs->connected = 1; in gigaset_start()
889 spin_unlock_irqrestore(&cs->lock, flags); in gigaset_start()
891 if (cs->mstate != MS_LOCKED) { in gigaset_start()
892 cs->ops->set_modem_ctrl(cs, 0, TIOCM_DTR | TIOCM_RTS); in gigaset_start()
893 cs->ops->baud_rate(cs, B115200); in gigaset_start()
894 cs->ops->set_line_ctrl(cs, CS8); in gigaset_start()
895 cs->control_state = TIOCM_DTR | TIOCM_RTS; in gigaset_start()
898 cs->waiting = 1; in gigaset_start()
900 if (!gigaset_add_event(cs, &cs->at_state, EV_START, NULL, 0, NULL)) { in gigaset_start()
901 cs->waiting = 0; in gigaset_start()
904 gigaset_schedule_event(cs); in gigaset_start()
906 wait_event(cs->waitqueue, !cs->waiting); in gigaset_start()
908 mutex_unlock(&cs->mutex); in gigaset_start()
912 mutex_unlock(&cs->mutex); in gigaset_start()
927 int gigaset_shutdown(struct cardstate *cs) in gigaset_shutdown() argument
929 mutex_lock(&cs->mutex); in gigaset_shutdown()
931 if (!(cs->flags & VALID_MINOR)) { in gigaset_shutdown()
932 mutex_unlock(&cs->mutex); in gigaset_shutdown()
936 cs->waiting = 1; in gigaset_shutdown()
938 if (!gigaset_add_event(cs, &cs->at_state, EV_SHUTDOWN, NULL, 0, NULL)) in gigaset_shutdown()
940 gigaset_schedule_event(cs); in gigaset_shutdown()
942 wait_event(cs->waitqueue, !cs->waiting); in gigaset_shutdown()
944 cleanup_cs(cs); in gigaset_shutdown()
947 mutex_unlock(&cs->mutex); in gigaset_shutdown()
959 void gigaset_stop(struct cardstate *cs) in gigaset_stop() argument
961 mutex_lock(&cs->mutex); in gigaset_stop()
963 cs->waiting = 1; in gigaset_stop()
965 if (!gigaset_add_event(cs, &cs->at_state, EV_STOP, NULL, 0, NULL)) in gigaset_stop()
967 gigaset_schedule_event(cs); in gigaset_stop()
969 wait_event(cs->waitqueue, !cs->waiting); in gigaset_stop()
971 cleanup_cs(cs); in gigaset_stop()
974 mutex_unlock(&cs->mutex); in gigaset_stop()
985 struct cardstate *cs; in gigaset_get_cs_by_id() local
993 cs = drv->cs + i; in gigaset_get_cs_by_id()
994 if ((cs->flags & VALID_ID) && cs->myid == id) { in gigaset_get_cs_by_id()
995 ret = cs; in gigaset_get_cs_by_id()
1020 if (drv->cs[index].flags & VALID_MINOR) in gigaset_get_cs_by_minor()
1021 ret = drv->cs + index; in gigaset_get_cs_by_minor()
1053 kfree(drv->cs); in gigaset_freedriver()
1093 drv->cs = kmalloc(minors * sizeof *drv->cs, GFP_KERNEL); in gigaset_initdriver()
1094 if (!drv->cs) in gigaset_initdriver()
1098 drv->cs[i].flags = 0; in gigaset_initdriver()
1099 drv->cs[i].driver = drv; in gigaset_initdriver()
1100 drv->cs[i].ops = drv->ops; in gigaset_initdriver()
1101 drv->cs[i].minor_index = i; in gigaset_initdriver()
1102 mutex_init(&drv->cs[i].mutex); in gigaset_initdriver()