From jackqqpro@gmail.com  Thu Jul 28 02:31:31 2005
Return-Path: <jackqqpro@gmail.com>
Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125])
	by hub.freebsd.org (Postfix) with ESMTP id 8DA8A16A41F
	for <FreeBSD-gnats-submit@freebsd.org>; Thu, 28 Jul 2005 02:31:31 +0000 (GMT)
	(envelope-from jackqqpro@gmail.com)
Received: from wproxy.gmail.com (wproxy.gmail.com [64.233.184.200])
	by mx1.FreeBSD.org (Postfix) with ESMTP id 0477843D45
	for <FreeBSD-gnats-submit@freebsd.org>; Thu, 28 Jul 2005 02:31:30 +0000 (GMT)
	(envelope-from jackqqpro@gmail.com)
Received: by wproxy.gmail.com with SMTP id i22so319350wra
        for <FreeBSD-gnats-submit@freebsd.org>; Wed, 27 Jul 2005 19:31:30 -0700 (PDT)
Received: by 10.54.32.18 with SMTP id f18mr617117wrf;
        Wed, 27 Jul 2005 19:31:30 -0700 (PDT)
Received: from localhost ([60.26.11.39])
        by mx.gmail.com with ESMTP id 24sm1455046wrl.2005.07.27.19.31.23;
        Wed, 27 Jul 2005 19:31:30 -0700 (PDT)
Received: by localhost (sSMTP sendmail emulation); Thu, 28 Jul 2005 10:31:02 +0800
Message-Id: <42e84382.62efe662.6ba8.0274@mx.gmail.com>
Date: Thu, 28 Jul 2005 10:31:02 +0800
From: "Qiu Quan" <jackqqpro@gmail.com>
Reply-To: "Qiu Quan" <jackqqpro@gmail.com>
To: FreeBSD-gnats-submit@freebsd.org
Cc: "Qiu Quan" <jackqqpro@gmail.com>
Subject: [PR] HT80232 PCI NIC on FreeBSD 5.4-RELEASE
X-Send-Pr-Version: 3.113
X-GNATS-Notify:

>Number:         84202
>Category:       kern
>Synopsis:       [ed] [patch] Holtek HT80232 PCI NIC recognition on FreeBSD 5.4-RELEASE
>Confidential:   no
>Severity:       serious
>Priority:       low
>Responsible:    imp
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Thu Jul 28 02:40:15 GMT 2005
>Closed-Date:    Tue Aug 24 20:05:46 MDT 2010
>Last-Modified:  Wed Aug 25 02:10:07 UTC 2010
>Originator:     jackqq <jackqqpro@gmail.com>
>Release:        FreeBSD 5.4-RELEASE i386
>Organization:
>Environment:
System: FreeBSD jack-qq 5.4-RELEASE FreeBSD 5.4-RELEASE #0: Sun Jul 24 11:49:30 CST 2005 root@jack-qq:/usr/src/sys/i386/compile/JACKQQ i386

I'm running FreeBSD on my PC having an Intel Tualatin Celeron CPU on an
i815EPT chipset, and a network adapter using Holtek HT80232 chip.

My kernel was customized from GENERIC. (However, even GENERIC failed to
recognize my NIC.) I removed quite a few SCSI/RAID/NIC drivers for
specific vendors/models, leaving only those I'd probably use on my PC.

I also commented out the line for the driver ed(4), which supported my
NIC, in order to test different flags with if_ed.ko. (I didn't quite
know if there was some better way to do this.)

My kernel configuration file is attached below.


>Description:
The Description and Fix sections are excerpted from the posts in the
freebsd-questions mailing list where we discussed this problem.

My ethernet adapter's chip is Holtek's HT80232. It seems to be not
recognized by the GENERIC kernel or any if_*.ko module on FreeBSD
5.4-RELEASE.

I looked for its driver for FreeBSD. Googling "holtek" "ht80232"
"freebsd", I was shown some clues that FreeBSD seemed to support this
chip. The clue was found in /usr/src/share/misc/pci_vendors, where it
said

12C3    Holtek Microelectronics Inc.
       0058    HT80232 LAN Adapter (NE2000-compatible)
       5598    HT80229 Ethernet Adapter (NE2000-compatible)

Later, I found that the driver ed(4) supported NE2000 NICs, and, it
was included in the GENERIC kernel. But when the machine booting with
GENERIC, the card was not attatched with that driver or even any other
driver. My dmesg(1) is excerpted below:

pcib2: <ACPI PCI-PCI bridge> at device 30.0 on pci0
pcib2:   secondary bus     2
pcib2:   subordinate bus   2
pcib2:   I/O decode        0xc000-0xcfff
pcib2:   memory decode     0xee000000-0xefffffff
pcib2:   prefetched decode 0xfff00000-0xfffff
pcib2:   Subtractively decoded bridge.
ACPI PCI link initial configuration:
pci2: <ACPI PCI bus> on pcib2
pci2: physical bus=2
       map[10]: type 1, range 32, base ef000000, size 17, enabled
pcib2: device (null) requested decoded memory range 0xef000000-0xef01ffff
       map[14]: type 4, range 32, base 0000c000, size  3, enabled
pcib2: device (null) requested decoded I/O range 0xc000-0xc007
       map[18]: type 4, range 32, base 0000c400, size  3, enabled
pcib2: device (null) requested decoded I/O range 0xc400-0xc407
pcib2: matched entry for 2.1.INTA
pcib2: slot 1 INTA hardwired to IRQ 21
found-> vendor=0x12eb, dev=0x0001, revid=0x02
       bus=2, slot=1, func=0
       class=04-01-00, hdrtype=0x00, mfdev=0
       cmdreg=0x0007, statreg=0x0290, cachelnsz=8 (dwords)
       lattimer=0x20 (960 ns), mingnt=0x02 (500 ns), maxlat=0x0c (3000 ns)
       intpin=a, irq=21
       powerspec 1  supports D0 D2 D3  current D0
       map[10]: type 4, range 32, base 0000c800, size  6, enabled
pcib2: device (null) requested decoded I/O range 0xc800-0xc83f
pcib2: matched entry for 2.4.INTA
pcib2: slot 4 INTA hardwired to IRQ 18
found-> vendor=0x12c3, dev=0x0058, revid=0x00
       bus=2, slot=4, func=0
       class=02-00-00, hdrtype=0x00, mfdev=0
       cmdreg=0x0003, statreg=0x0280, cachelnsz=0 (dwords)
       lattimer=0x00 (0 ns), mingnt=0x00 (0 ns), maxlat=0x00 (0 ns)
       intpin=a, irq=18
pci2: <multimedia, audio> at device 1.0 (no driver attached)
pci2: <network, ethernet> at device 4.0 (no driver attached)

I noticed that the card was found on pcib2 slot 4, because the vendor
and device codes matched the ones in the FreeBSD source code. Then, I
discovered ed.0 was disabled in /boot/driver.hints, so I modified that
file like this:

# hint.ed.0.at="isa"
# hint.ed.0.disabled="1"
# hint.ed.0.port="0x280"
# hint.ed.0.irq="10"
# hint.ed.0.maddr="0xd8000"
hint.ed.0.at="pci"

However, this didn't work either.

Then, in the reply, Gary gave me some hint of changing flags/hints for
ed(4). I tried setting flags and/or removing hints for ed(4) but it
didn't work. I get the idea from /boot/device.hints that, perhaps not
quite accurately, hints work more with ISA. But my NIC actually belongs
to the PCI family.

The fixes are described in the Fix section.


>How-To-Repeat:
This is a problem involving hardware configuration. So I don't quite
have chances, especially money, to repeat it on different environment.


>Fix:
In /usr/src/sys/dev/ed/if_ed_pci.c, I inserted a line for my card in an
array named pci_ids[], which read

       { 0x005812c3,   "NE2000 PCI Ethernet (Holtek HT80232)"  },

Finally, I rebuilt the kernel with a dynamic loaded ed(4) driver
(if_ed.ko), which successfully recognized my NIC.

Though without trial, I believe a kernel statically including the
modified ed(4) would also work.

The diff for my modified if_ed_pci.c is attached below.


--- if_ed_pci.c.diff begins here ---
--- /usr/src/sys/dev/ed/if_ed_pci.c.bak	Thu Feb  3 06:44:25 2005
+++ /usr/src/sys/dev/ed/if_ed_pci.c	Sun Jul 24 11:37:32 2005
@@ -55,6 +55,7 @@
 	{ 0x19808c4a,	"NE2000 PCI Ethernet (Winbond W89C940)" },
 	{ 0x0e3410bd,	"NE2000 PCI Ethernet (Surecom NE-34)"	},
 	{ 0x09261106,	"NE2000 PCI Ethernet (VIA VT86C926)"	},
+	{ 0x005812c3,	"NE2000 PCI Ethernet (Holtek HT80232)"	},
 	{ 0x00000000,	NULL					}
 };
 
--- if_ed_pci.c.diff ends here ---

--- JACKQQ begins here ---
# $Jack-QQ: src/sys/i386/conf/JACKQQ,v 0.1 Sat Jul 24 10:40:52 CST 2005 jackqq Exp $

machine		i386
#cpu		I486_CPU
#cpu		I586_CPU
cpu		I686_CPU
ident		JACKQQ

# To statically compile in device wiring instead of /boot/device.hints
#hints		"GENERIC.hints"		# Default places to look for devices.

options 	SCHED_4BSD		# 4BSD scheduler
options 	INET			# InterNETworking
options 	INET6			# IPv6 communications protocols
options 	FFS			# Berkeley Fast Filesystem
options 	SOFTUPDATES		# Enable FFS soft updates support
options 	UFS_ACL			# Support for access control lists
options 	UFS_DIRHASH		# Improve performance on big directories
options 	MD_ROOT			# MD is a potential root device
options 	NFSCLIENT		# Network Filesystem Client
options 	NFSSERVER		# Network Filesystem Server
options 	NFS_ROOT		# NFS usable as /, requires NFSCLIENT
options 	MSDOSFS			# MSDOS Filesystem
options 	CD9660			# ISO 9660 Filesystem
options 	PROCFS			# Process filesystem (requires PSEUDOFS)
options 	PSEUDOFS		# Pseudo-filesystem framework
options 	GEOM_GPT		# GUID Partition Tables.
options 	COMPAT_43		# Compatible with BSD 4.3 [KEEP THIS!]
options 	COMPAT_FREEBSD4		# Compatible with FreeBSD4
options 	SCSI_DELAY=15000	# Delay (in ms) before probing SCSI
options 	KTRACE			# ktrace(1) support
options 	SYSVSHM			# SYSV-style shared memory
options 	SYSVMSG			# SYSV-style message queues
options 	SYSVSEM			# SYSV-style semaphores
options 	_KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions
options 	KBD_INSTALL_CDEV	# install a CDEV entry in /dev
options 	AHC_REG_PRETTY_PRINT	# Print register bitfields in debug
					# output.  Adds ~128k to driver.
options 	AHD_REG_PRETTY_PRINT	# Print register bitfields in debug
					# output.  Adds ~215k to driver.
options 	ADAPTIVE_GIANT		# Giant mutex is adaptive.

device		apic			# I/O APIC

# Bus support.  Do not remove isa, even if you have no isa slots
device		isa
device		eisa
device		pci

# Floppy drives
device		fdc

# ATA and ATAPI devices
device		ata
device		atadisk		# ATA disk drives
device		ataraid		# ATA RAID drives
device		atapicd		# ATAPI CDROM drives
device		atapifd		# ATAPI floppy drives
device		atapist		# ATAPI tape drives
options 	ATA_STATIC_ID	# Static device numbering

# SCSI peripherals
device		scbus		# SCSI bus (required for SCSI)
device		ch		# SCSI media changers
device		da		# Direct Access (disks)
device		sa		# Sequential Access (tape etc)
device		cd		# CD
device		pass		# Passthrough device (direct SCSI access)
device		ses		# SCSI Environmental Services (and SAF-TE)

# atkbdc0 controls both the keyboard and the PS/2 mouse
device		atkbdc		# AT keyboard controller
device		atkbd		# AT keyboard
device		psm		# PS/2 mouse

device		vga		# VGA video card driver

device		splash		# Splash screen and screen saver support

# syscons is the default console driver, resembling an SCO console
device		sc
options 	SC_ALT_MOUSE_IMAGE	# simplified mouse cursor in text mode
options 	SC_PIXEL_MODE		# add support for the raster text mode

device		agp		# support several AGP chipsets

# Floating point support - do not disable.
device		npx

# Power management support (see NOTES for more options)
#device		apm
# Add suspend/resume support for the i8254.
device		pmtimer

# Serial (COM) ports
device		sio		# 8250, 16[45]50 based serial ports

# Parallel port
device		ppc
device		ppbus		# Parallel port bus (required)
device		lpt		# Printer
device		plip		# TCP/IP over parallel
device		ppi		# Parallel port interface device
#device		vpo		# Requires scbus and da

# PCI Ethernet NICs that use the common MII bus controller code.
# NOTE: Be sure to keep the 'device miibus' line in order to use these NICs!
device		miibus		# MII bus support
device		re		# RealTek 8139C+/8169/8169S/8110S
device		rl		# RealTek 8129/8139

# ISA Ethernet NICs.  pccard NICs included.
# 'device ed' requires 'device miibus'
#device		ed		# NE[12]000, SMC Ultra, 3c503, DS8390 cards
device		lnc		# NE2100, NE32-VL Lance Ethernet cards

# ISA devices that use the old ISA shims
#device		le

# Pseudo devices.
device		loop		# Network loopback
device		mem		# Memory and kernel memory devices
device		io		# I/O device
device		random		# Entropy device
device		ether		# Ethernet support
device		sl		# Kernel SLIP
device		ppp		# Kernel PPP
device		tun		# Packet tunnel.
device		pty		# Pseudo-ttys (telnet etc)
device		md		# Memory "disks"
device		gif		# IPv6 and IPv4 tunneling
device		faith		# IPv6-to-IPv4 relaying (translation)

# The `bpf' device enables the Berkeley Packet Filter.
# Be aware of the administrative consequences of enabling this!
# Note that 'bpf' is required for DHCP.
device		bpf		# Berkeley packet filter

# USB support
device		uhci		# UHCI PCI->USB interface
device		ohci		# OHCI PCI->USB interface
#device		ehci		# EHCI PCI->USB interface (USB 2.0)
device		usb		# USB Bus (required)
#device		udbp		# USB Double Bulk Pipe devices
device		ugen		# Generic
device		uhid		# "Human Interface Devices"
device		ukbd		# Keyboard
device		ulpt		# Printer
device		umass		# Disks/Mass storage - Requires scbus and da
device		ums		# Mouse
device		uscanner	# Scanners
--- JACKQQ ends here ---


>Release-Note:
>Audit-Trail:
Responsible-Changed-From-To: freebsd-bugs->freebsd-net 
Responsible-Changed-By: vwe 
Responsible-Changed-When: Sun Jan 4 01:34:48 UTC 2009 
Responsible-Changed-Why:  
the patch is still valid, device is still not supported by ed(4) 
reassign to the net team 

http://www.freebsd.org/cgi/query-pr.cgi?pr=84202 
Responsible-Changed-From-To: freebsd-net->yongari 
Responsible-Changed-By: andre 
Responsible-Changed-When: Mon Aug 23 18:20:43 UTC 2010 
Responsible-Changed-Why:  
Over to expert. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=84202 
Responsible-Changed-From-To: yongari->imp 
Responsible-Changed-By: yongari 
Responsible-Changed-When: Tue Aug 24 17:36:43 UTC 2010 
Responsible-Changed-Why:  
Over to ed(4) maintainer. 
Warner, would you take a look for adding Holtek HT80232 controller? 
I don't know what special treatment is required for this 
controller. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=84202 
State-Changed-From-To: open->closed 
State-Changed-By: imp 
State-Changed-When: Tue Aug 24 20:04:18 MDT 2010 
State-Changed-Why:  
Done.  Didn't implement the Holtek FullDuplex support.  I have no 
hardware, so this would be more speculative than I'm comfortable with. 


