Skip to content

Commit ebd2edb

Browse files
Tomasz Bursztykanashif
authored andcommitted
drivers/ethernet: Switch SMSC911x to new net_pkt API
It was still using old allocator and net_pkt function to read/write the data. Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
1 parent 1fab039 commit ebd2edb

File tree

1 file changed

+34
-51
lines changed

1 file changed

+34
-51
lines changed

drivers/ethernet/eth_smsc911x.c

Lines changed: 34 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -471,12 +471,11 @@ static int smsc_write_tx_fifo(const u8_t *buf, u32_t len, bool is_last)
471471

472472
static 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

Comments
 (0)