Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 11 Oct 2008 16:33:18 +0000 (09:33 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 11 Oct 2008 16:33:18 +0000 (09:33 -0700)
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1075 commits)
  myri10ge: update driver version number to 1.4.3-1.369
  r8169: add shutdown handler
  r8169: preliminary 8168d support
  r8169: support additional 8168cp chipset
  r8169: change default behavior for mildly identified 8168c chipsets
  r8169: add a new 8168cp flavor
  r8169: add a new 8168c flavor (bis)
  r8169: add a new 8168c flavor
  r8169: sync existing 8168 device hardware start sequences with vendor driver
  r8169: 8168b Tx performance tweak
  r8169: make room for more specific 8168 hardware start procedure
  r8169: shuffle some registers handling around (8168 operation only)
  r8169: new phy init parameters for the 8168b
  r8169: update phy init parameters
  r8169: wake up the PHY of the 8168
  af_key: fix SADB_X_SPDDELETE response
  ath9k: Fix return code when ath9k_hw_setpower() fails on reset
  ath9k: remove nasty FAIL macro from ath9k_hw_reset()
  gre: minor cleanups in netlink interface
  gre: fix copy and paste error
  ...

893 files changed:
Documentation/DocBook/mac80211.tmpl
Documentation/feature-removal-schedule.txt
Documentation/networking/LICENSE.qlge [new file with mode: 0644]
Documentation/networking/can.txt
Documentation/networking/multiqueue.txt
Documentation/networking/phonet.txt [new file with mode: 0644]
Documentation/networking/regulatory.txt [new file with mode: 0644]
Documentation/networking/tproxy.txt [new file with mode: 0644]
Documentation/rfkill.txt
MAINTAINERS
arch/arm/mach-kirkwood/db88f6281-bp-setup.c
arch/arm/mach-kirkwood/rd88f6192-nas-setup.c
arch/arm/mach-kirkwood/rd88f6281-setup.c
arch/arm/mach-loki/lb88rc8480-setup.c
arch/arm/mach-mv78xx0/common.c
arch/arm/mach-mv78xx0/db78x00-bp-setup.c
arch/arm/mach-orion5x/db88f5281-setup.c
arch/arm/mach-orion5x/dns323-setup.c
arch/arm/mach-orion5x/kurobox_pro-setup.c
arch/arm/mach-orion5x/mss2-setup.c
arch/arm/mach-orion5x/mv2120-setup.c
arch/arm/mach-orion5x/rd88f5181l-fxo-setup.c
arch/arm/mach-orion5x/rd88f5181l-ge-setup.c
arch/arm/mach-orion5x/rd88f5182-setup.c
arch/arm/mach-orion5x/ts78xx-setup.c
arch/arm/mach-orion5x/tsx09-common.c
arch/arm/mach-orion5x/wnr854t-setup.c
arch/arm/mach-orion5x/wrt350n-v2-setup.c
arch/powerpc/include/asm/dcr-regs.h
arch/powerpc/platforms/82xx/ep8248e.c
arch/powerpc/platforms/pasemi/gpio_mdio.c
arch/powerpc/sysdev/mv64x60_dev.c
drivers/acpi/Kconfig
drivers/acpi/toshiba_acpi.c
drivers/atm/eni.c
drivers/atm/horizon.c
drivers/atm/idt77252.c
drivers/atm/idt77252.h
drivers/atm/zatm.c
drivers/block/aoe/aoe.h
drivers/block/aoe/aoeblk.c
drivers/block/aoe/aoechr.c
drivers/block/aoe/aoecmd.c
drivers/block/aoe/aoedev.c
drivers/block/aoe/aoemain.c
drivers/block/aoe/aoenet.c
drivers/bluetooth/hci_bcsp.c
drivers/bluetooth/hci_usb.h
drivers/isdn/capi/kcapi.c
drivers/isdn/hardware/mISDN/hfc_pci.h
drivers/isdn/hardware/mISDN/hfcpci.c
drivers/isdn/i4l/isdn_ppp.c
drivers/isdn/mISDN/timerdev.c
drivers/net/3c505.c
drivers/net/8139cp.c
drivers/net/8139too.c
drivers/net/Kconfig
drivers/net/Makefile
drivers/net/arcnet/arcnet.c
drivers/net/arcnet/com20020.c
drivers/net/atl1e/atl1e_hw.c
drivers/net/atl1e/atl1e_main.c
drivers/net/atlx/Makefile
drivers/net/atlx/atl1.c
drivers/net/atlx/atl2.c [new file with mode: 0644]
drivers/net/atlx/atl2.h [new file with mode: 0644]
drivers/net/atlx/atlx.c
drivers/net/au1000_eth.c
drivers/net/au1000_eth.h
drivers/net/ax88796.c
drivers/net/bfin_mac.c
drivers/net/bfin_mac.h
drivers/net/bnx2.c
drivers/net/bnx2.h
drivers/net/bnx2_fw.h
drivers/net/bnx2x_main.c
drivers/net/bonding/bond_alb.c
drivers/net/bonding/bond_main.c
drivers/net/bonding/bonding.h
drivers/net/cassini.c
drivers/net/cassini.h
drivers/net/cpmac.c
drivers/net/cs89x0.c
drivers/net/cxgb3/adapter.h
drivers/net/cxgb3/ael1002.c
drivers/net/cxgb3/common.h
drivers/net/cxgb3/cxgb3_ioctl.h
drivers/net/cxgb3/cxgb3_main.c
drivers/net/cxgb3/cxgb3_offload.c
drivers/net/cxgb3/l2t.c
drivers/net/cxgb3/l2t.h
drivers/net/cxgb3/regs.h
drivers/net/cxgb3/sge.c
drivers/net/cxgb3/t3_hw.c
drivers/net/cxgb3/vsc8211.c
drivers/net/e100.c
drivers/net/e1000/e1000.h
drivers/net/e1000/e1000_main.c
drivers/net/e1000e/82571.c
drivers/net/e1000e/defines.h
drivers/net/e1000e/e1000.h
drivers/net/e1000e/es2lan.c
drivers/net/e1000e/ethtool.c
drivers/net/e1000e/hw.h
drivers/net/e1000e/ich8lan.c
drivers/net/e1000e/lib.c
drivers/net/e1000e/netdev.c
drivers/net/e1000e/param.c
drivers/net/e1000e/phy.c
drivers/net/ehea/ehea.h
drivers/net/ehea/ehea_phyp.c
drivers/net/ehea/ehea_qmr.c
drivers/net/enc28j60.c
drivers/net/enic/Makefile [new file with mode: 0644]
drivers/net/enic/cq_desc.h [new file with mode: 0644]
drivers/net/enic/cq_enet_desc.h [new file with mode: 0644]
drivers/net/enic/enic.h [new file with mode: 0644]
drivers/net/enic/enic_main.c [new file with mode: 0644]
drivers/net/enic/enic_res.c [new file with mode: 0644]
drivers/net/enic/enic_res.h [new file with mode: 0644]
drivers/net/enic/rq_enet_desc.h [new file with mode: 0644]
drivers/net/enic/vnic_cq.c [new file with mode: 0644]
drivers/net/enic/vnic_cq.h [new file with mode: 0644]
drivers/net/enic/vnic_dev.c [new file with mode: 0644]
drivers/net/enic/vnic_dev.h [new file with mode: 0644]
drivers/net/enic/vnic_devcmd.h [new file with mode: 0644]
drivers/net/enic/vnic_enet.h [new file with mode: 0644]
drivers/net/enic/vnic_intr.c [new file with mode: 0644]
drivers/net/enic/vnic_intr.h [new file with mode: 0644]
drivers/net/enic/vnic_nic.h [new file with mode: 0644]
drivers/net/enic/vnic_resource.h [new file with mode: 0644]
drivers/net/enic/vnic_rq.c [new file with mode: 0644]
drivers/net/enic/vnic_rq.h [new file with mode: 0644]
drivers/net/enic/vnic_rss.h [new file with mode: 0644]
drivers/net/enic/vnic_stats.h [new file with mode: 0644]
drivers/net/enic/vnic_wq.c [new file with mode: 0644]
drivers/net/enic/vnic_wq.h [new file with mode: 0644]
drivers/net/enic/wq_enet_desc.h [new file with mode: 0644]
drivers/net/fealnx.c
drivers/net/fec_mpc52xx_phy.c
drivers/net/forcedeth.c
drivers/net/fs_enet/fs_enet-main.c
drivers/net/fs_enet/fs_enet.h
drivers/net/fs_enet/mac-fcc.c
drivers/net/fs_enet/mac-fec.c
drivers/net/fs_enet/mac-scc.c
drivers/net/fs_enet/mii-bitbang.c
drivers/net/fs_enet/mii-fec.c
drivers/net/gianfar.c
drivers/net/gianfar_mii.c
drivers/net/ibm_newemac/Kconfig
drivers/net/ibm_newemac/core.c
drivers/net/ibm_newemac/core.h
drivers/net/ibm_newemac/mal.h
drivers/net/ibm_newemac/phy.c
drivers/net/igb/igb_main.c
drivers/net/irda/vlsi_ir.c
drivers/net/ixgb/ixgb.h
drivers/net/ixgb/ixgb_main.c
drivers/net/ixgbe/ixgbe.h
drivers/net/ixgbe/ixgbe_82598.c
drivers/net/ixgbe/ixgbe_common.c
drivers/net/ixgbe/ixgbe_common.h
drivers/net/ixgbe/ixgbe_ethtool.c
drivers/net/ixgbe/ixgbe_main.c
drivers/net/ixgbe/ixgbe_phy.c
drivers/net/ixgbe/ixgbe_phy.h
drivers/net/ixgbe/ixgbe_type.h
drivers/net/jme.c [new file with mode: 0644]
drivers/net/jme.h [new file with mode: 0644]
drivers/net/lib8390.c
drivers/net/macb.c
drivers/net/macb.h
drivers/net/meth.c
drivers/net/mipsnet.c
drivers/net/mlx4/alloc.c
drivers/net/mv643xx_eth.c
drivers/net/myri10ge/myri10ge.c
drivers/net/myri_sbus.c
drivers/net/natsemi.c
drivers/net/ne.c
drivers/net/netx-eth.c
drivers/net/netxen/netxen_nic.h
drivers/net/netxen/netxen_nic_main.c
drivers/net/pci-skeleton.c
drivers/net/pcmcia/xirc2ps_cs.c
drivers/net/phy/fixed.c
drivers/net/phy/mdio-bitbang.c
drivers/net/phy/mdio-ofgpio.c
drivers/net/phy/mdio_bus.c
drivers/net/phy/phy.c
drivers/net/phy/phy_device.c
drivers/net/ppp_generic.c
drivers/net/pppol2tp.c
drivers/net/qlge/Makefile [new file with mode: 0644]
drivers/net/qlge/qlge.h [new file with mode: 0644]
drivers/net/qlge/qlge_dbg.c [new file with mode: 0644]
drivers/net/qlge/qlge_ethtool.c [new file with mode: 0644]
drivers/net/qlge/qlge_main.c [new file with mode: 0644]
drivers/net/qlge/qlge_mpi.c [new file with mode: 0644]
drivers/net/r6040.c
drivers/net/r8169.c
drivers/net/s2io.c
drivers/net/s2io.h
drivers/net/sb1250-mac.c
drivers/net/sfc/bitfield.h
drivers/net/sfc/boards.c
drivers/net/sfc/boards.h
drivers/net/sfc/efx.c
drivers/net/sfc/efx.h
drivers/net/sfc/enum.h
drivers/net/sfc/ethtool.c
drivers/net/sfc/falcon.c
drivers/net/sfc/falcon.h
drivers/net/sfc/falcon_hwdefs.h
drivers/net/sfc/falcon_io.h
drivers/net/sfc/falcon_xmac.c
drivers/net/sfc/mac.h
drivers/net/sfc/mdio_10g.c
drivers/net/sfc/mdio_10g.h
drivers/net/sfc/net_driver.h
drivers/net/sfc/phy.h
drivers/net/sfc/rx.c
drivers/net/sfc/rx.h
drivers/net/sfc/selftest.c
drivers/net/sfc/selftest.h
drivers/net/sfc/sfe4001.c
drivers/net/sfc/spi.h
drivers/net/sfc/tenxpress.c
drivers/net/sfc/tx.c
drivers/net/sfc/tx.h
drivers/net/sfc/workarounds.h
drivers/net/sfc/xfp_phy.c
drivers/net/sh_eth.c
drivers/net/skfp/pmf.c
drivers/net/skge.c
drivers/net/sky2.c
drivers/net/smc911x.c
drivers/net/smc91x.c
drivers/net/smc91x.h
drivers/net/sunbmac.c
drivers/net/sundance.c
drivers/net/tc35815.c
drivers/net/tehuti.h
drivers/net/tg3.c
drivers/net/tg3.h
drivers/net/tsi108_eth.c
drivers/net/tulip/de2104x.c
drivers/net/tulip/de4x5.c
drivers/net/ucc_geth.c
drivers/net/ucc_geth_mii.c
drivers/net/usb/Kconfig
drivers/net/usb/Makefile
drivers/net/usb/hso.c
drivers/net/usb/mcs7830.c
drivers/net/usb/pegasus.c
drivers/net/usb/smsc95xx.c [new file with mode: 0644]
drivers/net/usb/smsc95xx.h [new file with mode: 0644]
drivers/net/usb/usbnet.c
drivers/net/via-rhine.c
drivers/net/via-velocity.c
drivers/net/via-velocity.h
drivers/net/wan/cycx_drv.c
drivers/net/wan/cycx_x25.c
drivers/net/wan/dscc4.c
drivers/net/wan/hdlc_x25.c
drivers/net/wan/pc300_tty.c
drivers/net/wan/sbni.c
drivers/net/wireless/Kconfig
drivers/net/wireless/Makefile
drivers/net/wireless/adm8211.c
drivers/net/wireless/airo.c
drivers/net/wireless/airo_cs.c
drivers/net/wireless/airport.c
drivers/net/wireless/ath5k/Makefile
drivers/net/wireless/ath5k/ath5k.h
drivers/net/wireless/ath5k/attach.c [new file with mode: 0644]
drivers/net/wireless/ath5k/base.c
drivers/net/wireless/ath5k/base.h
drivers/net/wireless/ath5k/caps.c [new file with mode: 0644]
drivers/net/wireless/ath5k/debug.c
drivers/net/wireless/ath5k/desc.c [new file with mode: 0644]
drivers/net/wireless/ath5k/desc.h [moved from drivers/net/wireless/ath5k/hw.h with 51% similarity]
drivers/net/wireless/ath5k/dma.c [new file with mode: 0644]
drivers/net/wireless/ath5k/eeprom.c [new file with mode: 0644]
drivers/net/wireless/ath5k/eeprom.h [new file with mode: 0644]
drivers/net/wireless/ath5k/gpio.c [new file with mode: 0644]
drivers/net/wireless/ath5k/hw.c [deleted file]
drivers/net/wireless/ath5k/initvals.c
drivers/net/wireless/ath5k/pcu.c [new file with mode: 0644]
drivers/net/wireless/ath5k/phy.c
drivers/net/wireless/ath5k/qcu.c [new file with mode: 0644]
drivers/net/wireless/ath5k/reg.h
drivers/net/wireless/ath5k/reset.c [new file with mode: 0644]
drivers/net/wireless/ath9k/Kconfig
drivers/net/wireless/ath9k/ath9k.h
drivers/net/wireless/ath9k/beacon.c
drivers/net/wireless/ath9k/core.c
drivers/net/wireless/ath9k/core.h
drivers/net/wireless/ath9k/hw.c
drivers/net/wireless/ath9k/hw.h
drivers/net/wireless/ath9k/main.c
drivers/net/wireless/ath9k/phy.h
drivers/net/wireless/ath9k/rc.c
drivers/net/wireless/ath9k/rc.h
drivers/net/wireless/ath9k/recv.c
drivers/net/wireless/ath9k/reg.h
drivers/net/wireless/ath9k/xmit.c
drivers/net/wireless/atmel.c
drivers/net/wireless/atmel_cs.c
drivers/net/wireless/b43/Kconfig
drivers/net/wireless/b43/Makefile
drivers/net/wireless/b43/b43.h
drivers/net/wireless/b43/debugfs.c
drivers/net/wireless/b43/lo.c
drivers/net/wireless/b43/lo.h
drivers/net/wireless/b43/main.c
drivers/net/wireless/b43/phy.h [deleted file]
drivers/net/wireless/b43/phy_a.c [new file with mode: 0644]
drivers/net/wireless/b43/phy_a.h [new file with mode: 0644]
drivers/net/wireless/b43/phy_common.c [new file with mode: 0644]
drivers/net/wireless/b43/phy_common.h [new file with mode: 0644]
drivers/net/wireless/b43/phy_g.c [moved from drivers/net/wireless/b43/phy.c with 61% similarity]
drivers/net/wireless/b43/phy_g.h [new file with mode: 0644]
drivers/net/wireless/b43/phy_lp.c [new file with mode: 0644]
drivers/net/wireless/b43/phy_lp.h [new file with mode: 0644]
drivers/net/wireless/b43/phy_n.c [moved from drivers/net/wireless/b43/nphy.c with 80% similarity]
drivers/net/wireless/b43/phy_n.h [moved from drivers/net/wireless/b43/nphy.h with 98% similarity]
drivers/net/wireless/b43/rfkill.c
drivers/net/wireless/b43/sysfs.c
drivers/net/wireless/b43/tables.c
drivers/net/wireless/b43/tables_nphy.c
drivers/net/wireless/b43/wa.c
drivers/net/wireless/b43/xmit.c
drivers/net/wireless/b43legacy/main.c
drivers/net/wireless/b43legacy/phy.c
drivers/net/wireless/b43legacy/xmit.c
drivers/net/wireless/hermes.c
drivers/net/wireless/hermes.h
drivers/net/wireless/hermes_dld.c [new file with mode: 0644]
drivers/net/wireless/hermes_dld.h [new file with mode: 0644]
drivers/net/wireless/hermes_rid.h
drivers/net/wireless/ipw2100.c
drivers/net/wireless/ipw2200.h
drivers/net/wireless/iwlwifi/iwl-3945-debug.h
drivers/net/wireless/iwlwifi/iwl-3945-io.h
drivers/net/wireless/iwlwifi/iwl-3945-rs.c
drivers/net/wireless/iwlwifi/iwl-3945-rs.h
drivers/net/wireless/iwlwifi/iwl-3945.c
drivers/net/wireless/iwlwifi/iwl-3945.h
drivers/net/wireless/iwlwifi/iwl-4965-hw.h
drivers/net/wireless/iwlwifi/iwl-4965.c
drivers/net/wireless/iwlwifi/iwl-5000-hw.h
drivers/net/wireless/iwlwifi/iwl-5000.c
drivers/net/wireless/iwlwifi/iwl-agn-rs.c
drivers/net/wireless/iwlwifi/iwl-agn-rs.h
drivers/net/wireless/iwlwifi/iwl-agn.c
drivers/net/wireless/iwlwifi/iwl-calib.c
drivers/net/wireless/iwlwifi/iwl-commands.h
drivers/net/wireless/iwlwifi/iwl-core.c
drivers/net/wireless/iwlwifi/iwl-core.h
drivers/net/wireless/iwlwifi/iwl-csr.h
drivers/net/wireless/iwlwifi/iwl-debug.h
drivers/net/wireless/iwlwifi/iwl-dev.h
drivers/net/wireless/iwlwifi/iwl-fh.h
drivers/net/wireless/iwlwifi/iwl-hcmd.c
drivers/net/wireless/iwlwifi/iwl-io.h
drivers/net/wireless/iwlwifi/iwl-power.c
drivers/net/wireless/iwlwifi/iwl-power.h
drivers/net/wireless/iwlwifi/iwl-rx.c
drivers/net/wireless/iwlwifi/iwl-scan.c
drivers/net/wireless/iwlwifi/iwl-sta.c
drivers/net/wireless/iwlwifi/iwl-tx.c
drivers/net/wireless/iwlwifi/iwl3945-base.c
drivers/net/wireless/libertas/assoc.c
drivers/net/wireless/libertas/assoc.h
drivers/net/wireless/libertas/cmd.c
drivers/net/wireless/libertas/cmd.h
drivers/net/wireless/libertas/cmdresp.c
drivers/net/wireless/libertas/decl.h
drivers/net/wireless/libertas/defs.h
drivers/net/wireless/libertas/dev.h
drivers/net/wireless/libertas/host.h
drivers/net/wireless/libertas/hostcmd.h
drivers/net/wireless/libertas/if_cs.c
drivers/net/wireless/libertas/if_usb.c
drivers/net/wireless/libertas/if_usb.h
drivers/net/wireless/libertas/main.c
drivers/net/wireless/libertas/scan.c
drivers/net/wireless/libertas/wext.c
drivers/net/wireless/libertas_tf/Makefile [new file with mode: 0644]
drivers/net/wireless/libertas_tf/cmd.c [new file with mode: 0644]
drivers/net/wireless/libertas_tf/if_usb.c [new file with mode: 0644]
drivers/net/wireless/libertas_tf/if_usb.h [new file with mode: 0644]
drivers/net/wireless/libertas_tf/libertas_tf.h [new file with mode: 0644]
drivers/net/wireless/libertas_tf/main.c [new file with mode: 0644]
drivers/net/wireless/mac80211_hwsim.c
drivers/net/wireless/netwave_cs.c
drivers/net/wireless/orinoco.c
drivers/net/wireless/orinoco.h
drivers/net/wireless/orinoco_cs.c
drivers/net/wireless/orinoco_nortel.c
drivers/net/wireless/orinoco_pci.c
drivers/net/wireless/orinoco_plx.c
drivers/net/wireless/orinoco_tmd.c
drivers/net/wireless/p54/p54.h
drivers/net/wireless/p54/p54common.c
drivers/net/wireless/p54/p54common.h
drivers/net/wireless/p54/p54pci.c
drivers/net/wireless/p54/p54pci.h
drivers/net/wireless/p54/p54usb.c
drivers/net/wireless/p54/p54usb.h
drivers/net/wireless/prism54/isl_ioctl.c
drivers/net/wireless/ray_cs.c
drivers/net/wireless/rndis_wlan.c
drivers/net/wireless/rt2x00/Kconfig
drivers/net/wireless/rt2x00/Makefile
drivers/net/wireless/rt2x00/rt2400pci.c
drivers/net/wireless/rt2x00/rt2400pci.h
drivers/net/wireless/rt2x00/rt2500pci.c
drivers/net/wireless/rt2x00/rt2500pci.h
drivers/net/wireless/rt2x00/rt2500usb.c
drivers/net/wireless/rt2x00/rt2500usb.h
drivers/net/wireless/rt2x00/rt2x00.h
drivers/net/wireless/rt2x00/rt2x00config.c
drivers/net/wireless/rt2x00/rt2x00crypto.c [new file with mode: 0644]
drivers/net/wireless/rt2x00/rt2x00debug.c
drivers/net/wireless/rt2x00/rt2x00dev.c
drivers/net/wireless/rt2x00/rt2x00lib.h
drivers/net/wireless/rt2x00/rt2x00mac.c
drivers/net/wireless/rt2x00/rt2x00queue.c
drivers/net/wireless/rt2x00/rt2x00queue.h
drivers/net/wireless/rt2x00/rt2x00reg.h
drivers/net/wireless/rt2x00/rt2x00rfkill.c
drivers/net/wireless/rt2x00/rt2x00usb.c
drivers/net/wireless/rt2x00/rt61pci.c
drivers/net/wireless/rt2x00/rt61pci.h
drivers/net/wireless/rt2x00/rt73usb.c
drivers/net/wireless/rt2x00/rt73usb.h
drivers/net/wireless/rtl8180.h
drivers/net/wireless/rtl8180_dev.c
drivers/net/wireless/rtl8187.h
drivers/net/wireless/rtl8187_dev.c
drivers/net/wireless/rtl818x.h
drivers/net/wireless/spectrum_cs.c
drivers/net/wireless/wavelan_cs.c
drivers/net/wireless/wl3501_cs.c
drivers/net/wireless/zd1211rw/Makefile
drivers/net/wireless/zd1211rw/zd_chip.c
drivers/net/wireless/zd1211rw/zd_ieee80211.c [deleted file]
drivers/net/wireless/zd1211rw/zd_ieee80211.h [deleted file]
drivers/net/wireless/zd1211rw/zd_mac.c
drivers/net/wireless/zd1211rw/zd_mac.h
drivers/net/wireless/zd1211rw/zd_rf.c
drivers/s390/net/qeth_core_main.c
drivers/s390/net/qeth_l2_main.c
drivers/s390/net/qeth_l3_main.c
drivers/ssb/pci.c
drivers/usb/atm/usbatm.c
firmware/Makefile
firmware/WHENCE
firmware/sun/cassini.bin.ihex [new file with mode: 0644]
include/asm-um/dma-mapping.h
include/linux/Kbuild
include/linux/ieee80211.h
include/linux/if.h
include/linux/if_ether.h
include/linux/if_link.h
include/linux/if_phonet.h [new file with mode: 0644]
include/linux/if_tunnel.h
include/linux/in.h
include/linux/inetdevice.h
include/linux/ip_vs.h
include/linux/isdn_ppp.h
include/linux/mv643xx_eth.h
include/linux/netdevice.h
include/linux/netfilter.h
include/linux/netfilter/Kbuild
include/linux/netfilter/nf_conntrack_proto_gre.h
include/linux/netfilter/x_tables.h
include/linux/netfilter/xt_TPROXY.h [new file with mode: 0644]
include/linux/netfilter/xt_recent.h [new file with mode: 0644]
include/linux/netfilter_bridge/ebtables.h
include/linux/netfilter_ipv4/ipt_recent.h
include/linux/nl80211.h
include/linux/pci_ids.h
include/linux/pfkeyv2.h
include/linux/phonet.h [new file with mode: 0644]
include/linux/phy.h
include/linux/pkt_sched.h
include/linux/rfkill.h
include/linux/rtnetlink.h
include/linux/skbuff.h
include/linux/socket.h
include/linux/ssb/ssb_regs.h
include/linux/tc_act/Kbuild
include/linux/tc_act/tc_skbedit.h [new file with mode: 0644]
include/linux/tcp.h
include/linux/xfrm.h
include/net/cfg80211.h
include/net/dsa.h [new file with mode: 0644]
include/net/flow.h
include/net/ieee80211.h
include/net/inet6_hashtables.h
include/net/inet_connection_sock.h
include/net/inet_hashtables.h
include/net/inet_sock.h
include/net/inet_timewait_sock.h
include/net/ip.h
include/net/ip_vs.h
include/net/ipip.h
include/net/ipv6.h
include/net/mac80211.h
include/net/net_namespace.h
include/net/netfilter/ipv4/nf_defrag_ipv4.h [new file with mode: 0644]
include/net/netfilter/nf_conntrack.h
include/net/netfilter/nf_conntrack_acct.h
include/net/netfilter/nf_conntrack_core.h
include/net/netfilter/nf_conntrack_ecache.h
include/net/netfilter/nf_conntrack_expect.h
include/net/netfilter/nf_conntrack_l4proto.h
include/net/netfilter/nf_log.h
include/net/netfilter/nf_queue.h
include/net/netfilter/nf_tproxy_core.h [new file with mode: 0644]
include/net/netlink.h
include/net/netns/conntrack.h [new file with mode: 0644]
include/net/netns/ipv4.h
include/net/netns/mib.h
include/net/phonet/gprs.h [new file with mode: 0644]
include/net/phonet/pep.h [new file with mode: 0644]
include/net/phonet/phonet.h [new file with mode: 0644]
include/net/phonet/pn_dev.h [new file with mode: 0644]
include/net/pkt_sched.h
include/net/route.h
include/net/sch_generic.h
include/net/sctp/constants.h
include/net/sctp/sctp.h
include/net/sctp/structs.h
include/net/sctp/tsnmap.h
include/net/sock.h
include/net/tc_act/tc_skbedit.h [new file with mode: 0644]
include/net/tcp.h
include/net/udp.h
include/net/wireless.h
include/net/xfrm.h
net/8021q/vlan.c
net/8021q/vlan_dev.c
net/Kconfig
net/Makefile
net/atm/br2684.c
net/atm/lec.c
net/bridge/br.c
net/bridge/br_device.c
net/bridge/br_if.c
net/bridge/br_ioctl.c
net/bridge/br_netfilter.c
net/bridge/br_netlink.c
net/bridge/br_notify.c
net/bridge/br_private.h
net/bridge/br_stp_bpdu.c
net/bridge/netfilter/Kconfig
net/bridge/netfilter/ebt_802_3.c
net/bridge/netfilter/ebt_among.c
net/bridge/netfilter/ebt_arp.c
net/bridge/netfilter/ebt_arpreply.c
net/bridge/netfilter/ebt_dnat.c
net/bridge/netfilter/ebt_ip.c
net/bridge/netfilter/ebt_ip6.c
net/bridge/netfilter/ebt_limit.c
net/bridge/netfilter/ebt_log.c
net/bridge/netfilter/ebt_mark.c
net/bridge/netfilter/ebt_mark_m.c
net/bridge/netfilter/ebt_nflog.c
net/bridge/netfilter/ebt_pkttype.c
net/bridge/netfilter/ebt_redirect.c
net/bridge/netfilter/ebt_snat.c
net/bridge/netfilter/ebt_stp.c
net/bridge/netfilter/ebt_ulog.c
net/bridge/netfilter/ebt_vlan.c
net/bridge/netfilter/ebtables.c
net/core/Makefile
net/core/dev.c
net/core/dst.c
net/core/neighbour.c
net/core/net-sysfs.c
net/core/net_namespace.c
net/core/rtnetlink.c
net/core/skb_dma_map.c [new file with mode: 0644]
net/core/skbuff.c
net/core/sock.c
net/dccp/ccids/ccid2.c
net/dccp/ccids/ccid3.c
net/dccp/ccids/lib/loss_interval.c
net/dccp/ccids/lib/tfrc.c
net/dccp/input.c
net/dccp/ipv4.c
net/dccp/ipv6.c
net/dccp/options.c
net/dccp/proto.c
net/dsa/Kconfig [new file with mode: 0644]
net/dsa/Makefile [new file with mode: 0644]
net/dsa/dsa.c [new file with mode: 0644]
net/dsa/dsa_priv.h [new file with mode: 0644]
net/dsa/mv88e6060.c [new file with mode: 0644]
net/dsa/mv88e6123_61_65.c [new file with mode: 0644]
net/dsa/mv88e6131.c [new file with mode: 0644]
net/dsa/mv88e6xxx.c [new file with mode: 0644]
net/dsa/mv88e6xxx.h [new file with mode: 0644]
net/dsa/slave.c [new file with mode: 0644]
net/dsa/tag_dsa.c [new file with mode: 0644]
net/dsa/tag_edsa.c [new file with mode: 0644]
net/dsa/tag_trailer.c [new file with mode: 0644]
net/ethernet/eth.c
net/ieee80211/ieee80211_module.c
net/ipv4/Kconfig
net/ipv4/Makefile
net/ipv4/af_inet.c
net/ipv4/igmp.c
net/ipv4/inet_connection_sock.c
net/ipv4/inet_diag.c
net/ipv4/inet_timewait_sock.c
net/ipv4/ip_gre.c
net/ipv4/ip_output.c
net/ipv4/ip_sockglue.c
net/ipv4/ipvs/ip_vs_proto_ah.c [deleted file]
net/ipv4/ipvs/ip_vs_proto_esp.c [deleted file]
net/ipv4/netfilter.c
net/ipv4/netfilter/Kconfig
net/ipv4/netfilter/Makefile
net/ipv4/netfilter/arp_tables.c
net/ipv4/netfilter/arpt_mangle.c
net/ipv4/netfilter/arptable_filter.c
net/ipv4/netfilter/ip_tables.c
net/ipv4/netfilter/ipt_CLUSTERIP.c
net/ipv4/netfilter/ipt_ECN.c
net/ipv4/netfilter/ipt_LOG.c
net/ipv4/netfilter/ipt_MASQUERADE.c
net/ipv4/netfilter/ipt_NETMAP.c
net/ipv4/netfilter/ipt_REDIRECT.c
net/ipv4/netfilter/ipt_REJECT.c
net/ipv4/netfilter/ipt_TTL.c
net/ipv4/netfilter/ipt_ULOG.c
net/ipv4/netfilter/ipt_addrtype.c
net/ipv4/netfilter/ipt_ah.c
net/ipv4/netfilter/ipt_ecn.c
net/ipv4/netfilter/ipt_ttl.c
net/ipv4/netfilter/iptable_filter.c
net/ipv4/netfilter/iptable_mangle.c
net/ipv4/netfilter/iptable_raw.c
net/ipv4/netfilter/iptable_security.c
net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c
net/ipv4/netfilter/nf_conntrack_l3proto_ipv4_compat.c
net/ipv4/netfilter/nf_conntrack_proto_icmp.c
net/ipv4/netfilter/nf_defrag_ipv4.c [new file with mode: 0644]
net/ipv4/netfilter/nf_nat_core.c
net/ipv4/netfilter/nf_nat_helper.c
net/ipv4/netfilter/nf_nat_pptp.c
net/ipv4/netfilter/nf_nat_rule.c
net/ipv4/route.c
net/ipv4/syncookies.c
net/ipv4/sysctl_net_ipv4.c
net/ipv4/tcp.c
net/ipv4/tcp_input.c
net/ipv4/tcp_ipv4.c
net/ipv4/tcp_minisocks.c
net/ipv4/tcp_output.c
net/ipv4/tcp_timer.c
net/ipv4/udp.c
net/ipv6/af_inet6.c
net/ipv6/exthdrs.c
net/ipv6/icmp.c
net/ipv6/ip6_input.c
net/ipv6/ip6_output.c
net/ipv6/ip6_tunnel.c
net/ipv6/ip6mr.c
net/ipv6/mcast.c
net/ipv6/ndisc.c
net/ipv6/netfilter.c
net/ipv6/netfilter/Kconfig
net/ipv6/netfilter/ip6_tables.c
net/ipv6/netfilter/ip6t_HL.c
net/ipv6/netfilter/ip6t_LOG.c
net/ipv6/netfilter/ip6t_REJECT.c
net/ipv6/netfilter/ip6t_ah.c
net/ipv6/netfilter/ip6t_eui64.c
net/ipv6/netfilter/ip6t_frag.c
net/ipv6/netfilter/ip6t_hbh.c
net/ipv6/netfilter/ip6t_hl.c
net/ipv6/netfilter/ip6t_ipv6header.c
net/ipv6/netfilter/ip6t_mh.c
net/ipv6/netfilter/ip6t_rt.c
net/ipv6/netfilter/ip6table_filter.c
net/ipv6/netfilter/ip6table_mangle.c
net/ipv6/netfilter/ip6table_raw.c
net/ipv6/netfilter/ip6table_security.c
net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c
net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c
net/ipv6/netfilter/nf_conntrack_reasm.c
net/ipv6/proc.c
net/ipv6/raw.c
net/ipv6/reassembly.c
net/ipv6/route.c
net/ipv6/tcp_ipv6.c
net/ipv6/udp.c
net/ipv6/udplite.c
net/key/af_key.c
net/mac80211/Kconfig
net/mac80211/Makefile
net/mac80211/cfg.c
net/mac80211/debugfs.c
net/mac80211/debugfs_key.c
net/mac80211/debugfs_netdev.c
net/mac80211/debugfs_sta.c
net/mac80211/event.c
net/mac80211/ht.c [new file with mode: 0644]
net/mac80211/ieee80211_i.h
net/mac80211/iface.c
net/mac80211/key.c
net/mac80211/main.c
net/mac80211/mesh.c
net/mac80211/mesh.h
net/mac80211/mesh_hwmp.c
net/mac80211/mesh_pathtbl.c
net/mac80211/mesh_plink.c
net/mac80211/mlme.c
net/mac80211/rate.c
net/mac80211/rate.h
net/mac80211/rc80211_minstrel.c [new file with mode: 0644]
net/mac80211/rc80211_minstrel.h [new file with mode: 0644]
net/mac80211/rc80211_minstrel_debugfs.c [new file with mode: 0644]
net/mac80211/rc80211_pid.h
net/mac80211/rc80211_pid_algo.c
net/mac80211/rx.c
net/mac80211/scan.c [new file with mode: 0644]
net/mac80211/spectmgmt.c [new file with mode: 0644]
net/mac80211/sta_info.c
net/mac80211/sta_info.h
net/mac80211/tkip.c
net/mac80211/tx.c
net/mac80211/util.c
net/mac80211/wep.c
net/mac80211/wext.c
net/mac80211/wme.c
net/mac80211/wme.h
net/mac80211/wpa.c
net/netfilter/Kconfig
net/netfilter/Makefile
net/netfilter/core.c
net/netfilter/ipvs/Kconfig [moved from net/ipv4/ipvs/Kconfig with 96% similarity]
net/netfilter/ipvs/Makefile [moved from net/ipv4/ipvs/Makefile with 88% similarity]
net/netfilter/ipvs/ip_vs_app.c [moved from net/ipv4/ipvs/ip_vs_app.c with 100% similarity]
net/netfilter/ipvs/ip_vs_conn.c [moved from net/ipv4/ipvs/ip_vs_conn.c with 77% similarity]
net/netfilter/ipvs/ip_vs_core.c [moved from net/ipv4/ipvs/ip_vs_core.c with 58% similarity]
net/netfilter/ipvs/ip_vs_ctl.c [moved from net/ipv4/ipvs/ip_vs_ctl.c with 59% similarity]
net/netfilter/ipvs/ip_vs_dh.c [moved from net/ipv4/ipvs/ip_vs_dh.c with 98% similarity]
net/netfilter/ipvs/ip_vs_est.c [moved from net/ipv4/ipvs/ip_vs_est.c with 78% similarity]
net/netfilter/ipvs/ip_vs_ftp.c [moved from net/ipv4/ipvs/ip_vs_ftp.c with 87% similarity]
net/netfilter/ipvs/ip_vs_lblc.c [moved from net/ipv4/ipvs/ip_vs_lblc.c with 80% similarity]
net/netfilter/ipvs/ip_vs_lblcr.c [moved from net/ipv4/ipvs/ip_vs_lblcr.c with 82% similarity]
net/netfilter/ipvs/ip_vs_lc.c [moved from net/ipv4/ipvs/ip_vs_lc.c with 82% similarity]
net/netfilter/ipvs/ip_vs_nq.c [moved from net/ipv4/ipvs/ip_vs_nq.c with 84% similarity]
net/netfilter/ipvs/ip_vs_proto.c [moved from net/ipv4/ipvs/ip_vs_proto.c with 79% similarity]
net/netfilter/ipvs/ip_vs_proto_ah_esp.c [new file with mode: 0644]
net/netfilter/ipvs/ip_vs_proto_tcp.c [moved from net/ipv4/ipvs/ip_vs_proto_tcp.c with 70% similarity]
net/netfilter/ipvs/ip_vs_proto_udp.c [moved from net/ipv4/ipvs/ip_vs_proto_udp.c with 60% similarity]
net/netfilter/ipvs/ip_vs_rr.c [moved from net/ipv4/ipvs/ip_vs_rr.c with 88% similarity]
net/netfilter/ipvs/ip_vs_sched.c [moved from net/ipv4/ipvs/ip_vs_sched.c with 100% similarity]
net/netfilter/ipvs/ip_vs_sed.c [moved from net/ipv4/ipvs/ip_vs_sed.c with 85% similarity]
net/netfilter/ipvs/ip_vs_sh.c [moved from net/ipv4/ipvs/ip_vs_sh.c with 98% similarity]
net/netfilter/ipvs/ip_vs_sync.c [moved from net/ipv4/ipvs/ip_vs_sync.c with 95% similarity]
net/netfilter/ipvs/ip_vs_wlc.c [moved from net/ipv4/ipvs/ip_vs_wlc.c with 84% similarity]
net/netfilter/ipvs/ip_vs_wrr.c [moved from net/ipv4/ipvs/ip_vs_wrr.c with 94% similarity]
net/netfilter/ipvs/ip_vs_xmit.c [moved from net/ipv4/ipvs/ip_vs_xmit.c with 55% similarity]
net/netfilter/nf_conntrack_acct.c
net/netfilter/nf_conntrack_core.c
net/netfilter/nf_conntrack_ecache.c
net/netfilter/nf_conntrack_expect.c
net/netfilter/nf_conntrack_ftp.c
net/netfilter/nf_conntrack_h323_main.c
net/netfilter/nf_conntrack_helper.c
net/netfilter/nf_conntrack_netlink.c
net/netfilter/nf_conntrack_pptp.c
net/netfilter/nf_conntrack_proto.c
net/netfilter/nf_conntrack_proto_dccp.c
net/netfilter/nf_conntrack_proto_generic.c
net/netfilter/nf_conntrack_proto_gre.c
net/netfilter/nf_conntrack_proto_sctp.c
net/netfilter/nf_conntrack_proto_tcp.c
net/netfilter/nf_conntrack_proto_udp.c
net/netfilter/nf_conntrack_proto_udplite.c
net/netfilter/nf_conntrack_sip.c
net/netfilter/nf_conntrack_standalone.c
net/netfilter/nf_internals.h
net/netfilter/nf_log.c
net/netfilter/nf_queue.c
net/netfilter/nf_sockopt.c
net/netfilter/nf_tproxy_core.c [new file with mode: 0644]
net/netfilter/nfnetlink_log.c
net/netfilter/x_tables.c
net/netfilter/xt_CLASSIFY.c
net/netfilter/xt_CONNMARK.c
net/netfilter/xt_CONNSECMARK.c
net/netfilter/xt_DSCP.c
net/netfilter/xt_MARK.c
net/netfilter/xt_NFLOG.c
net/netfilter/xt_NFQUEUE.c
net/netfilter/xt_NOTRACK.c
net/netfilter/xt_RATEEST.c
net/netfilter/xt_SECMARK.c
net/netfilter/xt_TCPMSS.c
net/netfilter/xt_TCPOPTSTRIP.c
net/netfilter/xt_TPROXY.c [new file with mode: 0644]
net/netfilter/xt_TRACE.c
net/netfilter/xt_comment.c
net/netfilter/xt_connbytes.c
net/netfilter/xt_connlimit.c
net/netfilter/xt_connmark.c
net/netfilter/xt_conntrack.c
net/netfilter/xt_dccp.c
net/netfilter/xt_dscp.c
net/netfilter/xt_esp.c
net/netfilter/xt_hashlimit.c
net/netfilter/xt_helper.c
net/netfilter/xt_iprange.c
net/netfilter/xt_length.c
net/netfilter/xt_limit.c
net/netfilter/xt_mac.c
net/netfilter/xt_mark.c
net/netfilter/xt_multiport.c
net/netfilter/xt_owner.c
net/netfilter/xt_physdev.c
net/netfilter/xt_pkttype.c
net/netfilter/xt_policy.c
net/netfilter/xt_quota.c
net/netfilter/xt_rateest.c
net/netfilter/xt_realm.c
net/netfilter/xt_recent.c [moved from net/ipv4/netfilter/ipt_recent.c with 51% similarity]
net/netfilter/xt_sctp.c
net/netfilter/xt_socket.c [new file with mode: 0644]
net/netfilter/xt_state.c
net/netfilter/xt_statistic.c
net/netfilter/xt_string.c
net/netfilter/xt_tcpmss.c
net/netfilter/xt_tcpudp.c
net/netfilter/xt_time.c
net/netfilter/xt_u32.c
net/phonet/Kconfig [new file with mode: 0644]
net/phonet/Makefile [new file with mode: 0644]
net/phonet/af_phonet.c [new file with mode: 0644]
net/phonet/datagram.c [new file with mode: 0644]
net/phonet/pep-gprs.c [new file with mode: 0644]
net/phonet/pep.c [new file with mode: 0644]
net/phonet/pn_dev.c [new file with mode: 0644]
net/phonet/pn_netlink.c [new file with mode: 0644]
net/phonet/socket.c [new file with mode: 0644]
net/phonet/sysctl.c [new file with mode: 0644]
net/rfkill/rfkill-input.h
net/rfkill/rfkill.c
net/sched/Kconfig
net/sched/Makefile
net/sched/act_ipt.c
net/sched/act_skbedit.c [new file with mode: 0644]
net/sched/cls_flow.c
net/sched/em_cmp.c
net/sched/sch_dsmark.c
net/sched/sch_generic.c
net/sched/sch_multiq.c [new file with mode: 0644]
net/sched/sch_netem.c
net/sched/sch_prio.c
net/sched/sch_sfq.c
net/sctp/associola.c
net/sctp/bind_addr.c
net/sctp/ipv6.c
net/sctp/output.c
net/sctp/outqueue.c
net/sctp/sm_make_chunk.c
net/sctp/sm_sideeffect.c
net/sctp/sm_statefuns.c
net/sctp/sm_statetable.c
net/sctp/socket.c
net/sctp/tsnmap.c
net/sctp/ulpevent.c
net/sctp/ulpqueue.c
net/sunrpc/xprtrdma/rpc_rdma.c
net/wireless/Kconfig
net/wireless/core.c
net/wireless/core.h
net/wireless/nl80211.c
net/wireless/reg.c
net/wireless/reg.h [new file with mode: 0644]
net/xfrm/xfrm_policy.c
net/xfrm/xfrm_state.c
net/xfrm/xfrm_user.c

