Urządzenie ZSONet

Urządzenie

Urządzenie jest podłączane do komputera przez szynę PCI – identyfikator producenta to 0x0250, a identyfikator urządzenia to 0x250e.

Urządzenie nie posiada własnej pamięci i operuje na buforach w głównej pamięci komputera przez bezpośredni dostęp do pamięci (DMA).

Urządzeniem steruje się przez rejestry wejścia/wyjścia zmapowane do pamięci (MMIO). Ten obszar MMIO jest pierwszym i jedynym obszarem BAR używanym przez urządzenie (BAR0). Urządzenie wykorzystuje również jedną linię przerwania PCI.

Obszar MMIO ma wielkość 256 B, ale tylko niektóre bajty z tego zakresu są używane na rejestry. Wszystkie udokumentowane rejestry są w formacie little-endian i powinny być używane tylko przez wyrównane odczyty i zapisy o rozmiarze odpowiadającym rozmiarowi rejestru.

Wysyłanie ramek

Urządzenie używa 4 buforów DMA do wysyłania ramek. Bufory są używane na zasadzie round robin — należy używać kolejno buforów 0, 1, 2, 3, 0, 1, 2, 3… Adres i-tego bufora należy umieścić w rejestrze TX_BUF_i podczas przygotowywania urządzenia. Aby zlecić wysłanie ramki za pomocą i-tego bufora należy umieścić jego zawartość w buforze, a następnie zapisać rozmiar ramki na górne 16 bitów (bity 16-31) rejestru TX_STATUS_i.

Po zleceniu wysłania ramki danego bufora można użyć ponownie dopiero gdy urządzenie zakończy wysyłanie. Urządzenie sygnalizuje wysłanie ramki poprzez ustawienie bitu TX_FINISHED w odpowiednim rejestrze TX_STATUS_i oraz podniesienie przerwania TX_OK.

Odbieranie ramek

Do odbierania ramek urządzenie używa jednego bufora DMA na zasadzie bufora cyklicznego. Adres tego bufora należy umieścić w rejestrze RX_BUF, a jego rozmiar w rejestrze RX_BUF_SIZE. Po odebraniu ramki urządzenie umieszcza w buforze 4-bajtowy własny nagłówek, właściwą ramkę oraz 4-bajtową sumę kontrolną (FCS). Następnie urządzenie podnosi przerwanie RX_OK. Nagłówek jest w formacie little-endian i znajduje się w nim rozmiar ramki (wliczając FCS).

Czytanie z bufora należy rozpocząć od offsetu 0. Należy informować urządzenie o pozycji, na której zakończyło się odczytywanie ostatniej ramki poprzez rejestr RX_BUF_READ_OFFSET. Poprzez bit RX_HAS_DATA rejestru RX_STATUS można dowiedzieć się, czy na tej pozycji znajduje się ramka.

Może się zdarzyć, że urządzenie odbierze ramkę, ale w buforze nie będzie na nią miejsca. Takie ramki zostaną porzucone, a ich liczbę urządzenie udostępnia w rejestrze RX_MISSED.

Rejestry sterujące

Urządzenie używa następujących rejestrów:

MAC_0MAC_5 (8 bitów, do odczytu)

Kolejne bajty adresu MAC urządzenia.

TX_STATUS_0TX_STATUS_3 (32 bity, do odczytu/zapisu)

Rejestry służące do zlecania urządzeniu wysłania pakietu oraz sprawdzania, czy wysyłanie zostało zakończone.

TX_BUF_0TX_BUF_3 (32 bity, do zapisu)

Adresy buforów DMA używanych do wysyłania pakietów.

RX_BUF (32 bity, do zapisu)

Adres bufora DMA używanego do odbierania pakietów.

RX_BUF_SIZE (32 bity, do zapisu)

Rozmiar bufora używanego do odbierania pakietów.

RX_BUF_READ_OFFSET (32 bity, do zapisu)

Pozycja w buforze, na której sterownik zakończył odczytywanie ostatniej ramki.

RX_BUF_WRITE_OFFSET (32 bity, do odczytu)

Pozycja w buforze, na której urządzenie zakończyło zapisywanie ostatniej ramki (może być wykorzystany do debugowania).

RX_STATUS (32 bity, do odczytu)

Rejestr służący do sprawdzania, czy w buforze znajdują się ramki do odczytania.

RX_MISSED (32 bity, do odczytu/zapisu)

Liczba ramek porzuconych z powodu przepełnienia bufora. Zapisanie dowolnej wartości powoduje wyzerowanie rejestru.

INTR_MASK (32 bity, do odczytu/zapisu)

Rejestr włączania przerwań. Ma takie same bity jak INTR_STATUS. 1 oznacza przerwanie włączone, a 0 — przerwanie wyłączone. Przy resecie maszyny, rejestr zostaje ustawiony na 0, blokując możliwość zgłaszania przerwania PCI przez urządzenie do momentu załadowania sterownika.

INTR_STATUS (32 bity, do odczytu/zapisu)

Aktywne przerwania. Każde przerwanie ma odpowiadający mu bit w tym rejestrze. Odczyt rejestru zwraca 1 dla aktywnych przerwań, a 0 dla nieaktywnych. Zapis spowoduje wyzerowanie (ustawienie na nieaktywne) wszystkich przerwań, dla których został zapisany bit 1.

ENABLED (32 bity, do zapisu)

Włączanie i wyłączanie przetwarzania ramek przez urządzenie. Zapisanie niezerowej wartości włącza przetwarzanie, a zapisanie zera wyłącza je i resetuje stan urządzenia.

Uruchomienie urządzenia

Poprawna procedura uruchamiania urządzenia jest następująca (użycie dowolnej innej procedury spowoduje utratę gwarancji i brak możliwości zwrotu urządzenia):

  • przygotować bufory

  • wyzerować INTR_STATUS

  • włączyć używane przez nas przerwania w INTR_MASK,

  • włączyć urządzenie w ENABLED.

Żeby wyłączyć urządzenie, wystarczy zapisać 0 do ENABLED oraz INTR_MASK.