Re: [PATCH v2 2/5] em28xx: respect the message size constraints for i2c transfers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 01/02/2013 11:29 PM, Frank Schäfer wrote:
Am 02.01.2013 22:15, schrieb Antti Palosaari:
On 01/02/2013 11:12 PM, Frank Schäfer wrote:
Hi Antti,

Am 02.01.2013 20:29, schrieb Antti Palosaari:
On 12/24/2012 01:09 PM, Frank Schäfer wrote:
Am 23.12.2012 15:46, schrieb Mauro Carvalho Chehab:
Em Sun, 23 Dec 2012 14:58:12 +0100
Frank Schäfer <fschaefer.oss@xxxxxxxxxxxxxx> escreveu:

Am 23.12.2012 01:07, schrieb Mauro Carvalho Chehab:
Em Sun, 16 Dec 2012 19:23:28 +0100
Frank Schäfer <fschaefer.oss@xxxxxxxxxxxxxx> escreveu:

Those devices are limited, and just like other devices (cx231xx
for example),
the I2C bus need to split long messages, otherwise the I2C devices
will
fail.
I2C adapters are supposed to fail with -EOPNOTSUPP if the message
length
exceeds their capabilities.
Drivers must be able to handle this error, otherwise they have to
be fixed.
Currently, afaikt, no V4L2 I2C client knows how to handle it.

Maybe. Fortunately, it seems to cause no trouble.

    Ok, returning
-EOPNOTSUPP if the I2C data came from userspace makes sense.

Btw, there was already a long discussion with regards to splitting
long
I2C messages at the I2C bus or at the I2C adapters. The decision
was
to do it at the I2C bus logic, as it is simpler than making a code
at each I2C client for them to properly handle -EOPNOTSUPP and
implement
a fallback logic to reduce the transfer window until reach what's
supported by the device.
While letting the i2c bus layer split messages sounds like the right
thing to do, it is hard to realize that in practice.
The reason is, that the needed algorithm depends on the
capabilities and
behavior of the i2c adapter _and_ the connected i2c client.
The three main parameters are:
- message size limits
- client register width
- automatic register index incrementation

I don't know what has been discussed in past,
You'll need to dig into the ML archives. This is a recurrent theme,
and,
we have implementations doing I2C split at bus (most cases) and a few
ones doing it at the client side.

Yeah, I also have a working implementation of i2c block read/write
emulation in my experimental code. ;)

but I talked to Jean
Delvare about the message size constraints a few weeks ago.
He told me that it doesn't make sense to try to handle this at
the i2c
subsystem level. The parameters can be different for reading and
writing, adapter and client and things are getting complicated
quickly.
Jean's opinion is to push it to I2C clients (and we actually do it
on a
few cases), but as I explained before, there are several drivers
where
this is better done at the I2C bus driver, as the I2C implementation
allows doing it easily at bus level by playing with I2C STOP bits/I2C
start bits.

We simply have too much I2C clients, and -EOPNOTSUPP error code
doesn't
tell the max size of the I2C messages. Adding a complex split logic
for every driver is not a common practice, as just a few I2C bus
bridge
drivers suffer from very strict limits.

Yes, and even with those who have such a strict limit, it is
usually not
exceeded because the clients are too 'simple'. ;)

Also, clients that split I2C messages don't actually handle
-EOPNOTSUPP.
Instead, they have an init parameter telling the maximum size of the
I2C messages accepted by the bus.

The logic there is complex, and may require an additional logic at
the
bus side, in order to warrant that no I2C stop/start bits will be
sent
in the middle of a message, or otherwise the device will fail[1].

So, it is generally simpler and more effective to just do it at
the bus
side.

Maybe. I have no opinion yet.
My feeling is, that this should be handled by the i2c subsystem as
much
as possible, but
a) it's complex due to the described reasons
b) I have no complete concept yet
c) the i2c people seem to be not very interested
d) there is lots of other stuff with a higher priority on my TODO list

Maybe you already have seen, but I did some initial stuff year or two
ago for implementing that but left it unimplemented as there was so
much stuff to check and discuss in order to agree correct solution.

http://www.mail-archive.com/linux-media@xxxxxxxxxxxxxxx/msg38840.html

There is regmap which maybe could do stuff like that, I am not sure as
I never tested it. At least it could do some stuff top of I2C bus.

Yes, I've read this discussion, but didn't have time to take a deeper
look into the regmap stuff yet.

For the em28xx driver itself, there is no real need for i2c block
read/write emulation at the moment. We could save only a few lines.
I'm also burried with lots of other stuff at the moment which has a
higher priority for me.

Please note that the whole discussion has nothing to do with this patch.
It just removes code which isn't and has never been working.


Also I heavily disagree you what goes to I2C subsystem integration.
That is clearly stuff which resides top of I2C bus and it is *not bus
dependent*. There is many other buses too having similar splitting
logic like SPI?


I don't understand you. In which points do we disagree ??

"My feeling is, that this should be handled by the i2c subsystem as
much as possible"

Maybe I should have said "as much as makes sense" ;)
To be more precise: I think it's always good to have as much common code
as possible. And of course the complexity of the code must be justified
by it's benefits.
Do you agree ?

Common code is of course what it should be. Integrating that splitting logic to I2C subsystem is not common in the meaning as there is other buses than I2C as well. That splitting logic is something which is not that much bus specific.

Antti

--
http://palosaari.fi/
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux