128 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 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.
 | |
| 
 | |
| 	One example would be a driver trying an SMBus Block Write
 | |
| 	with block size outside the range of 1-32 bytes.
 | |
| 
 | |
| 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.
 | |
| 
 |