新增及修改下列檔案:
pcireg.h | PCI相關參數標頭檔,引用自NetBSD,源自MIT OSE LAB |
pci.c | 移植Lab6 kern/pci.c |
net_e100.h | 參考Lab6相關實作資料 |
net_e100.c | 參考Lab6相關實作資料 |
qemu -fda "../bos.img" -net user -net nic,model=i82559er |
啟用e100
其中pci.c,如何啟用e100 82559er 簡略原始碼如下:
pci_func_enable(pci_pdata_t f) { pci_conf_write(f, PCI_COMMAND_STATUS_REG, PCI_COMMAND_IO_ENABLE | PCI_COMMAND_MEM_ENABLE | PCI_COMMAND_MASTER_ENABLE); for (bar = PCI_MAPREG_START; bar < PCI_MAPREG_END; bar += bar_width) { uint32_t oldv = pci_conf_read(f, bar); bar_width = 4; pci_conf_write(f, bar, 0xffffffff); uint32_t rv = pci_conf_read(f, bar); if (rv == 0) continue; int regnum = PCI_MAPREG_NUM(bar); if (PCI_MAPREG_TYPE(rv) == PCI_MAPREG_TYPE_MEM) { if (PCI_MAPREG_MEM_TYPE(rv) == PCI_MAPREG_MEM_TYPE_64BIT) bar_width = 8; size = PCI_MAPREG_MEM_SIZE(rv); base = PCI_MAPREG_MEM_ADDR(oldv); } else { size = PCI_MAPREG_IO_SIZE(rv); base = PCI_MAPREG_IO_ADDR(oldv); } pci_conf_write(f, bar, oldv); f->addr_base[regnum] = base; f->addr_size[regnum] = size; } |
net_e100.c
啟用後,這時便用使用到 io region 1: 0xc040,長度為64位元組,參考Intel 82559,來進行下列操作。
需要將e100 做軟體重置(可參e100_reset函式),因使用DMA Rings,
所以接著要掛上傳送的緩衝區Control Block List(CBL)及接收用的緩衝區Receive Frame Area(RFA),可參考cbl_init()及rfa_init()。
net 命令
在起動Bos v0.21後,輸入net 指令,可看到下列結果:
bos$ net PCI function 00:18.0 (8086:1209) enabled mem region 0: 4096 bytes at 0xf2020000 io region 1: 64 bytes at 0xc040 cbl avail = 9, wait = 1, slot = 0x420000, irq=11 rfa avail = 10, wait = 0, slot = 0x420050 |
結語
原使用e100設備序號,並不生效;後來研究OSE資料後,發現必須在qemu參數中設定,之後再使用設備序號1209來啟用e100(i82559er),如此才能正確執行在qemu環境。
MIT OSE Lab6十分具有挑戰性,筆者經幾天的努力才把這網路卡驅動部分實作完成;但大約只完成Lab6的三分之二,其餘部分,待9/6社群活動後,再來討論後面部分旳細節。本次程式碼可由此下載。
2 則留言:
太強大了, 謝謝你的資料。
很高興能對您有所幫助!有任何資訊也歡迎分享到社群論壇。
張貼留言