old-www/HOWTO/Modem-HOWTO-14.html

210 lines
11 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<META NAME="GENERATOR" CONTENT="LinuxDoc-Tools 0.9.21">
<TITLE> Modem-HOWTO: What Speed Should I Use with My Modem? </TITLE>
<LINK HREF="Modem-HOWTO-15.html" REL=next>
<LINK HREF="Modem-HOWTO-13.html" REL=previous>
<LINK HREF="Modem-HOWTO.html#toc14" REL=contents>
</HEAD>
<BODY>
<A HREF="Modem-HOWTO-15.html">Next</A>
<A HREF="Modem-HOWTO-13.html">Previous</A>
<A HREF="Modem-HOWTO.html#toc14">Contents</A>
<HR>
<H2><A NAME="speed_"></A> <A NAME="s14">14.</A> <A HREF="Modem-HOWTO.html#toc14">What Speed Should I Use with My Modem? </A></H2>
<P> By "speed" we really mean the "data flow rate" but almost everybody
incorrectly calls it speed. For all modern modems you have no choice
of the speed that the modem uses on the telephone line since it will
automatically choose the highest possible speed that is feasible under
the circumstances. If one modem is slower than the other, then the
faster modem will operate at the slower modem's speed. On a noisy
line, the speed will drop still lower.</P>
<P>While the above speeds are selected automatically by the modems you do
have a choice as to what speed will be used between your modem and
your computer (PC-to-modem speed). This is sometimes called "DTE
speed" where "DTE" stands for Data Terminal Equipment (Your computer
is a DTE.) You need to set this speed high enough so this part of the
signal path will not be a bottleneck. The setting for the DTE speed
is the maximum speed of this link. Most of the time it will likely
actually operate at lower speeds.</P>
<P>For an external modem, DTE speed is the speed (in bits/sec) of the
flow over the cable between you modem and PC. For an internal modem,
it's the same idea since the modem also emulates a serial port. It
may seem ridiculous having a speed limit on communication between a
computer and a modem card that is directly connected inside the
computer to a much higher speed bus. But it's usually that way since
the modem card probably includes a dedicated serial port which does
have speed limits (and settable speeds). However, some software
modems have no such speed limits.</P>
<H2><A NAME="ss14.1">14.1</A> <A HREF="Modem-HOWTO.html#toc14.1">Speed and Data Compression</A>
</H2>
<P> What speed do you choose? If it were not for "data compression"
one might try to choose a DTE speed exactly the same as the modem
speed. Data compression takes the bytes sent to the modem from your
computer and encodes them into a fewer number of bytes. For example,
if the flow (speed) from the PC to the modem was 20,000 bytes/sec
(bps) and the compression ratio was 2 to 1, then only 10,000 bytes/sec
would flow over the telephone line. Thus for a 2:1 compression ratio
you would need to set the DTE speed to double the maximum modem speed
on the phone line. If the compression ratio were 3 to 1 you would
need to set it 3 times faster, etc.</P>
<H2><A NAME="ss14.2">14.2</A> <A HREF="Modem-HOWTO.html#toc14.2">Where do I Set Speed ?</A>
</H2>
<P> This DTE (PC-to-modem) speed is normally set by a menu in your
communications program or by an option given to the getty command if
someone is dialing in. You can't set the DCE modem-to-modem speed
since this is set automatically by the modem to the highest feasible
speed after negotiation with the other modem. Well, actually you can
set the modem-to-modem speed with the S37 register but you shouldn't
do it. If the two modems on a connection were to be set this way to
different speeds, then they couldn't communicate with each other.</P>
<H2><A NAME="high_speed"></A> <A NAME="ss14.3">14.3</A> <A HREF="Modem-HOWTO.html#toc14.3">Can't Set a High Enough Speed </A>
</H2>
<H3>Speeds over 115.2kbps</H3>
<P> The top speed of 115.2k has been standard since the mid 1990's.
But by the year 2000, most new serial ports supported higher speeds of
230.4k and 460.8k. Some also support 921.6k. Unfortunately Linux
seldom uses these speeds due to lack of drivers. Thus such ports
behave just like 115.2k ports unless the higher speeds are enabled by
special software. To get these speeds you need to compile the kernel
with special patches or use modules until support is built into the
kernel's serial driver.</P>
<P>Unfortunately serial port manufacturers never got together on a
standard way to support high speeds, so the serial driver needs to
support a variety of hardware. Once high speed is enabled, a standard
way to choose it is to set baud_base to the highest speed with
setserial (unless the serial driver does this for you). The software
will then use a divisor of 1 to set the highest speed. All this will
hopefully be supported by the Linux kernel sometime in 2003.</P>
<P>A driver for the w83627hf chip (used on many motherboards such as
the Tyan S2460) is at
<A HREF="https://www.muru.com/linux/w83627hf/">https://www.muru.com/linux/w83627hf/</A></P>
<P>A non-standard way that some manufacturers have implemented high speed
is to use a very large number for the divisor to get the high speed.
This number isn't really a divisor at all since it doesn't divide
anything. It's just serves as a code number to tell the hardware what
speed to use. In such cases you need to compile the kernel with
special patches. </P>
<P>One patch to support this second type of high-speed hardware is called
shsmod (Super High Speed Mode). There are both Windows and Linux
versions of this patch. See
<A HREF="http://www.devdrv.com/shsmod/">http://www.devdrv.com/shsmod/</A>. There is also a module for the
VIA VT82C686 chip
<A HREF="http://www.kati.fi/viahss/">http://www.kati.fi/viahss/</A>. Using it
may result in buffer overflow. </P>
<P>For internal modems, only a minority of them advertise that they
support speeds of over 115.2k for their built-in serial ports.
Does shsmod support these ??</P>
<H3><A NAME="divisor_"></A> How speed is set in hardware: the divisor and baud_base </H3>
<P> Speed is set by having the serial port's clock change frequency.
But this change happens not by actually changing the frequency of the
oscillator driving the clock but by "dividing" the clock's frequency.
For example, to divide by two, just ignore every other clock tick.
This cuts the speed in half. Dividing by 3 makes the clock run at 1/3
frequency, etc. So to slow the clock down (meaning set speed), we
just send the clock a divisor. It's sent by the serial driver to a
register in the port. Thus speed is set by a divisor.</P>
<P>If the clock runs at a top speed of 115,000 bps (common), then here
are the divisors for various speeds (assuming a maximum speed of
115,200): 1 (115.2k), 2 (57.6k), 3 (38.4k), 6 (19.2k), 12 (9.6k), 24
(4.8k), 48 (2.4k), 96 (1.2k), etc. The serial driver sets the speed
in the hardware by sending the hardware only a "divisor" (a positive
integer). This "divisor" divides the "maximum speed" of the hardware
resulting in a slower speed (except a divisor of 1 obviously tells the
hardware to run at maximum speed).</P>
<P>There are exceptions to the above since for certain serial port
hardware, speeds above 115.2k are set by using a very high divisor.
Keep that exception in mind as you read the rest of this section.
Normally, if you specify a speed of 115.2k (in your communication
program or by stty) then the serial driver sets the port hardware to
divisor 1 which sets the highest speed.</P>
<P>Besides using a very high divisor to set high speed, the conventional
way to do it is as follows: If you happen to have hardware with a
maximum speed of say 230.4k (and the 230.4k speed has been enabled in
the hardware), then specifying 115.2k will result in divisor 1. For
some hardware this will actually give you 230.4k. This is double the
speed that you set. In fact, for any speed you set, the actual speed
will be double. If you had hardware that could run at 460.8k then the
actual speed would be quadruple what you set. All the above assumes
that you don't use "setserial" to modify things.</P>
<H3>Setting the divisor, speed accounting</H3>
<P> To correct this accounting (but not always fix the problem) you
may use "setserial" to change the baud_base to the actual maximal
speed of your port such as 230.4k. Then if you set the speed (by your
application or by stty) to 230.4k, a divisor of 1 will be used and
you'll get the same speed as you set.</P>
<P>If you have very old software which will not allow you to tell it such
a high speed (but your hardware has it enabled) then you might want to
look into using the "spd_cust" parameter. This allows you to tell the
application that the speed is 38,400 but the actual speed for this
case is determined by the value of "divisor" which has also been set
in setserial. I think it best to try to avoid using this kludge.</P>
<P>There are some brands of UARTs that uses a very high divisor to set
high speeds. There isn't any satisfactory way to use "setserial" (say
set "divisor 32770") to get such a speed since then setserial would
then think that the speed is very low and disable the FIFO in the
UART.</P>
<H3>Crystal frequency is higher than baud_base</H3>
<P> Note that the baud_base setting is usually much lower than the
frequency of the crystal oscillator since the crystal frequency of say
1.8432 MHz is divided by 16 in the hardware to get the actual top
speed of 115.2k. The reason the crystal frequency needs to be higher
is so that this high crystal speed can generate clock ticks to take a
number of samples of each bit to determine if it's a 1 or a 0.</P>
<P>Actually, the 1.8432 MHz "crystal frequency" may be obtained from a
18.432 MHz crystal oscillator by dividing by 10 before being fed to
the UART. Other schemes are also possible as long as the UART
performs properly.</P>
<H2><A NAME="speed_table"></A> <A NAME="ss14.4">14.4</A> <A HREF="Modem-HOWTO.html#toc14.4">Speed Table </A>
</H2>
<P> It's best to have at least a 16650 UART for a 56k modem but few
modems or serial ports provide it. Second best is a 16550 that has
been tweaked to give 230,400 bps (230.4 kbps). Most people still use
a 16550 that is only 115.2 kbps but it's claimed to only slow down
thruput by a few percent (on average). This is because a typical
compression ratio is 2 to 1 and for downloading compressed files
(packages) it's 1 to 1. There's no degradation for these cases. Here
are some suggested speeds to set your serial line if your modem speed
is:</P>
<P>
<UL>
<LI> 56k (V.92): use 115.2 kbps or 230.4 kbps (best)</LI>
<LI> 56k (V.90): use 115.2 kbps or 230.4 kbps (best)</LI>
<LI> 33.6k (V.34bis): use 115.2 kbps</LI>
<LI> 28.8k (V.34): use 115.2 kbps</LI>
<LI> 14.4k (V.32bis): use 57600 bps</LI>
<LI> 9.6k (V.32): use 38400 bps</LI>
<LI> slower than a 9600 bps (V.32) modem: Set the speed to the
same speed as the modem (unless you have data compression).</LI>
</UL>
</P>
<P>All the above speeds may use V.42bis data compression and V.42 error
correction. If data compression is not used then the speed may be set
lower so long as it's above the modem speed.</P>
<HR>
<A HREF="Modem-HOWTO-15.html">Next</A>
<A HREF="Modem-HOWTO-13.html">Previous</A>
<A HREF="Modem-HOWTO.html#toc14">Contents</A>
</BODY>
</HTML>