.. _z3-zsonet: ========================== Urządzenie ZSONet ========================== .. contents:: 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_0``--``MAC_5`` (8 bitów, do odczytu) Kolejne bajty adresu MAC urządzenia. ``TX_STATUS_0``--``TX_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_0``--``TX_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``.