OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

virtio message

[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]


Subject: Re: [PATCH] latexify document more.


On Mon, Dec 02, 2013 at 04:56:16PM +1030, Rusty Russell wrote:
> This change:
> - Turns formatted lists into real lists (itemize, etc).
> - Turns ascii tables into real tables.
> - Use \ldots for ...
> - Moves \footnote to immediately after what it refers to, otherwise we
>   get awkward whitespace before the superscript.
> - List of stats for balloon contains values in () to match other lists.
> - Puts lstlisting around CCW code example
> 
> No actual contents changed, but I haven't committed it yet to avoid
> stepping on MST's toes if he has outstanding commits.
> 
> Signed-off-by: Rusty Russell <rusty@au.ibm.com>

I don't have outstanding commits so please go ahead.

Did you use some script for converting these?

> diff --git a/content.tex b/content.tex
> index 259dea1..8db13c4 100644
> --- a/content.tex
> +++ b/content.tex
> @@ -5,10 +5,12 @@ A virtio device is discovered and identified by a bus-specific method
>  \ref{sec:Virtio Transport Options / Virtio Over MMIO}~\nameref{sec:Virtio Transport Options / Virtio Over MMIO} and \ref{sec:Virtio Transport Options / Virtio Over Channel I/O}~\nameref{sec:Virtio Transport Options / Virtio Over Channel I/O}).  Each
>  device consists of the following parts:
>  
> -o Device Status field
> -o Feature bits
> -o Configuration space
> -o One or more virtqueues
> +\begin{itemize}
> +\item Device Status field
> +\item Feature bits
> +\item Configuration space
> +\item One or more virtqueues
> +\end{itemize}
>  
>  Unless explicitly specified otherwise, all multi-byte fields are little-endian.
>  To reinforce this the examples use typenames like "le16" instead of "uint16_t".
> @@ -23,25 +25,27 @@ clear a device status bit.
>  
>  This field is 0 upon reset, otherwise at least one bit should be set:
>  
> -  ACKNOWLEDGE (1) Indicates that the guest OS has found the
> +\begin{description}
> +\item[ACKNOWLEDGE (1)] Indicates that the guest OS has found the
>    device and recognized it as a valid virtio device.
>  
> -  DRIVER (2) Indicates that the guest OS knows how to drive the
> +\item[DRIVER (2)] Indicates that the guest OS knows how to drive the
>    device. Under Linux, drivers can be loadable modules so there
>    may be a significant (or infinite) delay before setting this
>    bit.
>  
> -  FEATURES_OK (8) Indicates that the driver has acknowledged all the
> +\item[FEATURES_OK (8)] Indicates that the driver has acknowledged all the
>    features it understands, and feature negotiation is complete.
>  
> -  DRIVER_OK (4) Indicates that the driver is set up and ready to
> +\item[DRIVER_OK (4)] Indicates that the driver is set up and ready to
>    drive the device.
>  
> -  FAILED (128) Indicates that something went wrong in the guest,
> +\item[FAILED (128)] Indicates that something went wrong in the guest,
>    and it has given up on the device. This could be an internal
>    error, or the driver didn't like the device for some reason, or
>    even a fatal error during device operation. The driver MUST
>    reset the device before attempting to re-initialize.
> +\end{description}
>  
>  \section{Feature Bits}\label{sec:Basic Facilities of a Virtio Device / Feature Bits}
>  
> @@ -67,12 +71,14 @@ which was not offered.
>  
>  Feature bits are allocated as follows:
>  
> -  0 to 23: Feature bits for the specific device type
> +\begin{description}
> +\item[0 to 23] Feature bits for the specific device type
>  
> -  24 to 32: Feature bits reserved for extensions to the queue and
> +\item[24 to 32] Feature bits reserved for extensions to the queue and
>    feature negotiation mechanisms
>  
> -  33 and above: Feature bits reserved for future extensions.
> +\item[33 and above] Feature bits reserved for future extensions.
> +\end{description}
>  
>  For example, feature bit 0 for a network device (i.e. Subsystem
>  Device ID 1) indicates that the device supports checksumming of
> @@ -91,15 +97,17 @@ Since these are widely deployed, this specification
>  accommodates optional features to simplify transition
>  from these earlier draft interfaces. Specifically:
>  
> -Legacy Interface
> +\begin{description}
> +\item[Legacy Interface]
>          is an interface specified by an earlier draft of this specification
>          (up to 0.9.X)
> -Legacy Device
> +\item[Legacy Device]
>          is a device implemented before this specification was released,
>          and implementing a legacy interface on the host side
> -Legacy Driver
> +\item[Legacy Driver]
>          is a driver implemented before this specification was released,
>          and implementing a legacy interface on the guest side
> +\end{description}
>  
>  Legacy devices and legacy drivers are not compliant with this
>  specification.
> @@ -107,13 +115,15 @@ specification.
>  To simplify transition from these earlier draft interfaces,
>  it is possible to implement:
>  
> -Transitional Device
> +\begin{description}
> +\item[Transitional Device]
>          a device supporting both drivers conforming to this
>          specification, and allowing legacy drivers.
>  
> -Transitional Driver
> +\item[Transitional Driver]
>          a driver supporting both devices conforming to this
>          specification, and legacy devices.
> +\end{description}
>  
>  Transitional devices and transitional drivers can be compliant with
>  this specification (ie. when not operating in legacy mode).
> @@ -196,11 +206,11 @@ of the queue.
>  
>  Each virtqueue consists of three parts:
>  
> -        Descriptor Table
> -
> -        Available Ring
> -
> -        Used Ring
> +\begin{itemize}
> +\item Descriptor Table
> +\item Available Ring
> +\item Used Ring
> +\end{itemize}
>  
>  where each part is physically-contiguous in guest memory,
>  and has different alignment requirements.
> @@ -208,18 +218,17 @@ and has different alignment requirements.
>  The memory aligment and size requirements, in bytes, of each part of the
>  virtqueue are summarized in the following table:
>  
> -\begin{verbatim}
> -+------------+-----------------------------------------+
> -| Virtqueue Part    | Alignment | Size                 |
> -+------------+-----------------------------------------+
> -+------------+-----------------------------------------+
> -| Descriptor Table  | 16        | 16 * (Queue Size)    |
> -+------------+-----------------------------------------+
> -| Available Ring    | 2         | 6 + 2 * (Queue Size) |
> -+------------+-----------------------------------------+
> -| Used Ring         | 4         | 6 + 4 * (Queue Size) |
> -+------------+-----------------------------------------+
> -\end{verbatim}
> +\begin{tabular}{|l|l|l|}
> +\hline
> +Virtqueue Part    & Alignment & Size \\
> +\hline \hline
> +Descriptor Table  & 16        & $16 * $(Queue Size) \\
> +\hline
> +Available Ring    & 2         & $6 + 2 * $(Queue Size) \\
> + \hline
> +Used Ring         & 4         & $6 + 4 * $(Queue Size) \\
> + \hline
> +\end{tabular}
>  
>  The Alignment column gives the miminum alignment: for each part
>  of the virtqueue, the physical address of the first byte
> @@ -250,11 +259,11 @@ Each virtqueue occupies two or more physically-contiguous pages
>  (usually defined as 4096 bytes, but depending on the transport)
>  and consists of three parts:
>  
> -\begin{verbatim}
> -+-------------------+-----------------------------------+-----------+
> -| Descriptor Table  |   Available Ring     (padding)    | Used Ring |
> -+-------------------+-----------------------------------+-----------+
> -\end{verbatim}
> +\begin{tabular}{|l|l|l|}
> +\hline
> +Descriptor Table & Available Ring (\ldots padding\ldots) & Used Ring \\
> +\hline
> +\end{tabular}
>  
>  The bus-specific Queue Size field controls the total number of bytes
>  required for the virtqueue according to the following formula:
> @@ -503,28 +512,30 @@ how to communicate with the specific device.
>  
>  The driver MUST follow this sequence to initialize a device:
>  
> -1. Reset the device.
> +\begin{enumerate}
> +\item Reset the device.
>  
> -2. Set the ACKNOWLEDGE status bit: we have noticed the device.
> +\item Set the ACKNOWLEDGE status bit: we have noticed the device.
>  
> -3. Set the DRIVER status bit: we know how to drive the device.
> +\item Set the DRIVER status bit: we know how to drive the device.
>  
> -4. Read device feature bits, and write the subset of feature bits
> +\item Read device feature bits, and write the subset of feature bits
>     understood by the OS and driver to the device.
>  
> -5. Set the FEATURES_OK status bit.  The driver MUST not accept
> +\item Set the FEATURES_OK status bit.  The driver MUST not accept
>     new feature bits after this step.
>  
> -6. Re-read the status byte to ensure the FEATURES_OK bit is still
> +\item Re-read the status byte to ensure the FEATURES_OK bit is still
>     set: otherwise, the device does not support our subset of features
>     and the device is unusable.
>  
> -7. Perform device-specific setup, including discovery of virtqueues for the
> +\item Perform device-specific setup, including discovery of virtqueues for the
>     device, optional per-bus setup, reading and possibly writing the
>     device's virtio configuration space, and population of virtqueues.
>  
> -8. Set the DRIVER_OK status bit.  At this point the device is
> +\item Set the DRIVER_OK status bit.  At this point the device is
>     "live".
> +\end{enumerate}
>  
>  If any of these steps go irrecoverably wrong, the driver SHOULD
>  set the FAILED status bit to indicate that it has given up on the
> @@ -568,27 +579,29 @@ they are used.
>  
>  The driver offers buffers to one of the device's virtqueues as follows:
>  
> -1. The driver places the buffer into free descriptor(s) in the
> +\begin{enumerate}
> +\item The driver places the buffer into free descriptor(s) in the
>     descriptor table, chaining as necessary (see \ref{sec:Basic Facilities of a Virtio Device / Virtqueues / The Virtqueue Descriptor Table}~\nameref{sec:Basic Facilities of a Virtio Device / Virtqueues / The Virtqueue Descriptor Table}).
>  
> -2. The driver places the index of the head of the descriptor chain
> +\item The driver places the index of the head of the descriptor chain
>     into the next ring entry of the available ring.
>  
> -3. Steps (1) and (2) may be performed repeatedly if batching
> +\item Steps (1) and (2) may be performed repeatedly if batching
>    is possible.
>  
> -4. The driver MUST perform suitable a memory barrier to ensure the device sees
> +\item The driver MUST perform suitable a memory barrier to ensure the device sees
>    the updated descriptor table and available ring before the next
>    step.
>  
> -5. The available “idx” field is increased by the number of
> +\item The available “idx” field is increased by the number of
>    descriptor chain heads added to the available ring.
>  
> -6. The driver MUST perform a suitable memory barrier to ensure that it updates
> +\item The driver MUST perform a suitable memory barrier to ensure that it updates
>    the "idx" field before checking for notification suppression.
>  
> -7. If notifications are not suppressed, the driver MUST notify the device
> +\item If notifications are not suppressed, the driver MUST notify the device
>      of the new available buffers.
> +\end{enumerate}
>  
>  Note that the above code does not take precautions against the
>  available ring buffer wrapping around: this is not possible since
> @@ -611,21 +624,19 @@ chain:
>  
>  for each buffer element, b:
>  
> -  (a) Get the next free descriptor table entry, d
> -
> -  (b) Set d.addr to the physical address of the start of b
> -
> -  (c) Set d.len to the length of b.
> -
> -  (d) If b is write-only, set d.flags to VRING_DESC_F_WRITE,
> +\begin{enumerate}
> +\item Get the next free descriptor table entry, d
> +\item Set d.addr to the physical address of the start of b
> +\item Set d.len to the length of b.
> +\item If b is write-only, set d.flags to VRING_DESC_F_WRITE,
>      otherwise 0.
> -
> -  (e) If there is a buffer element after this:
> -
> -    i. Set d.next to the index of the next free descriptor
> +\item If there is a buffer element after this:
> +    \begin{enumerate}
> +    \item Set d.next to the index of the next free descriptor
>        element.
> -
> -    ii. Set the VRING_DESC_F_NEXT bit in d.flags.
> +    \item Set the VRING_DESC_F_NEXT bit in d.flags.
> +    \end{enumerate}
> +\end{enumerate}
>  
>  In practice, the d.next fields are usually used to chain free
>  descriptors, and a separate count kept to check there are enough
> @@ -698,24 +709,28 @@ device), it sends an interrupt, following an algorithm very
>  similar to the algorithm used for the driver to send the device a
>  buffer:
>  
> -1. Write the head descriptor number to the next field in the used
> +\begin{enumerate}
> +\item Write the head descriptor number to the next field in the used
>    ring.
>  
> -2. Update the used ring index.
> +\item Update the used ring index.
>  
> -3. Deliver an interrupt if necessary:
> +\item Deliver an interrupt if necessary:
>  
> -  (a) If the VIRTIO_F_RING_EVENT_IDX feature is not negotiated:
> +  \begin{enumerate}
> +  \item If the VIRTIO_F_RING_EVENT_IDX feature is not negotiated:
>      check if the VRING_AVAIL_F_NO_INTERRUPT flag is not set in
>      avail->flags.
>  
> -  (b) If the VIRTIO_F_RING_EVENT_IDX feature is negotiated: check
> +  \item If the VIRTIO_F_RING_EVENT_IDX feature is negotiated: check
>      whether the used index crossed the used_event field value
>      since the last update. The used_event field wraps naturally
>      at 65536 as well:
>  \begin{lstlisting}
>  	(u16)(new_idx - used_event - 1) < (u16)(new_idx - old_idx)
>  \end{lstlisting}
> +  \end{enumerate}
> +\end{enumerate}
>  
>  For each ring, the driver should then disable interrupts by writing
>  VRING_AVAIL_F_NO_INTERRUPT flag in avail structure, if required.
> @@ -764,8 +779,7 @@ Virtio devices are commonly implemented as PCI devices.
>  \subsection{PCI Device Discovery}\label{sec:Virtio Transport Options / Virtio Over PCI Bus / PCI Device Discovery}
>  
>  Any PCI device with Vendor ID 0x1AF4, and Device ID 0x1000 through
> -0x103F inclusive is a virtio device
> -\footnote{The actual value within this range is ignored
> +0x103F inclusive is a virtio device\footnote{The actual value within this range is ignored
>  }.
>  
>  The Subsystem Device ID indicates which virtio device is
> @@ -830,20 +844,18 @@ Common configuration structure layout is documented below:
>  	};
>  \end{lstlisting}
>  
> -device_feature_select
> -
> +\begin{description}
> +\item[device_feature_select]
>          The driver uses this to select which Feature Bits the device_feature field shows.
>          Value 0x0 selects Feature Bits 0 to 31
>          Value 0x1 selects Feature Bits 32 to 63
>          The device MUST present 0 on device_feature for any other value.
>  
> -device_feature
> -
> +\item[device_feature]
>          The device uses this to report Feature Bits to the driver.
>          Device Feature Bits selected by device_feature_select.
>  
> -driver_feature_select
> -
> +\item[driver_feature_select]
>          The driver uses this to select which Feature Bits the driver_feature field shows.
>          Value 0x0 selects Feature Bits 0 to 31
>          Value 0x1 selects Feature Bits 32 to 63
> @@ -852,72 +864,60 @@ driver_feature_select
>          MUST not write any other value into driver_feature (a corollary of
>          the rule that the driver can only write a subset of device features).
>  
> -driver_feature
> -
> +\item[driver_feature]
>          The driver writes this to accept feature bits offered by the device.
>          Driver Feature Bits selected by driver_feature_select.
>  
> -msix_config
> -
> +\item[msix_config]
>          The driver sets the Configuration Vector for MSI-X.
>  
> -num_queues
> -
> +\item[num_queues]
>          The device specifies the maximum number of virtqueues supported here.
>  
> -device_status
> -
> +\item[device_status]
>          The driver writes the Device Status here. Writing 0 into this
>          field resets the device.
>  
> -config_generation
> -
> +\item[config_generation]
>          Configuration atomicity value.  The device changes this every time the
>          configuration noticeably changes.  This means the device may
>          only change the value after a configuration read operation,
>          but MUST change it if there is any risk of a driver seeing an
>          inconsistent configuration state.
>  
> -queue_select
> -
> +\item[queue_select]
>          Queue Select. The driver selects which virtqueue the following
>          fields refer to.
>  
> -queue_size
> -
> +\item[queue_size]
>          Queue Size.  On reset, specifies the maximum queue size supported by
>          the hypervisor. This can be modified by driver to reduce memory requirements.
>          The device MUST set this to 0 if this virtqueue is unavailable.
>  
> -queue_msix_vector
> -
> +\item[queue_msix_vector]
>          The driver uses this to specify the Queue Vector for MSI-X.
>  
> -queue_enable
> -
> +\item[queue_enable]
>          The driver uses this to selectively prevent the device from executing requests from this virtqueue.
>          1 - enabled; 0 - disabled
>  
>          The driver MUST configure the other virtqueue fields before enabling
>          the virtqueue.
>  
> -queue_notify_off
> -
> +\item[queue_notify_off]
>          The driver reads this to calculate the offset from start of Notification structure at
>          which this virtqueue is located.
>          Note: this is *not* an offset in bytes. See notify_off_multiplier below.
>  
> -queue_desc
> -
> +\item[queue_desc]
>          The driver writes the physical address of Descriptor Table here.
>  
> -queue_avail
> -
> +\item[queue_avail]
>          The driver writes the physical address of Available Ring here.
>  
> -queue_used
> -
> +\item[queue_used]
>          The driver writes the physical address of Used Ring here.
> +\end{description}
>  
>  \subsubsection{ISR status structure layout}\label{sec:Virtio Transport Options / Virtio Over PCI Bus / PCI Device Layout / ISR status structure layout}
>  ISR status structure includes a single 8-bit ISR status field.
> @@ -967,17 +967,15 @@ When used through the legacy interface, the virtio header looks as follows:
>  If MSI-X is enabled for the device, two additional fields
>  immediately follow this header:
>  
> -
> -\begin{verbatim}
> -+------------++----------------+--------+
> -| Bits       || 16             | 16     |
> -+------------++----------------+--------+
> -| Read/Write || R+W            | R+W    |
> -+------------++----------------+--------+
> -| Purpose    || Configuration  | Queue  |
> -| (MSI-X)    || Vector         | Vector |
> -+------------++----------------+--------+
> -\end{verbatim}
> +\begin{tabular}{ |l||l|l| }
> +\hline
> +Bits       & 16             & 16     \\
> +\hline
> +Read/Write & R+W            & R+W    \\
> +\hline
> +Purpose (MSI-X) & Configuration Vector  & Queue Vector \\
> +\hline
> +\end{tabular}
>  
>  Note: When MSI-X capability is enabled, device specific configuration starts at
>  byte offset 24 in virtio header structure. When MSI-X capability is not
> @@ -988,16 +986,15 @@ If you turn it off again, they move back!
>  Immediately following these general headers, there may be
>  device-specific headers:
>  
> -\begin{verbatim}
> -+------------++--------------------+
> -| Bits       || Device Specific    |
> -+------------++--------------------+
> -| Read/Write || Device Specific    |
> -+------------++--------------------+
> -| Purpose    || Device Specific... |
> -|            ||                    |
> -+------------++--------------------+
> -\end{verbatim}
> +\begin{tabular}{ |l||l| }
> +\hline
> +Bits       & Device Specific \\
> +\hline
> +Read/Write & Device Specific \\
> +\hline
> +Purpose    & Device Specific... \\
> +\hline
> +\end{tabular}
>  
>  Note that only Feature Bits 0 to 31 are accessible through the
>  Legacy Interface. When used through the Legacy Interface,
> @@ -1013,7 +1010,7 @@ see \ref{sec:Basic Facilities of a Virtio Device / Configuration Space / Legacy
>  
>  This documents PCI-specific steps executed during Device Initialization.
>  As the first step, driver must detect device configuration layout
> -to locate configuration fields in memory,I/O or configuration space of the
> +to locate configuration fields in memory, I/O or configuration space of the
>  device.
>  
>  \paragraph{Virtio Device Configuration Layout Detection}\label{sec:Virtio Transport Options / Virtio Over PCI Bus / PCI-specific Initialization And Device Operation / Device Initialization / Virtio Device Configuration Layout Detection}
> @@ -1065,18 +1062,19 @@ specified 8-bit size.
>  
>  The fields are interpreted as follows:
>  
> -cap_vndr
> +\begin{description}
> +\item[cap_vndr]
>          0x09; Identifies a vendor-specific capability.
>  
> -cap_next
> +\item[cap_next]
>          Link to next capability in the capability list in the configuration space.
>  
> -cap_len
> +\item[cap_len]
>          Length of the capability structure, including the whole of
>          struct virtio_pci_cap, and extra data if any.
>          This length might include padding, or fields unused by the driver.
>  
> -cfg_type
> +\item[cfg_type]
>          identifies the structure, according to the following table.
>  
>  \begin{lstlisting}
> @@ -1107,7 +1105,7 @@ cfg_type
>          Driver will use the I/O BAR if I/O resources are available, and fall back on
>          memory BAR when I/O resources are unavailable.
>  
> -bar
> +\item[bar]
>          values 0x0 to 0x5 specify a Base Address register (BAR) belonging to
>          the function located beginning at 10h in Configuration Space
>          and used to map the structure into Memory or I/O Space.
> @@ -1118,11 +1116,11 @@ bar
>          ignore any vendor-specific capability structure which has
>          a reserved bar value.
>  
> -offset
> +\item[offset]
>          indicates where the structure begins relative to the base address associated
>          with the BAR.
>  
> -length
> +\item[length]
>          indicates the length of the structure.
>          This size might include padding, or fields unused by the driver.
>          Drivers SHOULD only map part of configuration structure
> @@ -1133,7 +1131,7 @@ length
>          driver can limit the mapped structure size to e.g.
>          4KBytes to allow forward compatibility with such devices without loss of
>          functionality and without wasting resources.
> -
> +\end{description}
>  
>  If cfg_type is VIRTIO_PCI_CAP_NOTIFY_CFG this structure is immediately followed
>  by additional fields:
> @@ -1145,7 +1143,8 @@ by additional fields:
>  	};
>  \end{lstlisting}
>  
> -notify_off_multiplier
> +\begin{description}
> +\item[notify_off_multiplier]
>  
>          Virtqueue offset multiplier, in bytes. Must be even and either a power of two, or 0.
>          Value 0x1 is reserved.
> @@ -1155,6 +1154,7 @@ notify_off_multiplier
>  
>          If notify_off_multiplier is 0, all virtqueues use the same address in
>          the Notifications structure!
> +\end{description}
>  
>  If cfg_type is VIRTIO_PCI_CAP_PCI_CFG the fields bar, offset and length are RW
>  and this structure is immediately followed by an additional field:
> @@ -1165,7 +1165,8 @@ and this structure is immediately followed by an additional field:
>  	};
>  \end{lstlisting}
>  
> -pci_cfg_data
> +\begin{description}
> +\item[pci_cfg_data]
>  
>          This RW field allows an indirect access to any BAR on the
>          device using PCI configuration accesses.
> @@ -1182,6 +1183,7 @@ pci_cfg_data
>  
>          When this field is read by driver, length bytes at the
>          selected offset in the selected BAR are read into pci_cfg_data.
> +\end{description}
>  
>  \subparagraph{Legacy Interface: A Note on Device Layout Detection}\label{sec:Virtio Transport Options / Virtio Over PCI Bus / PCI-specific Initialization And Device Operation / Device Initialization / Virtio Device Configuration Layout Detection / Legacy Interface: A Note on Device Layout Detection}
>  
> @@ -1210,10 +1212,12 @@ a legacy device with the same ID might have previously existed,
>  must take the following steps to fail gracefully when a legacy
>  driver attempts to drive them:
>  
> -1) Present an I/O BAR in BAR0, and
> -2) Respond to a single-byte zero write to offset 18
> +\begin{enumerate}
> +\item Present an I/O BAR in BAR0, and
> +\item Respond to a single-byte zero write to offset 18
>     (corresponding to Device Status register in the legacy layout)
>     of BAR0 by presenting zeroes on every BAR and ignoring writes.
> +\end{enumerate}
>  
>  \paragraph{Queue Vector Configuration}\label{sec:Virtio Transport Options / Virtio Over PCI Bus / PCI-specific Initialization And Device Operation / Device Initialization / Queue Vector Configuration}
>  
> @@ -1256,31 +1260,32 @@ configuration.
>  
>  The driver does this as follows, for each virtqueue a device has:
>  
> -1. Write the virtqueue index (first queue is 0) to the Queue
> +\begin{enumerate}
> +\item Write the virtqueue index (first queue is 0) to the Queue
>    Select field.
>  
> -2. Read the virtqueue size from the Queue Size field, which MUST
> +\item Read the virtqueue size from the Queue Size field, which MUST
>     be a power of 2. This controls how big the virtqueue is
>    (see \ref{sec:Basic Facilities of a Virtio Device / Virtqueues}~\nameref{sec:Basic Facilities of a Virtio Device / Virtqueues}). If this field is 0, the virtqueue does not exist.
>  
> -3. Optionally, select a smaller virtqueue size and write it in the Queue Size
> +\item Optionally, select a smaller virtqueue size and write it in the Queue Size
>     field.
>  
> -4. Allocate and zero Descriptor Table, Available and Used rings for the
> +\item Allocate and zero Descriptor Table, Available and Used rings for the
>     virtqueue in contiguous physical memory.
>  
> -5. Optionally, if MSI-X capability is present and enabled on the
> +\item Optionally, if MSI-X capability is present and enabled on the
>    device, select a vector to use to request interrupts triggered
>    by virtqueue events. Write the MSI-X Table entry number
>    corresponding to this vector in Queue Vector field. Read the
>    Queue Vector field: on success, previously written value is
>    returned; on failure, NO_VECTOR value is returned.
> +\end{enumerate}
>  
>  \subparagraph{Legacy Interface: A Note on Virtqueue Configuration}\label{sec:Virtio Transport Options / Virtio Over PCI Bus / PCI-specific Initialization And Device Operation / Device Initialization / Virtqueue Configuration / Legacy Interface: A Note on Virtqueue Configuration}
>  When using the legacy interface, the page size for a virtqueue on a PCI virtio
>  device is defined as 4096 bytes.  Driver writes the physical address, divided
> -by 4096 to the Queue Address field 
> -\footnote{The 4096 is based on the x86 page size, but it's also large
> +by 4096 to the Queue Address field\footnote{The 4096 is based on the x86 page size, but it's also large
>  enough to ensure that the separate parts of the virtqueue are on
>  separate cache lines.
>  }.
> @@ -1294,34 +1299,40 @@ of this virtqueue to the Queue Notify field.
>  
>  If an interrupt is necessary:
>  
> -  (a) If MSI-X capability is disabled:
> -
> -    i. Set the lower bit of the ISR Status field for the device.
> +\begin{itemize}
> +  \item If MSI-X capability is disabled:
> +    \begin{enumerate}
> +    \item Set the lower bit of the ISR Status field for the device.
>  
> -    ii. Send the appropriate PCI interrupt for the device.
> +    \item Send the appropriate PCI interrupt for the device.
> +    \end{enumerate}
>  
> -  (b) If MSI-X capability is enabled:
> -
> -    i. Request the appropriate MSI-X interrupt message for the
> +  \item If MSI-X capability is enabled:
> +    \begin{enumerate}
> +    \item Request the appropriate MSI-X interrupt message for the
>        device, Queue Vector field sets the MSI-X Table entry
>        number.
>  
> -    ii. If Queue Vector field value is NO_VECTOR, no interrupt
> +    \item If Queue Vector field value is NO_VECTOR, no interrupt
>        message is requested for this event.
> +    \end{enumerate}
> +\end{itemize}
>  
>  The driver interrupt handler should:
>  
> -1. If MSI-X capability is disabled: read the ISR Status field,
> +\begin{itemize}
> +  \item If MSI-X capability is disabled: read the ISR Status field,
>    which will reset it to zero. If the lower bit is zero, the
>    interrupt was not for this device. Otherwise, the driver
>    should look through the used rings of each virtqueue for the
>    device, to see if any progress has been made by the device
>    which requires servicing.
>  
> -2. If MSI-X capability is enabled: look through the used rings of
> +  \item If MSI-X capability is enabled: look through the used rings of
>    each virtqueue mapped to the specific MSI-X vector for the
>    device, to see if any progress has been made by the device
>    which requires servicing.
> +\end{itemize}
>  
>  \subsubsection{Notification of Device Configuration Changes}\label{sec:Virtio Transport Options / Virtio Over PCI Bus / PCI-specific Initialization And Device Operation / Notification of Device Configuration Changes}
>  
> @@ -1329,7 +1340,8 @@ Some virtio PCI devices can change the device configuration
>  state, as reflected in the virtio header in the PCI configuration
>  space. In this case:
>  
> -1. If MSI-X capability is disabled: an interrupt is delivered and
> +\begin{itemize}
> +  \item If MSI-X capability is disabled: an interrupt is delivered and
>    the second lowest bit is set in the ISR Status field to
>    indicate that the driver should re-examine the configuration
>    space.  Note that a single interrupt can indicate both that one
> @@ -1337,10 +1349,11 @@ space. In this case:
>    space has changed: even if the config bit is set, virtqueues
>    must be scanned.
>  
> -2. If MSI-X capability is enabled: an interrupt message is
> +  \item If MSI-X capability is enabled: an interrupt message is
>    requested. The Configuration Vector field sets the MSI-X Table
>    entry number to use. If Configuration Vector field value is
>    NO_VECTOR, no interrupt message is requested for this event.
> +\end{itemize}
>  
>  \section{Virtio Over MMIO}\label{sec:Virtio Transport Options / Virtio Over MMIO}
>  
> @@ -1371,29 +1384,25 @@ systems using Flattened Device Trees the suggested format is:
>  
>  MMIO virtio devices provides a set of memory mapped control
>  registers, all 32 bits wide, followed by device-specific
> -configuration space. The following list presents their layout:
> -
> -* Offset from the device base address | Direction | Name
> -  Description
> +configuration space. The following table presents their names,
> +offset from the base address, and whether they are read-only (R) or write-only (W) from the driver's perspective:
>  
> -* 0x000 | R | MagicValue
> +\begin{description}
> +\item[MagicValue (0x000) - R]
>    Magic value. Must be 0x74726976 (a Little Endian equivalent
>    of a "virt" string).
> -
> -* 0x004 | R | Version
> +\item[Version (0x004) - R]
>    Device version number. Devices compliant with this specification
>    must return value 0x2.
> -
> -* 0x008 | R | DeviceID
> +\item[DeviceID (0x008) - R]
>    Virtio Subsystem Device ID.
>    See \ref{sec:Device Types}~\nameref{sec:Device Types} for possible values. Value zero (0x0)
>    is invalid and devices returning this ID must be ignored
>    by the guest.
> -
> -* 0x00c | R | VendorID
> +\item[VendorID (0x00c) - R]
>    Virtio Subsystem Vendor ID.
>  
> -* 0x010 | R | DeviceFeatures
> +\item[DeviceFeatures (0x010) - R]
>    Flags representing features the device supports.
>    Reading from this register returns 32 consecutive flag bits,
>    first bit depending on the last value written to the
> @@ -1403,14 +1412,14 @@ configuration space. The following list presents their layout:
>    features bits 32 to 63 if DeviceFeaturesSel is set to 1.
>    Also see \ref{sec:Basic Facilities of a Virtio Device / Feature Bits}~\nameref{sec:Basic Facilities of a Virtio Device / Feature Bits}.
>  
> -* 0x014 | W | DeviceFeaturesSel
> +\item[DeviceFeaturesSel (0x014) - W]
>    Device (host) features word selection.
>    Writing to this register selects a set of 32 device feature bits
>    accessible by reading from the DeviceFeatures register. Device driver
>    must write a value to the DeviceFeaturesSel register before
>    reading from the DeviceFeatures register.
>  
> -* 0x020 | W | DriverFeatures
> +\item[DriverFeatures (0x020) - W]
>    Flags representing device features understood and activated by
>    the driver.
>    Writing to this register sets 32 consecutive flag bits, first
> @@ -1420,21 +1429,21 @@ configuration space. The following list presents their layout:
>    DriverFeaturesSel is set to 0 and features bits 32 to 63 if
>    DriverFeaturesSel is set to 1. Also see \ref{sec:Basic Facilities of a Virtio Device / Feature Bits}~\nameref{sec:Basic Facilities of a Virtio Device / Feature Bits}.
>  
> -* 0x024 | W | DriverFeaturesSel
> +\item[DriverFeaturesSel (0x024) - W]
>    Activated (guest) features word selection.
>    Writing to this register selects a set of 32 activated feature
>    bits accessible by writing to the DriverFeatures register.
>    Device driver must write a value to the DriverFeaturesSel
>    register before writing to the DriverFeatures register.
>  
> -* 0x030 | W | QueueSel
> +\item[QueueSel (0x030) - W]
>    Virtual queue index (first queue is 0).
>    Writing to this register selects the virtual queue that the
>    following operations on the QueueNumMax, QueueNum, QueueReady,
>    QueueDescLow, QueueDescHigh, QueueAvailLow, QueueAvailHigh,
>    QueueUsedLow and QueueUsedHigh registers apply to.
>  
> -* 0x034 | R | QueueNumMax
> +\item[QueueNumMax (0x034) - R]
>    Maximum virtual queue size.
>    Reading from the register returns the maximum size of the queue
>    the device is ready to process or zero (0x0) if the queue is not
> @@ -1442,7 +1451,7 @@ configuration space. The following list presents their layout:
>    QueueSel and is allowed only when QueueReady is set to zero
>    (0x0), so when the queue is not in use.
>  
> -* 0x038 | W | QueueNum
> +\item[QueueNum (0x038) - W]
>    Virtual queue size.
>    Queue size is the number of elements in the queue, therefore size
>    of the Descriptor Table and both Available and Used rings.
> @@ -1451,7 +1460,7 @@ configuration space. The following list presents their layout:
>    writing to QueueSel and is allowed only when QueueReady is set
>    to zero (0x0), so when the queue is not in use.
>  
> -* 0x03c | RW | QueueReady
> +\item[QueueReady (0x03c) - RW]
>    Virtual queue ready bit.
>    Writing one (0x1) to this register notifies the device that the
>    virtual queue is ready to be used. Reading from this register
> @@ -1461,12 +1470,12 @@ configuration space. The following list presents their layout:
>    zero (0x0) to this register and read the value back to
>    ensure synchronisation.
>  
> -* 0x050 | W | QueueNotify
> +\item[QueueNotify (0x050) - W]
>    Queue notifier.
>    Writing a queue index to this register notifies the device that
>    there are new buffers to process in the queue.
>  
> -* 0x60 | R | InterruptStatus
> +\item[InterruptStatus (0x60) - R]
>    Interrupt status.
>    Reading from this register returns a bit mask of interrupts
>    asserted by the device. An interrupt is asserted if the
> @@ -1480,13 +1489,13 @@ configuration space. The following list presents their layout:
>      This interrupt is asserted when configuration of the device has
>      changed.
>  
> -* 0x064 | W | InterruptACK
> +\item[InterruptACK (0x064) - W]
>    Interrupt acknowledge.
>    Writing to this register notifies the device that the Driver
>    finished handling interrupts. Set bits in the value clear
>    the corresponding bits of the InterruptStatus register.
>  
> -* 0x070 | RW | Status
> +\item[Status (0x070) - RW]
>    Device status.
>    Reading from this register returns the current device status
>    flags.
> @@ -1497,8 +1506,8 @@ configuration space. The following list presents their layout:
>    QueueReady register for all queues in the device.
>    See also p. \ref{sec:Virtio Transport Options / Virtio Over MMIO / MMIO-specific Initialization And Device Operation / Device Initialization}~\nameref{sec:Virtio Transport Options / Virtio Over MMIO / MMIO-specific Initialization And Device Operation / Device Initialization}.
>  
> -* 0x080 | W | QueueDescLow
> -  0x084 | W | QueueDescHigh
> +\item[QueueDescLow (0x080) - W]
> +\item[QueueDescHigh (0x084) - W]
>    Virtual queue's Descriptor Table 64 bit long physical address.
>    Writing to these two registers (lower 32 bits of the address
>    to QueueDescLow, higher 32 bits to QueueDescHigh) notifies
> @@ -1507,8 +1516,8 @@ configuration space. The following list presents their layout:
>    only when QueueReady is set to zero (0x0), so when the queue
>    is not in use.
>  
> -* 0x090 | W | QueueAvailLow
> -  0x094 | W | QueueAvailHigh
> +\item[QueueAvailLow (0x090) - W]
> +\item[QueueAvailHigh (0x094) - W]
>    Virtual queue's Available Ring 64 bit long physical address.
>    Writing to these two registers (lower 32 bits of the address
>    to QueueAvailLow, higher 32 bits to QueueAvailHigh) notifies
> @@ -1517,8 +1526,8 @@ configuration space. The following list presents their layout:
>    only when QueueReady is set to zero (0x0), so when the queue
>    is not in use.
>  
> -* 0x0a0 | W | QueueUsedLow
> -  0x0a4 | W | QueueUsedHigh
> +\item[QueueUsedLow (0x0a0) - W]
> +\item[QueueUsedHigh (0x0a4) - W]
>    Virtual queue's Used Ring 64 bit long physical address.
>    Writing to these two registers (lower 32 bits of the address
>    to QueueUsedLow, higher 32 bits to QueueUsedHigh) notifies
> @@ -1527,17 +1536,18 @@ configuration space. The following list presents their layout:
>    only when QueueReady is set to zero (0x0), so when the queue
>    is not in use.
>  
> -* 0x0fc | R | ConfigGeneration
> +\item[ConfigGeneration (0x0fc) - R]
>    Configuration atomicity value.
>    Changes every time the configuration noticeably changes. This
>    means the device may only change the value after a configuration
>    read operation, but it must change if there is any risk of a
>    device seeing an inconsistent configuration state.
>  
> -* 0x100+ | RW | Config
> +\item[Config (0x100) - RW]
>    Device-specific configuration space starts at an offset 0x100
>    and is accessed with byte alignment. Its meaning and size
>    depends on the device and the driver.
> +\end{description}
>  
>  All register values are organized as Little Endian.
>  
> @@ -1558,35 +1568,37 @@ and if its value is zero (0x0) must abort initialization and
>  must not access any other register.
>  
>  Further initialization must follow the procedure described in
> -p. \ref{sec:General Initialization And Device Operation / Device Initialization}~\nameref{sec:General Initialization And Device Operation / Device Initialization}.
> +\ref{sec:General Initialization And Device Operation / Device Initialization}~\nameref{sec:General Initialization And Device Operation / Device Initialization}.
>  
>  \subsubsection{Virtqueue Configuration}\label{sec:Virtio Transport Options / Virtio Over MMIO / MMIO-specific Initialization And Device Operation / Virtqueue Configuration}
>  
> -1. Select the queue writing its index (first queue is 0) to the
> +\begin{enumerate}
> +\item Select the queue writing its index (first queue is 0) to the
>     QueueSel register.
>  
> -2. Check if the queue is not already in use: read the QueueReady
> +\item Check if the queue is not already in use: read the QueueReady
>     register, returned value should be zero (0x0).
>  
> -3. Read maximum queue size (number of elements) from the
> +\item Read maximum queue size (number of elements) from the
>     QueueNumMax register. If the returned value is zero (0x0) the
>     queue is not available.
>  
> -4. Allocate and zero the queue pages, making sure the memory
> +\item Allocate and zero the queue pages, making sure the memory
>     is physically contiguous. It is recommended to align the
>     Used Ring to an optimal boundary (usually page size).
>     Size of the allocated queue may be smaller than or equal to
>     the maximum size returned by the device.
>  
> -5. Notify the device about the queue size by writing the size to
> +\item Notify the device about the queue size by writing the size to
>     the QueueNum register.
>  
> -6. Write physical addresses of the queue's Descriptor Table,
> +\item Write physical addresses of the queue's Descriptor Table,
>     Available Ring and Used Ring to (respectively) the QueueDescLow/
>     QueueDescHigh, QueueAvailLow/QueueAvailHigh and QueueUsedLow/
>     QueueUsedHigh register pairs.
>  
> -7. Write 0x1 to the QueueReady register.
> +\item Write 0x1 to the QueueReady register.
> +\end{enumerate}
>  
>  \subsubsection{Notifying The Device}\label{sec:Virtio Transport Options / Virtio Over MMIO / MMIO-specific Initialization And Device Operation / Notifying The Device}
>  
> @@ -1718,30 +1730,31 @@ p. \ref{sec:Basic Facilities of a Virtio Device / Virtqueues / Legacy Interfaces
>  with the alignment defined in the QueueAlign register.
>  
>  The virtual queue is configured as follows:
> -
> -1. Select the queue writing its index (first queue is 0) to the
> +\begin{enumerate}
> +\item Select the queue writing its index (first queue is 0) to the
>     QueueSel register.
>  
> -2. Check if the queue is not already in use: read the QueuePFN
> +\item Check if the queue is not already in use: read the QueuePFN
>     register, returned value should be zero (0x0).
>  
> -3. Read maximum queue size (number of elements) from the
> +\item Read maximum queue size (number of elements) from the
>     QueueNumMax register. If the returned value is zero (0x0) the
>     queue is not available.
>  
> -4. Allocate and zero the queue pages in contiguous virtual
> +\item Allocate and zero the queue pages in contiguous virtual
>     memory, aligning the Used Ring to an optimal boundary (usually
>     page size). Size of the allocated queue may be smaller than or
>     equal to the maximum size returned by the device.
>  
> -5. Notify the device about the queue size by writing the size to
> +\item Notify the device about the queue size by writing the size to
>     the QueueNum register.
>  
> -6. Notify the device about the used alignment by writing its value
> +\item Notify the device about the used alignment by writing its value
>     in bytes to the QueueAlign register.
>  
> -7. Write the physical number of the first page of the queue to
> +\item Write the physical number of the first page of the queue to
>     the QueuePFN register.
> +\end{enumerate}
>  
>  Notification mechanisms did not change.
>  
> @@ -1778,23 +1791,23 @@ importantly SENSE ID.
>  For a virtio-ccw proxy device, SENSE ID will return the following
>  information:
>  
> -\begin{verbatim}
> -+-------+--------------------------------------------+
> -| Bytes | Contents                                   |
> -|-------|--------------------------------------------|
> -| 0     | reserved              | 0xff               |
> -|-------|-----------------------|--------------------|
> -| 1-2   | control unit type     | 0x3832             |
> -|-------|-----------------------|--------------------|
> -| 3     | control unit model    | <virtio device id> |
> -|-------|-----------------------|--------------------|
> -| 4-5   | device type           | zeroes (unset)     |
> -|-------|-----------------------|--------------------|
> -| 6     | device model          | zeroes (unset)     |
> -|-------|-----------------------|--------------------|
> -| 7-255 | extended SenseId data | zeroes (unset)     |
> -+-------+--------------------------------------------+
> -\end{verbatim}
> +\begin{tabular}{ |l|l|l| }
> +\hline
> +Bytes & Description & Contents \\
> +\hline \hline
> +0     & reserved              & 0xff \\
> +\hline
> +1-2   & control unit type     & 0x3832 \\
> +\hline
> +3     & control unit model    & <virtio device id> \\
> +\hline
> +4-5   & device type           & zeroes (unset) \\
> +\hline
> +6     & device model          & zeroes (unset) \\
> +\hline
> +7-255 & extended SenseId data & zeroes (unset) \\
> +\hline
> +\end{tabular}
>  
>  A driver for virtio-ccw devices MUST check for a control unit
>  type of 0x3832 and MUST ignore the device type and model.
> @@ -1821,19 +1834,21 @@ virtio:
>  The virtio-ccw device acts like a normal channel device, as specified
>  in \hyperref[intro:S390 PoP]{[S390 PoP]} and \hyperref[intro:S390 Common I/O]{[S390 Common I/O]}. In particular:
>  
> -- A device must post a unit check with command reject for any command
> +\begin{itemize}
> +\item A device must post a unit check with command reject for any command
>    it does not support.
>  
> -- If a driver did not suppress length checks for a channel command,
> +\item If a driver did not suppress length checks for a channel command,
>    the device must present a subchannel status as detailed in the
>    architecture when the actual length did not match the expected length.
>  
> -- If a driver did suppress length checks for a channel command, the
> +\item If a driver did suppress length checks for a channel command, the
>    device must present a check condition if the transmitted data does
>    not contain enough data to process the command. If the driver submitted
>    a buffer that was too long, the device should accept the command.
>    The driver should attempt to provide the correct length even if it
>    suppresses length checks.
> +\end{itemize}
>  
>  \subsection{Device Initialization}\label{sec:Virtio Transport Options / Virtio over channel I/O / Device Initialization}
>  
> @@ -1858,18 +1873,17 @@ data portion and data revision-dependent additional desired options.
>  
>  The following values are supported:
>  
> -\begin{verbatim}
> -+----------+--------+-----------+--------------------------------+
> -| revision | length | data      | remarks                        |
> -|----------|--------|-----------|--------------------------------|
> -| 0        | 0      | <empty>   | legacy interface; transitional |
> -|          |        |           | devices only                   |
> -|----------|--------|-----------|--------------------------------|
> -| 1        | 0      | <empty>   | Virtio 1.0                     |
> -|----------|--------|-----------|--------------------------------|
> -| 2-n      |        |           | reserved for later revisions   |
> -+----------+--------+-----------+--------------------------------+
> -\end{verbatim}
> +\begin{tabular}{ |l|l|l|l| }
> +\hline
> +revision & length & data      & remarks \\
> +\hline \hline
> +0        & 0      & <empty>   & legacy interface; transitional devices only \\
> +\hline
> +1        & 0      & <empty>   & Virtio 1.0 \\
> +\hline
> +2-n      &        &           & reserved for later revisions \\
> +\hline
> +\end{tabular}
>  
>  Note that a change in the virtio standard does not neccessarily
>  correspond to a change in the virtio-ccw revision.
> @@ -1970,11 +1984,11 @@ and align the alignment.
>  The virtqueue is physically contiguous, with padded added to make the
>  used ring meet the align value:
>  
> -\begin{verbatim}
> -+-------------------+-----------------------------------+-----------+
> -| Descriptor Table  |   Available Ring     (padding)    | Used Ring |
> -+-------------------+-----------------------------------+-----------+
> -\end{verbatim}
> +\begin{tabular}{|l|l|l|}
> +\hline
> +Descriptor Table & Available Ring (\ldots padding\ldots) & Used Ring \\
> +\hline
> +\end{tabular}
>  
>  The calculation for total size is as follows:
>  
> @@ -2080,10 +2094,12 @@ guest address of the indicators in a 64 bit value.
>  
>  Indicators for notification via adapter I/O interrupts consist of
>  two stages:
> -- a summary indicator byte covering the virtqueues for one or more
> +\begin{itemize}
> +\item a summary indicator byte covering the virtqueues for one or more
>    virtio-ccw proxy devices
> -- a set of contigous indicator bits for the virtqueues for a
> +\item a set of contigous indicator bits for the virtqueues for a
>    virtio-ccw proxy device
> +\end{itemize}
>  
>  To communicate the location of the summary and queue indicator bits,
>  the driver uses the CCW_CMD_SET_IND_ADAPTER command with the following
> @@ -2172,29 +2188,30 @@ characteristics of channel I/O interact badly with the host block
>  I/O backend). Instead, it uses a diagnose 0x500 call with subcode
>  3 specifying the queue, as follows:
>  
> -\begin{verbatim}
> -+------+-------------------+--------------+
> -| GPR  |   Input Value     | Output Value |
> -+------+-------------------+--------------+
> -+------+-------------------+--------------+
> -|  1   |       0x3         |              |
> -+------+-------------------+--------------+
> -|  2   |  Subchannel ID    | Host Cookie  |
> -+------+-------------------+--------------+
> -|  3   | Virtqueue number  |              |
> -+------+-------------------+--------------+
> -|  4   |   Host Cookie     |              |
> -+------+-------------------+--------------+
> -\end{verbatim}
> +\begin{tabular}{ |l|l|l| }
> +\hline
> +GPR  &   Input Value     & Output Value \\
> +\hline \hline
> +  1   &       0x3         &              \\
> +\hline
> +  2   &  Subchannel ID    & Host Cookie  \\
> +\hline
> +  3   & Virtqueue number  &              \\
> +\hline
> +  4   &   Host Cookie     &              \\
> +\hline
> +\end{tabular}
>  
>  Host cookie is an optional per-virtqueue 64 bit value that can be
>  used by the hypervisor to speed up the notification execution.
>  For each notification, the output value is returned in GPR2 and
>  should be passed in GPR4 for the next notification:
>  
> +\begin{lstlisting}
>          info->cookie = do_notify(schid,
>                                   virtqueue_get_queue_index(vq),
>                                   info->cookie);
> +\end{lstlisting}
>  
>  \subsubsection{Early printk for Virtio Consoles}\label{sec:Virtio Transport Options / Virtio over channel I/O / Device Operation / Early printk for Virtio Consoles}
>  
> @@ -2218,38 +2235,37 @@ defined in this standard.
>  
>  Discovering what devices are available and their type is bus-dependent.
>  
> -\begin{verbatim}
> -+------------+--------------------+
> -| Device ID  |   Virtio Device    |
> -+------------+--------------------+
> -+------------+--------------------+
> -| 0          | reserved (invalid) |
> -+------------+--------------------+
> -| 1          |   network card     |
> -+------------+--------------------+
> -| 2          |   block device     |
> -+------------+--------------------+
> -| 3          |      console       |
> -+------------+--------------------+
> -| 4          |  entropy source    |
> -+------------+--------------------+
> -| 5          | memory ballooning  |
> -+------------+--------------------+
> -| 6          |     ioMemory       |
> -+------------+--------------------+
> -| 7          |       rpmsg        |
> -+------------+--------------------+
> -| 8          |     SCSI host      |
> -+------------+--------------------+
> -| 9          |   9P transport     |
> -+------------+--------------------+
> -| 10         |   mac80211 wlan    |
> -+------------+--------------------+
> -| 11         |   rproc serial     |
> -+------------+--------------------+
> -| 12         |   virtio CAIF      |
> -+------------+--------------------+
> -\end{verbatim}
> +\begin{tabular} { |l|c| }
> +\hline
> +Device ID  &  Virtio Device    \\
> +\hline \hline
> +0          & reserved (invalid) \\
> +\hline
> +1          &   network card     \\
> +\hline
> +2          &   block device     \\
> +\hline
> +3          &      console       \\
> +\hline
> +4          &  entropy source    \\
> +\hline
> +5          & memory ballooning  \\
> +\hline
> +6          &     ioMemory       \\
> +\hline
> +7          &       rpmsg        \\
> +\hline
> +8          &     SCSI host      \\
> +\hline
> +9          &   9P transport     \\
> +\hline
> +10         &   mac80211 wlan    \\
> +\hline
> +11         &   rproc serial     \\
> +\hline
> +12         &   virtio CAIF      \\
> +\hline
> +\end{tabular}
>  
>  \section{Network Device}\label{sec:Device Types / Network Device}
>  
> @@ -2268,53 +2284,61 @@ features.
>  
>  \subsection{Virtqueues}\label{sec:Device Types / Network Device / Virtqueues}
>  
> - 0:receiveq. 1:transmitq. 2:controlq
> +\begin{description}
> +\item[0] receiveq
> +\item[1] transmitq
> +\item[2] controlq
> +\end{description}
>  
>   Virtqueue 2 only exists if VIRTIO_NET_F_CTRL_VQ set.
>  
>  \subsection{Feature bits}\label{sec:Device Types / Network Device / Feature bits}
>  
> -  VIRTIO_NET_F_CSUM (0) Device handles packets with partial checksum
> +\begin{description}
> +\item[VIRTIO_NET_F_CSUM (0)] Device handles packets with partial checksum
>  
> -  VIRTIO_NET_F_GUEST_CSUM (1) Driver handles packets with partial checksum
> +\item[VIRTIO_NET_F_GUEST_CSUM (1)] Driver handles packets with partial checksum
>  
> -  VIRTIO_NET_F_CTRL_GUEST_OFFLOADS (2) Control channel offloads
> +\item[VIRTIO_NET_F_CTRL_GUEST_OFFLOADS (2)] Control channel offloads
>          reconfiguration support.
>  
> -  VIRTIO_NET_F_MAC (5) Device has given MAC address.
> +\item[VIRTIO_NET_F_MAC (5)] Device has given MAC address.
>  
> -  VIRTIO_NET_F_GUEST_TSO4 (7) Driver can receive TSOv4.
> +\item[VIRTIO_NET_F_GUEST_TSO4 (7)] Driver can receive TSOv4.
>  
> -  VIRTIO_NET_F_GUEST_TSO6 (8) Driver can receive TSOv6.
> +\item[VIRTIO_NET_F_GUEST_TSO6 (8)] Driver can receive TSOv6.
>  
> -  VIRTIO_NET_F_GUEST_ECN (9) Driver can receive TSO with ECN.
> +\item[VIRTIO_NET_F_GUEST_ECN (9)] Driver can receive TSO with ECN.
>  
> -  VIRTIO_NET_F_GUEST_UFO (10) Driver can receive UFO.
> +\item[VIRTIO_NET_F_GUEST_UFO (10)] Driver can receive UFO.
>  
> -  VIRTIO_NET_F_HOST_TSO4 (11) Device can receive TSOv4.
> +\item[VIRTIO_NET_F_HOST_TSO4 (11)] Device can receive TSOv4.
>  
> -  VIRTIO_NET_F_HOST_TSO6 (12) Device can receive TSOv6.
> +\item[VIRTIO_NET_F_HOST_TSO6 (12)] Device can receive TSOv6.
>  
> -  VIRTIO_NET_F_HOST_ECN (13) Device can receive TSO with ECN.
> +\item[VIRTIO_NET_F_HOST_ECN (13)] Device can receive TSO with ECN.
>  
> -  VIRTIO_NET_F_HOST_UFO (14) Device can receive UFO.
> +\item[VIRTIO_NET_F_HOST_UFO (14)] Device can receive UFO.
>  
> -  VIRTIO_NET_F_MRG_RXBUF (15) Driver can merge receive buffers.
> +\item[VIRTIO_NET_F_MRG_RXBUF (15)] Driver can merge receive buffers.
>  
> -  VIRTIO_NET_F_STATUS (16) Configuration status field is
> +\item[VIRTIO_NET_F_STATUS (16)] Configuration status field is
>      available.
>  
> -  VIRTIO_NET_F_CTRL_VQ (17) Control channel is available.
> +\item[VIRTIO_NET_F_CTRL_VQ (17)] Control channel is available.
>  
> -  VIRTIO_NET_F_CTRL_RX (18) Control channel RX mode support.
> +\item[VIRTIO_NET_F_CTRL_RX (18)] Control channel RX mode support.
>  
> -  VIRTIO_NET_F_CTRL_VLAN (19) Control channel VLAN filtering.
> +\item[VIRTIO_NET_F_CTRL_VLAN (19)] Control channel VLAN filtering.
>  
> -  VIRTIO_NET_F_GUEST_ANNOUNCE(21) Driver can send gratuitous
> +\item[VIRTIO_NET_F_GUEST_ANNOUNCE(21)] Driver can send gratuitous
>      packets.
> +\end{description}
>  
>  \subsubsection{Legacy Interface: Feature bits}\label{sec:Device Types / Network Device / Feature bits / Legacy Interface: Feature bits}
> -VIRTIO_NET_F_GSO (6) Device handles packets with any GSO type.
> +\begin{description}
> +\item[VIRTIO_NET_F_GSO (6)] Device handles packets with any GSO type.
> +\end{description}
>  
>  This was supposed to indicate segmentation offload support, but
>  upon further investigation it became clear that multiple bits
> @@ -2345,32 +2369,32 @@ native endian of the guest rather than (necessarily) little-endian.
>  
>  \subsection{Device Initialization}\label{sec:Device Types / Network Device / Device Initialization}
>  
> -1. The initialization routine should identify the receive and
> +\begin{enumerate}
> +\item The initialization routine should identify the receive and
>    transmission virtqueues.
>  
> -2. If the VIRTIO_NET_F_MAC feature bit is set, the configuration
> +\item If the VIRTIO_NET_F_MAC feature bit is set, the configuration
>    space “mac” entry indicates the “physical” address of the the
>    network card, otherwise a private MAC address should be
>    assigned. All drivers are expected to negotiate this feature if
>    it is set.
>  
> -3. If the VIRTIO_NET_F_CTRL_VQ feature bit is negotiated,
> +\item If the VIRTIO_NET_F_CTRL_VQ feature bit is negotiated,
>    identify the control virtqueue.
>  
> -4. If the VIRTIO_NET_F_STATUS feature bit is negotiated, the link
> +\item If the VIRTIO_NET_F_STATUS feature bit is negotiated, the link
>    status can be read from the bottom bit of the “status” config
>    field. Otherwise, the link should be assumed active.
>  
> -5. The receive virtqueue should be filled with receive buffers.
> +\item The receive virtqueue should be filled with receive buffers.
>    This is described in detail below in “Setting Up Receive
>    Buffers”.
>  
> -6. A driver can indicate that it will generate checksumless
> -  packets by negotating the VIRTIO_NET_F_CSUM feature. This “
> -  checksum offload” is a common feature on modern network cards.
> +\item A driver can indicate that it will generate checksumless
> +  packets by negotating the VIRTIO_NET_F_CSUM feature. This 
> +  “checksum offload” is a common feature on modern network cards.
>  
> -7. If that feature is negotiated
> -\footnote{ie. VIRTIO_NET_F_HOST_TSO* and VIRTIO_NET_F_HOST_UFO are
> +\item If that feature is negotiated\footnote{ie. VIRTIO_NET_F_HOST_TSO* and VIRTIO_NET_F_HOST_UFO are
>  dependent on VIRTIO_NET_F_CSUM; a dvice which offers the offload
>  features must offer the checksum feature, and a driver which
>  accepts the offload features must accept the checksum feature.
> @@ -2382,13 +2406,11 @@ depending on VIRTIO_NET_F_GUEST_CSUM.
>    (UDP fragmentation) features. It should not send TCP packets
>    requiring segmentation offload which have the Explicit Congestion
>    Notification bit set, unless the VIRTIO_NET_F_HOST_ECN feature is
> -  negotiated.
> -\footnote{This is a common restriction in real, older network cards.
> +  negotiated.\footnote{This is a common restriction in real, older network cards.
>  }
>  
> -8. The converse features are also available: a driver can save
> -  the virtual device some work by negotiating these features.
> -\footnote{For example, a network packet transported between two guests on
> +\item The converse features are also available: a driver can save
> +  the virtual device some work by negotiating these features.\footnote{For example, a network packet transported between two guests on
>  the same system may not require checksumming at all, nor segmentation,
>  if both guests are amenable.
>  }
> @@ -2398,6 +2420,7 @@ if both guests are amenable.
>    VIRTIO_NET_F_GUEST_UFO and VIRTIO_NET_F_GUEST_ECN are the input
>    equivalents of the features described above.
>    See \ref{sec:Device Types / Network Device / Device Operation / Setting Up Receive Buffers}~\nameref{sec:Device Types / Network Device / Device Operation / Setting Up Receive Buffers} and \ref{sec:Device Types / Network Device / Device Operation / Setting Up Receive Buffers}~\nameref{sec:Device Types / Network Device / Device Operation / Setting Up Receive Buffers} below.
> +\end{enumerate}
>  
>  \subsection{Device Operation}\label{sec:Device Types / Network Device / Device Operation}
>  
> @@ -2436,19 +2459,22 @@ native endian of the guest rather than (necessarily) little-endian.
>  Transmitting a single packet is simple, but varies depending on
>  the different features the driver negotiated.
>  
> -1. If the driver negotiated VIRTIO_NET_F_CSUM, and the packet has
> +\begin{enumerate}
> +\item If the driver negotiated VIRTIO_NET_F_CSUM, and the packet has
>    not been fully checksummed, then the virtio_net_hdr's fields
>    are set as follows. Otherwise, the packet must be fully
>    checksummed, and flags is zero.
> +  \begin{itemize}
> +  \item flags has the VIRTIO_NET_HDR_F_NEEDS_CSUM set,
>  
> -  • flags has the VIRTIO_NET_HDR_F_NEEDS_CSUM set,
> -
> -  • csum_start is set to the offset within the packet to begin checksumming,
> +  \item csum_start is set to the offset within the packet to begin checksumming,
>      and
>  
> -  • csum_offset indicates how many bytes after the csum_start the
> +  \item csum_offset indicates how many bytes after the csum_start the
>      new (16 bit ones' complement) checksum should be placed.
> -\footnote{For example, consider a partially checksummed TCP (IPv4) packet.
> +  \end{itemize}
> +
> +For example, consider a partially checksummed TCP (IPv4) packet.
>  It will have a 14 byte ethernet header and 20 byte IP header
>  followed by the TCP header (with the TCP checksum field 16 bytes
>  into that header). csum_start will be 14+20 = 34 (the TCP
> @@ -2457,9 +2483,8 @@ value in the TCP checksum field should be initialized to the sum
>  of the TCP pseudo header, so that replacing it by the ones'
>  complement checksum of the TCP header and body will give the
>  correct result.
> -}
>  
> -2. If the driver negotiated
> +\item If the driver negotiated
>    VIRTIO_NET_F_HOST_TSO4, TSO6 or UFO, and the packet requires
>    TCP segmentation or UDP fragmentation, then the “gso_type”
>    field is set to VIRTIO_NET_HDR_GSO_TCPV4, TCPV6 or UDP.
> @@ -2468,32 +2493,32 @@ correct result.
>    metadata indicates how to replicate the packet header to cut it
>    into smaller packets. The other gso fields are set:
>  
> -  • hdr_len is a hint to the device as to how much of the header
> +  \begin{itemize}
> +  \item hdr_len is a hint to the device as to how much of the header
>      needs to be kept to copy into each packet, usually set to the
> -    length of the headers, including the transport header.
> -\footnote{Due to various bugs in implementations, this field is not useful
> +    length of the headers, including the transport header.\footnote{Due to various bugs in implementations, this field is not useful
>  as a guarantee of the transport header size.
>  }
>  
> -  • gso_size is the maximum size of each packet beyond that
> +  \item gso_size is the maximum size of each packet beyond that
>      header (ie. MSS).
>  
> -  • If the driver negotiated the VIRTIO_NET_F_HOST_ECN feature,
> +  \item If the driver negotiated the VIRTIO_NET_F_HOST_ECN feature,
>      the VIRTIO_NET_HDR_GSO_ECN bit may be set in “gso_type” as
> -    well, indicating that the TCP packet has the ECN bit set.
> -\footnote{This case is not handled by some older hardware, so is called out
> +    well, indicating that the TCP packet has the ECN bit set.\footnote{This case is not handled by some older hardware, so is called out
>  specifically in the protocol.
>  }
> +   \end{itemize}
>  
> -3. If the driver negotiated the VIRTIO_NET_F_MRG_RXBUF feature,
> +\item If the driver negotiated the VIRTIO_NET_F_MRG_RXBUF feature,
>    the num_buffers field is set to zero.
>  
> -4. The header and packet are added as one output buffer to the
> +\item The header and packet are added as one output buffer to the
>    transmitq, and the device is notified of the new entry
> -  (see \ref{sec:Device Types / Network Device / Device Initialization}~\nameref{sec:Device Types / Network Device / Device Initialization}).
> -\footnote{Note that the header will be two bytes longer for the
> +  (see \ref{sec:Device Types / Network Device / Device Initialization}~\nameref{sec:Device Types / Network Device / Device Initialization}).\footnote{Note that the header will be two bytes longer for the
>  VIRTIO_NET_F_MRG_RXBUF case.
>  }
> +\end{enumerate}
>  
>  \paragraph{Packet Transmission Interrupt}\label{sec:Device Types / Network Device / Device Operation / Packet Transmission / Packet Transmission Interrupt}
>  
> @@ -2518,8 +2543,7 @@ VIRTIO_NET_F_GUEST_UFO features are used, the Driver will need to
>  accept packets of up to 65550 bytes long (the maximum size of a
>  TCP or UDP packet, plus the 14 byte ethernet header), otherwise
>  1514. bytes. So unless VIRTIO_NET_F_MRG_RXBUF is negotiated, every
> -buffer in the receive queue needs to be at least this length 
> -\footnote{Obviously each one can be split across multiple descriptor
> +buffer in the receive queue needs to be at least this length.\footnote{Obviously each one can be split across multiple descriptor
>  elements.
>  }
>  
> @@ -2530,12 +2554,13 @@ least the size of the struct virtio_net_hdr.
>  
>  When a packet is copied into a buffer in the receiveq, the
>  optimal path is to disable further interrupts for the receiveq
> -(see 2.2.2.2. Receiving Used Buffers From The Device) and process
> +(see \ref{sec:General Initialization And Device Operation / Device Operation / Receiving Used Buffers From The Device}~\nameref{sec:General Initialization And Device Operation / Device Operation / Receiving Used Buffers From The Device}) and process
>  packets until no more are found, then re-enable them.
>  
>  Processing packet involves:
>  
> -1. If the driver negotiated the VIRTIO_NET_F_MRG_RXBUF feature,
> +\begin{enumerate}
> +\item If the driver negotiated the VIRTIO_NET_F_MRG_RXBUF feature,
>    then the “num_buffers” field indicates how many descriptors
>    this packet is spread over (including this one). This allows
>    receipt of large packets without having to allocate large
> @@ -2544,21 +2569,22 @@ Processing packet involves:
>    single packet. The other buffers will not begin with a struct
>    virtio_net_hdr.
>  
> -2. If the VIRTIO_NET_F_MRG_RXBUF feature was not negotiated, or
> +\item If the VIRTIO_NET_F_MRG_RXBUF feature was not negotiated, or
>    the “num_buffers” field is one, then the entire packet will be
>    contained within this buffer, immediately following the struct
>    virtio_net_hdr.
>  
> -3. If the VIRTIO_NET_F_GUEST_CSUM feature was negotiated, the
> +\item If the VIRTIO_NET_F_GUEST_CSUM feature was negotiated, the
>    VIRTIO_NET_HDR_F_NEEDS_CSUM bit in the “flags” field may be
>    set: if so, the checksum on the packet is incomplete and the “
>    csum_start” and “csum_offset” fields indicate how to calculate
>    it (see Packet Transmission point 1).
>  
> -4. If the VIRTIO_NET_F_GUEST_TSO4, TSO6 or UFO options were
> +\item If the VIRTIO_NET_F_GUEST_TSO4, TSO6 or UFO options were
>    negotiated, then the “gso_type” may be something other than
>    VIRTIO_NET_HDR_GSO_NONE, and the “gso_size” field indicates the
>    desired MSS (see Packet Transmission point 2).
> +\end{enumerate}
>  
>  \subsubsection{Control Virtqueue}\label{sec:Device Types / Network Device / Device Operation / Control Virtqueue}
>  
> @@ -2596,7 +2622,7 @@ and filtering of MAC addresses.
>  Note that in general, these commands are best-effort: unwanted
>  packets may still arrive.
>  
> -Setting Promiscuous Mode
> +\paragraph{Setting Promiscuous Mode}\label{sec:Device Types / Network Device / Device Operation / Control Virtqueue / Setting Promiscuous Mode}
>  
>  \begin{lstlisting}
>  	#define VIRTIO_NET_CTRL_RX    0
> @@ -2623,8 +2649,7 @@ off. The command-specific-data is one byte containing 0 (off) or
>  \end{lstlisting}
>  
>  The device can filter incoming packets by any number of destination
> -MAC addresses.
> -\footnote{Since there are no guarentees, it can use a hash filter or
> +MAC addresses.\footnote{Since there are no guarentees, it can use a hash filter or
>  silently switch to allmulti or promiscuous mode if it is given too
>  many addresses.
>  } This table is set using the class
> @@ -2679,12 +2704,14 @@ this command.
>  
>  Processing this notification involves:
>  
> -1. Sending the gratuitous packets or marking there are pending
> +\begin{enumerate}
> +\item Sending the gratuitous packets or marking there are pending
>    gratuitous packets to be sent and letting deferred routine to
>    send them.
>  
> -2. Sending VIRTIO_NET_CTRL_ANNOUNCE_ACK command through control
> +\item Sending VIRTIO_NET_CTRL_ANNOUNCE_ACK command through control
>    vq.
> +\end{enumerate}
>  
>  \paragraph{Offloads State Configuration}\label{sec:Device Types / Network Device / Device Operation / Control Virtqueue / Offloads State Configuration}
>  
> @@ -2736,35 +2763,42 @@ device except where noted.
>    2
>  
>  \subsection{Virtqueues}\label{sec:Device Types / Block Device / Virtqueues}
> -  0:requestq
> +\begin{description}
> +\item[0] requestq
> +\end{description}
>  
>  \subsection{Feature bits}\label{sec:Device Types / Block Device / Feature bits}
>  
> -  VIRTIO_BLK_F_SIZE_MAX (1) Maximum size of any single segment is
> +\begin{description}
> +\item[VIRTIO_BLK_F_SIZE_MAX (1)] Maximum size of any single segment is
>      in “size_max”.
>  
> -  VIRTIO_BLK_F_SEG_MAX (2) Maximum number of segments in a
> +\item[VIRTIO_BLK_F_SEG_MAX (2)] Maximum number of segments in a
>      request is in “seg_max”.
>  
> -  VIRTIO_BLK_F_GEOMETRY (4) Disk-style geometry specified in “
> +\item[VIRTIO_BLK_F_GEOMETRY (4)] Disk-style geometry specified in “
>      geometry”.
>  
> -  VIRTIO_BLK_F_RO (5) Device is read-only.
> +\item[VIRTIO_BLK_F_RO (5)] Device is read-only.
>  
> -  VIRTIO_BLK_F_BLK_SIZE (6) Block size of disk is in “blk_size”.
> +\item[VIRTIO_BLK_F_BLK_SIZE (6)] Block size of disk is in “blk_size”.
>  
> -  VIRTIO_BLK_F_TOPOLOGY (10) Device exports information on optimal I/O
> +\item[VIRTIO_BLK_F_TOPOLOGY (10)] Device exports information on optimal I/O
>      alignment.
> +\end{description}
>  
>  \subsubsection{Legacy Interface: Feature bits}\label{sec:Device Types / Block Device / Feature bits / Legacy Interface: Feature bits}
> -  VIRTIO_BLK_F_BARRIER (0) Device supports request barriers.
>  
> -  VIRTIO_BLK_F_SCSI (7) Device supports scsi packet commands.
> +\begin{description}
> +\item[VIRTIO_BLK_F_BARRIER (0)] Device supports request barriers.
> +
> +\item[VIRTIO_BLK_F_SCSI (7)] Device supports scsi packet commands.
>  
> -  VIRTIO_BLK_F_FLUSH (9) Cache flush command support.
> +\item[VIRTIO_BLK_F_FLUSH (9)] Cache flush command support.
>  
> -  VIRTIO_BLK_F_CONFIG_WCE (11) Device can toggle its cache between writeback
> +\item[VIRTIO_BLK_F_CONFIG_WCE (11)] Device can toggle its cache between writeback
>      and writethrough modes.
> +\end{description}
>  
>  VIRTIO_BLK_F_FLUSH was also called VIRTIO_BLK_F_WCE: Legacy drivers
>  should only negotiate this feature if they are capable of sending
> @@ -2809,23 +2843,25 @@ native endian of the guest rather than (necessarily) little-endian.
>  
>  \subsection{Device Initialization}\label{sec:Device Types / Block Device / Device Initialization}
>  
> -1. The device size should be read from the “capacity”
> +\begin{enumerate}
> +\item The device size should be read from the “capacity”
>    configuration field. No requests should be submitted which goes
>    beyond this limit.
>  
> -2. If the VIRTIO_BLK_F_BLK_SIZE feature is negotiated, the
> +\item If the VIRTIO_BLK_F_BLK_SIZE feature is negotiated, the
>    blk_size field can be read to determine the optimal sector size
>    for the driver to use. This does not affect the units used in
>    the protocol (always 512 bytes), but awareness of the correct
>    value can affect performance.
>  
> -3. If the VIRTIO_BLK_F_RO feature is set by the device, any write
> +\item If the VIRTIO_BLK_F_RO feature is set by the device, any write
>    requests will fail.
>  
> -4. If the VIRTIO_BLK_F_TOPOLOGY feature is negotiated, the fields in the
> +\item If the VIRTIO_BLK_F_TOPOLOGY feature is negotiated, the fields in the
>    topology struct can be read to determine the physical block size and optimal
>    I/O lengths for the driver to use. This also does not affect the units
>    in the protocol, only performance.
> +\end{enumerate}
>  
>  \subsubsection{Legacy Interface: Device Initialization}\label{sec:Device Types / Block Device / Device Initialization / Legacy Interface: Device Initialization}
>  
> @@ -2858,8 +2894,7 @@ the device (not necessarily in order). Each request is of form:
>  
>  The type of the request is either a read (VIRTIO_BLK_T_IN), a write
>  (VIRTIO_BLK_T_OUT), or a flush (VIRTIO_BLK_T_FLUSH or
> -VIRTIO_BLK_T_FLUSH_OUT
> -\footnote{The FLUSH and FLUSH_OUT types are equivalent, the device does not
> +VIRTIO_BLK_T_FLUSH_OUT\footnote{The FLUSH and FLUSH_OUT types are equivalent, the device does not
>  distinguish between them
>  }).
>  
> @@ -2994,8 +3029,15 @@ data and outgoing characters are placed in the transmit queue.
>  
>  \subsection{Virtqueues}\label{sec:Device Types / Console Device / Virtqueues}
>  
> -   0:receiveq(port0). 1:transmitq(port0), 2:control receiveq, 3:control transmitq, 4:receiveq(port1), 5:transmitq(port1),
> -  ...
> +\begin{description}
> +\item[0] receiveq(port0)
> +\item[1] transmitq(port0)
> +\item[2] control receiveq
> +\item[3] control transmitq
> +\item[4] receiveq(port1)
> +\item[5] transmitq(port1)
> +\item[\ldots]
> +\end{description}
>  
>    Ports 2 onwards only exist if VIRTIO_CONSOLE_F_MULTIPORT is set.
>  
> @@ -3030,10 +3072,11 @@ native endian of the guest rather than (necessarily) little-endian.
>  
>  \subsection{Device Initialization}\label{sec:Device Types / Console Device / Device Initialization}
>  
> -1. If the VIRTIO_CONSOLE_F_SIZE feature is negotiated, the driver
> +\begin{enumerate}
> +\item If the VIRTIO_CONSOLE_F_SIZE feature is negotiated, the driver
>    can read the console dimensions from the configuration fields.
>  
> -2. If the VIRTIO_CONSOLE_F_MULTIPORT feature is negotiated, the
> +\item If the VIRTIO_CONSOLE_F_MULTIPORT feature is negotiated, the
>    driver can spawn multiple ports, not all of which may be
>    attached to a console. Some could be generic ports. In this
>    case, the control virtqueues are enabled and according to the
> @@ -3046,14 +3089,15 @@ native endian of the guest rather than (necessarily) little-endian.
>    for that port so the device can let us know of any additional
>    configuration options set for that port.
>  
> -3. The receiveq for each port is populated with one or more
> +\item The receiveq for each port is populated with one or more
>    receive buffers.
> +\end{enumerate}
>  
>  \subsection{Device Operation}\label{sec:Device Types / Console Device / Device Operation}
>  
> -1. For output, a buffer containing the characters is placed in
> -  the port's transmitq.
> -\footnote{Because this is high importance and low bandwidth, the current
> +\begin{enumerate}
> +\item For output, a buffer containing the characters is placed in
> +  the port's transmitq.\footnote{Because this is high importance and low bandwidth, the current
>  Linux implementation polls for the buffer to be used, rather than
>  waiting for an interrupt, simplifying the implementation
>  significantly. However, for generic serial ports with the
> @@ -3062,25 +3106,25 @@ consumed buffers are freed upon the next write or poll call or
>  when a port is closed or hot-unplugged.
>  }
>  
> -2. When a buffer is used in the receiveq (signalled by an
> +\item When a buffer is used in the receiveq (signalled by an
>    interrupt), the contents is the input to the port associated
>    with the virtqueue for which the notification was received.
>  
> -3. If the driver negotiated the VIRTIO_CONSOLE_F_SIZE feature, a
> +\item If the driver negotiated the VIRTIO_CONSOLE_F_SIZE feature, a
>    configuration change interrupt may occur. The updated size can
>    be read from the configuration fields.
>  
> -4. If the driver negotiated the VIRTIO_CONSOLE_F_MULTIPORT
> +\item If the driver negotiated the VIRTIO_CONSOLE_F_MULTIPORT
>    feature, active ports are announced by the device using the
>    VIRTIO_CONSOLE_PORT_ADD control message. The same message is
>    used for port hot-plug as well.
>  
> -5. If the device specified a port `name', a sysfs attribute is
> +\item If the device specified a port `name', a sysfs attribute is
>    created with the name filled in, so that udev rules can be
>    written that can create a symlink from the port's name to the
>    char device for port discovery by applications in the driver.
>  
> -6. Changes to ports' state are effected by control messages.
> +\item Changes to ports' state are effected by control messages.
>    Appropriate action is taken on the port indicated in the
>    control message. The layout of the structure of the control
>    buffer and the events associated are:
> @@ -3102,6 +3146,7 @@ when a port is closed or hot-unplugged.
>  	#define VIRTIO_CONSOLE_PORT_OPEN        6
>  	#define VIRTIO_CONSOLE_PORT_NAME        7
>  \end{lstlisting}
> +\end{enumerate}
>  
>  \subsubsection{Legacy Interface: Device Operation}\label{sec:Device Types / Console Device / Device Operation / Legacy Interface: Device Operation}
>  For legacy devices, the fields in struct virtio_console_control are the
> @@ -3117,7 +3162,9 @@ guest use.
>    4
>  
>  \subsection{Virtqueues}\label{sec:Device Types / Entropy Device / Virtqueues}
> -  0:requestq.
> +\begin{description}
> +\item[0] requestq
> +\end{description}
>  
>  \subsection{Feature bits}\label{sec:Device Types / Entropy Device / Feature bits}
>    None currently defined
> @@ -3127,7 +3174,9 @@ guest use.
>  
>  \subsection{Device Initialization}\label{sec:Device Types / Entropy Device / Device Initialization}
>  
> -1. The virtqueue is initialized
> +\begin{enumerate}
> +\item The virtqueue is initialized
> +\end{enumerate}
>  
>  \subsection{Device Operation}\label{sec:Device Types / Entropy Device / Device Operation}
>  
> @@ -3149,16 +3198,22 @@ guest memory statistics to the host.
>    5
>  
>  \subsection{Virtqueues}\label{sec:Device Types / Memory Balloon Device / Virtqueues}
> -  0:inflateq. 1:deflateq. 2:statsq.
> +\begin{description}
> +\item[0] inflateq
> +\item[1] deflateq
> +\item[2] statsq.
> +\end{description}
>  
>    Virtqueue 2 only exists if VIRTIO_BALLON_F_STATS_VQ set.
>  
>  \subsection{Feature bits}\label{sec:Device Types / Memory Balloon Device / Feature bits}
> -  VIRTIO_BALLOON_F_MUST_TELL_HOST (0) Host must be told before
> +\begin{description}
> +\item[VIRTIO_BALLOON_F_MUST_TELL_HOST (0)] Host must be told before
>      pages from the balloon are used.
>  
> -  VIRTIO_BALLOON_F_STATS_VQ (1) A virtqueue for reporting guest
> +\item[VIRTIO_BALLOON_F_STATS_VQ (1)] A virtqueue for reporting guest
>      memory statistics is present.
> +\end{description}
>  
>  \subsection{Device configuration layout}\label{sec:Device Types / Memory Balloon Device / Device configuration layout}
>    Both fields of this configuration
> @@ -3177,58 +3232,62 @@ that legacy device fields are guest endian.
>  
>  \subsection{Device Initialization}\label{sec:Device Types / Memory Balloon Device / Device Initialization}
>  
> -1. The inflate and deflate virtqueues are identified.
> -
> -2. If the VIRTIO_BALLOON_F_STATS_VQ feature bit is negotiated:
> +\begin{enumerate}
> +\item The inflate and deflate virtqueues are identified.
>  
> -  (a) Identify the stats virtqueue.
> +\item If the VIRTIO_BALLOON_F_STATS_VQ feature bit is negotiated:
> +  \begin{enumerate}
> +  \item Identify the stats virtqueue.
>  
> -  (b) Add one empty buffer to the stats virtqueue and notify the
> +  \item Add one empty buffer to the stats virtqueue and notify the
>      device.
> +  \end{enumerate}
> +\end{enumerate}
>  
>  Device operation begins immediately.
>  
>  \subsection{Device Operation}\label{sec:Device Types / Memory Balloon Device / Device Operation}
>  
> -Memory Ballooning The device is driven by the receipt of a
> +The device is driven by the receipt of a
>  configuration change interrupt.
>  
> -1. The “num_pages” configuration field is examined. If this is
> +\begin{enumerate}
> +\item The “num_pages” configuration field is examined. If this is
>    greater than the “actual” number of pages, memory must be given
>    to the balloon. If it is less than the “actual” number of
>    pages, memory may be taken back from the balloon for general
>    use.
>  
> -2. To supply memory to the balloon (aka. inflate):
> -
> -  (a) The driver constructs an array of addresses of unused memory
> -    pages. These addresses are divided by 4096
> -\footnote{This is historical, and independent of the guest page size
> +\item To supply memory to the balloon (aka. inflate):
> +  \begin{enumerate}
> +  \item The driver constructs an array of addresses of unused memory
> +    pages. These addresses are divided by 4096\footnote{This is historical, and independent of the guest page size
>  } and the descriptor
>      describing the resulting 32-bit array is added to the inflateq.
> +  \end{enumerate}
>  
> -3. To remove memory from the balloon (aka. deflate):
> -
> -  (a) The driver constructs an array of addresses of memory pages
> +\item To remove memory from the balloon (aka. deflate):
> +  \begin{enumerate}
> +  \item The driver constructs an array of addresses of memory pages
>      it has previously given to the balloon, as described above.
>      This descriptor is added to the deflateq.
>  
> -  (b) If the VIRTIO_BALLOON_F_MUST_TELL_HOST feature is negotiated, the
> +  \item If the VIRTIO_BALLOON_F_MUST_TELL_HOST feature is negotiated, the
>      guest may not use these requested pages until that descriptor
>      in the deflateq has been used by the device.
>  
> -  (c) Otherwise, the guest may begin to re-use pages previously
> +  \item Otherwise, the guest may begin to re-use pages previously
>      given to the balloon before the device has acknowledged their
> -    withdrawl. 
> -\footnote{In this case, deflation advice is merely a courtesy
> +    withdrawl.\footnote{In this case, deflation advice is merely a courtesy
>  }
> +  \end{enumerate}
>  
> -4. In either case, once the device has completed the inflation or
> +\item In either case, once the device has completed the inflation or
>    deflation, the “actual” field of the configuration should be
> -  updated to reflect the new number of pages in the balloon.
> -\footnote{As updates to configuration space are not atomic, this field
> +  updated to reflect the new number of pages in the balloon.\footnote{As updates to configuration space are not atomic, this field
>  isn't particularly reliable, but can be used to diagnose buggy guests.
>  }
> +\end{enumerate}
>  
>  \subsubsection{Memory Statistics}\label{sec:Device Types / Memory Balloon Device / Device Operation / Memory Statistics}
>  
> @@ -3238,21 +3297,23 @@ driver initialization time when the driver adds an empty buffer
>  and notifies the device. A request for memory statistics proceeds
>  as follows:
>  
> -1. The device pushes the buffer onto the used ring and sends an
> +\begin{enumerate}
> +\item The device pushes the buffer onto the used ring and sends an
>    interrupt.
>  
> -2. The driver pops the used buffer and discards it.
> +\item The driver pops the used buffer and discards it.
>  
> -3. The driver collects memory statistics and writes them into a
> +\item The driver collects memory statistics and writes them into a
>    new buffer.
>  
> -4. The driver adds the buffer to the virtqueue and notifies the
> +\item The driver adds the buffer to the virtqueue and notifies the
>    device.
>  
> -5. The device pops the buffer (retaining it to initiate a
> +\item The device pops the buffer (retaining it to initiate a
>    subsequent request) and consumes the statistics.
> +\end{enumerate}
>  
> -  Memory Statistics Format Each statistic consists of a 16 bit
> +  Each statistic consists of a 16 bit
>    tag and a 64 bit value. All statistics are optional and the
>    driver may choose which ones to supply. To guarantee backwards
>    compatibility, unsupported statistics should be omitted.
> @@ -3277,24 +3338,25 @@ native endian of the guest rather than (necessarily) little-endian.
>  
>  \subsubsection{Memory Statistics Tags}\label{sec:Device Types / Memory Balloon Device / Device Operation / Memory Statistics Tags}
>  
> -  VIRTIO_BALLOON_S_SWAP_IN The amount of memory that has been
> +\begin{description}
> +\item[VIRTIO_BALLOON_S_SWAP_IN (0)] The amount of memory that has been
>    swapped in (in bytes).
>  
> -  VIRTIO_BALLOON_S_SWAP_OUT The amount of memory that has been
> +\item[VIRTIO_BALLOON_S_SWAP_OUT (1)] The amount of memory that has been
>    swapped out to disk (in bytes).
>  
> -  VIRTIO_BALLOON_S_MAJFLT The number of major page faults that
> +\item[VIRTIO_BALLOON_S_MAJFLT (2)] The number of major page faults that
>    have occurred.
>  
> -  VIRTIO_BALLOON_S_MINFLT The number of minor page faults that
> +\item[VIRTIO_BALLOON_S_MINFLT (3)] The number of minor page faults that
>    have occurred.
>  
> -  VIRTIO_BALLOON_S_MEMFREE The amount of memory not being used
> +\item[VIRTIO_BALLOON_S_MEMFREE (4)] The amount of memory not being used
>    for any purpose (in bytes).
>  
> -  VIRTIO_BALLOON_S_MEMTOT The total amount of memory available
> +\item[VIRTIO_BALLOON_S_MEMTOT (5)] The total amount of memory available
>    (in bytes).
> -
> +\end{description}
>  
>  \section{SCSI Host Device}\label{sec:Device Types / SCSI Host Device}
>  
> @@ -3304,11 +3366,12 @@ using the SCSI protocol. An instance of the device represents a
>  SCSI host to which many targets and LUNs are attached.
>  
>  The virtio SCSI device services two kinds of requests:
> +\begin{itemize}
> +\item command requests for a logical unit;
>  
> -• command requests for a logical unit;
> -
> -• task management functions related to a logical unit, target or
> +\item task management functions related to a logical unit, target or
>    command.
> +\end{itemize}
>  
>  The device is also able to send out notifications about added and
>  removed logical units. Together, these capabilities provide a
> @@ -3321,18 +3384,25 @@ targets that receive and process the requests.
>    8
>  
>  \subsection{Virtqueues}\label{sec:Device Types / SCSI Host Device / Virtqueues}
> -   0:controlq; 1:eventq; 2..n:request queues.
> +
> +\begin{description}
> +\item[0] controlq
> +\item[1] eventq
> +\item[2\ldots n] request queues
> +\end{description}
>  
>  \subsection{Feature bits}\label{sec:Device Types / SCSI Host Device / Feature bits}
>  
> -  VIRTIO_SCSI_F_INOUT (0) A single request can include both
> +\begin{description}
> +\item[VIRTIO_SCSI_F_INOUT (0)] A single request can include both
>      read-only and write-only data buffers.
>  
> -  VIRTIO_SCSI_F_HOTPLUG (1) The host should enable
> +\item[VIRTIO_SCSI_F_HOTPLUG (1)] The host should enable
>      hot-plug/hot-unplug of new LUNs and targets on the SCSI bus.
>  
> -  VIRTIO_SCSI_F_CHANGE (2) The host will report changes to LUN
> +\item[VIRTIO_SCSI_F_CHANGE (2)] The host will report changes to LUN
>      parameters via a VIRTIO_SCSI_T_PARAM_CHANGE event.
> +\end{description}
>  
>  \subsection{Device configuration layout}\label{sec:Device Types / SCSI Host Device / Device configuration layout}
>  
> @@ -3354,41 +3424,43 @@ targets that receive and process the requests.
>  	};
>  \end{lstlisting}
>  
> -  num_queues is the total number of request virtqueues exposed by
> +\begin{description}
> +\item[num_queues] is the total number of request virtqueues exposed by
>      the device. The driver is free to use only one request queue,
>      or it can use more to achieve better performance.
>  
> -  seg_max is the maximum number of segments that can be in a
> +\item[seg_max] is the maximum number of segments that can be in a
>      command. A bidirectional command can include seg_max input
>      segments and seg_max output segments.
>  
> -  max_sectors is a hint to the driver about the maximum transfer
> +\item[max_sectors] is a hint to the driver about the maximum transfer
>      size it should use.
>  
> -  cmd_per_lun is a hint to the driver about the maximum number of
> +\item[cmd_per_lun] is a hint to the driver about the maximum number of
>      linked commands it should send to one LUN. The actual value
>      to be used is the minimum of cmd_per_lun and the virtqueue
>      size.
>  
> -  event_info_size is the maximum size that the device will fill
> +\item[event_info_size] is the maximum size that the device will fill
>      for buffers that the driver places in the eventq. The driver
>      should always put buffers at least of this size. It is
>      written by the device depending on the set of negotated
>      features.
>  
> -  sense_size is the maximum size of the sense data that the
> +\item[sense_size] is the maximum size of the sense data that the
>      device will write. The default value is written by the device
>      and will always be 96, but the driver can modify it. It is
>      restored to the default when the device is reset.
>  
> -  cdb_size is the maximum size of the CDB that the driver will
> +\item[cdb_size] is the maximum size of the CDB that the driver will
>      write. The default value is written by the device and will
>      always be 32, but the driver can likewise modify it. It is
>      restored to the default when the device is reset.
>  
> -  max_channel, max_target and max_lun can be used by the driver
> +\item[max_channel, max_target and max_lun] can be used by the driver
>      as hints to constrain scanning the logical units on the
>      host.h
> +\end{description}
>  
>  \subsubsection{Legacy Interface: Device configuration layout}\label{sec:Device Types / SCSI Host Device / Device configuration layout / Legacy Interface: Device configuration layout}
>  For legacy devices, the fields in struct virtio_scsi_config are the
> @@ -3500,40 +3572,43 @@ defined in SAM.
>  The response byte is written by the device to be one of the
>  following:
>  
> -  VIRTIO_SCSI_S_OK when the request was completed and the status
> +\begin{description}
> +
> +\item[VIRTIO_SCSI_S_OK] when the request was completed and the status
>    byte is filled with a SCSI status code (not necessarily
>    "GOOD").
>  
> -  VIRTIO_SCSI_S_OVERRUN if the content of the CDB requires
> +\item[VIRTIO_SCSI_S_OVERRUN] if the content of the CDB requires
>    transferring more data than is available in the data buffers.
>  
> -  VIRTIO_SCSI_S_ABORTED if the request was cancelled due to an
> +\item[VIRTIO_SCSI_S_ABORTED] if the request was cancelled due to an
>    ABORT TASK or ABORT TASK SET task management function.
>  
> -  VIRTIO_SCSI_S_BAD_TARGET if the request was never processed
> +\item[VIRTIO_SCSI_S_BAD_TARGET] if the request was never processed
>    because the target indicated by the lun field does not exist.
>  
> -  VIRTIO_SCSI_S_RESET if the request was cancelled due to a bus
> +\item[VIRTIO_SCSI_S_RESET] if the request was cancelled due to a bus
>    or device reset (including a task management function).
>  
> -  VIRTIO_SCSI_S_TRANSPORT_FAILURE if the request failed due to a
> +\item[VIRTIO_SCSI_S_TRANSPORT_FAILURE] if the request failed due to a
>    problem in the connection between the host and the target
>    (severed link).
>  
> -  VIRTIO_SCSI_S_TARGET_FAILURE if the target is suffering a
> +\item[VIRTIO_SCSI_S_TARGET_FAILURE] if the target is suffering a
>    failure and the driver should not retry on other paths.
>  
> -  VIRTIO_SCSI_S_NEXUS_FAILURE if the nexus is suffering a failure
> +\item[VIRTIO_SCSI_S_NEXUS_FAILURE] if the nexus is suffering a failure
>    but retrying on other paths might yield a different result.
>  
> -  VIRTIO_SCSI_S_BUSY if the request failed but retrying on the
> +\item[VIRTIO_SCSI_S_BUSY] if the request failed but retrying on the
>    same path should work.
>  
> -  VIRTIO_SCSI_S_FAILURE for other host or driver error. In
> +\item[VIRTIO_SCSI_S_FAILURE] for other host or driver error. In
>    particular, if neither dataout nor datain is empty, and the
>    VIRTIO_SCSI_F_INOUT feature has not been negotiated, the
>    request will be immediately returned with a response equal to
>    VIRTIO_SCSI_S_FAILURE.
> +\end{description}
>  
>  \paragraph{Legacy Interface: Device Operation: Request Queues}\label{sec:Device Types / SCSI Host Device / Device Operation / Device Operation: Request Queues / Legacy Interface: Device Operation: Request Queues}
>  For legacy devices, the fields in struct virtio_scsi_req_cmd are the
> @@ -3735,17 +3810,19 @@ contents of the event field. The following events are defined:
>  
>    This event is fired in the following cases:
>  
> -  • When the device detects in the eventq a buffer that is
> +\begin{itemize}
> +\item When the device detects in the eventq a buffer that is
>      shorter than what is indicated in the configuration field, it
>      might use it immediately and put this dummy value in the
>      event field. A well-written driver will never observe this
>      situation.
>  
> -  • When events are dropped, the device may signal this event as
> +\item When events are dropped, the device may signal this event as
>      soon as the drivers makes a buffer available, in order to
>      request action from the driver. In this case, of course, this
>      event will be reported with the VIRTIO_SCSI_T_EVENTS_MISSED
>      flag.
> +\end{itemize}
>  
>    Transport reset
>  \begin{lstlisting}
> @@ -3766,15 +3843,17 @@ contents of the event field. The following events are defined:
>    The reason value is one of the three \#define values appearing
>    above:
>  
> -  • VIRTIO_SCSI_EVT_RESET_REMOVED (“LUN/target removed”) is used
> +  \begin{itemize}
> +  \item VIRTIO_SCSI_EVT_RESET_REMOVED (“LUN/target removed”) is used
>      if the target or logical unit is no longer able to receive
>      commands.
>  
> -  • VIRTIO_SCSI_EVT_RESET_HARD (“LUN hard reset”) is used if the
> +  \item VIRTIO_SCSI_EVT_RESET_HARD (“LUN hard reset”) is used if the
>      logical unit has been reset, but is still present.
>  
> -  • VIRTIO_SCSI_EVT_RESET_RESCAN (“rescan LUN/target”) is used if
> +  \item VIRTIO_SCSI_EVT_RESET_RESCAN (“rescan LUN/target”) is used if
>      a target or logical unit has just appeared on the device.
> +  \end{itemize}
>  
>    The “removed” and “rescan” events, when sent for LUN 0, may
>    apply to the entire target. After receiving them the driver
> @@ -3788,14 +3867,16 @@ contents of the event field. The following events are defined:
>    does not apply to newly appeared buses or targets, since the
>    application has never discovered them):
>  
> -  • “LUN/target removed” maps to sense key ILLEGAL REQUEST, asc
> +  \begin{itemize}
> +  \item “LUN/target removed” maps to sense key ILLEGAL REQUEST, asc
>      0x25, ascq 0x00 (LOGICAL UNIT NOT SUPPORTED)
>  
> -  • “LUN hard reset” maps to sense key UNIT ATTENTION, asc 0x29
> +  \item “LUN hard reset” maps to sense key UNIT ATTENTION, asc 0x29
>      (POWER ON, RESET OR BUS DEVICE RESET OCCURRED)
>  
> -  • “rescan LUN/target” maps to sense key UNIT ATTENTION, asc
> +  \item “rescan LUN/target” maps to sense key UNIT ATTENTION, asc
>      0x3f, ascq 0x0e (REPORTED LUNS DATA HAS CHANGED)
> +  \end{itemize}
>  
>    The preferred way to detect transport reset is always to use
>    events, because sense codes are only seen by the driver when it
> @@ -3853,11 +3934,12 @@ native endian of the guest rather than (necessarily) little-endian.
>  
>  Currently there are four device-independent feature bits defined:
>  
> -  VIRTIO_F_RING_INDIRECT_DESC (28) Negotiating this feature indicates
> +\begin{description}
> +  \item[VIRTIO_F_RING_INDIRECT_DESC (28)] Negotiating this feature indicates
>    that the driver can use descriptors with the VRING_DESC_F_INDIRECT
>    flag set, as described in \ref{sec:Basic Facilities of a Virtio Device / Virtqueues / The Virtqueue Descriptor Table / Indirect Descriptors}~\nameref{sec:Basic Facilities of a Virtio Device / Virtqueues / The Virtqueue Descriptor Table / Indirect Descriptors}.
>  
> -  VIRTIO_F_RING_EVENT_IDX(29) This feature enables the used_event
> +  \item[VIRTIO_F_RING_EVENT_IDX(29)] This feature enables the used_event
>    and the avail_event fields. If set, it indicates that the
>    device should ignore the flags field in the available ring
>    structure. Instead, the used_event field in this structure is
> @@ -3868,9 +3950,10 @@ Currently there are four device-independent feature bits defined:
>    driver should ignore the used_event field; the device should
>    ignore the avail_event field; the flags field is used
>  
> -  VIRTIO_F_VERSION_1(32) This feature must be offered by any device
> +  \item[VIRTIO_F_VERSION_1(32)] This feature must be offered by any device
>    compliant with this specification, and acknowledged by all device
>    drivers.
> +\end{description}
>  
>  In addition, bit 30 is used by qemu's implementation to check for experimental
>  early versions of virtio which did not perform correct feature negotiation,
> @@ -3880,7 +3963,8 @@ and should not be used.
>  
>  Legacy or transitional devices may offer the following:
>  
> -VIRTIO_F_NOTIFY_ON_EMPTY (24) Negotiating this feature
> +\begin{description}
> +\item[VIRTIO_F_NOTIFY_ON_EMPTY (24)] Negotiating this feature
>    indicates that the driver wants an interrupt if the device runs
>    out of available descriptors on a virtqueue, even though
>    interrupts are suppressed using the VRING_AVAIL_F_NO_INTERRUPT
> @@ -3891,9 +3975,10 @@ VIRTIO_F_NOTIFY_ON_EMPTY (24) Negotiating this feature
>    using a timer if the device interrupts it when all the packets
>    are transmitted.
>  
> -VIRTIO_F_ANY_LAYOUT (27) This feature indicates that the device
> +\item[VIRTIO_F_ANY_LAYOUT (27)] This feature indicates that the device
>    accepts arbitrary descriptor layouts, as described in Section
>    \ref{sec:Basic Facilities of a Virtio Device / Virtqueues / Message Framing / Legacy Interface: Message Framing}~\nameref{sec:Basic Facilities of a Virtio Device / Virtqueues / Message Framing / Legacy Interface: Message Framing}.
> +\end{description}
>  
>  \chapter{virtio_ring.h}\label{sec:virtio-ring.h}
>  
> @@ -3935,8 +4020,7 @@ are atomically writable.
>  
>  Currently device numbers are assigned quite freely: a simple
>  request mail to the author of this document or the Linux
> -virtualization mailing list
> -\footnote{https://lists.linux-foundation.org/mailman/listinfo/virtualization
> +virtualization mailing list\footnote{https://lists.linux-foundation.org/mailman/listinfo/virtualization
>  } will be sufficient to secure a unique one.
>  
>  Meanwhile for experimental drivers, use 65535 and work backwards.
> @@ -3963,8 +4047,7 @@ altogether.
>  
>  Any change to configuration space, or new virtqueues, or
>  behavioural changes, should be indicated by negotiation of a new
> -feature bit. This establishes clarity
> -\footnote{Even if it does mean documenting design or implementation
> +feature bit. This establishes clarity\footnote{Even if it does mean documenting design or implementation
>  mistakes!
>  } and avoids future expansion problems.
>  


[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]