Subject: [PATCHES] 2.4.x net driver updates

From: Jeff Garzik <[email-masked]>
Date: Thu, 19 Jun 2003 23:59:13 -0400

This is the patchset going to Marcelo after he releases 2.4.22-pre1.

BK users may issue

	bk pull bk://kernel.bkbits.net/jgarzik/net-drivers-2.4

Others may download the patch from

ftp://ftp.kernel.org/pub/linux/kernel/people/jgarzik/patchkits/2.4/2.4.21-netdrvr1.patch.bz2

This will update the following files:

 drivers/net/bonding.c                | 3434 ------------------------
 Documentation/Configure.help         |    9 
 Documentation/networking/bonding.txt |  537 ++-
 Documentation/networking/ifenslave.c |  496 ++-
 drivers/net/3c59x.c                  |   13 
 drivers/net/8139cp.c                 |    9 
 drivers/net/8139too.c                |    6 
 drivers/net/Config.in                |    3 
 drivers/net/Makefile                 |    8 
 drivers/net/amd8111e.c               | 1075 ++++---
 drivers/net/amd8111e.h               |  968 +++---
 drivers/net/arcnet/arcnet.c          |    2 
 drivers/net/arcnet/rfc1201.c         |    6 
 drivers/net/bonding.c                |  266 +
 drivers/net/bonding/Makefile         |   18 
 drivers/net/bonding/bond_3ad.c       | 2667 ++++++++++++++++++-
 drivers/net/bonding/bond_3ad.h       |  342 ++
 drivers/net/bonding/bond_alb.c       | 1585 +++++++++++
 drivers/net/bonding/bond_alb.h       |  129 
 drivers/net/bonding/bond_main.c      | 4883 +++++++++++++++++++++++++++++++----
 drivers/net/bonding/bonding.h        |  209 +
 drivers/net/cs89x0.c                 |   11 
 drivers/net/dl2k.h                   |    1 
 drivers/net/e100/e100.h              |   30 
 drivers/net/e100/e100_main.c         |  389 +-
 drivers/net/e100/e100_phy.c          |    7 
 drivers/net/e100/e100_test.c         |  155 -
 drivers/net/e1000/Makefile           |    2 
 drivers/net/e1000/e1000.h            |    8 
 drivers/net/e1000/e1000_ethtool.c    |  959 ++++++
 drivers/net/e1000/e1000_hw.c         |   23 
 drivers/net/e1000/e1000_hw.h         |    8 
 drivers/net/e1000/e1000_main.c       |  312 +-
 drivers/net/e1000/e1000_osdep.h      |    2 
 drivers/net/eepro.c                  |    2 
 drivers/net/eepro100.c               |    1 
 drivers/net/ns83820.c                |    2 
 drivers/net/pci-skeleton.c           |    4 
 drivers/net/pcnet32.c                |    9 
 drivers/net/r8169.c                  |   52 
 drivers/net/sis900.c                 |  100 
 drivers/net/sk98lin/skge.c           |    2 
 drivers/net/sundance.c               |  144 -
 drivers/net/tg3.c                    |    2 
 drivers/net/tlan.c                   |  258 +
 drivers/net/tlan.h                   |    7 
 drivers/net/tokenring/olympic.c      |    3 
 drivers/net/tulip/tulip_core.c       |    7 
 drivers/net/typhoon.c                |    4 
 drivers/net/via-rhine.c              |    2 
 drivers/net/wireless/airo.c          |    2 
 include/linux/ethtool.h              |   27 
 include/linux/if_arcnet.h            |    4 
 include/linux/if_bonding.h           |  101 
 include/linux/if_vlan.h              |    1 
 include/linux/skbuff.h               |    4 
 include/net/if_inet6.h               |    5 
 include/net/irda/irlan_common.h      |    2 
 net/core/dev.c                       |    4 
 net/core/skbuff.c                    |    3 
 net/ipv6/addrconf.c                  |   13 
 net/ipv6/ndisc.c                     |    3 
 net/irda/irlan/irlan_eth.c           |    6 
 63 files changed, 13372 insertions(+), 5974 deletions(-)

through these ChangeSets:

