日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

A20 网卡驱动分析

發布時間:2023/12/10 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 A20 网卡驱动分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

網卡芯片為realteak 8201

1.? net_device結構體的分配和注冊

???? 1) "/drivers/net/ethernet/sun7i/sun7i_wemac.c"

???? wemac_probe()

???????????? ndev = alloc_etherdev(sizeof(struct wemac_board_info));?????分配

???????????? ret = register_netdev(ndev);???????????????????????????????????????????????????注冊

???? 2) alloc_etherdev定義在?"/include/linux/etherdevice.h"

????#define alloc_etherdev(sizeof_priv) alloc_etherdev_mq(sizeof_priv, 1)
???? #define alloc_etherdev_mq(sizeof_priv, count) alloc_etherdev_mqs(sizeof_priv, count, count)


????3) alloc_etherdev_mqs定義在 "/net/ethernet/eth.c"

???? struct net_device *alloc_etherdev_mqs(int sizeof_priv, unsigned int txqs,
?? ??? ??? ??? ?????? unsigned int rxqs)
???? {
?? ?????????? return alloc_netdev_mqs(sizeof_priv, "eth%d", ether_setup, txqs, rxqs);
???? }


2. 發包函數

???"/drivers/net/ethernet/sun7i/sun7i_wemac.c"

??? /*
?????? *? Hardware start transmission.
?????? *? Send a packet to media from the upper layer.
??? */
???? static int wemac_start_xmit(struct sk_buff *skb, struct net_device *dev)

???????????? 1) dev->stats.tx_bytes += skb->len;??????????????發包統計信息

???????????? 2)將skb數據寫入網卡

???????????? /* set TX len */
?? ??? ????? writel(skb->len, db->emac_vbase + EMAC_TX_PL0_REG);
?? ??? ????? /* start translate from fifo to phy */
?? ??? ???? writel(readl(db->emac_vbase + EMAC_TX_CTL0_REG)
?? ??? ??? ??? ?| 1, db->emac_vbase + EMAC_TX_CTL0_REG);
?? ??? ????? dev->trans_start = jiffies;?? ?/* save the time stamp */

???????????? 3) 釋放skb

???????????? dev_kfree_skb(skb); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 釋放skb

???????????? 4) netif_stop_queue(dev);?????????????????????????停止隊列,數據發送完后由中斷處理程序來喚醒隊列

3. 中斷處理程序

??? static irqreturn_t wemac_interrupt(int irq, void *dev_id)

???? 1)? wemac_tx_done(dev, db, int_status)

????????? 當數據發送完后,產生中斷,此函數調用,然后調用netif_wake_queue(dev)來喚醒隊列

????2)? wemac_rx(dev)

????????? 接收數據包,最終調用netif_rx接收skb

4. MAC地址設置

?? "/drivers/net/ethernet/sun7i/sun7i_wemac.c"

?? static int wemac_set_mac_address(struct net_device *dev, void *p)

總結

以上是生活随笔為你收集整理的A20 网卡驱动分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。