NAME¶
hdlcdrv - HDLC amateur (AX.25) packet radio network driver
SYNOPSIS¶
#include <linux/hdlcdrv.h>
 
linux/drivers/net/hdlcdrv.c
 
extern inline void hdlcdrv_putbits(struct hdlcdrv_state * s,
  unsigned int bits);
 
extern inline unsigned int hdlcdrv_getbits(struct hdlcdrv_state *
  s);
 
extern inline void hdlcdrv_channelbit(struct hdlcdrv_state * s,
  unsigned int bit);
 
extern inline void hdlcdrv_setdcd(struct hdlcdrv_state * s ,
  int dcd);
 
extern inline int hdlcdrv_ptt(struct hdlcdrv_state * s);
 
void hdlcdrv_receiver(struct device *, struct hdlcdrv_state *);
 
void hdlcdrv_transmitter(struct device *, struct hdlcdrv_state *);
 
void hdlcdrv_arbitrate(struct device *, struct hdlcdrv_state *);
 
int hdlcdrv_register_hdlcdrv(struct device * dev, struct
  hdlcdrv_ops * ops, unsigned int privsize, char *
  ifname, unsigned int baseaddr , unsigned int
  irq, unsigned int dma);
 
int hdlcdrv_unregister_hdlcdrv(struct device * dev);
 
DESCRIPTION¶
This driver should ease the implementation of simple AX.25 packet radio modems
  where the software is responsible for the HDLC encoding and decoding. Examples
  of such modems include the 
baycom family and the 
soundcard
  modems.
 
This driver provides a standard Linux network driver interface. It can even be
  compiled if Kernel AX.25 is not enabled in the Linux configuration. This
  allows this driver to be used even for userland AX.25 stacks such as
  
Wampes or 
TNOS, with the help of the 
net2kiss utility.
 
This driver does not access any hardware; it is the responsibility of an
  additional hardware driver such as 
baycom or 
soundmodem to
  access the hardware and derive the bitstream to feed into this driver.
 
The hardware driver should store its state in a structure of the following form:
 
struct hwdrv_state {
	struct hdlc_state  hdrv;
	... the drivers private state
};
 
A pointer to this structure will be stored in 
dev->priv.
 
hdlcdrv_register_hdlcdrv registers a hardware driver to the hdlc driver.
  
dev points to storage for the 
device structure, which must be
  provided by the hardware driver, but gets initialized by this function call.
  
ops provides information about the hardware driver and its calls.
  
privsize should be 
sizeof(struct hwdrv_state).
  
ifname specifies the name the interface should get. 
baseaddr,
  
irq and 
dma are simply stored in the 
device structure.
  After this function succeeds, the interface is registered with the kernel. It
  is not running, however, this must be done with
  
ifconfig ifname  up.
 
hdlcdrv_unregister_hdlcdrv shuts the interface down and unregisters it
  with the kernel.
 
hdlcdrv_putbits delivers 16 received bits for processing to the HDLC
  driver. This routine merely stores them in a buffer and does not process them.
  It is thus fast and can be called with interrupts off. The least significant
  bit should be the first one received.
 
hdlcdrv_getbits requests 16 bits from the driver for transmission. The
  least significant bit should be transmitted first. This routine takes them
  from a buffer and is therefore fast. It can be called with interrupts off.
 
hdlcdrv_channelbit puts a single bit into a buffer, which can be
  displayed with 
sethdlc -s. It is intended for driver debugging
  purposes.
 
hdlcdrv_setdcd informs the HDLC driver about the channel state (i.e. if
  the hardware driver detected a data carrier). This information is used in the
  channel access algorithm, i.e. it prevents the driver from transmitting on a
  half duplex channel if there is already a transmitter on air.
 
hdlcdrv_ptt should be called by the hardware driver to determine if it
  should start or stop transmitting. The hardware driver does not need to worry
  about keyup delays. This is done by the HDLC driver.
 
