interfacing a fast device with small buffers

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

 



Hello!

This has been bugging me for some time now, so I thought I'd fish for
ideas.

The device in question is a wireless transceiver with max rate 2 Mbit/s.
It has 3 32-byte RX buffers, and all data and commands (except external
interrupt and chip enable pins) is transferred through <=10 MHz SPI bus.

At max speed this makes receiving difficult, since there's >7000 packets
per second (and using all three buffers still makes it necessary to have
delay between transfers <0.4 ms).

The simple solution with irqs handled in workqueue missed packets, I
guess it couldn't keep up; reasonable, since the delays are very small.
The tasklet or "do it in irq handler" solutions proved a bit tricky,
since commands and transfers had to be handled with spi_async, callbacks
then called another spi_async etc. until the last one.

My hack to disable interrupt preempting an in interrupt currently
handled (a chain of spi commands like: get irq status, receive packet,
ack irq) was to spin_lock() before first spi command, and spin_unlock()
on the last callback. Seems to kinda work, but I'm not happy, and it
occasionally complained about different spinlock owner.

Is there a nice alternative to this spinlock i've been using?
Any other related ideas?


	Domen

--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx
Please read the FAQ at http://kernelnewbies.org/FAQ


[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux