Opzioni di ascolto isocrone per dispositivi IEEE 1394
In questa sezione vengono descritte le varie opzioni di ascolto isocrone.
Ricezione o rimozione delle intestazioni dei pacchetti
I controller host possono o meno rimuovere automaticamente le intestazioni da un pacchetto isocrono. Il driver del bus imposta il flag HOST_INFO_SUPPORTS_RETURNING_ISO_HDR del membro HostCapabilities della struttura GET_LOCAL_HOST_INFO2 se il controller host non rimuove automaticamente le intestazioni dai pacchetti isocroni.
Inoltre, i controller host possono supportare la rimozione configurabile delle intestazioni. Il driver del bus imposta il flag HOST_INFO_SUPPORTS_ISOCH_STRIPPING di HostCapabilities se il controller host può essere configurato per stripare le intestazioni. Per configurare effettivamente il controller host per stripare le intestazioni, il driver invia la richiesta di REQUEST_ISOCH_ALLOCATE_RESOURCES con il flag RESOURCE_STRIP_ADDITIONAL_QUADLETS impostato. Il membro nQuadletsToStrip specifica il numero di quadlet da rimuovere dall'inizio di ogni pacchetto. Ad esempio, nQuadletsToStrip = 1 rimuove l'intestazione del pacchetto isochronous.
Flusso e DMA basato su pacchetti
Le strategie DMA basate su flusso e basate su pacchetti richiedono il supporto del controller host sottostante. Tutti i controller host supportano almeno una delle strategie DMA e i controller host conformi a OHCI supportano entrambi.
DMA basato su pacchetti e DMA basato su flusso hanno caratteristiche simili quando tutti i pacchetti hanno le stesse dimensioni. Tuttavia, i due tipi di DMA hanno caratteristiche molto diverse quando le dimensioni del pacchetto variano.
In DMA basato su flusso, il controller host ignora i limiti dei pacchetti mentre riempie i buffer di I/O, senza spazi nei dati scritti. Per determinare la posizione di un determinato pacchetto, è necessario conoscere le lunghezze di tutti i pacchetti precedenti.
In DMA basato su pacchetti, il controller host scrive un solo pacchetto isocrono per buffer. Pertanto, in modalità pacchetto, il controller host spazia i dati scritti, in modo che ogni pacchetto inizi a una distanza dall'inizio del buffer di I/O che è un multiplo integrale delle dimensioni massime del pacchetto. Se un pacchetto specifico è inferiore al valore massimo, i dati che si trovano tra la fine del pacchetto e l'inizio del pacchetto successivo non sono definiti. Pertanto, quando i pacchetti sono inferiori alla dimensione massima, lo spazio del buffer viene sprecato. Ad esempio, un buffer di dimensioni sufficienti per contenere 10 pacchetti contiene sempre esattamente 10 pacchetti, anche se alcuni pacchetti sono inferiori alle dimensioni massime consentite.
Indipendentemente dalla modalità DMA scelta, si applicano alcuni compromessi di progettazione. Ad esempio, la scelta delle dimensioni del buffer influisce sulle prestazioni del dispositivo, indipendentemente dalla modalità DMA usata. I buffer di grandi dimensioni garantiscono un'efficienza perché si evita un certo sovraccarico associato all'inizializzazione di un numero elevato di buffer. Inoltre, un minor numero di buffer significa che sono necessari meno descrittori DMA. D'altra parte, i buffer più grandi aumentano la latenza tra l'inizio di un'operazione di I/O e il momento in cui il driver del bus informa il driver della funzione che il buffer è pieno.
Se il controller host supporta entrambi i tipi di DMA, il driver del bus imposta per impostazione predefinita il controller host su DMA basato su flusso. Per reimpostare il controller host su DMA basato su pacchetti, il driver deve impostare il flag di RESOURCE_USE_PACKET_BASED quando alloca l'handle di risorsa.
I driver usano la richiesta del bus REQUEST_GET_LOCAL_HOST_INFO (con il membro u.GetLocalHostInformation.nLevel dell'IRB = GET_HOST_CAPABILITIES) per determinare le caratteristiche del controller host. Il driver del bus restituisce una struttura GET_LOCAL_HOST_INFO2 e imposta i flag all'interno del membro HostCapabilities per indicare cosa supporta il controller host:
Tipo DMA | Flag HostCapabilities |
---|---|
basato su flusso |
HOST_INFO_STREAM_BASED |
basato su pacchetti |
HOST_INFO_PACKET_BASED |