lkml.org 
[lkml]   [2010]   [Jan]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 08/31] CAPI: Rework capi_ctr_ready/down
    This step prepares the application of proper controller locking: Push
    all state changing work into the notify handler that are called by
    capi_ctr_ready and capi_ctr_down, switch detach_capi_ctr to issue a
    synchronous ctr_down. Also ensure that we do not go through any action
    if the state did not change.

    Signed-off-by: Jan Kiszka <jan.kiszka@web.de>
    ---
    drivers/isdn/capi/kcapi.c | 95 +++++++++++++++++++++++---------------------
    1 files changed, 50 insertions(+), 45 deletions(-)

    diff --git a/drivers/isdn/capi/kcapi.c b/drivers/isdn/capi/kcapi.c
    index 476239f..3fcc95b 100644
    --- a/drivers/isdn/capi/kcapi.c
    +++ b/drivers/isdn/capi/kcapi.c
    @@ -169,44 +169,74 @@ static void release_appl(struct capi_ctr *ctr, u16 applid)

    static void notify_up(u32 contr)
    {
    - struct capi_ctr *ctr = get_capi_ctr_by_nr(contr);
    struct capi20_appl *ap;
    + struct capi_ctr *ctr;
    u16 applid;

    - if (showcapimsgs & 1) {
    + if (showcapimsgs & 1)
    printk(KERN_DEBUG "kcapi: notify up contr %dn", contr);
    - }
    - if (!ctr) {
    +
    + ctr = get_capi_ctr_by_nr(contr);
    + if (ctr) {
    + if (ctr->state == CAPI_CTR_RUNNING)
    + return;
    +
    + ctr->state = CAPI_CTR_RUNNING;
    +
    + for (applid = 1; applid <= CAPI_MAXAPPL; applid++) {
    + ap = get_capi_appl_by_nr(applid);
    + if (!ap || ap->release_in_progress)
    + continue;
    + register_appl(ctr, applid, &ap->rparam);
    + if (ap->callback && !ap->release_in_progress)
    + ap->callback(KCI_CONTRUP, contr,
    + &ctr->profile);
    + }
    + } else
    printk(KERN_WARNING "%s: invalid contr %dn", __func__, contr);
    - return;
    - }
    - for (applid = 1; applid <= CAPI_MAXAPPL; applid++) {
    - ap = get_capi_appl_by_nr(applid);
    - if (!ap || ap->release_in_progress) continue;
    - register_appl(ctr, applid, &ap->rparam);
    - if (ap->callback && !ap->release_in_progress)
    - ap->callback(KCI_CONTRUP, contr, &ctr->profile);
    - }
    }

    /* -------- KCI_CONTRDOWN ------------------------------------- */

    -static void notify_down(u32 contr)
    +static void ctr_down(struct capi_ctr *ctr)
    {
    struct capi20_appl *ap;
    u16 applid;

    - if (showcapimsgs & 1) {
    - printk(KERN_DEBUG "kcapi: notify down contr %dn", contr);
    - }
    + if (ctr->state == CAPI_CTR_DETECTED)
    + return;
    +
    + ctr->state = CAPI_CTR_DETECTED;
    +
    + 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 && ap->callback && !ap->release_in_progress)
    - ap->callback(KCI_CONTRDOWN, contr, NULL);
    + if (ap && !ap->release_in_progress) {
    + if (ap->callback)
    + ap->callback(KCI_CONTRDOWN, ctr->cnr, NULL);
    + capi_ctr_put(ctr);
    + }
    }
    }

    +static void notify_down(u32 contr)
    +{
    + struct capi_ctr *ctr;
    +
    + if (showcapimsgs & 1)
    + printk(KERN_DEBUG "kcapi: notify down contr %dn", contr);
    +
    + ctr = get_capi_ctr_by_nr(contr);
    + if (ctr)
    + ctr_down(ctr);
    + else
    + printk(KERN_WARNING "%s: invalid contr %dn", __func__, contr);
    +}
    +
    static void notify_handler(struct work_struct *work)
    {
    struct capi_notifier *np =
    @@ -368,8 +398,6 @@ EXPORT_SYMBOL(capi_ctr_handle_message);

    void capi_ctr_ready(struct capi_ctr *ctr)
    {
    - ctr->state = CAPI_CTR_RUNNING;
    -
    printk(KERN_NOTICE "kcapi: controller [%03d] "%s" ready.n",
    ctr->cnr, ctr->name);

    @@ -388,28 +416,6 @@ EXPORT_SYMBOL(capi_ctr_ready);

    void capi_ctr_down(struct capi_ctr *ctr)
    {
    - u16 appl;
    -
    - DBG("");
    -
    - if (ctr->state == CAPI_CTR_DETECTED)
    - return;
    -
    - ctr->state = CAPI_CTR_DETECTED;
    -
    - 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 (appl = 1; appl <= CAPI_MAXAPPL; appl++) {
    - struct capi20_appl *ap = get_capi_appl_by_nr(appl);
    - if (!ap || ap->release_in_progress)
    - continue;
    -
    - capi_ctr_put(ctr);
    - }
    -
    printk(KERN_NOTICE "kcapi: controller [%03d] down.n", ctr->cnr);

    notify_push(KCI_CONTRDOWN, ctr->cnr, 0, 0);
    @@ -517,8 +523,7 @@ EXPORT_SYMBOL(attach_capi_ctr);

    int detach_capi_ctr(struct capi_ctr *ctr)
    {
    - if (ctr->state != CAPI_CTR_DETECTED)
    - capi_ctr_down(ctr);
    + ctr_down(ctr);

    ncontrollers--;

    --
    1.6.0.2


    \
     
     \ /
      Last update: 2010-01-23 00:25    [W:0.028 / U:31.232 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site