<!DOCTYPE HTML PUBLIC "-//FreeBSD//DTD HTML 4.01 Transitional-Based Extension//EN" [
<!ENTITY base CDATA "../..">
<!ENTITY date "$FreeBSD$">
<!ENTITY title "FreeBSD busdma and SMPng driver conversion project">
<!ENTITY email 'mux'>
<!ENTITY % navinclude.developers "INCLUDE">

<!-- Status levels -->
<!ENTITY status.na "<font color=magenta>N/A</font>">
<!ENTITY status.done "<font color=green>Done</font>">
<!ENTITY status.wip "<font color=blue>In progress</font>">
<!ENTITY status.untested "<font color=orange>Needs testing</font>">
<!ENTITY status.new "<font color=red>Not done</font>">
<!ENTITY status.unknown "<font color=purple>Unknown</font>">

<!-- The list of contributors was moved to a separate file so that it can
  be used by other documents in the FreeBSD web site. -->

<!ENTITY % developers PUBLIC "-//FreeBSD//ENTITIES FreeBSD Developers Entities//EN"> %developers;

]>

<html>
  &header;

    <h2>Contents</h2>
    <ul>
      <li><a href="#goal">Project Goal</a></li>
      <li><a href="#resources">Resources and Links</a></li>
      <li><a href="#platform-status">Platform Support Status</a></li>
      <li><a href="#ifnet-status">Network Interface Driver Status</a></li>
      <li><a href="#storage-status">Storage Device Driver Status</a></li>
      <li><a href="#misc-status">Miscellaneous Device Driver Status</a></li>
      <li><a href="#doc-status">Documentation Status</a></li>
    </ul>

    <a name="goal"></a>
    <h2>Project Goal</h2>

    <p><b>busdma</b></p>
    <p>The busdma interfaces permit hardware device drivers to operate
      on a variety of platforms avoiding the encoding of platform-specific
      access methods into drivers.  This lowers the maintenance costs
      for drivers across platforms, and improves the chances that a driver
      will "just work" on a new platform.  Modifying a driver to make use
      of busdma is relatively straight forward, but does require
      familiarity with both the device driver and busdma primitives.
      For busdma to be used in FreeBSD, two sets of changes are generally
      required: adaptation of the busdma implementation to run on all
      platforms, and adaptation of drivers to use the framework.  As such,
      status information on this project is broken down into platform
      support, and driver support (sorted by category).  Completing
      this work requires a thorough audit of the system device drivers,
      then prioritized conversion of drivers.  Drivers are also
      expected to use bus_space functions, and this column is
      sometimes used to denote a driver in need of conversion to
      bus_space as well.</p>

    <p><b>INTR_MPSAFE</b></p>
    <p>Hardware drivers register their interrupt handler with the
      <code>bus_setup_intr()</code> function.  Setting the flag
      <code>INTR_MPSAFE</code> tells the system interrupt code
      to call the interrupt routine without holding the Giant
      mutex.  This can give a significant performance gain on SMP
      systems.</p>
    <p>Drivers can set this flag even if they are not fully locked
      down as long as their interrupt routine is careful about not
      touching other data structures in the driver.  An easy way to
      do this is to check and clear the hardware interrupt status
      registers and then schedule the interrupt processing for a
      taskqueue or kernel thread.</p>

    <p><b>SMPng locked</b></p>
    <p>Drivers should employ mutexes and sx locks to protect their
      data structures and hardware registers from competing threads.
      Mutex operations are somewhat expensive, so a good strategy is
      combine as many atomic operations into a single mutex acquisition
      as possible.</p>

    <p><b>p!=a safety</b></p>
    <p>Intel PAE support requires that pointers and physical address
      representations be of differing sizes.  This means that drivers
      must be written to use vm_paddr_t or bus_addr_t rather than
      assuming that physical addresses can be represented using a
      void *.  In addition, format strings and casts must be
      carefully handled.</p>

    <p>The task list below is not intended to be complete, but does
      represent a set of relevant and/or important components of the
      overall work.  The "Responsible" field identifies a developer who
      has expressed willingness to be responsible for completing the
      identified task; this doesn't preclude others working on it,
      but suggests that coordination with the responsible party might
      be appropriate so as to avoid unnecessary duplication of work,
      and to maximize forward progress.  If beginning work on a new
      area of substantial size, or one that appears unclaimed, it may
      be worth dropping an e-mail to &a.mux; to see if any progress
      has been made.</p>

    <p>The definition of the date field varies depending on the status
      of a task.  For completed tasks, it refers to the date completed
      or reported completed.  For in-progress tasks, it refers to the
      date of the last update of the entry.  For stalled tasks, it
      refers to the date that the task was declared stalled.  For
      new tasks, it refers to the date the task was added to the list.</p>

    <p>Tasks are sorted first by status, then by date.</p>
    
    <a name="resources"></a>
    <h2>Resources and Links</h2>
    <p>A series of manual pages related to this project can be found
    here:</p>

    <ul>
      <li>Physical Address Extensions - 
      <a href="http://www.freebsd.org/cgi/man.cgi?query=pae&amp;apropos=0&amp;sektion=4&amp;manpath=FreeBSD+6.0-current">pae(4)</a></li>
      <li>Bus and Machine-independent DMA Mapping Interface - 
      <a href="http://www.freebsd.org/cgi/man.cgi?query=busdma&amp;apropos=0&amp;sektion=9&amp;manpath=FreeBSD+6.0-current">bus_dma(9)</a></li>
      <li>Machine-dependent part of the Virtual Memory (VM) system - 
      <a href="http://www.freebsd.org/cgi/man.cgi?query=pmap&amp;apropos=0&amp;sektion=9&amp;manpath=FreeBSD+6.0-current">pmap(9)</a></li>
      <li>Resource Management Functions - 
      <a href="http://www.freebsd.org/cgi/man.cgi?query=rman&amp;apropos=0&amp;sektion=9&amp;manpath=FreeBSD+6.0-current">rman(9)</a></li>
    </ul>

    <a name="platform-status"></a>
    <h2>Platform Support Status</h2>

    <table class="tblbasic">
      <tr>
	<th> Task </th>
	<th> Responsible </th>
	<th> Last updated </th>
	<th> Status </th>
	<th> Details </th>
      </tr>

      <tr>
	<td>amd64</td>
	<td>&a.peter;</td>
	<td>July 1, 2003</td>
	<td>&status.done;</td>
	<td>Fully supported.</td>
      </tr>

      <tr>
	<td>arm</td>
	<td>&a.cognet;</td>
	<td>December 23, 2005</td>
	<td>&status.done;</td>
	<td>Fully supported.</td>
      </tr>

      <tr>
	<td>ia64</td>
	<td>&a.marcel;</td>
	<td>December 10, 2002</td>
	<td>&status.done;</td>
	<td>There may be problems for systems with large amounts
	  of memory.</td>
      </tr>

      <tr>
	<td>i386</td>
	<td>&a.sam;</td>
	<td>December 9, 2002</td>
	<td>&status.done;</td>
	<td>Fully supported.</td>
      </tr>

      <tr>
	<td>powerpc</td>
	<td>&a.grehan;</td>
	<td>January 15, 2003</td>
	<td>&status.done;</td>
	<td>Fully supported.</td>
      </tr>

      <tr>
	<td>sparc64</td>
	<td>&a.tmm;</td>
	<td>January 6, 2003</td>
	<td>&status.done;</td>
	<td>Fully supported.</td>
      </tr>

    </table>

    <a name="ifnet-status"></a>
    <h2>Network Interface Driver Status</h2>

    <table class="tblbasic">
      <tr>
	<th> Driver </th>
	<th> Responsible </th>
	<th> Last updated </th>
	<th> busdma </th>
	<th> INTR_MPSAFE </th>
	<th> SMPng locked </th>
	<th> a!=p </th>
	<th> Notes </th>
      </tr>

      <tr>
	<td> if_an </td>
	<td> &nbsp; </td>
	<td> December 23, 2005 </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_ar </td>
	<td> &nbsp; </td>
	<td> &nbsp; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> kvtop() </td>
      </tr>

      <tr>
	<td> if_arl </td>
	<td> &nbsp; </td>
	<td> August 27, 2006 </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_ath </td>
	<td> &nbsp; </td>
	<td> August 27, 2006 </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_aue </td>
	<td> &nbsp; </td>
	<td> September 3, 2006 </td>
	<td> &status.na; </td>
	<td> &status.new; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_awi </td>
	<td> &nbsp; </td>
	<td> August 27, 2006 </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_axe </td>
	<td> &nbsp; </td>
	<td> September 3, 2006 </td>
	<td> &status.na; </td>
	<td> &status.new; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_bce </td>
	<td> &nbsp; </td>
	<td> August 25, 2006 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_bfe </td>
	<td> &a.silby; </td>
	<td> August 23, 2006 </td>
	<td> &status.done; </td>
	<td> &status.wip; </td>
	<td> &status.wip; </td>
	<td> &status.wip; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_bge </td>
	<td> &a.wpaul; </td>
	<td> April 13, 2004 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_cdce </td>
	<td> &nbsp; </td>
	<td> September 3, 2006 </td>
	<td> &status.na; </td>
	<td> &status.new; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_cnw </td>
	<td> &nbsp; </td>
	<td> August 27, 2006 </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_cp </td>
	<td> &a.rik; </td>
	<td> October 31, 2005 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_cs </td>
	<td> &a.imp; </td>
	<td> December 23, 2005 </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.unknown; </td>
	<td> Needs bus_space conversion </td>
      </tr>

      <tr>
	<td> if_ct </td>
	<td> &a.rik; </td>
	<td> October 31, 2005 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_cue </td>
	<td> &nbsp; </td>
	<td> September 3, 2006 </td>
	<td> &status.na; </td>
	<td> &status.new; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_cx </td>
	<td> &a.rik; </td>
	<td> June 24, 2004 </td>
	<td> &status.done; </td>
	<td> &status.wip; </td>
	<td> &status.wip; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_dc </td>
	<td> &a.mux; </td>
	<td> August 19, 2005 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_de </td>
	<td> &a.mux; </td>
	<td> August 17, 2005 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_ed </td>
	<td> &a.imp; </td>
	<td> December 23, 2005 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_em </td>
	<td> &a.pdeuskar; </td>
	<td> April 13, 2004 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_en </td>
	<td> &a.harti; </td>
	<td> November 2, 2005 </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.done; </td>
	<td> Locking present; not yet marked INTR_MPSAFE? </td>
      </tr>

      <tr>
	<td> if_ep </td>
	<td> &a.mdodd;,&a.imp; </td>
	<td> April 13, 2004 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_ex </td>
	<td> &a.imp; </td>
	<td> Dcember 23, 2005 </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.done; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_fatm </td>
	<td> &a.harti; </td>
	<td> November 2, 2005 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_fwe </td>
	<td> &nbsp; </td>
	<td> &nbsp; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_fxp </td>
	<td> &a.mux; </td>
	<td> April 13, 2004 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_gem </td>
	<td> &a.tmm; </td>
	<td> July 31, 2005 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_hatm </td>
	<td> &a.harti; </td>
	<td> November 2, 2005 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_hme </td>
	<td> &a.tmm; </td>
	<td> January 30, 2005 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_idt </td>
	<td> &nbsp; </td>
	<td> &nbsp; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> vtophys() </td>
      </tr>

      <tr>
	<td> if_ipw </td>
	<td> &nbsp; </td>
	<td> August 27, 2006 </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_iwi </td>
	<td> &nbsp; </td>
	<td> August 27, 2006 </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_ixgb </td>
	<td> &nbsp; </td>
	<td> August 21, 2006 </td>
	<td> &status.untested; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_kue </td>
	<td> &nbsp; </td>
	<td> September 3, 2006 </td>
	<td> &status.na; </td>
	<td> &status.new; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_le </td>
	<td> &a.marius; </td>
	<td> January 31, 2006 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_lge </td>
	<td> &nbsp; </td>
	<td> November 23, 2005 </td>
	<td> &status.new; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> vtophys() </td>
      </tr>

      <tr>
	<td> if_lmc </td>
	<td> &nbsp; </td>
	<td> February 11, 2006 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.unknown; </td>
	<td> Untested on PAE </td>
      </tr>

      <tr>
	<td> if_mn </td>
	<td> &nbsp; </td>
	<td> &nbsp; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> vtophys(). Please contact &a.phk; for info/hardware. </td>
      </tr>

      <tr>
	<td> if_mxge </td>
	<td> &a.gallatin; </td>
	<td> August 23, 2006 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_my </td>
	<td> &nbsp; </td>
	<td> August 17, 2005 </td>
	<td> &status.new; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> vtophys() </td>
      </tr>

      <tr>
	<td> if_nfe </td>
	<td> &nbsp; </td>
	<td> August 23, 2006 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_nge </td>
	<td> &nbsp; </td>
	<td> August 17, 2005 </td>
	<td> &status.new; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> vtophys() </td>
      </tr>

      <tr>
	<td> if_nve </td>
	<td> &nbsp; </td>
	<td> November 23, 2005 </td>
	<td> &status.new; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> vtophys() </td>
      </tr>

      <tr>
	<td> if_pcn </td>
	<td> &a.obrien; </td>
	<td> August 19, 2005 </td>
	<td> &status.new; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> vtophys() </td>
      </tr>

      <tr>
	<td> if_pdq </td>
	<td> &nbsp; </td>
	<td> &nbsp; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> Mostly busdma, except for vtophys(). </td>
      </tr>

      <tr>
	<td> if_ral </td>
	<td> &nbsp; </td>
	<td> August 27, 2006 </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_ray </td>
	<td> &nbsp; </td>
	<td> August 27, 2006 </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_re </td>
	<td> &nbsp; </td>
	<td> May 30, 2005 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_rl </td>
	<td> &a.wpaul; </td>
	<td> April 13, 2004 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_rue </td>
	<td> &nbsp; </td>
	<td> September 3, 2006 </td>
	<td> &status.na; </td>
	<td> &status.new; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_sf </td>
	<td> &nbsp; </td>
	<td> August 19, 2005 </td>
	<td> &status.new; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> vtophys() </td>
      </tr>

      <tr>
	<td> if_sis </td>
	<td> &a.wpaul; </td>
	<td> April 13, 2004 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_sk </td>
	<td> &nbsp; </td>
	<td> August 24, 2006 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_sn </td>
	<td> &a.imp; </td>
	<td> December 23, 2005 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_snc </td>
	<td> &nbsp; </td>
	<td> December 23, 2005 </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> pc98 only device (although it could work with many
	cardbus bridges) </td>
      </tr>

      <tr>
	<td> if_sr </td>
	<td> &nbsp; </td>
	<td> &nbsp; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> vtophys() </td>
      </tr>

      <tr>
	<td> if_ste </td>
	<td> &nbsp; </td>
	<td> August 31, 2005 </td>
	<td> &status.new; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> vtophys() </td>
      </tr>

      <tr>
	<td> if_stge </td>
	<td> &a.yongari; </td>
	<td> August 23, 2006 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_ti </td>
	<td> &nbsp; </td>
	<td> December 13, 2005 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_tl </td>
	<td> &nbsp; </td>
	<td> September 15, 2005 </td>
	<td> &status.new; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_tx </td>
	<td> &a.mux; </td>
	<td> April 19, 2003 </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.untested; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_txp </td>
	<td> &nbsp; </td>
	<td> September 22, 2005 </td>
	<td> &status.wip; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_udav </td>
	<td> &nbsp; </td>
	<td> September 3, 2006 </td>
	<td> &status.na; </td>
	<td> &status.new; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_ural </td>
	<td> &nbsp; </td>
	<td> September 3, 2006 </td>
	<td> &status.na; </td>
	<td> &status.new; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_vge </td>
	<td> &nbsp; </td>
	<td> August 23, 2006 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_vr </td>
	<td> &nbsp; </td>
	<td> April 23, 2004 </td>
	<td> &status.new; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_vx </td>
	<td> &nbsp; </td>
	<td> September 22, 2005 </td>
	<td> &status.na; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> Uses PIO to copy mbufs to and from hardware. </td>
      </tr>

      <tr>
	<td> if_wb </td>
	<td> &nbsp; </td>
	<td> September 22, 2005 </td>
	<td> &status.new; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_wi </td>
	<td> &a.sam;, &a.imp; </td>
	<td> November 4, 2003 </td>
	<td> &status.unknown; </td>
	<td> &status.done; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> This driver needs lots of help </td>
      </tr>

      <tr>
	<td> if_xe </td>
	<td> &a.imp; </td>
	<td> December 23, 2005 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> if_xl </td>
	<td> &a.mux; </td>
	<td> April 13, 2004 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &nbsp; </td>
      </tr>

    </table>

    <a name="storage-status"></a>
    <h2>Storage Device Driver Status</h2>

    <table class="tblbasic">
      <tr>
	<th> Driver </th>
	<th> Responsible </th>
	<th> Last updated </th>
	<th> busdma </th>
	<th> INTR_MPSAFE </th>
	<th> SMPng locked </th>
	<th> a!=p </th>
	<th> Notes </th>
      </tr>

      <tr>
	<td> aac </td>
	<td> &nbsp; </td>
	<td> January 31, 2005 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> Not endian clean. </td>
      </tr>

      <tr>
	<td> adv </td>
	<td> &nbsp; </td>
	<td> December 9, 2002 </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> aha </td>
	<td> &nbsp; </td>
	<td> April 13, 2004 </td>
	<td> &status.done; </td>
	<td> &status.wip; </td>
	<td> &status.wip; </td>
	<td> &status.new; </td>
	<td> Uses BUSDMA, but may pun bus address with host address. </td>
      </tr>

      <tr>
	<td> ahb </td>
	<td> &nbsp; </td>
	<td> December 9, 2002 </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> ahc </td>
	<td> &a.gibbs; </td>
	<td> January 31, 2005 </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.done; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> ahd </td>
	<td> &a.gibbs; </td>
	<td> January 31, 2005 </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.done; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> aic </td>
	<td> &nbsp; </td>
	<td> December 23, 2005 </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> Neeeds evaluation </td>
      </tr>

      <tr>
	<td> amd </td>
	<td> &nbsp; </td>
	<td> December 14, 2002 </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> amr </td>
	<td> &nbsp; </td>
	<td> January 30, 2005 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> asr </td>
	<td> &nbsp; </td>
	<td> January 4, 2003 </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> vtophys().  Requires major work.  A new I2O framework would be desirable. </td>
      </tr>

      <tr>
	<td> ata </td>
	<td> &a.sos; </td>
	<td> December 9, 2002 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> buslogic </td>
	<td> &nbsp; </td>
	<td> &nbsp; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> vtophys() </td>
      </tr>

      <tr>
	<td> ciss </td>
	<td> &nbsp; </td>
	<td> December 9, 2002 </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> ct </td>
	<td> &nbsp; </td>
	<td> &nbsp; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> dpt </td>
	<td> &nbsp; </td>
	<td> &nbsp; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> vtophys() </td>
      </tr>

      <tr>
	<td> fdc </td>
	<td> &nbsp; </td>
	<td> December 23, 2005 </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> Needs evaluation </td>
      </tr>

      <tr>
	<td> ida </td>
	<td> &nbsp; </td>
	<td> December 9, 2002 </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> iir </td>
	<td> &nbsp; </td>
	<td> March 1, 2006 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> 64-bit DMA without bouncing is possible, but needs work. </td>
      </tr>

      <tr>
	<td> isp </td>
	<td> &nbsp; </td>
	<td> February 8, 2003 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> ips </td>
	<td> &nbsp; </td>
	<td> January 30, 2005</td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> mlx </td>
	<td> &nbsp; </td>
	<td> February 8, 2003 </td>
	<td> &status.done; </td>
	<td> &status.wip; </td>
	<td> &status.wip; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> mly </td>
	<td> &nbsp; </td>
	<td> February 8, 2003 </td>
	<td> &status.done; </td>
	<td> &status.wip; </td>
	<td> &status.wip; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> mpt </td>
	<td> &nbsp; </td>
	<td> December 9, 2002 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> ncr </td>
	<td> &nbsp; </td>
	<td> &nbsp; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> vtophys(). Please contact &a.phk; for a possible source
	  of hardware. </td>
      </tr>

      <tr>
	<td> ncv </td>
	<td> &nbsp; </td>
	<td> &nbsp; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> Needs evaluation </td>
      </tr>

      <tr>
	<td> nsp </td>
	<td> &nbsp; </td>
	<td> &nbsp; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> &status.unknown; </td>
	<td> Needs evaluation </td>
      </tr>

      <tr>
	<td> pst </td>
	<td> &nbsp; </td>
	<td> April 11, 2003 </td>
	<td> &status.new; </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> vtophys() </td>
      </tr>

      <tr>
	<td> stg </td>
	<td> &nbsp; </td>
	<td> December 9, 2002 </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> At least, it looks like it may well be. </td>
      </tr>

      <tr>
	<td> sym </td>
	<td> &nbsp; </td>
	<td> December 19, 2002 </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> trm </td>
	<td> &a.cognet; </td>
	<td> December 9, 2002 </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> twe </td>
	<td> &nbsp; </td>
	<td> December 9, 2002 </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> wds </td>
	<td> &nbsp; </td>
	<td> February 2, 2005 </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

    </table>
    <a name="misc-status"></a>
    <h2>Miscellaneous Device Driver Status</h2>

    <table class="tblbasic">
      <tr>
	<th> Driver </th>
	<th> Responsible </th>
	<th> Last updated </th>
	<th> busdma </th>
	<th> INTR_MPSAFE </th>
	<th> SMPng locked </th>
	<th> a!=p </th>
	<th> Notes </th>
      </tr>

      <tr>
	<td> agp </td>
	<td> &nbsp; </td>
	<td> October 31, 2005 </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> vtophys() </td>
      </tr>

      <tr>
	<td> bktr </td>
	<td> &a.cognet; </td>
	<td> January 15, 2003 </td>
	<td> &status.wip; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> vtophys() </td>
      </tr>

      <tr>
	<td> digi </td>
	<td> &nbsp; </td>
	<td> &nbsp; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> vtophys() </td>
      </tr>

      <tr>
	<td> drm </td>
	<td> &a.anholt; </td>
	<td> October 27, 2003 </td>
	<td> &status.wip; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.wip; </td>
	<td> vtophys(). The locking could use some review. </td>
      </tr>

      <tr>
	<td> fb </td>
	<td> &nbsp; </td>
	<td> &nbsp; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> vtophys() </td>
      </tr>

      <tr>
	<td> firewire </td>
	<td> &a.simokawa; </td>
	<td> April 17, 2003 </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.done; </td>
	<td> vtophys() </td>
      </tr>

      <tr>
	<td> hfa </td>
	<td> &nbsp; </td>
	<td> &nbsp; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> vtophys() </td>
      </tr>

      <tr>
	<td> hifn </td>
	<td> &a.sam; </td>
	<td> April 13, 2004 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> musycc </td>
	<td> &nbsp; </td>
	<td> &nbsp; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> vtophys(). Please contact &a.phk; for info/hardware. </td>
      </tr>

      <tr>
	<td> pcm </td>
	<td> &a.cognet; </td>
	<td> February 20, 2003 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &nbsp; </td>
      </tr>

      <tr>
	<td> ubsec </td>
	<td> &a.sam; </td>
	<td> April 13, 2004 </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> vtophys() is used in debugging printf. </td>
      </tr>

      <tr>
	<td> usb </td>
	<td> &a.jmg; </td>
	<td> July 24, 2003 </td>
	<td> &status.done; </td>
	<td> &status.new; </td>
	<td> &status.new; </td>
	<td> &status.untested; </td>
	<td> a!=p should be clean, but requires further testing. </td>
      </tr>

    </table>

    <a name="doc-status"></a>
    <h2>Documentation Status</h2>

    <table class="tblbasic">
      <tr>
	<th> Task </th>
	<th> Responsible </th>
	<th> Last updated </th>
	<th> Status </th>
	<th> Notes </th>
      </tr>

      <tr>
	<td> Manual pages for the busdma API </td>
	<td> &a.hmp; </td>
	<td> January 15, 2003 </td>
	<td> &status.done; </td>
	<td> &nbsp; </td>
      </tr>
    </table>

  &footer;
  </body>
</html>
