+/*! @function IOStateReporter::setStateByIndices
+ @abstract update a channel state without validating channel_id
+
+ @param channel_index - 0..<nChannels>, available from getChannelIndex()
+ @param new_state_index - New state (by index) for the channel
+ @param last_intransition - deprecated: time of most recent entry
+ @param prev_state_residency - deprecated: time spent in previous state
+ @result Appropriate IOReturn code
+
+ @discussion
+ Similar to setState(), setStateByIndices() sets a channel's state
+ without searching for the channel or state IDs. It will perform
+ bounds checking, but relies on the caller to properly indicate
+ the indices of the channel and state. Clients can rely on channels
+ being added to IOStateReporter in order: the first channel will
+ have index 0, the second index 1, etc. Like ::setState(),
+ "time in state" calculations are handled automatically.
+
+ setStateByIndices() is faster than than setChannelState(), but
+ it should only be used where the latter's performance overhead
+ might be a problem. For example, many channels in a single
+ reporter and high-frequency state changes.
+
+ Drivers wishing to compute and report their own time in state
+ should use incrementChannelState() or overrideChannelState(). It
+ is not currently possible for a driver to synchronize with the
+ automatic time-keeping enabled by setStateByIndices(). The
+ 4-argument version of setChannelState() is thus impossible to
+ use correctly. In the future, there may be a setChannelState()
+ which accepts a last_intransition parameter and uses it to
+ automatically calculate time in state (ERs -> IOReporting / X).
+
+ Locking: same-instance concurrency SAFE, WILL NOT BLOCK
+*/