[Qemu-devel] [PATCH] Set ENET_BD_BDU in I.MX FEC controller

Aaron Hill posted 1 patch 4 years, 8 months ago
Test docker-clang@ubuntu passed
Test s390x passed
Test asan passed
Test docker-mingw@fedora passed
Test FreeBSD failed
Test checkpatch passed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20190805142417.10433-1-aaron.hill@alertinnovation.com
Maintainers: Peter Chubb <peter.chubb@nicta.com.au>, Jason Wang <jasowang@redhat.com>, Peter Maydell <peter.maydell@linaro.org>
hw/net/imx_fec.c | 4 ++++
1 file changed, 4 insertions(+)
[Qemu-devel] [PATCH] Set ENET_BD_BDU in I.MX FEC controller
Posted by Aaron Hill 4 years, 8 months ago
From: Aaron Hill <aa1ronham@gmail.com>

This commit properly sets the ENET_BD_BDU flag once the emulated FEC controller
has finished processing the last descriptor. This is done for both transmit
and receive descriptors.

This allows the QNX 7.0.0 BSP for the Sabrelite board (which can be
found at http://blackberry.qnx.com/en/developers/bsp) to properly
control the FEC. Without this patch, the BSP ethernet driver will never
re-use FEC descriptors, as the unset ENET_BD_BDU flag will cause
it to believe that the descriptors are still in use by the NIC.

Note that Linux does not appear to use this field at all, and is
unaffected by this patch.

Without this patch, QNX will think that the NIC is still processing its
transaction descriptors, and won't send any more data over the network.

For reference:

On page 1192 of the I.MX 6DQ reference manual revision (Rev. 5, 06/2018),
which can be found at https://www.nxp.com/products/processors-and-microcontrollers/arm-based-processors-and-mcus/i.mx-applications-processors/i.mx-6-processors/i.mx-6quad-processors-high-performance-3d-graphics-hd-video-arm-cortex-a9-core:i.MX6Q?&tab=Documentation_Tab&linkline=Application-Note

the 'BDU' field is described as follows for the 'Enhanced transmit
buffer descriptor':

'Last buffer descriptor update done. Indicates that the last BD data has been updated by
uDMA. This field is written by the user (=0) and uDMA (=1).'

The same description is used for the receive buffer descriptor.

Signed-off-by: Aaron Hill <aa1ronham@gmail.com>
---
 hw/net/imx_fec.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/hw/net/imx_fec.c b/hw/net/imx_fec.c
index 404154ebbf..4693bfb246 100644
--- a/hw/net/imx_fec.c
+++ b/hw/net/imx_fec.c
@@ -590,6 +590,8 @@ static void imx_enet_do_tx(IMXFECState *s, uint32_t index)
             if (bd.option & ENET_BD_TX_INT) {
                 s->regs[ENET_EIR] |= int_txf;
             }
+            /* Indicate that we've updated the last buffer descriptor. */
+            bd.last_buffer = ENET_BD_BDU;
         }
         if (bd.option & ENET_BD_TX_INT) {
             s->regs[ENET_EIR] |= int_txb;
@@ -1239,6 +1241,8 @@ static ssize_t imx_enet_receive(NetClientState *nc, const uint8_t *buf,
             /* Last buffer in frame.  */
             bd.flags |= flags | ENET_BD_L;
             FEC_PRINTF("rx frame flags %04x\n", bd.flags);
+            /* Indicate that we've updated the last buffer descriptor. */
+            bd.last_buffer = ENET_BD_BDU;
             if (bd.option & ENET_BD_RX_INT) {
                 s->regs[ENET_EIR] |= ENET_INT_RXF;
             }
-- 
2.17.1


Re: [Qemu-devel] [PATCH] Set ENET_BD_BDU in I.MX FEC controller
Posted by Peter Maydell 4 years, 8 months ago
On Mon, 5 Aug 2019 at 15:24, Aaron Hill <aa1ronham@gmail.com> wrote:
>
> From: Aaron Hill <aa1ronham@gmail.com>
>
> This commit properly sets the ENET_BD_BDU flag once the emulated FEC controller
> has finished processing the last descriptor. This is done for both transmit
> and receive descriptors.
>
> This allows the QNX 7.0.0 BSP for the Sabrelite board (which can be
> found at http://blackberry.qnx.com/en/developers/bsp) to properly
> control the FEC. Without this patch, the BSP ethernet driver will never
> re-use FEC descriptors, as the unset ENET_BD_BDU flag will cause
> it to believe that the descriptors are still in use by the NIC.
>
> Note that Linux does not appear to use this field at all, and is
> unaffected by this patch.
>
> Without this patch, QNX will think that the NIC is still processing its
> transaction descriptors, and won't send any more data over the network.
>
> For reference:
>
> On page 1192 of the I.MX 6DQ reference manual revision (Rev. 5, 06/2018),
> which can be found at https://www.nxp.com/products/processors-and-microcontrollers/arm-based-processors-and-mcus/i.mx-applications-processors/i.mx-6-processors/i.mx-6quad-processors-high-performance-3d-graphics-hd-video-arm-cortex-a9-core:i.MX6Q?&tab=Documentation_Tab&linkline=Application-Note
>
> the 'BDU' field is described as follows for the 'Enhanced transmit
> buffer descriptor':
>
> 'Last buffer descriptor update done. Indicates that the last BD data has been updated by
> uDMA. This field is written by the user (=0) and uDMA (=1).'
>
> The same description is used for the receive buffer descriptor.
>
> Signed-off-by: Aaron Hill <aa1ronham@gmail.com>
> ---



Hi; thanks for this patch. The data sheet's description of the
buffer descriptors was a bit confusing to me (since it describes
what we have as a "uint32_t last_buffer" as two separate 16 bit
fields) but I think this is correct given how we define ENET_BD_BDU.

I've applied it to target-arm.next ready to go in once the
4.1 release ships and we reopen trunk for new development.

thanks
-- PMM