index b651e0a4b1c0bdc3e050b8e5c6610c907ee92ea0..77c3c202991b4ded85f4795ef33e3e73186dd784 100644 (file)
@@ -145,7 +145,6 @@ usage should require reading the full document.
         this though and the recommendation to allow only a single
         interface in STA mode at first!
       </para>
-!Finclude/net/mac80211.h ieee80211_if_types
 !Finclude/net/mac80211.h ieee80211_if_init_conf
 !Finclude/net/mac80211.h ieee80211_if_conf
     </chapter>
@@ -177,8 +176,7 @@ usage should require reading the full document.
         <title>functions/definitions</title>
 !Finclude/net/mac80211.h ieee80211_rx_status
 !Finclude/net/mac80211.h mac80211_rx_flags
-!Finclude/net/mac80211.h ieee80211_tx_control
-!Finclude/net/mac80211.h ieee80211_tx_status_flags
+!Finclude/net/mac80211.h ieee80211_tx_info
 !Finclude/net/mac80211.h ieee80211_rx
 !Finclude/net/mac80211.h ieee80211_rx_irqsafe
 !Finclude/net/mac80211.h ieee80211_tx_status
@@ -189,12 +187,11 @@ usage should require reading the full document.
 !Finclude/net/mac80211.h ieee80211_ctstoself_duration
 !Finclude/net/mac80211.h ieee80211_generic_frame_duration
 !Finclude/net/mac80211.h ieee80211_get_hdrlen_from_skb
