lkml.org 
[lkml]   [2007]   [Jul]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 3/5] HiSax: modularize card setup; introduce simple hotplug API

    commit 8571a5d1c62f5b129612bcb978827ed9e542bda2
    Author: Jeff Garzik <jeff@garzik.org>
    Date: Sun Jul 15 03:56:11 2007 -0400

    [ISDN] HiSax: modularize card setup; introduce simple hotplug API

    1) Now that the previous no-behavior-change code movement patches have
    occurred, we can easily replace the big per-card "call the setup
    function for <this card>" switch statement with a function pointer.

    2) Duplicate and modify slightly the hotplug logic found in existing
    function hisax_init_pcmcia(), to make it easily usable by modular
    drivers.

    Signed-off-by: Jeff Garzik <jeff@garzik.org>

    drivers/isdn/hisax/config.c | 34 +++++++++++++++++++++++++++++-----
    drivers/isdn/hisax/hisax_cfg.h | 3 +++
    2 files changed, 32 insertions(+), 5 deletions(-)

    8571a5d1c62f5b129612bcb978827ed9e542bda2
    diff --git a/drivers/isdn/hisax/config.c b/drivers/isdn/hisax/config.c
    index 23b5412..e5c972b 100644
    --- a/drivers/isdn/hisax/config.c
    +++ b/drivers/isdn/hisax/config.c
    @@ -1168,7 +1168,9 @@ outf_cs:
    return ret;
    }

    -static int checkcard(int cardnr, char *id, int *busy_flag, struct module *lockowner)
    +static int checkcard(int cardnr, char *id, int *busy_flag,
    + struct module *lockowner,
    + hisax_setup_func_t card_setup)
    {
    int ret;
    struct IsdnCard *card = cards + cardnr;
    @@ -1186,7 +1188,7 @@ static int checkcard(int cardnr, char *id, int *busy_flag, struct module *lockow
    (card->protocol == ISDN_PTYPE_NI1) ? "NI1" :
    "NONE", cs->iif.id, cs->myid);

    - ret = hisax_cs_setup_card(card);
    + ret = card_setup(card);
    if (!ret) {
    ll_unload(cs);
    goto outf_cs;
    @@ -1240,7 +1242,8 @@ static int HiSax_inithardware(int *busy_flag)
    else
    sprintf(ids, "%s%d", id, i);
    }
    - if (checkcard(i, ids, busy_flag, THIS_MODULE)) {
    + if (checkcard(i, ids, busy_flag, THIS_MODULE,
    + hisax_cs_setup_card)) {
    foundcards++;
    i++;
    } else {
    @@ -1538,6 +1541,25 @@ static void __exit HiSax_exit(void)
    printk(KERN_INFO "HiSax module removed\n");
    }

    +int hisax_init_hotplug(struct IsdnCard *card, hisax_setup_func_t card_setup)
    +{
    + u_char ids[16];
    + int ret = -1;
    +
    + cards[nrcards] = *card;
    + if (nrcards)
    + sprintf(ids, "HiSax%d", nrcards);
    + else
    + sprintf(ids, "HiSax");
    + if (!checkcard(nrcards, ids, NULL, THIS_MODULE, card_setup))
    + goto error;
    +
    + ret = nrcards;
    + nrcards++;
    +error:
    + return ret;
    +}
    +
    int hisax_init_pcmcia(void *pcm_iob, int *busy_flag, struct IsdnCard *card)
    {
    u_char ids[16];
    @@ -1548,7 +1570,8 @@ int hisax_init_pcmcia(void *pcm_iob, int *busy_flag, struct IsdnCard *card)
    sprintf(ids, "HiSax%d", nrcards);
    else
    sprintf(ids, "HiSax");
    - if (!checkcard(nrcards, ids, busy_flag, THIS_MODULE))
    + if (!checkcard(nrcards, ids, busy_flag, THIS_MODULE,
    + hisax_cs_setup_card))
    goto error;

    ret = nrcards;
    @@ -1558,6 +1581,7 @@ error:
    }

    EXPORT_SYMBOL(hisax_init_pcmcia);
    +EXPORT_SYMBOL(hisax_init_hotplug);
    EXPORT_SYMBOL(HiSax_closecard);

    #include "hisax_if.h"
    @@ -1594,7 +1618,7 @@ int hisax_register(struct hisax_d_if *hisax_d_if, struct hisax_b_if *b_if[],
    cards[i].protocol = protocol;
    sprintf(id, "%s%d", name, i);
    nrcards++;
    - retval = checkcard(i, id, NULL, hisax_d_if->owner);
    + retval = checkcard(i, id, NULL, hisax_d_if->owner, hisax_cs_setup_card);
    if (retval == 0) { // yuck
    cards[i].typ = 0;
    nrcards--;
    diff --git a/drivers/isdn/hisax/hisax_cfg.h b/drivers/isdn/hisax/hisax_cfg.h
    index ca3fe62..ec309d4 100644
    --- a/drivers/isdn/hisax/hisax_cfg.h
    +++ b/drivers/isdn/hisax/hisax_cfg.h
    @@ -60,5 +60,8 @@ struct IsdnCard {
    IsdnCardState_t *cs;
    };

    +typedef int (*hisax_setup_func_t)(struct IsdnCard *card);
    +
    extern void HiSax_closecard(int);
    extern int hisax_init_pcmcia(void *, int *, IsdnCard_t *);
    +extern int hisax_init_hotplug(IsdnCard_t *, hisax_setup_func_t card_setup);
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2007-07-15 12:03    [W:0.034 / U:5.320 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site