http://www.freebsd.org/cgi/query-pr.cgi?pr=84202 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/84202: commit references a PR
Date: Wed, 25 Aug 2010 02:03:57 +0000 (UTC)

 Author: imp
 Date: Wed Aug 25 02:03:48 2010
 New Revision: 211792
 URL: http://svn.freebsd.org/changeset/base/211792
 
 Log:
   Prodded by Yongari, add support for Holtek HT80232.  Add the device
   ID, plus the ability to force '16-bit mode' which really means NE-2000
   mode.  Other open source drivers suggest that the Holtek misbehaves if
   you allow the 8-bit probe.  Also, all of the PCI chips emulate
   NE-2000ish cards, so always force 16-bit mode for memory transfers.
   
   PR:		84202 (patch not used)
 
 Modified:
   head/sys/dev/ed/if_ed_novell.c
   head/sys/dev/ed/if_ed_pci.c
 
 Modified: head/sys/dev/ed/if_ed_novell.c
 ==============================================================================
 --- head/sys/dev/ed/if_ed_novell.c	Wed Aug 25 01:50:12 2010	(r211791)
 +++ head/sys/dev/ed/if_ed_novell.c	Wed Aug 25 02:03:48 2010	(r211792)
 @@ -123,39 +123,50 @@ ed_probe_Novell_generic(device_t dev, in
  	ed_nic_outb(sc, ED_P0_PSTART, 8192 / ED_PAGE_SIZE);
  	ed_nic_outb(sc, ED_P0_PSTOP, 16384 / ED_PAGE_SIZE);
  
 -	sc->isa16bit = 0;
 -
  	/*
 -	 * Write a test pattern in byte mode. If this fails, then there
 -	 * probably isn't any memory at 8k - which likely means that the board
 -	 * is an NE2000.
 +	 * Some devices identify themselves.  Some of those devices
 +	 * can't handle being probed, so we allow forcing a mode.  If
 +	 * these flags are set, force it, otherwise probe.
  	 */
 -	ed_pio_writemem(sc, test_pattern, 8192, sizeof(test_pattern));
 -	ed_pio_readmem(sc, 8192, test_buffer, sizeof(test_pattern));
 -
 -	if (bcmp(test_pattern, test_buffer, sizeof(test_pattern)) == 0) {
 +	if (flags & ED_FLAGS_FORCE_8BIT_MODE) {
 +		sc->isa16bit = 0;
  		sc->type = ED_TYPE_NE1000;
  		sc->type_str = "NE1000";
 -	} else {
 -
 -		/* Not an NE1000 - try NE2000 */
 -		ed_nic_outb(sc, ED_P0_DCR, ED_DCR_WTS | ED_DCR_FT1 | ED_DCR_LS);
 -		ed_nic_outb(sc, ED_P0_PSTART, 16384 / ED_PAGE_SIZE);
 -		ed_nic_outb(sc, ED_P0_PSTOP, 32768 / ED_PAGE_SIZE);
 -
 +	} else if (flags & ED_FLAGS_FORCE_16BIT_MODE) {
  		sc->isa16bit = 1;
 -
 +		sc->type = ED_TYPE_NE2000;
 +		sc->type_str = "NE2000";
 +	} else {
  		/*
 -		 * Write a test pattern in word mode. If this also fails, then
 -		 * we don't know what this board is.
 +		 * Write a test pattern in byte mode. If this fails, then there
 +		 * probably isn't any memory at 8k - which likely means that the board
 +		 * is an NE2000.
  		 */
 -		ed_pio_writemem(sc, test_pattern, 16384, sizeof(test_pattern));
 -		ed_pio_readmem(sc, 16384, test_buffer, sizeof(test_pattern));
 +		ed_pio_writemem(sc, test_pattern, 8192, sizeof(test_pattern));
 +		ed_pio_readmem(sc, 8192, test_buffer, sizeof(test_pattern));
 +
  		if (bcmp(test_pattern, test_buffer, sizeof(test_pattern)) == 0) {
 -			sc->type = ED_TYPE_NE2000;
 -			sc->type_str = "NE2000";
 +			sc->type = ED_TYPE_NE1000;
 +			sc->type_str = "NE1000";
 +			sc->isa16bit = 0;
  		} else {
 -			return (ENXIO);
 +			/* Not an NE1000 - try NE2000 */
 +			sc->isa16bit = 1;
 +			ed_nic_outb(sc, ED_P0_DCR, ED_DCR_WTS | ED_DCR_FT1 | ED_DCR_LS);
 +			ed_nic_outb(sc, ED_P0_PSTART, 16384 / ED_PAGE_SIZE);
 +			ed_nic_outb(sc, ED_P0_PSTOP, 32768 / ED_PAGE_SIZE);
 +			/*
 +			 * Write a test pattern in word mode. If this also fails, then
 +			 * we don't know what this board is.
 +			 */
 +			ed_pio_writemem(sc, test_pattern, 16384, sizeof(test_pattern));
 +			ed_pio_readmem(sc, 16384, test_buffer, sizeof(test_pattern));
 +			if (bcmp(test_pattern, test_buffer, sizeof(test_pattern)) == 0) {
 +				sc->type = ED_TYPE_NE2000;
 +				sc->type_str = "NE2000";
 +			} else {
 +				return (ENXIO);
 +			}
  		}
  	}
  	sc->chip_type = ED_CHIP_TYPE_DP8390;
 
 Modified: head/sys/dev/ed/if_ed_pci.c
 ==============================================================================
 --- head/sys/dev/ed/if_ed_pci.c	Wed Aug 25 01:50:12 2010	(r211791)
 +++ head/sys/dev/ed/if_ed_pci.c	Wed Aug 25 02:03:48 2010	(r211792)
 @@ -49,18 +49,19 @@ static struct _pcsid
  	const char	*desc;
  } pci_ids[] =
  {
 -	{ ED_RTL8029_PCI_ID, "RealTek 8029" }, /* Needs realtek full duplex */
 -	{ 0x50004a14, "NetVin NV5000SC" },
 -	{ 0x09401050, "ProLAN" },
  	{ 0x140111f6, "Compex RL2000" },
 +	{ 0x005812c3, "Holtek HT80232" },
  	{ 0x30008e2e, "KTI ET32P2" },
 -	{ 0x19808c4a, "Winbond W89C940" },
 +	{ 0x50004a14, "NetVin NV5000SC" },
 +	{ 0x09401050, "ProLAN" },
 +	{ ED_RTL8029_PCI_ID, "RealTek 8029" }, /* Needs realtek full duplex */
  	{ 0x0e3410bd, "Surecom NE-34" },
 -	{ 0x09261106, "VIA VT86C926" },		/* only do 16-bit */
 +	{ 0x09261106, "VIA VT86C926" },
 +	{ 0x19808c4a, "Winbond W89C940" },
  	{ 0x5a5a1050, "Winbond W89C940F" },
  #if 0
 -	/* Holtek needs special lovin', disabled by default */
 -	{ 0x005812c3, "Holtek HT80232" },	/* Only 16-bit I/O, Holtek fdx */
 +	/* some Holtek needs special lovin', disabled by default */
 +	/* The Holtek can report/do full duplex, but that's unimplemented */
  	{ 0x559812c3, "Holtek HT80229" },	/* Only 32-bit I/O, Holtek fdx, STOP_PG_60? */
  #endif
  	{ 0x00000000, NULL }
 @@ -87,7 +88,6 @@ static int
  ed_pci_attach(device_t dev)
  {
  	struct	ed_softc *sc = device_get_softc(dev);
 -	int	flags = 0;
  	int	error = ENXIO;
  
  	/*
 @@ -96,9 +96,10 @@ ed_pci_attach(device_t dev)
  	 * are areally just generic ne-2000 cards.
  	 */
  	if (pci_get_devid(dev) == ED_RTL8029_PCI_ID)
 -		error = ed_probe_RTL80x9(dev, PCIR_BAR(0), flags);
 +		error = ed_probe_RTL80x9(dev, PCIR_BAR(0), 0);
  	if (error)
 -		error = ed_probe_Novell(dev, PCIR_BAR(0), flags);
 +		error = ed_probe_Novell(dev, PCIR_BAR(0),
 +		    ED_FLAGS_FORCE_16BIT_MODE);
  	if (error) {
  		ed_release_resources(dev);
  		return (error);
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 
>Unformatted:
