@@ -39,8 +39,6 @@ use crate::ethernet::StationManagement;
39
39
// 6 DMAC, 6 SMAC, 4 q tag, 2 ethernet type II, 1500 ip MTU, 4 CRC, 2
40
40
// padding
41
41
const ETH_BUF_SIZE : usize = 1536 ;
42
- const ETH_NUM_TD : usize = 4 ;
43
- const ETH_NUM_RD : usize = 4 ;
44
42
45
43
/// Transmit and Receive Descriptor fields
46
44
#[ allow( dead_code) ]
@@ -95,22 +93,22 @@ impl TDes {
95
93
96
94
/// Store a ring of TDes and associated buffers
97
95
#[ repr( C , packed) ]
98
- struct TDesRing {
99
- td : [ TDes ; ETH_NUM_TD ] ,
100
- tbuf : [ [ u32 ; ETH_BUF_SIZE / 4 ] ; ETH_NUM_TD ] ,
96
+ struct TDesRing < const TD : usize > {
97
+ td : [ TDes ; TD ] ,
98
+ tbuf : [ [ u32 ; ETH_BUF_SIZE / 4 ] ; TD ] ,
101
99
tdidx : usize ,
102
100
}
103
101
104
- impl TDesRing {
102
+ impl < const TD : usize > TDesRing < TD > {
105
103
const fn new ( ) -> Self {
106
104
Self {
107
105
td : [ TDes {
108
106
tdes0 : 0 ,
109
107
tdes1 : 0 ,
110
108
tdes2 : 0 ,
111
109
tdes3 : 0 ,
112
- } ; ETH_NUM_TD ] ,
113
- tbuf : [ [ 0 ; ETH_BUF_SIZE / 4 ] ; ETH_NUM_TD ] ,
110
+ } ; TD ] ,
111
+ tbuf : [ [ 0 ; ETH_BUF_SIZE / 4 ] ; TD ] ,
114
112
tdidx : 0 ,
115
113
}
116
114
}
@@ -166,7 +164,7 @@ impl TDesRing {
166
164
cortex_m:: asm:: dsb ( ) ;
167
165
168
166
// Move the tail pointer (TPR) to the next descriptor
169
- let x = ( x + 1 ) % ETH_NUM_TD ;
167
+ let x = ( x + 1 ) % TD ;
170
168
unsafe {
171
169
let dma = & * stm32:: ETHERNET_DMA :: ptr ( ) ;
172
170
dma. dmactx_dtpr
@@ -241,22 +239,22 @@ impl RDes {
241
239
242
240
/// Store a ring of RDes and associated buffers
243
241
#[ repr( C , packed) ]
244
- struct RDesRing {
245
- rd : [ RDes ; ETH_NUM_RD ] ,
246
- rbuf : [ [ u32 ; ETH_BUF_SIZE / 4 ] ; ETH_NUM_RD ] ,
242
+ struct RDesRing < const RD : usize > {
243
+ rd : [ RDes ; RD ] ,
244
+ rbuf : [ [ u32 ; ETH_BUF_SIZE / 4 ] ; RD ] ,
247
245
rdidx : usize ,
248
246
}
249
247
250
- impl RDesRing {
248
+ impl < const RD : usize > RDesRing < RD > {
251
249
const fn new ( ) -> Self {
252
250
Self {
253
251
rd : [ RDes {
254
252
rdes0 : 0 ,
255
253
rdes1 : 0 ,
256
254
rdes2 : 0 ,
257
255
rdes3 : 0 ,
258
- } ; ETH_NUM_RD ] ,
259
- rbuf : [ [ 0 ; ETH_BUF_SIZE / 4 ] ; ETH_NUM_RD ] ,
256
+ } ; RD ] ,
257
+ rbuf : [ [ 0 ; ETH_BUF_SIZE / 4 ] ; RD ] ,
260
258
rdidx : 0 ,
261
259
}
262
260
}
@@ -325,7 +323,7 @@ impl RDesRing {
325
323
}
326
324
327
325
// Update active descriptor
328
- self . rdidx = ( x + 1 ) % ETH_NUM_RD ;
326
+ self . rdidx = ( x + 1 ) % RD ;
329
327
}
330
328
331
329
/// Access the buffer pointed to by the next RDes
@@ -347,12 +345,12 @@ impl RDesRing {
347
345
}
348
346
}
349
347
350
- pub struct DesRing {
351
- tx : TDesRing ,
352
- rx : RDesRing ,
348
+ pub struct DesRing < const TD : usize , const RD : usize > {
349
+ tx : TDesRing < TD > ,
350
+ rx : RDesRing < RD > ,
353
351
}
354
- impl DesRing {
355
- pub const fn new ( ) -> DesRing {
352
+ impl < const TD : usize , const RD : usize > DesRing < TD , RD > {
353
+ pub const fn new ( ) -> Self {
356
354
DesRing {
357
355
tx : TDesRing :: new ( ) ,
358
356
rx : RDesRing :: new ( ) ,
@@ -363,8 +361,8 @@ impl DesRing {
363
361
///
364
362
/// Ethernet DMA
365
363
///
366
- pub struct EthernetDMA < ' a > {
367
- ring : & ' a mut DesRing ,
364
+ pub struct EthernetDMA < ' a , const TD : usize , const RD : usize > {
365
+ ring : & ' a mut DesRing < TD , RD > ,
368
366
eth_dma : stm32:: ETHERNET_DMA ,
369
367
}
370
368
@@ -393,15 +391,15 @@ pub struct EthernetMAC {
393
391
/// # Safety
394
392
///
395
393
/// `EthernetDMA` shall not be moved as it is initialised here
396
- pub unsafe fn new_unchecked < ' a > (
394
+ pub unsafe fn new_unchecked < ' a , const TD : usize , const RD : usize > (
397
395
eth_mac : stm32:: ETHERNET_MAC ,
398
396
eth_mtl : stm32:: ETHERNET_MTL ,
399
397
eth_dma : stm32:: ETHERNET_DMA ,
400
- ring : & ' a mut DesRing ,
398
+ ring : & ' a mut DesRing < TD , RD > ,
401
399
mac_addr : EthernetAddress ,
402
400
prec : rec:: Eth1Mac ,
403
401
clocks : & CoreClocks ,
404
- ) -> ( EthernetDMA < ' a > , EthernetMAC ) {
402
+ ) -> ( EthernetDMA < ' a , TD , RD > , EthernetMAC ) {
405
403
// RCC
406
404
{
407
405
let rcc = & * stm32:: RCC :: ptr ( ) ;
@@ -713,9 +711,9 @@ impl StationManagement for EthernetMAC {
713
711
}
714
712
715
713
/// Define TxToken type and implement consume method
716
- pub struct TxToken < ' a > ( & ' a mut TDesRing ) ;
714
+ pub struct TxToken < ' a , const TD : usize > ( & ' a mut TDesRing < TD > ) ;
717
715
718
- impl < ' a > phy:: TxToken for TxToken < ' a > {
716
+ impl < ' a , const TD : usize > phy:: TxToken for TxToken < ' a , TD > {
719
717
fn consume < R , F > (
720
718
self ,
721
719
_timestamp : Instant ,
@@ -734,9 +732,9 @@ impl<'a> phy::TxToken for TxToken<'a> {
734
732
}
735
733
736
734
/// Define RxToken type and implement consume method
737
- pub struct RxToken < ' a > ( & ' a mut RDesRing ) ;
735
+ pub struct RxToken < ' a , const RD : usize > ( & ' a mut RDesRing < RD > ) ;
738
736
739
- impl < ' a > phy:: RxToken for RxToken < ' a > {
737
+ impl < ' a , const RD : usize > phy:: RxToken for RxToken < ' a , RD > {
740
738
fn consume < R , F > ( self , _timestamp : Instant , f : F ) -> smoltcp:: Result < R >
741
739
where
742
740
F : FnOnce ( & mut [ u8 ] ) -> smoltcp:: Result < R > ,
@@ -748,9 +746,11 @@ impl<'a> phy::RxToken for RxToken<'a> {
748
746
}
749
747
750
748
/// Implement the smoltcp Device interface
751
- impl < ' a > phy:: Device < ' a > for EthernetDMA < ' _ > {
752
- type RxToken = RxToken < ' a > ;
753
- type TxToken = TxToken < ' a > ;
749
+ impl < ' a , const TD : usize , const RD : usize > phy:: Device < ' a >
750
+ for EthernetDMA < ' _ , TD , RD >
751
+ {
752
+ type RxToken = RxToken < ' a , RD > ;
753
+ type TxToken = TxToken < ' a , TD > ;
754
754
755
755
// Clippy false positive because DeviceCapabilities is non-exhaustive
756
756
#[ allow( clippy:: field_reassign_with_default) ]
@@ -759,11 +759,11 @@ impl<'a> phy::Device<'a> for EthernetDMA<'_> {
759
759
// ethernet frame type II (6 smac, 6 dmac, 2 ethertype),
760
760
// sans CRC (4), 1500 IP MTU
761
761
caps. max_transmission_unit = 1514 ;
762
- caps. max_burst_size = Some ( core:: cmp:: min ( ETH_NUM_TD , ETH_NUM_RD ) ) ;
762
+ caps. max_burst_size = Some ( core:: cmp:: min ( TD , RD ) ) ;
763
763
caps
764
764
}
765
765
766
- fn receive ( & mut self ) -> Option < ( RxToken , TxToken ) > {
766
+ fn receive ( & mut self ) -> Option < ( RxToken < RD > , TxToken < TD > ) > {
767
767
// Skip all queued packets with errors.
768
768
while self . ring . rx . available ( ) && !self . ring . rx . valid ( ) {
769
769
self . ring . rx . release ( )
@@ -776,7 +776,7 @@ impl<'a> phy::Device<'a> for EthernetDMA<'_> {
776
776
}
777
777
}
778
778
779
- fn transmit ( & mut self ) -> Option < TxToken > {
779
+ fn transmit ( & mut self ) -> Option < TxToken < TD > > {
780
780
if self . ring . tx . available ( ) {
781
781
Some ( TxToken ( & mut self . ring . tx ) )
782
782
} else {
@@ -785,7 +785,7 @@ impl<'a> phy::Device<'a> for EthernetDMA<'_> {
785
785
}
786
786
}
787
787
788
- impl EthernetDMA < ' _ > {
788
+ impl < const TD : usize , const RD : usize > EthernetDMA < ' _ , TD , RD > {
789
789
/// Return the number of packets dropped since this method was
790
790
/// last called
791
791
pub fn number_packets_dropped ( & self ) -> u32 {
0 commit comments