forked from luck/tmp_suning_uos_patched
tricky one: hisax sections
a) hisax_init_pcmcia() needs to be defined only if we have CONFIG_HOTPLUG (no PCMCIA support otherwise) and can be declared __devinit. b) HiSax_inithardware() can go __init c) hisax_register() is passing to checkcard() full-blown hisax_cs_setup_card(): checkcard(i, id, NULL, hisax_d_if->owner, hisax_cs_setup_card); The problem with it is that * hisax_cs_setup_card() is __devinit * hisax_register() is not * hisax_cs_setup_card() is a switch from hell, calling a lot of setup_some_weirdcard() depending on card->typ. _These_ are also __devinit. However, in hisax_register() we have card->typ equal to ISDN_CTYPE_DYNAMIC, which reduces hisax_cs_setup_card() to "nevermind all that crap, just do nothing and return 2". So we add a trimmed-down callback doing just that and passed to checkcard() by hisax_register(). _This_ is non-init (we can stand the impact on .text size). Voila - no section warnings from drivers/isdn Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
8419641450
commit
56d74dd5f7
|
@ -1213,7 +1213,7 @@ static void HiSax_shiftcards(int idx)
|
||||||
memcpy(&cards[i], &cards[i + 1], sizeof(cards[i]));
|
memcpy(&cards[i], &cards[i + 1], sizeof(cards[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int HiSax_inithardware(int *busy_flag)
|
static int __init HiSax_inithardware(int *busy_flag)
|
||||||
{
|
{
|
||||||
int foundcards = 0;
|
int foundcards = 0;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
@ -1542,7 +1542,9 @@ static void __exit HiSax_exit(void)
|
||||||
printk(KERN_INFO "HiSax module removed\n");
|
printk(KERN_INFO "HiSax module removed\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
int hisax_init_pcmcia(void *pcm_iob, int *busy_flag, struct IsdnCard *card)
|
#ifdef CONFIG_HOTPLUG
|
||||||
|
|
||||||
|
int __devinit hisax_init_pcmcia(void *pcm_iob, int *busy_flag, struct IsdnCard *card)
|
||||||
{
|
{
|
||||||
u_char ids[16];
|
u_char ids[16];
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
@ -1563,6 +1565,8 @@ int hisax_init_pcmcia(void *pcm_iob, int *busy_flag, struct IsdnCard *card)
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(hisax_init_pcmcia);
|
EXPORT_SYMBOL(hisax_init_pcmcia);
|
||||||
|
#endif
|
||||||
|
|
||||||
EXPORT_SYMBOL(HiSax_closecard);
|
EXPORT_SYMBOL(HiSax_closecard);
|
||||||
|
|
||||||
#include "hisax_if.h"
|
#include "hisax_if.h"
|
||||||
|
@ -1580,6 +1584,11 @@ static void hisax_bc_close(struct BCState *bcs);
|
||||||
static void hisax_bh(struct work_struct *work);
|
static void hisax_bh(struct work_struct *work);
|
||||||
static void EChannel_proc_rcv(struct hisax_d_if *d_if);
|
static void EChannel_proc_rcv(struct hisax_d_if *d_if);
|
||||||
|
|
||||||
|
static int hisax_setup_card_dynamic(struct IsdnCard *card)
|
||||||
|
{
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
int hisax_register(struct hisax_d_if *hisax_d_if, struct hisax_b_if *b_if[],
|
int hisax_register(struct hisax_d_if *hisax_d_if, struct hisax_b_if *b_if[],
|
||||||
char *name, int protocol)
|
char *name, int protocol)
|
||||||
{
|
{
|
||||||
|
@ -1599,7 +1608,8 @@ int hisax_register(struct hisax_d_if *hisax_d_if, struct hisax_b_if *b_if[],
|
||||||
cards[i].protocol = protocol;
|
cards[i].protocol = protocol;
|
||||||
sprintf(id, "%s%d", name, i);
|
sprintf(id, "%s%d", name, i);
|
||||||
nrcards++;
|
nrcards++;
|
||||||
retval = checkcard(i, id, NULL, hisax_d_if->owner, hisax_cs_setup_card);
|
retval = checkcard(i, id, NULL, hisax_d_if->owner,
|
||||||
|
hisax_setup_card_dynamic);
|
||||||
if (retval == 0) { // yuck
|
if (retval == 0) { // yuck
|
||||||
cards[i].typ = 0;
|
cards[i].typ = 0;
|
||||||
nrcards--;
|
nrcards--;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user