@@ -4,7 +4,7 @@ use crate::edes_old::*;
4
4
use crate :: sysctl;
5
5
use byteorder:: ByteOrder ;
6
6
use core:: convert:: TryInto ;
7
- use smoltcp:: phy:: { self , Checksum , ChecksumCapabilities , Device , DeviceCapabilities } ;
7
+ use smoltcp:: phy:: { self , ChecksumCapabilities , Device , DeviceCapabilities } ;
8
8
use smoltcp:: time:: Instant ;
9
9
use tm4c129x:: EMAC0 ;
10
10
@@ -240,6 +240,8 @@ fn emac_rx_enable(emac0: &EMAC0) {
240
240
241
241
pub struct EthernetDevice {
242
242
emac0 : EMAC0 ,
243
+ next_rx_descriptor : & ' static RDES ,
244
+ next_tx_descriptor : & ' static TDES ,
243
245
}
244
246
245
247
impl EthernetDevice {
@@ -333,6 +335,7 @@ impl EthernetDevice {
333
335
}
334
336
335
337
for i in 0 ..NUM_RX_DESCRIPTORS {
338
+ RX_DESCRIPTORS [ i] . rdes0 . write ( |w| w. own ( ) . set_bit ( ) ) ;
336
339
RX_DESCRIPTORS [ i] . rdes1 . write ( |w| {
337
340
w. bits (
338
341
DES1_RX_CTRL_CHAINED
@@ -349,7 +352,6 @@ impl EthernetDevice {
349
352
& RX_DESCRIPTORS [ i + 1 ]
350
353
} as * const _ as u32 )
351
354
} ) ;
352
- RX_DESCRIPTORS [ i] . rdes0 . write ( |w| w. own ( ) . set_bit ( ) ) ;
353
355
}
354
356
355
357
emac0
@@ -380,7 +382,11 @@ impl EthernetDevice {
380
382
emac_rx_enable ( & emac0) ;
381
383
nvic. enable ( tm4c129x:: Interrupt :: EMAC0 ) ;
382
384
383
- EthernetDevice { emac0 }
385
+ EthernetDevice {
386
+ emac0,
387
+ next_rx_descriptor : & RX_DESCRIPTORS [ 0 ] ,
388
+ next_tx_descriptor : & TX_DESCRIPTORS [ 0 ] ,
389
+ }
384
390
}
385
391
}
386
392
@@ -389,33 +395,33 @@ impl<'a> Device<'a> for EthernetDevice {
389
395
type TxToken = TxToken < ' a > ;
390
396
391
397
fn receive ( & ' a mut self ) -> Option < ( Self :: RxToken , Self :: TxToken ) > {
392
- let rx_descriptor = RX_DESCRIPTORS
393
- . iter ( )
394
- . find ( |rxd| rxd. rdes0 . read ( ) . own ( ) . bit_is_clear ( ) ) ?;
395
-
396
- let tx_descriptor = TX_DESCRIPTORS
397
- . iter ( )
398
- . find ( |txd| txd. tdes0 . read ( ) . own ( ) . bit_is_clear ( ) ) ?;
398
+ if self . next_rx_descriptor . rdes0 . read ( ) . own ( ) . bit_is_set ( ) {
399
+ return None ;
400
+ }
401
+ if self . next_tx_descriptor . tdes0 . read ( ) . own ( ) . bit_is_set ( ) {
402
+ return None ;
403
+ }
399
404
400
405
Some ( (
401
406
RxToken {
402
- descriptor : rx_descriptor,
407
+ emac0 : & self . emac0 ,
408
+ descriptor_pointer : & mut self . next_rx_descriptor ,
403
409
} ,
404
410
TxToken {
405
411
emac0 : & self . emac0 ,
406
- descriptor : tx_descriptor ,
412
+ descriptor_pointer : & mut self . next_tx_descriptor ,
407
413
} ,
408
414
) )
409
415
}
410
416
411
417
fn transmit ( & ' a mut self ) -> Option < Self :: TxToken > {
412
- let tx_descriptor = TX_DESCRIPTORS
413
- . iter ( )
414
- . find ( |txd| txd . tdes0 . read ( ) . own ( ) . bit_is_clear ( ) ) ? ;
418
+ if self . next_tx_descriptor . tdes0 . read ( ) . own ( ) . bit_is_set ( ) {
419
+ return None ;
420
+ }
415
421
416
422
Some ( TxToken {
417
423
emac0 : & self . emac0 ,
418
- descriptor : tx_descriptor ,
424
+ descriptor_pointer : & mut self . next_tx_descriptor ,
419
425
} )
420
426
}
421
427
@@ -438,69 +444,74 @@ impl<'a> Device<'a> for EthernetDevice {
438
444
}
439
445
440
446
pub struct RxToken < ' a > {
441
- descriptor : & ' a RDES ,
447
+ emac0 : & ' a EMAC0 ,
448
+ descriptor_pointer : & ' a mut & ' static RDES ,
442
449
}
443
450
444
451
impl < ' a > phy:: RxToken for RxToken < ' a > {
445
452
fn consume < R , F > ( self , _timestamp : Instant , f : F ) -> smoltcp:: Result < R >
446
453
where
447
454
F : FnOnce ( & [ u8 ] ) -> smoltcp:: Result < R > ,
448
455
{
456
+ let descriptor = * self . descriptor_pointer ;
457
+
449
458
// We own the receive descriptor so check to see if it contains a valid frame.
450
- if self . descriptor . rdes0 . read ( ) . bits ( ) & DES0_RX_STAT_ERR == DES0_RX_STAT_ERR {
451
- self . descriptor . rdes0 . write ( |w| w. own ( ) . set_bit ( ) ) ;
459
+ if descriptor. rdes0 . read ( ) . bits ( ) & DES0_RX_STAT_ERR == DES0_RX_STAT_ERR {
460
+ descriptor. rdes0 . write ( |w| w. own ( ) . set_bit ( ) ) ;
452
461
return Err ( smoltcp:: Error :: Checksum ) ;
453
462
}
454
463
455
464
// We have a valid frame. First check that the "last descriptor" flag is set. We
456
465
// sized the receive buffer such that it can always hold a valid frame so this
457
466
// flag should never be clear at this point but...
458
- if self . descriptor . rdes0 . read ( ) . bits ( ) & DES0_RX_STAT_LAST_DESC != DES0_RX_STAT_LAST_DESC {
459
- self . descriptor . rdes0 . write ( |w| w. own ( ) . set_bit ( ) ) ;
467
+ if descriptor. rdes0 . read ( ) . bits ( ) & DES0_RX_STAT_LAST_DESC != DES0_RX_STAT_LAST_DESC {
468
+ descriptor. rdes0 . write ( |w| w. own ( ) . set_bit ( ) ) ;
460
469
return Err ( smoltcp:: Error :: Truncated ) ;
461
470
}
462
471
463
- let len = ( ( self . descriptor . rdes0 . read ( ) . bits ( ) & DES0_RX_STAT_FRAME_LENGTH_M )
472
+ let len = ( ( descriptor. rdes0 . read ( ) . bits ( ) & DES0_RX_STAT_FRAME_LENGTH_M )
464
473
>> DES0_RX_STAT_FRAME_LENGTH_S ) as usize ;
465
474
assert ! ( len <= RX_BUFFER_SIZE ) ;
466
- let data = unsafe {
467
- core:: slice:: from_raw_parts ( self . descriptor . rdes2 . read ( ) . bits ( ) as * mut u8 , len)
468
- } ;
475
+ let data =
476
+ unsafe { core:: slice:: from_raw_parts ( descriptor. rdes2 . read ( ) . bits ( ) as * mut u8 , len) } ;
469
477
470
478
let result = f ( data) ;
471
- self . descriptor . rdes0 . write ( |w| w. own ( ) . set_bit ( ) ) ;
479
+
480
+ descriptor. rdes0 . write ( |w| w. own ( ) . set_bit ( ) ) ;
481
+ self . emac0 . rxpolld . write ( |w| w) ;
482
+ * self . descriptor_pointer = unsafe { & * ( descriptor. rdes3 . read ( ) . bits ( ) as * const _ ) } ;
472
483
result
473
484
}
474
485
}
475
486
476
487
pub struct TxToken < ' a > {
477
488
emac0 : & ' a EMAC0 ,
478
- descriptor : & ' a TDES ,
489
+ descriptor_pointer : & ' a mut & ' static TDES ,
479
490
}
480
491
481
492
impl < ' a > phy:: TxToken for TxToken < ' a > {
482
493
fn consume < R , F > ( self , _timestamp : Instant , len : usize , f : F ) -> smoltcp:: Result < R >
483
494
where
484
495
F : FnOnce ( & mut [ u8 ] ) -> smoltcp:: Result < R > ,
485
496
{
497
+ let descriptor = * self . descriptor_pointer ;
498
+
486
499
assert ! ( len <= TX_BUFFER_SIZE ) ;
500
+
487
501
let data = unsafe {
488
- core:: slice:: from_raw_parts_mut ( self . descriptor . tdes2 . read ( ) . bits ( ) as * mut u8 , len)
502
+ core:: slice:: from_raw_parts_mut ( descriptor. tdes2 . read ( ) . bits ( ) as * mut u8 , len)
489
503
} ;
490
504
let result = f ( data) ;
491
505
492
506
unsafe {
493
- self . descriptor
507
+ descriptor
494
508
. tdes1
495
509
. write ( |w| w. tbs1 ( ) . bits ( len. try_into ( ) . unwrap ( ) ) ) ;
496
510
}
497
- self . descriptor . tdes0 . modify ( |_, w| w. own ( ) . set_bit ( ) ) ;
498
511
499
- // Tell the DMA to reacquire the descriptor now that we've filled it in. This
500
- // call is benign if the transmitter hasn't stalled and checking the state takes
501
- // longer than just issuing a poll demand so we do this for all packets.
512
+ descriptor. tdes0 . modify ( |_, w| w. own ( ) . set_bit ( ) ) ;
502
513
self . emac0 . txpolld . write ( |w| w) ;
503
-
514
+ * self . descriptor_pointer = unsafe { & * ( descriptor . tdes3 . read ( ) . bits ( ) as * const _ ) } ;
504
515
result
505
516
}
506
517
}
0 commit comments