stmmac_rx()
时间: 2023-09-06 17:08:50 浏览: 277
`stmmac_rx()` 是 stmmac 驱动中用于处理接收数据的主要函数。当 stmmac 网卡接收到数据包时,硬件会触发中断,中断处理程序会将接收到的数据包传递给 `stmmac_rx()` 函数进行处理。
`stmmac_rx()` 函数的主要作用是将接收到的数据包存储到 `rx_queue` 队列中,并将其标记为已接收。具体来说,`stmmac_rx()` 函数会首先从 `rx_desc_queue` 队列中取出一个可用的描述符,并将其与接收到的数据包进行关联。然后,该函数会将数据包存储到 `rx_queue` 队列中,并更新描述符的状态,标记为已接收。最后,该函数会通知硬件处理器描述符的状态,以便硬件重新使用该描述符进行接收。
以下是 `stmmac_rx()` 函数的伪代码实现:
```c
stmmac_rx(struct stmmac_priv *priv, int quota)
{
while (quota-- && !skb_queue_empty(&priv->rx_queue)) {
struct stmmac_rx_queue *rx_q = &priv->rx_queue;
struct stmmac_rx_buffer *buffer;
struct stmmac_rx_desc *desc;
struct sk_buff *skb;
buffer = stmmac_rx_pick_buffer(rx_q);
if (!buffer)
break;
desc = buffer->desc;
skb = buffer->skb;
/* store the skb in the rx_queue */
skb_queue_tail(&rx_q->skb_list, skb);
/* mark the descriptor as owned by software */
desc->des0 |= cpu_to_le32(RDES0_OWN);
/* notify hardware that the descriptor has been updated */
stmmac_rx_desc_update(desc, priv, DMA_RX_SIZE);
/* update buffer pointer */
buffer->skb = NULL;
}
}
```
在实现中,`stmmac_rx()` 函数通过循环处理 `rx_queue` 队列中的所有数据包,以避免丢失数据包。在每次循环中,该函数会从 `rx_queue` 队列中取出一个数据包,并将其存储到 `rx_desc_queue` 队列中。然后,该函数会将描述符标记为已接收,并通知硬件处理器描述符的状态。
需要注意的是,`stmmac_rx()` 函数并不是直接处理接收到的数据包,而是将数据包存储到队列中,由后续的处理函数进行处理。
阅读全文