Re: [PATCH] Airprime driver improvements to allow full speed EvDO transfers

Sergei Organov
2006-07-12T09:21:18Z

Andy Gay <andy@andynet.net> writes:
> On Tue, 2006-07-11 at 22:31 +0400, Sergei Organov wrote:
>> Andy Gay <andy@andynet.net> writes:

[...]

>> > + /* something happened, so free up the memory for this urb /*
>>
>> There should be '*/' at the end of this line, not '/*', otherwise the
>> driver even doesn't compile.
>
> Sure. I posted an updated version including that fix -
> http://lkml.org/lkml/2006/7/3/280

OK, I've forgot about that one, sorry.

[...]

>>
>> After these fixes, I've been able to run the driver with my own USB
>> device and achieved about 320 Kbytes/s read speed. That's still not very
>> exciting as I have another driver here in development that seems to be
>> able to do about 650 Kbytes/s with the same device.
>>
> Nice. That's over 5Mbits/sec!
>
> Is that on an EvDO network? I didn't know they could go that fast. The
> EvDO network I'm testing on can only manage about 1Mbit/sec at best.

No, it is not, -- that's my own device I write firmware for. In our
earlier discussion about high-speed bulk-to-tty converter Greg suggested
to try to use improved airprime driver to see if it's fast enough, and
probably then we may come up with high speed generic bulk-to-tty
converter. If we finally get it done, the airprime and other similar
drivers may directly use it for read/write/handshake operations and
manage only their specifics themselves.

Now to the difference in speed. I think the main reason airprime can't
match 5Mbits/sec is copying of data into tty in the read callback. I use
specially crafted ring buffer of chars, memory from which is directly
passed to the single read URB, then I immediately resubmit the URB (with
the next chunk of memory from the ring buffer) in the read callback and
schedule tasklet to copy from the ring buffer to tty. This solution is
there from the old days when USB core didn't like submissions of
multiple URBs. Now I think a better approach could be to have a FIFO of
URBs along with their buffers where you put URBs in the read callback,
then get them in the tasklet, copy to tty, and re-submit. I didn't have
time to play with the latter approach though.

--
Sergei.