
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 appropriatly:

      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 appropriatly:

      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 appropriatly:

      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 appropriatly:

      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 appropriatly:

      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 appropriatly:

      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
