aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/isdn
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/isdn')
-rw-r--r--drivers/isdn/hisax/config.c187
1 files changed, 99 insertions, 88 deletions
diff --git a/drivers/isdn/hisax/config.c b/drivers/isdn/hisax/config.c
index a43162c2ef15..6bc49e6b61be 100644
--- a/drivers/isdn/hisax/config.c
+++ b/drivers/isdn/hisax/config.c
@@ -847,95 +847,10 @@ static int init_card(struct IsdnCardState *cs)
847 return 3; 847 return 3;
848} 848}
849 849
850static int checkcard(int cardnr, char *id, int *busy_flag, struct module *lockowner) 850static int hisax_cs_setup_card(struct IsdnCard *card)
851{ 851{
852 int ret = 0; 852 int ret;
853 struct IsdnCard *card = cards + cardnr;
854 struct IsdnCardState *cs;
855
856 cs = kzalloc(sizeof(struct IsdnCardState), GFP_ATOMIC);
857 if (!cs) {
858 printk(KERN_WARNING
859 "HiSax: No memory for IsdnCardState(card %d)\n",
860 cardnr + 1);
861 goto out;
862 }
863 card->cs = cs;
864 spin_lock_init(&cs->statlock);
865 spin_lock_init(&cs->lock);
866 cs->chanlimit = 2; /* maximum B-channel number */
867 cs->logecho = 0; /* No echo logging */
868 cs->cardnr = cardnr;
869 cs->debug = L1_DEB_WARN;
870 cs->HW_Flags = 0;
871 cs->busy_flag = busy_flag;
872 cs->irq_flags = I4L_IRQ_FLAG;
873#if TEI_PER_CARD
874 if (card->protocol == ISDN_PTYPE_NI1)
875 test_and_set_bit(FLG_TWO_DCHAN, &cs->HW_Flags);
876#else
877 test_and_set_bit(FLG_TWO_DCHAN, &cs->HW_Flags);
878#endif
879 cs->protocol = card->protocol;
880
881 if (card->typ <= 0 || card->typ > ISDN_CTYPE_COUNT) {
882 printk(KERN_WARNING
883 "HiSax: Card Type %d out of range\n", card->typ);
884 goto outf_cs;
885 }
886 if (!(cs->dlog = kmalloc(MAX_DLOG_SPACE, GFP_ATOMIC))) {
887 printk(KERN_WARNING
888 "HiSax: No memory for dlog(card %d)\n", cardnr + 1);
889 goto outf_cs;
890 }
891 if (!(cs->status_buf = kmalloc(HISAX_STATUS_BUFSIZE, GFP_ATOMIC))) {
892 printk(KERN_WARNING
893 "HiSax: No memory for status_buf(card %d)\n",
894 cardnr + 1);
895 goto outf_dlog;
896 }
897 cs->stlist = NULL;
898 cs->status_read = cs->status_buf;
899 cs->status_write = cs->status_buf;
900 cs->status_end = cs->status_buf + HISAX_STATUS_BUFSIZE - 1;
901 cs->typ = card->typ;
902#ifdef MODULE
903 cs->iif.owner = lockowner;
904#endif
905 strcpy(cs->iif.id, id);
906 cs->iif.channels = 2;
907 cs->iif.maxbufsize = MAX_DATA_SIZE;
908 cs->iif.hl_hdrlen = MAX_HEADER_LEN;
909 cs->iif.features =
910 ISDN_FEATURE_L2_X75I |
911 ISDN_FEATURE_L2_HDLC |
912 ISDN_FEATURE_L2_HDLC_56K |
913 ISDN_FEATURE_L2_TRANS |
914 ISDN_FEATURE_L3_TRANS |
915#ifdef CONFIG_HISAX_1TR6
916 ISDN_FEATURE_P_1TR6 |
917#endif
918#ifdef CONFIG_HISAX_EURO
919 ISDN_FEATURE_P_EURO |
920#endif
921#ifdef CONFIG_HISAX_NI1
922 ISDN_FEATURE_P_NI1 |
923#endif
924 0;
925 853
926 cs->iif.command = HiSax_command;
927 cs->iif.writecmd = NULL;
928 cs->iif.writebuf_skb = HiSax_writebuf_skb;
929 cs->iif.readstat = HiSax_readstatus;
930 register_isdn(&cs->iif);
931 cs->myid = cs->iif.channels;
932 printk(KERN_INFO
933 "HiSax: Card %d Protocol %s Id=%s (%d)\n", cardnr + 1,
934 (card->protocol == ISDN_PTYPE_1TR6) ? "1TR6" :
935 (card->protocol == ISDN_PTYPE_EURO) ? "EDSS1" :
936 (card->protocol == ISDN_PTYPE_LEASED) ? "LEASED" :
937 (card->protocol == ISDN_PTYPE_NI1) ? "NI1" :
938 "NONE", cs->iif.id, cs->myid);
939 switch (card->typ) { 854 switch (card->typ) {
940#if CARD_TELES0 855#if CARD_TELES0
941 case ISDN_CTYPE_16_0: 856 case ISDN_CTYPE_16_0:
@@ -1094,13 +1009,109 @@ static int checkcard(int cardnr, char *id, int *busy_flag, struct module *lockow
1094 printk(KERN_WARNING 1009 printk(KERN_WARNING
1095 "HiSax: Support for %s Card not selected\n", 1010 "HiSax: Support for %s Card not selected\n",
1096 CardType[card->typ]); 1011 CardType[card->typ]);
1097 ll_unload(cs); 1012 ret = 0;
1013 break;
1014 }
1015
1016 return ret;
1017}
1018
1019static int checkcard(int cardnr, char *id, int *busy_flag, struct module *lockowner)
1020{
1021 int ret = 0;
1022 struct IsdnCard *card = cards + cardnr;
1023 struct IsdnCardState *cs;
1024
1025 cs = kzalloc(sizeof(struct IsdnCardState), GFP_ATOMIC);
1026 if (!cs) {
1027 printk(KERN_WARNING
1028 "HiSax: No memory for IsdnCardState(card %d)\n",
1029 cardnr + 1);
1030 goto out;
1031 }
1032 card->cs = cs;
1033 spin_lock_init(&cs->statlock);
1034 spin_lock_init(&cs->lock);
1035 cs->chanlimit = 2; /* maximum B-channel number */
1036 cs->logecho = 0; /* No echo logging */
1037 cs->cardnr = cardnr;
1038 cs->debug = L1_DEB_WARN;
1039 cs->HW_Flags = 0;
1040 cs->busy_flag = busy_flag;
1041 cs->irq_flags = I4L_IRQ_FLAG;
1042#if TEI_PER_CARD
1043 if (card->protocol == ISDN_PTYPE_NI1)
1044 test_and_set_bit(FLG_TWO_DCHAN, &cs->HW_Flags);
1045#else
1046 test_and_set_bit(FLG_TWO_DCHAN, &cs->HW_Flags);
1047#endif
1048 cs->protocol = card->protocol;
1049
1050 if (card->typ <= 0 || card->typ > ISDN_CTYPE_COUNT) {
1051 printk(KERN_WARNING
1052 "HiSax: Card Type %d out of range\n", card->typ);
1098 goto outf_cs; 1053 goto outf_cs;
1099 } 1054 }
1055 if (!(cs->dlog = kmalloc(MAX_DLOG_SPACE, GFP_ATOMIC))) {
1056 printk(KERN_WARNING
1057 "HiSax: No memory for dlog(card %d)\n", cardnr + 1);
1058 goto outf_cs;
1059 }
1060 if (!(cs->status_buf = kmalloc(HISAX_STATUS_BUFSIZE, GFP_ATOMIC))) {
1061 printk(KERN_WARNING
1062 "HiSax: No memory for status_buf(card %d)\n",
1063 cardnr + 1);
1064 goto outf_dlog;
1065 }
1066 cs->stlist = NULL;
1067 cs->status_read = cs->status_buf;
1068 cs->status_write = cs->status_buf;
1069 cs->status_end = cs->status_buf + HISAX_STATUS_BUFSIZE - 1;
1070 cs->typ = card->typ;
1071#ifdef MODULE
1072 cs->iif.owner = lockowner;
1073#endif
1074 strcpy(cs->iif.id, id);
1075 cs->iif.channels = 2;
1076 cs->iif.maxbufsize = MAX_DATA_SIZE;
1077 cs->iif.hl_hdrlen = MAX_HEADER_LEN;
1078 cs->iif.features =
1079 ISDN_FEATURE_L2_X75I |
1080 ISDN_FEATURE_L2_HDLC |
1081 ISDN_FEATURE_L2_HDLC_56K |
1082 ISDN_FEATURE_L2_TRANS |
1083 ISDN_FEATURE_L3_TRANS |
1084#ifdef CONFIG_HISAX_1TR6
1085 ISDN_FEATURE_P_1TR6 |
1086#endif
1087#ifdef CONFIG_HISAX_EURO
1088 ISDN_FEATURE_P_EURO |
1089#endif
1090#ifdef CONFIG_HISAX_NI1
1091 ISDN_FEATURE_P_NI1 |
1092#endif
1093 0;
1094
1095 cs->iif.command = HiSax_command;
1096 cs->iif.writecmd = NULL;
1097 cs->iif.writebuf_skb = HiSax_writebuf_skb;
1098 cs->iif.readstat = HiSax_readstatus;
1099 register_isdn(&cs->iif);
1100 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
1109 ret = hisax_cs_setup_card(card);
1100 if (!ret) { 1110 if (!ret) {
1101 ll_unload(cs); 1111 ll_unload(cs);
1102 goto outf_cs; 1112 goto outf_cs;
1103 } 1113 }
1114
1104 if (!(cs->rcvbuf = kmalloc(MAX_DFRAME_LEN_L1, GFP_ATOMIC))) { 1115 if (!(cs->rcvbuf = kmalloc(MAX_DFRAME_LEN_L1, GFP_ATOMIC))) {
1105 printk(KERN_WARNING "HiSax: No memory for isac rcvbuf\n"); 1116 printk(KERN_WARNING "HiSax: No memory for isac rcvbuf\n");
1106 ll_unload(cs); 1117 ll_unload(cs);