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>
diff --git a/drivers/ethernet/eth_smsc911x.c b/drivers/ethernet/eth_smsc911x.c
index f164d3c..75e8812 100644
--- a/drivers/ethernet/eth_smsc911x.c
+++ b/drivers/ethernet/eth_smsc911x.c
@@ -471,12 +471,11 @@
static int eth_tx(struct device *dev, struct net_pkt *pkt)
{
- int res;
u16_t total_len = net_pkt_get_len(pkt);
- u16_t sent;
static u8_t tx_buf[1514] __aligned(4);
u32_t txcmd_a, txcmd_b;
u32_t tx_stat;
+ int res;
txcmd_a = (1/*is_first_segment*/ << 13) | (1/*is_last_segment*/ << 12)
| total_len;
@@ -485,9 +484,11 @@
SMSC9220->TX_DATA_PORT = txcmd_a;
SMSC9220->TX_DATA_PORT = txcmd_b;
- sent = net_frag_linearize(tx_buf, sizeof(tx_buf), pkt,
- 0, sizeof(tx_buf));
- res = smsc_write_tx_fifo(tx_buf, sent, true);
+ if (net_pkt_read(pkt, tx_buf, total_len)) {
+ goto error;
+ }
+
+ res = smsc_write_tx_fifo(tx_buf, total_len, true);
if (res < 0) {
goto error;
}
@@ -531,71 +532,53 @@
}
}
-static void smsc_read_rx_fifo(u8_t *buf, u32_t len)
+static void smsc_read_rx_fifo(struct net_pkt *pkt, u32_t len)
{
- u32_t *buf32;
+ u32_t buf32;
- __ASSERT_NO_MSG(((uintptr_t)buf & 3) == 0);
__ASSERT_NO_MSG((len & 3) == 0 && len >= 4);
- buf32 = (u32_t *)buf;
len /= 4;
+
do {
- *buf32++ = SMSC9220->RX_DATA_PORT;
+ buf32 = SMSC9220->RX_DATA_PORT;
+
+ if (net_pkt_write_new(pkt, &buf32, sizeof(u32_t))) {
+ return -1;
+ }
} while (--len);
+
+ return 0;
}
-static struct net_pkt *smsc_recv_pkt(u32_t pkt_size)
+static struct net_pkt *smsc_recv_pkt(struct dehive *dev, u32_t pkt_size)
{
+ struct eth_context *context = dev->driver_data;
u32_t rem_size;
- struct net_buf *prev_buf;
- struct net_pkt *pkt = net_pkt_get_reserve_rx(K_NO_WAIT);
+ struct net_pkt *pkt;
- if (pkt == NULL) {
- LOG_ERR("get_rx == NULL");
+ /* Round up to next DWORD size */
+ rem_size = (pkt_size + 3) & ~3;
+ /* Don't account for FCS when filling net pkt */
+ rem_size -= 4;
+
+ pkt = net_pkt_rx_alloc_with_buffer(context->iface, rem_size,
+ AF_UNSPEC, 0, K_NO_WAIT);
+ if (!pkt) {
+ LOG_ERR("Failed to obtain RX buffer");
smsc_discard_pkt();
return NULL;
}
- prev_buf = NULL;
- /* Round up to next DWORD size */
- rem_size = (pkt_size + 3) & ~3;
- /* Don't account for FCS when filling net buffers */
- rem_size -= 4;
- do {
- u32_t frag_len;
- struct net_buf *pkt_buf = net_pkt_get_frag(pkt,
- K_NO_WAIT);
- if (pkt_buf == NULL) {
- LOG_ERR("Failed to get fragment buf");
- net_pkt_unref(pkt);
- smsc_discard_pkt();
- return NULL;
- }
-
- if (!prev_buf) {
- net_pkt_frag_insert(pkt, pkt_buf);
- } else {
- net_buf_frag_insert(prev_buf, pkt_buf);
- }
-
- frag_len = net_buf_tailroom(pkt_buf);
- if (frag_len > rem_size) {
- frag_len = rem_size;
- }
- smsc_read_rx_fifo(pkt_buf->data, frag_len);
- rem_size -= frag_len;
- net_buf_add(pkt_buf, frag_len);
- /*LOG_DBG("rem_size=%u", rem_size);*/
-
- prev_buf = pkt_buf;
- } while (rem_size != 0);
+ if (smsc_read_rx_fifo(pkt, rem_size) < 0) {
+ smsc_discard_pkt();
+ net_pkt_unref(pkt);
+ return NULL;
+ }
/* Discard FCS */
{
- u32_t dummy;
-
- smsc_read_rx_fifo((u8_t *)&dummy, 4);
+ u32_t dummy = SMSC9220->RX_DATA_PORT;
}
/* Adjust len of the last buf down for DWORD alignment */
@@ -647,7 +630,7 @@
pkt_size = BFIELD(rx_stat, RX_STAT_PORT_PKT_LEN);
LOG_DBG("pkt sz: %u", pkt_size);
- pkt = smsc_recv_pkt(pkt_size);
+ pkt = smsc_recv_pkt(dev, pkt_size);
LOG_DBG("out RX FIFO: pkts: %u, bytes: %u",
SMSC9220_BFIELD(RX_FIFO_INF, RXSUSED),