hdlcdrv_receiver actually processes the received bits delivered by
  
hdlcdrv_putbits. It should be called with interrupts on. It guards
  itself against reentrance problems.
 
hdlcdrv_transmitter actually prepares the bits to be transmitted. It
  should be called with interrupts on. It guards itself against reentrance
  problems.
 
hdlcdrv_arbitrate does the channel access algorithm (p-persistent CSMA).
  It should be called once every 10ms. Note that the hardware driver 
must
  set the 
hdrv.par.bitrate field prior to starting operation so that
  
hdlcdrv can calculate the transmitter keyup delay correctly.
 
HARDWARE DRIVER ENTRY POINTS¶
The hardware driver should provide the following information to the HDLC driver:
 
struct hdlcdrv_ops {
        const char * drvname;
        const char * drvinfo;
        int (* open)(struct device *);
        int (* close)(struct device *);
        int (* ioctl)(struct device *, struct ifreq *, int);
};
 
drvname and 
drvinfo are just for informational purposes.
 
The following routines receive a pointer to the 
device structure, where
  they may find the io address, irq and dma channels.
 
open must be provided. It is called during
  
ifconfig ifname  up and should check for the
  hardware, grab it and initialize it. It usually installs an interrupt handler
  which then gets invoked by the hardware.
 
close must be provided. It is called during
  
ifconfig ifname  down and should undo all
  actions done by 
open, i.e. release io regions and irqs.
 
ioctl may be provided to implement device specific ioctl's.
 
IOCTL CALLS¶
The driver only responds to 
SIOCDEVPRIVATE. Parameters are passed from
  and to the driver using the following struct:
 
struct hdlcdrv_ioctl {
        int cmd;
        union {
                struct hdlcdrv_params mp;
                struct hdlcdrv_channel_params cp;
                struct hdlcdrv_channel_state cs;
                unsigned int calibrate;
                unsigned char bits;
        } data;
};
 
Since the 16 private 
ioctl request numbers for network drivers were
  not enough, the driver implements its own 
sub request number with
  
cmd. The following numbers are implemented:
 
  - HDLCDRVCTL_GETMODEMPAR
 
  - returns the IO parameters of the modem in data.mp.
      This includes the io address, irq, eventually dma, and ports to output a
      PTT signal.
    
 
   
  - HDLCDRVCTL_SETMODEMPAR
 
  - sets the modem parameters. Only superuser can do this.
      Parameters can only be changed if the interface is not running (i.e.
      down).
    
 
   
  - HDLCDRVCTL_GETCHANNELPAR
 
  - returns the channel access parameters.
    
 
   
  - HDLCDRVCTL_SETCHANNELPAR
 
  - sets the channel access parameters. Only superuser can do
      this. They may also be changed using the kissparms command if using
      kernel AX.25 or the param command of *NOS.
    
 
   
  - HDLCDRVCTL_GETSTAT
 
  - statistics and status information, such as if a carrier is
      detected on the channel and if the interface is currently transmitting.
    
 
   
  - HDLCDRVCTL_CALIBRATE
 
  - instructs the driver to transmit a calibration pattern for
      the specified number of seconds.
    
 
   
  - HDLCDRVCTL_GETSAMPLES
 
  - returns the bits delivered by the hardware driver with
      hdlcdrv_channelbit. The bits are returned 8 at a time with the
      least significant bit the first one. This command may not be available,
      depending on debugging settings.
    
 
   
  - HDLCDRVCTL_GETBITS
 
  - returns the bits delivered by the hardware driver to the
      HDLC decoder. The bits are returned 8 at a time with the least significant
      bit the first one. This command may not be available, depending on
      debugging settings.
    
 
   
SEE ALSO¶
baycom (9), 
soundmodem (9), 
sethdlc (8),
  linux/drivers/net/hdlcdrv.c,
 
AUTHOR¶
hdlcdrv was written by Thomas Sailer, HB9JNX/AE4WA, (t.sailer@alumni.ethz.ch).