diff --git a/en_US.ISO8859-1/books/arch-handbook/pccard/chapter.sgml b/en_US.ISO8859-1/books/arch-handbook/pccard/chapter.sgml
new file mode 100644
index 0000000000..a2cd0bbb01
--- /dev/null
+++ b/en_US.ISO8859-1/books/arch-handbook/pccard/chapter.sgml
@@ -0,0 +1,337 @@
+<!--
+     The FreeBSD Documentation Project
+
+     $FreeBSD$
+-->
+
+<chapter id="pccard">
+  <title>PC Card</title>
+
+  <para>This chapter will talk about the FreeBSD mechanisms for
+    writing a device driver for a PC Card or CardBus device.  However,
+    at the present time, it just documents how to add a driver to an
+    existing pccard driver.</para>
+
+  <sect1 id="pccard-adddev">
+    <title>Adding a device</title>
+
+    <para>Adding a new device to the list of supported devices for
+    pccard devices has changed form the system used through FreeBSD
+    4.  In prior versions, editing a file in /etc to list the device
+    was necessary.  Starting in FreeBSD 5.0, devices drivers know what
+    devices they support.  There is now a table of supported devices
+    in the kernel that drivers use to attach to a device.</para>
+
+    <sect2 id="pccard-overview">
+      <title>Overview</title>
+
+      <para>PC Cards are identified in one of two ways, both based on
+      information in the CIS of the card.  The first method is to use
+      numberic manufacturer and product numbers.  The second method is
+      to use the human readable strings that are also contained in the
+      CIS as well.  The PC Card bus uses a centralized database and
+      some macros to facilitate a design pattern to help the driver
+      writer match devices to his driver.</para>
+
+      <para>There is a widespread practice of one company developing a
+      reference design for a PC Card product and then selling this
+      design to other companies to market.  Those companies refine the
+      design, market the product to their target audience or
+      geographic area and put their own name plate onto the card.
+      However, the refinements to the physical card typically are very
+      minor, if any changes are made at all.  Often, however, to
+      strengthen their branding of their version of the card, these
+      vendors will place their company name in the human strings in
+      the CIS space, but leave the manufacturer and product ids
+      unchanged.</para>
+
+      <param>Because of the above practice, it is a smaller work load
+      for FreeBSD to use the numeric IDs.  It also introduces some
+      minor complications into the process of adding IDs to the
+      system.  One must carefully check to see who really made the
+      card, especially when it appears that the vendor who made the
+      card from might already have a different manufacturer id listed
+      in the central database.  Linksys, D-Link and NetGear are a
+      number of US Manufactuers of LAN hardware that often sell the
+      same design.  These same designs can be sold in Japan under the
+      names such as Buffalo and Corega.  Yet often, these devices will
+      all have the same manufacturer and product id.</param>
+
+      <param>The PC Card bus keeps its central database of card
+      information, but not which driver is associated with them, in
+      /sys/dev/pccard/pccarddevs.  It also provides a set of macros
+      that allow one to easily construct simple entries in the table
+      the driver uses to claim devices.</param>
+
+      <param>Finally, some really low end divices do not contain
+      manufacturer identification at all.  These devices require that
+      one matches them using the human readable CIS strings.  While it
+      would be nice if we didn't need this method as a fallback, it is
+      necessary for some very low end CD-ROM players that are quite
+      popular.  This method should generally be avoided, but a number
+      of devices are listed in this section because they were added
+      prior to the recognition of the OEM nature of the PC Card
+      buisiness.  When adding new devices, prefer using the numberic
+      method.</param>
+
+    </sect2>
+
+    <sect2 id="pccard-pccarddevs">
+      <title>Format of pccarddevs</title>
+
+      <para>There are four sections of the pccarddevs files.  The
+      first section lists the manufacturer numbers for those vendors
+      that use them.  This section is sorted in numerical order.  The
+      next section has all of the products that are used by these
+      vendors, along with their product ID numbers and a description
+      string.  The description string typically isn't used (instead we
+      set the device's description based on the human readable CIS,
+      even if we match on the numeric version).  These two sections
+      are then repeated for those devices that use the string matching
+      method.  Finally, C-style comments are allowed anywhere in the
+      file.</para>
+
+      <para>The first section of the file contains the vendor IDs.
+      Please keep this list sorted in numeric order.  Also, please
+      coordinate changes to this file because we share it with
+      NetBSD to help facilitate a common clearing hose for this
+      information.  For example:
+<programlisting>vendor FUJITSU			0x0004  Fujitsu Corporation
+vendor NETGEAR_2		0x000b  Netgear
+vendor PANASONIC		0x0032	Matsushita Electric Industrial Co.
+vendor SANDISK			0x0045	Sandisk Corporation
+</programlisting>
+      shows the first few vendor ids.  Chances are very good that the
+      NETGEAR_2 entry is really an OEM that NETGEAR purchased cards
+      from and the author of support for those cards was unaware at
+      the time that Netgear was using someone else's id.  These
+      entries are fairly straight forward.  There's the vendor keyword
+      used to denote the kind of line that this is.  There's the name
+      of the vendor.  This name will be repated later in the
+      pccarddevs file, as well as used in the driver's match tables,
+      so keep it short and a valid C identifier.  There's a numeric
+      ID, in hex, for the manufacturer.  Do not add IDs of the form
+      0xffffffff or 0xffff because these are reserved ids (the former
+      is 'no id set' while the latter is sometimes seen in extremely
+      poor quality cards to try to indicate 'none).  Finally there's a
+      string description of the company that makes the card.  This is
+      string is not used in FreeBSD for anything but commentary
+      purposes.
+
+      <para>The second section of the file contains the products.
+      As you can see in the following example:
+<programlisting>/* Allied Telesis K.K. */
+product ALLIEDTELESIS LA_PCM	0x0002 Allied Telesis LA-PCM
+
+/* Archos */
+product	ARCHOS ARC_ATAPI	0x0043 MiniCD
+</programlisting>
+      the format is similar to the vendor lines.  There is the product
+      keyword.  Then there is the vendor name, repeated from above.
+      This is followed by the product name, which is used by the
+      driver and should be a valid C identifier, but may also start
+      with a number.  There's then the product id for this card, in
+      hex.  As with the vendors, there's the same convention for
+      0xffffffff and 0xffff.  Finally, there's a string description of
+      the device itself.  This string typically is not used in
+      FreeBSD, since FreeBSD's pccard bus driver will construct a
+      string from the human readable CIS entries, but can be used in
+      the rare cases where this is somehow insufficient.  The products
+      are in alphabetical order by manufacturer, then numerical order by
+      product id.  They have a C comment before each manufacturer's
+      entries and there is a blank line between entries.</para>
+
+      <para>The third section is like the previous vendor section, but
+      with all of the manufacturer numeric ids as -1.  -1 means 'match
+      anything you find' in the FreeBSD pccard bus code.  Since these
+      are C identifiers, their names must be unique.  Otherwise the
+      format is identical to the first section of the file.</para>
+
+      <para>The final section contains the entries for those cards
+      that we must match with string entries.  This sections' format
+      is a little different than the neric section:
+<programlisting>product ADDTRON AWP100		{ "Addtron", "AWP-100&spWireless&spPCMCIA", "Version&sp01.02", NULL }
+product ALLIEDTELESIS WR211PCM	{ "Allied&spTelesis&spK.K.", "WR211PCM", NULL, NULL } Allied Telesis WR211PCM
+</programlisting>
+      We have the familiar product keyword, followed by the vendor
+      name followed by the card name, just as in the second section of
+      the file.  However, then we deviate from that format.  There is
+      a {} grouping, followed by a number of strings.  These strings
+      correspond to the vendor, product and extra information that is
+      defined in a CIS_INFO tuple.  These strings are filtered by the
+      program that generates pccarddevs.h to replace &amp;sp with a
+      real space.  NULL entries mean that that part of the entry
+      should be ignored.  In the example I've picked, there's a bad
+      entry.  It shouldn't contain the version number in it unless
+      that's critical for the operatin of the card.  Sometimes vendors
+      will have many different versions of the card in the field that
+      all work, in which case that information only makes it harder
+      for someone with a similar card to use it with FreeBSD.
+      Sometimes it is necessary when a vendor wishes to sell many
+      different parts under the same brand due to market
+      considerations (availability, price, and so forth).  Then it can
+      be critical to disambiguating the card in those rare cases where
+      the vendor kept the same manufacturer/product pair.  Regular
+      expression matching is not available at this time.</para>
+
+    </sect2>
+
+    <sect2 id="pccard-probe">
+      <title>Sample probe routine</title>
+
+      <para>To understand how to add a device to list of supported
+      devices, one must understand the probe and/or match routines
+      that many drivers have.  It is complicated a little in FreeBSD
+      5.x because there is a compatibility layer for OLDCARD present
+      as well.  Since only the window-dressing is different, I'll be
+      presenting an lidealized version.</para>
+
+<programlisting>static const struct pccard_product wi_pccard_products[] = {
+	PCMCIA_CARD(3COM, 3CRWE737A, 0),
+	PCMCIA_CARD(BUFFALO, WLI_PCM_S11, 0),
+	PCMCIA_CARD(BUFFALO, WLI_CF_S11G, 0),
+	PCMCIA_CARD(TDK, LAK_CD011WL, 0),
+	{ NULL }
+};
+
+static int
+wi_pccard_probe(dev)
+	device_t	dev;
+{
+	const struct pccard_product *pp;
+
+	if ((pp = pccard_product_lookup(dev, wi_pccard_products,
+	    sizeof(wi_pccard_products[0]), NULL)) != NULL) {
+		if (pp->pp_name != NULL)
+			device_set_desc(dev, pp->pp_name);
+		return (0);
+	}
+	return (ENXIO);
+}
+</programlisting>
+
+      <para>Here we have a simple pccard probe routine that matches a
+        few devices.  As stated above, the name may vary (if it isn't
+	<function>foo_pccard_probe()</function> it will be
+	<function>foo_pccard_match()</function>).  The function
+	<function>pccard_product_lookup()</function> is a generalized
+        function that walks the table and returns a pointer to the
+        first entry that it matches.  Some drivers may use this
+        mechanism to convey addtional information about some cards to
+        the rest of the driver, so there may be some variance in the
+        table.  The only requirement is that if you have a
+        different table, the first element of the structure you have a
+        table of be a struct pccard_product.</para>
+
+      <para>Looking at the table wi_pccard_products, one notices that
+        all the entries are of the form PCMCIA_CARD(foo, bar, baz).
+	The foo part is the manufacturer id from pccarddevs.  The bar
+        part is the product.  The baz is the expected function number
+        that for this card.  Many pccards can have multiple functions,
+        and some way to disambiguate function 1 from function 0 is
+        needed.  You may see PCMCIA_CARD_D, which includes the device
+        description from the pccarddevs file.  You may also see
+        PCMCIA_CARD2 and PCMCIA_CARD2_D which are used when you need
+        to match CIS both CIS strings and manufacturer numbers, in the
+        'use the default descrition' and 'take the descrition from
+        pccarddevs' flavors.</para>
+
+    </sect2>
+
+    <sect2 id="pccard-add">
+      <title>Putting it all together</title>
+
+      <para>So, to add a new device, one must do the following steps.
+      First, one must obtain the identification information from the
+      device.  The easiest way to do this is to insert the device into
+      a PC Card or CF slot and issue devinfo -v.  You'll likely see
+      something like:
+<programlisting>        cbb1 pnpinfo vendor=0x104c device=0xac51 subvendor=0x1265 subdevice=0x0300 class=0x060700 at slot=10 function=1
+          cardbus1
+          pccard1
+            unknown pnpinfo manufacturer=0x026f product=0x030c cisvendor="BUFFALO" cisproduct="WLI2-CF-S11" function_type=6 at function=0
+</programlisting>
+      as part of the output.  The manufacturer and product are the
+      numeric IDs for this product.  While the cisvendor and
+      cisproduct are the strings that are present in the CIS that
+      describe this product.</para>
+
+      <para>Since we first want to prefer the
+      numeric option, first try to construct an entry based on that.
+      The above card has been slightly fictionalized for the purpose
+      of this example.  The vendor is BUFFALO, which we see already
+      has an entry:
+<programlisting>vendor BUFFALO			0x026f	BUFFALO (Melco Corporation)
+</programlisting>
+      so we're good there.  Looking for an entry for this card, we do
+      not find one.  Instead we find:
+<programlisting>/* BUFFALO */
+product BUFFALO WLI_PCM_S11	0x0305	BUFFALO AirStation 11Mbps WLAN
+product BUFFALO LPC_CF_CLT	0x0307	BUFFALO LPC-CF-CLT
+product	BUFFALO	LPC3_CLT	0x030a	BUFFALO LPC3-CLT Ethernet Adapter
+product BUFFALO WLI_CF_S11G	0x030b	BUFFALO AirStation 11Mbps CF WLAN
+</programlisting>
+      we can just add
+<programlisting>product BUFFALO WLI2_CF_S11G	0x030c	BUFFALO AirStation ultra 802.11b CF
+</programlisting>
+      to pccarddevs.  Presently, there is a manual step to regenerate
+      the pccarddevs.h file used to convey these identifiers to the
+      the client driver.  The following steps must be done before you
+      can use them in the driver:
+<programlisting>cd src/sys/dev/pccard
+make -f Makefile.pccarddevs
+</programlisting>
+      </para>
+
+      <para>Once these steps are complete, you can add the card to the
+      driver.  That is a simple operation of adding one line:
+<programlisting>static const struct pccard_product wi_pccard_products[] = {
+	PCMCIA_CARD(3COM, 3CRWE737A, 0),
+	PCMCIA_CARD(BUFFALO, WLI_PCM_S11, 0),
+	PCMCIA_CARD(BUFFALO, WLI_CF_S11G, 0),
++	PCMCIA_CARD(BUFFALO, WLI_CF2_S11G, 0),
+	PCMCIA_CARD(TDK, LAK_CD011WL, 0),
+	{ NULL }
+};
+</programlisting>
+      Note that I've included a '+' in the line before the line that I
+      added, but that is simply to highlight the line.  Do not add it
+      to the eactual driver.   Once you've added the line, you can
+      recompile your kernel or module and try to see if it recognizes
+      the device.  If it does and works, please submit a patch.  If it
+      doesn't work, please figure out what is needed to make it work
+      and submit a patch.  If it didn't recgonize it at all, you have
+      done something wrong and should recheck each step.</para>
+
+      <para>If you are a FreeBSD src committer, and everything appears
+      to be working, then you can commit the changes to the tree.
+      However, there are some minor tricky things that you need to
+      worry about.  First, you must commit the pccarddevs file to the
+      tree first.  After you have done that, you must regenerate
+      pccarddevs.h after the commit of pccarddevs and commit that as a
+      second commit (this is to make sure that the right $FreeBSD$ tag
+      is in the latter file).  Finally, you need to commit the
+      additions to the driver.</para>
+
+    </sect2>
+
+    <sect2 id="pccard-pr">
+      <title>Submitting a new device</title>
+
+      <para>Many people send entries for new devices to the author
+      directly.  Please do not do this.  Please submit them as a PR
+      and send the author the PR number for his records.  This makes
+      sure that entries aren't lost.  When submitting a PR, it is
+      unnecessary to include the pccardevs.h diffs in the patch, since
+      those will be regenerated.  It is necessary to include a
+      descrition of the device, as well as the patches to the client
+      driver.  If you don't know the name, use OEM99 as the name, and
+      the author will adjust OEM99 accordingly after investigation.
+      Committers should not commit OEM99, but instead find the highest
+      OEM entry and commit one more than that.</para>
+
+    </sect2>
+
+  </sect1>
+
+</chapter>
diff --git a/en_US.ISO8859-1/books/developers-handbook/pccard/chapter.sgml b/en_US.ISO8859-1/books/developers-handbook/pccard/chapter.sgml
new file mode 100644
index 0000000000..a2cd0bbb01
--- /dev/null
+++ b/en_US.ISO8859-1/books/developers-handbook/pccard/chapter.sgml
@@ -0,0 +1,337 @@
+<!--
+     The FreeBSD Documentation Project
+
+     $FreeBSD$
+-->
+
+<chapter id="pccard">
+  <title>PC Card</title>
+
+  <para>This chapter will talk about the FreeBSD mechanisms for
+    writing a device driver for a PC Card or CardBus device.  However,
+    at the present time, it just documents how to add a driver to an
+    existing pccard driver.</para>
+
+  <sect1 id="pccard-adddev">
+    <title>Adding a device</title>
+
+    <para>Adding a new device to the list of supported devices for
+    pccard devices has changed form the system used through FreeBSD
+    4.  In prior versions, editing a file in /etc to list the device
+    was necessary.  Starting in FreeBSD 5.0, devices drivers know what
+    devices they support.  There is now a table of supported devices
+    in the kernel that drivers use to attach to a device.</para>
+
+    <sect2 id="pccard-overview">
+      <title>Overview</title>
+
+      <para>PC Cards are identified in one of two ways, both based on
+      information in the CIS of the card.  The first method is to use
+      numberic manufacturer and product numbers.  The second method is
+      to use the human readable strings that are also contained in the
+      CIS as well.  The PC Card bus uses a centralized database and
+      some macros to facilitate a design pattern to help the driver
+      writer match devices to his driver.</para>
+
+      <para>There is a widespread practice of one company developing a
+      reference design for a PC Card product and then selling this
+      design to other companies to market.  Those companies refine the
+      design, market the product to their target audience or
+      geographic area and put their own name plate onto the card.
+      However, the refinements to the physical card typically are very
+      minor, if any changes are made at all.  Often, however, to
+      strengthen their branding of their version of the card, these
+      vendors will place their company name in the human strings in
+      the CIS space, but leave the manufacturer and product ids
+      unchanged.</para>
+
+      <param>Because of the above practice, it is a smaller work load
+      for FreeBSD to use the numeric IDs.  It also introduces some
+      minor complications into the process of adding IDs to the
+      system.  One must carefully check to see who really made the
+      card, especially when it appears that the vendor who made the
+      card from might already have a different manufacturer id listed
+      in the central database.  Linksys, D-Link and NetGear are a
+      number of US Manufactuers of LAN hardware that often sell the
+      same design.  These same designs can be sold in Japan under the
+      names such as Buffalo and Corega.  Yet often, these devices will
+      all have the same manufacturer and product id.</param>
+
+      <param>The PC Card bus keeps its central database of card
+      information, but not which driver is associated with them, in
+      /sys/dev/pccard/pccarddevs.  It also provides a set of macros
+      that allow one to easily construct simple entries in the table
+      the driver uses to claim devices.</param>
+
+      <param>Finally, some really low end divices do not contain
+      manufacturer identification at all.  These devices require that
+      one matches them using the human readable CIS strings.  While it
+      would be nice if we didn't need this method as a fallback, it is
+      necessary for some very low end CD-ROM players that are quite
+      popular.  This method should generally be avoided, but a number
+      of devices are listed in this section because they were added
+      prior to the recognition of the OEM nature of the PC Card
+      buisiness.  When adding new devices, prefer using the numberic
+      method.</param>
+
+    </sect2>
+
+    <sect2 id="pccard-pccarddevs">
+      <title>Format of pccarddevs</title>
+
+      <para>There are four sections of the pccarddevs files.  The
+      first section lists the manufacturer numbers for those vendors
+      that use them.  This section is sorted in numerical order.  The
+      next section has all of the products that are used by these
+      vendors, along with their product ID numbers and a description
+      string.  The description string typically isn't used (instead we
+      set the device's description based on the human readable CIS,
+      even if we match on the numeric version).  These two sections
+      are then repeated for those devices that use the string matching
+      method.  Finally, C-style comments are allowed anywhere in the
+      file.</para>
+
+      <para>The first section of the file contains the vendor IDs.
+      Please keep this list sorted in numeric order.  Also, please
+      coordinate changes to this file because we share it with
+      NetBSD to help facilitate a common clearing hose for this
+      information.  For example:
+<programlisting>vendor FUJITSU			0x0004  Fujitsu Corporation
+vendor NETGEAR_2		0x000b  Netgear
+vendor PANASONIC		0x0032	Matsushita Electric Industrial Co.
+vendor SANDISK			0x0045	Sandisk Corporation
+</programlisting>
+      shows the first few vendor ids.  Chances are very good that the
+      NETGEAR_2 entry is really an OEM that NETGEAR purchased cards
+      from and the author of support for those cards was unaware at
+      the time that Netgear was using someone else's id.  These
+      entries are fairly straight forward.  There's the vendor keyword
+      used to denote the kind of line that this is.  There's the name
+      of the vendor.  This name will be repated later in the
+      pccarddevs file, as well as used in the driver's match tables,
+      so keep it short and a valid C identifier.  There's a numeric
+      ID, in hex, for the manufacturer.  Do not add IDs of the form
+      0xffffffff or 0xffff because these are reserved ids (the former
+      is 'no id set' while the latter is sometimes seen in extremely
+      poor quality cards to try to indicate 'none).  Finally there's a
+      string description of the company that makes the card.  This is
+      string is not used in FreeBSD for anything but commentary
+      purposes.
+
+      <para>The second section of the file contains the products.
+      As you can see in the following example:
+<programlisting>/* Allied Telesis K.K. */
+product ALLIEDTELESIS LA_PCM	0x0002 Allied Telesis LA-PCM
+
+/* Archos */
+product	ARCHOS ARC_ATAPI	0x0043 MiniCD
+</programlisting>
+      the format is similar to the vendor lines.  There is the product
+      keyword.  Then there is the vendor name, repeated from above.
+      This is followed by the product name, which is used by the
+      driver and should be a valid C identifier, but may also start
+      with a number.  There's then the product id for this card, in
+      hex.  As with the vendors, there's the same convention for
+      0xffffffff and 0xffff.  Finally, there's a string description of
+      the device itself.  This string typically is not used in
+      FreeBSD, since FreeBSD's pccard bus driver will construct a
+      string from the human readable CIS entries, but can be used in
+      the rare cases where this is somehow insufficient.  The products
+      are in alphabetical order by manufacturer, then numerical order by
+      product id.  They have a C comment before each manufacturer's
+      entries and there is a blank line between entries.</para>
+
+      <para>The third section is like the previous vendor section, but
+      with all of the manufacturer numeric ids as -1.  -1 means 'match
+      anything you find' in the FreeBSD pccard bus code.  Since these
+      are C identifiers, their names must be unique.  Otherwise the
+      format is identical to the first section of the file.</para>
+
+      <para>The final section contains the entries for those cards
+      that we must match with string entries.  This sections' format
+      is a little different than the neric section:
+<programlisting>product ADDTRON AWP100		{ "Addtron", "AWP-100&spWireless&spPCMCIA", "Version&sp01.02", NULL }
+product ALLIEDTELESIS WR211PCM	{ "Allied&spTelesis&spK.K.", "WR211PCM", NULL, NULL } Allied Telesis WR211PCM
+</programlisting>
+      We have the familiar product keyword, followed by the vendor
+      name followed by the card name, just as in the second section of
+      the file.  However, then we deviate from that format.  There is
+      a {} grouping, followed by a number of strings.  These strings
+      correspond to the vendor, product and extra information that is
+      defined in a CIS_INFO tuple.  These strings are filtered by the
+      program that generates pccarddevs.h to replace &amp;sp with a
+      real space.  NULL entries mean that that part of the entry
+      should be ignored.  In the example I've picked, there's a bad
+      entry.  It shouldn't contain the version number in it unless
+      that's critical for the operatin of the card.  Sometimes vendors
+      will have many different versions of the card in the field that
+      all work, in which case that information only makes it harder
+      for someone with a similar card to use it with FreeBSD.
+      Sometimes it is necessary when a vendor wishes to sell many
+      different parts under the same brand due to market
+      considerations (availability, price, and so forth).  Then it can
+      be critical to disambiguating the card in those rare cases where
+      the vendor kept the same manufacturer/product pair.  Regular
+      expression matching is not available at this time.</para>
+
+    </sect2>
+
+    <sect2 id="pccard-probe">
+      <title>Sample probe routine</title>
+
+      <para>To understand how to add a device to list of supported
+      devices, one must understand the probe and/or match routines
+      that many drivers have.  It is complicated a little in FreeBSD
+      5.x because there is a compatibility layer for OLDCARD present
+      as well.  Since only the window-dressing is different, I'll be
+      presenting an lidealized version.</para>
+
+<programlisting>static const struct pccard_product wi_pccard_products[] = {
+	PCMCIA_CARD(3COM, 3CRWE737A, 0),
+	PCMCIA_CARD(BUFFALO, WLI_PCM_S11, 0),
+	PCMCIA_CARD(BUFFALO, WLI_CF_S11G, 0),
+	PCMCIA_CARD(TDK, LAK_CD011WL, 0),
+	{ NULL }
+};
+
+static int
+wi_pccard_probe(dev)
+	device_t	dev;
+{
+	const struct pccard_product *pp;
+
+	if ((pp = pccard_product_lookup(dev, wi_pccard_products,
+	    sizeof(wi_pccard_products[0]), NULL)) != NULL) {
+		if (pp->pp_name != NULL)
+			device_set_desc(dev, pp->pp_name);
+		return (0);
+	}
+	return (ENXIO);
+}
+</programlisting>
+
+      <para>Here we have a simple pccard probe routine that matches a
+        few devices.  As stated above, the name may vary (if it isn't
+	<function>foo_pccard_probe()</function> it will be
+	<function>foo_pccard_match()</function>).  The function
+	<function>pccard_product_lookup()</function> is a generalized
+        function that walks the table and returns a pointer to the
+        first entry that it matches.  Some drivers may use this
+        mechanism to convey addtional information about some cards to
+        the rest of the driver, so there may be some variance in the
+        table.  The only requirement is that if you have a
+        different table, the first element of the structure you have a
+        table of be a struct pccard_product.</para>
+
+      <para>Looking at the table wi_pccard_products, one notices that
+        all the entries are of the form PCMCIA_CARD(foo, bar, baz).
+	The foo part is the manufacturer id from pccarddevs.  The bar
+        part is the product.  The baz is the expected function number
+        that for this card.  Many pccards can have multiple functions,
+        and some way to disambiguate function 1 from function 0 is
+        needed.  You may see PCMCIA_CARD_D, which includes the device
+        description from the pccarddevs file.  You may also see
+        PCMCIA_CARD2 and PCMCIA_CARD2_D which are used when you need
+        to match CIS both CIS strings and manufacturer numbers, in the
+        'use the default descrition' and 'take the descrition from
+        pccarddevs' flavors.</para>
+
+    </sect2>
+
+    <sect2 id="pccard-add">
+      <title>Putting it all together</title>
+
+      <para>So, to add a new device, one must do the following steps.
+      First, one must obtain the identification information from the
+      device.  The easiest way to do this is to insert the device into
+      a PC Card or CF slot and issue devinfo -v.  You'll likely see
+      something like:
+<programlisting>        cbb1 pnpinfo vendor=0x104c device=0xac51 subvendor=0x1265 subdevice=0x0300 class=0x060700 at slot=10 function=1
+          cardbus1
+          pccard1
+            unknown pnpinfo manufacturer=0x026f product=0x030c cisvendor="BUFFALO" cisproduct="WLI2-CF-S11" function_type=6 at function=0
+</programlisting>
+      as part of the output.  The manufacturer and product are the
+      numeric IDs for this product.  While the cisvendor and
+      cisproduct are the strings that are present in the CIS that
+      describe this product.</para>
+
+      <para>Since we first want to prefer the
+      numeric option, first try to construct an entry based on that.
+      The above card has been slightly fictionalized for the purpose
+      of this example.  The vendor is BUFFALO, which we see already
+      has an entry:
+<programlisting>vendor BUFFALO			0x026f	BUFFALO (Melco Corporation)
+</programlisting>
+      so we're good there.  Looking for an entry for this card, we do
+      not find one.  Instead we find:
+<programlisting>/* BUFFALO */
+product BUFFALO WLI_PCM_S11	0x0305	BUFFALO AirStation 11Mbps WLAN
+product BUFFALO LPC_CF_CLT	0x0307	BUFFALO LPC-CF-CLT
+product	BUFFALO	LPC3_CLT	0x030a	BUFFALO LPC3-CLT Ethernet Adapter
+product BUFFALO WLI_CF_S11G	0x030b	BUFFALO AirStation 11Mbps CF WLAN
+</programlisting>
+      we can just add
+<programlisting>product BUFFALO WLI2_CF_S11G	0x030c	BUFFALO AirStation ultra 802.11b CF
+</programlisting>
+      to pccarddevs.  Presently, there is a manual step to regenerate
+      the pccarddevs.h file used to convey these identifiers to the
+      the client driver.  The following steps must be done before you
+      can use them in the driver:
+<programlisting>cd src/sys/dev/pccard
+make -f Makefile.pccarddevs
+</programlisting>
+      </para>
+
+      <para>Once these steps are complete, you can add the card to the
+      driver.  That is a simple operation of adding one line:
+<programlisting>static const struct pccard_product wi_pccard_products[] = {
+	PCMCIA_CARD(3COM, 3CRWE737A, 0),
+	PCMCIA_CARD(BUFFALO, WLI_PCM_S11, 0),
+	PCMCIA_CARD(BUFFALO, WLI_CF_S11G, 0),
++	PCMCIA_CARD(BUFFALO, WLI_CF2_S11G, 0),
+	PCMCIA_CARD(TDK, LAK_CD011WL, 0),
+	{ NULL }
+};
+</programlisting>
+      Note that I've included a '+' in the line before the line that I
+      added, but that is simply to highlight the line.  Do not add it
+      to the eactual driver.   Once you've added the line, you can
+      recompile your kernel or module and try to see if it recognizes
+      the device.  If it does and works, please submit a patch.  If it
+      doesn't work, please figure out what is needed to make it work
+      and submit a patch.  If it didn't recgonize it at all, you have
+      done something wrong and should recheck each step.</para>
+
+      <para>If you are a FreeBSD src committer, and everything appears
+      to be working, then you can commit the changes to the tree.
+      However, there are some minor tricky things that you need to
+      worry about.  First, you must commit the pccarddevs file to the
+      tree first.  After you have done that, you must regenerate
+      pccarddevs.h after the commit of pccarddevs and commit that as a
+      second commit (this is to make sure that the right $FreeBSD$ tag
+      is in the latter file).  Finally, you need to commit the
+      additions to the driver.</para>
+
+    </sect2>
+
+    <sect2 id="pccard-pr">
+      <title>Submitting a new device</title>
+
+      <para>Many people send entries for new devices to the author
+      directly.  Please do not do this.  Please submit them as a PR
+      and send the author the PR number for his records.  This makes
+      sure that entries aren't lost.  When submitting a PR, it is
+      unnecessary to include the pccardevs.h diffs in the patch, since
+      those will be regenerated.  It is necessary to include a
+      descrition of the device, as well as the patches to the client
+      driver.  If you don't know the name, use OEM99 as the name, and
+      the author will adjust OEM99 accordingly after investigation.
+      Committers should not commit OEM99, but instead find the highest
+      OEM entry and commit one more than that.</para>
+
+    </sect2>
+
+  </sect1>
+
+</chapter>