1. 程式人生 > >Intel 82599 ixgbe & ixgbevf CNA 卡驅動分析03——部分功能程式碼分析

Intel 82599 ixgbe & ixgbevf CNA 卡驅動分析03——部分功能程式碼分析

I/O Operations and Activities      使用SR-IOV 的根本原因就是使得虛擬機器中的一個驅動可以直接訪問PCI進行I/O操作,並能夠在虛擬機器之間共享裝置。Intel VF 驅動了解自己執行在一個虛擬化的環境中擁有優先的PCI資源。      可用的資源包括基本的接收和傳送乙太網包的能力,Intel VF 還提供了額外的硬體包括:      ·狀態資訊:           ·鏈路速度           ·鏈路狀態           ·複用模式      ·統計資料包括:           ·收到的包計數           ·傳送的包計數           ·收到的八位組計數           ·傳送的八位組計數           ·收到的多播包計數           ·功能級的復位(Function Level Reset)           ·VLAN 標號插入           ·校驗和插入 Actions taken via Mailbox system   - VF to PF
VF 暴露給VF驅動的PCI資源並不一定滿足所有PF 驅動的需求,比如VLAN 標識配置和多播地址配置。 在這種情況下,VF驅動利用信箱 系統來向PF驅動傳遞訊息,這樣來使得PF驅動進行需要的操作。 現在定義的可以使用信箱機制實現的行為包括: ·VF復位 ·配置VF MAC 地址 ·設定多播地址 ·設定VLAN過濾器 ·設定最大包長 ·信箱訊息的ID實在ixgbe_mbx.h中定義的,適用於ixgbe PF 驅動和 ixgbevf VF 驅動 Virtual Function 復位: 訊息ID:IXGBE_VF_RESET 驅動在執行了功能級的復位(Function Level Reset)後就會把這個訊息傳送給PF驅動。 一個例子:      檔案:ixgbe_vf.c      函式:ixgbe_reset_hw_vf
     msgbuf[0
] = IXGBE_VF_RESET; mbx->ops.write_posted(hw,msgbuf,1,0);
當PF驅動接收到訊息,就會進行回覆,併發送回MAC地址給VF。 Configuring a MAC Address 訊息ID: IXGBE_VF_SET_MAC_ADDR 當VF驅動想要定義自己的MAC地址時,就會發送該訊息(而不是使用當PF初始化時分配給VF的預設MAC地址)。 例項:      檔案:ixgbex_vf.c      函式:ixgbe_set_rar_vf
     msbuf[0] = IXGBE_VF_SET_MAC_ADDR;
     memcpy(msg_addr, addr,
6); ret_val = mbx->ops.write_posted(hw, msbug, 3);
Setting Multicast Address 訊息ID:IXGBE_VF_SET_MULTICAST 當VF驅動需要設定一個多播地址來過濾達到的包時就會發送該訊息。 例項:           檔案:ixgbe_vf.c           函式:ixgbe_update_mc_addr_list_vf 複製程式碼
          cnt = (mc_addr_count > 30) ? 30 : mc_addr_count;
          msgbuf[0] = IXGBE_VF_SET_MULTICAST;
          msgbuf[0] |= cnt << IXGBE_VT_MSGINFO_SHIFT;
          
          for( i = 0; i < cnt; i++)
          {
               vector = ixgbe_mta_vector(hw, next(hw, &mc_addr_list, &vmdq));
               hw_dbg(hw, "Hash value = 0x%03x\n",vector);
               vector_list[i] = (u16) vector;
          }
 
          mbx->ops.write_posted(hw, msgbuf, IXGBE_VFMAILBOX_SIZE, 0);
複製程式碼 Setting VLAN Filter 訊息ID:IXGBE_VF_VLAN VF驅動想要設定一個VLAN 標識來過濾到達的包就會發送該訊息 例項:      檔案:ixgbe_vf.c      函式:ixgbe_set_vfta_vf
     msgbuf[0] = IXGBE_VF_SET_VLAN;
     msgbuf[1] = vlan;
     
     msgbuf[0] |= vlan_on << IXGBE_VTMSGINFO_SHIFT;
     mbx-ops.write_posted(hw, msgbuf, 2, 0);
