aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/atlx
Commit message (Collapse)AuthorAge
* drivers/net/atlx: fix sparse warnings: make symbols staticHannes Eder2008-12-26
| | | | | | | | | | Fix this sparse warnings: drivers/net/atlx/atl1.c:198:16: warning: symbol 'atl1_check_options' was not declared. Should it be static? drivers/net/atlx/atl1.c:526:5: warning: symbol 'atl1_read_mac_addr' was not declared. Should it be static? Signed-off-by: Hannes Eder <hannes@hanneseder.net> Signed-off-by: David S. Miller <davem@davemloft.net>
* atlx: fix warning in drivers/net/atlx/atl2.cIngo Molnar2008-11-25
| | | | | | | | | | | | | | | | | | | fix this warning: drivers/net/atlx/atl2.c: In function ‘atl2_request_irq’: drivers/net/atlx/atl2.c:644: warning: unused variable ‘err’ 'err' is unused in the !CONFIG_PCI_MSI case. Instead of further increasing the #ifdeffery in this function, restructure the code a bit and get rid of the #ifdef. This relies on the fact that pci_enable_msi() will always fail in the !CONFIG_PCI_MSI case. There should be no change in driver behavior. Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: David S. Miller <davem@davemloft.net>
* netdev: add more functions to netdevice opsStephen Hemminger2008-11-20
| | | | | | | | | | | | This patch moves neigh_setup and hard_start_xmit into the network device ops structure. For bisection, fix all the previously converted drivers as well. Bonding driver took the biggest hit on this. Added a prefetch of the hard_start_xmit in the fast path to try and reduce any impact this would have. Signed-off-by: Stephen Hemminger <shemminger@vyatta.com> Signed-off-by: David S. Miller <davem@davemloft.net>
* Merge branch 'master' of ↵David S. Miller2008-11-20
|\ | | | | | | | | | | | | | | | | | | master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6 Conflicts: drivers/net/ixgbe/ixgbe_main.c include/net/mac80211.h net/phonet/af_phonet.c
| * atl2: don't request irq on resume if netif runningAlan Jenkins2008-11-20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If the device is suspended with the cable disconnected, then resumed with the cable connected, dev->open is called before resume. During resume, we request an IRQ, but the IRQ was already assigned during dev->open, resulting in the warning shown below. Don't request an IRQ if the device is running. Call Trace: [<c011b89a>] warn_on_slowpath+0x40/0x59 [<c023df15>] raw_pci_read+0x4d/0x55 [<c023dff3>] pci_read+0x1c/0x21 [<c01bcd81>] __pci_find_next_cap_ttl+0x44/0x70 [<c01bce86>] __pci_find_next_cap+0x1a/0x1f [<c01bcef9>] pci_find_capability+0x28/0x2c [<c01c4144>] pci_msi_check_device+0x53/0x62 [<c01c49c2>] pci_enable_msi+0x3a/0x1cd [<e019f17b>] atl2_write_phy_reg+0x40/0x5f [atl2] [<c01061b1>] dma_generic_alloc_coherent+0x0/0xd7 [<e019f107>] atl2_request_irq+0x15/0x49 [atl2] [<e01a1481>] atl2_open+0x20b/0x297 [atl2] [<c024a35c>] dev_open+0x62/0x91 [<c0248b9a>] dev_change_flags+0x93/0x141 [<c024f308>] do_setlink+0x238/0x2d5 [<c02501b2>] rtnl_setlink+0xa9/0xbf [<c0297f0c>] mutex_lock+0xb/0x19 [<c024ffa7>] rtnl_dump_ifinfo+0x0/0x69 [<c0250109>] rtnl_setlink+0x0/0xbf [<c024fe42>] rtnetlink_rcv_msg+0x185/0x19f [<c0240fd1>] sock_rmalloc+0x23/0x57 [<c024fcbd>] rtnetlink_rcv_msg+0x0/0x19f [<c0259457>] netlink_rcv_skb+0x2d/0x71 [<c024fcb7>] rtnetlink_rcv+0x14/0x1a [<c025929e>] netlink_unicast+0x184/0x1e4 [<c025992a>] netlink_sendmsg+0x233/0x240 [<c023f405>] sock_sendmsg+0xb7/0xd0 [<c0129131>] autoremove_wake_function+0x0/0x2b [<c0129131>] autoremove_wake_function+0x0/0x2b [<c0147796>] mempool_alloc+0x2d/0x9e [<c020c923>] scsi_pool_alloc_command+0x35/0x4f [<c0297f0c>] mutex_lock+0xb/0x19 [<c028e867>] unix_stream_recvmsg+0x357/0x3e2 [<c01b81c9>] copy_from_user+0x23/0x4f [<c02452ea>] verify_iovec+0x3e/0x6c [<c023f5ab>] sys_sendmsg+0x18d/0x1f0 [<c023ffa8>] sys_recvmsg+0x146/0x1c8 [<c0240016>] sys_recvmsg+0x1b4/0x1c8 [<c0118f48>] __wake_up+0xf/0x15 [<c02586cd>] netlink_table_ungrab+0x17/0x19 [<c01b83ba>] copy_to_user+0x25/0x3b [<c023fe4a>] move_addr_to_user+0x50/0x68 [<c0240266>] sys_getsockname+0x6f/0x9a [<c0240280>] sys_getsockname+0x89/0x9a [<c015046a>] do_wp_page+0x3ae/0x41a [<c0151525>] handle_mm_fault+0x4c5/0x540 [<c02405d0>] sys_socketcall+0x176/0x1b0 [<c010376d>] sysenter_do_call+0x12/0x21 Signed-off-by: Alan Jenkins <alan-jenkins@tuffmail.co.uk> Signed-off-by: Jay Cliburn <jcliburn@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
* | atlx: convert to net_device_opsStephen Hemminger2008-11-20
| | | | | | | | | | | | | | Convert this driver to network device ops. Compile tested only. Signed-off-by: Stephen Hemminger <shemminger@vyatta.com> Signed-off-by: David S. Miller <davem@davemloft.net>
* | Merge branch 'master' of ↵David S. Miller2008-11-19
|\| | | | | | | | | | | | | | | | | master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6 Conflicts: drivers/isdn/i4l/isdn_net.c fs/cifs/connect.c
| * atl1: Do not enumerate options unsupported by chipJ. K. Cliburn2008-11-14
| | | | | | | | | | | | | | | | | | Of the various WOL options provided in include/linux/ethtool.h, the L1 NIC supports only magic packet. Remove all options except magic packet from the atl1 driver. Signed-off-by: Jay Cliburn <jcliburn@gmail.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
* | drivers/net: Kill now superfluous ->last_rx stores.David S. Miller2008-11-04
| | | | | | | | | | | | | | | | | | | | | | | | | | The generic packet receive code takes care of setting netdev->last_rx when necessary, for the sake of the bonding ARP monitor. Drivers need not do it any more. Some cases had to be skipped over because the drivers were making use of the ->last_rx value themselves. Signed-off-by: David S. Miller <davem@davemloft.net>
* | atlx: timer cleanupStephen Hemminger2008-11-02
| | | | | | | | | | | | | | | | | | | | Do some cleanup on timer usage in this driver: * Use round_jiffies to align wakeups and reduce power. * Remove atl1_watchdog which does nothing but rearm itself * Use setup_timer() function Signed-off-by: Stephen Hemminger <shemminger@vyatta.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
* | atlx: use embedded net_device_statsStephen Hemminger2008-11-02
|/ | | | | | | | There is now a net_device_stats structure inside net_device that should be used if possible by devices. Compile tested only. Signed-off-by: Stephen Hemminger <shemminger@vyatta.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
* atl1: fix vlan tag regressionJay Cliburn2008-10-31
| | | | | | | | | | | | | Commit 401c0aabec4b97320f962a0161a846d230a6f7aa introduced a regression in the atl1 driver by storing the VLAN tag in the wrong TX descriptor field. This patch causes the VLAN tag to be stored in its proper location. Tested-by: Ramon Casellas <ramon.casellas@cttc.es> Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net> Cc: stable@kernel.org Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
* atl1: update introductory commentsJay Cliburn2008-10-08
| | | | | | | Update the driver's introductory comments. Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net> Signed-off-by: David S. Miller <davem@davemloft.net>
* atl1: remove LLTXJay Cliburn2008-10-08
| | | | | | | | NETIF_F_LLTX is deprecated. Remove private TX locking from the driver and remove the NETIF_F_LLTX feature flag. Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net> Signed-off-by: David S. Miller <davem@davemloft.net>
* atl1: fix transmit timeout bugJay Cliburn2008-10-08
| | | | | | | | | | | See http://marc.info/?l=linux-netdev&m=121931988219314&w=2 Stop the queue and turn off carrier to prevent transmit timeouts when the cable is unplugged/replugged. Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net> Cc: Alexey Dobriyan <adobriyan@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
* net: remove LLTX in atl2 driverKevin Hao2008-10-08
| | | | | | | | | | | | | | When NETIF_F_LLTX is set, the atlx driver will use a private lock. But in recent kernels this implementation seems redundant and can cause problems where AF_PACKET sees things twice. Since NETIF_F_LLTX is marked as deprecated and shouldn't be used in new driver, this patch removes NETIF_F_LLTX and adds a mmiowb before sending packet. I have tested this driver on a Eee PC. It works well. Signed-off-by: Kevin Hao <kexin.hao@windriver.com> Acked-by: Jay Cliburn <jacliburn@bellsouth.net> Signed-off-by: David S. Miller <davem@davemloft.net>
* net: add net poll support for atl2 driverKevin Hao2008-10-08
| | | | | | | | Add netconsole support for Atheros L2 10/100 network device. Signed-off-by: Kevin Hao <kexin.hao@windriver.com> Acked-by: Jay Cliburn <jacliburn@bellsouth.net> Signed-off-by: David S. Miller <davem@davemloft.net>
* atl2: add tx bytes statisticJay Cliburn2008-09-24
| | | | | Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
* atl2: add atl2 driverChris Snook2008-09-18
| | | | | | | | | Driver for Atheros L2 10/100 network device. Includes necessary changes for Kconfig, Makefile, and pci_ids.h. Signed-off-by: Chris Snook <csnook@redhat.com> Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
* atl1: disable TSO by defaultJay Cliburn2008-08-27
| | | | | | | | | | | | | | | The atl1 driver is causing stalled connections and file corruption whenever TSO is enabled. Two examples are here: http://lkml.org/lkml/2008/7/15/325 http://lkml.org/lkml/2008/8/18/543 Disable TSO by default until we can determine the source of the problem. Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net> cc: stable@kernel.org Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
* atl1: deal with hardware rx checksum bugJay Cliburn2008-08-07
| | | | | | | | | | | | | | | | The L1 hardware contains a bug that flags a fragmented IP packet as having an incorrect TCP/UDP checksum, even though the packet is perfectly valid and its checksum is correct. There's no way to distinguish between one of these good packets and a packet that actually contains a TCP/UDP checksum error, so all we can do is allow the packet to be handed up to the higher layers and let it be sorted out there. Add a comment describing this condition and remove the code that currently fails to handle what may or may not be a checksum error. Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
* atl1: Do not wake queue before queue has been started.David S. Miller2008-07-21
| | | | | | | | | | | | | | | Based upon a bug report by Alexey Dobriyan, the patch is also tested by him and confirmed to fix the problem. Packet flow during link state events should not be done by waking and stopping the TX queue anyways, that is handled transparently by netif_carrier_{on,off}(). So, remove the netif_{wake,stop}_queue() calls in the link check code, and add the necessary netif_start_queue() call to atl1_up(). Signed-off-by: David S. Miller <davem@davemloft.net>
* Merge branch 'master' of ↵David S. Miller2008-06-19
|\ | | | | | | | | | | | | | | master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6 Conflicts: net/mac80211/tx.c
| * atl1: relax eeprom mac address error checkRadu Cristescu2008-06-17
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The atl1 driver tries to determine the MAC address thusly: - If an EEPROM exists, read the MAC address from EEPROM and validate it. - If an EEPROM doesn't exist, try to read a MAC address from SPI flash. - If that fails, try to read a MAC address directly from the MAC Station Address register. - If that fails, assign a random MAC address provided by the kernel. We now have a report of a system fitted with an EEPROM containing all zeros where we expect the MAC address to be, and we currently handle this as an error condition. Turns out, on this system the BIOS writes a valid MAC address to the NIC's MAC Station Address register, but we never try to read it because we return an error when we find the all- zeros address in EEPROM. This patch relaxes the error check and continues looking for a MAC address even if it finds an illegal one in EEPROM. Signed-off-by: Radu Cristescu <advantis@gmx.net> Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
* | Merge branch 'master' of ↵David S. Miller2008-06-13
|\| | | | | | | | | | | | | | | master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6 Conflicts: drivers/net/smc911x.c
| * atl1: fix suspend regressionJay Cliburn2008-06-10
| | | | | | | | | | | | | | | | | | Using vendor magic to force the PHY into power save mode breaks suspend. It isn't needed anyway, so remove it. Tested-by: Avuton Olrich <avuton@gmail.com> Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
* | Merge branch 'master' of ↵David S. Miller2008-06-10
|\| | | | | | | | | | | | | | | | | | | master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6 Conflicts: drivers/net/tg3.c drivers/net/wireless/rt2x00/rt2x00dev.c net/mac80211/ieee80211_i.h
| * Merge branch 'davem-fixes' of ↵David S. Miller2008-06-04
| |\ | | | | | | | | | master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6
| | * atl1: fix 4G memory corruption bugAlexey Dobriyan2008-05-30
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When using 4+ GB RAM and SWIOTLB is active, the driver corrupts memory by writing an skb after the relevant DMA page has been unmapped. Although this doesn't happen when *not* using bounce buffers, clearing the pointer to the DMA page after unmapping it fixes the problem. http://marc.info/?t=120861317000005&r=2&w=2 Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com> Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
| * | misc drivers/net endianness noiseAl Viro2008-05-21
| |/ | | | | | | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
* | atl1: use netdev_alloc_skbStephen Hemminger2008-05-22
| | | | | | | | | | | | | | | | Use netdev_alloc_skb for rx buffer allocation. This sets skb->dev and can be overriden for NUMA machines. Signed-off-by: Stephen Hemminger <shemminger@vyatta.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
* | misc drivers/net endianness noiseAl Viro2008-05-22
|/ | | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
* atl1: bump version numberJay Cliburn2008-05-13
| | | | | | | atl1-2.1.3. Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
* atl1: add shutdown callbackJay Cliburn2008-05-13
| | | | | | | | | Add a shutdown callback that points to atl1_suspend(). This, along with a working suspend function, fixes wake-on-lan. Tested-by: Per Olofsson <pelle@dsv.su.se> Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
* atl1: fix broken suspend and resumeJay Cliburn2008-05-13
| | | | | | | | Fix atl1_suspend() and atl1_resume() so they actually work. We'll use the suspend function for wake-on-lan in addition to just suspending. Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
* atl1: add PHY power save modeJay Cliburn2008-05-13
| | | | | | | | Using vendor-provided magic, add code to enter power save mode on the PHY. We'll need this for suspend and wake-on-lan. Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
* [netdrvr] atlx: code movement: move atl1 parameter parsingChris Snook2008-04-25
| | | | | | | | Move some code from atlx.c to atl1.c to prevent build conflict with the upcoming atl2 code. No changes, just movement. Signed-off-by: Chris Snook <csnook@redhat.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
* atlx: remove flash vendor parameterChris Snook2008-04-25
| | | | | | | | | There's no good reason to manually set the flash vendor in a module parameter, outside of an Atheros hardware lab. Remove it, so nobody accidentally bricks their board using it incorrectly. Signed-off-by: Chris Snook <csnook@redhat.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
* Merge branch 'upstream-net26' of ↵David S. Miller2008-03-22
| | | | | | | | master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6 Conflicts: drivers/s390/net/qeth_main.c
* atl1: reduce forward declarationsJay Cliburn2008-03-17
| | | | | | | | | Rearrange functions to allow removal of some forward declarations. Make certain global functions static along the way. Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net> Acked-by: Chris Snook <csnook@redhat.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
* atl1: make functions staticJay Cliburn2008-03-17
| | | | | | | | | Make needlessly global functions static. In a couple of cases this requires removing forward declarations and reordering functions. Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net> Acked-by: Chris Snook <csnook@redhat.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
* atl1: print debug info if rrd errorJay Cliburn2008-03-17
| | | | | | | | | Add some debug printks if we encounter a potentially bad receive return descriptor. Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net> Acked-by: Chris Snook <csnook@redhat.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
* atl1: use netif_msgJay Cliburn2008-03-17
| | | | | | | | | | Use netif_msg_* for console messages emitted by the driver. Add a parameter to allow control of messaging at driver startup, and also add the ability to control it with ethtool. Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net> Acked-by: Chris Snook <csnook@redhat.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
* atl1: use csum_startJay Cliburn2008-03-17
| | | | | | | | | | Use skb->csum_start for tx checksum offload preparation. Also swap the variables css and cso so they hold the intended values of csum start and offset, respectively. Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net> Acked-by: Chris Snook <csnook@redhat.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
* atl1: simplify tx packet descriptorJay Cliburn2008-03-17
| | | | | | | | | | | | | | | | | | | The transmit packet descriptor consists of four 32-bit words, with word 3 upper bits overloaded depending upon the condition of its bits 3 and 4. The driver currently duplicates all word 2 and some word 3 register bit definitions unnecessarily and also uses a set of nested structures in its definition of the TPD without good cause. This patch adds a lengthy comment describing the TPD, eliminates duplicate TPD bit definitions, and simplifies the TPD structure itself. It also expands the TSO check to correctly handle custom checksum versus TSO processing using the revised TPD definitions. Finally, shorten some variable names in the transmit processing path to reduce line lengths, rename some variables to better describe their purpose (e.g., nseg versus m), and add a comment or two to better describe what the code is doing. Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net> Acked-by: Chris Snook <csnook@redhat.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
* atl1: add ethtool register dumpJay Cliburn2008-03-17
| | | | | | | | Add the ethtool register dump option to the atl1 driver. Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net> Acked-by: Chris Snook <csnook@redhat.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
* atl1: fix broken TSOJay Cliburn2008-03-17
| | | | | | | | | | | | | | | | The L1 tx packet descriptor expects TCP Header Length to be expressed as a number of 32-bit dwords. The atl1 driver uses tcp_hdrlen() to populate the field, but tcp_hdrlen() returns the header length in bytes, not in dwords. Add a shift to convert tcp_hdrlen() to dwords when we write it to the tpd. Also, some of our bit assignments are made to the wrong tpd words. Change those to the correct words. Finally, since all this fixes TSO, enable TSO by default. Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net> Acked-by: Chris Snook <csnook@redhat.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
* atl1: move common functions to atlx filesJay Cliburn2008-03-17
| | | | | | | | | | | | | | | | | | | The future atl2 driver and the existing atl1 driver can share certain functions and definitions. Move these shareable functions and definitions out of atl1-specific files and into atlx.c and atlx.h. Some transitory hackery will be present until atl2 is merged. Reduce the number of source files by moving ethtool, hw, and param functions from separate files into atl1_main.c, then rename it to just atl1.c. Move all atl1-specific definitions from atl1_hw.h to atl1.h. Finally, clean up to make checkpatch.pl happy. Signed-off-by: Chris Snook <csnook@redhat.com> Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net> Signed-off-by: Jeff Garzik <jeff@garzik.org>
* atl1: relocate atl1 driver to /drivers/net/atlxJay Cliburn2008-03-17
In preparation for a future Atheros L2 NIC driver (called atl2), relocate the atl1 driver into a new /drivers/net/atlx directory that will ultimately be shared with the future atl2 driver. Signed-off-by: Chris Snook <csnook@redhat.com> Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net> Signed-off-by: Jeff Garzik <jeff@garzik.org>