gigaset: add Kernel CAPI interface (v3)
Add a Kernel CAPI interface to the Gigaset driver. Impact: optional new functionality Signed-off-by: Tilman Schmidt <tilman@imap.cc> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
aaba2b3f82
commit
7bb5fdc2fb
|
@ -5,7 +5,7 @@ GigaSet 307x Device Driver
|
||||||
------------
|
------------
|
||||||
1.1. Hardware
|
1.1. Hardware
|
||||||
--------
|
--------
|
||||||
This release supports the connection of the Gigaset 307x/417x family of
|
This driver supports the connection of the Gigaset 307x/417x family of
|
||||||
ISDN DECT bases via Gigaset M101 Data, Gigaset M105 Data or direct USB
|
ISDN DECT bases via Gigaset M101 Data, Gigaset M105 Data or direct USB
|
||||||
connection. The following devices are reported to be compatible:
|
connection. The following devices are reported to be compatible:
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ GigaSet 307x Device Driver
|
||||||
http://gigaset307x.sourceforge.net/
|
http://gigaset307x.sourceforge.net/
|
||||||
|
|
||||||
We had also reports from users of Gigaset M105 who could use the drivers
|
We had also reports from users of Gigaset M105 who could use the drivers
|
||||||
with SX 100 and CX 100 ISDN bases (only in unimodem mode, see section 2.4.)
|
with SX 100 and CX 100 ISDN bases (only in unimodem mode, see section 2.5.)
|
||||||
If you have another device that works with our driver, please let us know.
|
If you have another device that works with our driver, please let us know.
|
||||||
|
|
||||||
Chances of getting an USB device to work are good if the output of
|
Chances of getting an USB device to work are good if the output of
|
||||||
|
@ -49,7 +49,7 @@ GigaSet 307x Device Driver
|
||||||
--------
|
--------
|
||||||
The driver works with ISDN4linux and so can be used with any software
|
The driver works with ISDN4linux and so can be used with any software
|
||||||
which is able to use ISDN4linux for ISDN connections (voice or data).
|
which is able to use ISDN4linux for ISDN connections (voice or data).
|
||||||
CAPI4Linux support is planned but not yet available.
|
Experimental Kernel CAPI support is available as a compilation option.
|
||||||
|
|
||||||
There are some user space tools available at
|
There are some user space tools available at
|
||||||
http://sourceforge.net/projects/gigaset307x/
|
http://sourceforge.net/projects/gigaset307x/
|
||||||
|
@ -102,20 +102,28 @@ GigaSet 307x Device Driver
|
||||||
2.3. ISDN4linux
|
2.3. ISDN4linux
|
||||||
----------
|
----------
|
||||||
This is the "normal" mode of operation. After loading the module you can
|
This is the "normal" mode of operation. After loading the module you can
|
||||||
set up the ISDN system just as you'd do with any ISDN card.
|
set up the ISDN system just as you'd do with any ISDN card supported by
|
||||||
Your distribution should provide some configuration utility.
|
the ISDN4Linux subsystem. Most distributions provide some configuration
|
||||||
If not, you can use some HOWTOs like
|
utility. If not, you can use some HOWTOs like
|
||||||
http://www.linuxhaven.de/dlhp/HOWTO/DE-ISDN-HOWTO-5.html
|
http://www.linuxhaven.de/dlhp/HOWTO/DE-ISDN-HOWTO-5.html
|
||||||
If this doesn't work, because you have some recent device like SX100 where
|
If this doesn't work, because you have some device like SX100 where
|
||||||
debug output (see section 3.2.) shows something like this when dialing
|
debug output (see section 3.2.) shows something like this when dialing
|
||||||
CMD Received: ERROR
|
CMD Received: ERROR
|
||||||
Available Params: 0
|
Available Params: 0
|
||||||
Connection State: 0, Response: -1
|
Connection State: 0, Response: -1
|
||||||
gigaset_process_response: resp_code -1 in ConState 0 !
|
gigaset_process_response: resp_code -1 in ConState 0 !
|
||||||
Timeout occurred
|
Timeout occurred
|
||||||
you might need to use unimodem mode:
|
you might need to use unimodem mode. (see section 2.5.)
|
||||||
|
|
||||||
2.4. Unimodem mode
|
2.4. CAPI
|
||||||
|
----
|
||||||
|
If the driver is compiled with CAPI support (kernel configuration option
|
||||||
|
GIGASET_CAPI, experimental) it can also be used with CAPI 2.0 kernel and
|
||||||
|
user space applications. ISDN4Linux is supported in this configuration
|
||||||
|
via the capidrv compatibility driver. The kernel module capidrv.ko must
|
||||||
|
be loaded explicitly ("modprobe capidrv") if needed.
|
||||||
|
|
||||||
|
2.5. Unimodem mode
|
||||||
-------------
|
-------------
|
||||||
This is needed for some devices [e.g. SX100] as they have problems with
|
This is needed for some devices [e.g. SX100] as they have problems with
|
||||||
the "normal" commands.
|
the "normal" commands.
|
||||||
|
@ -160,7 +168,7 @@ GigaSet 307x Device Driver
|
||||||
configuration file like /etc/modprobe.conf.local,
|
configuration file like /etc/modprobe.conf.local,
|
||||||
using that should be preferred.
|
using that should be preferred.
|
||||||
|
|
||||||
2.5. Call-ID (CID) mode
|
2.6. Call-ID (CID) mode
|
||||||
------------------
|
------------------
|
||||||
Call-IDs are numbers used to tag commands to, and responses from, the
|
Call-IDs are numbers used to tag commands to, and responses from, the
|
||||||
Gigaset base in order to support the simultaneous handling of multiple
|
Gigaset base in order to support the simultaneous handling of multiple
|
||||||
|
@ -188,7 +196,7 @@ GigaSet 307x Device Driver
|
||||||
You can also use /sys/class/tty/ttyGxy/cidmode for changing the CID mode
|
You can also use /sys/class/tty/ttyGxy/cidmode for changing the CID mode
|
||||||
setting (ttyGxy is ttyGU0 or ttyGB0).
|
setting (ttyGxy is ttyGU0 or ttyGB0).
|
||||||
|
|
||||||
2.6. Unregistered Wireless Devices (M101/M105)
|
2.7. Unregistered Wireless Devices (M101/M105)
|
||||||
-----------------------------------------
|
-----------------------------------------
|
||||||
The main purpose of the ser_gigaset and usb_gigaset drivers is to allow
|
The main purpose of the ser_gigaset and usb_gigaset drivers is to allow
|
||||||
the M101 and M105 wireless devices to be used as ISDN devices for ISDN
|
the M101 and M105 wireless devices to be used as ISDN devices for ISDN
|
||||||
|
@ -228,7 +236,7 @@ GigaSet 307x Device Driver
|
||||||
You have two or more DECT data adapters (M101/M105) and only the
|
You have two or more DECT data adapters (M101/M105) and only the
|
||||||
first one you turn on works.
|
first one you turn on works.
|
||||||
Solution:
|
Solution:
|
||||||
Select Unimodem mode for all DECT data adapters. (see section 2.4.)
|
Select Unimodem mode for all DECT data adapters. (see section 2.5.)
|
||||||
|
|
||||||
Problem:
|
Problem:
|
||||||
Messages like this:
|
Messages like this:
|
||||||
|
@ -236,7 +244,7 @@ GigaSet 307x Device Driver
|
||||||
appear in your syslog.
|
appear in your syslog.
|
||||||
Solution:
|
Solution:
|
||||||
Check whether your M10x wireless device is correctly registered to the
|
Check whether your M10x wireless device is correctly registered to the
|
||||||
Gigaset base. (see section 2.6.)
|
Gigaset base. (see section 2.7.)
|
||||||
|
|
||||||
3.2. Telling the driver to provide more information
|
3.2. Telling the driver to provide more information
|
||||||
----------------------------------------------
|
----------------------------------------------
|
||||||
|
|
|
@ -10,20 +10,32 @@ menuconfig ISDN_DRV_GIGASET
|
||||||
If you have one of these devices, say M here and for at least
|
If you have one of these devices, say M here and for at least
|
||||||
one of the connection specific parts that follow.
|
one of the connection specific parts that follow.
|
||||||
This will build a module called "gigaset".
|
This will build a module called "gigaset".
|
||||||
Note: If you build the ISDN4Linux subsystem (ISDN_I4L)
|
Note: If you build your ISDN subsystem (ISDN_CAPI or ISDN_I4L)
|
||||||
as a module, you have to build this driver as a module too,
|
as a module, you have to build this driver as a module too,
|
||||||
otherwise the Gigaset device won't show up as an ISDN device.
|
otherwise the Gigaset device won't show up as an ISDN device.
|
||||||
|
|
||||||
if ISDN_DRV_GIGASET
|
if ISDN_DRV_GIGASET
|
||||||
|
|
||||||
|
config GIGASET_CAPI
|
||||||
|
bool "Gigaset CAPI support (EXPERIMENTAL)"
|
||||||
|
depends on EXPERIMENTAL
|
||||||
|
depends on ISDN_CAPI='y'||(ISDN_CAPI='m'&&ISDN_DRV_GIGASET='m')
|
||||||
|
default ISDN_I4L='n'
|
||||||
|
help
|
||||||
|
Build the Gigaset driver as a CAPI 2.0 driver interfacing with
|
||||||
|
the Kernel CAPI subsystem. To use it with the old ISDN4Linux
|
||||||
|
subsystem you'll have to enable the capidrv glue driver.
|
||||||
|
(select ISDN_CAPI_CAPIDRV.)
|
||||||
|
Say N to build the old native ISDN4Linux variant.
|
||||||
|
|
||||||
config GIGASET_I4L
|
config GIGASET_I4L
|
||||||
bool
|
bool
|
||||||
depends on ISDN_I4L='y'||(ISDN_I4L='m'&&ISDN_DRV_GIGASET='m')
|
depends on ISDN_I4L='y'||(ISDN_I4L='m'&&ISDN_DRV_GIGASET='m')
|
||||||
default y
|
default !GIGASET_CAPI
|
||||||
|
|
||||||
config GIGASET_DUMMYLL
|
config GIGASET_DUMMYLL
|
||||||
bool
|
bool
|
||||||
default !GIGASET_I4L
|
default !GIGASET_CAPI&&!GIGASET_I4L
|
||||||
|
|
||||||
config GIGASET_BASE
|
config GIGASET_BASE
|
||||||
tristate "Gigaset base station support"
|
tristate "Gigaset base station support"
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
gigaset-y := common.o interface.o proc.o ev-layer.o asyncdata.o
|
gigaset-y := common.o interface.o proc.o ev-layer.o asyncdata.o
|
||||||
|
gigaset-$(CONFIG_GIGASET_CAPI) += capi.o
|
||||||
gigaset-$(CONFIG_GIGASET_I4L) += i4l.o
|
gigaset-$(CONFIG_GIGASET_I4L) += i4l.o
|
||||||
gigaset-$(CONFIG_GIGASET_DUMMYLL) += dummyll.o
|
gigaset-$(CONFIG_GIGASET_DUMMYLL) += dummyll.o
|
||||||
usb_gigaset-y := usb-gigaset.o
|
usb_gigaset-y := usb-gigaset.o
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -207,6 +207,32 @@ int gigaset_get_channel(struct bc_state *bcs)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct bc_state *gigaset_get_free_channel(struct cardstate *cs)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&cs->lock, flags);
|
||||||
|
if (!try_module_get(cs->driver->owner)) {
|
||||||
|
gig_dbg(DEBUG_ANY,
|
||||||
|
"could not get module for allocating channel");
|
||||||
|
spin_unlock_irqrestore(&cs->lock, flags);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
for (i = 0; i < cs->channels; ++i)
|
||||||
|
if (!cs->bcs[i].use_count) {
|
||||||
|
++cs->bcs[i].use_count;
|
||||||
|
cs->bcs[i].busy = 1;
|
||||||
|
spin_unlock_irqrestore(&cs->lock, flags);
|
||||||
|
gig_dbg(DEBUG_ANY, "allocated channel %d", i);
|
||||||
|
return cs->bcs + i;
|
||||||
|
}
|
||||||
|
module_put(cs->driver->owner);
|
||||||
|
spin_unlock_irqrestore(&cs->lock, flags);
|
||||||
|
gig_dbg(DEBUG_ANY, "no free channel");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
void gigaset_free_channel(struct bc_state *bcs)
|
void gigaset_free_channel(struct bc_state *bcs)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
|
@ -291,21 +291,23 @@ struct reply_t gigaset_tab_cid[] =
|
||||||
{RSP_OK, 602,602, -1, 603, 5, {ACT_CMD+AT_PROTO}},
|
{RSP_OK, 602,602, -1, 603, 5, {ACT_CMD+AT_PROTO}},
|
||||||
{RSP_OK, 603,603, -1, 604, 5, {ACT_CMD+AT_TYPE}},
|
{RSP_OK, 603,603, -1, 604, 5, {ACT_CMD+AT_TYPE}},
|
||||||
{RSP_OK, 604,604, -1, 605, 5, {ACT_CMD+AT_MSN}},
|
{RSP_OK, 604,604, -1, 605, 5, {ACT_CMD+AT_MSN}},
|
||||||
{RSP_OK, 605,605, -1, 606, 5, {ACT_CMD+AT_ISO}},
|
{RSP_NULL, 605, 605, -1, 606, 5, {ACT_CMD+AT_CLIP} },
|
||||||
{RSP_NULL, 605,605, -1, 606, 5, {ACT_CMD+AT_ISO}},
|
{RSP_OK, 605, 605, -1, 606, 5, {ACT_CMD+AT_CLIP} },
|
||||||
{RSP_OK, 606,606, -1, 607, 5, {0}, "+VLS=17\r"},
|
{RSP_NULL, 606, 606, -1, 607, 5, {ACT_CMD+AT_ISO} },
|
||||||
{RSP_OK, 607,607, -1, 608,-1},
|
{RSP_OK, 606, 606, -1, 607, 5, {ACT_CMD+AT_ISO} },
|
||||||
{RSP_ZSAU, 608,608,ZSAU_PROCEEDING, 609, 5, {ACT_CMD+AT_DIAL}},
|
{RSP_OK, 607, 607, -1, 608, 5, {0}, "+VLS=17\r"},
|
||||||
{RSP_OK, 609,609, -1, 650, 0, {ACT_DIALING}},
|
{RSP_OK, 608, 608, -1, 609, -1},
|
||||||
|
{RSP_ZSAU, 609, 609, ZSAU_PROCEEDING, 610, 5, {ACT_CMD+AT_DIAL} },
|
||||||
|
{RSP_OK, 610, 610, -1, 650, 0, {ACT_DIALING} },
|
||||||
|
|
||||||
{RSP_ERROR, 601,609, -1, 0, 0, {ACT_ABORTDIAL}},
|
{RSP_ERROR, 601, 610, -1, 0, 0, {ACT_ABORTDIAL} },
|
||||||
{EV_TIMEOUT, 601,609, -1, 0, 0, {ACT_ABORTDIAL}},
|
{EV_TIMEOUT, 601, 610, -1, 0, 0, {ACT_ABORTDIAL} },
|
||||||
|
|
||||||
/* optional dialing responses */
|
/* optional dialing responses */
|
||||||
{EV_BC_OPEN, 650,650, -1, 651,-1},
|
{EV_BC_OPEN, 650,650, -1, 651,-1},
|
||||||
{RSP_ZVLS, 608,651, 17, -1,-1, {ACT_DEBUG}},
|
{RSP_ZVLS, 609, 651, 17, -1, -1, {ACT_DEBUG} },
|
||||||
{RSP_ZCTP, 609,651, -1, -1,-1, {ACT_DEBUG}},
|
{RSP_ZCTP, 610, 651, -1, -1, -1, {ACT_DEBUG} },
|
||||||
{RSP_ZCPN, 609,651, -1, -1,-1, {ACT_DEBUG}},
|
{RSP_ZCPN, 610, 651, -1, -1, -1, {ACT_DEBUG} },
|
||||||
{RSP_ZSAU, 650,651,ZSAU_CALL_DELIVERED, -1,-1, {ACT_DEBUG}},
|
{RSP_ZSAU, 650,651,ZSAU_CALL_DELIVERED, -1,-1, {ACT_DEBUG}},
|
||||||
|
|
||||||
/* connect */
|
/* connect */
|
||||||
|
|
|
@ -191,7 +191,9 @@ void gigaset_dbg_buffer(enum debuglevel level, const unsigned char *msg,
|
||||||
#define AT_PROTO 4
|
#define AT_PROTO 4
|
||||||
#define AT_TYPE 5
|
#define AT_TYPE 5
|
||||||
#define AT_HLC 6
|
#define AT_HLC 6
|
||||||
#define AT_NUM 7
|
#define AT_CLIP 7
|
||||||
|
/* total number */
|
||||||
|
#define AT_NUM 8
|
||||||
|
|
||||||
/* variables in struct at_state_t */
|
/* variables in struct at_state_t */
|
||||||
#define VAR_ZSAU 0
|
#define VAR_ZSAU 0
|
||||||
|
@ -412,6 +414,8 @@ struct bc_state {
|
||||||
struct usb_bc_state *usb; /* usb hardware driver (m105) */
|
struct usb_bc_state *usb; /* usb hardware driver (m105) */
|
||||||
struct bas_bc_state *bas; /* usb hardware driver (base) */
|
struct bas_bc_state *bas; /* usb hardware driver (base) */
|
||||||
} hw;
|
} hw;
|
||||||
|
|
||||||
|
void *ap; /* LL application structure */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct cardstate {
|
struct cardstate {
|
||||||
|
@ -725,6 +729,7 @@ void gigaset_bcs_reinit(struct bc_state *bcs);
|
||||||
void gigaset_at_init(struct at_state_t *at_state, struct bc_state *bcs,
|
void gigaset_at_init(struct at_state_t *at_state, struct bc_state *bcs,
|
||||||
struct cardstate *cs, int cid);
|
struct cardstate *cs, int cid);
|
||||||
int gigaset_get_channel(struct bc_state *bcs);
|
int gigaset_get_channel(struct bc_state *bcs);
|
||||||
|
struct bc_state *gigaset_get_free_channel(struct cardstate *cs);
|
||||||
void gigaset_free_channel(struct bc_state *bcs);
|
void gigaset_free_channel(struct bc_state *bcs);
|
||||||
int gigaset_get_channels(struct cardstate *cs);
|
int gigaset_get_channels(struct cardstate *cs);
|
||||||
void gigaset_free_channels(struct cardstate *cs);
|
void gigaset_free_channels(struct cardstate *cs);
|
||||||
|
|
Loading…
Reference in New Issue