Smart Link Soft Modem for Linux Kernel >7.x
- C 94.3%
- Shell 3.4%
- Makefile 2.3%
drivers/st7554.c: st7554_ioctl() never subtracted the 100000 offset
that userspace (modem_main.c) always adds to MDMCTL_* ioctl numbers -
the PCI/AMR driver (amrmo_init.c) already did this, but the USB driver
never did, so every MDMCTL_* ioctl fell through to the default case
and returned -ENOTTY ("Inappropriate ioctl for device").
modem/modem_main.c: modemap_ioctl() passed the address of its local
`arg` variable (&arg) to the kernel instead of its value, but every
command routed through it (HOOKSTATE, SPEED, SETFRAGMENT, SPEAKERVOL,
IODELAY, START, STOP) is handled by the driver as a plain value, not a
pointer to dereference (GETSTAT is the only pointer-based command, and
is called separately with a real pointer already). This made
MDMCTL_HOOKSTATE receive a stack address instead of 0/1, matching
neither MODEM_HOOK_ON nor MODEM_HOOK_OFF and failing with -EINVAL -
so answering an incoming call (ATA) always failed to go off-hook and
slmodemd immediately reported NO CARRIER instead of negotiating.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
||
|---|---|---|
| b/drivers | ||
| debian | ||
| Documentation | ||
| drivers | ||
| faxing | ||
| modem | ||
| patches | ||
| scripts | ||
| .gitignore | ||
| Changes | ||
| COPYING | ||
| dkms.conf | ||
| Makefile | ||
| README | ||
Smart Link Ltd.
http://www.smlink.com
Sep 30, 2003
Smart Link Soft Modem for Linux
-------------------------------
Introduction
============
This is Smart Link Soft Modem for Linux version 2.9. It provides
full-featured 56K Voice Fax Modem.
This is implemented as generic application (slmodemd) and set of
hardware specific kernel-space drivers (slamr, slusb).
ALSA modem drivers may be used instead of proprietary ones (see ALSA mode).
Features
========
Modem: V.92, V.90, V.34, V.32bis, V.32, V.23, V.22, V.21, Bell 103/212.
Flow control: V.42.
Compression: V.44, V.42bis.
Fax: Class 1.
Voice: V253 like modem.
Multiple modems are supported.
Supported Hardware
==================
HAMR5600 based AMR/CNR/MDC/ACR modem cards on the following Southbridge
chips:
- Intel ICH0,ICH2, ICH3, ICH4
- Via 686A, 686B, 8231, 8233
- SiS 630
- ALI 1535.
SmartPCI56/561/562/563 based PCI modem cards.
SmartUSB56 based USB modem.
Requirements
============
CPU: Intel Pentium II, Celron. AMD K6, Cyrix 500MHz or higher.
Memory: 64MB.
OS: Linux 2.4. You need the kernel header files at least (or full kernel
source tree) installed and configured.
Linux 2.6. You need the full kernel source tree installed and configured.
Note: Most Linux Distributions have 'ready to use' kernel source package -
be sure that this is installed.
Installation
============
1. Unpack tar.gz package file:
$ gzip -dc slmodem-2.9.X.tar.gz | tar xf -
2. 'cd' to package directory:
$ cd slmodem-2.9.X
3. Review and edit 'Makefile' (if need):
In many cases you will need to correct path to your local kernel
source tree:
KERNEL_DIR=/path/to/linux
Default KERNEL_DIR is '/lib/modules/<kerne-version>/build'. Many Linux
Distributions use directory '/usr/src/linux-<version>' also.
Note: If you are using Linux kernel 2.4, only header files should be
available for build in $(KERNEL_DIR)/include
Another way to pass right value KERNEL_DIR is to use command line
parameter while running 'make':
$ make KERNEL_DIR=/path/to/linux ...
4. Run 'make' command to compile package:
$ make
5. Install. As 'root' user run:
# make install
It will install:
- application 'slmodemd' under '/usr/sbin' directory
- hardware specific drivers (kernel modules) 'slamr' and 'slusb'
under conventional kernel modules directory
- character device nodes '/dev/slamr0-3' with major number 212
(for pci modems) and '/dev/slusb0-3' with major number 213
(for usb modems).
- config modules for autoloading (by editing file '/etc/modules.conf')
(only with 2.4 kernels)
6. Config modem country.
Use AT+GCI=<T.35 country code> command to setup country.
Also you can setup default modem country by passing command line
parameter '--country=MY_COUNTRY' to program 'slmodemd'.
See output of 'slmodemd --countrylist' for a list of supported
country names and T.35 country codes (see also 'slmodemd --help').
Note: Command ATI7 shows currently installed country setting.
8. Uninstallation.
In package directory just type:
# make uninstall
Getting Started
===============
After successful installation and configuration:
1. Load modem driver.
Load your modem hardware specific kernel module:
# modprobe slamr
if you are using AMR/CNR/PCI modem, or
# modprobe slusb
if you are using SmartUSB56 Modem.
Note: this will be done automatically when modules were
configured for 'loading on demand'
Note: this is safe to load both 'slamr' and 'slusb' modules.
2. Run soft modem application.
# /usr/sbin/slmodemd [options] <device_name>
Where device name is appropriate device node for your modem
(look at output of 'dmesg' command).
Run '/usr/sbin/slmodemd --help' for details.
Examples:
# /usr/sbin/slmodemd --country=USA /dev/slamr0
, or for SmartUSB56 Modems:
# /usr/sbin/slmodemd --country=ITALY /dev/slusb0
3. Using the modem.
When 'slmodemd' is running this creates PTY (pseudo-terminal) to
emulate modem port device, also this creates symbolic link
like '/dev/ttySL0' (shown at startup).
Config your application to use this link '/dev/ttySL0' (or PTY node
itself) as modem port.
Note: Some application want 'to know' that they are working with
pseudo-terminal and may require additional configurations.
Known application notes:
- 'wvdial' requires option 'Carrier Check = no' in config file
- some versions of 'kppp' may not work properly with devices named
like '/dev/ttySL0'. To workaround this you may create symbolic link
'/dev/modem' ( # ln -s /dev/ttySL0 /dev/modem ) and use this link
as modem device with 'kppp'
- some pci modem devices are declared as COMMUNICATION_MODEM class and
might be caught by other standard drivers - you will see "grabbed
by another driver" warning in dmesg buffer. There is no good way to
"release" it, but as silly workaround you may use 'ungrab-winmodem'
pseudo-driver from http://linmodems.technion.ac.il/packages/smartlink.
Note that you should load it before 'slamr' module.
4. Startup automation.
There are examples of startup scripts in 'scripts' directory.
ALSA mode
=========
ALSA has the built-in modem drivers included in 'alsa-driver' >= 1.0.2
and in Linux kernel >= 2.6.5. Currently there is 'intel8x0m' (snd-intel8x0m)
modem driver, which supports ICH based AC97 modems (MC97).
Recent 'alsa-driver' (>=1.0.8) has also support for NVidia NForce, SiS 630
(snd-intel8x0m), VIA686 (snd-via82xx-modem) and ATI IXP (snd-atiixp-modem)
based modems.
1. Configure your kernel and enable ALSA and ICH based modem support
( 'Device Drivers' -> 'Sound' -> 'Advanced Linux Sound Architecture' ->
'PCI devices' -> 'Intel i8x0/MX440; AMD768/8111 modems' ) .
2. Build and install kernel and modules as usual (make , make modules_install,
etc.). ICH modem driver modem module name is 'snd-intel8x0m'
(if was configured as module).
3. Build application 'slmodemd' with ALSA support. For this in
slmodem-2.9.x dir:
$ cd modem
$ make SUPPORT_ALSA=1
This will build 'slmodemd' with ALSA support. If compilation is failed
review Makefile (near ALSA_SUPPORT condition) and define right library
and/or CFLAGS .
Note: For above you need ALSA library and header files installed.
4. Use option '--alsa' when running 'slmodemd' and ALSA conventional
device name ('hw:0' or 'hw:1' for instance). If modem support in
the kernel was enabled as module module 'snd-intel8x0m' should be loaded.
Note: Recent version of 'alsa-lib' (>= 1.0.6) has built-in "modem" device
name support ('modem:0', 'modem:1', etc). It is recommended to use
those names with modems (mandatory with ATI IXP modems).
Note: When using ALSA modem driver you don't need to load other
modules ('slamr').
64-bit hosts
============
`slmodemd` links against a proprietary, precompiled 32-bit-only object
file (`modem/dsplibs.o`) and `slamr` against another one
(`drivers/amrlibs.o`). No source is available for either, so on a 64-bit
host:
- `slmodemd` is still built, but as a 32-bit binary (`gcc -m32`). You need
a 32-bit multilib toolchain and headers installed, e.g. on
Debian/Ubuntu: `gcc-multilib` (or at least `libc6-dev-i386`), and if
building with `SUPPORT_ALSA=1` also the 32-bit ALSA dev library
(`lib32asound2-dev` or the distro equivalent).
- `slamr.ko` (PCI/AMR modem) cannot be built at all, since it would
require linking a 32-bit object into a 64-bit kernel module. Use the
ALSA driver (see 'ALSA mode' above) for PCI/AMR modems on 64-bit
kernels instead.
- `slusb.ko` (USB modem, plain C source, no blob dependency) builds and
works natively as a 64-bit kernel module, and is built automatically.
DKMS
====
A `dkms.conf` is provided in the top-level directory so the kernel
module(s) can be tracked by DKMS across kernel upgrades:
# dkms add .
# dkms build sl-modem/2.9.11-20110321
# dkms install sl-modem/2.9.11-20110321
This builds `slusb` on any host, and additionally `slamr` when the
running kernel is 32-bit (`CONFIG_X86_32`). `slmodemd` itself is not
managed by DKMS (it is a userspace daemon, not a kernel module) and
still needs to be built/installed as described above.
Note: on Secure Boot systems, DKMS (>= 2.8) automatically generates a
local signing key on first build (`/var/lib/dkms/mok.key` /
`mok.pub`) and signs the module with it, but the kernel will still
refuse to load it ("Key was rejected by service") until that key is
enrolled as a Machine Owner Key:
# mokutil --import /var/lib/dkms/mok.pub
then reboot and follow the blue "MOK Management" prompt (Enroll MOK ->
Continue -> Yes) to confirm enrollment with the password chosen above.
Feedback
========
This software has been originaly created and distributed by Smart Link.
However, Smart Link stopped supported them and apparently left the modem
business. See http://www.smlink.com/smlink.asp for further information and
contact data.
---
File modified by Eduard Bloch <blade@debian.org>, 2006