static void release_appl(struct capi_ctr *ctr, u16 applid) { DBG("applid %#x", applid); ctr->release_appl(ctr, applid); capi_ctr_put(ctr); }
void capi_ctr_reseted(struct capi_ctr * card) { u16 appl; DBG(""); if (card->cardstate == CARD_DETECTED) return; card->cardstate = CARD_DETECTED; memset(card->manu, 0, sizeof(card->manu)); memset(&card->version, 0, sizeof(card->version)); memset(&card->profile, 0, sizeof(card->profile)); memset(card->serial, 0, sizeof(card->serial)); for (appl = 1; appl <= CAPI_MAXAPPL; appl++) { struct capi20_appl *ap = get_capi_appl_by_nr(appl); if (!ap) continue; capi_ctr_put(card); } printk(KERN_NOTICE "kcapi: card %d down.\n", card->cnr); notify_push(KCI_CONTRDOWN, card->cnr, 0, 0); }
static void release_appl(struct capi_ctr *card, u16 applid) { DBG("applid %#x", applid); card->release_appl(card, applid); capi_ctr_put(card); }
static void ctr_down(struct capi_ctr *ctr, int new_state) { struct capi20_appl *ap; u16 applid; if (ctr->state == CAPI_CTR_DETECTED || ctr->state == CAPI_CTR_DETACHED) return; ctr->state = new_state; memset(ctr->manu, 0, sizeof(ctr->manu)); memset(&ctr->version, 0, sizeof(ctr->version)); memset(&ctr->profile, 0, sizeof(ctr->profile)); memset(ctr->serial, 0, sizeof(ctr->serial)); for (applid = 1; applid <= CAPI_MAXAPPL; applid++) { ap = __get_capi_appl_by_nr(applid); if (ap) capi_ctr_put(ctr); } wake_up_interruptible_all(&ctr->state_wait_queue); }
static int old_capi_manufacturer(unsigned int cmd, void *data) { avmb1_loadandconfigdef ldef; avmb1_resetdef rdef; struct capi_ctr *card; capiloaddata ldata; int retval; switch (cmd) { case AVMB1_LOAD: case AVMB1_LOAD_AND_CONFIG: if (cmd == AVMB1_LOAD) { if (copy_from_user((void *)&ldef, data, sizeof(avmb1_loaddef))) return -EFAULT; ldef.t4config.len = 0; ldef.t4config.data = 0; } else { if (copy_from_user((void *)&ldef, data, sizeof(avmb1_loadandconfigdef))) return -EFAULT; } card = get_capi_ctr_by_nr(ldef.contr); card = capi_ctr_get(card); if (!card) return -ESRCH; if (card->load_firmware == 0) { printk(KERN_DEBUG "kcapi: load: no load function\n"); return -ESRCH; } if (ldef.t4file.len <= 0) { printk(KERN_DEBUG "kcapi: load: invalid parameter: length of t4file is %d ?\n", ldef.t4file.len); return -EINVAL; } if (ldef.t4file.data == 0) { printk(KERN_DEBUG "kcapi: load: invalid parameter: dataptr is 0\n"); return -EINVAL; } ldata.firmware.user = 1; ldata.firmware.data = ldef.t4file.data; ldata.firmware.len = ldef.t4file.len; ldata.configuration.user = 1; ldata.configuration.data = ldef.t4config.data; ldata.configuration.len = ldef.t4config.len; if (card->cardstate != CARD_DETECTED) { printk(KERN_INFO "kcapi: load: contr=%d not in detect state\n", ldef.contr); return -EBUSY; } card->cardstate = CARD_LOADING; retval = card->load_firmware(card, &ldata); if (retval) { card->cardstate = CARD_DETECTED; capi_ctr_put(card); return retval; } while (card->cardstate != CARD_RUNNING) { set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(HZ/10); /* 0.1 sec */ if (signal_pending(current)) { capi_ctr_put(card); return -EINTR; } } capi_ctr_put(card); return 0; case AVMB1_RESETCARD: if (copy_from_user((void *)&rdef, data, sizeof(avmb1_resetdef))) return -EFAULT; card = get_capi_ctr_by_nr(rdef.contr); if (!card) return -ESRCH; if (card->cardstate == CARD_DETECTED) return 0; card->reset_ctr(card); while (card->cardstate > CARD_DETECTED) { set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(HZ/10); /* 0.1 sec */ if (signal_pending(current)) return -EINTR; } return 0; } return -EINVAL; }