diff options
author | Tilman Schmidt <tilman@imap.cc> | 2010-07-05 10:19:04 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-07-07 19:57:53 -0400 |
commit | 18c2259c14d8595e64a802940422335d172a53db (patch) | |
tree | 7360e537084291688b0d8850db31a240158493f5 /drivers/isdn | |
parent | 6a75342a1c788aa89acac675e1720b08068ac8e7 (diff) |
isdn/gigaset: handle Supplementary Service Listen
Add minimal handling for the non-optional CAPI FACILITY_REQ
Supplementary Service function Listen.
Impact: bugfix
Signed-off-by: Tilman Schmidt <tilman@imap.cc>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/isdn')
-rw-r--r-- | drivers/isdn/gigaset/capi.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/drivers/isdn/gigaset/capi.c b/drivers/isdn/gigaset/capi.c index 68194b502731..3ef149fe48c8 100644 --- a/drivers/isdn/gigaset/capi.c +++ b/drivers/isdn/gigaset/capi.c | |||
@@ -45,6 +45,7 @@ | |||
45 | #define CAPI_FACILITY_LI 0x0005 | 45 | #define CAPI_FACILITY_LI 0x0005 |
46 | 46 | ||
47 | #define CAPI_SUPPSVC_GETSUPPORTED 0x0000 | 47 | #define CAPI_SUPPSVC_GETSUPPORTED 0x0000 |
48 | #define CAPI_SUPPSVC_LISTEN 0x0001 | ||
48 | 49 | ||
49 | /* missing from capiutil.h */ | 50 | /* missing from capiutil.h */ |
50 | #define CAPIMSG_PLCI_PART(m) CAPIMSG_U8(m, 9) | 51 | #define CAPIMSG_PLCI_PART(m) CAPIMSG_U8(m, 9) |
@@ -1151,7 +1152,7 @@ static void do_facility_req(struct gigaset_capi_ctr *iif, | |||
1151 | case CAPI_FACILITY_SUPPSVC: | 1152 | case CAPI_FACILITY_SUPPSVC: |
1152 | /* decode Function parameter */ | 1153 | /* decode Function parameter */ |
1153 | pparam = cmsg->FacilityRequestParameter; | 1154 | pparam = cmsg->FacilityRequestParameter; |
1154 | if (pparam == NULL || *pparam < 2) { | 1155 | if (pparam == NULL || pparam[0] < 2) { |
1155 | dev_notice(cs->dev, "%s: %s missing\n", "FACILITY_REQ", | 1156 | dev_notice(cs->dev, "%s: %s missing\n", "FACILITY_REQ", |
1156 | "Facility Request Parameter"); | 1157 | "Facility Request Parameter"); |
1157 | send_conf(iif, ap, skb, CapiIllMessageParmCoding); | 1158 | send_conf(iif, ap, skb, CapiIllMessageParmCoding); |
@@ -1168,8 +1169,32 @@ static void do_facility_req(struct gigaset_capi_ctr *iif, | |||
1168 | /* Supported Services: none */ | 1169 | /* Supported Services: none */ |
1169 | capimsg_setu32(confparam, 6, 0); | 1170 | capimsg_setu32(confparam, 6, 0); |
1170 | break; | 1171 | break; |
1172 | case CAPI_SUPPSVC_LISTEN: | ||
1173 | if (pparam[0] < 7 || pparam[3] < 4) { | ||
1174 | dev_notice(cs->dev, "%s: %s missing\n", | ||
1175 | "FACILITY_REQ", "Notification Mask"); | ||
1176 | send_conf(iif, ap, skb, | ||
1177 | CapiIllMessageParmCoding); | ||
1178 | return; | ||
1179 | } | ||
1180 | if (CAPIMSG_U32(pparam, 4) != 0) { | ||
1181 | dev_notice(cs->dev, | ||
1182 | "%s: unsupported supplementary service notification mask 0x%x\n", | ||
1183 | "FACILITY_REQ", CAPIMSG_U32(pparam, 4)); | ||
1184 | info = CapiFacilitySpecificFunctionNotSupported; | ||
1185 | confparam[3] = 2; /* length */ | ||
1186 | capimsg_setu16(confparam, 4, | ||
1187 | CapiSupplementaryServiceNotSupported); | ||
1188 | } | ||
1189 | info = CapiSuccess; | ||
1190 | confparam[3] = 2; /* length */ | ||
1191 | capimsg_setu16(confparam, 4, CapiSuccess); | ||
1192 | break; | ||
1171 | /* ToDo: add supported services */ | 1193 | /* ToDo: add supported services */ |
1172 | default: | 1194 | default: |
1195 | dev_notice(cs->dev, | ||
1196 | "%s: unsupported supplementary service function 0x%04x\n", | ||
1197 | "FACILITY_REQ", function); | ||
1173 | info = CapiFacilitySpecificFunctionNotSupported; | 1198 | info = CapiFacilitySpecificFunctionNotSupported; |
1174 | /* Supplementary Service specific parameter */ | 1199 | /* Supplementary Service specific parameter */ |
1175 | confparam[3] = 2; /* length */ | 1200 | confparam[3] = 2; /* length */ |