diff options
| -rw-r--r-- | drivers/isdn/hisax/config.c | 72 |
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 | ||
| 1019 | static int checkcard(int cardnr, char *id, int *busy_flag, struct module *lockowner) | 1019 | static 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; | 1107 | outf_dlog: |
| 1113 | } | 1108 | kfree(cs->dlog); |
| 1109 | outf_cs: | ||
| 1110 | kfree(cs); | ||
| 1111 | card->cs = NULL; | ||
| 1112 | out: | ||
| 1113 | return 0; /* error */ | ||
| 1114 | } | ||
| 1115 | |||
| 1116 | static 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 | |||
| 1165 | outf_cs: | ||
| 1166 | kfree(cs); | ||
| 1167 | card->cs = NULL; | ||
| 1168 | return ret; | ||
| 1169 | } | ||
| 1170 | |||
| 1171 | static 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; |
