Provided by: ax25-tools_0.0.10-rc5+git20230513+d3e6d4f-1build2_amd64 bug

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).

Linux 2.1.x                                       27 April 2008                                       HDLCDRV(9)