aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/isdn/hisax/config.c72
1 files changed, 54 insertions, 18 deletions
diff --git a/drivers/isdn/hisax/config.c b/drivers/isdn/hisax/config.c
index 6bc49e6b61be..5f7907e57090 100644
--- a/drivers/isdn/hisax/config.c
+++ b/drivers/isdn/hisax/config.c
@@ -1016,12 +1016,14 @@ static int hisax_cs_setup_card(struct IsdnCard *card)
1016 return ret; 1016 return ret;
1017} 1017}
1018 1018
1019static int checkcard(int cardnr, char *id, int *busy_flag, struct module *lockowner) 1019static int hisax_cs_new(int cardnr, char *id, struct IsdnCard *card,
1020 struct IsdnCardState **cs_out, int *busy_flag,
1021 struct module *lockowner)
1020{ 1022{
1021 int ret = 0;
1022 struct IsdnCard *card = cards + cardnr;
1023 struct IsdnCardState *cs; 1023 struct IsdnCardState *cs;
1024 1024
1025 *cs_out = NULL;
1026
1025 cs = kzalloc(sizeof(struct IsdnCardState), GFP_ATOMIC); 1027 cs = kzalloc(sizeof(struct IsdnCardState), GFP_ATOMIC);
1026 if (!cs) { 1028 if (!cs) {
1027 printk(KERN_WARNING 1029 printk(KERN_WARNING
@@ -1098,19 +1100,23 @@ static int checkcard(int cardnr, char *id, int *busy_flag, struct module *lockow
1098 cs->iif.readstat = HiSax_readstatus; 1100 cs->iif.readstat = HiSax_readstatus;
1099 register_isdn(&cs->iif); 1101 register_isdn(&cs->iif);
1100 cs->myid = cs->iif.channels; 1102 cs->myid = cs->iif.channels;
1101 printk(KERN_INFO
1102 "HiSax: Card %d Protocol %s Id=%s (%d)\n", cardnr + 1,
1103 (card->protocol == ISDN_PTYPE_1TR6) ? "1TR6" :
1104 (card->protocol == ISDN_PTYPE_EURO) ? "EDSS1" :
1105 (card->protocol == ISDN_PTYPE_LEASED) ? "LEASED" :
1106 (card->protocol == ISDN_PTYPE_NI1) ? "NI1" :
1107 "NONE", cs->iif.id, cs->myid);
1108 1103
1109 ret = hisax_cs_setup_card(card); 1104 *cs_out = cs;
1110 if (!ret) { 1105 return 1; /* success */
1111 ll_unload(cs); 1106
1112 goto outf_cs; 1107outf_dlog:
1113 } 1108 kfree(cs->dlog);
1109outf_cs:
1110 kfree(cs);
1111 card->cs = NULL;
1112out:
1113 return 0; /* error */
1114}
1115
1116static int hisax_cs_setup(int cardnr, struct IsdnCard *card,
1117 struct IsdnCardState *cs)
1118{
1119 int ret;
1114 1120
1115 if (!(cs->rcvbuf = kmalloc(MAX_DFRAME_LEN_L1, GFP_ATOMIC))) { 1121 if (!(cs->rcvbuf = kmalloc(MAX_DFRAME_LEN_L1, GFP_ATOMIC))) {
1116 printk(KERN_WARNING "HiSax: No memory for isac rcvbuf\n"); 1122 printk(KERN_WARNING "HiSax: No memory for isac rcvbuf\n");
@@ -1154,11 +1160,41 @@ static int checkcard(int cardnr, char *id, int *busy_flag, struct module *lockow
1154 if (!test_bit(HW_ISAR, &cs->HW_Flags)) 1160 if (!test_bit(HW_ISAR, &cs->HW_Flags))
1155 ll_run(cs, 0); 1161 ll_run(cs, 0);
1156 1162
1157 ret = 1; 1163 return 1;
1164
1165outf_cs:
1166 kfree(cs);
1167 card->cs = NULL;
1168 return ret;
1169}
1170
1171static int checkcard(int cardnr, char *id, int *busy_flag, struct module *lockowner)
1172{
1173 int ret;
1174 struct IsdnCard *card = cards + cardnr;
1175 struct IsdnCardState *cs;
1176
1177 ret = hisax_cs_new(cardnr, id, card, &cs, busy_flag, lockowner);
1178 if (!ret)
1179 return 0;
1180
1181 printk(KERN_INFO
1182 "HiSax: Card %d Protocol %s Id=%s (%d)\n", cardnr + 1,
1183 (card->protocol == ISDN_PTYPE_1TR6) ? "1TR6" :
1184 (card->protocol == ISDN_PTYPE_EURO) ? "EDSS1" :
1185 (card->protocol == ISDN_PTYPE_LEASED) ? "LEASED" :
1186 (card->protocol == ISDN_PTYPE_NI1) ? "NI1" :
1187 "NONE", cs->iif.id, cs->myid);
1188
1189 ret = hisax_cs_setup_card(card);
1190 if (!ret) {
1191 ll_unload(cs);
1192 goto outf_cs;
1193 }
1194
1195 ret = hisax_cs_setup(cardnr, card, cs);
1158 goto out; 1196 goto out;
1159 1197
1160 outf_dlog:
1161 kfree(cs->dlog);
1162 outf_cs: 1198 outf_cs:
1163 kfree(cs); 1199 kfree(cs);
1164 card->cs = NULL; 1200 card->cs = NULL;