-!Finclude/net/mac80211.h ieee80211_get_hdrlen
+!Finclude/net/mac80211.h ieee80211_hdrlen
 !Finclude/net/mac80211.h ieee80211_wake_queue
 !Finclude/net/mac80211.h ieee80211_stop_queue
-!Finclude/net/mac80211.h ieee80211_start_queues
-!Finclude/net/mac80211.h ieee80211_stop_queues
 !Finclude/net/mac80211.h ieee80211_wake_queues
+!Finclude/net/mac80211.h ieee80211_stop_queues
       </sect1>
     </chapter>
 
@@ -230,8 +227,7 @@ usage should require reading the full document.
       <title>Multiple queues and QoS support</title>
       <para>TBD</para>
 !Finclude/net/mac80211.h ieee80211_tx_queue_params
-!Finclude/net/mac80211.h ieee80211_tx_queue_stats_data
-!Finclude/net/mac80211.h ieee80211_tx_queue
+!Finclude/net/mac80211.h ieee80211_tx_queue_stats
     </chapter>
 
     <chapter id="AP">
index 83c88cae1eda446a12562a34f2c10f1a3f8cf5c2..3d2d0c29f02735e01e1acbc3bf3d1c97440352f2 100644 (file)
@@ -6,6 +6,24 @@ be removed from this file.
 
 ---------------------------
 
+What:  old static regulatory information and ieee80211_regdom module parameter
+When:  2.6.29
+Why:   The old regulatory infrastructure has been replaced with a new one
+       which does not require statically defined regulatory domains. We do
+       not want to keep static regulatory domains in the kernel due to the
+       the dynamic nature of regulatory law and localization. We kept around
+       the old static definitions for the regulatory domains of:
+               * US
+               * JP
+               * EU
+       and used by default the US when CONFIG_WIRELESS_OLD_REGULATORY was
+       set. We also kept around the ieee80211_regdom module parameter in case
+       some applications were relying on it. Changing regulatory domains
+       can now be done instead by using nl80211, as is done with iw.
+Who:   Luis R. Rodriguez <lrodriguez@atheros.com>
+
+---------------------------
+
 What:  dev->power.power_state
 When:  July 2007
 Why:   Broken design for runtime control over driver power states, confusing
@@ -232,6 +250,9 @@ What (Why):
        - xt_mark match revision 0
          (superseded by xt_mark match revision 1)
 
+       - xt_recent: the old ipt_recent proc dir
+         (superseded by /proc/net/xt_recent)
+
 When:  January 2009 or Linux 2.7.0, whichever comes first
 Why:   Superseded by newer revisions or modules
 Who:   Jan Engelhardt <jengelh@computergmbh.de>
diff --git a/Documentation/networking/LICENSE.qlge b/Documentation/networking/LICENSE.qlge
new file mode 100644 (file)
index 0000000..123b6ed
--- /dev/null
@@ -0,0 +1,46 @@
+Copyright (c)  2003-2008 QLogic Corporation
+QLogic Linux Networking HBA Driver
+
+This program includes a device driver for Linux 2.6 that may be
+distributed with QLogic hardware specific firmware binary file.
+You may modify and redistribute the device driver code under the
+GNU General Public License as published by the Free Software
+Foundation (version 2 or a later version).
+
+You may redistribute the hardware specific firmware binary file
+under the following terms:
+
+       1. Redistribution of source code (only if applicable),
+          must retain the above copyright notice, this list of
+          conditions and the following disclaimer.
+
+       2. Redistribution in binary form must reproduce the above
+          copyright notice, this list of conditions and the
+          following disclaimer in the documentation and/or other
+          materials provided with the distribution.
+
+       3. The name of QLogic Corporation may not be used to
+          endorse or promote products derived from this software
+          without specific prior written permission
+
+REGARDLESS OF WHAT LICENSING MECHANISM IS USED OR APPLICABLE,
+THIS PROGRAM IS PROVIDED BY QLOGIC CORPORATION "AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+USER ACKNOWLEDGES AND AGREES THAT USE OF THIS PROGRAM WILL NOT
+CREATE OR GIVE GROUNDS FOR A LICENSE BY IMPLICATION, ESTOPPEL, OR
+OTHERWISE IN ANY INTELLECTUAL PROPERTY RIGHTS (PATENT, COPYRIGHT,
+TRADE SECRET, MASK WORK, OR OTHER PROPRIETARY RIGHT) EMBODIED IN
+ANY OTHER QLOGIC HARDWARE OR SOFTWARE EITHER SOLELY OR IN
+COMBINATION WITH THIS PROGRAM.
+
index 297ba7b1ccaf953ff85e486baa0a7547450db31c..2035bc4932f224685992ca57b29e64de5da4934e 100644 (file)
@@ -35,8 +35,9 @@ This file contains
     6.1 general settings
     6.2 local loopback of sent frames
     6.3 CAN controller hardware filters
-    6.4 currently supported CAN hardware
-    6.5 todo
+    6.4 The virtual CAN driver (vcan)
+    6.5 currently supported CAN hardware
+    6.6 todo
 
   7 Credits
 
@@ -584,7 +585,42 @@ solution for a couple of reasons:
   @133MHz with four SJA1000 CAN controllers from 2002 under heavy bus
   load without any problems ...
 
-  6.4 currently supported CAN hardware (September 2007)
+  6.4 The virtual CAN driver (vcan)
+
+  Similar to the network loopback devices, vcan offers a virtual local
+  CAN interface. A full qualified address on CAN consists of
+
+  - a unique CAN Identifier (CAN ID)
+  - the CAN bus this CAN ID is transmitted on (e.g. can0)
+
+  so in common use cases more than one virtual CAN interface is needed.
+
+  The virtual CAN interfaces allow the transmission and reception of CAN
+  frames without real CAN controller hardware. Virtual CAN network
+  devices are usually named 'vcanX', like vcan0 vcan1 vcan2 ...
+  When compiled as a module the virtual CAN driver module is called vcan.ko
+
+  Since Linux Kernel version 2.6.24 the vcan driver supports the Kernel
+  netlink interface to create vcan network devices. The creation and
+  removal of vcan network devices can be managed with the ip(8) tool:
+
+  - Create a virtual CAN network interface:
+       ip link add type vcan
+
+  - Create a virtual CAN network interface with a specific name 'vcan42':
+       ip link add dev vcan42 type vcan
+
+  - Remove a (virtual CAN) network interface 'vcan42':
+       ip link del vcan42
+
+  The tool 'vcan' from the SocketCAN SVN repository on BerliOS is obsolete.
+
+  Virtual CAN network device creation in older Kernels:
+  In Linux Kernel versions < 2.6.24 the vcan driver creates 4 vcan
+  netdevices at module load time by default. This value can be changed
+  with the module parameter 'numdev'. E.g. 'modprobe vcan numdev=8'
+
+  6.5 currently supported CAN hardware
 
   On the project website http://developer.berlios.de/projects/socketcan
   there are different drivers available:
@@ -603,7 +639,7 @@ solution for a couple of reasons:
 
   Please check the Mailing Lists on the berlios OSS project website.
 
-  6.5 todo (September 2007)
+  6.6 todo
 
   The configuration interface for CAN network drivers is still an open
   issue that has not been finalized in the socketcan project. Also the
index d391ea63114132a85c4b922e1eca1e6960cfc7af..4caa0e314cc2929f1991b05bc8b91cb634b86635 100644 (file)
@@ -24,4 +24,56 @@ netif_{start|stop|wake}_subqueue() functions to manage each queue while the
 device is still operational.  netdev->queue_lock is still used when the device
 comes online or when it's completely shut down (unregister_netdev(), etc.).
 