PF to VF Mailbox Messages Physical Function Driver      該驅動負責物理資源和針對VF配置的一些處理。      當驅動在探測發現裝置的時候,在驅動初始化執行的眾多工中,有一項就是將自己註冊為一個SR-IOV裝置。      檔案:ixgbe_main.c      函式:__devinit ixgbe_probe_vf      err = pci_enable_sriov(adapter->pdev, adapter->num_vfs);      這個函式呼叫將82599註冊為一個SR-IOV裝置,表明支援特定數量的VF。 Default Configuration      在驅動初始化階段進行了很多項預設配置。這些預設配置包括VF的個數,VF流量配置,VFMAC地址分配。 Assignment of Queue's to Pools      82599 PF 驅動 預設支援配置63個VF。每個池內有兩個佇列對與其相關,總共4個佇列      檔案:ixgbe_main.c      函式:ixgbe_up_complete 複製程式碼
     if ( adapter->flags & IXGBE_FLAG_SRIOV_ENABLED )
     {
          gpie &= ~IXGBE_GPIE_VTMODE_MASK;
          gpie |=  IXGBE_GPIE_VTMODE_64;
     }
 
     IXGBE_WRITE_REG(hw, IXGBE_GPID, gpie);
複製程式碼

     這段程式碼對PCIe 控制寄存(GCR_EXT-0x11050)器進行了配置,預設支援64個VF。      檔案:ixgbe_main.c      函式:ixgbe_up_complete
     if ( adapter->flags & IXGBE_FLGA_SRIOV_ENABLED)
     {
          gpie &= ~IXGBE_GPIE_VTMODE_MASK;
          gpie |= IXGBE_GPIE_VTMODE_64;
     }
     IXGBE_WRITE_REG(hw, IXGBE_GPIE,gpie);      該程式碼片段配置 VT_Mode (15:14)位元,目的是對中斷暫存器(GPIE-0x00898)進行配置.      

Enabling VF to VF Bridging  VF 到 VF 的橋接在函式ixgbe_configure_rx() 函式中實現,該函式位於ixgbe_main.c 該函式使能了PF DMA 傳輸交換控制暫存器(PFDTXGSWC)的迴環使能位(LBE) 檔案:ixgbe_main.c 函式:ixgbe_configure_rx 複製程式碼
          #ifdef     CONFIG_PCI_IOV
                        if( adapter->flags & IXGBE_FLAG_SRIOV_ENABLED)
                         {
                              IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, IXGBE_PFDTXGSWC_VT_LBEN);
                              ixgbe_set_vmolr(hw, adapter->num_vfs);
                         }
          #endif
複製程式碼           該程式碼片段同時也使能了VF的流量,通過ixgbe_set_vmolr函式的呼叫。 Default Pool           當一些包不會送到某個VF則會送到預設池去處理。這個池資源是為PF準備的。預設池是不分配給VF的池。如果有32個池資源已經進行了配置,第33個池就會配配置為預設池。           檔案:ixgbe_main.c           函式:ixgbe_configure_rx 複製程式碼
                    if(adapter->num_vfs )
                    {
                         vt_reg_bits &= ~IXGBE_VT_CTL_POOL_MASK;
                         vt_reg_bits |= (adapter->num_vfs << IXGBE_VT_CTL_POOL_SHIFT);
                    }
 
                    u32     vt_reg;
                    u32     vt_reg_bits;
                    if ( hw->mac.type = ixgbe_mac_82599EB)
                    {
                         vt_reg = IXGBE_VT_CTL;
                         vt_reg_bits = IXGBE_VMD_CTL_VMDQ_EN | IXGBE_VT_CTL_REPLEN
                         
                         if ( adapter->num_vfs )
                         {
                              vt_reg_bits &= ~IXGBE_VT_CTL_POOL_MASK; 
                              vt_reg_bits |= (adapter->num_vfs << IXGBE_VT_CTL_POOL_SHIFT); 

                          }
                      } 
                      else {
                           vt_reg = IXGBE_VMD_CTL;
                           vt_reg_bits = IXGBE_VMD_CTL_VMDQ_EN;
                     }
                     vmdctl = IXGBE_READ_REG(hw, vt_reg);
                     IXGBE_WRITE_REG(hw, vt_reg, vmdctl | vt_reg_bits); 
