Re: [edk2-devel] [edk2][PATCH 1/1] BcmGenetDxe: don't consume RX buffer until it's actually copied
On Tue, Jul 14, 2020 at 14:51:46 +0100, Pete Batard wrote: > On 2020.07.14 14:36, Leif Lindholm wrote: > > On Mon, Jul 13, 2020 at 12:25:18 +0100, Pete Batard wrote: > > > One very minor formatting issue inline (that can be sorted during > > > integration): > > > > I would also like to prepend "Silicon/" to the subject line. > > Please do. It should have been there in the first place. Thanks. With those minor tweaks: Reviewed-by: Leif Lindholm Pushed as 2242b990248c. > Regards, > > /Pete > > > If I can do those two things: > > Reviewed-by: Leif Lindholm > > > > > On 2020.07.12 05:28, Andrei Warkentin wrote: > > > > This was originally a bit sloppy, and could hypothetically under heavy > > > > load result in a buffer being overwritten by hardware before the > > > > received > > > > buffer is copied. > > > > > > > > Signed-off-by: Andrei Warkentin > > > > --- > > > >Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h | 15 + > > > >Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c | 59 > > > > +++- > > > >Silicon/Broadcom/Drivers/Net/BcmGenetDxe/SimpleNetwork.c | 26 > > > > ++--- > > > >3 files changed, 77 insertions(+), 23 deletions(-) > > > > > > > > diff --git a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h > > > > b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h > > > > index 1a117b25..b39a1326 100644 > > > > --- a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h > > > > +++ b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h > > > > @@ -358,6 +358,16 @@ GenetTxIntr ( > > > > OUT VOID **TxBuf > > > > ); > > > > +UINT32 > > > > +GenetRxPending ( > > > > + IN GENET_PRIVATE_DATA *Genet > > > > + ); > > > > + > > > > +UINT32 > > > > +GenetTxPending ( > > > > + IN GENET_PRIVATE_DATA *Genet > > > > + ); > > > > + > > > >EFI_STATUS > > > >GenetRxIntr ( > > > > IN GENET_PRIVATE_DATA *Genet, > > > > @@ -365,4 +375,9 @@ GenetRxIntr ( > > > > OUT UINTN *FrameLength > > > > ); > > > > +VOID > > > > +GenetRxComplete ( > > > > + IN GENET_PRIVATE_DATA *Genet > > > > + ); > > > > + > > > >#endif /* GENET_UTIL_H__ */ > > > > diff --git a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c > > > > b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c > > > > index 1c4c8527..a0097b0d 100644 > > > > --- a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c > > > > +++ b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c > > > > @@ -661,6 +661,7 @@ GenetDmaMapRxDescriptor ( > > > >Genet->RxBufferMap[DescIndex].PhysAddress & 0x); > > > > GenetMmioWrite (Genet, GENET_RX_DESC_ADDRESS_HI (DescIndex), > > > >(Genet->RxBufferMap[DescIndex].PhysAddress >> 32) & 0x); > > > > + GenetMmioWrite (Genet, GENET_RX_DESC_STATUS (DescIndex), 0); > > > > return EFI_SUCCESS; > > > >} > > > > @@ -753,12 +754,9 @@ GenetTxIntr ( > > > > OUT VOID **TxBuf > > > > ) > > > >{ > > > > - UINT32 ConsIndex, Total; > > > > + UINT32 Total; > > > > - ConsIndex = GenetMmioRead (Genet, > > > > -GENET_TX_DMA_CONS_INDEX (GENET_DMA_DEFAULT_QUEUE)) & > > > > 0x; > > > > - > > > > - Total = (ConsIndex - Genet->TxConsIndex) & 0x; > > > > + Total = GenetTxPending (Genet); > > > > if (Genet->TxQueued > 0 && Total > 0) { > > > >DmaUnmap (Genet->TxBufferMap[Genet->TxNext]); > > > >*TxBuf = Genet->TxBuffer[Genet->TxNext]; > > > > @@ -770,6 +768,46 @@ GenetTxIntr ( > > > > } > > > >} > > > > +UINT32 > > > > +GenetRxPending ( > > > > + IN GENET_PRIVATE_DATA *Genet > > > > + ) > > > > +{ > > > > + UINT32 ProdIndex; > > > > + UINT32 ConsIndex; > > > > + > > > > + ConsIndex = GenetMmioRead (Genet, > > > > +GENET_RX_DMA_CONS_INDEX (GENET_DMA_DEFAULT_QUEUE)) & > > > > 0x; > > > > + ASSERT (ConsIndex == Genet->RxConsIndex); > > > > + > > > > + ProdIndex = GenetMmioRead (Genet, > > > > +GENET_RX_DMA_PROD_INDEX (GENET_DMA_DEFAULT_QUEUE)) & > > > > 0x; > > > > + return (ProdIndex - Genet->RxConsIndex) & 0x; > > > > +} > > > > + > > > > +UINT32 > > > > +GenetTxPending ( > > > > + IN GENET_PRIVATE_DATA *Genet > > > > + ) > > > > +{ > > > > + UINT32 ConsIndex; > > > > + > > > > + ConsIndex = GenetMmioRead (Genet, > > > > + GENET_TX_DMA_CONS_INDEX (GENET_DMA_DEFAULT_QUEUE)) & 0x; > > > > > > If we want to be pedantic about EDK2 formatting, this should be indented > > > to > > > start after the "Ge" of GenetMmioRead above, like the previous calls. > > > > > > > + > > > > + return (ConsIndex - Genet->TxConsIndex) & 0x; > > > > +} > > > > + > > > > +VOID > > > > +GenetRxComplete ( > > > > + IN GENET_PRIVATE_DATA *Genet > > > > + ) > > > > +{ > > > > + Genet->RxConsIndex = (Genet->RxConsIndex + 1) & 0x; > > > > + GenetMmioWrite (Genet, GENET_RX_DMA_CONS_INDEX > > > > (GENET_DMA_DEFAULT_QUEUE), > > > > +
Re: [edk2-devel] [edk2][PATCH 1/1] BcmGenetDxe: don't consume RX buffer until it's actually copied
On 2020.07.14 14:36, Leif Lindholm wrote: On Mon, Jul 13, 2020 at 12:25:18 +0100, Pete Batard wrote: One very minor formatting issue inline (that can be sorted during integration): I would also like to prepend "Silicon/" to the subject line. Please do. It should have been there in the first place. Regards, /Pete If I can do those two things: Reviewed-by: Leif Lindholm On 2020.07.12 05:28, Andrei Warkentin wrote: This was originally a bit sloppy, and could hypothetically under heavy load result in a buffer being overwritten by hardware before the received buffer is copied. Signed-off-by: Andrei Warkentin --- Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h | 15 + Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c | 59 +++- Silicon/Broadcom/Drivers/Net/BcmGenetDxe/SimpleNetwork.c | 26 ++--- 3 files changed, 77 insertions(+), 23 deletions(-) diff --git a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h index 1a117b25..b39a1326 100644 --- a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h +++ b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h @@ -358,6 +358,16 @@ GenetTxIntr ( OUT VOID **TxBuf ); +UINT32 +GenetRxPending ( + IN GENET_PRIVATE_DATA *Genet + ); + +UINT32 +GenetTxPending ( + IN GENET_PRIVATE_DATA *Genet + ); + EFI_STATUS GenetRxIntr ( IN GENET_PRIVATE_DATA *Genet, @@ -365,4 +375,9 @@ GenetRxIntr ( OUT UINTN *FrameLength ); +VOID +GenetRxComplete ( + IN GENET_PRIVATE_DATA *Genet + ); + #endif /* GENET_UTIL_H__ */ diff --git a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c index 1c4c8527..a0097b0d 100644 --- a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c +++ b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c @@ -661,6 +661,7 @@ GenetDmaMapRxDescriptor ( Genet->RxBufferMap[DescIndex].PhysAddress & 0x); GenetMmioWrite (Genet, GENET_RX_DESC_ADDRESS_HI (DescIndex), (Genet->RxBufferMap[DescIndex].PhysAddress >> 32) & 0x); + GenetMmioWrite (Genet, GENET_RX_DESC_STATUS (DescIndex), 0); return EFI_SUCCESS; } @@ -753,12 +754,9 @@ GenetTxIntr ( OUT VOID **TxBuf ) { - UINT32 ConsIndex, Total; + UINT32 Total; - ConsIndex = GenetMmioRead (Genet, -GENET_TX_DMA_CONS_INDEX (GENET_DMA_DEFAULT_QUEUE)) & 0x; - - Total = (ConsIndex - Genet->TxConsIndex) & 0x; + Total = GenetTxPending (Genet); if (Genet->TxQueued > 0 && Total > 0) { DmaUnmap (Genet->TxBufferMap[Genet->TxNext]); *TxBuf = Genet->TxBuffer[Genet->TxNext]; @@ -770,6 +768,46 @@ GenetTxIntr ( } } +UINT32 +GenetRxPending ( + IN GENET_PRIVATE_DATA *Genet + ) +{ + UINT32 ProdIndex; + UINT32 ConsIndex; + + ConsIndex = GenetMmioRead (Genet, +GENET_RX_DMA_CONS_INDEX (GENET_DMA_DEFAULT_QUEUE)) & 0x; + ASSERT (ConsIndex == Genet->RxConsIndex); + + ProdIndex = GenetMmioRead (Genet, +GENET_RX_DMA_PROD_INDEX (GENET_DMA_DEFAULT_QUEUE)) & 0x; + return (ProdIndex - Genet->RxConsIndex) & 0x; +} + +UINT32 +GenetTxPending ( + IN GENET_PRIVATE_DATA *Genet + ) +{ + UINT32 ConsIndex; + + ConsIndex = GenetMmioRead (Genet, + GENET_TX_DMA_CONS_INDEX (GENET_DMA_DEFAULT_QUEUE)) & 0x; If we want to be pedantic about EDK2 formatting, this should be indented to start after the "Ge" of GenetMmioRead above, like the previous calls. + + return (ConsIndex - Genet->TxConsIndex) & 0x; +} + +VOID +GenetRxComplete ( + IN GENET_PRIVATE_DATA *Genet + ) +{ + Genet->RxConsIndex = (Genet->RxConsIndex + 1) & 0x; + GenetMmioWrite (Genet, GENET_RX_DMA_CONS_INDEX (GENET_DMA_DEFAULT_QUEUE), + Genet->RxConsIndex); +} + /** Simulate an "RX interrupt", returning the index of a completed RX buffer and corresponding frame length. @@ -790,21 +828,14 @@ GenetRxIntr ( ) { EFI_STATUSStatus; - UINT32ProdIndex, Total; + UINT32Total; UINT32DescStatus; - ProdIndex = GenetMmioRead (Genet, -GENET_RX_DMA_PROD_INDEX (GENET_DMA_DEFAULT_QUEUE)) & 0x; - - Total = (ProdIndex - Genet->RxConsIndex) & 0x; + Total = GenetRxPending (Genet); if (Total > 0) { *DescIndex = Genet->RxConsIndex % GENET_DMA_DESC_COUNT; DescStatus = GenetMmioRead (Genet, GENET_RX_DESC_STATUS (*DescIndex)); *FrameLength = SHIFTOUT (DescStatus, GENET_RX_DESC_STATUS_BUFLEN); - -Genet->RxConsIndex = (Genet->RxConsIndex + 1) & 0x; -GenetMmioWrite (Genet, GENET_RX_DMA_CONS_INDEX (GENET_DMA_DEFAULT_QUEUE), - Genet->RxConsIndex); Status = EFI_SUCCESS; } else { Status = EFI_NOT_READY; diff --git a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/SimpleNetwork.c b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/SimpleNetwork.c
Re: [edk2-devel] [edk2][PATCH 1/1] BcmGenetDxe: don't consume RX buffer until it's actually copied
On Mon, Jul 13, 2020 at 12:25:18 +0100, Pete Batard wrote: > One very minor formatting issue inline (that can be sorted during > integration): I would also like to prepend "Silicon/" to the subject line. If I can do those two things: Reviewed-by: Leif Lindholm > On 2020.07.12 05:28, Andrei Warkentin wrote: > > This was originally a bit sloppy, and could hypothetically under heavy > > load result in a buffer being overwritten by hardware before the received > > buffer is copied. > > > > Signed-off-by: Andrei Warkentin > > --- > > Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h | 15 + > > Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c | 59 > > +++- > > Silicon/Broadcom/Drivers/Net/BcmGenetDxe/SimpleNetwork.c | 26 ++--- > > 3 files changed, 77 insertions(+), 23 deletions(-) > > > > diff --git a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h > > b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h > > index 1a117b25..b39a1326 100644 > > --- a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h > > +++ b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h > > @@ -358,6 +358,16 @@ GenetTxIntr ( > > OUT VOID **TxBuf > > ); > > +UINT32 > > +GenetRxPending ( > > + IN GENET_PRIVATE_DATA *Genet > > + ); > > + > > +UINT32 > > +GenetTxPending ( > > + IN GENET_PRIVATE_DATA *Genet > > + ); > > + > > EFI_STATUS > > GenetRxIntr ( > > IN GENET_PRIVATE_DATA *Genet, > > @@ -365,4 +375,9 @@ GenetRxIntr ( > > OUT UINTN *FrameLength > > ); > > +VOID > > +GenetRxComplete ( > > + IN GENET_PRIVATE_DATA *Genet > > + ); > > + > > #endif /* GENET_UTIL_H__ */ > > diff --git a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c > > b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c > > index 1c4c8527..a0097b0d 100644 > > --- a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c > > +++ b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c > > @@ -661,6 +661,7 @@ GenetDmaMapRxDescriptor ( > > Genet->RxBufferMap[DescIndex].PhysAddress & 0x); > > GenetMmioWrite (Genet, GENET_RX_DESC_ADDRESS_HI (DescIndex), > > (Genet->RxBufferMap[DescIndex].PhysAddress >> 32) & 0x); > > + GenetMmioWrite (Genet, GENET_RX_DESC_STATUS (DescIndex), 0); > > return EFI_SUCCESS; > > } > > @@ -753,12 +754,9 @@ GenetTxIntr ( > > OUT VOID **TxBuf > > ) > > { > > - UINT32 ConsIndex, Total; > > + UINT32 Total; > > - ConsIndex = GenetMmioRead (Genet, > > -GENET_TX_DMA_CONS_INDEX (GENET_DMA_DEFAULT_QUEUE)) & > > 0x; > > - > > - Total = (ConsIndex - Genet->TxConsIndex) & 0x; > > + Total = GenetTxPending (Genet); > > if (Genet->TxQueued > 0 && Total > 0) { > > DmaUnmap (Genet->TxBufferMap[Genet->TxNext]); > > *TxBuf = Genet->TxBuffer[Genet->TxNext]; > > @@ -770,6 +768,46 @@ GenetTxIntr ( > > } > > } > > +UINT32 > > +GenetRxPending ( > > + IN GENET_PRIVATE_DATA *Genet > > + ) > > +{ > > + UINT32 ProdIndex; > > + UINT32 ConsIndex; > > + > > + ConsIndex = GenetMmioRead (Genet, > > +GENET_RX_DMA_CONS_INDEX (GENET_DMA_DEFAULT_QUEUE)) & > > 0x; > > + ASSERT (ConsIndex == Genet->RxConsIndex); > > + > > + ProdIndex = GenetMmioRead (Genet, > > +GENET_RX_DMA_PROD_INDEX (GENET_DMA_DEFAULT_QUEUE)) & > > 0x; > > + return (ProdIndex - Genet->RxConsIndex) & 0x; > > +} > > + > > +UINT32 > > +GenetTxPending ( > > + IN GENET_PRIVATE_DATA *Genet > > + ) > > +{ > > + UINT32 ConsIndex; > > + > > + ConsIndex = GenetMmioRead (Genet, > > + GENET_TX_DMA_CONS_INDEX (GENET_DMA_DEFAULT_QUEUE)) & 0x; > > If we want to be pedantic about EDK2 formatting, this should be indented to > start after the "Ge" of GenetMmioRead above, like the previous calls. > > > + > > + return (ConsIndex - Genet->TxConsIndex) & 0x; > > +} > > + > > +VOID > > +GenetRxComplete ( > > + IN GENET_PRIVATE_DATA *Genet > > + ) > > +{ > > + Genet->RxConsIndex = (Genet->RxConsIndex + 1) & 0x; > > + GenetMmioWrite (Genet, GENET_RX_DMA_CONS_INDEX (GENET_DMA_DEFAULT_QUEUE), > > + Genet->RxConsIndex); > > +} > > + > > /** > > Simulate an "RX interrupt", returning the index of a completed RX > > buffer and > > corresponding frame length. > > @@ -790,21 +828,14 @@ GenetRxIntr ( > > ) > > { > > EFI_STATUSStatus; > > - UINT32ProdIndex, Total; > > + UINT32Total; > > UINT32DescStatus; > > - ProdIndex = GenetMmioRead (Genet, > > -GENET_RX_DMA_PROD_INDEX (GENET_DMA_DEFAULT_QUEUE)) & > > 0x; > > - > > - Total = (ProdIndex - Genet->RxConsIndex) & 0x; > > + Total = GenetRxPending (Genet); > > if (Total > 0) { > > *DescIndex = Genet->RxConsIndex % GENET_DMA_DESC_COUNT; > > DescStatus = GenetMmioRead (Genet, GENET_RX_DESC_STATUS (*DescIndex)); > > *FrameLength = SHIFTOUT (DescStatus,
Re: [edk2-devel] [edk2][PATCH 1/1] BcmGenetDxe: don't consume RX buffer until it's actually copied
On Mon, Jul 13, 2020 at 12:25:18 +0100, Pete Batard wrote: > One very minor formatting issue inline (that can be sorted during > integration): Will do, thanks for highlighting (and review). / Leif > On 2020.07.12 05:28, Andrei Warkentin wrote: > > This was originally a bit sloppy, and could hypothetically under heavy > > load result in a buffer being overwritten by hardware before the received > > buffer is copied. > > > > Signed-off-by: Andrei Warkentin > > --- > > Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h | 15 + > > Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c | 59 > > +++- > > Silicon/Broadcom/Drivers/Net/BcmGenetDxe/SimpleNetwork.c | 26 ++--- > > 3 files changed, 77 insertions(+), 23 deletions(-) > > > > diff --git a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h > > b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h > > index 1a117b25..b39a1326 100644 > > --- a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h > > +++ b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h > > @@ -358,6 +358,16 @@ GenetTxIntr ( > > OUT VOID **TxBuf > > ); > > +UINT32 > > +GenetRxPending ( > > + IN GENET_PRIVATE_DATA *Genet > > + ); > > + > > +UINT32 > > +GenetTxPending ( > > + IN GENET_PRIVATE_DATA *Genet > > + ); > > + > > EFI_STATUS > > GenetRxIntr ( > > IN GENET_PRIVATE_DATA *Genet, > > @@ -365,4 +375,9 @@ GenetRxIntr ( > > OUT UINTN *FrameLength > > ); > > +VOID > > +GenetRxComplete ( > > + IN GENET_PRIVATE_DATA *Genet > > + ); > > + > > #endif /* GENET_UTIL_H__ */ > > diff --git a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c > > b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c > > index 1c4c8527..a0097b0d 100644 > > --- a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c > > +++ b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c > > @@ -661,6 +661,7 @@ GenetDmaMapRxDescriptor ( > > Genet->RxBufferMap[DescIndex].PhysAddress & 0x); > > GenetMmioWrite (Genet, GENET_RX_DESC_ADDRESS_HI (DescIndex), > > (Genet->RxBufferMap[DescIndex].PhysAddress >> 32) & 0x); > > + GenetMmioWrite (Genet, GENET_RX_DESC_STATUS (DescIndex), 0); > > return EFI_SUCCESS; > > } > > @@ -753,12 +754,9 @@ GenetTxIntr ( > > OUT VOID **TxBuf > > ) > > { > > - UINT32 ConsIndex, Total; > > + UINT32 Total; > > - ConsIndex = GenetMmioRead (Genet, > > -GENET_TX_DMA_CONS_INDEX (GENET_DMA_DEFAULT_QUEUE)) & > > 0x; > > - > > - Total = (ConsIndex - Genet->TxConsIndex) & 0x; > > + Total = GenetTxPending (Genet); > > if (Genet->TxQueued > 0 && Total > 0) { > > DmaUnmap (Genet->TxBufferMap[Genet->TxNext]); > > *TxBuf = Genet->TxBuffer[Genet->TxNext]; > > @@ -770,6 +768,46 @@ GenetTxIntr ( > > } > > } > > +UINT32 > > +GenetRxPending ( > > + IN GENET_PRIVATE_DATA *Genet > > + ) > > +{ > > + UINT32 ProdIndex; > > + UINT32 ConsIndex; > > + > > + ConsIndex = GenetMmioRead (Genet, > > +GENET_RX_DMA_CONS_INDEX (GENET_DMA_DEFAULT_QUEUE)) & > > 0x; > > + ASSERT (ConsIndex == Genet->RxConsIndex); > > + > > + ProdIndex = GenetMmioRead (Genet, > > +GENET_RX_DMA_PROD_INDEX (GENET_DMA_DEFAULT_QUEUE)) & > > 0x; > > + return (ProdIndex - Genet->RxConsIndex) & 0x; > > +} > > + > > +UINT32 > > +GenetTxPending ( > > + IN GENET_PRIVATE_DATA *Genet > > + ) > > +{ > > + UINT32 ConsIndex; > > + > > + ConsIndex = GenetMmioRead (Genet, > > + GENET_TX_DMA_CONS_INDEX (GENET_DMA_DEFAULT_QUEUE)) & 0x; > > If we want to be pedantic about EDK2 formatting, this should be indented to > start after the "Ge" of GenetMmioRead above, like the previous calls. > > > + > > + return (ConsIndex - Genet->TxConsIndex) & 0x; > > +} > > + > > +VOID > > +GenetRxComplete ( > > + IN GENET_PRIVATE_DATA *Genet > > + ) > > +{ > > + Genet->RxConsIndex = (Genet->RxConsIndex + 1) & 0x; > > + GenetMmioWrite (Genet, GENET_RX_DMA_CONS_INDEX (GENET_DMA_DEFAULT_QUEUE), > > + Genet->RxConsIndex); > > +} > > + > > /** > > Simulate an "RX interrupt", returning the index of a completed RX > > buffer and > > corresponding frame length. > > @@ -790,21 +828,14 @@ GenetRxIntr ( > > ) > > { > > EFI_STATUSStatus; > > - UINT32ProdIndex, Total; > > + UINT32Total; > > UINT32DescStatus; > > - ProdIndex = GenetMmioRead (Genet, > > -GENET_RX_DMA_PROD_INDEX (GENET_DMA_DEFAULT_QUEUE)) & > > 0x; > > - > > - Total = (ProdIndex - Genet->RxConsIndex) & 0x; > > + Total = GenetRxPending (Genet); > > if (Total > 0) { > > *DescIndex = Genet->RxConsIndex % GENET_DMA_DESC_COUNT; > > DescStatus = GenetMmioRead (Genet, GENET_RX_DESC_STATUS (*DescIndex)); > > *FrameLength = SHIFTOUT (DescStatus, GENET_RX_DESC_STATUS_BUFLEN); > > - > > -Genet->RxConsIndex =
Re: [edk2-devel] [edk2][PATCH 1/1] BcmGenetDxe: don't consume RX buffer until it's actually copied
One very minor formatting issue inline (that can be sorted during integration): On 2020.07.12 05:28, Andrei Warkentin wrote: This was originally a bit sloppy, and could hypothetically under heavy load result in a buffer being overwritten by hardware before the received buffer is copied. Signed-off-by: Andrei Warkentin --- Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h | 15 + Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c | 59 +++- Silicon/Broadcom/Drivers/Net/BcmGenetDxe/SimpleNetwork.c | 26 ++--- 3 files changed, 77 insertions(+), 23 deletions(-) diff --git a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h index 1a117b25..b39a1326 100644 --- a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h +++ b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h @@ -358,6 +358,16 @@ GenetTxIntr ( OUT VOID **TxBuf ); +UINT32 +GenetRxPending ( + IN GENET_PRIVATE_DATA *Genet + ); + +UINT32 +GenetTxPending ( + IN GENET_PRIVATE_DATA *Genet + ); + EFI_STATUS GenetRxIntr ( IN GENET_PRIVATE_DATA *Genet, @@ -365,4 +375,9 @@ GenetRxIntr ( OUT UINTN *FrameLength ); +VOID +GenetRxComplete ( + IN GENET_PRIVATE_DATA *Genet + ); + #endif /* GENET_UTIL_H__ */ diff --git a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c index 1c4c8527..a0097b0d 100644 --- a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c +++ b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c @@ -661,6 +661,7 @@ GenetDmaMapRxDescriptor ( Genet->RxBufferMap[DescIndex].PhysAddress & 0x); GenetMmioWrite (Genet, GENET_RX_DESC_ADDRESS_HI (DescIndex), (Genet->RxBufferMap[DescIndex].PhysAddress >> 32) & 0x); + GenetMmioWrite (Genet, GENET_RX_DESC_STATUS (DescIndex), 0); return EFI_SUCCESS; } @@ -753,12 +754,9 @@ GenetTxIntr ( OUT VOID **TxBuf ) { - UINT32 ConsIndex, Total; + UINT32 Total; - ConsIndex = GenetMmioRead (Genet, -GENET_TX_DMA_CONS_INDEX (GENET_DMA_DEFAULT_QUEUE)) & 0x; - - Total = (ConsIndex - Genet->TxConsIndex) & 0x; + Total = GenetTxPending (Genet); if (Genet->TxQueued > 0 && Total > 0) { DmaUnmap (Genet->TxBufferMap[Genet->TxNext]); *TxBuf = Genet->TxBuffer[Genet->TxNext]; @@ -770,6 +768,46 @@ GenetTxIntr ( } } +UINT32 +GenetRxPending ( + IN GENET_PRIVATE_DATA *Genet + ) +{ + UINT32 ProdIndex; + UINT32 ConsIndex; + + ConsIndex = GenetMmioRead (Genet, +GENET_RX_DMA_CONS_INDEX (GENET_DMA_DEFAULT_QUEUE)) & 0x; + ASSERT (ConsIndex == Genet->RxConsIndex); + + ProdIndex = GenetMmioRead (Genet, +GENET_RX_DMA_PROD_INDEX (GENET_DMA_DEFAULT_QUEUE)) & 0x; + return (ProdIndex - Genet->RxConsIndex) & 0x; +} + +UINT32 +GenetTxPending ( + IN GENET_PRIVATE_DATA *Genet + ) +{ + UINT32 ConsIndex; + + ConsIndex = GenetMmioRead (Genet, + GENET_TX_DMA_CONS_INDEX (GENET_DMA_DEFAULT_QUEUE)) & 0x; If we want to be pedantic about EDK2 formatting, this should be indented to start after the "Ge" of GenetMmioRead above, like the previous calls. + + return (ConsIndex - Genet->TxConsIndex) & 0x; +} + +VOID +GenetRxComplete ( + IN GENET_PRIVATE_DATA *Genet + ) +{ + Genet->RxConsIndex = (Genet->RxConsIndex + 1) & 0x; + GenetMmioWrite (Genet, GENET_RX_DMA_CONS_INDEX (GENET_DMA_DEFAULT_QUEUE), + Genet->RxConsIndex); +} + /** Simulate an "RX interrupt", returning the index of a completed RX buffer and corresponding frame length. @@ -790,21 +828,14 @@ GenetRxIntr ( ) { EFI_STATUSStatus; - UINT32ProdIndex, Total; + UINT32Total; UINT32DescStatus; - ProdIndex = GenetMmioRead (Genet, -GENET_RX_DMA_PROD_INDEX (GENET_DMA_DEFAULT_QUEUE)) & 0x; - - Total = (ProdIndex - Genet->RxConsIndex) & 0x; + Total = GenetRxPending (Genet); if (Total > 0) { *DescIndex = Genet->RxConsIndex % GENET_DMA_DESC_COUNT; DescStatus = GenetMmioRead (Genet, GENET_RX_DESC_STATUS (*DescIndex)); *FrameLength = SHIFTOUT (DescStatus, GENET_RX_DESC_STATUS_BUFLEN); - -Genet->RxConsIndex = (Genet->RxConsIndex + 1) & 0x; -GenetMmioWrite (Genet, GENET_RX_DMA_CONS_INDEX (GENET_DMA_DEFAULT_QUEUE), - Genet->RxConsIndex); Status = EFI_SUCCESS; } else { Status = EFI_NOT_READY; diff --git a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/SimpleNetwork.c b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/SimpleNetwork.c index 371216ca..1bda18f1 100644 --- a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/SimpleNetwork.c +++ b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/SimpleNetwork.c @@ -502,9 +502,19 @@ GenetSimpleNetworkGetStatus ( Genet->SnpMode.MediaPresent = FALSE; } else { Genet->SnpMode.MediaPresent = TRUE; + } + +
[edk2-devel] [edk2][PATCH 1/1] BcmGenetDxe: don't consume RX buffer until it's actually copied
This was originally a bit sloppy, and could hypothetically under heavy load result in a buffer being overwritten by hardware before the received buffer is copied. Signed-off-by: Andrei Warkentin --- Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h | 15 + Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c | 59 +++- Silicon/Broadcom/Drivers/Net/BcmGenetDxe/SimpleNetwork.c | 26 ++--- 3 files changed, 77 insertions(+), 23 deletions(-) diff --git a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h index 1a117b25..b39a1326 100644 --- a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h +++ b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.h @@ -358,6 +358,16 @@ GenetTxIntr ( OUT VOID **TxBuf ); +UINT32 +GenetRxPending ( + IN GENET_PRIVATE_DATA *Genet + ); + +UINT32 +GenetTxPending ( + IN GENET_PRIVATE_DATA *Genet + ); + EFI_STATUS GenetRxIntr ( IN GENET_PRIVATE_DATA *Genet, @@ -365,4 +375,9 @@ GenetRxIntr ( OUT UINTN *FrameLength ); +VOID +GenetRxComplete ( + IN GENET_PRIVATE_DATA *Genet + ); + #endif /* GENET_UTIL_H__ */ diff --git a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c index 1c4c8527..a0097b0d 100644 --- a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c +++ b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.c @@ -661,6 +661,7 @@ GenetDmaMapRxDescriptor ( Genet->RxBufferMap[DescIndex].PhysAddress & 0x); GenetMmioWrite (Genet, GENET_RX_DESC_ADDRESS_HI (DescIndex), (Genet->RxBufferMap[DescIndex].PhysAddress >> 32) & 0x); + GenetMmioWrite (Genet, GENET_RX_DESC_STATUS (DescIndex), 0); return EFI_SUCCESS; } @@ -753,12 +754,9 @@ GenetTxIntr ( OUT VOID **TxBuf ) { - UINT32 ConsIndex, Total; + UINT32 Total; - ConsIndex = GenetMmioRead (Genet, -GENET_TX_DMA_CONS_INDEX (GENET_DMA_DEFAULT_QUEUE)) & 0x; - - Total = (ConsIndex - Genet->TxConsIndex) & 0x; + Total = GenetTxPending (Genet); if (Genet->TxQueued > 0 && Total > 0) { DmaUnmap (Genet->TxBufferMap[Genet->TxNext]); *TxBuf = Genet->TxBuffer[Genet->TxNext]; @@ -770,6 +768,46 @@ GenetTxIntr ( } } +UINT32 +GenetRxPending ( + IN GENET_PRIVATE_DATA *Genet + ) +{ + UINT32 ProdIndex; + UINT32 ConsIndex; + + ConsIndex = GenetMmioRead (Genet, +GENET_RX_DMA_CONS_INDEX (GENET_DMA_DEFAULT_QUEUE)) & 0x; + ASSERT (ConsIndex == Genet->RxConsIndex); + + ProdIndex = GenetMmioRead (Genet, +GENET_RX_DMA_PROD_INDEX (GENET_DMA_DEFAULT_QUEUE)) & 0x; + return (ProdIndex - Genet->RxConsIndex) & 0x; +} + +UINT32 +GenetTxPending ( + IN GENET_PRIVATE_DATA *Genet + ) +{ + UINT32 ConsIndex; + + ConsIndex = GenetMmioRead (Genet, + GENET_TX_DMA_CONS_INDEX (GENET_DMA_DEFAULT_QUEUE)) & 0x; + + return (ConsIndex - Genet->TxConsIndex) & 0x; +} + +VOID +GenetRxComplete ( + IN GENET_PRIVATE_DATA *Genet + ) +{ + Genet->RxConsIndex = (Genet->RxConsIndex + 1) & 0x; + GenetMmioWrite (Genet, GENET_RX_DMA_CONS_INDEX (GENET_DMA_DEFAULT_QUEUE), + Genet->RxConsIndex); +} + /** Simulate an "RX interrupt", returning the index of a completed RX buffer and corresponding frame length. @@ -790,21 +828,14 @@ GenetRxIntr ( ) { EFI_STATUSStatus; - UINT32ProdIndex, Total; + UINT32Total; UINT32DescStatus; - ProdIndex = GenetMmioRead (Genet, -GENET_RX_DMA_PROD_INDEX (GENET_DMA_DEFAULT_QUEUE)) & 0x; - - Total = (ProdIndex - Genet->RxConsIndex) & 0x; + Total = GenetRxPending (Genet); if (Total > 0) { *DescIndex = Genet->RxConsIndex % GENET_DMA_DESC_COUNT; DescStatus = GenetMmioRead (Genet, GENET_RX_DESC_STATUS (*DescIndex)); *FrameLength = SHIFTOUT (DescStatus, GENET_RX_DESC_STATUS_BUFLEN); - -Genet->RxConsIndex = (Genet->RxConsIndex + 1) & 0x; -GenetMmioWrite (Genet, GENET_RX_DMA_CONS_INDEX (GENET_DMA_DEFAULT_QUEUE), - Genet->RxConsIndex); Status = EFI_SUCCESS; } else { Status = EFI_NOT_READY; diff --git a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/SimpleNetwork.c b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/SimpleNetwork.c index 371216ca..1bda18f1 100644 --- a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/SimpleNetwork.c +++ b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/SimpleNetwork.c @@ -502,9 +502,19 @@ GenetSimpleNetworkGetStatus ( Genet->SnpMode.MediaPresent = FALSE; } else { Genet->SnpMode.MediaPresent = TRUE; + } + + if (TxBuf != NULL) { +GenetTxIntr (Genet, TxBuf); + } -if (TxBuf != NULL) { - GenetTxIntr (Genet, TxBuf); + if (InterruptStatus != NULL) { +*InterruptStatus = 0; +if (GenetRxPending (Genet) > 0) { + *InterruptStatus |= EFI_SIMPLE_NETWORK_RECEIVE_INTERRUPT; +} +if (GenetTxPending (Genet) > 0) {