-Author: Peter P. Waskiewicz Jr. <peter.p.waskiewicz.jr@intel.com>
+
+Section 2: Qdisc support for multiqueue devices
+
+-----------------------------------------------
+
+Currently two qdiscs are optimized for multiqueue devices.  The first is the
+default pfifo_fast qdisc.  This qdisc supports one qdisc per hardware queue.
+A new round-robin qdisc, sch_multiq also supports multiple hardware queues. The
+qdisc is responsible for classifying the skb's and then directing the skb's to
+bands and queues based on the value in skb->queue_mapping.  Use this field in
+the base driver to determine which queue to send the skb to.
+
+sch_multiq has been added for hardware that wishes to avoid head-of-line
+blocking.  It will cycle though the bands and verify that the hardware queue
+associated with the band is not stopped prior to dequeuing a packet.
+
+On qdisc load, the number of bands is based on the number of queues on the
+hardware.  Once the association is made, any skb with skb->queue_mapping set,
+will be queued to the band associated with the hardware queue.
+
+
+Section 3: Brief howto using MULTIQ for multiqueue devices
+---------------------------------------------------------------
+
+The userspace command 'tc,' part of the iproute2 package, is used to configure
+qdiscs.  To add the MULTIQ qdisc to your network device, assuming the device
+is called eth0, run the following command:
+
+# tc qdisc add dev eth0 root handle 1: multiq
+
+The qdisc will allocate the number of bands to equal the number of queues that
+the device reports, and bring the qdisc online.  Assuming eth0 has 4 Tx
+queues, the band mapping would look like:
+
+band 0 => queue 0
+band 1 => queue 1
+band 2 => queue 2
+band 3 => queue 3
+
+Traffic will begin flowing through each queue based on either the simple_tx_hash
+function or based on netdev->select_queue() if you have it defined.
+
+The behavior of tc filters remains the same.  However a new tc action,
+skbedit, has been added.  Assuming you wanted to route all traffic to a
+specific host, for example 192.168.0.3, through a specific queue you could use
+this action and establish a filter such as:
+
+tc filter add dev eth0 parent 1: protocol ip prio 1 u32 \
+       match ip dst 192.168.0.3 \
+       action skbedit queue_mapping 3
+
+Author: Alexander Duyck <alexander.h.duyck@intel.com>
+Original Author: Peter P. Waskiewicz Jr. <peter.p.waskiewicz.jr@intel.com>
diff --git a/Documentation/networking/phonet.txt b/Documentation/networking/phonet.txt
new file mode 100644 (file)
index 0000000..0e6e592
--- /dev/null
@@ -0,0 +1,175 @@
+Linux Phonet protocol family
+============================
+
+Introduction
+------------
+
+Phonet is a packet protocol used by Nokia cellular modems for both IPC
+and RPC. With the Linux Phonet socket family, Linux host processes can
+receive and send messages from/to the modem, or any other external
+device attached to the modem. The modem takes care of routing.
+
+Phonet packets can be exchanged through various hardware connections
+depending on the device, such as:
+  - USB with the CDC Phonet interface,
+  - infrared,
+  - Bluetooth,
+  - an RS232 serial port (with a dedicated "FBUS" line discipline),
+  - the SSI bus with some TI OMAP processors.
+
+
+Packets format
+--------------
+
+Phonet packets have a common header as follows:
+
+  struct phonethdr {
+    uint8_t  pn_media;  /* Media type (link-layer identifier) */
+    uint8_t  pn_rdev;   /* Receiver device ID */
+    uint8_t  pn_sdev;   /* Sender device ID */
+    uint8_t  pn_res;    /* Resource ID or function */
+    uint16_t pn_length; /* Big-endian message byte length (minus 6) */
+    uint8_t  pn_robj;   /* Receiver object ID */
+    uint8_t  pn_sobj;   /* Sender object ID */
+  };
+
+On Linux, the link-layer header includes the pn_media byte (see below).
+The next 7 bytes are part of the network-layer header.
+
+The device ID is split: the 6 higher-order bits consitute the device
+address, while the 2 lower-order bits are used for multiplexing, as are
+the 8-bit object identifiers. As such, Phonet can be considered as a
+network layer with 6 bits of address space and 10 bits for transport
+protocol (much like port numbers in IP world).
+
+The modem always has address number zero. All other device have a their
+own 6-bit address.
+
+
+Link layer
+----------
+
+Phonet links are always point-to-point links. The link layer header
+consists of a single Phonet media type byte. It uniquely identifies the
+link through which the packet is transmitted, from the modem's
+perspective. Each Phonet network device shall prepend and set the media
+type byte as appropriate. For convenience, a common phonet_header_ops
+link-layer header operations structure is provided. It sets the
+media type according to the network device hardware address.
+
+Linux Phonet network interfaces support a dedicated link layer packets
+type (ETH_P_PHONET) which is out of the Ethernet type range. They can
+only send and receive Phonet packets.
+
+The virtual TUN tunnel device driver can also be used for Phonet. This
+requires IFF_TUN mode, _without_ the IFF_NO_PI flag. In this case,
+there is no link-layer header, so there is no Phonet media type byte.
+
+Note that Phonet interfaces are not allowed to re-order packets, so
+only the (default) Linux FIFO qdisc should be used with them.
+
+
+Network layer
+-------------
+
+The Phonet socket address family maps the Phonet packet header:
+
+  struct sockaddr_pn {
+    sa_family_t spn_family;    /* AF_PHONET */
+    uint8_t     spn_obj;       /* Object ID */
+    uint8_t     spn_dev;       /* Device ID */
+    uint8_t     spn_resource;  /* Resource or function */
+    uint8_t     spn_zero[...]; /* Padding */
+  };
+
+The resource field is only used when sending and receiving;
+It is ignored by bind() and getsockname().
+
+
+Low-level datagram protocol
+---------------------------
+
+Applications can send Phonet messages using the Phonet datagram socket
+protocol from the PF_PHONET family. Each socket is bound to one of the
+2^10 object IDs available, and can send and receive packets with any
+other peer.
+
+  struct sockaddr_pn addr = { .spn_family = AF_PHONET, };
+  ssize_t len;
+  socklen_t addrlen = sizeof(addr);
+  int fd;
+
+  fd = socket(PF_PHONET, SOCK_DGRAM, 0);
+  bind(fd, (struct sockaddr *)&addr, sizeof(addr));
+  /* ... */
+
+  sendto(fd, msg, msglen, 0, (struct sockaddr *)&addr, sizeof(addr));
+  len = recvfrom(fd, buf, sizeof(buf), 0,
+                 (struct sockaddr *)&addr, &addrlen);
+
+This protocol follows the SOCK_DGRAM connection-less semantics.
+However, connect() and getpeername() are not supported, as they did
+not seem useful with Phonet usages (could be added easily).
+
+
+Phonet Pipe protocol
+--------------------
+
+The Phonet Pipe protocol is a simple sequenced packets protocol
+with end-to-end congestion control. It uses the passive listening
+socket paradigm. The listening socket is bound to an unique free object
+ID. Each listening socket can handle up to 255 simultaneous
+connections, one per accept()'d socket.
+
+  int lfd, cfd;
+
+  lfd = socket(PF_PHONET, SOCK_SEQPACKET, PN_PROTO_PIPE);
+  listen (lfd, INT_MAX);
+
+  /* ... */
+  cfd = accept(lfd, NULL, NULL);
+  for (;;)
+  {
+    char buf[...];
+    ssize_t len = read(cfd, buf, sizeof(buf));
+
+    /* ... */
+
+    write(cfd, msg, msglen);
+  }
+
+Connections are established between two endpoints by a "third party"
+application. This means that both endpoints are passive; so connect()
+is not possible.
+
+WARNING:
+When polling a connected pipe socket for writability, there is an
+intrinsic race condition whereby writability might be lost between the
+polling and the writing system calls. In this case, the socket will
+block until write because possible again, unless non-blocking mode
+becomes enabled.
+
+
+The pipe protocol provides two socket options at the SOL_PNPIPE level:
+
+  PNPIPE_ENCAP accepts one integer value (int) of:
+
+    PNPIPE_ENCAP_NONE: The socket operates normally (default).
+
+    PNPIPE_ENCAP_IP: The socket is used as a backend for a virtual IP
+      interface. This requires CAP_NET_ADMIN capability. GPRS data
+      support on Nokia modems can use this. Note that the socket cannot
+      be reliably poll()'d or read() from while in this mode.
+
+  PNPIPE_IFINDEX is a read-only integer value. It contains the
+    interface index of the network interface created by PNPIPE_ENCAP,
+    or zero if encapsulation is off.
+
+
+Authors
+-------
+
+Linux Phonet was initially written by Sakari Ailus.
+Other contributors include Mikä Liljeberg, Andras Domokos,
+Carlos Chinea and Rémi Denis-Courmont.
+Copyright (C) 2008 Nokia Corporation.
diff --git a/Documentation/networking/regulatory.txt b/Documentation/networking/regulatory.txt
new file mode 100644 (file)
index 0000000..a96989a
--- /dev/null
@@ -0,0 +1,194 @@
+Linux wireless regulatory documentation
+---------------------------------------
+
+This document gives a brief review over how the Linux wireless
+regulatory infrastructure works.
+
+More up to date information can be obtained at the project's web page:
+
+http://wireless.kernel.org/en/developers/Regulatory
+
+Keeping regulatory domains in userspace
+---------------------------------------
+
+Due to the dynamic nature of regulatory domains we keep them
+in userspace and provide a framework for userspace to upload
+to the kernel one regulatory domain to be used as the central
+core regulatory domain all wireless devices should adhere to.
+
+How to get regulatory domains to the kernel
+-------------------------------------------
+
+Userspace gets a regulatory domain in the kernel by having
+a userspace agent build it and send it via nl80211. Only
+expected regulatory domains will be respected by the kernel.
+
+A currently available userspace agent which can accomplish this
+is CRDA - central regulatory domain agent. Its documented here:
+
+http://wireless.kernel.org/en/developers/Regulatory/CRDA
+
+Essentially the kernel will send a udev event when it knows
+it needs a new regulatory domain. A udev rule can be put in place
+to trigger crda to send the respective regulatory domain for a
+specific ISO/IEC 3166 alpha2.
+
+Below is an example udev rule which can be used:
+
+# Example file, should be put in /etc/udev/rules.d/regulatory.rules
+KERNEL=="regulatory*", ACTION=="change", SUBSYSTEM=="platform", RUN+="/sbin/crda"
+
+The alpha2 is passed as an environment variable under the variable COUNTRY.
+
+Who asks for regulatory domains?
+--------------------------------
+
+* Users
+
+Users can use iw:
+
+http://wireless.kernel.org/en/users/Documentation/iw
+
+An example:
+
+  # set regulatory domain to "Costa Rica"
+  iw reg set CR
+
+This will request the kernel to set the regulatory domain to
+the specificied alpha2. The kernel in turn will then ask userspace
+to provide a regulatory domain for the alpha2 specified by the user
+by sending a uevent.
+
+* Wireless subsystems for Country Information elements
+
+The kernel will send a uevent to inform userspace a new
+regulatory domain is required. More on this to be added
+as its integration is added.
+
+* Drivers
+
+If drivers determine they need a specific regulatory domain
+set they can inform the wireless core using regulatory_hint().
+They have two options -- they either provide an alpha2 so that
+crda can provide back a regulatory domain for that country or
+they can build their own regulatory domain based on internal
+custom knowledge so the wireless core can respect it.
+
+*Most* drivers will rely on the first mechanism of providing a
+regulatory hint with an alpha2. For these drivers there is an additional
+check that can be used to ensure compliance based on custom EEPROM
+regulatory data. This additional check can be used by drivers by
+registering on its struct wiphy a reg_notifier() callback. This notifier
+is called when the core's regulatory domain has been changed. The driver
+can use this to review the changes made and also review who made them
+(driver, user, country IE) and determine what to allow based on its
+internal EEPROM data. Devices drivers wishing to be capable of world
+roaming should use this callback. More on world roaming will be
+added to this document when its support is enabled.
+
+Device drivers who provide their own built regulatory domain
+do not need a callback as the channels registered by them are
+the only ones that will be allowed and therefore *additional*
+cannels cannot be enabled.
+
+Example code - drivers hinting an alpha2:
+------------------------------------------
+
+This example comes from the zd1211rw device driver. You can start
+by having a mapping of your device's EEPROM country/regulatory
+domain value to to a specific alpha2 as follows:
+
+static struct zd_reg_alpha2_map reg_alpha2_map[] = {
+       { ZD_REGDOMAIN_FCC, "US" },
+       { ZD_REGDOMAIN_IC, "CA" },
+       { ZD_REGDOMAIN_ETSI, "DE" }, /* Generic ETSI, use most restrictive */
+       { ZD_REGDOMAIN_JAPAN, "JP" },
+       { ZD_REGDOMAIN_JAPAN_ADD, "JP" },
+       { ZD_REGDOMAIN_SPAIN, "ES" },
+       { ZD_REGDOMAIN_FRANCE, "FR" },
+
+Then you can define a routine to map your read EEPROM value to an alpha2,
+as follows:
+
+static int zd_reg2alpha2(u8 regdomain, char *alpha2)
+{
+       unsigned int i;
+       struct zd_reg_alpha2_map *reg_map;
+               for (i = 0; i < ARRAY_SIZE(reg_alpha2_map); i++) {
+                       reg_map = &reg_alpha2_map[i];
+                       if (regdomain == reg_map->reg) {
+                       alpha2[0] = reg_map->alpha2[0];
+                       alpha2[1] = reg_map->alpha2[1];
+                       return 0;
+               }
+       }
+       return 1;
+}
+
+Lastly, you can then hint to the core of your discovered alpha2, if a match
+was found. You need to do this after you have registered your wiphy. You
+are expected to do this during initialization.
+
+       r = zd_reg2alpha2(mac->regdomain, alpha2);
+       if (!r)
+               regulatory_hint(hw->wiphy, alpha2, NULL);
+
+Example code - drivers providing a built in regulatory domain:
+--------------------------------------------------------------
+
+If you have regulatory information you can obtain from your
+driver and you *need* to use this we let you build a regulatory domain
+structure and pass it to the wireless core. To do this you should
+kmalloc() a structure big enough to hold your regulatory domain
+structure and you should then fill it with your data. Finally you simply
+call regulatory_hint() with the regulatory domain structure in it.
+
+Bellow is a simple example, with a regulatory domain cached using the stack.
+Your implementation may vary (read EEPROM cache instead, for example).
+
+Example cache of some regulatory domain
+
+struct ieee80211_regdomain mydriver_jp_regdom = {
+       .n_reg_rules = 3,
+       .alpha2 =  "JP",
+       //.alpha2 =  "99", /* If I have no alpha2 to map it to */
+       .reg_rules = {
+               /* IEEE 802.11b/g, channels 1..14 */
+               REG_RULE(2412-20, 2484+20, 40, 6, 20, 0),
+               /* IEEE 802.11a, channels 34..48 */
+               REG_RULE(5170-20, 5240+20, 40, 6, 20,
+                       NL80211_RRF_PASSIVE_SCAN),
+               /* IEEE 802.11a, channels 52..64 */
+               REG_RULE(5260-20, 5320+20, 40, 6, 20,
+                       NL80211_RRF_NO_IBSS |
+                       NL80211_RRF_DFS),
+       }
+};
+
+Then in some part of your code after your wiphy has been registered:
+
+       int r;
+       struct ieee80211_regdomain *rd;
+       int size_of_regd;
+       int num_rules = mydriver_jp_regdom.n_reg_rules;
+       unsigned int i;
+
+       size_of_regd = sizeof(struct ieee80211_regdomain) +
+               (num_rules * sizeof(struct ieee80211_reg_rule));
+
+       rd = kzalloc(size_of_regd, GFP_KERNEL);
+       if (!rd)
+       return -ENOMEM;
+
+       memcpy(rd, &mydriver_jp_regdom, sizeof(struct ieee80211_regdomain));
+
+       for (i=0; i < num_rules; i++) {
+               memcpy(&rd->reg_rules[i], &mydriver_jp_regdom.reg_rules[i],
+                       sizeof(struct ieee80211_reg_rule));
+       }
+       r = regulatory_hint(hw->wiphy, NULL, rd);
+       if (r) {
+               kfree(rd);
+               return r;
+       }
+
diff --git a/Documentation/networking/tproxy.txt b/Documentation/networking/tproxy.txt
new file mode 100644 (file)
index 0000000..7b5996d
--- /dev/null
@@ -0,0 +1,85 @@
+Transparent proxy support
+=========================
+
+This feature adds Linux 2.2-like transparent proxy support to current kernels.
+To use it, enable NETFILTER_TPROXY, the socket match and the TPROXY target in
+your kernel config. You will need policy routing too, so be sure to enable that
+as well.
+
+
+1. Making non-local sockets work
+================================
+
+The idea is that you identify packets with destination address matching a local
+socket on your box, set the packet mark to a certain value, and then match on that
+value using policy routing to have those packets delivered locally:
+
+# iptables -t mangle -N DIVERT
+# iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
+# iptables -t mangle -A DIVERT -j MARK --set-mark 1
+# iptables -t mangle -A DIVERT -j ACCEPT
+
+# ip rule add fwmark 1 lookup 100
+# ip route add local 0.0.0.0/0 dev lo table 100
+
+Because of certain restrictions in the IPv4 routing output code you'll have to
+modify your application to allow it to send datagrams _from_ non-local IP
+addresses. All you have to do is enable the (SOL_IP, IP_TRANSPARENT) socket
+option before calling bind:
+
+fd = socket(AF_INET, SOCK_STREAM, 0);
+/* - 8< -*/
+int value = 1;
+setsockopt(fd, SOL_IP, IP_TRANSPARENT, &value, sizeof(value));
+/* - 8< -*/
+name.sin_family = AF_INET;
+name.sin_port = htons(0xCAFE);
+name.sin_addr.s_addr = htonl(0xDEADBEEF);
+bind(fd, &name, sizeof(name));
+
+A trivial patch for netcat is available here:
+http://people.netfilter.org/hidden/tproxy/netcat-ip_transparent-support.patch
+
+
+2. Redirecting traffic
+======================
+
+Transparent proxying often involves "intercepting" traffic on a router. This is
+usually done with the iptables REDIRECT target; however, there are serious
+limitations of that method. One of the major issues is that it actually
+modifies the packets to change the destination address -- which might not be
+acceptable in certain situations. (Think of proxying UDP for example: you won't
+be able to find out the original destination address. Even in case of TCP
+getting the original destination address is racy.)
+
+The 'TPROXY' target provides similar functionality without relying on NAT. Simply
+add rules like this to the iptables ruleset above:
+
+# iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY \
+  --tproxy-mark 0x1/0x1 --on-port 50080
+
+Note that for this to work you'll have to modify the proxy to enable (SOL_IP,
+IP_TRANSPARENT) for the listening socket.
+
+
+3. Iptables extensions
+======================
+
+To use tproxy you'll need to have the 'socket' and 'TPROXY' modules
+compiled for iptables. A patched version of iptables is available
+here: http://git.balabit.hu/?p=bazsi/iptables-tproxy.git
+
+
+4. Application support
+======================
+
+4.1. Squid
+----------
+
+Squid 3.HEAD has support built-in. To use it, pass
+'--enable-linux-netfilter' to configure and set the 'tproxy' option on
+the HTTP listener you redirect traffic to with the TPROXY iptables
+target.
+
+For more information please consult the following page on the Squid
+wiki: http://wiki.squid-cache.org/Features/Tproxy4
index 6fcb3060dec507ed653a5cc0ce72eb9773cbad56..b65f0799df485dfea9d0346a3d3ede5c7fc5afba 100644 (file)
@@ -341,6 +341,8 @@ key that does nothing by itself, as well as any hot key that is type-specific
 3.1 Guidelines for wireless device drivers
 ------------------------------------------
 
+(in this text, rfkill->foo means the foo field of struct rfkill).
+
 1. Each independent transmitter in a wireless device (usually there is only one
 transmitter per device) should have a SINGLE rfkill class attached to it.
 
