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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

网卡驱动:stmmac DMA发送流程

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

?

1. 設置DAM?buffer&descriptor,并啟動DMA發送

在stmmac_xmit設置buffe r& descriptor,如下片段:

if (likely(!is_jumbo)) {bool last_segment = (nfrags == 0);des = dma_map_single(priv->device, skb->data,nopaged_len, DMA_TO_DEVICE);if (dma_mapping_error(priv->device, des))goto dma_map_err;tx_q->tx_skbuff_dma[first_entry].buf = des; //在接收中斷中,用于dma_unmap_singleif (unlikely(priv->synopsys_id >= DWMAC_CORE_4_00))first->des0 = cpu_to_le32(des);elsefirst->des2 = cpu_to_le32(des);tx_q->tx_skbuff_dma[first_entry].len = nopaged_len;tx_q->tx_skbuff_dma[first_entry].last_segment = last_segment;if (unlikely((skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) &&priv->hwts_tx_en)) {/* declare that device is doing timestamping */skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;priv->hw->desc->enable_tx_timestamp(first);}/* Prepare the first descriptor setting the OWN bit too */priv->hw->desc->prepare_tx_desc(first, 1, nopaged_len,csum_insertion, priv->mode, 1,last_segment, skb->len);/* The own bit must be the latest setting done when prepare the* descriptor and then barrier is needed to make sure that* all is coherent before granting the DMA engine.*/dma_wmb();}if (priv->synopsys_id < DWMAC_CORE_4_00)priv->hw->dma->enable_dma_transmission(priv->ioaddr);else {tx_q->tx_tail_addr = tx_q->dma_tx_phy + (tx_q->cur_tx * sizeof(*desc));priv->hw->dma->set_tx_tail_ptr(priv->ioaddr, tx_q->tx_tail_addr,queue);}

?

1)進行DMA映射,得到映射地址des

des = dma_map_single(priv->device, skb->data, nopaged_len, DMA_TO_DEVICE);? ?

2)將映射后的DMA地址填充到DMA描述符的buffer1,即des0

?first->des0 = cpu_to_le32(des);

3)填充描述符其他信息,最重要的是設置OWN bit,讓DMA擁有該描述符

?priv->hw->desc->prepare_tx_desc

4)設置尾指針,啟動DMA發送

priv->hw->dma->set_tx_tail_ptr(priv->ioaddr, tx_q->tx_tail_addr,?queue);

5)接下來DMA會自動讀取descriptor,根據descriptor讀取buffer,然后將buffer數據送往queue。

?

在stmmac_xmit函數中還有對skb?分段的處理,過程與上述類似。

如果有skb frags,則從第二個descriptor開始,用skb_shinfo(skb)->frags[i]進行dma映射,再填充描述符的buffer。循環該過程直到所有的skb?frag被處理完畢。

如果skb沒有分段,則只會處理第一個descriptor,即上述步驟1-4。

?

注:kernel配置 CONFIG_BQL=y

?

?

2.?發送中斷處理:

2.1.?DMA發送完數據后產生中斷,調用 stmmac_interrupt服務程序

?

2.2. stmmac_interrupt?通過調用?stmmac_dma_interrupt?處理DMA相關中斷(包括發送和接收)。在stmmac_dma_interrupt中,通過NAPI機制觸發軟中斷,調用stmmac_poll處理相關事件。

?

2.3.?stmmac_poll調用stmmac_tx_clean回收資源,以及queue操作

1)通過dma_unmap_single解除dma映射

dma_unmap_single(priv->device, tx_q->tx_skbuff_dma[entry].buf, tx_q->tx_skbuff_dma[entry].len, DMA_TO_DEVICE);

2)釋放skb

dev_consume_skb_any(skb);

3)清空descriptor:des2和des3,?將其賦值0

release_tx_desc()

4)設置queue的狀態?,如果queue是停止狀態(__QUEUE_STATE_STACK_XOFF?或?__QUEUE_STATE_DRV_XOFF被置位),但是現在已經滿足開啟條件,則喚醒queue。? ?

在stmmac_xmit發送時如果停止了queue,現在如果條件滿足,會重新恢復queue。

