
Linux I2O User Space Interface
rev 0.3 - 04/20/99

=============================================================================
Originally written by Deepak Saxena(deepak@plexity.net)
Currently maintained by Deepak Saxena(deepak@plexity.net)
=============================================================================

I. Introduction

The Linux I2O subsystem provides a set of ioctl() commands that can be
utilized by user space applications to communicate with IOPs and devices
on individual IOPs. This document defines the specific ioctl() commands
that are available to the user and provides examples of their uses.

This document assumes the reader is familiar with or has access to the 
I2O specification as no I2O message parameters are outlined.  For information 
on the specification, see http://www.i2osig.org

This document and the I2O user space interface are currently maintained
by Deepak Saxena.  Please send all comments, errata, and bug fixes to
deepak@csociety.purdue.edu

II. IOP Access

Access to the I2O subsystem is provided through the device file named 
/dev/i2o/ctl.  This file is a character file with major number 10 and minor
number 166.  It can be created through the following command:

   mknod /dev/i2o/ctl c 10 166

III. Determining the IOP Count

   SYNOPSIS 

   ioctl(fd, I2OGETIOPS,  int *count);

   u8 count[MAX_I2O_CONTROLLERS];

   DESCRIPTION

   This function returns the system's active IOP table.  count should
   point to a buffer containing MAX_I2O_CONTROLLERS entries.  Upon 
   returning, each entry will contain a non-zero value if the given
   IOP unit is active, and NULL if it is inactive or non-existent.

   RETURN VALUE.

   Returns 0 if no errors occur, and -1 otherwise.  If an error occurs,
   errno is set appropriately:

     EFAULT   Invalid user space pointer was passed

IV. Getting Hardware Resource Table

   SYNOPSIS 
 
   ioctl(fd, I2OHRTGET, struct i2o_cmd_hrt *hrt);

      struct i2o_cmd_hrtlct
      {
         u32   iop;      /* IOP unit number */
         void  *resbuf;  /* Buffer for result */
         u32   *reslen;  /* Buffer length in bytes */
      };

   DESCRIPTION

   This function returns the Hardware Resource Table of the IOP specified 
   by hrt->iop in the buffer pointed to by hrt->resbuf. The actual size of 
   the data is written into *(hrt->reslen).

   RETURNS

   This function returns 0 if no errors occur. If an error occurs, -1 
   is returned and errno is set appropriately:

      EFAULT      Invalid user space pointer was passed
      ENXIO       Invalid IOP number
      ENOBUFS     Buffer not large enough.  If this occurs, the required
                  buffer length is written into *(hrt->reslen)
  
V. Getting Logical Configuration Table
   
   SYNOPSIS 
 
   ioctl(fd, I2OLCTGET, struct i2o_cmd_lct *lct);

      struct i2o_cmd_hrtlct
      {
         u32   iop;      /* IOP unit number */
         void  *resbuf;  /* Buffer for result */
         u32   *reslen;  /* Buffer length in bytes */
      };

   DESCRIPTION

   This function returns the Logical Configuration Table of the IOP specified
   by lct->iop in the buffer pointed to by lct->resbuf. The actual size of 
   the data is written into *(lct->reslen).

   RETURNS

   This function returns 0 if no errors occur. If an error occurs, -1 
   is returned and errno is set appropriately:

      EFAULT      Invalid user space pointer was passed
      ENXIO       Invalid IOP number
      ENOBUFS     Buffer not large enough.  If this occurs, the required
                  buffer length is written into *(lct->reslen)

VI. Setting Parameters
   
   SYNOPSIS 
 
   ioctl(fd, I2OPARMSET, struct i2o_parm_setget *ops);

      struct i2o_cmd_psetget
      {
         u32   iop;      /* IOP unit number */
         u32   tid;      /* Target device TID */
         void  *opbuf;   /* Operation List buffer */
         u32   oplen;    /* Operation List buffer length in bytes */
         void  *resbuf;  /* Result List buffer */
         u32   *reslen;  /* Result List buffer length in bytes */
      };

   DESCRIPTION

   This function posts a UtilParamsSet message to the device identified
   by ops->iop and ops->tid.  The operation list for the message is 
   sent through the ops->opbuf buffer, and the result list is written
   into the buffer pointed to by ops->resbuf.  The number of bytes 
   written is placed into *(ops->reslen). 

   RETURNS

   The return value is the size in bytes of the data written into
   ops->resbuf if no errors occur.  If an error occurs, -1 is returned 
   and errno is set appropriately:

      EFAULT      Invalid user space pointer was passed
      ENXIO       Invalid IOP number
      ENOBUFS     Buffer not large enough.  If this occurs, the required
                  buffer length is written into *(ops->reslen)
      ETIMEDOUT   Timeout waiting for reply message
      ENOMEM      Kernel memory allocation error

   A return value of 0 does not mean that the value was actually
   changed properly on the IOP.  The user should check the result
   list to determine the specific status of the transaction.

