This shows you the differences between two versions of the page.
so2:teme:tema6 [2018/05/19 13:22] daniel.baluta [e100 private data] |
so2:teme:tema6 [2019/05/22 21:08] (current) daniel.baluta [e100 - driver de rețea] |
||
---|---|---|---|
Line 1: | Line 1: | ||
===== e100 - driver de rețea ==== | ===== e100 - driver de rețea ==== | ||
- | * Termen de predare: **Miercuri, 23 Mai 2018, ora 23:00 ** \\ | + | * Termen de predare: <tema nu intra in lista oficiala de teme pentru 2019> |
===== Scopul temei ===== | ===== Scopul temei ===== | ||
Line 10: | Line 10: | ||
===== Enunț ===== | ===== Enunț ===== | ||
- | Să se scrie un driver pentru placa de rețea **Intel 82559ER** (device întâlnit şi sub numele de **e100** sau **eepro100**). Modulul va trebui să suporte device-urile de rețea configurate în maşina virtuală qemu. Specificațiile acestora le găsiți în următoarele documente: | + | Să se scrie un driver pentru placa de rețea **Intel 82559ER** (device întâlnit şi sub numele de **e100** sau **eepro100**). Modulul va trebui să suporte device-urile de rețea configurate în maşina virtuală qemu. Specificațiile se gasesc in documentul: |
- | * [[ http://application-notes.digchip.com/027/27-45688.pdf | Intel 8255x 10/100 Mbps Ethernet Controller Family Open Source Software Developer Manual ]] | + | |
- | * [[http://www.intel.com/content/www/us/en/ethernet-controllers/82559er-fast-ethernet-pci-datasheet.html | 82559ER Fast Ethernet PCI Controller Datasheet]] | + | |
- | Nu va trebui să ciți în întregime documentele de mai sus, ci doar secțiunile indicate în enunț. | + | * [[http://application-notes.digchip.com/027/27-45688.pdf| 82559ER Fast Ethernet PCI Controller Software Developer Manual]] |
+ | |||
+ | Nu va trebui să ciți în întregime documentul de mai sus, ci doar secțiunile indicate în enunț. | ||
+ | |||
+ | <note important>Puteți porni implementarea de la zero sau folosi scheletul de cod generat: | ||
+ | $ LABS=assignments/6-e100 make skels | ||
+ | </note> | ||
==== Precizări ==== | ==== Precizări ==== | ||
Line 41: | Line 45: | ||
Urmăriți comentariile marcate cu TODO 2: | Urmăriți comentariile marcate cu TODO 2: | ||
- | * inițializați device-ul PCI folosind funcția ''pci_device_enable'' (activeaza I/O și memoria și trezește device-ul dacă era suspendat) | + | * inițializați device-ul PCI folosind funcția ''pci_enable_device'' (activeaza I/O și memoria și trezește device-ul dacă era suspendat) |
* rezervați zonele de memorie si I/O pentru device-ul PCI folosind funcția pci_request_regions | * rezervați zonele de memorie si I/O pentru device-ul PCI folosind funcția pci_request_regions | ||
* device-ul e100 suporta urmatoarele zone (chapter 4.1.10) | * device-ul e100 suporta urmatoarele zone (chapter 4.1.10) | ||
Line 51: | Line 55: | ||
==== e100 private data ==== | ==== e100 private data ==== | ||
- | Structura ''e100_priv_data'' va contine informatii specifice fiecarui device de retea gestionat de driver. În primul rând va conține informații despre pci_dev și netdevice-ul curent, apoi informatii de stare, registre, unitatea de transmisie, unitatea de recepție, etc. Spațiul de memorie pentru ''e100_priv_data'' se va aloca în funcția ''alloc_etherdev'' urmăriți capitolul [[so2:teme:tema6#structura_net_device]]. | + | Structura ''e100_priv_data'' va contine informatii specifice fiecarui device de retea gestionat de driver. În primul rând va conține informații despre pci_dev și netdevice-ul curent, apoi informatii de stare, registre, unitatea de transmisie, unitatea de recepție, etc. Spațiul de memorie pentru ''e100_priv_data'' se va aloca în funcția ''alloc_etherdev'' urmăriți sectiunea [[so2:teme:tema6#structura_net_device]]. |
Line 59: | Line 63: | ||
Este reprezentarea din kernel a interfeței de rețea din user-space (''ixeth0'', ''ixeth1'', ș.a.m.d) | Este reprezentarea din kernel a interfeței de rețea din user-space (''ixeth0'', ''ixeth1'', ș.a.m.d) | ||
- | Urmăriți comentariile marcate cu TODO 3: | + | Urmăriți comentariile marcate cu TODO 4: |
* structura net_device va fi alocată şi înregistrată (în funcția ''probe'') atunci când se descoperă un device de rețea pe magistrala PCI | * structura net_device va fi alocată şi înregistrată (în funcția ''probe'') atunci când se descoperă un device de rețea pe magistrala PCI | ||
Line 80: | Line 84: | ||
* transmiterea pachetelor se va face în funcția ''.ndo_start_xmit'' | * transmiterea pachetelor se va face în funcția ''.ndo_start_xmit'' | ||
* driverul va aloca o zonă de memorie DMA (DMA ring) şi va instrui placa de rețea să trimită pachetele din acea zonă. | * driverul va aloca o zonă de memorie DMA (DMA ring) şi va instrui placa de rețea să trimită pachetele din acea zonă. | ||
+ | |||
+ | Driverul trebuie sa construiasca un ring DMA in RAM pentru a instrui device-ul e100 unde se găsesc pachetele pe care dorește să le trimită. Secțiunea 6.4 din manual descrie formatul unui DMA ring. | ||
+ | |||
+ | Un ring DMA de control este alcătuit din buffere denumite Control Blocks (CB). Un CB generic arată astfel: | ||
+ | |||
+ | +--------------+--------------+ | ||
+ | | CONTROL | STATUS | | ||
+ | +--------------+--------------+ | ||
+ | | LINK | | ||
+ | +--------------+--------------+ | ||
+ | | COMMAND SPECIFIC DATA | | ||
+ | +--------------+--------------+ | ||
+ | |||
+ | Mai multe detalii despre trimiterea pachetelor citiți in secțiunea ''Transmitting Packets'' de [[https://pdos.csail.mit.edu/6.828/2010/labs/lab6/ | aici]]. Urmăriți comentariile marcate cu TODO 5. | ||
==== Recepționarea pachetelor ==== | ==== Recepționarea pachetelor ==== | ||
* recepționarea pachetelor se va face în handlerul de întrerupere | * recepționarea pachetelor se va face în handlerul de întrerupere | ||
* la primirea unui pachet device-ul ''e100'' copiază datele într-o zonă DMA şi generează o întrerupere pentru a informa procesorul de sosirea unui nou pachet. | * la primirea unui pachet device-ul ''e100'' copiază datele într-o zonă DMA şi generează o întrerupere pentru a informa procesorul de sosirea unui nou pachet. | ||
- | + | ||
+ | Un al doilea DMA ring este necesar pentru recepționarea pachetelor. Fiecare buffer din DMA ring-ul de recepție este denumit | ||
+ | RFD (Receive Frame Descriptor). | ||
+ | |||
+ | Unitatea de recepție (RU) se ocupă de primirea pachetelor. La primirea unui pachet din rețea, copiaza pachetul în urmator-ul RFD liber, marchează RFD-ul valid și se mută la următorul RFD. | ||
+ | |||
+ | Mai multe detalii despre trimiterea pachetelor citiți in secțiunea ''Receiving Packets'' de [[https://pdos.csail.mit.edu/6.828/2010/labs/lab6/ | aici]]. Urmăriți comentariile cu TODO 6. | ||
+ | ===== e100 header ===== | ||
+ | |||
+ | Antetul e100 conține descrierea in memorie a structurilor importante expuse de device-ul e100. | ||
+ | |||
+ | * ''struct csr'', Control/Status Register descris in secțiunea 6.3.1 | ||
+ | * ''struct tcb'', Transmit Command Block descris in secțiunea 6.4.2.5 | ||
+ | * ''struct cb'', descrie un Command Block generic. | ||
===== Testare ===== | ===== Testare ===== | ||