複製程式碼                      驅動操作PFVTCTL(0x051B0)暫存器來配置預設池。主要操作DEF_PF 位(12:7)

Replication Enable Broadcast Accept Mode Accept Packet Matching PFUTA Table      這裡允許VF接收一個域PF 單波表(PFUTA 0x0F400)中某個單波地址入口匹配的包。      檔案:ixgbe_sriov.c      函式:ixgbe_set_vmolr
               u32 vmolr = IXGBE_READ_REG(hw, IXGBE_VMOLR(vf));
               vmolr |= (IXGBE_VMOLR_AUPE | IXGBE_VMOLR_ROMPE | IXGBE_VMOLR_ROPE |      
                              IXGBE_VMOLR_BAM);
               IXGBE_WRITE_REG(hw, IXGBE_VMOLR(vf), vmolr);
          驅動操作PF VM L2 控制暫存器(PFVML2FLT 0x0F000 + 4 *n [n=0..63] )的ROPE域(第26位元)使能作者禁止VF 接收賴在PFUTA表的包。 Accept Packets Matching MTA Table      該功能允許VF接收在多播表陣列(UTA 0xA000)中匹配多播地址入口的包。      預設是接收。      檔案:ixgbe_sriov.c      函式:ixgbe_set_vmolr
               u32 vmolr = IXGBE_READ_REG(hw, IXGBE_VMOLR(vf));
               vmolr |= (IXGBE_VMOLR_AUPE | IXGBE_VMOLR_ROMPE |
                              IXGBE_VMOLR_ROPE | IXGBE_VMOLR_BAM);
               IXGBE_WRITE_REG(hw, IXGBE_VMOLR(vf), vmolr);
     驅動操作 PF VM L2 控制暫存器(PFVML2FLT 0x0F000 + 4 *n [n = 0..63]的ROMPE域(第25bit)註冊使能或者禁止接收來自MTA 表的包。

Accept Untagged Packets Enable      這種方式允許VF接收一個MAC地址匹配但是VLAN 標識不一定要匹配的包。      預設情況下,未加標識的包的接收功能已經使能。      檔案:ixgbe_sriov.c      函式:ixgbe_set_vmolr
          u32 vmolr = IXGBE_READ_REG(hw, IXGBE_VMOLR(vf));
          vmolr |= ( IXGBE_VMOLR_AUPE | IXGBE_VMOLR_ROMPE | 
                          IXGBE_VMOLR_ROPE | IXGBE_VMOLR_BAM);
          IXGBE_WRTIE_REG(hw, IXGBE_VMOLR(vf),vmolr);
     驅動操作PF VM L2 控制暫存器(PFVML2FLT 0x0F000 + 4*n [n=0..63])註冊使能或禁止VF接收未加標識的包      

Strip VLAN Tag for Incoming Packets 這允許一個VF 剝去一個通過L2 過濾傳過來的包的VLAN 標識 預設情況下,這項功能是開啟的。      檔案:ixgbe_main.c      函式:ixgbe_vlan_rx_register 複製程式碼
               for( i = 0; i < adpater->num_rx_queues; i++)
               {
                    j = adpter->rx_ring[i]->reg_idx;
                    ctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_RXDCTL(j));
                    ctrl |= IXGBE_RXDCTL_VME;
                    IXGBE_WRITE_REG(&adapter->hw, IXGBE_RXDCTL(j), ctrl);
               }