VII. Getting Parameters
   
   SYNOPSIS 
 
   ioctl(fd, I2OPARMGET, struct i2o_parm_setget *ops);

      struct i2o_parm_setget
      {
         u32   iop;      /* IOP unit number */
         u32   tid;      /* Target device TID */
         void  *opbuf;   /* Operation List buffer */
         u32   oplen;    /* Operation List buffer length in bytes */
         void  *resbuf;  /* Result List buffer */
         u32   *reslen;  /* Result List buffer length in bytes */
      };

   DESCRIPTION

   This function posts a UtilParamsGet message to the device identified
   by ops->iop and ops->tid.  The operation list for the message is 
   sent through the ops->opbuf buffer, and the result list is written
   into the buffer pointed to by ops->resbuf.  The actual size of data
   written is placed into *(ops->reslen).

   RETURNS

      EFAULT      Invalid user space pointer was passed
      ENXIO       Invalid IOP number
      ENOBUFS     Buffer not large enough.  If this occurs, the required
                  buffer length is written into *(ops->reslen)
      ETIMEDOUT   Timeout waiting for reply message
      ENOMEM      Kernel memory allocation error

   A return value of 0 does not mean that the value was actually
   properly retrieved.  The user should check the result list 
   to determine the specific status of the transaction.

VIII. Downloading Software
   
   SYNOPSIS 
 
   ioctl(fd, I2OSWDL, struct i2o_sw_xfer *sw);

      struct i2o_sw_xfer
      {
         u32   iop;       /* IOP unit number */
         u8    flags;     /* DownloadFlags field */
         u8    sw_type;   /* Software type */
         u32   sw_id;     /* Software ID */
         void  *buf;      /* Pointer to software buffer */
         u32   *swlen;    /* Length of software buffer */        
         u32   *maxfrag;  /* Number of fragments */
         u32   *curfrag;  /* Current fragment number */
      };

   DESCRIPTION

   This function downloads a software fragment pointed by sw->buf
   to the iop identified by sw->iop. The DownloadFlags, SwID, SwType
   and SwSize fields of the ExecSwDownload message are filled in with
   the values of sw->flags, sw->sw_id, sw->sw_type and *(sw->swlen).

   The fragments _must_ be sent in order and be 8K in size. The last
   fragment _may_ be shorter, however. The kernel will compute its
   size based on information in the sw->swlen field.

   Please note that SW transfers can take a long time.

   RETURNS

   This function returns 0 no errors occur. If an error occurs, -1 
   is returned and errno is set appropriately:

      EFAULT      Invalid user space pointer was passed
      ENXIO       Invalid IOP number
      ETIMEDOUT   Timeout waiting for reply message
      ENOMEM      Kernel memory allocation error

IX. Uploading Software
   
   SYNOPSIS 

   ioctl(fd, I2OSWUL, struct i2o_sw_xfer *sw);

      struct i2o_sw_xfer
      {
         u32   iop;      /* IOP unit number */
         u8    flags; 	 /* UploadFlags */
         u8    sw_type;  /* Software type */
         u32   sw_id;    /* Software ID */
         void  *buf;     /* Pointer to software buffer */
         u32   *swlen;   /* Length of software buffer */        
         u32   *maxfrag; /* Number of fragments */
         u32   *curfrag; /* Current fragment number */
      };

   DESCRIPTION

   This function uploads a software fragment from the IOP identified
   by sw->iop, sw->sw_type, sw->sw_id and optionally sw->swlen fields.
   The UploadFlags, SwID, SwType and SwSize fields of the ExecSwUpload
   message are filled in with the values of sw->flags, sw->sw_id,
   sw->sw_type and *(sw->swlen).

   The fragments _must_ be requested in order and be 8K in size. The
   user is responsible for allocating memory pointed by sw->buf. The
   last fragment _may_ be shorter.

   Please note that SW transfers can take a long time.

   RETURNS

   This function returns 0 if no errors occur.  If an error occurs, -1
   is returned and errno is set appropriately:

      EFAULT      Invalid user space pointer was passed
      ENXIO       Invalid IOP number
      ETIMEDOUT   Timeout waiting for reply message
      ENOMEM      Kernel memory allocation error
         