<[email-masked]> (03/06/19 1.1236)
   [PATCH] PATCH: fix bug in drivers/net/cs89x0.c:set_mac_address()
   
   Hello Andrew, Jeff and Alan,
   
   the following patch fixes a bug in the CS89xx net device which
   would set new MAC address through SIOCSIFHWADDR _only_ when
   net_debug is set, which is obviously not what it was meant to do.
   The original code bogusly interpreted the addr argument as a buffer
   containing the MAC address instead of a struct sockaddr.
   
   Applies as-is to 2.4.20 and with offset to 2.5.69. Please forward
   it to Linus and Marcelo. This bug has been found and fixed by
   Stefano Fedrigo <[email-masked]>.

<[email-masked]> (03/06/19 1.1235)
   [netdrvr sis900] minor fixes from 2.5
   
   spelling, C99 initializers, jiffy wrap, set_bit

<[email-masked]> (03/06/19 1.1234)
   [netdrvr sis900] make function headers readable by kernel-doc tool

<[email-masked]> (03/06/19 1.1233)
   [PATCH] Remove warning due to comparison in drivers/net/pcnet32.c
   
   drivers/net/pcnet32.c: In function `pcnet32_init_ring':
   drivers/net/pcnet32.c:1006: warning: comparison between pointer and integer

<[email-masked]> (03/06/19 1.1232)
   [PATCH] new eepro100 PDI ID
   
   	[PATCH] new eepro100 PDI ID
   
   	From: Tom Alsberg <[email-masked]>
   
   	Add support for a new eepro100 PCI ID.

<[email-masked]> (03/06/19 1.1231)
   [PATCH] Remove copied inet_aton code in bond_main.c
   
   According to a report the my_inet_aton code in bond_main.c is copied
   from 4.4BSD, but it doesn't carry a BSD copyright license. In addition
   it is somewhat redundant with the standard in_aton.  Convert it
   to use the linux function.
   
   Error handling is a bit worse than before, but not much.
   
   Patch for 2.5 bonding. The 2.4 version has the same problem, but afaik
   it is scheduled to be replaced by the 2.5 codebase anyways.
   
   -Andi

<[email-masked]> (03/06/19 1.1230)
   [PATCH] Additional 3c980 device support
   
   From: "J.A. Magallon" <[email-masked]>
   
   Adds support for a couple of 3c980 variants which are in pci.ids, but not in
   the driver.

<[email-masked]> (03/06/08 1.1226)
   [netdrvr amd8111e] bug fix: move stats update after irq free

<[email-masked]> (03/06/08 1.1225)
   [e1000] Whitespace cleanup
   
   * Whitespace cleanup

<[email-masked]> (03/06/08 1.1224)
   [e1000] Miscellaneous code cleanup
   
   * Added Change Log entries
   * Miscellaneous code cleanup

<[email-masked]> (03/06/08 1.1223)
   [e1000] Fixed LED coloring on 82541/82547 controllers
   
   * LED colors on 82541 and 82547 controllers were incorrect.
     The LED mode register didn't have the proper configuration.

<[email-masked]> (03/06/08 1.1222)
   [e1000] Removed strong branded device ids
   
   * Removed strong branded device ids from teh device id table
     along with the associated branding strings.

<[email-masked]> (03/06/08 1.1221)
   [e1000] Added support for 82546 Quad-port adapter
   
   * Added support for 82546 Quad-port adapter

<[email-masked]> (03/06/08 1.1220)
   [e1000] Added ethtool test ioctl
   
   * Added routines for the Ethtool Test ioctl.
   * Added more statistics for the Ethtool statistics dump.
   * Added more registers for the register dump.

<[email-masked]> (03/06/08 1.1219)
   [e1000] TSO fix
   
   * Premature write-back of descriptors during TSO causing
     resources to be returned too early on ppc64.  Fix is to
     wait until last descriptor of frame is written back,
     then return resources back to OS.
   * 82544 hang caused by setting RS bit in context descriptor.
     Exposes known hang in 82544.  Fix is same as above - set
     RS bit only in last descriptor.

<[email-masked]> (03/06/08 1.1218)
   [e100] misc
   
   * Removed leftovers from removal of /proc support and IDIAG support
   * Cleaned up reporting of h/w init failure messages
   * Add 1/2 second delay after PHY reset to allow link partner to
     see and respond to reset, per IEEE 802.3.

<[email-masked]> (03/06/08 1.1217)
   [e100] set netdev members before registration
   
   * Bug fix: setndev members before netdev registration to avoid races.

<[email-masked]> (03/06/08 1.1216)
   [e100] use skb_headlen() rather than rolling own.
   
   * Cleanup: use skb_headlen() rather than rolling own.  Sync w/ 2.5 driver.

<[email-masked]> (03/06/08 1.1215)
   [e100] VLAN configuration was lost after ethtool diags run
   
   * Bug fix: ethtool diags would call e100_up/e100_down, which overwrite
     current VLAN settings.  Move initialization of config regs out of
     up/down.

<[email-masked]> (03/06/08 1.1214)
   [e100] fixed stalled stats collection
   
   * Bug fix: In the rare event of a failed command to dump stats,
     stat collection would stop, giving the illusion that traffic
     had stopped.  Fixed by issuing stat dump in watchdog
     regardless of the status of previous attempt to dump stats.

<[email-masked]> (03/06/08 1.1213)
   [e100] full stop/start on ethtool set speed/duplex/autoneg
   
   * Cleanup ethtool/mii_ioctl sets of speed/duplex/autoneg by
     stop/set/start driver to ensure sets stick.  Must hold
     xmit_lock around stop/start.

<[email-masked]> (03/06/08 1.1212)
   [e100] cleanup Tx resources before running ethtool diags
   
   * Bug fix: clean up Tx resources before runnig ethtool diags.

<[email-masked]> (03/06/08 1.1211)
   [e100] Add MDI/MDI-X status to ethtool reg dump
   
   * Add MDI/MDI-X (crossover cable) status to ethtool reg dump.

<[email-masked]> (03/06/08 1.1210)
   [e100] Add ethtool cable diag test
   
   * Feature add: ethtool cable diag test.
   * Some cleanup of the ethtool diags.
   * Fixed bug in return code for ethtool diag results.

<[email-masked]> (03/06/08 1.1209)
   [e100] Add ethtool parameter support
   
   * Feature add: ethtool parameter support: Tx/Rx ring size, Rx xsum
     offloading, flow control.

<[email-masked]> (03/06/08 1.1208)
   [e100] move e100_asf_enable under CONFIG_PM to avoid warning
   
   * Bug fix: move e100_asf_enable under CONFIG_PM to avoid compile warning.
     [Stephen Rothwell ([email-masked])]

<[email-masked]> (03/06/08 1.1207)
   [e100] Remove "Freeing alive device" warning
   
   * Bug fix: don't call any netif_carrier_* until netdev is registered.
     [Andrew Morton ([email-masked])]

<[email-masked]> (03/06/06 1.1205)
   [PATCH] Bonding 2.4 update patch 6
   
   	Fix to the ifenslave -c fix, fix to version control (plus
   change log update).  I've got an additional fix for version control
   that I'll send you on Monday.
   
   Index: linux-2.4.21-rc6-netdrvr1/Documentation/networking/ifenslave.c

<[email-masked]> (03/06/06 1.1204)
   [PATCH] Bonding 2.4 update patch 5
   
   	Fix to prevent routes on the bonding device from being lost
   during enslavement processing.
   
   Index: linux-2.4.21-rc6-netdrvr1/Documentation/networking/ifenslave.c

<[email-masked]> (03/06/06 1.1203)
   [PATCH] Bonding 2.4 update patch 4
   
   	A fix for ifenslave -c.  Later patches have fixes for this fix.
   
   Index: linux-2.4.21-rc6-netdrvr1/Documentation/networking/ifenslave.c

<[email-masked]> (03/06/06 1.1202)
   [PATCH] Bonding 2.4 update patch 3
   
   	A patch with some miscellaneous little stuff (comments, mode
   names, fix a printk).
   
   Index: linux-2.4.21-rc6-netdrvr1/drivers/net/bonding/bond_main.c

<[email-masked]> (03/06/06 1.1201)
   [PATCH] Bonding 2.4 update patch 2
   
   	Small patch to fix endless failover problem in the ARP monitor.
   
   Index: linux-2.4.21-rc6-netdrvr1/drivers/net/bonding/bond_main.c

<[email-masked]> (03/06/06 1.1200)
   [PATCH] Bonding 2.4 update patch 1
   
   	Documentation.
   
   Index: linux-2.4.21-rc6-netdrvr1/Documentation/networking/bonding.txt

<[email-masked]> (03/06/06 1.1199)
   [PATCH] remove ethtool privileged references
   
   dev_ioctl already checks capable(CAP_NET_ADMIN) for SOICETHTOOL, so
   privileged reference are not necessary.

<[email-masked]> (03/06/06 1.1198)
   [PATCH] 10GbE ethtool support
   
   Add 10GbE support for ethtool.

<[email-masked]> (03/06/05 1.1197)
   [netdrvr amd8111e] link against mii lib

<[email-masked]> (03/06/04 1.1196)
   [netdrvr] gcc 3.3 cleanups
   
   Mostly marking 64-bit constants as ULL.

<[email-masked]> (03/05/29 1.1185.1.52)
   [netdrvr amd8111e] remove out-of-tree feature that snuck in

<[email-masked]> (03/05/29 1.1185.1.51)
   [netdrvr amd8111e] interrupt coalescing, libmii, bug fixes
   
   * Dynamic interrupt coalescing
   * mii lib support
   * dynamic IPG support (disabled by default)
   * jumbo frame fix
   * vlan fix
   * rx irq coalescing fix

<[email-masked]> (03/05/29 1.1185.1.50)
   [netdrvr tlan] fix 64-bit issues

<[email-masked]> (03/05/29 1.1185.1.49)
   [netdrvr r8169] sync with 2.5 (backport whitespace cleanups)

<[email-masked]> (03/05/29 1.1185.1.48)
   [netdrvr r8169] use alloc_etherdev (fix race), pci_disable_device

<[email-masked]> (03/05/29 1.1185.1.47)
   [netdrvr olympic] fix build with gcc 3.3

<[email-masked]> (03/05/29 1.1185.6.3)
   [netdrvr 8139too] add comment, whitespace cleanup

<[email-masked]> (03/05/28 1.1185.6.2)
   [netdrvr] s/init_etherdev/alloc_etherdev/ in code comments,
   in 8139too and pci-skeleton drivers.

<[email-masked]> (03/05/28 1.1185.6.1)
   [netdrvr tlan] backport fixes and cleanups from 2.5
   
   * alloc_etherdev (fixes race)
   * PCI DMA API
   * C99 initializers
   * speling fixes
   * use pci_{request,release}_regions for PCI devices
   * propagate error returns back from pci_xxx functions
   * call pci_set_dma_mask
   * use keventd for adapter error reset (2.5 uses workqueue)

<[email-masked]> (03/05/27 1.1185.1.45)
   [netdrvr pcnet32] bug fixes
   
   I would like to see a couple of the pcnet32 changes that I think we can
   agree on be put into the trees so a couple of the potential defects can be
   avoided.  The following patch contains just these pieces.  The only
   controversial one is an arbitrary change in the number of iterations in a
   while loop spinning on hardware state.   No matter how this is done, I am
   not especially fond of this bit of code as it has no reasonable error
   recovery path -- however, as a half-way, incremental solution, increasing
   the polling time should help as the 100 value was certainly found to be
   insufficient.  1000 may not be sufficient either, but it is certainly no
   worse.
   
   Both of the other changes were hit in testing (and I belive the wmb() at a
   customer even), so it would help reduce some debug if these go in.  Any
   feedback is appreciated - thanks.

<[email-masked]> (03/05/27 1.1185.1.44)
   [netdrvr eepro] update MODULE_AUTHOR per old-author request

<[email-masked]> (03/05/27 1.1185.1.43)
   [netdrvr sundance] fix another flow control bug

<[email-masked]> (03/05/27 1.1185.1.42)
   [netdrvr sundance] fix flow control bug

<[email-masked]> (03/05/27 1.1185.1.41)
   [netdrvr bonding] fix ABI version control problem
   
   This fix makes bonding not commit to a specific ABI version if the ioctl
   command is not supported by bonding.
   
   (It also removes the '\n' in the continuous printk reporting the link down
   event in bond_mii_monitor - it got in there by mistake in our previous
   patch set and caused log messages to appear funny in some situations).

<[email-masked]> (03/05/27 1.1185.1.40)
   [netdrvr bonding] fix long failover in 802.3ad mode
   
   This patch fixes the bug reported by Jay on April 3rd regarding long
   failover time when releasing the last slave in the active aggregator. The
   fix, as suggested by Jay, is to follow the spec recommendation and send a
   LACPDU to the partner saying this port is no longer aggregatable and
   therefore trigger an immediate re-selection of a new aggregator instead of
   waiting the entire expiration timeout.

<[email-masked]> (03/05/25 1.1185.1.39)
   IPv6 over ARCnet (RFC2497) support, IPv6 part.

<[email-masked]> (03/05/25 1.1185.1.38)
   IPv6 over ARCnet (RFC2497) support, driver part

<[email-masked]> (03/05/25 1.1185.1.37)
   [irda] module refcounts for irlan

<[email-masked]> (03/05/23 1.1185.3.7)
   [bonding] small cleanups

<[email-masked]> (03/05/23 1.1185.3.6)
   [bonding] add rcv load balancing mode
   
   This patch adds a new mode that enables receive load balancing for IPv4
   traffic on top of the transmit load balancing mode. This capability is
   achieved by intercepting and manipulating the ARP negotiation to teach
   clients several MAC addresses for the bond and thus distribute incoming
   traffic among all slaves with the highest link speed.
   
   In order to function properly, slaves are required to be able to have
   their MAC address set even while the interface is up since once the
   primary slave looses its link, the new primary slave (and only it) must be
   able to take over and receive the incoming traffic instead. If a
   non-primary slave looses its link, ARP packets will be sent to all clients
   communicating through it in order to teach them a replacement MAC address,
   and the primary slave will be put in promiscuous mode for 10 seconds for
   fault tolerance reasons.
   
   This patch is against bonding-20030415, but must come only after the
   locking scheme changing patch since it uses dev_set_promiscuity() that
   would otherwise cause a system hang.

<[email-masked]> (03/05/23 1.1185.3.5)
   [bonding] support xmit load balancing mode

<[email-masked]> (03/05/23 1.1185.3.4)
   [bonding] much improved locking
   
   This patch replaces the use of lock_irqsave/unlock_irqrestore in bonding
   with lock/unlock or lock_bh/unlock_bh as appropriate according to context.
   This change is based on a previous discussion regarding the fact that
   holding a lock_irqsave doesn't prevent softirqs from running which can
   cause deadlocks in certain situations. This new locking scheme has already
   undergone massive testing cycle by our QA group and we feel it is ready
   for release (some new modes and enhancements will not work properly
   without it).

<[email-masked]> (03/05/23 1.1185.3.3)
   [bonding] better 802.3ad mode control, some cleanup
   
   This patch adds the lacp_rate module param to enable better control over
   the IEEE 802.3ad mode. This param controls the rate at which the partner
   system is asked to send LACPDUs to bonding.
   Two options exist:
   - slow (or 0) - LACPDUs are 30 seconds apart
   - fast (or 1) - LACPDUs are 1 second apart
   The default is slow (like most switches around).
   
   There are also some code beautifications (mainly converting comments to C
   style in code segments we added in the past).

<[email-masked]> (03/05/23 1.1185.3.2)
   [bonding] ABI versioning
   
   This patch adds user-land to kernel ABI version control in bonding to
   restore backward compatibility between different versions of ifenslave and
   the bonding module. It uses ethtool's GDRVINFO ioctl to pass the ABI
   version number between ifenslave and the bonding module in both directions
   so both the driver and the application can tell which partner they're
   working against and take the appropriate measures when enslaving/releasing
   an interface. The bonding module remembers the ABI version received from
   the application, and from that moment on will deny enslave and release
   commands from an application using a different ABI version, which means
   that if you want to switch to an ifenslave with a different ABI version
   (or with non at all), you'll first have to re-load the bonding module.
   
   This patch also changes the driver/application versioning scheme to
   contain 3 fields X.Y.Z with the follows meaning:
   X - Major version - big behavior changes
   Y - Minor version - addition of features
   Z - Extra version - minor changes and bug fixes
   
   There are also three minor bug fixes:
   1. Prevent enslaving an interface that is already a slave.
   2. Prevent enslaving if the bond is down.
   3. In bond_release_all, save old value of current_slave before assigning
      NULL to it to enable using it's original value later on.
   
   This patch is against bonding-20030415.

<[email-masked]> (03/04/27 1.1137.1.6)
   [netdrvr e1000] add TSO support -- disabled
   
   * Copy TSO support for 2.5 e1000.  Wrapped with NETIF_F_TSO, so
     not currently enabled in 2.4.  Done to keep 2.4 and 2.5 drivers
     in-sync as much as possible.

<[email-masked]> (03/04/27 1.1137.1.5)
   [netdrvr e1000] add support for NAPI
   
   * Copy NAPI support from 2.5 e1000 driver
   * Add CONFIG_E1000_NAPI option

<[email-masked]> (03/04/27 1.1137.1.4)
   [netdrvr tulip] support DM910x chip from ALi

<[email-masked]> (03/04/27 1.1137.1.3)
   Remove duplicate CONFIG_TULIP_MWI entry in Configure.help
   
   Noticed by Geert Uytterhoeven

<[email-masked]> (03/04/27 1.1137.1.2)
   [netdrvr 8139cp] enable MWI via pci_set_mwi, rather than manually

<[email-masked]> (03/04/26 1.1131.2.6)
   [netdrvr typhoon] s/#if/#ifdef/ for a CONFIG_ var

<[email-masked]> (03/04/25 1.1131.2.5)
   [netdrvr sundance] small cleanups from 2.5
   
   - s/long flag/unsigned long flag/
   - C99 initializers

<[email-masked]> (03/04/25 1.1131.2.4)
   [netdrvr sundance] bug fixes, VLAN support
   
       - Fix tx bugs in big-endian machines
       - Remove unused max_interrupt_work module parameter, the new 
         NAPI-like rx scheme doesn't need it.
       - Remove redundancy get_stats() in intr_handler(), those 
         I/O access could affect performance in ARM-based system
       - Add Linux software VLAN support
       - Fix bug of custom mac address 
       (StationAddr register only accept word write) 

<[email-masked]> (03/04/25 1.1131.2.3)
   [netdrvr via-rhine] fix promisc mode
   
   I found a via-rhine bug, it can't receive BPDU (mac: 0180c2000000)
   in promiscuous mode. 
   Fill all "1" in hash table to fix this problem in promiscuous mode.
   (RCR remain 0x1c, write it as 0x1f don't work)

<[email-masked]> (03/04/25 1.1131.2.2)
   [wireless airo] fix end-of-array test
   
   FYI statsLabels[] is an array of char*, so the fix below
   is pretty obvious.

<[email-masked]> (03/04/25 1.1131.2.1)
   [PATCH] fix .text.exit error in drivers/net/r8169.c
   
   In drivers/net/r8169.c the function rtl8169_remove_one is __devexit but
   the pointer to it didn't use __devexit_p resulting in a.text.exit
   compile error when !CONFIG_HOTPLUG.
   
   The fix is simple:

<[email-masked]> (03/04/17 1.1101.8.7)
   [bonding] add support for IEEE 802.3ad Dynamic link aggregation
   
   Contributed by Shmulik Hen @ Intel, merge by Jay Vosburgh @ IBM

<[email-masked]> (03/04/17 1.1101.8.6)
   [bonding] move private decls into new drv/net/bonding/bonding.h file

<[email-masked]> (03/04/17 1.1101.8.5)
   [bonding] move driver into new drivers/net/bonding directory

<[email-masked]> (03/04/17 1.1101.8.4)
   [bonding] Moved setting slave mac addr, and open, from app to the driver
   
   This patch enables support of modes that need to use the unique mac 
   address of each slave. It moves setting the slave's mac address and 
   opening it from the application to the driver.
   This breaks backward compatibility between the new driver and older 
   applications !
   It also blocks possibility of enslaving before the master is up (to 
   prevent putting the system in an unstable state), and removes the code 
   that unconditionally restores all base driver's flags (flags are 
   automatically restored once all undo stages are done in proper order).
   
   Contributed by Shmulik Hen @ Intel

<[email-masked]> (03/04/17 1.1101.8.3)
   [bonding] add support for getting slave's speed and duplex via ethtool
   
   Contributed by Shmulik Hen @ Intel

<[email-masked]> (03/04/17 1.1101.8.2)
   [bonding] fix comment to prevent future merge difficulties
   
   Contributed by Jay Vosburgh @ IBM

<[email-masked]> (03/04/17 1.1101.8.1)
   [net] store physical device a packet arrives in on
   
   (Needed for bonding)
   
   Contributed by Jay Vosburgh @ IBM, Shmulik Hen @ Intel, and others.