複製程式碼     驅動操作接收描述符控制暫存器(RXDCTL[n] (0x01208 + 0x40*n, n= 0..63 and 0x0D028 + 0x40*(n-64)), n=64..127; RW)的VLAN 模式使能位(第30bit)註冊使能或禁止剝除到來包的VLAN 標識。

VF MAC 地址賦值 PF 驅動使用random_ether_add()函式(由核心提供【哪個核心,作業系統還是Hypervisor?】)動態的給每一個VF賦予一個MAC地址。下面的程式碼片段是一個展示示例:           檔案:ixgbe_sriov.c           函式:ixgbe_vf_configuration
               random_ether_addr(vf_mac_addr);
               memcpy( adapter->vfinfo[vfn].vf_mac_addresses, vf_mac_addr,6);
     __devinit ixgbe_probe() 例程為每一個建立的VF呼叫ixgbe_vf_configuration() 一次。VF獲得MAC地址當進行功能級的復位時,VF通過信箱傳送IXGBE_VF_RESET訊息到PF。PF發回VF  MAC地址作為回覆。      此外,VF驅動亦可以指定自己的MAC地址使用IXGBE_VF_SET_MAC訊息。

相關推薦

Intel 82599 ixgbe & ixgbevf CNA 驅動分析03——部分功能程式碼分析

I/O Operations and Activities      使用SR-IOV 的根本原因就是使得虛擬機器中的一個驅動可以直接訪問PCI進行I/O操作,並能夠在虛擬機器之間共享裝置。Intel VF 驅動了解自己執行在一個虛擬化的環境中擁有優先的PCI資源。      可用的資源包括基本的接收和

Jetson tk1 安裝 Intel 7260ac 無線網絡驅動

首先,利用Jetpack將Jetson TK1升級到最新的L4T (version 21.3 +) 如果工作環境能提供有線網路,請將網線插到開發板,在開發板L4T的terminal輸入以下指令來下載並安裝驅動: sudo apt-get install git git clon

ixgbe網絡驅動(一)

註冊/登出網絡卡驅動 通過ixgbe_init_module() -> pci_register_driver()註冊ixgbe_driver 通過ixgbe_exit_module() -> pci_unregister_driver()登出i

驅動描述符助手功能淺析

讀取 color script 是把 efi 鏈表 pad 流程 地址 前言網卡驅動裏,CPU和MAC控制器都需要對DMA描述符空間進行讀取或者寫入。DMA描述符空間又會采用到CACHE和零拷貝技術,以往都是驅動自己去申請、關聯內存和刷新(flush和invalidate)

比特幣程式碼分析5 挖礦程式碼分析