@@ -363,10 +365,32 @@ This rule exists because users of the rfkill subsystem expect to get (and set,
 when possible) the overall transmitter rfkill state, not of a particular rfkill
 line.
 
-5. During suspend, the rfkill class will attempt to soft-block the radio
-through a call to rfkill->toggle_radio, and will try to restore its previous
-state during resume.  After a rfkill class is suspended, it will *not* call
-rfkill->toggle_radio until it is resumed.
+5. The wireless device driver MUST NOT leave the transmitter enabled during
+suspend and hibernation unless:
+
+       5.1. The transmitter has to be enabled for some sort of functionality
+       like wake-on-wireless-packet or autonomous packed forwarding in a mesh
+       network, and that functionality is enabled for this suspend/hibernation
+       cycle.
+
+AND
+
+       5.2. The device was not on a user-requested BLOCKED state before
+       the suspend (i.e. the driver must NOT unblock a device, not even
+       to support wake-on-wireless-packet or remain in the mesh).
+
+In other words, there is absolutely no allowed scenario where a driver can
+automatically take action to unblock a rfkill controller (obviously, this deals
+with scenarios where soft-blocking or both soft and hard blocking is happening.
+Scenarios where hardware rfkill lines are the only ones blocking the
+transmitter are outside of this rule, since the wireless device driver does not
+control its input hardware rfkill lines in the first place).
+
+6. During resume, rfkill will try to restore its previous state.
+
+7. After a rfkill class is suspended, it will *not* call rfkill->toggle_radio
+until it is resumed.
+
 
 Example of a WLAN wireless driver connected to the rfkill subsystem:
 --------------------------------------------------------------------
index ece4e27f997217d6fe82d63dff85f7b1e23e5461..46d94ff340c69b1e556b6cc2a325d2dd5551384e 100644 (file)
@@ -1048,6 +1048,13 @@ L:       cbe-oss-dev@ozlabs.org
 W:     http://www.ibm.com/developerworks/power/cell/
 S:     Supported
 
+CISCO 10G ETHERNET DRIVER
+P:     Scott Feldman
+M:     scofeldm@cisco.com
+P:     Joe Eykholt
+M:     jeykholt@cisco.com
+S:     Supported
+
 CFAG12864B LCD DRIVER
 P:     Miguel Ojeda Sandonis
 M:     miguel.ojeda.sandonis@gmail.com
@@ -2319,6 +2326,12 @@ L:       video4linux-list@redhat.com
 W:     http://www.ivtvdriver.org
 S:     Maintained
 
+JME NETWORK DRIVER
+P:     Guo-Fu Tseng
+M:     cooldavid@cooldavid.org
+L:     netdev@vger.kernel.org
+S:     Maintained
+
 JOURNALLING FLASH FILE SYSTEM V2 (JFFS2)
 P:     David Woodhouse
 M:     dwmw2@infradead.org
@@ -3384,6 +3397,13 @@ M:       linux-driver@qlogic.com
 L:     netdev@vger.kernel.org
 S:     Supported
 
+QLOGIC QLGE 10Gb ETHERNET DRIVER
+P:     Ron Mercer
+M:     linux-driver@qlogic.com
+M:     ron.mercer@qlogic.com
+L:     netdev@vger.kernel.org
+S:     Supported
+
 QNX4 FILESYSTEM
 P:     Anders Larsen
 M:     al@alarsen.net
@@ -4336,6 +4356,12 @@ L:       linux-usb@vger.kernel.org
 W:     http://www.connecttech.com
 S:     Supported
 
+USB SMSC95XX ETHERNET DRIVER
+P:     Steve Glendinning
+M:     steve.glendinning@smsc.com
+L:     netdev@vger.kernel.org
+S:     Supported
+
 USB SN9C1xx DRIVER
 P:     Luca Risolia
 M:     luca.risolia@studio.unibo.it
