AnsweredAssumed Answered

Linux LinkPort driver (bfin_lp.c) - issues

Question asked by lukma on Sep 8, 2017

Dear Support,

I've ported the LinkPort driver (drivers/char/bfin_lp.c) [1] from CCES-Linux-addin v.1.2.0 to LTS Linux (4.9).

Our application:

- We send burst data from device to sc584.  The byte clock is 50MHz.

- The sc584 is a receiver.

- It seems that the driver [1] works in non-DMA mode; it reads data from internal FIFO (in ISR) and copies it to kernel allocated buffer (via kfifo).
  Do you have Linux (non bare-metal) Linkport driver, which supports burst DMA transmissions?

The [1] is not available either in vanila Linux [3] nor some unofficial ADI port [4].

- We receive a lot of interrupts:
 cat /proc/interrupts

 44:        143     GIC-0 109 Edge      bfin-linkport
 45:          0     GIC-0 110 Edge      bfin-linkport

But no proper data is read;

"dd if=/dev/linkport0 bs=4 count=1" hangs

- I've attached Kernel logs [2] from receiving data:

Please find following snippet:

bfin lp irq 44 stat 30 dev c0814b84 status 0  <- OK IRQ received
wait event                  <- OK
lp_rx_fifo: cnt: 3          <- OK 3 x words (32bits) in internal RX FIFO
data: 0x86b1235 ret: 1 stat: 0x20   <- OK,we have sent one word to kfifo
data: 0x86b1236 ret: 1 stat: 0x20   <- ERR, why stat is still 0x20 [*]
data: 0x86b1237 ret: 1 stat: 0x20   <- ERR, why stat is still 0x20 [**]

[*] - should be 0x10 ; [**] - should be 0x00 ?

Why is the FIFO status (FFST) not updated as we read LP_RX register?

Also, we shall exit from the driver after receiving the first word (as we asked for 4 bytes transfer with dd).

- Now the driver [1] is using workqueue triggered from LinkPort ISR.
Could you confirm that it shall be used for some low-rate data?

It looks to me that for some high throughput use cases (with interrupt frequency of tens of MHz) the DMA should be used (as sc584 sclk is 450 MHz).
Or maybe there is other way to make LinkPort transmission more robust?

[3] -
[4] -


Best regards,