netdev_tx_completed_queue(netdev_get_tx_queue(priv->dev, queue),pkts_compl, bytes_compl);if (unlikely(netif_tx_queue_stopped(netdev_get_tx_queue(priv->dev,queue))) &&stmmac_tx_avail(priv, queue) > STMMAC_TX_THRESH) {netif_dbg(priv, tx_done, priv->dev,"%s: restart transmit\n", __func__);netif_tx_wake_queue(netdev_get_tx_queue(priv->dev, queue));}

在netdev_tx_completed_queue中,test_and_clear_bit(__QUEUE_STATE_STACK_XOFF, &dev_queue->state),如果test_and_clear_bit返回真,調用 netif_schedule_queue(q)重新開始調度queue

在netif_tx_wake_queue中,test_and_clear_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state),如果test_and_clear_bit返回真,調用 __netif_schedule(q)重新開始調度queue

?

?

?

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的网卡驱动:stmmac DMA发送流程的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 狠狠爱免费视频 | 免费看黄色片的网站 | 亚洲男女激情 | 国产视频精品久久 | 亚洲av毛片基地 | 粉嫩小泬无遮挡久久久久久 | 亚洲伦理在线视频 | 国产精品一区二区三区在线看 | 国产成人精品在线播放 | 日本在线 | 久久精品国产99国产精品 | 亚洲国产无线乱码在线观看 | 国产一区二区小视频 | 九九在线观看免费高清版 | 视频一区在线播放 | 一区二区三区高清不卡 | 成人午夜天 | 国产黄色小视频在线观看 | 精品人妻一区二区三区四区久久 | 香蕉依人 | jizzjizz中国精品麻豆 | 激情小视频在线观看 | 色中色av| 欧美日韩国产黄色 | 成人午夜剧场视频网站 | 999超碰 | 免费三级黄| 精品一区二区久久 | 视频久久精品 | 免费福利视频网站 | 日韩国产欧美一区二区三区 | 伊人婷婷综合 | 成人毛片100免费观看 | 亚洲成人黄色在线 | 国产黄色高清视频 | 蜜桃视频无码区在线观看 | 精品人妻天天爽夜夜爽视频 | 日本99热 | 三上悠亚亚洲一区 | 欧美 日韩 国产 成人 | 在线看成人| aaa黄色一级片 | 欧洲一区二区视频 | 国产高潮国产高潮久久久 | 久久免费看少妇高潮 | 越南黄色一级片 | 久久黄色小说 | 欧美大喷水吹潮合集在线观看 | 久久国语精品 | 国产乱码精品一区二区三区亚洲人 | 亲子乱子伦xxxx | 综合 欧美 亚洲日本 | 内射干少妇亚洲69xxx | 欧美精品1| 久久人妖| 国产亚洲欧美精品久久久www | 天堂在线观看中文字幕 | 日韩区一区二 | 天堂а√在线最新版中文在线 | 婷婷俺也去 | 天堂中文视频在线 | 国产精品乱码久久久 | 天天插天天操天天干 | 又黄又爽无遮挡 | 三级理伦| 久久久国产成人一区二区三区 | 国产免费叼嘿网站免费 | 国产日韩免费 | 久久久av免费 | 美女又爽又黄 | 色婷婷久久 | 日韩精品xxxx | 又粗又猛又爽又黄少妇视频网站 | 久久精品无码毛片 | avxx| 午夜影院福利社 | 久久久久久久伊人 | 超碰97自拍 | 舌奴调教日记 | 午夜成人亚洲理伦片在线观看 | 国产欧美在线一区 | 一区二区三区免费看视频 | 中国a级黄色片 | 黑人一区二区三区 | 欧美天堂 | 亚洲性色av | 久久精品亚洲精品国产欧美 | 国产视频精品一区二区三区 | 图片区视频区小说区 | 亚洲成人一区 | 夜色一区二区 | 国产一级片麻豆 | 一区二区三区小视频 | 成人网站在线进入爽爽爽 | 久久理论| 欧美日韩一级视频 | 性奶老妇 视频 | 日本一区久久 | 蜜桃视频日韩 |