index 610fb24d8ae2ed4fcbc7e9220a5849508ef5a5cb..cd317795f3559779e3ac788fff66028b243b3cd6 100644 (file)
@@ -25,7 +25,7 @@
 #include "common.h"
 
 static struct mv643xx_eth_platform_data db88f6281_ge00_data = {
-       .phy_addr       = 8,
+       .phy_addr       = MV643XX_ETH_PHY_ADDR(8),
 };
 
 static struct mv_sata_platform_data db88f6281_sata_data = {
index a3012d4459714c7932d533bd73a805523465ac36..b1d1a87a6821f9b3e53d819fd31cdefc1b8b491d 100644 (file)
@@ -30,7 +30,7 @@
 #define RD88F6192_GPIO_USB_VBUS                10
 
 static struct mv643xx_eth_platform_data rd88f6192_ge00_data = {
-       .phy_addr       = 8,
+       .phy_addr       = MV643XX_ETH_PHY_ADDR(8),
 };
 
 static struct mv_sata_platform_data rd88f6192_sata_data = {
index d96487a0f18bfabe9fbca93a5ba24962e64262a3..b6416615c0b9c0667157c257f733c4cfce30c0b4 100644 (file)
@@ -69,7 +69,7 @@ static struct platform_device rd88f6281_nand_flash = {
 };
 
 static struct mv643xx_eth_platform_data rd88f6281_ge00_data = {
-       .phy_addr       = -1,
+       .phy_addr       = MV643XX_ETH_PHY_NONE,
        .speed          = SPEED_1000,
        .duplex         = DUPLEX_FULL,
 };
index 2cc9ac9b488f24cb8b87a72f50530cd6a34a4be5..85f9c1296aa02675d7c131a85e8c12161a437919 100644 (file)
@@ -67,7 +67,7 @@ static struct platform_device lb88rc8480_boot_flash = {
 };
 
 static struct mv643xx_eth_platform_data lb88rc8480_ge0_data = {
-       .phy_addr       = 1,
+       .phy_addr       = MV643XX_ETH_PHY_ADDR(1),
        .mac_addr       = { 0x00, 0x50, 0x43, 0x11, 0x22, 0x33 },
 };
 
index 953a26c469cb0b9cf0602ec038e75d81129b7405..5842d3bb02b27df67962d2c2140bbd3f5b5295e8 100644 (file)
@@ -330,6 +330,7 @@ void __init mv78xx0_ge00_init(struct mv643xx_eth_platform_data *eth_data)
 struct mv643xx_eth_shared_platform_data mv78xx0_ge01_shared_data = {
        .t_clk          = 0,
        .dram           = &mv78xx0_mbus_dram_info,
+       .shared_smi     = &mv78xx0_ge00_shared,
 };
 
 static struct resource mv78xx0_ge01_shared_resources[] = {
@@ -370,7 +371,6 @@ static struct platform_device mv78xx0_ge01 = {
 void __init mv78xx0_ge01_init(struct mv643xx_eth_platform_data *eth_data)
 {
        eth_data->shared = &mv78xx0_ge01_shared;
-       eth_data->shared_smi = &mv78xx0_ge00_shared;
        mv78xx0_ge01.dev.platform_data = eth_data;
 
        platform_device_register(&mv78xx0_ge01_shared);
@@ -384,6 +384,7 @@ void __init mv78xx0_ge01_init(struct mv643xx_eth_platform_data *eth_data)
 struct mv643xx_eth_shared_platform_data mv78xx0_ge10_shared_data = {
        .t_clk          = 0,
        .dram           = &mv78xx0_mbus_dram_info,
+       .shared_smi     = &mv78xx0_ge00_shared,
 };
 
 static struct resource mv78xx0_ge10_shared_resources[] = {
@@ -424,7 +425,6 @@ static struct platform_device mv78xx0_ge10 = {
 void __init mv78xx0_ge10_init(struct mv643xx_eth_platform_data *eth_data)
 {
        eth_data->shared = &mv78xx0_ge10_shared;
-       eth_data->shared_smi = &mv78xx0_ge00_shared;
        mv78xx0_ge10.dev.platform_data = eth_data;
 
        platform_device_register(&mv78xx0_ge10_shared);
@@ -438,6 +438,7 @@ void __init mv78xx0_ge10_init(struct mv643xx_eth_platform_data *eth_data)
 struct mv643xx_eth_shared_platform_data mv78xx0_ge11_shared_data = {
        .t_clk          = 0,
        .dram           = &mv78xx0_mbus_dram_info,
+       .shared_smi     = &mv78xx0_ge00_shared,
 };
 
 static struct resource mv78xx0_ge11_shared_resources[] = {
@@ -478,7 +479,6 @@ static struct platform_device mv78xx0_ge11 = {
 void __init mv78xx0_ge11_init(struct mv643xx_eth_platform_data *eth_data)
 {
        eth_data->shared = &mv78xx0_ge11_shared;
-       eth_data->shared_smi = &mv78xx0_ge00_shared;
        mv78xx0_ge11.dev.platform_data = eth_data;
 
        platform_device_register(&mv78xx0_ge11_shared);
index a2d0c97836047441ccf486a5629f1b5a20c9e27b..49f434c39eb76e539f46e81be52d9735f7ca5145 100644 (file)
 #include "common.h"
 
 static struct mv643xx_eth_platform_data db78x00_ge00_data = {
-       .phy_addr       = 8,
+       .phy_addr       = MV643XX_ETH_PHY_ADDR(8),
 };
 
 static struct mv643xx_eth_platform_data db78x00_ge01_data = {
-       .phy_addr       = 9,
+       .phy_addr       = MV643XX_ETH_PHY_ADDR(9),
 };
 
 static struct mv643xx_eth_platform_data db78x00_ge10_data = {
-       .phy_addr       = -1,
+       .phy_addr       = MV643XX_ETH_PHY_NONE,
 };
 
 static struct mv643xx_eth_platform_data db78x00_ge11_data = {
-       .phy_addr       = -1,
+       .phy_addr       = MV643XX_ETH_PHY_NONE,
 };
 
 static struct mv_sata_platform_data db78x00_sata_data = {
index ff13e9060b180a9f83c6b0ed2ab5cf4f9d43c205..d318bea2af91bbb5e9ec46a57813d6ef5add40e7 100644 (file)
@@ -285,7 +285,7 @@ subsys_initcall(db88f5281_pci_init);
  * Ethernet
  ****************************************************************************/
 static struct mv643xx_eth_platform_data db88f5281_eth_data = {
-       .phy_addr       = 8,
+       .phy_addr       = MV643XX_ETH_PHY_ADDR(8),
 };
 
 /*****************************************************************************
index b38c65ccfb154b63b584b310ca1539e4c886b08f..3e66098340a538b146c357d51d0fab4218ee313a 100644 (file)
@@ -79,7 +79,7 @@ subsys_initcall(dns323_pci_init);
  */
 
 static struct mv643xx_eth_platform_data dns323_eth_data = {
-       .phy_addr = 8,
+       .phy_addr = MV643XX_ETH_PHY_ADDR(8),
 };
 
 /****************************************************************************
index e321ec331839c1f8e68959bbe8a3ff1e44030f54..610f2a6297f87c893df7a637fa6a7aabcdf4552e 100644 (file)
@@ -161,7 +161,7 @@ subsys_initcall(kurobox_pro_pci_init);
  ****************************************************************************/
 
 static struct mv643xx_eth_platform_data kurobox_pro_eth_data = {
-       .phy_addr       = 8,
+       .phy_addr       = MV643XX_ETH_PHY_ADDR(8),
 };
 
 /*****************************************************************************
index 53ff1893b8835e111406affb4dea47d8b835c6d4..68acca98e638e62efa25b2d3ae12e558a6eec570 100644 (file)
@@ -109,7 +109,7 @@ subsys_initcall(mss2_pci_init);
  ****************************************************************************/
 
 static struct mv643xx_eth_platform_data mss2_eth_data = {
-       .phy_addr       = 8,
+       .phy_addr       = MV643XX_ETH_PHY_ADDR(8),
 };
 
 /*****************************************************************************
index 978d4d5993964f93baa09bf387c55881d52494cb..97c9ccb2ac60f7713bc076e38b3b23b8dff94c04 100644 (file)
@@ -39,7 +39,7 @@
  * Ethernet
  ****************************************************************************/
 static struct mv643xx_eth_platform_data mv2120_eth_data = {
-       .phy_addr       = 8,
+       .phy_addr       = MV643XX_ETH_PHY_ADDR(8),
 };
 
 static struct mv_sata_platform_data mv2120_sata_data = {
index e72fe1e065e825069547e166763f33adaf32b3b1..500cdadaf09c8e160f566b37a1fb785e39437cce 100644 (file)
@@ -88,7 +88,7 @@ static struct orion5x_mpp_mode rd88f5181l_fxo_mpp_modes[] __initdata = {
 };
 
 static struct mv643xx_eth_platform_data rd88f5181l_fxo_eth_data = {
-       .phy_addr       = -1,
+       .phy_addr       = MV643XX_ETH_PHY_NONE,
        .speed          = SPEED_1000,
        .duplex         = DUPLEX_FULL,
 };
index a1fe3257320d77732c121eeb9b7c07b25557909e..ebde8141649935058d7a701b485e7a6b412cccd7 100644 (file)
@@ -89,7 +89,7 @@ static struct orion5x_mpp_mode rd88f5181l_ge_mpp_modes[] __initdata = {
 };
 
 static struct mv643xx_eth_platform_data rd88f5181l_ge_eth_data = {
-       .phy_addr       = -1,
+       .phy_addr       = MV643XX_ETH_PHY_NONE,
        .speed          = SPEED_1000,
        .duplex         = DUPLEX_FULL,
 };
index 4c3bcd76ac85ba0ca55f1b40510ac0e93ef04f62..a04f9e4b633a409a10a80cfb5c63da32f4ce3793 100644 (file)
@@ -221,7 +221,7 @@ subsys_initcall(rd88f5182_pci_init);
  ****************************************************************************/
 
 static struct mv643xx_eth_platform_data rd88f5182_eth_data = {
-       .phy_addr       = 8,
+       .phy_addr       = MV643XX_ETH_PHY_ADDR(8),
 };
 
 /*****************************************************************************
index ae0a5dccd2a1f465ae9ce4cd3a657d1ffe4a878f..1368e9fd1a06806d629d21db2667086fe3c7b7ae 100644 (file)
@@ -103,8 +103,7 @@ static struct platform_device ts78xx_nor_boot_flash = {
  * Ethernet
  ****************************************************************************/
 static struct mv643xx_eth_platform_data ts78xx_eth_data = {
-       .phy_addr       = 0,
-       .force_phy_addr = 1,
+       .phy_addr       = MV643XX_ETH_PHY_ADDR(0),
 };
 
 /*****************************************************************************
index 83feac3147a60d257da59957e2b40d67d632c3dc..19cde24fbfdf91a6bec33d628ebe510de20f1d64 100644 (file)
@@ -48,7 +48,7 @@ void qnap_tsx09_power_off(void)
  ****************************************************************************/
 
 struct mv643xx_eth_platform_data qnap_tsx09_eth_data = {
-       .phy_addr       = 8,
+       .phy_addr       = MV643XX_ETH_PHY_ADDR(8),
 };
 
 static int __init qnap_tsx09_parse_hex_nibble(char n)
index b6bc43e07eed1cce12d21dd0cfdb8cadeb4537ae..7ddc22c2bb5480d17455fe533023ddd36d66a58f 100644 (file)
@@ -92,7 +92,7 @@ static struct platform_device wnr854t_nor_flash = {
 };
 
 static struct mv643xx_eth_platform_data wnr854t_eth_data = {
-       .phy_addr       = -1,
+       .phy_addr       = MV643XX_ETH_PHY_NONE,
        .speed          = SPEED_1000,
        .duplex         = DUPLEX_FULL,
 };
index b10da17b3fbdc0dc8842df785a23f7dbcc5db089..9a4fd5256462e8686b81643e47fe9c8987165f10 100644 (file)
@@ -100,7 +100,7 @@ static struct platform_device wrt350n_v2_nor_flash = {
 };
 
 static struct mv643xx_eth_platform_data wrt350n_v2_eth_data = {
-       .phy_addr       = -1,
+       .phy_addr       = MV643XX_ETH_PHY_NONE,
        .speed          = SPEED_1000,
        .duplex         = DUPLEX_FULL,
 };
index 29b0ecef980a54e77b05432a8a35328a038104df..f15296cf35988c7e78a1d1d0236ae843bde73005 100644 (file)
 #define SDR0_UART3             0x0123
 #define SDR0_CUST0             0x4000
 
+/* SDRs (460EX/460GT) */
+#define SDR0_ETH_CFG           0x4103
+#define SDR0_ETH_CFG_ECS       0x00000100      /* EMAC int clk source */
+
 /*
  * All those DCR register addresses are offsets from the base address
  * for the SRAM0 controller (e.g. 0x20 on 440GX). The base address is
index d5770fdf7f0970701c033363f53013caa3e5b45e..0eb6d7f62241a38c43e47853e02183374ab752f2 100644 (file)
@@ -137,7 +137,7 @@ static int __devinit ep8248e_mdio_probe(struct of_device *ofdev,
                bus->irq[i] = -1;
 
        bus->name = "ep8248e-mdio-bitbang";
-       bus->dev = &ofdev->dev;
+       bus->parent = &ofdev->dev;
        snprintf(bus->id, MII_BUS_ID_SIZE, "%x", res.start);
 
        return mdiobus_register(bus);
index ab6955412ba49becbc14e0c4aa536dbb7121ecbd..75cc165d5bee6e73f0a07dc38edd60dcf442941d 100644 (file)
@@ -230,7 +230,7 @@ static int __devinit gpio_mdio_probe(struct of_device *ofdev,
        if (!priv)
                goto out;
 
-       new_bus = kzalloc(sizeof(struct mii_bus), GFP_KERNEL);
+       new_bus = mdiobus_alloc();
 
        if (!new_bus)
                goto out_free_priv;
@@ -272,7 +272,7 @@ static int __devinit gpio_mdio_probe(struct of_device *ofdev,
        prop = of_get_property(np, "mdio-pin", NULL);
        priv->mdio_pin = *prop;
 
-       new_bus->dev = dev;
+       new_bus->parent = dev;
        dev_set_drvdata(dev, new_bus);
 
        err = mdiobus_register(new_bus);
@@ -306,7 +306,7 @@ static int gpio_mdio_remove(struct of_device *dev)
 
        kfree(bus->priv);
        bus->priv = NULL;
-       kfree(bus);
+       mdiobus_free(bus);
 
        return 0;
 }
index 32e0ad0ebea8286af9b5b3b8cc1bd18ac1a42ed0..b6bd775d2e222d765e5bbad2e986c5d9ac19def3 100644 (file)
@@ -293,10 +293,8 @@ static int __init mv64x60_eth_device_setup(struct device_node *np, int id,
                return -ENODEV;
 
        prop = of_get_property(phy, "reg", NULL);
-       if (prop) {
-               pdata.force_phy_addr = 1;
-               pdata.phy_addr = *prop;
-       }
+       if (prop)
+               pdata.phy_addr = MV643XX_ETH_PHY_ADDR(*prop);
 
        of_node_put(phy);
 
index 735f5ea17473152fc9560a49f15de97cb1dd71b4..12cf5d491f0de2d0dc086cfb00935d23757b44ff 100644 (file)
@@ -260,6 +260,9 @@ config ACPI_ASUS
 config ACPI_TOSHIBA
        tristate "Toshiba Laptop Extras"
        depends on X86
+       select INPUT_POLLDEV
+       select NET
+       select RFKILL
        select BACKLIGHT_CLASS_DEVICE
        ---help---
          This driver adds support for access to certain system settings
index 0a43c8e0eff323fe55f29846695c71e750ffedf3..8a649f40d1620f0d9610e33f81a87da1d75a45f9 100644 (file)
@@ -3,6 +3,7 @@
  *
  *
  *  Copyright (C) 2002-2004 John Belmonte
+ *  Copyright (C) 2008 Philip Langdale
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -33,7 +34,7 @@
  *
  */
 
-#define TOSHIBA_ACPI_VERSION   "0.18"
+#define TOSHIBA_ACPI_VERSION   "0.19"
 #define PROC_INTERFACE_VERSION 1
 
 #include <linux/kernel.h>
@@ -42,6 +43,9 @@
 #include <linux/types.h>
 #include <linux/proc_fs.h>
 #include <linux/backlight.h>
+#include <linux/platform_device.h>
+#include <linux/rfkill.h>
+#include <linux/input-polldev.h>
 
 #include <asm/uaccess.h>
 
@@ -90,6 +94,7 @@ MODULE_LICENSE("GPL");
 #define HCI_VIDEO_OUT                  0x001c
 #define HCI_HOTKEY_EVENT               0x001e
 #define HCI_LCD_BRIGHTNESS             0x002a
+#define HCI_WIRELESS                   0x0056
 
 /* field definitions */
 #define HCI_LCD_BRIGHTNESS_BITS                3
@@ -98,9 +103,14 @@ MODULE_LICENSE("GPL");
 #define HCI_VIDEO_OUT_LCD              0x1
 #define HCI_VIDEO_OUT_CRT              0x2
 #define HCI_VIDEO_OUT_TV               0x4
+#define HCI_WIRELESS_KILL_SWITCH       0x01
+#define HCI_WIRELESS_BT_PRESENT                0x0f
+#define HCI_WIRELESS_BT_ATTACH         0x40
+#define HCI_WIRELESS_BT_POWER          0x80
 
 static const struct acpi_device_id toshiba_device_ids[] = {
        {"TOS6200", 0},
+       {"TOS6208", 0},
        {"TOS1900", 0},
        {"", 0},
 };
@@ -193,7 +203,7 @@ static acpi_status hci_raw(const u32 in[HCI_WORDS], u32 out[HCI_WORDS])
        return status;
 }
 
-/* common hci tasks (get or set one value)
+/* common hci tasks (get or set one or two value)
  *
  * In addition to the ACPI status, the HCI system returns a result which
  * may be useful (such as "not supported").
@@ -218,6 +228,152 @@ static acpi_status hci_read1(u32 reg, u32 * out1, u32 * result)
        return status;
 }
 
+static acpi_status hci_write2(u32 reg, u32 in1, u32 in2, u32 *result)
+{
+       u32 in[HCI_WORDS] = { HCI_SET, reg, in1, in2, 0, 0 };
+       u32 out[HCI_WORDS];
+       acpi_status status = hci_raw(in, out);
+       *result = (status == AE_OK) ? out[0] : HCI_FAILURE;
+       return status;
+}
+
+static acpi_status hci_read2(u32 reg, u32 *out1, u32 *out2, u32 *result)
+{
+       u32 in[HCI_WORDS] = { HCI_GET, reg, *out1, *out2, 0, 0 };
+       u32 out[HCI_WORDS];
+       acpi_status status = hci_raw(in, out);
+       *out1 = out[2];
+       *out2 = out[3];
+       *result = (status == AE_OK) ? out[0] : HCI_FAILURE;
+       return status;
+}
+
+struct toshiba_acpi_dev {
+       struct platform_device *p_dev;
+       struct rfkill *rfk_dev;
+       struct input_polled_dev *poll_dev;
+
+       const char *bt_name;
+       const char *rfk_name;
+
+       bool last_rfk_state;
+
+       struct mutex mutex;
+};
+
+static struct toshiba_acpi_dev toshiba_acpi = {
+       .bt_name = "Toshiba Bluetooth",
+       .rfk_name = "Toshiba RFKill Switch",
+       .last_rfk_state = false,
+};
+
+/* Bluetooth rfkill handlers */
+
+static u32 hci_get_bt_present(bool *present)
+{
+       u32 hci_result;
+       u32 value, value2;
+
+       value = 0;
+       value2 = 0;
+       hci_read2(HCI_WIRELESS, &value, &value2, &hci_result);
+       if (hci_result == HCI_SUCCESS)
+               *present = (value & HCI_WIRELESS_BT_PRESENT) ? true : false;
+
+       return hci_result;
+}
+
+static u32 hci_get_bt_on(bool *on)
+{
+       u32 hci_result;
+       u32 value, value2;
+
+       value = 0;
+       value2 = 0x0001;
+       hci_read2(HCI_WIRELESS, &value, &value2, &hci_result);
+       if (hci_result == HCI_SUCCESS)
+               *on = (value & HCI_WIRELESS_BT_POWER) &&
+                     (value & HCI_WIRELESS_BT_ATTACH);
+
+       return hci_result;
+}
+
+static u32 hci_get_radio_state(bool *radio_state)
+{
+       u32 hci_result;
+       u32 value, value2;
+
+       value = 0;
+       value2 = 0x0001;
+       hci_read2(HCI_WIRELESS, &value, &value2, &hci_result);
+
+       *radio_state = value & HCI_WIRELESS_KILL_SWITCH;
+       return hci_result;
+}
+
+static int bt_rfkill_toggle_radio(void *data, enum rfkill_state state)
+{
+       u32 result1, result2;
+       u32 value;
+       bool radio_state;
+       struct toshiba_acpi_dev *dev = data;
+
+       value = (state == RFKILL_STATE_UNBLOCKED);
+
+       if (hci_get_radio_state(&radio_state) != HCI_SUCCESS)
+               return -EFAULT;
+
+       switch (state) {
+       case RFKILL_STATE_UNBLOCKED:
+               if (!radio_state)
+                       return -EPERM;
+               break;
+       case RFKILL_STATE_SOFT_BLOCKED:
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       mutex_lock(&dev->mutex);
+       hci_write2(HCI_WIRELESS, value, HCI_WIRELESS_BT_POWER, &result1);
+       hci_write2(HCI_WIRELESS, value, HCI_WIRELESS_BT_ATTACH, &result2);
+       mutex_unlock(&dev->mutex);
+
+       if (result1 != HCI_SUCCESS || result2 != HCI_SUCCESS)
+               return -EFAULT;
+
+       return 0;
+}
+
+static void bt_poll_rfkill(struct input_polled_dev *poll_dev)
+{
+       bool state_changed;
+       bool new_rfk_state;
+       bool value;
+       u32 hci_result;
+       struct toshiba_acpi_dev *dev = poll_dev->private;
+
+       hci_result = hci_get_radio_state(&value);
+       if (hci_result != HCI_SUCCESS)
+               return; /* Can't do anything useful */
+
+       new_rfk_state = value;
+
+       mutex_lock(&dev->mutex);
+       state_changed = new_rfk_state != dev->last_rfk_state;
+       dev->last_rfk_state = new_rfk_state;
+       mutex_unlock(&dev->mutex);
+
+       if (unlikely(state_changed)) {
+               rfkill_force_state(dev->rfk_dev,
+                                  new_rfk_state ?
+                                  RFKILL_STATE_SOFT_BLOCKED :
+                                  RFKILL_STATE_HARD_BLOCKED);
+               input_report_switch(poll_dev->input, SW_RFKILL_ALL,
+                                   new_rfk_state);
+       }
+}
+
 static struct proc_dir_entry *toshiba_proc_dir /*= 0*/ ;
 static struct backlight_device *toshiba_backlight_device;
 static int force_fan;
@@ -547,6 +703,14 @@ static struct backlight_ops toshiba_backlight_data = {
 
 static void toshiba_acpi_exit(void)
 {
+       if (toshiba_acpi.poll_dev) {
+               input_unregister_polled_device(toshiba_acpi.poll_dev);
+               input_free_polled_device(toshiba_acpi.poll_dev);
+       }
+
+       if (toshiba_acpi.rfk_dev)
+               rfkill_unregister(toshiba_acpi.rfk_dev);
+
        if (toshiba_backlight_device)
                backlight_device_unregister(toshiba_backlight_device);
 
@@ -555,6 +719,8 @@ static void toshiba_acpi_exit(void)
        if (toshiba_proc_dir)
                remove_proc_entry(PROC_TOSHIBA, acpi_root_dir);
 
+       platform_device_unregister(toshiba_acpi.p_dev);
+
        return;
 }
 
@@ -562,6 +728,10 @@ static int __init toshiba_acpi_init(void)
 {
        acpi_status status = AE_OK;
        u32 hci_result;
+       bool bt_present;
+       bool bt_on;
+       bool radio_on;
+       int ret = 0;
 
        if (acpi_disabled)
                return -ENODEV;
@@ -578,6 +748,18 @@ static int __init toshiba_acpi_init(void)
               TOSHIBA_ACPI_VERSION);
        printk(MY_INFO "    HCI method: %s\n", method_hci);
 
+       mutex_init(&toshiba_acpi.mutex);
+
+       toshiba_acpi.p_dev = platform_device_register_simple("toshiba_acpi",
+                                                             -1, NULL, 0);
+       if (IS_ERR(toshiba_acpi.p_dev)) {
+               ret = PTR_ERR(toshiba_acpi.p_dev);
+               printk(MY_ERR "unable to register platform device\n");
+               toshiba_acpi.p_dev = NULL;
+               toshiba_acpi_exit();
+               return ret;
+       }
+
        force_fan = 0;
        key_event_valid = 0;
 
@@ -586,19 +768,23 @@ static int __init toshiba_acpi_init(void)
 
        toshiba_proc_dir = proc_mkdir(PROC_TOSHIBA, acpi_root_dir);
        if (!toshiba_proc_dir) {
-               status = AE_ERROR;
+               toshiba_acpi_exit();
+               return -ENODEV;
        } else {
                toshiba_proc_dir->owner = THIS_MODULE;
                status = add_device();
-               if (ACPI_FAILURE(status))
-                       remove_proc_entry(PROC_TOSHIBA, acpi_root_dir);
+               if (ACPI_FAILURE(status)) {
+                       toshiba_acpi_exit();
+                       return -ENODEV;
+               }
        }
 
-       toshiba_backlight_device = backlight_device_register("toshiba",NULL,
+       toshiba_backlight_device = backlight_device_register("toshiba",
+                                               &toshiba_acpi.p_dev->dev,
                                                NULL,
                                                &toshiba_backlight_data);
         if (IS_ERR(toshiba_backlight_device)) {
-               int ret = PTR_ERR(toshiba_backlight_device);
+               ret = PTR_ERR(toshiba_backlight_device);
 
                printk(KERN_ERR "Could not register toshiba backlight device\n");
                toshiba_backlight_device = NULL;
@@ -607,7 +793,66 @@ static int __init toshiba_acpi_init(void)
        }
         toshiba_backlight_device->props.max_brightness = HCI_LCD_BRIGHTNESS_LEVELS - 1;
 
-       return (ACPI_SUCCESS(status)) ? 0 : -ENODEV;
+       /* Register rfkill switch for Bluetooth */
+       if (hci_get_bt_present(&bt_present) == HCI_SUCCESS && bt_present) {
+               toshiba_acpi.rfk_dev = rfkill_allocate(&toshiba_acpi.p_dev->dev,
+                                                       RFKILL_TYPE_BLUETOOTH);
+               if (!toshiba_acpi.rfk_dev) {
+                       printk(MY_ERR "unable to allocate rfkill device\n");
+                       toshiba_acpi_exit();
+                       return -ENOMEM;
+               }
+
+               toshiba_acpi.rfk_dev->name = toshiba_acpi.bt_name;
+               toshiba_acpi.rfk_dev->toggle_radio = bt_rfkill_toggle_radio;
+               toshiba_acpi.rfk_dev->user_claim_unsupported = 1;
+               toshiba_acpi.rfk_dev->data = &toshiba_acpi;
+
+               if (hci_get_bt_on(&bt_on) == HCI_SUCCESS && bt_on) {
+                       toshiba_acpi.rfk_dev->state = RFKILL_STATE_UNBLOCKED;
+               } else if (hci_get_radio_state(&radio_on) == HCI_SUCCESS &&
+                          radio_on) {
+                       toshiba_acpi.rfk_dev->state = RFKILL_STATE_SOFT_BLOCKED;
+               } else {
+                       toshiba_acpi.rfk_dev->state = RFKILL_STATE_HARD_BLOCKED;
+               }
+
+               ret = rfkill_register(toshiba_acpi.rfk_dev);
+               if (ret) {
+                       printk(MY_ERR "unable to register rfkill device\n");
+                       toshiba_acpi_exit();
+                       return -ENOMEM;
+               }
+       }
+
+       /* Register input device for kill switch */
+       toshiba_acpi.poll_dev = input_allocate_polled_device();
+       if (!toshiba_acpi.poll_dev) {
+               printk(MY_ERR "unable to allocate kill-switch input device\n");
+               toshiba_acpi_exit();
+               return -ENOMEM;
+       }
+       toshiba_acpi.poll_dev->private = &toshiba_acpi;
+       toshiba_acpi.poll_dev->poll = bt_poll_rfkill;
+       toshiba_acpi.poll_dev->poll_interval = 1000; /* msecs */
+
+       toshiba_acpi.poll_dev->input->name = toshiba_acpi.rfk_name;
+       toshiba_acpi.poll_dev->input->id.bustype = BUS_HOST;
+       toshiba_acpi.poll_dev->input->id.vendor = 0x0930; /* Toshiba USB ID */
+       set_bit(EV_SW, toshiba_acpi.poll_dev->input->evbit);
+       set_bit(SW_RFKILL_ALL, toshiba_acpi.poll_dev->input->swbit);
+       input_report_switch(toshiba_acpi.poll_dev->input, SW_RFKILL_ALL, TRUE);
+
+       ret = input_register_polled_device(toshiba_acpi.poll_dev);
+       if (ret) {
+               printk(MY_ERR "unable to register kill-switch input device\n");
+               rfkill_free(toshiba_acpi.rfk_dev);
+               toshiba_acpi.rfk_dev = NULL;
+               toshiba_acpi_exit();
+               return ret;
+       }
+
+       return 0;
 }
 
 module_init(toshiba_acpi_init);
index 41b2204ebc6e1341dbc4b12d256309e0a33c3f18..5503bfc8e1320e0a362b2f4ffd57e043104ca1d7 100644 (file)
@@ -1270,7 +1270,7 @@ static int comp_tx(struct eni_dev *eni_dev,int *pcr,int reserved,int *pre,
                        if (*pre < 3) (*pre)++; /* else fail later */
                        div = pre_div[*pre]*-*pcr;
                        DPRINTK("max div %d\n",div);
-                       *res = (TS_CLOCK+div-1)/div-1;
+                       *res = DIV_ROUND_UP(TS_CLOCK, div)-1;
                }
                if (*res < 0) *res = 0;
                if (*res > MID_SEG_MAX_RATE) *res = MID_SEG_MAX_RATE;
index c0ac728dc5645ba6b5f7d2a213d9903b0a88a1e7..615412364e9930aa042b682e503d3816f2498b8e 100644 (file)
@@ -635,7 +635,7 @@ static int make_rate (const hrz_dev * dev, u32 c, rounding r,
                // take care of rounding
                switch (r) {
                        case round_down:
-                               pre = (br+(c<<div)-1)/(c<<div);
+                               pre = DIV_ROUND_UP(br, c<<div);
                                // but p must be non-zero
                                if (!pre)
                                        pre = 1;
@@ -668,7 +668,7 @@ static int make_rate (const hrz_dev * dev, u32 c, rounding r,
                        // take care of rounding
                        switch (r) {
                                case round_down:
-                                       pre = (br+(c<<div)-1)/(c<<div);
+                                       pre = DIV_ROUND_UP(br, c<<div);
                                        break;
                                case round_nearest:
                                        pre = (br+(c<<div)/2)/(c<<div);
@@ -698,7 +698,7 @@ got_it:
                if (bits)
                        *bits = (div<<CLOCK_SELECT_SHIFT) | (pre-1);
                if (actual) {
-                       *actual = (br + (pre<<div) - 1) / (pre<<div);
+                       *actual = DIV_ROUND_UP(br, pre<<div);
                        PRINTD (DBG_QOS, "actual rate: %u", *actual);
                }
                return 0;
@@ -1967,7 +1967,7 @@ static int __devinit hrz_init (hrz_dev * dev) {
   // Set the max AAL5 cell count to be just enough to contain the
   // largest AAL5 frame that the user wants to receive
   wr_regw (dev, MAX_AAL5_CELL_COUNT_OFF,
-          (max_rx_size + ATM_AAL5_TRAILER + ATM_CELL_PAYLOAD - 1) / ATM_CELL_PAYLOAD);
+          DIV_ROUND_UP(max_rx_size + ATM_AAL5_TRAILER, ATM_CELL_PAYLOAD));
   
   // Enable receive
   wr_regw (dev, RX_CONFIG_OFF, rd_regw (dev, RX_CONFIG_OFF) | RX_ENABLE);
index 3a504e94a4d9439c5c017c5d32797218a03294fe..e33ae0025b1214c45e0380e495d7e135dc4a59a5 100644 (file)
@@ -1114,11 +1114,8 @@ dequeue_rx(struct idt77252_dev *card, struct rsq_entry *rsqe)
 
        rpp = &vc->rcv.rx_pool;
 
+       __skb_queue_tail(&rpp->queue, skb);
        rpp->len += skb->len;
-       if (!rpp->count++)
-               rpp->first = skb;
-       *rpp->last = skb;
-       rpp->last = &skb->next;
 
        if (stat & SAR_RSQE_EPDU) {
                unsigned char *l1l2;
@@ -1145,7 +1142,7 @@ dequeue_rx(struct idt77252_dev *card, struct rsq_entry *rsqe)
                        atomic_inc(&vcc->stats->rx_err);
                        return;
                }
-               if (rpp->count > 1) {
+               if (skb_queue_len(&rpp->queue) > 1) {
                        struct sk_buff *sb;
 
                        skb = dev_alloc_skb(rpp->len);
@@ -1161,12 +1158,9 @@ dequeue_rx(struct idt77252_dev *card, struct rsq_entry *rsqe)
                                dev_kfree_skb(skb);
                                return;
                        }
-                       sb = rpp->first;
-                       for (i = 0; i < rpp->count; i++) {
+                       skb_queue_walk(&rpp->queue, sb)
                                memcpy(skb_put(skb, sb->len),
                                       sb->data, sb->len);
-                               sb = sb->next;
-                       }
 
                        recycle_rx_pool_skb(card, rpp);
 
@@ -1180,7 +1174,6 @@ dequeue_rx(struct idt77252_dev *card, struct rsq_entry *rsqe)
                        return;
                }
 
-               skb->next = NULL;
                flush_rx_pool(card, rpp);
 
                if (!atm_charge(vcc, skb->truesize)) {
@@ -1918,25 +1911,18 @@ recycle_rx_skb(struct idt77252_dev *card, struct sk_buff *skb)
 static void
 flush_rx_pool(struct idt77252_dev *card, struct rx_pool *rpp)
 {
+       skb_queue_head_init(&rpp->queue);
        rpp->len = 0;
-       rpp->count = 0;
-       rpp->first = NULL;
-       rpp->last = &rpp->first;
 }
 
 static void
 recycle_rx_pool_skb(struct idt77252_dev *card, struct rx_pool *rpp)
 {
-       struct sk_buff *skb, *next;
-       int i;
+       struct sk_buff *skb, *tmp;
 
-       skb = rpp->first;
-       for (i = 0; i < rpp->count; i++) {
-               next = skb->next;
-               skb->next = NULL;
+       skb_queue_walk_safe(&rpp->queue, skb, tmp)
                recycle_rx_skb(card, skb);
-               skb = next;
-       }
+
        flush_rx_pool(card, rpp);
 }
 
@@ -2537,7 +2523,7 @@ idt77252_close(struct atm_vcc *vcc)
                waitfor_idle(card);
                spin_unlock_irqrestore(&card->cmd_lock, flags);
 
-               if (vc->rcv.rx_pool.count) {
+               if (skb_queue_len(&vc->rcv.rx_pool.queue) != 0) {
                        DPRINTK("%s: closing a VC with pending rx buffers.\n",
                                card->name);
 
@@ -2970,7 +2956,7 @@ close_card_oam(struct idt77252_dev *card)
                        waitfor_idle(card);
                        spin_unlock_irqrestore(&card->cmd_lock, flags);
 
-                       if (vc->rcv.rx_pool.count) {
+                       if (skb_queue_len(&vc->rcv.rx_pool.queue) != 0) {
                                DPRINTK("%s: closing a VC "
                                        "with pending rx buffers.\n",
                                        card->name);
index e83eaf120da0f23f83bcf138503fda436e844a4c..5042bb2dab15d0d13b91a08f7acea412a71a2d6b 100644 (file)
@@ -173,10 +173,8 @@ struct scq_info
 };
 
 struct rx_pool {
-       struct sk_buff          *first;
-       struct sk_buff          **last;
+       struct sk_buff_head     queue;
        unsigned int            len;
-       unsigned int            count;
 };
 
 struct aal1 {
index 58583c6ac5be556f1297ae0353e1f5b95dc56d17..752b1ba81f7e9bbd5ff56944723ae6740318dad5 100644 (file)
@@ -496,8 +496,8 @@ static int open_rx_first(struct atm_vcc *vcc)
                        vcc->qos.rxtp.max_sdu = 65464;
                        /* fix this - we may want to receive 64kB SDUs
                           later */
-               cells = (vcc->qos.rxtp.max_sdu+ATM_AAL5_TRAILER+
-                   ATM_CELL_PAYLOAD-1)/ATM_CELL_PAYLOAD;
+               cells = DIV_ROUND_UP(vcc->qos.rxtp.max_sdu + ATM_AAL5_TRAILER,
+                               ATM_CELL_PAYLOAD);
                zatm_vcc->pool = pool_index(cells*ATM_CELL_PAYLOAD);
        }
        else {
@@ -820,7 +820,7 @@ static int alloc_shaper(struct atm_dev *dev,int *pcr,int min,int max,int ubr)
                        }
                        else {
                                i = 255;
-                               m = (ATM_OC3_PCR*255+max-1)/max;
+                               m = DIV_ROUND_UP(ATM_OC3_PCR*255, max);
                        }
                }
                if (i > m) {
index 5b4c6e649c11170803a8ed7bedc7ca333c69a99a..93f3690396a5176de5cec3fb3151ef9e1670299d 100644 (file)
@@ -159,11 +159,8 @@ struct aoedev {
        sector_t ssize;
        struct timer_list timer;
        spinlock_t lock;
-       struct sk_buff *sendq_hd; /* packets needing to be sent, list head */
-       struct sk_buff *sendq_tl;
-       struct sk_buff *skbpool_hd;
-       struct sk_buff *skbpool_tl;
-       int nskbpool;
+       struct sk_buff_head sendq;
+       struct sk_buff_head skbpool;
        mempool_t *bufpool;     /* for deadlock-free Buf allocation */
        struct list_head bufq;  /* queue of bios to work on */
        struct buf *inprocess;  /* the one we're currently working on */
@@ -199,7 +196,7 @@ int aoedev_flush(const char __user *str, size_t size);
 
 int aoenet_init(void);
 void aoenet_exit(void);
-void aoenet_xmit(struct sk_buff *);
+void aoenet_xmit(struct sk_buff_head *);
 int is_aoe_netif(struct net_device *ifp);
 int set_aoe_iflist(const char __user *str, size_t size);
 
index aa69556c34857bddb120fdb8f378afa6fff8adaa..b82654e883a759f10d46dd67f311eab59a35fec6 100644 (file)
@@ -158,9 +158,9 @@ aoeblk_release(struct inode *inode, struct file *filp)
 static int
 aoeblk_make_request(struct request_queue *q, struct bio *bio)
 {
+       struct sk_buff_head queue;
        struct aoedev *d;
        struct buf *buf;
-       struct sk_buff *sl;
        ulong flags;
 
        blk_queue_bounce(q, &bio);
@@ -213,11 +213,11 @@ aoeblk_make_request(struct request_queue *q, struct bio *bio)
        list_add_tail(&buf->bufs, &d->bufq);
 
        aoecmd_work(d);
-       sl = d->sendq_hd;
-       d->sendq_hd = d->sendq_tl = NULL;
+       __skb_queue_head_init(&queue);
+       skb_queue_splice_init(&d->sendq, &queue);
 
        spin_unlock_irqrestore(&d->lock, flags);
-       aoenet_xmit(sl);
+       aoenet_xmit(&queue);
 
        return 0;
 }
index 181ebb85f0be582e95206aa144c04ee26ff016bc..1f56d2c5b7fc67acb83899494c9376297a030f6c 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/completion.h>
 #include <linux/delay.h>
 #include <linux/smp_lock.h>
+#include <linux/skbuff.h>
 #include "aoe.h"
 
 enum {
@@ -103,7 +104,12 @@ loop:
                spin_lock_irqsave(&d->lock, flags);
                goto loop;
        }
-       aoenet_xmit(skb);
+       if (skb) {
+               struct sk_buff_head queue;
+               __skb_queue_head_init(&queue);
+               __skb_queue_tail(&queue, skb);
+               aoenet_xmit(&queue);
+       }
        aoecmd_cfg(major, minor);
        return 0;
 }
index 961d29a53cab5461a1421d1b236fdccdb43d52e6..71ff78c9e4d6c24a3d752cc35956645aa752eb34 100644 (file)
@@ -114,29 +114,22 @@ ifrotate(struct aoetgt *t)
 static void
 skb_pool_put(struct aoedev *d, struct sk_buff *skb)
 {
-       if (!d->skbpool_hd)
-               d->skbpool_hd = skb;
-       else
-               d->skbpool_tl->next = skb;
-       d->skbpool_tl = skb;
+       __skb_queue_tail(&d->skbpool, skb);
 }
 
 static struct sk_buff *
 skb_pool_get(struct aoedev *d)
 {
-       struct sk_buff *skb;
+       struct sk_buff *skb = skb_peek(&d->skbpool);
 
-       skb = d->skbpool_hd;
        if (skb && atomic_read(&skb_shinfo(skb)->dataref) == 1) {
-               d->skbpool_hd = skb->next;
-               skb->next = NULL;
+               __skb_unlink(skb, &d->skbpool);
                return skb;
        }
-       if (d->nskbpool < NSKBPOOLMAX
-       && (skb = new_skb(ETH_ZLEN))) {
-               d->nskbpool++;
+       if (skb_queue_len(&d->skbpool) < NSKBPOOLMAX &&
+           (skb = new_skb(ETH_ZLEN)))
                return skb;
-       }
+
        return NULL;
 }
 
@@ -293,29 +286,22 @@ aoecmd_ata_rw(struct aoedev *d)
 
        skb->dev = t->ifp->nd;
        skb = skb_clone(skb, GFP_ATOMIC);
-       if (skb) {
-               if (d->sendq_hd)
-                       d->sendq_tl->next = skb;
-               else
-                       d->sendq_hd = skb;
-               d->sendq_tl = skb;
-       }
+       if (skb)
+               __skb_queue_tail(&d->sendq, skb);
        return 1;
 }
 
 /* some callers cannot sleep, and they can call this function,
  * transmitting the packets later, when interrupts are on
  */
-static struct sk_buff *
-aoecmd_cfg_pkts(ushort aoemajor, unsigned char aoeminor, struct sk_buff **tail)
+static void
+aoecmd_cfg_pkts(ushort aoemajor, unsigned char aoeminor, struct sk_buff_head *queue)
 {
        struct aoe_hdr *h;
        struct aoe_cfghdr *ch;
-       struct sk_buff *skb, *sl, *sl_tail;
+       struct sk_buff *skb;
        struct net_device *ifp;
 
-       sl = sl_tail = NULL;
-
        read_lock(&dev_base_lock);
        for_each_netdev(&init_net, ifp) {
                dev_hold(ifp);
@@ -329,8 +315,7 @@ aoecmd_cfg_pkts(ushort aoemajor, unsigned char aoeminor, struct sk_buff **tail)
                }
                skb_put(skb, sizeof *h + sizeof *ch);
                skb->dev = ifp;
-               if (sl_tail == NULL)
-                       sl_tail = skb;
+               __skb_queue_tail(queue, skb);
                h = (struct aoe_hdr *) skb_mac_header(skb);
                memset(h, 0, sizeof *h + sizeof *ch);
 
@@ -342,16 +327,10 @@ aoecmd_cfg_pkts(ushort aoemajor, unsigned char aoeminor, struct sk_buff **tail)
                h->minor = aoeminor;
                h->cmd = AOECMD_CFG;
 
-               skb->next = sl;
-               sl = skb;
 cont:
                dev_put(ifp);
        }
        read_unlock(&dev_base_lock);
-
-       if (tail != NULL)
-               *tail = sl_tail;
-       return sl;
 }
 
 static void
@@ -406,11 +385,7 @@ resend(struct aoedev *d, struct aoetgt *t, struct frame *f)
        skb = skb_clone(skb, GFP_ATOMIC);
        if (skb == NULL)
                return;
-       if (d->sendq_hd)
-               d->sendq_tl->next = skb;
-       else
-               d->sendq_hd = skb;
-       d->sendq_tl = skb;
+       __skb_queue_tail(&d->sendq, skb);
 }
 
 static int
@@ -508,16 +483,15 @@ ata_scnt(unsigned char *packet) {
 static void
 rexmit_timer(ulong vp)
 {
+       struct sk_buff_head queue;
        struct aoedev *d;
        struct aoetgt *t, **tt, **te;
        struct aoeif *ifp;
        struct frame *f, *e;
-       struct sk_buff *sl;
        register long timeout;
        ulong flags, n;
 
        d = (struct aoedev *) vp;
-       sl = NULL;
 
        /* timeout is always ~150% of the moving average */
        timeout = d->rttavg;
@@ -589,7 +563,7 @@ rexmit_timer(ulong vp)
                }
        }
 
-       if (d->sendq_hd) {
+       if (!skb_queue_empty(&d->sendq)) {
                n = d->rttavg <<= 1;
                if (n > MAXTIMER)
                        d->rttavg = MAXTIMER;
@@ -600,15 +574,15 @@ rexmit_timer(ulong vp)
                aoecmd_work(d);
        }
 
-       sl = d->sendq_hd;
-       d->sendq_hd = d->sendq_tl = NULL;
+       __skb_queue_head_init(&queue);
+       skb_queue_splice_init(&d->sendq, &queue);
 
        d->timer.expires = jiffies + TIMERTICK;
        add_timer(&d->timer);
 
        spin_unlock_irqrestore(&d->lock, flags);
 
-       aoenet_xmit(sl);
+       aoenet_xmit(&queue);
 }
 
 /* enters with d->lock held */
@@ -772,12 +746,12 @@ diskstats(struct gendisk *disk, struct bio *bio, ulong duration, sector_t sector
 void
 aoecmd_ata_rsp(struct sk_buff *skb)
 {
+       struct sk_buff_head queue;
        struct aoedev *d;
        struct aoe_hdr *hin, *hout;
        struct aoe_atahdr *ahin, *ahout;
        struct frame *f;
        struct buf *buf;
-       struct sk_buff *sl;
        struct aoetgt *t;
        struct aoeif *ifp;
        register long n;
@@ -898,21 +872,21 @@ aoecmd_ata_rsp(struct sk_buff *skb)
 
        aoecmd_work(d);
 xmit:
-       sl = d->sendq_hd;
-       d->sendq_hd = d->sendq_tl = NULL;
+       __skb_queue_head_init(&queue);
+       skb_queue_splice_init(&d->sendq, &queue);
 
        spin_unlock_irqrestore(&d->lock, flags);
-       aoenet_xmit(sl);
+       aoenet_xmit(&queue);
 }
 
 void
 aoecmd_cfg(ushort aoemajor, unsigned char aoeminor)
 {
-       struct sk_buff *sl;
-
-       sl = aoecmd_cfg_pkts(aoemajor, aoeminor, NULL);
+       struct sk_buff_head queue;
 
-       aoenet_xmit(sl);
+       __skb_queue_head_init(&queue);
+       aoecmd_cfg_pkts(aoemajor, aoeminor, &queue);
+       aoenet_xmit(&queue);
 }
  
 struct sk_buff *
@@ -1081,7 +1055,12 @@ aoecmd_cfg_rsp(struct sk_buff *skb)
 
        spin_unlock_irqrestore(&d->lock, flags);
 
-       aoenet_xmit(sl);
+       if (sl) {
+               struct sk_buff_head queue;
+               __skb_queue_head_init(&queue);
+               __skb_queue_tail(&queue, sl);
+               aoenet_xmit(&queue);
+       }
 }
 
 void
index 6a8038d115b5948805e2f18a7b6d0a6b90f7e583..cc250577d405e6d061054b268ddc54b96ddd0cdc 100644 (file)
@@ -188,14 +188,12 @@ skbfree(struct sk_buff *skb)
 static void
 skbpoolfree(struct aoedev *d)
 {
-       struct sk_buff *skb;
+       struct sk_buff *skb, *tmp;
 
-       while ((skb = d->skbpool_hd)) {
-               d->skbpool_hd = skb->next;
-               skb->next = NULL;
+       skb_queue_walk_safe(&d->skbpool, skb, tmp)
                skbfree(skb);
-       }
-       d->skbpool_tl = NULL;
+
+       __skb_queue_head_init(&d->skbpool);
 }
 
 /* find it or malloc it */
@@ -217,6 +215,8 @@ aoedev_by_sysminor_m(ulong sysminor)
                goto out;
        INIT_WORK(&d->work, aoecmd_sleepwork);
        spin_lock_init(&d->lock);
+       skb_queue_head_init(&d->sendq);
+       skb_queue_head_init(&d->skbpool);
        init_timer(&d->timer);
        d->timer.data = (ulong) d;
        d->timer.function = dummy_timer;
index 7b15a5e9cec070a049af569fea2cb9ec51995244..7f83ad90e76fd9f4e971ec4d00826eea2e1cffe7 100644 (file)
@@ -7,6 +7,7 @@
 #include <linux/hdreg.h>
 #include <linux/blkdev.h>
 #include <linux/module.h>
+#include <linux/skbuff.h>
 #include "aoe.h"
 
 MODULE_LICENSE("GPL");
index 0c81ca7312878a05b1bc96cbc47d2722ee6b8c37..9157d64270cb041ba8b92bc462913439b12018e0 100644 (file)
@@ -95,13 +95,12 @@ mac_addr(char addr[6])
 }
 
 void
-aoenet_xmit(struct sk_buff *sl)
+aoenet_xmit(struct sk_buff_head *queue)
 {
-       struct sk_buff *skb;
+       struct sk_buff *skb, *tmp;
 
-       while ((skb = sl)) {
-               sl = sl->next;
-               skb->next = skb->prev = NULL;
+       skb_queue_walk_safe(queue, skb, tmp) {
+               __skb_unlink(skb, queue);
                dev_queue_xmit(skb);
        }
 }
index 4d37bb312ee3bdd02ed60f90f4d7b7650c9dc993..7938062c1cc7a13daf1306baa659c6cf477782be 100644 (file)
@@ -352,14 +352,14 @@ static int bcsp_flush(struct hci_uart *hu)
 /* Remove ack'ed packets */
 static void bcsp_pkt_cull(struct bcsp_struct *bcsp)
 {
+       struct sk_buff *skb, *tmp;
        unsigned long flags;
-       struct sk_buff *skb;
        int i, pkts_to_be_removed;
        u8 seqno;
 
        spin_lock_irqsave(&bcsp->unack.lock, flags);
 
-       pkts_to_be_removed = bcsp->unack.qlen;
+       pkts_to_be_removed = skb_queue_len(&bcsp->unack);
        seqno = bcsp->msgq_txseq;
 
        while (pkts_to_be_removed) {
@@ -373,19 +373,19 @@ static void bcsp_pkt_cull(struct bcsp_struct *bcsp)
                BT_ERR("Peer acked invalid packet");
 
        BT_DBG("Removing %u pkts out of %u, up to seqno %u",
-               pkts_to_be_removed, bcsp->unack.qlen, (seqno - 1) & 0x07);
+              pkts_to_be_removed, skb_queue_len(&bcsp->unack),
+              (seqno - 1) & 0x07);
 
-       for (i = 0, skb = ((struct sk_buff *) &bcsp->unack)->next; i < pkts_to_be_removed
-                       && skb != (struct sk_buff *) &bcsp->unack; i++) {
-               struct sk_buff *nskb;
+       i = 0;
+       skb_queue_walk_safe(&bcsp->unack, skb, tmp) {
+               if (i++ >= pkts_to_be_removed)
+                       break;
 
-               nskb = skb->next;
                __skb_unlink(skb, &bcsp->unack);
                kfree_skb(skb);
-               skb = nskb;
        }
 
-       if (bcsp->unack.qlen == 0)
+       if (skb_queue_empty(&bcsp->unack))
                del_timer(&bcsp->tbcsp);
 
        spin_unlock_irqrestore(&bcsp->unack.lock, flags);
index 1790cc8e431e255ac18c8d8984c99b02fbddde84..8e659914523f76990e1e736201044771531b02eb 100644 (file)
@@ -70,8 +70,8 @@ static inline void _urb_queue_head(struct _urb_queue *q, struct _urb *_urb)
 {
        unsigned long flags;
        spin_lock_irqsave(&q->lock, flags);
-       /* _urb_unlink needs to know which spinlock to use, thus mb(). */
-       _urb->queue = q; mb(); list_add(&_urb->list, &q->head);
+       /* _urb_unlink needs to know which spinlock to use, thus smp_mb(). */
+       _urb->queue = q; smp_mb(); list_add(&_urb->list, &q->head);
        spin_unlock_irqrestore(&q->lock, flags);
 }
 
@@ -79,8 +79,8 @@ static inline void _urb_queue_tail(struct _urb_queue *q, struct _urb *_urb)
 {
        unsigned long flags;
        spin_lock_irqsave(&q->lock, flags);
-       /* _urb_unlink needs to know which spinlock to use, thus mb(). */
-       _urb->queue = q; mb(); list_add_tail(&_urb->list, &q->head);
+       /* _urb_unlink needs to know which spinlock to use, thus smp_mb(). */
+       _urb->queue = q; smp_mb(); list_add_tail(&_urb->list, &q->head);
        spin_unlock_irqrestore(&q->lock, flags);
 }
 
@@ -89,7 +89,7 @@ static inline void _urb_unlink(struct _urb *_urb)
        struct _urb_queue *q;
        unsigned long flags;
 
-       mb();
+       smp_mb();
        q = _urb->queue;
        /* If q is NULL, it will die at easy-to-debug NULL pointer dereference.
           No need to BUG(). */
index 75726ea0fbbd1615705f68ab58bb914df386cf97..5360c4fd473915c8ad79bbd80de870b321c3f7f9 100644 (file)
@@ -828,15 +828,18 @@ static int old_capi_manufacturer(unsigned int cmd, void __user *data)
                        return -ESRCH;
                if (card->load_firmware == NULL) {
                        printk(KERN_DEBUG "kcapi: load: no load function\n");
+                       capi_ctr_put(card);
                        return -ESRCH;
                }
 
                if (ldef.t4file.len <= 0) {
                        printk(KERN_DEBUG "kcapi: load: invalid parameter: length of t4file is %d ?\n", ldef.t4file.len);
+                       capi_ctr_put(card);
                        return -EINVAL;
                }
                if (ldef.t4file.data == NULL) {
                        printk(KERN_DEBUG "kcapi: load: invalid parameter: dataptr is 0\n");
+                       capi_ctr_put(card);
                        return -EINVAL;
                }
 
@@ -849,6 +852,7 @@ static int old_capi_manufacturer(unsigned int cmd, void __user *data)
 
                if (card->cardstate != CARD_DETECTED) {
                        printk(KERN_INFO "kcapi: load: contr=%d not in detect state\n", ldef.contr);
+                       capi_ctr_put(card);
                        return -EBUSY;
                }
                card->cardstate = CARD_LOADING;
index fd2c9be6d8492a14076781408735f67c3e9cef47..5783d22a18fe0f4d5201b5bca21a28ae8be43944 100644 (file)
 #define D_FREG_MASK  0xF
 
 struct zt {
-       unsigned short z1;  /* Z1 pointer 16 Bit */
-       unsigned short z2;  /* Z2 pointer 16 Bit */
+       __le16 z1;  /* Z1 pointer 16 Bit */
+       __le16 z2;  /* Z2 pointer 16 Bit */
 };
 
 struct dfifo {
index 9cf5edbb1a9b119db51d1b60494b3767886184d8..cd8302af40ebace556b7dc5dc89b1465c0ac3dd3 100644 (file)
@@ -43,7 +43,7 @@ MODULE_LICENSE("GPL");
 module_param(debug, uint, 0);
 
 static LIST_HEAD(HFClist);
-DEFINE_RWLOCK(HFClock);
+static DEFINE_RWLOCK(HFClock);
 
 enum {
        HFC_CCD_2BD0,
@@ -88,7 +88,7 @@ struct hfcPCI_hw {
        unsigned char           bswapped;
        unsigned char           protocol;
        int                     nt_timer;
-       unsigned char           *pci_io; /* start of PCI IO memory */
+       unsigned char __iomem   *pci_io; /* start of PCI IO memory */
        dma_addr_t              dmahandle;
        void                    *fifos; /* FIFO memory */
        int                     last_bfifo_cnt[2];
@@ -153,7 +153,7 @@ release_io_hfcpci(struct hfc_pci *hc)
        pci_write_config_word(hc->pdev, PCI_COMMAND, 0);
        del_timer(&hc->hw.timer);
        pci_free_consistent(hc->pdev, 0x8000, hc->hw.fifos, hc->hw.dmahandle);
-       iounmap((void *)hc->hw.pci_io);
+       iounmap(hc->hw.pci_io);
 }
 
 /*
@@ -366,8 +366,7 @@ static void hfcpci_clear_fifo_tx(struct hfc_pci *hc, int fifo)
        bzt->f2 = MAX_B_FRAMES;
        bzt->f1 = bzt->f2;      /* init F pointers to remain constant */
        bzt->za[MAX_B_FRAMES].z1 = cpu_to_le16(B_FIFO_SIZE + B_SUB_VAL - 1);
-       bzt->za[MAX_B_FRAMES].z2 = cpu_to_le16(
-           le16_to_cpu(bzt->za[MAX_B_FRAMES].z1 - 1));
+       bzt->za[MAX_B_FRAMES].z2 = cpu_to_le16(B_FIFO_SIZE + B_SUB_VAL - 2);
        if (fifo_state)
                hc->hw.fifo_en |= fifo_state;
        Write_hfc(hc, HFCPCI_FIFO_EN, hc->hw.fifo_en);
@@ -482,7 +481,7 @@ receive_dmsg(struct hfc_pci *hc)
                        df->f2 = ((df->f2 + 1) & MAX_D_FRAMES) |
                            (MAX_D_FRAMES + 1); /* next buffer */
                        df->za[df->f2 & D_FREG_MASK].z2 =
-                           cpu_to_le16((zp->z2 + rcnt) & (D_FIFO_SIZE - 1));
+                           cpu_to_le16((le16_to_cpu(zp->z2) + rcnt) & (D_FIFO_SIZE - 1));
                } else {
                        dch->rx_skb = mI_alloc_skb(rcnt - 3, GFP_ATOMIC);
                        if (!dch->rx_skb) {
@@ -523,10 +522,10 @@ receive_dmsg(struct hfc_pci *hc)
 /*
  * check for transparent receive data and read max one threshold size if avail
  */
-int
+static int
 hfcpci_empty_fifo_trans(struct bchannel *bch, struct bzfifo *bz, u_char *bdata)
 {
-       unsigned short  *z1r, *z2r;
+        __le16 *z1r, *z2r;
        int             new_z2, fcnt, maxlen;
        u_char          *ptr, *ptr1;
 
@@ -576,7 +575,7 @@ hfcpci_empty_fifo_trans(struct bchannel *bch, struct bzfifo *bz, u_char *bdata)
 /*
  * B-channel main receive routine
  */
-void
+static void
 main_rec_hfcpci(struct bchannel *bch)
 {
        struct hfc_pci  *hc = bch->hw;
@@ -724,7 +723,7 @@ hfcpci_fill_fifo(struct bchannel *bch)
        struct bzfifo   *bz;
        u_char          *bdata;
        u_char          new_f1, *src, *dst;
-       unsigned short  *z1t, *z2t;
+       __le16 *z1t, *z2t;
 
        if ((bch->debug & DEBUG_HW_BCHANNEL) && !(bch->debug & DEBUG_HW_BFIFO))
                printk(KERN_DEBUG "%s\n", __func__);
@@ -1679,7 +1678,7 @@ hfcpci_l2l1B(struct mISDNchannel *ch, struct sk_buff *skb)
  * called for card init message
  */
 
-void
+static void
 inithfcpci(struct hfc_pci *hc)
 {
        printk(KERN_DEBUG "inithfcpci: entered\n");
@@ -1966,7 +1965,7 @@ setup_hw(struct hfc_pci *hc)
                printk(KERN_WARNING "HFC-PCI: No IRQ for PCI card found\n");
                return 1;
        }
-       hc->hw.pci_io = (char *)(ulong)hc->pdev->resource[1].start;
+       hc->hw.pci_io = (char __iomem *)(unsigned long)hc->pdev->resource[1].start;
 
        if (!hc->hw.pci_io) {
                printk(KERN_WARNING "HFC-PCI: No IO-Mem for PCI card found\n");
index 127cfdad68e7bb8b4ec727acb7e8cab9462e5e8e..77c280ef2eb64ddbb81cff6b78c40bcf7e302b3e 100644 (file)
@@ -1533,8 +1533,10 @@ static int isdn_ppp_mp_bundle_array_init(void)
        int sz = ISDN_MAX_CHANNELS*sizeof(ippp_bundle);
        if( (isdn_ppp_bundle_arr = kzalloc(sz, GFP_KERNEL)) == NULL )
                return -ENOMEM;
-       for( i = 0; i < ISDN_MAX_CHANNELS; i++ )
+       for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
                spin_lock_init(&isdn_ppp_bundle_arr[i].lock);
+               skb_queue_head_init(&isdn_ppp_bundle_arr[i].frags);
+       }
        return 0;
 }
 
@@ -1567,7 +1569,7 @@ static int isdn_ppp_mp_init( isdn_net_local * lp, ippp_bundle * add_to )
                if ((lp->netdev->pb = isdn_ppp_mp_bundle_alloc()) == NULL)
                        return -ENOMEM;
                lp->next = lp->last = lp;       /* nobody else in a queue */
-               lp->netdev->pb->frags = NULL;
+               skb_queue_head_init(&lp->netdev->pb->frags);
                lp->netdev->pb->frames = 0;
                lp->netdev->pb->seq = UINT_MAX;
        }
@@ -1579,28 +1581,29 @@ static int isdn_ppp_mp_init( isdn_net_local * lp, ippp_bundle * add_to )
 
 static u32 isdn_ppp_mp_get_seq( int short_seq, 
                                        struct sk_buff * skb, u32 last_seq );
-static struct sk_buff * isdn_ppp_mp_discard( ippp_bundle * mp,
-                       struct sk_buff * from, struct sk_buff * to );
-static void isdn_ppp_mp_reassembly( isdn_net_dev * net_dev, isdn_net_local * lp,
-                               struct sk_buff * from, struct sk_buff * to );
-static void isdn_ppp_mp_free_skb( ippp_bundle * mp, struct sk_buff * skb );
+static void isdn_ppp_mp_discard(ippp_bundle *mp, struct sk_buff *from,
+                               struct sk_buff *to);
+static void isdn_ppp_mp_reassembly(isdn_net_dev *net_dev, isdn_net_local *lp,
+                                  struct sk_buff *from, struct sk_buff *to,
+                                  u32 lastseq);
+static void isdn_ppp_mp_free_skb(ippp_bundle *mp, struct sk_buff *skb);
 static void isdn_ppp_mp_print_recv_pkt( int slot, struct sk_buff * skb );
 
 static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp, 
-                                                       struct sk_buff *skb)
+                               struct sk_buff *skb)
 {
-       struct ippp_struct *is;
-       isdn_net_local * lpq;
-       ippp_bundle * mp;
-       isdn_mppp_stats * stats;
-       struct sk_buff * newfrag, * frag, * start, *nextf;
+       struct sk_buff *newfrag, *frag, *start, *nextf;
        u32 newseq, minseq, thisseq;
+       isdn_mppp_stats *stats;
+       struct ippp_struct *is;
        unsigned long flags;
+       isdn_net_local *lpq;
+       ippp_bundle *mp;
        int slot;
 
        spin_lock_irqsave(&net_dev->pb->lock, flags);
-       mp = net_dev->pb;
-        stats = &mp->stats;
+       mp = net_dev->pb;
+       stats = &mp->stats;
        slot = lp->ppp_slot;
        if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
                printk(KERN_ERR "%s: lp->ppp_slot(%d)\n",
@@ -1611,20 +1614,19 @@ static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp,
                return;
        }
        is = ippp_table[slot];
-       if( ++mp->frames > stats->max_queue_len )
+       if (++mp->frames > stats->max_queue_len)
                stats->max_queue_len = mp->frames;
-       
+
        if (is->debug & 0x8)
                isdn_ppp_mp_print_recv_pkt(lp->ppp_slot, skb);
 
-       newseq = isdn_ppp_mp_get_seq(is->mpppcfg & SC_IN_SHORT_SEQ, 
-                                               skb, is->last_link_seqno);
-
+       newseq = isdn_ppp_mp_get_seq(is->mpppcfg & SC_IN_SHORT_SEQ,
+                                    skb, is->last_link_seqno);
 
        /* if this packet seq # is less than last already processed one,
         * toss it right away, but check for sequence start case first 
         */
-       if( mp->seq > MP_LONGSEQ_MAX && (newseq & MP_LONGSEQ_MAXBIT) ) {
+       if (mp->seq > MP_LONGSEQ_MAX && (newseq & MP_LONGSEQ_MAXBIT)) {
                mp->seq = newseq;       /* the first packet: required for
                                         * rfc1990 non-compliant clients --
                                         * prevents constant packet toss */
@@ -1634,7 +1636,7 @@ static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp,
                spin_unlock_irqrestore(&mp->lock, flags);
                return;
        }
-       
+
        /* find the minimum received sequence number over all links */
        is->last_link_seqno = minseq = newseq;
        for (lpq = net_dev->queue;;) {
@@ -1655,22 +1657,31 @@ static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp,
                                         * packets */
        newfrag = skb;
 
-       /* if this new fragment is before the first one, then enqueue it now. */
-       if ((frag = mp->frags) == NULL || MP_LT(newseq, MP_SEQ(frag))) {
-               newfrag->next = frag;
-               mp->frags = frag = newfrag;
-               newfrag = NULL;
-       }
+       /* Insert new fragment into the proper sequence slot.  */
+       skb_queue_walk(&mp->frags, frag) {
+               if (MP_SEQ(frag) == newseq) {
+                       isdn_ppp_mp_free_skb(mp, newfrag);
+                       newfrag = NULL;
+                       break;
+               }
+               if (MP_LT(newseq, MP_SEQ(frag))) {
+                       __skb_queue_before(&mp->frags, frag, newfrag);
+                       newfrag = NULL;
+                       break;
+               }
+       }
+       if (newfrag)
+               __skb_queue_tail(&mp->frags, newfrag);
 
-       start = MP_FLAGS(frag) & MP_BEGIN_FRAG &&
-                               MP_SEQ(frag) == mp->seq ? frag : NULL;
+       frag = skb_peek(&mp->frags);
+       start = ((MP_FLAGS(frag) & MP_BEGIN_FRAG) &&
+                (MP_SEQ(frag) == mp->seq)) ? frag : NULL;
+       if (!start)
+               goto check_overflow;
 
-       /* 
-        * main fragment traversing loop
+       /* main fragment traversing loop
         *
         * try to accomplish several tasks:
-        * - insert new fragment into the proper sequence slot (once that's done
-        *   newfrag will be set to NULL)
         * - reassemble any complete fragment sequence (non-null 'start'
         *   indicates there is a continguous sequence present)
         * - discard any incomplete sequences that are below minseq -- due
@@ -1679,71 +1690,46 @@ static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp,
         *   come to complete such sequence and it should be discarded
         *
         * loop completes when we accomplished the following tasks:
-        * - new fragment is inserted in the proper sequence ('newfrag' is 
-        *   set to NULL)
         * - we hit a gap in the sequence, so no reassembly/processing is 
         *   possible ('start' would be set to NULL)
         *
         * algorithm for this code is derived from code in the book
         * 'PPP Design And Debugging' by James Carlson (Addison-Wesley)
         */
-       while (start != NULL || newfrag != NULL) {
-
-               thisseq = MP_SEQ(frag);
-               nextf = frag->next;
-
-               /* drop any duplicate fragments */
-               if (newfrag != NULL && thisseq == newseq) {
-                       isdn_ppp_mp_free_skb(mp, newfrag);
-                       newfrag = NULL;
-               }
-
-               /* insert new fragment before next element if possible. */
-               if (newfrag != NULL && (nextf == NULL || 
-                                               MP_LT(newseq, MP_SEQ(nextf)))) {
-                       newfrag->next = nextf;
-                       frag->next = nextf = newfrag;
-                       newfrag = NULL;
-               }
-
-               if (start != NULL) {
-                       /* check for misplaced start */
-                       if (start != frag && (MP_FLAGS(frag) & MP_BEGIN_FRAG)) {
-                               printk(KERN_WARNING"isdn_mppp(seq %d): new "
-                                     "BEGIN flag with no prior END", thisseq);
-                               stats->seqerrs++;
-                               stats->frame_drops++;
-                               start = isdn_ppp_mp_discard(mp, start,frag);
-                               nextf = frag->next;
-                       }
-               } else if (MP_LE(thisseq, minseq)) {            
-                       if (MP_FLAGS(frag) & MP_BEGIN_FRAG)
+       skb_queue_walk_safe(&mp->frags, frag, nextf) {
+               thisseq = MP_SEQ(frag);
+
+               /* check for misplaced start */
+               if (start != frag && (MP_FLAGS(frag) & MP_BEGIN_FRAG)) {
+                       printk(KERN_WARNING"isdn_mppp(seq %d): new "
+                              "BEGIN flag with no prior END", thisseq);
+                       stats->seqerrs++;
+                       stats->frame_drops++;
+                       isdn_ppp_mp_discard(mp, start, frag);
+                       start = frag;
+               } else if (MP_LE(thisseq, minseq)) {            
+                       if (MP_FLAGS(frag) & MP_BEGIN_FRAG)
                                start = frag;
-                       else {
+                       else {
                                if (MP_FLAGS(frag) & MP_END_FRAG)
-                                       stats->frame_drops++;
-                               if( mp->frags == frag )
-                                       mp->frags = nextf;      
+                                       stats->frame_drops++;
+        &n