X. Removing Software
   
   SYNOPSIS 
 
   ioctl(fd, I2OSWDEL, struct i2o_sw_xfer *sw);

      struct i2o_sw_xfer
      {
         u32   iop;      /* IOP unit number */
         u8    flags; 	 /* RemoveFlags */
         u8    sw_type;  /* Software type */
         u32   sw_id;    /* Software ID */
         void  *buf;     /* Unused */
         u32   *swlen;   /* Length of the software data */        
         u32   *maxfrag; /* Unused */
         u32   *curfrag; /* Unused */
      };

   DESCRIPTION

   This function removes software from the IOP identified by sw->iop.
   The RemoveFlags, SwID, SwType and SwSize fields of the ExecSwRemove message 
   are filled in with the values of sw->flags, sw->sw_id, sw->sw_type and 
   *(sw->swlen). Give zero in *(sw->len) if the value is unknown. IOP uses 
   *(sw->swlen) value to verify correct identication of the module to remove. 
   The actual size of the module is written into *(sw->swlen).

   RETURNS

   This function returns 0 if no errors occur.  If an error occurs, -1
   is returned and errno is set appropriately:

      EFAULT      Invalid user space pointer was passed
      ENXIO       Invalid IOP number
      ETIMEDOUT   Timeout waiting for reply message
      ENOMEM      Kernel memory allocation error

X. Validating Configuration

   SYNOPSIS

   ioctl(fd, I2OVALIDATE, int *iop);
	u32 iop;

   DESCRIPTION

   This function posts an ExecConfigValidate message to the controller
   identified by iop. This message indicates that the current
   configuration is accepted. The iop changes the status of suspect drivers 
   to valid and may delete old drivers from its store.

   RETURNS

   This function returns 0 if no erro occur.  If an error occurs, -1 is
   returned and errno is set appropriately:

      ETIMEDOUT   Timeout waiting for reply message
      ENXIO       Invalid IOP number

XI. Configuration Dialog
   
   SYNOPSIS 
 
   ioctl(fd, I2OHTML, struct i2o_html *htquery);
      struct i2o_html
      {
         u32   iop;      /* IOP unit number */
         u32   tid;      /* Target device ID */
         u32   page;     /* HTML page */
         void  *resbuf;  /* Buffer for reply HTML page */
         u32   *reslen;  /* Length in bytes of reply buffer */
         void  *qbuf;    /* Pointer to HTTP query string */
         u32   qlen;     /* Length in bytes of query string buffer */        
      };

   DESCRIPTION

   This function posts an UtilConfigDialog message to the device identified
   by htquery->iop and htquery->tid.  The requested HTML page number is 
   provided by the htquery->page field, and the resultant data is stored 
   in the buffer pointed to by htquery->resbuf.  If there is an HTTP query 
   string that is to be sent to the device, it should be sent in the buffer
   pointed to by htquery->qbuf.  If there is no query string, this field
   should be set to NULL. The actual size of the reply received is written
   into *(htquery->reslen).
  
   RETURNS

   This function returns 0 if no error occur. If an error occurs, -1
   is returned and errno is set appropriately:

      EFAULT      Invalid user space pointer was passed
      ENXIO       Invalid IOP number
      ENOBUFS     Buffer not large enough.  If this occurs, the required
                  buffer length is written into *(ops->reslen)
      ETIMEDOUT   Timeout waiting for reply message
      ENOMEM      Kernel memory allocation error

XII. Events

    In the process of determining this.  Current idea is to have use
    the select() interface to allow user apps to periodically poll
    the /dev/i2o/ctl device for events.  When select() notifies the user
    that an event is available, the user would call read() to retrieve
    a list of all the events that are pending for the specific device.

=============================================================================
Revision History
=============================================================================

Rev 0.1 - 04/01/99
- Initial revision

Rev 0.2 - 04/06/99
- Changed return values to match UNIX ioctl() standard.  Only return values
  are 0 and -1.  All errors are reported through errno.
- Added summary of proposed possible event interfaces

Rev 0.3 - 04/20/99
- Changed all ioctls() to use pointers to user data instead of actual data
- Updated error values to match the code