本文描述礦工處理執行緒,通過本文學習,可以瞭解礦工挖礦的大致流程。主要包含挖礦費用交易的產生、當前交易池的打包處理,工作量證明等相關內容。流程圖(參考網路)如下所示:。 礦工處理函式1.void ThreadBitcoinMiner(void* parg)2.{ vfThreadRunning[3]

比特幣程式碼分析4 挖礦程式碼分析

本文描述礦工處理執行緒,通過本文學習,可以瞭解礦工挖礦的大致流程。主要包含挖礦費用交易的產生、當前交易池的打包處理,工作量證明等相關內容。流程圖(參考網路)如下所示:。 礦工處理函式1.void ThreadBitcoinMiner(void* parg)2.{ vfThreadRunning[3]

easyrecyclerview 重新整理載入功能程式碼分析(填坑之旅)

想選一個重新整理載入 又可以新增各種header 的列表控制元件,挑來挑去也就easyrecyclerview 最好用了, 可是重新整理載入 卻也有bug 1.重新整理的時候不能載入,載入的時候不能重新整理,解決重新整理的時候不能載入(我的方案

Android Architecture Components 部分原始碼程式碼分析

Android Architecture Components是Google釋出的一套新的架構元件,使App的架構更加健壯 依賴問題 allprojects { repositories { jcenter()

82599網絡驅動rx descriptor結構體分析

82599 datasheet: 7.1.6  節    大概位於314頁 對驅動的理解關鍵是對資料結構的理解。 The 82599 posts receive packets into data buffers in system memory. The follo

ubuntu 16.04 中把intel i915顯示驅動 更改為開源驅動/開源驅動改回intel驅動

檢視顯示卡驅動及其是否裝好 sudo lshw -c video 檢視顯示卡 lspci | grep VGA 安裝開源驅動 sudo apt-get install xserver-xorg-video-ati 把核心版本從4.4升級到4.5,4.5中似乎修復了

l(轉)Linux DM9000網絡驅動程式完全分析

[置頂] Linux DM9000網絡卡驅動程式完全分析 分類: Linux裝置驅動程式第三版學習筆記 2011-02-26 16:11 3513人閱讀 評論(34) 收藏 舉報 說明1:本文分析基於核心原始碼版本為linux-2

網絡驅動設計---架構分析加回環網絡驅動設計(網絡驅動上)

網絡卡驅動架構分析: 1. Linux網路子系統 2. 重要資料結構 總結一下三個重要的資料結構:     2.1. net_device     2.2. net_device_ops     2.3. sk_buff 3. 網絡卡驅動架構分析 CS8900.

網絡驅動之02驅動原始碼分析

0 環境 核心:經過xilinx基於zynq平臺定製的4.4.0系核心; 硬體:zynq晶片,其中mac contorller是使用Cadence的IP核,phy晶片使用提marvell的1116R晶

alsa音效驅動分析總結 (二)

alsa音效卡驅動分析總結  來自:http://blog.chinaunix.net/uid-20672559-id-3515392.html 現在我們開始分析ASOC: ASoC被分為Machine、Platform和Codec三大部分。其中的Machine驅動負責

linux筆記本安裝雙顯示驅動(intel+nvidia)

為了提高linux的顯示卡效能以及降低功耗,特有此文。 本人使用的系統是Fedora 20 Xfce x64,安裝驅動前先確保系統為最新版本。 最好安裝gcc、kernel-devel等軟體包,我不確定後面會不會作為依賴自動安裝。 --- 這個地址就是intel官方提供

ubuntu intel網絡驅動安裝(華碩B250F GAMING主機板 )

  1 [email protected]:~$ sudo sudo lspci -knn 2 00:00.0 Host bridge [0600]: Intel Corporation Device [8086:591f] (rev 05) 3 Subsystem:

桌上型電腦下GTX 1080 Ti+Intel® Core™ i7-8700K 安裝顯示驅動+cuda8.0

按照我的第一篇部落格安裝,到最後安裝完cuda後檢查./deviceQuery 解決辦法這種問題出現在cudn驅動的問題導致的,使得與顯示卡版本不匹配,這時候需要更新顯示卡驅動,重新解決一下。尋找合

【電子產品】ThinkPad S5 Intel(R) Dual Band Wireless-AC 3165 網絡驅動莫名其妙掛掉

裝置管理器 檢查網絡卡驅動和網路裝置 裝置管理器 – 網路裝置 Intel(R) Dual Band Wireless-AC 3165 出現黃色感嘆號。 該裝置無法啟動。 (程式碼 10)   Intel(R) Dual Band Wireless-AC 3165 屬性

Ubuntu14.04 安裝intel無線網絡驅動(含升級核心)

新安裝的14.04 沒有無線網絡卡驅動,我在win10下看到網絡卡型號是 intel的9560,   在intel官網看到9560驅動需要 kernel的 版本 是4.14+     https://www.intel.com/content/www

Linux驅動修煉之道-DM9000A網絡驅動框架原始碼分析

網路裝置的初始化: 通過模組的載入函式看出DM9000A的驅動是以平臺驅動的形式註冊進核心的,下邊是模組的載入函式: 1.static int __init   2.dm9000_init(void)   2.{   3.    printk(KERN_INFO "%