@@ -471,12 +471,11 @@ static int smsc_write_tx_fifo(const u8_t *buf, u32_t len, bool is_last)
471471
472472static int eth_tx (struct device * dev , struct net_pkt * pkt )
473473{
474- int res ;
475474 u16_t total_len = net_pkt_get_len (pkt );
476- u16_t sent ;
477475 static u8_t tx_buf [1514 ] __aligned (4 );
478476 u32_t txcmd_a , txcmd_b ;
479477 u32_t tx_stat ;
478+ int res ;
480479
481480 txcmd_a = (1 /*is_first_segment*/ << 13 ) | (1 /*is_last_segment*/ << 12 )
482481 | total_len ;
@@ -485,9 +484,11 @@ static int eth_tx(struct device *dev, struct net_pkt *pkt)
485484 SMSC9220 -> TX_DATA_PORT = txcmd_a ;
486485 SMSC9220 -> TX_DATA_PORT = txcmd_b ;
487486
488- sent = net_frag_linearize (tx_buf , sizeof (tx_buf ), pkt ,
489- 0 , sizeof (tx_buf ));
490- res = smsc_write_tx_fifo (tx_buf , sent , true);
487+ if (net_pkt_read (pkt , tx_buf , total_len )) {
488+ goto error ;
489+ }
490+
491+ res = smsc_write_tx_fifo (tx_buf , total_len , true);
491492 if (res < 0 ) {
492493 goto error ;
493494 }
@@ -531,71 +532,53 @@ static inline void smsc_wait_discard_pkt(void)
531532 }
532533}
533534
534- static void smsc_read_rx_fifo (u8_t * buf , u32_t len )
535+ static void smsc_read_rx_fifo (struct net_pkt * pkt , u32_t len )
535536{
536- u32_t * buf32 ;
537+ u32_t buf32 ;
537538
538- __ASSERT_NO_MSG (((uintptr_t )buf & 3 ) == 0 );
539539 __ASSERT_NO_MSG ((len & 3 ) == 0 && len >= 4 );
540540
541- buf32 = (u32_t * )buf ;
542541 len /= 4 ;
542+
543543 do {
544- * buf32 ++ = SMSC9220 -> RX_DATA_PORT ;
544+ buf32 = SMSC9220 -> RX_DATA_PORT ;
545+
546+ if (net_pkt_write_new (pkt , & buf32 , sizeof (u32_t ))) {
547+ return -1 ;
548+ }
545549 } while (-- len );
550+
551+ return 0 ;
546552}
547553
548- static struct net_pkt * smsc_recv_pkt (u32_t pkt_size )
554+ static struct net_pkt * smsc_recv_pkt (struct dehive * dev , u32_t pkt_size )
549555{
556+ struct eth_context * context = dev -> driver_data ;
550557 u32_t rem_size ;
551- struct net_buf * prev_buf ;
552- struct net_pkt * pkt = net_pkt_get_reserve_rx (K_NO_WAIT );
558+ struct net_pkt * pkt ;
553559
554- if (pkt == NULL ) {
555- LOG_ERR ("get_rx == NULL" );
556- smsc_discard_pkt ();
557- return NULL ;
558- }
559-
560- prev_buf = NULL ;
561560 /* Round up to next DWORD size */
562561 rem_size = (pkt_size + 3 ) & ~3 ;
563- /* Don't account for FCS when filling net buffers */
562+ /* Don't account for FCS when filling net pkt */
564563 rem_size -= 4 ;
565- do {
566- u32_t frag_len ;
567- struct net_buf * pkt_buf = net_pkt_get_frag (pkt ,
568- K_NO_WAIT );
569- if (pkt_buf == NULL ) {
570- LOG_ERR ("Failed to get fragment buf" );
571- net_pkt_unref (pkt );
572- smsc_discard_pkt ();
573- return NULL ;
574- }
575-
576- if (!prev_buf ) {
577- net_pkt_frag_insert (pkt , pkt_buf );
578- } else {
579- net_buf_frag_insert (prev_buf , pkt_buf );
580- }
581564
582- frag_len = net_buf_tailroom (pkt_buf );
583- if (frag_len > rem_size ) {
584- frag_len = rem_size ;
585- }
586- smsc_read_rx_fifo (pkt_buf -> data , frag_len );
587- rem_size -= frag_len ;
588- net_buf_add (pkt_buf , frag_len );
589- /*LOG_DBG("rem_size=%u", rem_size);*/
565+ pkt = net_pkt_rx_alloc_with_buffer (context -> iface , rem_size ,
566+ AF_UNSPEC , 0 , K_NO_WAIT );
567+ if (!pkt ) {
568+ LOG_ERR ("Failed to obtain RX buffer" );
569+ smsc_discard_pkt ();
570+ return NULL ;
571+ }
590572
591- prev_buf = pkt_buf ;
592- } while (rem_size != 0 );
573+ if (smsc_read_rx_fifo (pkt , rem_size ) < 0 ) {
574+ smsc_discard_pkt ();
575+ net_pkt_unref (pkt );
576+ return NULL ;
577+ }
593578
594579 /* Discard FCS */
595580 {
596- u32_t dummy ;
597-
598- smsc_read_rx_fifo ((u8_t * )& dummy , 4 );
581+ u32_t dummy = SMSC9220 -> RX_DATA_PORT ;
599582 }
600583
601584 /* Adjust len of the last buf down for DWORD alignment */
@@ -647,7 +630,7 @@ static void eth_smsc911x_isr(struct device *dev)
647630 pkt_size = BFIELD (rx_stat , RX_STAT_PORT_PKT_LEN );
648631 LOG_DBG ("pkt sz: %u" , pkt_size );
649632
650- pkt = smsc_recv_pkt (pkt_size );
633+ pkt = smsc_recv_pkt (dev , pkt_size );
651634
652635 LOG_DBG ("out RX FIFO: pkts: %u, bytes: %u" ,
653636 SMSC9220_BFIELD (RX_FIFO_INF , RXSUSED ),
0 commit comments