This is a summary of the most important conventions for use of fault
codes in the I2C/SMBus stack.


A "Fault" is not always an "Error"
----------------------------------
Not all fault reports imply errors; "page faults" should be a familiar
example.  Software often retries idempotent operations after transient
faults.  There may be fancier recovery schemes that are appropriate in
some cases, such as re-initializing (and maybe resetting).  After such
recovery, triggered by a fault report, there is no error.

In a similar way, sometimes a "fault" code just reports one defined
result for an operation ... it doesn't indicate that anything is wrong
at all, just that the outcome wasn't on the "golden path".

In short, your I2C driver code may need to know these codes in order
to respond correctly.  Other code may need to rely on YOUR code reporting
the right fault code, so that it can (in turn) behave correctly.


I2C and SMBus fault codes
-------------------------
These are returned as negative numbers from most calls, with zero or
some positive number indicating a non-fault return.  The specific
numbers associated with these symbols differ between architectures,
though most Linux systems use <asm-generic/errno*.h> numbering.

Note that the descriptions here are not exhaustive.  There are other
codes that may be returned, and other cases where these codes should
be returned.  However, drivers should not return other codes for these
cases (unless the hardware doesn't provide unique fault reports).

Also, codes returned by adapter probe methods follow rules which are
specific to their host bus (such as PCI, or the platform bus).


EAGAIN
	Returned by I2C adapters when they lose arbitration in master
	transmit mode:  some other master was transmitting different
	data at the same time.

	Also returned when trying to invoke an I2C operation in an
	atomic context, when some task is already using that I2C bus
	to execute some other operation.

EBADMSG
	Returned by SMBus logic when an invalid Packet Error Code byte
	is received.  This code is a CRC covering all bytes in the
	transaction, and is sent before the terminating STOP.  This
	fault is only reported on read transactions; the SMBus slave
	may have a way to report PEC mismatches on writes from the
	host.  Note that even if PECs are in use, you should not rely
	on these as the only way to detect incorrect data transfers.

EBUSY
	Returned by SMBus adapters when the bus was busy for longer
	than allowed.  This usually indicates some device (maybe the
	SMBus adapter) needs some fault recovery (such as resetting),
	or that the reset was attempted but failed.

EINVAL
	This rather vague error means an invalid parameter has been
	detected before any I/O operation was started.  Use a more
	specific fault code when you can.

EIO
	This rather vague error means something went wrong when
	performing an I/O operation.  Use a more specific fault
	code when you can.

ENODEV
	Returned by driver probe() methods.  This is a bit more
	specific than ENXIO, implying the problem isn't with the
	address, but with the device found there.  Driver probes
	may verify the device returns *correct* responses, and
	return this as appropriate.  (The driver core will warn
	about probe faults other than ENXIO and ENODEV.)

ENOMEM
	Returned by any component that can't allocate memory when
	it needs to do so.

ENXIO
	Returned by I2C adapters to indicate that the address phase
	of a transfer didn't get an ACK.  While it might just mean
	an I2C device was temporarily not responding, usually it
	means there's nothing listening at that address.

	Returned by driver probe() methods to indicate that they
	found no device to bind to.  (ENODEV may also be used.)

EOPNOTSUPP
	Returned by an adapter when asked to perform an operation
	that it doesn't, or can't, support.

	For example, this would be returned when an adapter that
	doesn't support SMBus block transfers is asked to execute
	one.  In that case, the driver making that request should
	have verified that functionality was supported before it
	made that block transfer request.

	Similarly, if an I2C adapter can't execute all legal I2C
	messages, it should return this when asked to perform a
	transaction it can't.  (These limitations can't be seen in
	the adapter's functionality mask, since the assumption is
	that if an adapter supports I2C it supports all of I2C.)

EPROTO
	Returned when slave does not conform to the relevant I2C
	or SMBus (or chip-specific) protocol specifications.  One
	case is when the length of an SMBus block data response
	(from the SMBus slave) is outside the range 1-32 bytes.

ETIMEDOUT
	This is returned by drivers when an operation took too much
	time, and was aborted before it completed.

	SMBus adapters may return it when an operation took more
	time than allowed by the SMBus specification; for example,
	when a slave stretches clocks too far.  I2C has no such
	timeouts, but it's normal for I2C adapters to impose some
	arbitrary limits (much longer than SMBus!) too.

