
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
