| HAYES ESP DRIVER VERSION 2.1 | 
 |  | 
 | A big thanks to the people at Hayes, especially Alan Adamson.  Their support | 
 | has enabled me to provide enhancements to the driver. | 
 |  | 
 | Please report your experiences with this driver to me ([email protected]).  I | 
 | am looking for both positive and negative feedback. | 
 |  | 
 | *** IMPORTANT CHANGES FOR 2.1 *** | 
 | Support for PIO mode.  Five situations will cause PIO mode to be used: | 
 | 1) A multiport card is detected.  PIO mode will always be used.  (8 port cards | 
 | do not support DMA). | 
 | 2) The DMA channel is set to an invalid value (anything other than 1 or 3). | 
 | 3) The DMA buffer/channel could not be allocated.  The port will revert to PIO | 
 | mode until it is reopened. | 
 | 4) Less than a specified number of bytes need to be transferred to/from the | 
 | FIFOs.  PIO mode will be used for that transfer only. | 
 | 5) A port needs to do a DMA transfer and another port is already using the | 
 | DMA channel.  PIO mode will be used for that transfer only. | 
 |  | 
 | Since the Hayes ESP seems to conflict with other cards (notably sound cards) | 
 | when using DMA, DMA is turned off by default.  To use DMA, it must be turned | 
 | on explicitly, either with the "dma=" option described below or with | 
 | setserial.  A multiport card can be forced into DMA mode by using setserial; | 
 | however, most multiport cards don't support DMA. | 
 |  | 
 | The latest version of setserial allows the enhanced configuration of the ESP | 
 | card to be viewed and modified. | 
 | *** | 
 |  | 
 | This package contains the files needed to compile a module to support the Hayes | 
 | ESP card.  The drivers are basically a modified version of the serial drivers. | 
 |  | 
 | Features: | 
 |  | 
 | - Uses the enhanced mode of the ESP card, allowing a wider range of | 
 |   interrupts and features than compatibility mode | 
 | - Uses DMA and 16 bit PIO mode to transfer data to and from the ESP's FIFOs, | 
 |   reducing CPU load | 
 | - Supports primary and secondary ports | 
 |  | 
 |  | 
 | If the driver is compiled as a module, the IRQs to use can be specified by | 
 | using the irq= option.  The format is: | 
 |  | 
 | irq=[0x100],[0x140],[0x180],[0x200],[0x240],[0x280],[0x300],[0x380] | 
 |  | 
 | The address in brackets is the base address of the card.  The IRQ of | 
 | nonexistent cards can be set to 0.  If an IRQ of a card that does exist is set | 
 | to 0, the driver will attempt to guess at the correct IRQ.  For example, to set | 
 | the IRQ of the card at address 0x300 to 12, the insmod command would be: | 
 |  | 
 | insmod esp irq=0,0,0,0,0,0,12,0 | 
 |  | 
 | The custom divisor can be set by using the divisor= option.  The format is the | 
 | same as for the irq= option.  Each divisor value is a series of hex digits, | 
 | with each digit representing the divisor to use for a corresponding port.  The | 
 | divisor value is constructed RIGHT TO LEFT.  Specifying a nonzero divisor value | 
 | will automatically set the spd_cust flag.  To calculate the divisor to use for | 
 | a certain baud rate, divide the port's base baud (generally 921600) by the | 
 | desired rate.  For example, to set the divisor of the primary port at 0x300 to | 
 | 4 and the divisor of the secondary port at 0x308 to 8, the insmod command would | 
 | be: | 
 |  | 
 | insmod esp divisor=0,0,0,0,0,0,0x84,0 | 
 |  | 
 | The dma= option can be used to set the DMA channel.  The channel can be either | 
 | 1 or 3.  Specifying any other value will force the driver to use PIO mode. | 
 | For example, to set the DMA channel to 3, the insmod command would be: | 
 |  | 
 | insmod esp dma=3 | 
 |  | 
 | The rx_trigger= and tx_trigger= options can be used to set the FIFO trigger | 
 | levels.  They specify when the ESP card should send an interrupt.  Larger | 
 | values will decrease the number of interrupts; however, a value too high may | 
 | result in data loss.  Valid values are 1 through 1023, with 768 being the | 
 | default.  For example, to set the receive trigger level to 512 bytes and the | 
 | transmit trigger level to 700 bytes, the insmod command would be: | 
 |  | 
 | insmod esp rx_trigger=512 tx_trigger=700 | 
 |  | 
 | The flow_off= and flow_on= options can be used to set the hardware flow off/ | 
 | flow on levels.  The flow on level must be lower than the flow off level, and | 
 | the flow off level should be higher than rx_trigger.  Valid values are 1 | 
 | through 1023, with 1016 being the default flow off level and 944 being the | 
 | default flow on level.  For example, to set the flow off level to 1000 bytes | 
 | and the flow on level to 935 bytes, the insmod command would be: | 
 |  | 
 | insmod esp flow_off=1000 flow_on=935 | 
 |  | 
 | The rx_timeout= option can be used to set the receive timeout value.  This | 
 | value indicates how long after receiving the last character that the ESP card | 
 | should wait before signalling an interrupt.  Valid values are 0 though 255, | 
 | with 128 being the default.  A value too high will increase latency, and a | 
 | value too low will cause unnecessary interrupts.  For example, to set the | 
 | receive timeout to 255, the insmod command would be: | 
 |  | 
 | insmod esp rx_timeout=255 | 
 |  | 
 | The pio_threshold= option sets the threshold (in number of characters) for | 
 | using PIO mode instead of DMA mode.  For example, if this value is 32, | 
 | transfers of 32 bytes or less will always use PIO mode. | 
 |  | 
 | insmod esp pio_threshold=32 | 
 |  | 
 | Multiple options can be listed on the insmod command line by separating each | 
 | option with a space.  For example: | 
 |  | 
 | insmod esp dma=3 trigger=512 | 
 |  | 
 | The esp module can be automatically loaded when needed.  To cause this to | 
 | happen, add the following lines to /etc/modprobe.conf (replacing the last line | 
 | with options for your configuration): | 
 |  | 
 | alias char-major-57 esp | 
 | alias char-major-58 esp | 
 | options esp irq=0,0,0,0,0,0,3,0 divisor=0,0,0,0,0,0,0x4,0 | 
 |  | 
 | You may also need to run 'depmod -a'. | 
 |  | 
 | Devices must be created manually.  To create the devices, note the output from | 
 | the module after it is inserted.  The output will appear in the location where | 
 | kernel messages usually appear (usually /var/adm/messages).  Create two devices | 
 | for each 'tty' mentioned, one with major of 57 and the other with major of 58. | 
 | The minor number should be the same as the tty number reported.  The commands | 
 | would be (replace ? with the tty number): | 
 |  | 
 | mknod /dev/ttyP? c 57 ? | 
 | mknod /dev/cup? c 58 ? | 
 |  | 
 | For example, if the following line appears: | 
 |  | 
 | Oct 24 18:17:23 techno kernel: ttyP8 at 0x0140 (irq = 3) is an ESP primary port | 
 |  | 
 | ...two devices should be created: | 
 |  | 
 | mknod /dev/ttyP8 c 57 8 | 
 | mknod /dev/cup8 c 58 8 | 
 |  | 
 | You may need to set the permissions on the devices: | 
 |  | 
 | chmod 666 /dev/ttyP* | 
 | chmod 666 /dev/cup* | 
 |  | 
 | The ESP module and the serial module should not conflict (they can be used at | 
 | the same time).  After the ESP module has been loaded the ports on the ESP card | 
 | will no longer be accessible by the serial driver. | 
 |  | 
 | If I/O errors are experienced when accessing the port, check for IRQ and DMA | 
 | conflicts ('cat /proc/interrupts' and 'cat /proc/dma' for a list of IRQs and | 
 | DMAs currently in use). | 
 |  | 
 | Enjoy! | 
 | Andrew J. Robinson <[email protected]> |