Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
David S. Miller [Thu, 21 Jul 2011 20:38:42 +0000 (13:38 -0700)]
Conflicts:
net/bluetooth/l2cap_core.c

1246 files changed:
Documentation/DocBook/80211.tmpl
Documentation/networking/ifenslave.c
Documentation/networking/ip-sysctl.txt
Documentation/networking/netdev-features.txt [new file with mode: 0644]
Documentation/networking/nfc.txt [new file with mode: 0644]
MAINTAINERS
arch/arm/mach-davinci/board-mityomapl138.c
arch/arm/mach-davinci/dm646x.c
arch/arm/mach-davinci/pm.c
arch/arm/mach-imx/dma-v1.c
arch/arm/mach-imx/mach-mx31_3ds.c
arch/arm/mach-iop13xx/setup.c
arch/arm/mach-mxs/devices/platform-auart.c
arch/arm/mach-mxs/devices/platform-dma.c
arch/arm/mach-mxs/devices/platform-fec.c
arch/arm/plat-mxc/devices/platform-fec.c
arch/arm/plat-mxc/devices/platform-fsl-usb2-udc.c
arch/arm/plat-mxc/devices/platform-imx-fb.c
arch/arm/plat-mxc/devices/platform-ipu-core.c
arch/arm/plat-mxc/devices/platform-mxc-ehci.c
arch/arm/plat-mxc/devices/platform-mxc-mmc.c
arch/arm/plat-nomadik/include/plat/ste_dma40.h
arch/m68k/emu/nfeth.c
arch/powerpc/Kconfig
arch/powerpc/Makefile
arch/powerpc/include/asm/ppc-opcode.h
arch/powerpc/net/Makefile [new file with mode: 0644]
arch/powerpc/net/bpf_jit.h [new file with mode: 0644]
arch/powerpc/net/bpf_jit_64.S [new file with mode: 0644]
arch/powerpc/net/bpf_jit_comp.c [new file with mode: 0644]
arch/x86/kernel/tboot.c
crypto/async_tx/raid6test.c
drivers/Kconfig
drivers/Makefile
drivers/atm/ambassador.c
drivers/atm/ambassador.h
drivers/atm/eni.h
drivers/atm/firestream.c
drivers/atm/horizon.c
drivers/atm/idt77252.c
drivers/atm/iphase.c
drivers/atm/lanai.c
drivers/atm/zatm.c
drivers/bcma/Kconfig
drivers/bcma/Makefile
drivers/bcma/bcma_private.h
drivers/bcma/core.c
drivers/bcma/driver_chipcommon_pmu.c
drivers/bcma/driver_pci.c
drivers/bcma/driver_pci_host.c [new file with mode: 0644]
drivers/bcma/host_pci.c
drivers/bcma/main.c
drivers/bcma/sprom.c [new file with mode: 0644]
drivers/bluetooth/ath3k.c
drivers/bluetooth/btusb.c
drivers/dma/coh901318.c
drivers/dma/dmaengine.c
drivers/dma/dmatest.c
drivers/dma/ipu/ipu_idmac.c
drivers/dma/ste_dma40.c
drivers/firewire/net.c
drivers/ieee802154/Makefile
drivers/ieee802154/fakehard.c
drivers/infiniband/core/addr.c
drivers/infiniband/core/netlink.c
drivers/infiniband/hw/amso1100/c2.c
drivers/infiniband/hw/cxgb3/iwch_cm.c
drivers/infiniband/hw/cxgb4/cm.c
drivers/infiniband/hw/nes/nes_cm.c
drivers/infiniband/ulp/ipoib/ipoib_main.c
drivers/infiniband/ulp/ipoib/ipoib_multicast.c
drivers/infiniband/ulp/iser/iscsi_iser.h
drivers/isdn/hardware/mISDN/avmfritz.c
drivers/isdn/hardware/mISDN/hfcmulti.c
drivers/isdn/hardware/mISDN/hfcpci.c
drivers/isdn/hardware/mISDN/mISDNinfineon.c
drivers/isdn/hardware/mISDN/mISDNipac.c
drivers/isdn/hardware/mISDN/netjet.c
drivers/isdn/hardware/mISDN/speedfax.c
drivers/isdn/hardware/mISDN/w6692.c
drivers/isdn/hisax/hisax.h
drivers/isdn/hisax/hisax_fcpcipnp.c
drivers/isdn/i4l/isdn_net.c
drivers/media/dvb/b2c2/flexcop-common.h
drivers/media/dvb/dm1105/dm1105.c
drivers/media/dvb/mantis/mantis_ca.c
drivers/media/dvb/mantis/mantis_common.h
drivers/media/dvb/mantis/mantis_evm.c
drivers/media/dvb/mantis/mantis_hif.c
drivers/media/dvb/mantis/mantis_ioc.c
drivers/media/dvb/mantis/mantis_pcmcia.c
drivers/media/dvb/mantis/mantis_uart.c
drivers/media/dvb/mantis/mantis_vp1034.c
drivers/media/dvb/pluto2/pluto2.c
drivers/mmc/host/tmio_mmc_dma.c
drivers/mtd/nand/atmel_nand.c
drivers/net/3c503.c
drivers/net/7990.c
drivers/net/8139cp.c
drivers/net/8139too.c
drivers/net/8390.h
drivers/net/Kconfig
drivers/net/Makefile
drivers/net/a2065.c
drivers/net/ac3200.c
drivers/net/acenic.h
drivers/net/amd8111e.c
drivers/net/apne.c
drivers/net/appletalk/ltpc.c
drivers/net/arcnet/arc-rimi.c
drivers/net/arcnet/com20020-isa.c
drivers/net/arcnet/com20020-pci.c
drivers/net/arcnet/com20020.c
drivers/net/arcnet/com90io.c
drivers/net/arcnet/com90xx.c
drivers/net/ariadne.c
drivers/net/arm/am79c961a.c
drivers/net/arm/at91_ether.c
drivers/net/arm/ep93xx_eth.c
drivers/net/arm/ks8695net.c
drivers/net/atl1c/atl1c.h
drivers/net/atl1e/atl1e.h
drivers/net/atl1e/atl1e_main.c
drivers/net/atlx/atl2.c
drivers/net/b44.c
drivers/net/bcm63xx_enet.c
drivers/net/benet/be.h
drivers/net/benet/be_cmds.c
drivers/net/benet/be_cmds.h
drivers/net/benet/be_ethtool.c
drivers/net/benet/be_main.c
drivers/net/bmac.c
drivers/net/bna/bfa_cee.c
drivers/net/bna/bnad.c
drivers/net/bna/cna.h
drivers/net/bnx2.c
drivers/net/bnx2.h
drivers/net/bnx2x/Makefile
drivers/net/bnx2x/bnx2x.h
drivers/net/bnx2x/bnx2x_cmn.c
drivers/net/bnx2x/bnx2x_cmn.h
drivers/net/bnx2x/bnx2x_dcb.c
drivers/net/bnx2x/bnx2x_dcb.h
drivers/net/bnx2x/bnx2x_dump.h
drivers/net/bnx2x/bnx2x_ethtool.c
drivers/net/bnx2x/bnx2x_fw_defs.h
drivers/net/bnx2x/bnx2x_hsi.h
drivers/net/bnx2x/bnx2x_init.h
drivers/net/bnx2x/bnx2x_init_ops.h
drivers/net/bnx2x/bnx2x_link.c
drivers/net/bnx2x/bnx2x_link.h
drivers/net/bnx2x/bnx2x_main.c
drivers/net/bnx2x/bnx2x_reg.h
drivers/net/bnx2x/bnx2x_sp.c [new file with mode: 0644]
drivers/net/bnx2x/bnx2x_sp.h [new file with mode: 0644]
drivers/net/bnx2x/bnx2x_stats.c
drivers/net/bnx2x/bnx2x_stats.h
drivers/net/bonding/bond_3ad.c
drivers/net/bonding/bond_3ad.h
drivers/net/bonding/bond_main.c
drivers/net/bonding/bond_procfs.c
drivers/net/bonding/bond_sysfs.c
drivers/net/bonding/bonding.h
drivers/net/caif/Kconfig
drivers/net/caif/Makefile
drivers/net/caif/caif_hsi.c [new file with mode: 0644]
drivers/net/caif/caif_serial.c
drivers/net/caif/caif_shm_u5500.c
drivers/net/caif/caif_shmcore.c
drivers/net/caif/caif_spi.c
drivers/net/caif/caif_spi_slave.c
drivers/net/can/Kconfig
drivers/net/can/at91_can.c
drivers/net/can/bfin_can.c
drivers/net/can/c_can/c_can.c
drivers/net/can/c_can/c_can_platform.c
drivers/net/can/janz-ican3.c
drivers/net/can/sja1000/sja1000.h
drivers/net/can/sja1000/sja1000_of_platform.c
drivers/net/can/slcan.c
drivers/net/can/softing/softing_fw.c
drivers/net/can/softing/softing_main.c
drivers/net/cassini.c
drivers/net/cnic.c
drivers/net/cnic.h
drivers/net/cnic_defs.h
drivers/net/cnic_if.h
drivers/net/cpmac.c
drivers/net/cxgb3/common.h
drivers/net/cxgb3/cxgb3_offload.c
drivers/net/cxgb3/t3_hw.c
drivers/net/cxgb4/cxgb4_main.c
drivers/net/cxgb4vf/adapter.h
drivers/net/cxgb4vf/cxgb4vf_main.c
drivers/net/cxgb4vf/t4vf_hw.c
drivers/net/davinci_cpdma.c
drivers/net/davinci_emac.c
drivers/net/declance.c
drivers/net/depca.c
drivers/net/dl2k.c
drivers/net/dm9000.c
drivers/net/dnet.c
drivers/net/e100.c
drivers/net/e1000/e1000_ethtool.c
drivers/net/e1000/e1000_hw.c
drivers/net/e1000/e1000_main.c
drivers/net/e1000e/82571.c
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/phy.c
drivers/net/e2100.c
drivers/net/ehea/ehea_qmr.c
drivers/net/enic/enic.h
drivers/net/enic/enic_dev.c
drivers/net/enic/enic_dev.h
drivers/net/enic/enic_main.c
drivers/net/enic/enic_res.c
drivers/net/enic/vnic_cq.c
drivers/net/enic/vnic_cq.h
drivers/net/enic/vnic_dev.c
drivers/net/enic/vnic_dev.h
drivers/net/enic/vnic_devcmd.h
drivers/net/enic/vnic_enet.h
drivers/net/enic/vnic_intr.c
drivers/net/enic/vnic_intr.h
drivers/net/epic100.c
drivers/net/es3210.c
drivers/net/ethoc.c
drivers/net/ewrk3.c
drivers/net/fealnx.c
drivers/net/fec.c
drivers/net/fec_mpc52xx.c
drivers/net/fs_enet/fs_enet-main.c
drivers/net/ftgmac100.c [new file with mode: 0644]
drivers/net/ftgmac100.h [new file with mode: 0644]
drivers/net/gianfar.c
drivers/net/gianfar.h
drivers/net/gianfar_ethtool.c
drivers/net/greth.c
drivers/net/hamachi.c
drivers/net/hamradio/baycom_ser_fdx.c
drivers/net/hamradio/baycom_ser_hdx.c
drivers/net/hp-plus.c
drivers/net/hp.c
drivers/net/hp100.c
drivers/net/ibmveth.c
drivers/net/ifb.c
drivers/net/igb/Makefile
drivers/net/igb/e1000_82575.c
drivers/net/igb/e1000_82575.h
drivers/net/igb/e1000_defines.h
drivers/net/igb/e1000_hw.h
drivers/net/igb/e1000_mac.c
drivers/net/igb/e1000_mac.h
drivers/net/igb/e1000_mbx.c
drivers/net/igb/e1000_mbx.h
drivers/net/igb/e1000_nvm.c
drivers/net/igb/e1000_nvm.h
drivers/net/igb/e1000_phy.c
drivers/net/igb/e1000_phy.h
drivers/net/igb/e1000_regs.h
drivers/net/igb/igb.h
drivers/net/igb/igb_ethtool.c
drivers/net/igb/igb_main.c
drivers/net/igbvf/netdev.c
drivers/net/ioc3-eth.c
drivers/net/ipg.c
drivers/net/irda/ali-ircc.c
drivers/net/irda/donauboe.c
drivers/net/irda/nsc-ircc.c
drivers/net/irda/pxaficp_ir.c
drivers/net/irda/sir_dev.c
drivers/net/irda/smsc-ircc2.c
drivers/net/irda/via-ircc.c
drivers/net/irda/via-ircc.h
drivers/net/irda/vlsi_ir.c
drivers/net/irda/w83977af_ir.c
drivers/net/iseries_veth.c
drivers/net/ixgbe/ixgbe.h
drivers/net/ixgbe/ixgbe_82598.c
drivers/net/ixgbe/ixgbe_82599.c
drivers/net/ixgbe/ixgbe_common.c
drivers/net/ixgbe/ixgbe_common.h
drivers/net/ixgbe/ixgbe_dcb.c
drivers/net/ixgbe/ixgbe_dcb.h
drivers/net/ixgbe/ixgbe_dcb_82598.c
drivers/net/ixgbe/ixgbe_dcb_82598.h
drivers/net/ixgbe/ixgbe_dcb_82599.c
drivers/net/ixgbe/ixgbe_dcb_82599.h
drivers/net/ixgbe/ixgbe_dcb_nl.c
drivers/net/ixgbe/ixgbe_ethtool.c
drivers/net/ixgbe/ixgbe_fcoe.c
drivers/net/ixgbe/ixgbe_fcoe.h
drivers/net/ixgbe/ixgbe_main.c
drivers/net/ixgbe/ixgbe_sriov.c
drivers/net/ixgbe/ixgbe_type.h
drivers/net/ixgbe/ixgbe_x540.c
drivers/net/ixgbevf/ixgbevf.h
drivers/net/ixgbevf/ixgbevf_main.c
drivers/net/ixp2000/ixpdev.c
drivers/net/jme.c
drivers/net/jme.h
drivers/net/korina.c
drivers/net/ks8842.c
drivers/net/ks8851.c
drivers/net/ks8851_mll.c
drivers/net/ksz884x.c
drivers/net/lib8390.c
drivers/net/ll_temac_main.c
drivers/net/lne390.c
drivers/net/macb.c
drivers/net/mace.c
drivers/net/macmace.c
drivers/net/macvlan.c
drivers/net/macvtap.c
drivers/net/mipsnet.c
drivers/net/mlx4/en_rx.c
drivers/net/mlx4/en_tx.c
drivers/net/mlx4/main.c
drivers/net/mlx4/reset.c
drivers/net/mv643xx_eth.c
drivers/net/myri10ge/myri10ge.c
drivers/net/myri10ge/myri10ge_mcp_gen_header.h
drivers/net/myri_sbus.c [deleted file]
drivers/net/myri_sbus.h [deleted file]
drivers/net/netx-eth.c
drivers/net/netxen/netxen_nic_ctx.c
drivers/net/netxen/netxen_nic_hw.c
drivers/net/netxen/netxen_nic_init.c
drivers/net/netxen/netxen_nic_main.c
drivers/net/niu.c
drivers/net/ns83820.c
drivers/net/octeon/octeon_mgmt.c
drivers/net/pcnet32.c
drivers/net/phy/icplus.c
drivers/net/plip.c
drivers/net/ppp_async.c
drivers/net/ppp_synctty.c
drivers/net/pptp.c
drivers/net/ps3_gelic_net.c
drivers/net/ps3_gelic_net.h
drivers/net/pxa168_eth.c
drivers/net/qla3xxx.c
drivers/net/qlcnic/qlcnic.h
drivers/net/qlcnic/qlcnic_ctx.c
drivers/net/qlcnic/qlcnic_ethtool.c
drivers/net/qlcnic/qlcnic_hw.c
drivers/net/qlcnic/qlcnic_init.c
drivers/net/qlcnic/qlcnic_main.c
drivers/net/qlge/qlge.h
drivers/net/qlge/qlge_ethtool.c
drivers/net/qlge/qlge_main.c
drivers/net/r6040.c
drivers/net/r8169.c
drivers/net/rionet.c
drivers/net/s2io.c
drivers/net/sc92031.c
drivers/net/sfc/Kconfig
drivers/net/sfc/efx.c
drivers/net/sfc/enum.h
drivers/net/sfc/ethtool.c
drivers/net/sfc/falcon.c
drivers/net/sfc/filter.c
drivers/net/sfc/net_driver.h
drivers/net/sfc/nic.c
drivers/net/sfc/siena.c
drivers/net/sgiseeq.c
drivers/net/sh_eth.c
drivers/net/sis190.c
drivers/net/sis900.c
drivers/net/skge.c
drivers/net/skge.h
drivers/net/sky2.c
drivers/net/sky2.h
drivers/net/slhc.c
drivers/net/slip.c
drivers/net/slip.h
drivers/net/smc-mca.c
drivers/net/smc-ultra.c
drivers/net/smc911x.c
drivers/net/smc9194.c
drivers/net/smc91x.c
drivers/net/smsc911x.c
drivers/net/smsc9420.c
drivers/net/spider_net.c
drivers/net/starfire.c
drivers/net/stmmac/dwmac1000_core.c
drivers/net/stmmac/dwmac1000_dma.c
drivers/net/stmmac/dwmac100_core.c
drivers/net/stmmac/dwmac100_dma.c
drivers/net/stmmac/stmmac_ethtool.c
drivers/net/stmmac/stmmac_main.c
drivers/net/stmmac/stmmac_mdio.c
drivers/net/sunbmac.c
drivers/net/sungem.c
drivers/net/sungem.h
drivers/net/sunhme.c
drivers/net/sunlance.c
drivers/net/sunqe.c
drivers/net/tg3.c
drivers/net/tg3.h
drivers/net/tlan.c
drivers/net/tokenring/3c359.c
drivers/net/tokenring/ibmtr.c
drivers/net/tokenring/madgemc.c
drivers/net/tsi108_eth.c
drivers/net/tulip/de2104x.c
drivers/net/tulip/de4x5.c
drivers/net/tulip/pnic.c
drivers/net/tulip/tulip_core.c
drivers/net/tun.c
drivers/net/typhoon.c
drivers/net/ucc_geth.c
drivers/net/usb/cdc-phonet.c
drivers/net/usb/cdc_ncm.c
drivers/net/usb/ipheth.c
drivers/net/usb/kalmia.c
drivers/net/veth.c
drivers/net/via-velocity.c
drivers/net/virtio_net.c
drivers/net/vmxnet3/vmxnet3_drv.c
drivers/net/vmxnet3/vmxnet3_ethtool.c
drivers/net/vmxnet3/vmxnet3_int.h
drivers/net/vxge/vxge-config.c
drivers/net/vxge/vxge-config.h
drivers/net/vxge/vxge-main.c
drivers/net/vxge/vxge-main.h
drivers/net/vxge/vxge-traffic.c
drivers/net/wan/c101.c
drivers/net/wan/cosa.c
drivers/net/wan/cycx_drv.c
drivers/net/wan/cycx_main.c
drivers/net/wan/cycx_x25.c
drivers/net/wan/dlci.c
drivers/net/wan/dscc4.c
drivers/net/wan/farsync.c
drivers/net/wan/hd64570.c
drivers/net/wan/hd64572.c
drivers/net/wan/hdlc.c
drivers/net/wan/hdlc_cisco.c
drivers/net/wan/hdlc_fr.c
drivers/net/wan/hdlc_ppp.c
drivers/net/wan/hdlc_x25.c
drivers/net/wan/hostess_sv11.c
drivers/net/wan/ixp4xx_hss.c
drivers/net/wan/lapbether.c
drivers/net/wan/n2.c
drivers/net/wan/pc300_drv.c
drivers/net/wan/pc300_tty.c
drivers/net/wan/pc300too.c
drivers/net/wan/pci200syn.c
drivers/net/wan/sbni.c
drivers/net/wan/sdla.c
drivers/net/wan/sealevel.c
drivers/net/wan/wanxl.c
drivers/net/wan/x25_asy.c
drivers/net/wan/z85230.c
drivers/net/wireless/adm8211.c
drivers/net/wireless/ath/ath.h
drivers/net/wireless/ath/ath5k/ahb.c
drivers/net/wireless/ath/ath5k/ani.c
drivers/net/wireless/ath/ath5k/ath5k.h
drivers/net/wireless/ath/ath5k/attach.c
drivers/net/wireless/ath/ath5k/base.c
drivers/net/wireless/ath/ath5k/base.h
drivers/net/wireless/ath/ath5k/caps.c
drivers/net/wireless/ath/ath5k/debug.c
drivers/net/wireless/ath/ath5k/desc.h
drivers/net/wireless/ath/ath5k/dma.c
drivers/net/wireless/ath/ath5k/eeprom.c
drivers/net/wireless/ath/ath5k/eeprom.h
drivers/net/wireless/ath/ath5k/initvals.c
drivers/net/wireless/ath/ath5k/led.c
drivers/net/wireless/ath/ath5k/mac80211-ops.c
drivers/net/wireless/ath/ath5k/pci.c
drivers/net/wireless/ath/ath5k/pcu.c
drivers/net/wireless/ath/ath5k/phy.c
drivers/net/wireless/ath/ath5k/reg.h
drivers/net/wireless/ath/ath5k/reset.c
drivers/net/wireless/ath/ath5k/rfbuffer.h
drivers/net/wireless/ath/ath5k/rfgain.h
drivers/net/wireless/ath/ath5k/sysfs.c
drivers/net/wireless/ath/ath5k/trace.h
drivers/net/wireless/ath/ath9k/ahb.c
drivers/net/wireless/ath/ath9k/ar5008_phy.c
drivers/net/wireless/ath/ath9k/ar9002_hw.c
drivers/net/wireless/ath/ath9k/ar9002_mac.c
drivers/net/wireless/ath/ath9k/ar9002_phy.c
drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
drivers/net/wireless/ath/ath9k/ar9003_hw.c
drivers/net/wireless/ath/ath9k/ar9003_mac.c
drivers/net/wireless/ath/ath9k/ar9003_paprd.c
drivers/net/wireless/ath/ath9k/ar9003_phy.c
drivers/net/wireless/ath/ath9k/ar9003_phy.h
drivers/net/wireless/ath/ath9k/ar9330_1p1_initvals.h [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/ar9330_1p2_initvals.h [new file with mode: 0644]
drivers/net/wireless/ath/ath9k/ath9k.h
drivers/net/wireless/ath/ath9k/beacon.c
drivers/net/wireless/ath/ath9k/debug.c
drivers/net/wireless/ath/ath9k/debug.h
drivers/net/wireless/ath/ath9k/hif_usb.c
drivers/net/wireless/ath/ath9k/htc_drv_beacon.c
drivers/net/wireless/ath/ath9k/htc_drv_init.c
drivers/net/wireless/ath/ath9k/htc_drv_main.c
drivers/net/wireless/ath/ath9k/hw-ops.h
drivers/net/wireless/ath/ath9k/hw.c
drivers/net/wireless/ath/ath9k/hw.h
drivers/net/wireless/ath/ath9k/init.c
drivers/net/wireless/ath/ath9k/mac.c
drivers/net/wireless/ath/ath9k/main.c
drivers/net/wireless/ath/ath9k/rc.c
drivers/net/wireless/ath/ath9k/recv.c
drivers/net/wireless/ath/ath9k/reg.h
drivers/net/wireless/ath/ath9k/xmit.c
drivers/net/wireless/ath/carl9170/carl9170.h
drivers/net/wireless/ath/carl9170/fw.c
drivers/net/wireless/ath/carl9170/fwcmd.h
drivers/net/wireless/ath/carl9170/fwdesc.h
drivers/net/wireless/ath/carl9170/hw.h
drivers/net/wireless/ath/carl9170/main.c
drivers/net/wireless/ath/carl9170/phy.c
drivers/net/wireless/ath/carl9170/rx.c
drivers/net/wireless/ath/carl9170/version.h
drivers/net/wireless/ath/carl9170/wlan.h
drivers/net/wireless/atmel.c
drivers/net/wireless/b43/Kconfig
drivers/net/wireless/b43/Makefile
drivers/net/wireless/b43/b43.h
drivers/net/wireless/b43/bus.c [new file with mode: 0644]
drivers/net/wireless/b43/bus.h [new file with mode: 0644]
drivers/net/wireless/b43/dma.c
drivers/net/wireless/b43/leds.c
drivers/net/wireless/b43/lo.c
drivers/net/wireless/b43/main.c
drivers/net/wireless/b43/main.h
drivers/net/wireless/b43/phy_a.c
drivers/net/wireless/b43/phy_common.c
drivers/net/wireless/b43/phy_common.h
drivers/net/wireless/b43/phy_g.c
drivers/net/wireless/b43/phy_ht.c [new file with mode: 0644]
drivers/net/wireless/b43/phy_ht.h [new file with mode: 0644]
drivers/net/wireless/b43/phy_lcn.c [new file with mode: 0644]
drivers/net/wireless/b43/phy_lcn.h [new file with mode: 0644]
drivers/net/wireless/b43/phy_lp.c
drivers/net/wireless/b43/phy_n.c
drivers/net/wireless/b43/pio.c
drivers/net/wireless/b43/radio_2055.h
drivers/net/wireless/b43/radio_2056.h
drivers/net/wireless/b43/radio_2059.c [new file with mode: 0644]
drivers/net/wireless/b43/radio_2059.h [new file with mode: 0644]
drivers/net/wireless/b43/rfkill.c
drivers/net/wireless/b43/sdio.c
drivers/net/wireless/b43/sysfs.c
drivers/net/wireless/b43/tables_lpphy.c
drivers/net/wireless/b43/tables_nphy.h
drivers/net/wireless/b43/tables_phy_ht.c [new file with mode: 0644]
drivers/net/wireless/b43/tables_phy_ht.h [new file with mode: 0644]
drivers/net/wireless/b43/tables_phy_lcn.c [new file with mode: 0644]
drivers/net/wireless/b43/tables_phy_lcn.h [new file with mode: 0644]
drivers/net/wireless/b43/wa.c
drivers/net/wireless/b43/xmit.c
drivers/net/wireless/b43legacy/dma.c
drivers/net/wireless/b43legacy/main.c
drivers/net/wireless/b43legacy/xmit.c
drivers/net/wireless/hostap/hostap_wlan.h
drivers/net/wireless/ipw2x00/ipw2100.c
drivers/net/wireless/ipw2x00/ipw2200.h
drivers/net/wireless/ipw2x00/libipw_rx.c
drivers/net/wireless/ipw2x00/libipw_wx.c
drivers/net/wireless/iwlegacy/iwl-3945.c
drivers/net/wireless/iwlegacy/iwl-4965-lib.c
drivers/net/wireless/iwlegacy/iwl-4965-rs.c
drivers/net/wireless/iwlegacy/iwl-4965-rx.c
drivers/net/wireless/iwlegacy/iwl-4965-tx.c
drivers/net/wireless/iwlegacy/iwl-4965.c
drivers/net/wireless/iwlegacy/iwl-commands.h
drivers/net/wireless/iwlegacy/iwl-core.c
drivers/net/wireless/iwlegacy/iwl-core.h
drivers/net/wireless/iwlegacy/iwl-debugfs.c
drivers/net/wireless/iwlegacy/iwl-dev.h
drivers/net/wireless/iwlegacy/iwl-devtrace.c
drivers/net/wireless/iwlegacy/iwl-devtrace.h
drivers/net/wireless/iwlegacy/iwl-eeprom.c
drivers/net/wireless/iwlegacy/iwl-helpers.h
drivers/net/wireless/iwlegacy/iwl-rx.c
drivers/net/wireless/iwlegacy/iwl-scan.c
drivers/net/wireless/iwlegacy/iwl3945-base.c
drivers/net/wireless/iwlegacy/iwl4965-base.c
drivers/net/wireless/iwlwifi/Makefile
drivers/net/wireless/iwlwifi/iwl-1000.c
drivers/net/wireless/iwlwifi/iwl-2000.c
drivers/net/wireless/iwlwifi/iwl-5000-hw.h
drivers/net/wireless/iwlwifi/iwl-5000.c
drivers/net/wireless/iwlwifi/iwl-6000.c
drivers/net/wireless/iwlwifi/iwl-agn-calib.c
drivers/net/wireless/iwlwifi/iwl-agn-calib.h
drivers/net/wireless/iwlwifi/iwl-agn-eeprom.c
drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c
drivers/net/wireless/iwlwifi/iwl-agn-hw.h
drivers/net/wireless/iwlwifi/iwl-agn-ict.c
drivers/net/wireless/iwlwifi/iwl-agn-lib.c
drivers/net/wireless/iwlwifi/iwl-agn-rs.c
drivers/net/wireless/iwlwifi/iwl-agn-rxon.c
drivers/net/wireless/iwlwifi/iwl-agn-sta.c
drivers/net/wireless/iwlwifi/iwl-agn-tt.c
drivers/net/wireless/iwlwifi/iwl-agn-tx.c
drivers/net/wireless/iwlwifi/iwl-agn-ucode.c
drivers/net/wireless/iwlwifi/iwl-agn.c
drivers/net/wireless/iwlwifi/iwl-agn.h
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-debug.h
drivers/net/wireless/iwlwifi/iwl-debugfs.c
drivers/net/wireless/iwlwifi/iwl-dev.h
drivers/net/wireless/iwlwifi/iwl-eeprom.c
drivers/net/wireless/iwlwifi/iwl-eeprom.h
drivers/net/wireless/iwlwifi/iwl-fh.h
drivers/net/wireless/iwlwifi/iwl-hcmd.c
drivers/net/wireless/iwlwifi/iwl-helpers.h
drivers/net/wireless/iwlwifi/iwl-io.h
drivers/net/wireless/iwlwifi/iwl-led.c
drivers/net/wireless/iwlwifi/iwl-pci.c [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-pci.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-power.c
drivers/net/wireless/iwlwifi/iwl-power.h
drivers/net/wireless/iwlwifi/iwl-prph.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-sv-open.c
drivers/net/wireless/iwlwifi/iwl-testmode.h
drivers/net/wireless/iwlwifi/iwl-trans.c [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-trans.h [new file with mode: 0644]
drivers/net/wireless/iwlwifi/iwl-tx.c
drivers/net/wireless/iwmc3200wifi/fw.c
drivers/net/wireless/libertas/cfg.c
drivers/net/wireless/libertas/cmd.c
drivers/net/wireless/libertas/cmd.h
drivers/net/wireless/libertas/cmdresp.c
drivers/net/wireless/libertas/debugfs.c
drivers/net/wireless/libertas/ethtool.c
drivers/net/wireless/libertas/if_sdio.c
drivers/net/wireless/libertas/if_spi.c
drivers/net/wireless/libertas/main.c
drivers/net/wireless/libertas/mesh.c
drivers/net/wireless/libertas/rx.c
drivers/net/wireless/libertas/tx.c
drivers/net/wireless/libertas_tf/cmd.c
drivers/net/wireless/libertas_tf/main.c
drivers/net/wireless/mac80211_hwsim.c
drivers/net/wireless/mac80211_hwsim.h [new file with mode: 0644]
drivers/net/wireless/mwifiex/11n.c
drivers/net/wireless/mwifiex/11n.h
drivers/net/wireless/mwifiex/11n_aggr.c
drivers/net/wireless/mwifiex/11n_rxreorder.c
drivers/net/wireless/mwifiex/11n_rxreorder.h
drivers/net/wireless/mwifiex/cfg80211.c
drivers/net/wireless/mwifiex/cmdevt.c
drivers/net/wireless/mwifiex/debugfs.c
drivers/net/wireless/mwifiex/decl.h
drivers/net/wireless/mwifiex/fw.h
drivers/net/wireless/mwifiex/join.c
drivers/net/wireless/mwifiex/main.c
drivers/net/wireless/mwifiex/main.h
drivers/net/wireless/mwifiex/scan.c
drivers/net/wireless/mwifiex/sdio.c
drivers/net/wireless/mwifiex/sdio.h
drivers/net/wireless/mwifiex/sta_cmd.c
drivers/net/wireless/mwifiex/sta_cmdresp.c
drivers/net/wireless/mwifiex/sta_rx.c
drivers/net/wireless/mwifiex/sta_tx.c
drivers/net/wireless/mwifiex/txrx.c
drivers/net/wireless/mwifiex/wmm.c
drivers/net/wireless/mwl8k.c
drivers/net/wireless/orinoco/main.c
drivers/net/wireless/p54/p54pci.h
drivers/net/wireless/prism54/islpci_dev.c
drivers/net/wireless/prism54/islpci_dev.h
drivers/net/wireless/prism54/islpci_hotplug.c
drivers/net/wireless/rt2x00/Kconfig
drivers/net/wireless/rt2x00/rt2400pci.c
drivers/net/wireless/rt2x00/rt2500pci.c
drivers/net/wireless/rt2x00/rt2500usb.c
drivers/net/wireless/rt2x00/rt2800.h
drivers/net/wireless/rt2x00/rt2800lib.c
drivers/net/wireless/rt2x00/rt2800lib.h
drivers/net/wireless/rt2x00/rt2800pci.c
drivers/net/wireless/rt2x00/rt2800usb.c
drivers/net/wireless/rt2x00/rt2x00.h
drivers/net/wireless/rt2x00/rt2x00crypto.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/rt2x00usb.c
drivers/net/wireless/rt2x00/rt61pci.c
drivers/net/wireless/rt2x00/rt73usb.c
drivers/net/wireless/rtl818x/rtl8180/dev.c
drivers/net/wireless/rtlwifi/Kconfig
drivers/net/wireless/rtlwifi/Makefile
drivers/net/wireless/rtlwifi/base.c
drivers/net/wireless/rtlwifi/core.c
drivers/net/wireless/rtlwifi/core.h
drivers/net/wireless/rtlwifi/efuse.c
drivers/net/wireless/rtlwifi/pci.c
drivers/net/wireless/rtlwifi/pci.h
drivers/net/wireless/rtlwifi/ps.c
drivers/net/wireless/rtlwifi/ps.h
drivers/net/wireless/rtlwifi/rc.c
drivers/net/wireless/rtlwifi/regd.c
drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c
drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c
drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c
drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
drivers/net/wireless/rtlwifi/rtl8192ce/led.c
drivers/net/wireless/rtlwifi/rtl8192ce/phy.c
drivers/net/wireless/rtlwifi/rtl8192ce/reg.h
drivers/net/wireless/rtlwifi/rtl8192ce/rf.c
drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
drivers/net/wireless/rtlwifi/rtl8192cu/led.c
drivers/net/wireless/rtlwifi/rtl8192cu/mac.c
drivers/net/wireless/rtlwifi/rtl8192cu/phy.c
drivers/net/wireless/rtlwifi/rtl8192cu/rf.c
drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
drivers/net/wireless/rtlwifi/rtl8192de/Makefile [new file with mode: 0644]
drivers/net/wireless/rtlwifi/rtl8192de/def.h [new file with mode: 0644]
drivers/net/wireless/rtlwifi/rtl8192de/dm.c [new file with mode: 0644]
drivers/net/wireless/rtlwifi/rtl8192de/dm.h [new file with mode: 0644]
drivers/net/wireless/rtlwifi/rtl8192de/fw.c [new file with mode: 0644]
drivers/net/wireless/rtlwifi/rtl8192de/fw.h [new file with mode: 0644]
drivers/net/wireless/rtlwifi/rtl8192de/hw.c [new file with mode: 0644]
drivers/net/wireless/rtlwifi/rtl8192de/hw.h [new file with mode: 0644]
drivers/net/wireless/rtlwifi/rtl8192de/led.c [new file with mode: 0644]
drivers/net/wireless/rtlwifi/rtl8192de/led.h [new file with mode: 0644]
drivers/net/wireless/rtlwifi/rtl8192de/phy.c [new file with mode: 0644]
drivers/net/wireless/rtlwifi/rtl8192de/phy.h [new file with mode: 0644]
drivers/net/wireless/rtlwifi/rtl8192de/reg.h [new file with mode: 0644]
drivers/net/wireless/rtlwifi/rtl8192de/rf.c [new file with mode: 0644]
drivers/net/wireless/rtlwifi/rtl8192de/rf.h [new file with mode: 0644]
drivers/net/wireless/rtlwifi/rtl8192de/sw.c [new file with mode: 0644]
drivers/net/wireless/rtlwifi/rtl8192de/sw.h [new file with mode: 0644]
drivers/net/wireless/rtlwifi/rtl8192de/table.c [new file with mode: 0644]
drivers/net/wireless/rtlwifi/rtl8192de/table.h [new file with mode: 0644]
drivers/net/wireless/rtlwifi/rtl8192de/trx.c [new file with mode: 0644]
drivers/net/wireless/rtlwifi/rtl8192de/trx.h [new file with mode: 0644]
drivers/net/wireless/rtlwifi/rtl8192se/dm.c
drivers/net/wireless/rtlwifi/rtl8192se/fw.c
drivers/net/wireless/rtlwifi/rtl8192se/hw.c
drivers/net/wireless/rtlwifi/rtl8192se/led.c
drivers/net/wireless/rtlwifi/rtl8192se/phy.c
drivers/net/wireless/rtlwifi/rtl8192se/reg.h
drivers/net/wireless/rtlwifi/rtl8192se/rf.c
drivers/net/wireless/rtlwifi/rtl8192se/trx.c
drivers/net/wireless/rtlwifi/wifi.h
drivers/net/wireless/wl1251/sdio.c
drivers/net/wireless/wl1251/spi.c
drivers/net/wireless/wl12xx/Kconfig
drivers/net/wireless/wl12xx/acx.c
drivers/net/wireless/wl12xx/acx.h
drivers/net/wireless/wl12xx/boot.c
drivers/net/wireless/wl12xx/cmd.c
drivers/net/wireless/wl12xx/cmd.h
drivers/net/wireless/wl12xx/conf.h
drivers/net/wireless/wl12xx/debugfs.c
drivers/net/wireless/wl12xx/event.c
drivers/net/wireless/wl12xx/event.h
drivers/net/wireless/wl12xx/ini.h
drivers/net/wireless/wl12xx/init.c
drivers/net/wireless/wl12xx/io.c
drivers/net/wireless/wl12xx/io.h
drivers/net/wireless/wl12xx/main.c
drivers/net/wireless/wl12xx/ps.c
drivers/net/wireless/wl12xx/rx.c
drivers/net/wireless/wl12xx/rx.h
drivers/net/wireless/wl12xx/scan.c
drivers/net/wireless/wl12xx/scan.h
drivers/net/wireless/wl12xx/sdio.c
drivers/net/wireless/wl12xx/spi.c
drivers/net/wireless/wl12xx/testmode.c
drivers/net/wireless/wl12xx/tx.c
drivers/net/wireless/wl12xx/tx.h
drivers/net/wireless/wl12xx/wl12xx.h
drivers/net/wireless/zd1211rw/zd_chip.h
drivers/net/wireless/zd1211rw/zd_def.h
drivers/net/wireless/zd1211rw/zd_mac.c
drivers/net/wireless/zd1211rw/zd_mac.h
drivers/net/wireless/zd1211rw/zd_usb.c
drivers/net/wireless/zd1211rw/zd_usb.h
drivers/net/xen-netback/netback.c
drivers/net/xen-netfront.c
drivers/net/xilinx_emaclite.c
drivers/net/yellowfin.c
drivers/net/znet.c
drivers/net/zorro8390.c
drivers/nfc/Kconfig
drivers/nfc/Makefile
drivers/nfc/pn533.c [new file with mode: 0644]
drivers/s390/net/ctcm_mpc.h
drivers/s390/net/qeth_l3_main.c
drivers/scsi/bnx2fc/57xx_hsi_bnx2fc.h
drivers/scsi/bnx2fc/bnx2fc.h
drivers/scsi/bnx2fc/bnx2fc_constants.h
drivers/scsi/bnx2fc/bnx2fc_els.c
drivers/scsi/bnx2fc/bnx2fc_fcoe.c
drivers/scsi/bnx2fc/bnx2fc_hwi.c
drivers/scsi/bnx2fc/bnx2fc_io.c
drivers/scsi/bnx2fc/bnx2fc_tgt.c
drivers/scsi/bnx2i/57xx_iscsi_constants.h
drivers/scsi/bnx2i/57xx_iscsi_hsi.h
drivers/scsi/bnx2i/bnx2i.h
drivers/scsi/bnx2i/bnx2i_hwi.c
drivers/scsi/bnx2i/bnx2i_init.c
drivers/scsi/cxgbi/cxgb3i/cxgb3i.c
drivers/scsi/cxgbi/cxgb4i/cxgb4i.c
drivers/scsi/cxgbi/libcxgbi.c
drivers/ssb/driver_chipcommon_pmu.c
drivers/ssb/driver_gige.c
drivers/ssb/driver_pcicore.c
drivers/ssb/main.c
drivers/ssb/pci.c
drivers/ssb/pcihost_wrapper.c
drivers/ssb/scan.c
drivers/staging/brcm80211/brcmfmac/dhd_linux.c
drivers/staging/brcm80211/brcmfmac/wl_iw.c
drivers/staging/brcm80211/brcmsmac/wl_mac80211.c
drivers/staging/brcm80211/brcmsmac/wl_mac80211.h
drivers/staging/ft1000/ft1000-usb/ft1000_hw.c
drivers/staging/pohmelfs/crypto.c
drivers/staging/rtl8187se/ieee80211/ieee80211.h
drivers/staging/rtl8187se/ieee80211/ieee80211_softmac.c
drivers/staging/rtl8187se/r8180.h
drivers/staging/rtl8187se/r8180_core.c
drivers/staging/rtl8192e/ieee80211/ieee80211.h
drivers/staging/rtl8192e/r8192E.h
drivers/staging/rtl8192e/r8192E_core.c
drivers/staging/rtl8192u/ieee80211/ieee80211.h
drivers/staging/wlags49_h2/wl_internal.h
drivers/tty/serial/ifx6x60.c
drivers/usb/gadget/f_phonet.c
drivers/vhost/net.c
drivers/vhost/test.c
drivers/vhost/vhost.c
drivers/vhost/vhost.h
include/crypto/if_alg.h
include/linux/arcdevice.h
include/linux/ath9k_platform.h
include/linux/audit.h
include/linux/bcma/bcma.h
include/linux/bcma/bcma_driver_chipcommon.h
include/linux/bcma/bcma_driver_pci.h
include/linux/cordic.h [new file with mode: 0644]
include/linux/crc8.h [new file with mode: 0644]
include/linux/dcbnl.h
include/linux/dccp.h
include/linux/dma-direction.h [new file with mode: 0644]
include/linux/dma-mapping.h
include/linux/dmaengine.h
include/linux/etherdevice.h
include/linux/ethtool.h
include/linux/ieee80211.h
include/linux/if_ether.h
include/linux/if_packet.h
include/linux/if_vlan.h
include/linux/mii.h
include/linux/netdevice.h
include/linux/netfilter/ipset/ip_set.h
include/linux/netfilter/ipset/ip_set_ahash.h
include/linux/netfilter/ipset/ip_set_hash.h
include/linux/netfilter/ipset/ip_set_timeout.h
include/linux/netfilter/ipset/pfxlen.h
include/linux/netfilter/nfnetlink.h
include/linux/netfilter/nfnetlink_queue.h
include/linux/netfilter/xt_set.h
include/linux/netlink.h
include/linux/netpoll.h
include/linux/nfc.h [new file with mode: 0644]
include/linux/nl80211.h
include/linux/pci_ids.h
include/linux/rtnetlink.h
include/linux/skbuff.h
include/linux/socket.h
include/linux/ssb/ssb.h
include/linux/stmmac.h
include/linux/tc_ematch/tc_em_meta.h
include/linux/tcp.h
include/linux/virtio_net.h
include/net/act_api.h
include/net/arp.h
include/net/bluetooth/bluetooth.h
include/net/bluetooth/hci.h
include/net/bluetooth/hci_core.h
include/net/bluetooth/l2cap.h
include/net/bluetooth/mgmt.h
include/net/bluetooth/rfcomm.h
include/net/bluetooth/smp.h
include/net/caif/caif_hsi.h [new file with mode: 0644]
include/net/cfg80211.h
include/net/dcbnl.h
include/net/dst.h
include/net/dst_ops.h
include/net/genetlink.h
include/net/inetpeer.h
include/net/ip.h
include/net/ip6_fib.h
include/net/ip_vs.h
include/net/mac80211.h
include/net/neighbour.h
include/net/net_namespace.h
include/net/netlink.h
include/net/nfc.h [new file with mode: 0644]
include/net/pkt_sched.h
include/net/rtnetlink.h
include/net/sch_generic.h
include/net/sctp/sctp.h
include/net/sctp/structs.h
include/net/sctp/user.h
include/net/snmp.h
include/net/sock.h
include/net/tcp.h
include/net/wimax.h
include/trace/events/sock.h [new file with mode: 0644]
include/trace/events/udp.h [new file with mode: 0644]
kernel/audit.c
lib/Kconfig
lib/Makefile
lib/checksum.c
lib/cordic.c [new file with mode: 0644]
lib/crc8.c [new file with mode: 0644]
net/8021q/vlan.c
net/8021q/vlan.h
net/8021q/vlan_dev.c
net/8021q/vlanproc.c
net/Kconfig
net/Makefile
net/TUNABLE [deleted file]
net/appletalk/aarp.c
net/appletalk/ddp.c
net/atm/clip.c
net/atm/mpc.c
net/atm/pppoatm.c
net/batman-adv/Kconfig
net/batman-adv/aggregation.c
net/batman-adv/aggregation.h
net/batman-adv/bat_debugfs.c
net/batman-adv/bat_sysfs.c
net/batman-adv/bat_sysfs.h
net/batman-adv/bitarray.c
net/batman-adv/bitarray.h
net/batman-adv/gateway_client.c
net/batman-adv/gateway_client.h
net/batman-adv/gateway_common.c
net/batman-adv/hard-interface.c
net/batman-adv/hard-interface.h
net/batman-adv/hash.c
net/batman-adv/hash.h
net/batman-adv/icmp_socket.c
net/batman-adv/main.c
net/batman-adv/main.h
net/batman-adv/originator.c
net/batman-adv/originator.h
net/batman-adv/packet.h
net/batman-adv/ring_buffer.c
net/batman-adv/ring_buffer.h
net/batman-adv/routing.c
net/batman-adv/routing.h
net/batman-adv/send.c
net/batman-adv/send.h
net/batman-adv/soft-interface.c
net/batman-adv/soft-interface.h
net/batman-adv/translation-table.c
net/batman-adv/translation-table.h
net/batman-adv/types.h
net/batman-adv/unicast.c
net/batman-adv/unicast.h
net/batman-adv/vis.c
net/bluetooth/Kconfig
net/bluetooth/Makefile
net/bluetooth/cmtp/capi.c
net/bluetooth/hci_conn.c
net/bluetooth/hci_core.c
net/bluetooth/hci_event.c
net/bluetooth/hci_sock.c
net/bluetooth/l2cap_core.c
net/bluetooth/l2cap_sock.c
net/bluetooth/lib.c
net/bluetooth/mgmt.c
net/bluetooth/rfcomm/sock.c
net/bluetooth/sco.c
net/bluetooth/smp.c [new file with mode: 0644]
net/bridge/br_netfilter.c
net/bridge/br_netlink.c
net/caif/caif_dev.c
net/caif/chnl_net.c
net/can/af_can.c
net/can/bcm.c
net/ceph/crypto.c
net/core/dev.c
net/core/dst.c
net/core/ethtool.c
net/core/fib_rules.c
net/core/neighbour.c
net/core/net-sysfs.c
net/core/net-traces.c
net/core/net_namespace.c
net/core/netpoll.c
net/core/rtnetlink.c
net/core/skbuff.c
net/core/sock.c
net/core/timestamping.c
net/dcb/dcbnl.c
net/dccp/ccid.c
net/dccp/ccids/ccid2.c
net/dccp/ccids/ccid2.h
net/dccp/input.c
net/dccp/output.c
net/decnet/af_decnet.c
net/decnet/dn_dev.c
net/decnet/dn_fib.c
net/decnet/dn_neigh.c
net/decnet/dn_nsp_in.c
net/decnet/dn_route.c
net/decnet/dn_table.c
net/decnet/netfilter/dn_rtmsg.c
net/decnet/sysctl_net_decnet.c
net/dsa/mv88e6131.c
net/econet/af_econet.c
net/ethernet/eth.c
net/ieee802154/af_ieee802154.c
net/ieee802154/dgram.c
net/ieee802154/nl-phy.c
net/ipv4/af_inet.c
net/ipv4/arp.c
net/ipv4/devinet.c
net/ipv4/fib_frontend.c
net/ipv4/fib_trie.c
net/ipv4/gre.c
net/ipv4/inet_diag.c
net/ipv4/inetpeer.c
net/ipv4/ip_fragment.c
net/ipv4/ip_gre.c
net/ipv4/ip_input.c
net/ipv4/ip_output.c
net/ipv4/ipconfig.c
net/ipv4/ipmr.c
net/ipv4/netfilter/ipt_CLUSTERIP.c
net/ipv4/netfilter/nf_defrag_ipv4.c
net/ipv4/netfilter/nf_nat_snmp_basic.c
net/ipv4/netfilter/nf_nat_standalone.c
net/ipv4/raw.c
net/ipv4/route.c
net/ipv4/syncookies.c
net/ipv4/sysctl_net_ipv4.c
net/ipv4/tcp_input.c
net/ipv4/tcp_ipv4.c
net/ipv4/tcp_minisocks.c
net/ipv4/udp.c
net/ipv4/xfrm4_policy.c
net/ipv6/addrconf.c
net/ipv6/addrlabel.c
net/ipv6/ip6_fib.c
net/ipv6/ip6_output.c
net/ipv6/ip6mr.c
net/ipv6/ndisc.c
net/ipv6/raw.c
net/ipv6/route.c
net/ipv6/sit.c
net/ipv6/syncookies.c
net/ipv6/tcp_ipv6.c
net/irda/af_irda.c
net/irda/ircomm/ircomm_tty_attach.c
net/irda/irda_device.c
net/irda/iriap.c
net/irda/irlan/irlan_client.c
net/irda/irlan/irlan_common.c
net/irda/irlan/irlan_eth.c
net/irda/irlan/irlan_provider.c
net/irda/irqueue.c
net/irda/irttp.c
net/key/af_key.c
net/l2tp/l2tp_ip.c
net/lapb/lapb_iface.c
net/lapb/lapb_in.c
net/mac80211/aes_ccm.c
net/mac80211/aes_ccm.h
net/mac80211/aes_cmac.c
net/mac80211/aes_cmac.h
net/mac80211/agg-rx.c
net/mac80211/cfg.c
net/mac80211/debugfs_key.c
net/mac80211/driver-ops.h
net/mac80211/driver-trace.h
net/mac80211/ht.c
net/mac80211/ieee80211_i.h
net/mac80211/iface.c
net/mac80211/key.c
net/mac80211/key.h
net/mac80211/mesh_pathtbl.c
net/mac80211/mlme.c
net/mac80211/pm.c
net/mac80211/rc80211_minstrel.c
net/mac80211/rc80211_minstrel.h
net/mac80211/rc80211_minstrel_ht.c
net/mac80211/rx.c
net/mac80211/scan.c
net/mac80211/sta_info.h
net/mac80211/tkip.c
net/mac80211/tkip.h
net/mac80211/tx.c
net/mac80211/util.c
net/mac80211/wme.c
net/mac80211/wme.h
net/mac80211/work.c
net/mac80211/wpa.c
net/netfilter/ipset/Kconfig
net/netfilter/ipset/Makefile
net/netfilter/ipset/ip_set_bitmap_ip.c
net/netfilter/ipset/ip_set_bitmap_ipmac.c
net/netfilter/ipset/ip_set_bitmap_port.c
net/netfilter/ipset/ip_set_core.c
net/netfilter/ipset/ip_set_hash_ip.c
net/netfilter/ipset/ip_set_hash_ipport.c
net/netfilter/ipset/ip_set_hash_ipportip.c
net/netfilter/ipset/ip_set_hash_ipportnet.c
net/netfilter/ipset/ip_set_hash_net.c
net/netfilter/ipset/ip_set_hash_netiface.c [new file with mode: 0644]
net/netfilter/ipset/ip_set_hash_netport.c
net/netfilter/ipset/ip_set_list_set.c
net/netfilter/ipset/pfxlen.c
net/netfilter/ipvs/ip_vs_app.c
net/netfilter/ipvs/ip_vs_conn.c
net/netfilter/ipvs/ip_vs_core.c
net/netfilter/ipvs/ip_vs_ctl.c
net/netfilter/ipvs/ip_vs_est.c
net/netfilter/ipvs/ip_vs_ftp.c
net/netfilter/ipvs/ip_vs_proto.c
net/netfilter/ipvs/ip_vs_sync.c
net/netfilter/nf_conntrack_netlink.c
net/netfilter/nfnetlink.c
net/netfilter/nfnetlink_queue.c
net/netfilter/xt_AUDIT.c
net/netfilter/xt_CT.c
net/netfilter/xt_HL.c
net/netfilter/xt_hl.c
net/netfilter/xt_set.c
net/netlabel/netlabel_unlabeled.c
net/netlink/af_netlink.c
net/netlink/genetlink.c
net/netrom/nr_route.c
net/nfc/Kconfig [new file with mode: 0644]
net/nfc/Makefile [new file with mode: 0644]
net/nfc/af_nfc.c [new file with mode: 0644]
net/nfc/core.c [new file with mode: 0644]
net/nfc/netlink.c [new file with mode: 0644]
net/nfc/nfc.h [new file with mode: 0644]
net/nfc/rawsock.c [new file with mode: 0644]
net/packet/af_packet.c
net/phonet/pn_netlink.c
net/rds/bind.c
net/rds/ib.h
net/rds/ib_cm.c
net/rds/ib_send.c
net/rds/iw.h
net/rds/iw_cm.c
net/rds/iw_rdma.c
net/rds/iw_send.c
net/rds/send.c
net/rds/tcp_stats.c
net/rose/rose_link.c
net/rose/rose_route.c
net/sched/act_api.c
net/sched/act_csum.c
net/sched/act_gact.c
net/sched/act_ipt.c
net/sched/act_mirred.c
net/sched/act_nat.c
net/sched/act_pedit.c
net/sched/act_police.c
net/sched/act_simple.c
net/sched/act_skbedit.c
net/sched/cls_api.c
net/sched/cls_basic.c
net/sched/cls_cgroup.c
net/sched/cls_flow.c
net/sched/cls_fw.c
net/sched/cls_route.c
net/sched/cls_rsvp.h
net/sched/cls_tcindex.c
net/sched/cls_u32.c
net/sched/em_meta.c
net/sched/sch_api.c
net/sched/sch_atm.c
net/sched/sch_choke.c
net/sched/sch_generic.c
net/sched/sch_netem.c
net/sched/sch_sfq.c
net/sched/sch_teql.c
net/sctp/associola.c
net/sctp/bind_addr.c
net/sctp/input.c
net/sctp/ipv6.c
net/sctp/outqueue.c
net/sctp/protocol.c
net/sctp/sm_make_chunk.c
net/sctp/sm_sideeffect.c
net/sctp/sm_statefuns.c
net/sctp/socket.c
net/sctp/sysctl.c
net/sunrpc/auth.c
net/sunrpc/auth_gss/auth_gss.c
net/sunrpc/clnt.c
net/sunrpc/rpc_pipe.c
net/sunrpc/xprtrdma/svc_rdma_transport.c
net/sunrpc/xprtrdma/verbs.c
net/tipc/bcast.c
net/tipc/bearer.c
net/tipc/bearer.h
net/tipc/core.h
net/tipc/link.c
net/tipc/msg.c
net/tipc/msg.h
net/tipc/name_distr.c
net/tipc/name_table.c
net/tipc/name_table.h
net/tipc/port.c
net/tipc/socket.c
net/wireless/mlme.c
net/wireless/nl80211.c
net/wireless/nl80211.h
net/wireless/scan.c
net/x25/af_x25.c
net/x25/x25_dev.c
net/x25/x25_in.c
net/x25/x25_link.c
net/x25/x25_subr.c
net/xfrm/xfrm_policy.c
net/xfrm/xfrm_user.c
security/apparmor/lib.c

index 8906648..445289c 100644 (file)
 !Finclude/net/mac80211.h set_key_cmd
 !Finclude/net/mac80211.h ieee80211_key_conf
 !Finclude/net/mac80211.h ieee80211_key_flags
-!Finclude/net/mac80211.h ieee80211_tkip_key_type
-!Finclude/net/mac80211.h ieee80211_get_tkip_key
+!Finclude/net/mac80211.h ieee80211_get_tkip_p1k
+!Finclude/net/mac80211.h ieee80211_get_tkip_p1k_iv
+!Finclude/net/mac80211.h ieee80211_get_tkip_p2k
 !Finclude/net/mac80211.h ieee80211_key_removed
       </chapter>
 
index 2bac961..65968fb 100644 (file)
@@ -260,7 +260,7 @@ int main(int argc, char *argv[])
                case 'V': opt_V++; exclusive++; break;
 
                case '?':
-                       fprintf(stderr, usage_msg);
+                       fprintf(stderr, "%s", usage_msg);
                        res = 2;
                        goto out;
                }
@@ -268,13 +268,13 @@ int main(int argc, char *argv[])
 
        /* options check */
        if (exclusive > 1) {
-               fprintf(stderr, usage_msg);
+               fprintf(stderr, "%s", usage_msg);
                res = 2;
                goto out;
        }
 
        if (opt_v || opt_V) {
-               printf(version);
+               printf("%s", version);
                if (opt_V) {
                        res = 0;
                        goto out;
@@ -282,14 +282,14 @@ int main(int argc, char *argv[])
        }
 
        if (opt_u) {
-               printf(usage_msg);
+               printf("%s", usage_msg);
                res = 0;
                goto out;
        }
 
        if (opt_h) {
-               printf(usage_msg);
-               printf(help_msg);
+               printf("%s", usage_msg);
+               printf("%s", help_msg);
                res = 0;
                goto out;
        }
@@ -309,7 +309,7 @@ int main(int argc, char *argv[])
                        goto out;
                } else {
                        /* Just show usage */
-                       fprintf(stderr, usage_msg);
+                       fprintf(stderr, "%s", usage_msg);
                        res = 2;
                        goto out;
                }
@@ -320,7 +320,7 @@ int main(int argc, char *argv[])
        master_ifname = *spp++;
 
        if (master_ifname == NULL) {
-               fprintf(stderr, usage_msg);
+               fprintf(stderr, "%s", usage_msg);
                res = 2;
                goto out;
        }
@@ -339,7 +339,7 @@ int main(int argc, char *argv[])
 
        if (slave_ifname == NULL) {
                if (opt_d || opt_c) {
-                       fprintf(stderr, usage_msg);
+                       fprintf(stderr, "%s", usage_msg);
                        res = 2;
                        goto out;
                }
index bfe9242..db2a406 100644 (file)
@@ -106,16 +106,6 @@ inet_peer_maxttl - INTEGER
        when the number of entries in the pool is very small).
        Measured in seconds.
 
-inet_peer_gc_mintime - INTEGER
-       Minimum interval between garbage collection passes.  This interval is
-       in effect under high memory pressure on the pool.
-       Measured in seconds.
-
-inet_peer_gc_maxtime - INTEGER
-       Minimum interval between garbage collection passes.  This interval is
-       in effect under low (or absent) memory pressure on the pool.
-       Measured in seconds.
-
 TCP variables:
 
 somaxconn - INTEGER
@@ -394,7 +384,7 @@ tcp_rmem - vector of 3 INTEGERs: min, default, max
        min: Minimal size of receive buffer used by TCP sockets.
        It is guaranteed to each TCP socket, even under moderate memory
        pressure.
-       Default: 8K
+       Default: 1 page
 
        default: initial size of receive buffer used by TCP sockets.
        This value overrides net.core.rmem_default used by other protocols.
@@ -483,7 +473,7 @@ tcp_window_scaling - BOOLEAN
 tcp_wmem - vector of 3 INTEGERs: min, default, max
        min: Amount of memory reserved for send buffers for TCP sockets.
        Each TCP socket has rights to use it due to fact of its birth.
-       Default: 4K
+       Default: 1 page
 
        default: initial size of send buffer used by TCP sockets.  This
        value overrides net.core.wmem_default used by other protocols.
@@ -553,13 +543,13 @@ udp_rmem_min - INTEGER
        Minimal size of receive buffer used by UDP sockets in moderation.
        Each UDP socket is able to use the size for receiving data, even if
        total pages of UDP sockets exceed udp_mem pressure. The unit is byte.
-       Default: 4096
+       Default: 1 page
 
 udp_wmem_min - INTEGER
        Minimal size of send buffer used by UDP sockets in moderation.
        Each UDP socket is able to use the size for sending data, even if
        total pages of UDP sockets exceed udp_mem pressure. The unit is byte.
-       Default: 4096
+       Default: 1 page
 
 CIPSOv4 Variables:
 
@@ -1465,10 +1455,17 @@ sctp_mem - vector of 3 INTEGERs: min, pressure, max
        Default is calculated at boot time from amount of available memory.
 
 sctp_rmem - vector of 3 INTEGERs: min, default, max
-       See tcp_rmem for a description.
+       Only the first value ("min") is used, "default" and "max" are
+       ignored.
+
+       min: Minimal size of receive buffer used by SCTP socket.
+       It is guaranteed to each SCTP socket (but not association) even
+       under moderate memory pressure.
+
+       Default: 1 page
 
 sctp_wmem  - vector of 3 INTEGERs: min, default, max
-       See tcp_wmem for a description.
+       Currently this tunable has no effect.
 
 addr_scope_policy - INTEGER
        Control IPv4 address scoping - draft-stewart-tsvwg-sctp-ipv4-00
diff --git a/Documentation/networking/netdev-features.txt b/Documentation/networking/netdev-features.txt
new file mode 100644 (file)
index 0000000..4b1c0dc
--- /dev/null
@@ -0,0 +1,154 @@
+Netdev features mess and how to get out from it alive
+=====================================================
+
+Author:
+       Michał Mirosław <mirq-linux@rere.qmqm.pl>
+
+
+
+ Part I: Feature sets
+======================
+
+Long gone are the days when a network card would just take and give packets
+verbatim.  Today's devices add multiple features and bugs (read: offloads)
+that relieve an OS of various tasks like generating and checking checksums,
+splitting packets, classifying them.  Those capabilities and their state
+are commonly referred to as netdev features in Linux kernel world.
+
+There are currently three sets of features relevant to the driver, and
+one used internally by network core:
+
+ 1. netdev->hw_features set contains features whose state may possibly
+    be changed (enabled or disabled) for a particular device by user's
+    request.  This set should be initialized in ndo_init callback and not
+    changed later.
+
+ 2. netdev->features set contains features which are currently enabled
+    for a device.  This should be changed only by network core or in
+    error paths of ndo_set_features callback.
+
+ 3. netdev->vlan_features set contains features whose state is inherited
+    by child VLAN devices (limits netdev->features set).  This is currently
+    used for all VLAN devices whether tags are stripped or inserted in
+    hardware or software.
+
+ 4. netdev->wanted_features set contains feature set requested by user.
+    This set is filtered by ndo_fix_features callback whenever it or
+    some device-specific conditions change. This set is internal to
+    networking core and should not be referenced in drivers.
+
+
+
+ Part II: Controlling enabled features
+=======================================
+
+When current feature set (netdev->features) is to be changed, new set
+is calculated and filtered by calling ndo_fix_features callback
+and netdev_fix_features(). If the resulting set differs from current
+set, it is passed to ndo_set_features callback and (if the callback
+returns success) replaces value stored in netdev->features.
+NETDEV_FEAT_CHANGE notification is issued after that whenever current
+set might have changed.
+
+The following events trigger recalculation:
+ 1. device's registration, after ndo_init returned success
+ 2. user requested changes in features state
+ 3. netdev_update_features() is called
+
+ndo_*_features callbacks are called with rtnl_lock held. Missing callbacks
+are treated as always returning success.
+
+A driver that wants to trigger recalculation must do so by calling
+netdev_update_features() while holding rtnl_lock. This should not be done
+from ndo_*_features callbacks. netdev->features should not be modified by
+driver except by means of ndo_fix_features callback.
+
+
+
+ Part III: Implementation hints
+================================
+
+ * ndo_fix_features:
+
+All dependencies between features should be resolved here. The resulting
+set can be reduced further by networking core imposed limitations (as coded
+in netdev_fix_features()). For this reason it is safer to disable a feature
+when its dependencies are not met instead of forcing the dependency on.
+
+This callback should not modify hardware nor driver state (should be
+stateless).  It can be called multiple times between successive
+ndo_set_features calls.
+
+Callback must not alter features contained in NETIF_F_SOFT_FEATURES or
+NETIF_F_NEVER_CHANGE sets. The exception is NETIF_F_VLAN_CHALLENGED but
+care must be taken as the change won't affect already configured VLANs.
+
+ * ndo_set_features:
+
+Hardware should be reconfigured to match passed feature set. The set
+should not be altered unless some error condition happens that can't
+be reliably detected in ndo_fix_features. In this case, the callback
+should update netdev->features to match resulting hardware state.
+Errors returned are not (and cannot be) propagated anywhere except dmesg.
+(Note: successful return is zero, >0 means silent error.)
+
+
+
+ Part IV: Features
+===================
+
+For current list of features, see include/linux/netdev_features.h.
+This section describes semantics of some of them.
+
+ * Transmit checksumming
+
+For complete description, see comments near the top of include/linux/skbuff.h.
+
+Note: NETIF_F_HW_CSUM is a superset of NETIF_F_IP_CSUM + NETIF_F_IPV6_CSUM.
+It means that device can fill TCP/UDP-like checksum anywhere in the packets
+whatever headers there might be.
+
+ * Transmit TCP segmentation offload
+
+NETIF_F_TSO_ECN means that hardware can properly split packets with CWR bit
+set, be it TCPv4 (when NETIF_F_TSO is enabled) or TCPv6 (NETIF_F_TSO6).
+
+ * Transmit DMA from high memory
+
+On platforms where this is relevant, NETIF_F_HIGHDMA signals that
+ndo_start_xmit can handle skbs with frags in high memory.
+
+ * Transmit scatter-gather
+
+Those features say that ndo_start_xmit can handle fragmented skbs:
+NETIF_F_SG --- paged skbs (skb_shinfo()->frags), NETIF_F_FRAGLIST ---
+chained skbs (skb->next/prev list).
+
+ * Software features
+
+Features contained in NETIF_F_SOFT_FEATURES are features of networking
+stack. Driver should not change behaviour based on them.
+
+ * LLTX driver (deprecated for hardware drivers)
+
+NETIF_F_LLTX should be set in drivers that implement their own locking in
+transmit path or don't need locking at all (e.g. software tunnels).
+In ndo_start_xmit, it is recommended to use a try_lock and return
+NETDEV_TX_LOCKED when the spin lock fails.  The locking should also properly
+protect against other callbacks (the rules you need to find out).
+
+Don't use it for new drivers.
+
+ * netns-local device
+
+NETIF_F_NETNS_LOCAL is set for devices that are not allowed to move between
+network namespaces (e.g. loopback).
+
+Don't use it in drivers.
+
+ * VLAN challenged
+
+NETIF_F_VLAN_CHALLENGED should be set for devices which can't cope with VLAN
+headers. Some drivers set this because the cards can't handle the bigger MTU.
+[FIXME: Those cases could be fixed in VLAN code by allowing only reduced-MTU
+VLANs. This may be not useful, though.]
diff --git a/Documentation/networking/nfc.txt b/Documentation/networking/nfc.txt
new file mode 100644 (file)
index 0000000..b24c29b
--- /dev/null
@@ -0,0 +1,128 @@
+Linux NFC subsystem
+===================
+
+The Near Field Communication (NFC) subsystem is required to standardize the
+NFC device drivers development and to create an unified userspace interface.
+
+This document covers the architecture overview, the device driver interface
+description and the userspace interface description.
+
+Architecture overview
+---------------------
+
+The NFC subsystem is responsible for:
+      - NFC adapters management;
+      - Polling for targets;
+      - Low-level data exchange;
+
+The subsystem is divided in some parts. The 'core' is responsible for
+providing the device driver interface. On the other side, it is also
+responsible for providing an interface to control operations and low-level
+data exchange.
+
+The control operations are available to userspace via generic netlink.
+
+The low-level data exchange interface is provided by the new socket family
+PF_NFC. The NFC_SOCKPROTO_RAW performs raw communication with NFC targets.
+
+
+             +--------------------------------------+
+             |              USER SPACE              |
+             +--------------------------------------+
+                 ^                       ^
+                 | low-level             | control
+                 | data exchange         | operations
+                 |                       |
+                 |                       v
+                 |                  +-----------+
+                 | AF_NFC           |  netlink  |
+                 | socket           +-----------+
+                 | raw                   ^
+                 |                       |
+                 v                       v
+             +---------+            +-----------+
+             | rawsock | <--------> |   core    |
+             +---------+            +-----------+
+                                         ^
+                                         |
+                                         v
+                                    +-----------+
+                                    |  driver   |
+                                    +-----------+
+
+Device Driver Interface
+-----------------------
+
+When registering on the NFC subsystem, the device driver must inform the core
+of the set of supported NFC protocols and the set of ops callbacks. The ops
+callbacks that must be implemented are the following:
+
+* start_poll - setup the device to poll for targets
+* stop_poll - stop on progress polling operation
+* activate_target - select and initialize one of the targets found
+* deactivate_target - deselect and deinitialize the selected target
+* data_exchange - send data and receive the response (transceive operation)
+
+Userspace interface
+--------------------
+
+The userspace interface is divided in control operations and low-level data
+exchange operation.
+
+CONTROL OPERATIONS:
+
+Generic netlink is used to implement the interface to the control operations.
+The operations are composed by commands and events, all listed below:
+
+* NFC_CMD_GET_DEVICE - get specific device info or dump the device list
+* NFC_CMD_START_POLL - setup a specific device to polling for targets
+* NFC_CMD_STOP_POLL - stop the polling operation in a specific device
+* NFC_CMD_GET_TARGET - dump the list of targets found by a specific device
+
+* NFC_EVENT_DEVICE_ADDED - reports an NFC device addition
+* NFC_EVENT_DEVICE_REMOVED - reports an NFC device removal
+* NFC_EVENT_TARGETS_FOUND - reports START_POLL results when 1 or more targets
+are found
+
+The user must call START_POLL to poll for NFC targets, passing the desired NFC
+protocols through NFC_ATTR_PROTOCOLS attribute. The device remains in polling
+state until it finds any target. However, the user can stop the polling
+operation by calling STOP_POLL command. In this case, it will be checked if
+the requester of STOP_POLL is the same of START_POLL.
+
+If the polling operation finds one or more targets, the event TARGETS_FOUND is
+sent (including the device id). The user must call GET_TARGET to get the list of
+all targets found by such device. Each reply message has target attributes with
+relevant information such as the supported NFC protocols.
+
+All polling operations requested through one netlink socket are stopped when
+it's closed.
+
+LOW-LEVEL DATA EXCHANGE:
+
+The userspace must use PF_NFC sockets to perform any data communication with
+targets. All NFC sockets use AF_NFC:
+
+struct sockaddr_nfc {
+       sa_family_t sa_family;
+       __u32 dev_idx;
+       __u32 target_idx;
+       __u32 nfc_protocol;
+};
+
+To establish a connection with one target, the user must create an
+NFC_SOCKPROTO_RAW socket and call the 'connect' syscall with the sockaddr_nfc
+struct correctly filled. All information comes from NFC_EVENT_TARGETS_FOUND
+netlink event. As a target can support more than one NFC protocol, the user
+must inform which protocol it wants to use.
+
+Internally, 'connect' will result in an activate_target call to the driver.
+When the socket is closed, the target is deactivated.
+
+The data format exchanged through the sockets is NFC protocol dependent. For
+instance, when communicating with MIFARE tags, the data exchanged are MIFARE
+commands and their responses.
+
+The first received package is the response to the first sent package and so
+on. In order to allow valid "empty" responses, every data received has a NULL
+header of 1 byte.
index 187282d..7a9569e 100644 (file)
@@ -4289,8 +4289,8 @@ S:        Maintained
 F:     drivers/usb/musb/
 
 MYRICOM MYRI-10G 10GbE DRIVER (MYRI10GE)
+M:     Jon Mason <mason@myri.com>
 M:     Andrew Gallatin <gallatin@myri.com>
-M:     Brice Goglin <brice@myri.com>
 L:     netdev@vger.kernel.org
 W:     http://www.myri.com/scs/download-Myri10GE.html
 S:     Supported
index 606a6f2..5f5d783 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/spi/spi.h>
 #include <linux/spi/flash.h>
 
+#include <asm/io.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <mach/common.h>
index 1e0f809..e00d61e 100644 (file)
@@ -8,6 +8,7 @@
  * is licensed "as is" without any warranty of any kind, whether express
  * or implied.
  */
+#include <linux/dma-mapping.h>
 #include <linux/init.h>
 #include <linux/clk.h>
 #include <linux/serial_8250.h>
index 1bd73a0..04c49f7 100644 (file)
@@ -17,6 +17,7 @@
 
 #include <asm/cacheflush.h>
 #include <asm/delay.h>
+#include <asm/io.h>
 
 #include <mach/da8xx.h>
 #include <mach/sram.h>
index 236f149..f8aa5be 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/init.h>
 #include <linux/kernel.h>
 #include <linux/interrupt.h>
+#include <linux/err.h>
 #include <linux/errno.h>
 #include <linux/clk.h>
 #include <linux/scatterlist.h>
index 9b98244..b5ecc26 100644 (file)
@@ -13,6 +13,7 @@
  */
 
 #include <linux/delay.h>
+#include <linux/dma-mapping.h>
 #include <linux/types.h>
 #include <linux/init.h>
 #include <linux/clk.h>
index 5c147fb..a5b9897 100644 (file)
@@ -17,6 +17,7 @@
  *
  */
 
+#include <linux/dma-mapping.h>
 #include <linux/serial_8250.h>
 #include <linux/io.h>
 #ifdef CONFIG_MTD_PHYSMAP
index 796606c..27608f5 100644 (file)
@@ -6,6 +6,7 @@
  * the terms of the GNU General Public License version 2 as published by the
  * Free Software Foundation.
  */
+#include <linux/dma-mapping.h>
 #include <asm/sizes.h>
 #include <mach/mx23.h>
 #include <mach/mx28.h>
index 295c442..6a0202b 100644 (file)
@@ -6,6 +6,7 @@
  * Free Software Foundation.
  */
 #include <linux/compiler.h>
+#include <linux/dma-mapping.h>
 #include <linux/err.h>
 #include <linux/init.h>
 
index 9859cf2..ae96a4f 100644 (file)
@@ -6,6 +6,7 @@
  * the terms of the GNU General Public License version 2 as published by the
  * Free Software Foundation.
  */
+#include <linux/dma-mapping.h>
 #include <asm/sizes.h>
 #include <mach/mx28.h>
 #include <mach/devices-common.h>
index ccc789e..4fc6ffc 100644 (file)
@@ -6,6 +6,7 @@
  * the terms of the GNU General Public License version 2 as published by the
  * Free Software Foundation.
  */
+#include <linux/dma-mapping.h>
 #include <asm/sizes.h>
 #include <mach/hardware.h>
 #include <mach/devices-common.h>
index 59c33f6..23ce08e 100644 (file)
@@ -6,6 +6,7 @@
  * the terms of the GNU General Public License version 2 as published by the
  * Free Software Foundation.
  */
+#include <linux/dma-mapping.h>
 #include <mach/hardware.h>
 #include <mach/devices-common.h>
 
index 79a1cb1..2b0b5e0 100644 (file)
@@ -6,6 +6,7 @@
  * the terms of the GNU General Public License version 2 as published by the
  * Free Software Foundation.
  */
+#include <linux/dma-mapping.h>
 #include <mach/hardware.h>
 #include <mach/devices-common.h>
 
index edf6503..79d340a 100644 (file)
@@ -6,6 +6,7 @@
  * the terms of the GNU General Public License version 2 as published by the
  * Free Software Foundation.
  */
+#include <linux/dma-mapping.h>
 #include <mach/hardware.h>
 #include <mach/devices-common.h>
 
index cc488f4..e1763e0 100644 (file)
@@ -6,6 +6,7 @@
  * the terms of the GNU General Public License version 2 as published by the
  * Free Software Foundation.
  */
+#include <linux/dma-mapping.h>
 #include <mach/hardware.h>
 #include <mach/devices-common.h>
 
index 90d762f..540d3a7 100644 (file)
@@ -6,6 +6,7 @@
  * the terms of the GNU General Public License version 2 as published by the
  * Free Software Foundation.
  */
+#include <linux/dma-mapping.h>
 #include <mach/hardware.h>
 #include <mach/devices-common.h>
 
index c448860..685c787 100644 (file)
@@ -10,6 +10,7 @@
 #define STE_DMA40_H
 
 #include <linux/dmaengine.h>
+#include <linux/scatterlist.h>
 #include <linux/workqueue.h>
 #include <linux/interrupt.h>
 
index 8b6e201..c5748bb 100644 (file)
@@ -16,6 +16,7 @@
 
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
+#include <linux/interrupt.h>
 #include <linux/module.h>
 #include <asm/natfeat.h>
 #include <asm/virtconvert.h>
@@ -204,7 +205,6 @@ static struct net_device * __init nfeth_probe(int unit)
        dev->irq = nfEtherIRQ;
        dev->netdev_ops = &nfeth_netdev_ops;
 
-       dev->flags |= NETIF_F_NO_CSUM;
        memcpy(dev->dev_addr, mac, ETH_ALEN);
 
        priv = netdev_priv(dev);
index 2729c66..39860fc 100644 (file)
@@ -134,6 +134,7 @@ config PPC
        select GENERIC_IRQ_SHOW_LEVEL
        select HAVE_RCU_TABLE_FREE if SMP
        select HAVE_SYSCALL_TRACEPOINTS
+       select HAVE_BPF_JIT if PPC64
 
 config EARLY_PRINTK
        bool
index b7212b6..b94740f 100644 (file)
@@ -154,7 +154,8 @@ core-y                              += arch/powerpc/kernel/ \
                                   arch/powerpc/lib/ \
                                   arch/powerpc/sysdev/ \
                                   arch/powerpc/platforms/ \
-                                  arch/powerpc/math-emu/
+                                  arch/powerpc/math-emu/ \
+                                  arch/powerpc/net/
 core-$(CONFIG_XMON)            += arch/powerpc/xmon/
 core-$(CONFIG_KVM)             += arch/powerpc/kvm/
 
index e472659..e980faa 100644 (file)
 #define PPC_INST_ERATSX                        0x7c000126
 #define PPC_INST_ERATSX_DOT            0x7c000127
 
+/* Misc instructions for BPF compiler */
+#define PPC_INST_LD                    0xe8000000
+#define PPC_INST_LHZ                   0xa0000000
+#define PPC_INST_LWZ                   0x80000000
+#define PPC_INST_STD                   0xf8000000
+#define PPC_INST_STDU                  0xf8000001
+#define PPC_INST_MFLR                  0x7c0802a6
+#define PPC_INST_MTLR                  0x7c0803a6
+#define PPC_INST_CMPWI                 0x2c000000
+#define PPC_INST_CMPDI                 0x2c200000
+#define PPC_INST_CMPLW                 0x7c000040
+#define PPC_INST_CMPLWI                        0x28000000
+#define PPC_INST_ADDI                  0x38000000
+#define PPC_INST_ADDIS                 0x3c000000
+#define PPC_INST_ADD                   0x7c000214
+#define PPC_INST_SUB                   0x7c000050
+#define PPC_INST_BLR                   0x4e800020
+#define PPC_INST_BLRL                  0x4e800021
+#define PPC_INST_MULLW                 0x7c0001d6
+#define PPC_INST_MULHWU                        0x7c000016
+#define PPC_INST_MULLI                 0x1c000000
+#define PPC_INST_DIVWU                 0x7c0003d6
+#define PPC_INST_RLWINM                        0x54000000
+#define PPC_INST_RLDICR                        0x78000004
+#define PPC_INST_SLW                   0x7c000030
+#define PPC_INST_SRW                   0x7c000430
+#define PPC_INST_AND                   0x7c000038
+#define PPC_INST_ANDDOT                        0x7c000039
+#define PPC_INST_OR                    0x7c000378
+#define PPC_INST_ANDI                  0x70000000
+#define PPC_INST_ORI                   0x60000000
+#define PPC_INST_ORIS                  0x64000000
+#define PPC_INST_NEG                   0x7c0000d0
+#define PPC_INST_BRANCH                        0x48000000
+#define PPC_INST_BRANCH_COND           0x40800000
+
 /* macros to insert fields into opcodes */
 #define __PPC_RA(a)    (((a) & 0x1f) << 16)
 #define __PPC_RB(b)    (((b) & 0x1f) << 11)
 #define __PPC_T_TLB(t) (((t) & 0x3) << 21)
 #define __PPC_WC(w)    (((w) & 0x3) << 21)
 #define __PPC_WS(w)    (((w) & 0x1f) << 11)
+#define __PPC_SH(s)    __PPC_WS(s)
+#define __PPC_MB(s)    (((s) & 0x1f) << 6)
+#define __PPC_ME(s)    (((s) & 0x1f) << 1)
+#define __PPC_BI(s)    (((s) & 0x1f) << 16)
 
 /*
  * Only use the larx hint bit on 64bit CPUs. e500v1/v2 based CPUs will treat a
diff --git a/arch/powerpc/net/Makefile b/arch/powerpc/net/Makefile
new file mode 100644 (file)
index 0000000..266b395
--- /dev/null
@@ -0,0 +1,4 @@
+#
+# Arch-specific network modules
+#
+obj-$(CONFIG_BPF_JIT) += bpf_jit_64.o bpf_jit_comp.o
diff --git a/arch/powerpc/net/bpf_jit.h b/arch/powerpc/net/bpf_jit.h
new file mode 100644 (file)
index 0000000..af1ab5e
--- /dev/null
@@ -0,0 +1,227 @@
+/* bpf_jit.h: BPF JIT compiler for PPC64
+ *
+ * Copyright 2011 Matt Evans <matt@ozlabs.org>, IBM Corporation
+ *
+ * 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 the Free Software Foundation; version 2
+ * of the License.
+ */
+#ifndef _BPF_JIT_H
+#define _BPF_JIT_H
+
+#define BPF_PPC_STACK_LOCALS   32
+#define BPF_PPC_STACK_BASIC    (48+64)
+#define BPF_PPC_STACK_SAVE     (18*8)
+#define BPF_PPC_STACKFRAME     (BPF_PPC_STACK_BASIC+BPF_PPC_STACK_LOCALS+ \
+                                BPF_PPC_STACK_SAVE)
+#define BPF_PPC_SLOWPATH_FRAME (48+64)
+
+/*
+ * Generated code register usage:
+ *
+ * As normal PPC C ABI (e.g. r1=sp, r2=TOC), with:
+ *
+ * skb         r3      (Entry parameter)
+ * A register  r4
+ * X register  r5
+ * addr param  r6
+ * r7-r10      scratch
+ * skb->data   r14
+ * skb headlen r15     (skb->len - skb->data_len)
+ * m[0]                r16
+ * m[...]      ...
+ * m[15]       r31
+ */
+#define r_skb          3
+#define r_ret          3
+#define r_A            4
+#define r_X            5
+#define r_addr         6
+#define r_scratch1     7
+#define r_D            14
+#define r_HL           15
+#define r_M            16
+
+#ifndef __ASSEMBLY__
+
+/*
+ * Assembly helpers from arch/powerpc/net/bpf_jit.S:
+ */
+extern u8 sk_load_word[], sk_load_half[], sk_load_byte[], sk_load_byte_msh[];
+
+#define FUNCTION_DESCR_SIZE    24
+
+/*
+ * 16-bit immediate helper macros: HA() is for use with sign-extending instrs
+ * (e.g. LD, ADDI).  If the bottom 16 bits is "-ve", add another bit into the
+ * top half to negate the effect (i.e. 0xffff + 1 = 0x(1)0000).
+ */
+#define IMM_H(i)               ((uintptr_t)(i)>>16)
+#define IMM_HA(i)              (((uintptr_t)(i)>>16) +                       \
+                                (((uintptr_t)(i) & 0x8000) >> 15))
+#define IMM_L(i)               ((uintptr_t)(i) & 0xffff)
+
+#define PLANT_INSTR(d, idx, instr)                                           \
+       do { if (d) { (d)[idx] = instr; } idx++; } while (0)
+#define EMIT(instr)            PLANT_INSTR(image, ctx->idx, instr)
+
+#define PPC_NOP()              EMIT(PPC_INST_NOP)
+#define PPC_BLR()              EMIT(PPC_INST_BLR)
+#define PPC_BLRL()             EMIT(PPC_INST_BLRL)
+#define PPC_MTLR(r)            EMIT(PPC_INST_MTLR | __PPC_RT(r))
+#define PPC_ADDI(d, a, i)      EMIT(PPC_INST_ADDI | __PPC_RT(d) |            \
+                                    __PPC_RA(a) | IMM_L(i))
+#define PPC_MR(d, a)           PPC_OR(d, a, a)
+#define PPC_LI(r, i)           PPC_ADDI(r, 0, i)
+#define PPC_ADDIS(d, a, i)     EMIT(PPC_INST_ADDIS |                         \
+                                    __PPC_RS(d) | __PPC_RA(a) | IMM_L(i))
+#define PPC_LIS(r, i)          PPC_ADDIS(r, 0, i)
+#define PPC_STD(r, base, i)    EMIT(PPC_INST_STD | __PPC_RS(r) |             \
+                                    __PPC_RA(base) | ((i) & 0xfffc))
+
+#define PPC_LD(r, base, i)     EMIT(PPC_INST_LD | __PPC_RT(r) |              \
+                                    __PPC_RA(base) | IMM_L(i))
+#define PPC_LWZ(r, base, i)    EMIT(PPC_INST_LWZ | __PPC_RT(r) |             \
+                                    __PPC_RA(base) | IMM_L(i))
+#define PPC_LHZ(r, base, i)    EMIT(PPC_INST_LHZ | __PPC_RT(r) |             \
+                                    __PPC_RA(base) | IMM_L(i))
+/* Convenience helpers for the above with 'far' offsets: */
+#define PPC_LD_OFFS(r, base, i) do { if ((i) < 32768) PPC_LD(r, base, i);     \
+               else {  PPC_ADDIS(r, base, IMM_HA(i));                        \
+                       PPC_LD(r, r, IMM_L(i)); } } while(0)
+
+#define PPC_LWZ_OFFS(r, base, i) do { if ((i) < 32768) PPC_LWZ(r, base, i);   \
+               else {  PPC_ADDIS(r, base, IMM_HA(i));                        \
+                       PPC_LWZ(r, r, IMM_L(i)); } } while(0)
+
+#define PPC_LHZ_OFFS(r, base, i) do { if ((i) < 32768) PPC_LHZ(r, base, i);   \
+               else {  PPC_ADDIS(r, base, IMM_HA(i));                        \
+                       PPC_LHZ(r, r, IMM_L(i)); } } while(0)
+
+#define PPC_CMPWI(a, i)                EMIT(PPC_INST_CMPWI | __PPC_RA(a) | IMM_L(i))
+#define PPC_CMPDI(a, i)                EMIT(PPC_INST_CMPDI | __PPC_RA(a) | IMM_L(i))
+#define PPC_CMPLWI(a, i)       EMIT(PPC_INST_CMPLWI | __PPC_RA(a) | IMM_L(i))
+#define PPC_CMPLW(a, b)                EMIT(PPC_INST_CMPLW | __PPC_RA(a) | __PPC_RB(b))
+
+#define PPC_SUB(d, a, b)       EMIT(PPC_INST_SUB | __PPC_RT(d) |             \
+                                    __PPC_RB(a) | __PPC_RA(b))
+#define PPC_ADD(d, a, b)       EMIT(PPC_INST_ADD | __PPC_RT(d) |             \
+                                    __PPC_RA(a) | __PPC_RB(b))
+#define PPC_MUL(d, a, b)       EMIT(PPC_INST_MULLW | __PPC_RT(d) |           \
+                                    __PPC_RA(a) | __PPC_RB(b))
+#define PPC_MULHWU(d, a, b)    EMIT(PPC_INST_MULHWU | __PPC_RT(d) |          \
+                                    __PPC_RA(a) | __PPC_RB(b))
+#define PPC_MULI(d, a, i)      EMIT(PPC_INST_MULLI | __PPC_RT(d) |           \
+                                    __PPC_RA(a) | IMM_L(i))
+#define PPC_DIVWU(d, a, b)     EMIT(PPC_INST_DIVWU | __PPC_RT(d) |           \
+                                    __PPC_RA(a) | __PPC_RB(b))
+#define PPC_AND(d, a, b)       EMIT(PPC_INST_AND | __PPC_RA(d) |             \
+                                    __PPC_RS(a) | __PPC_RB(b))
+#define PPC_ANDI(d, a, i)      EMIT(PPC_INST_ANDI | __PPC_RA(d) |            \
+                                    __PPC_RS(a) | IMM_L(i))
+#define PPC_AND_DOT(d, a, b)   EMIT(PPC_INST_ANDDOT | __PPC_RA(d) |          \
+                                    __PPC_RS(a) | __PPC_RB(b))
+#define PPC_OR(d, a, b)                EMIT(PPC_INST_OR | __PPC_RA(d) |              \
+                                    __PPC_RS(a) | __PPC_RB(b))
+#define PPC_ORI(d, a, i)       EMIT(PPC_INST_ORI | __PPC_RA(d) |             \
+                                    __PPC_RS(a) | IMM_L(i))
+#define PPC_ORIS(d, a, i)      EMIT(PPC_INST_ORIS | __PPC_RA(d) |            \
+                                    __PPC_RS(a) | IMM_L(i))
+#define PPC_SLW(d, a, s)       EMIT(PPC_INST_SLW | __PPC_RA(d) |             \
+                                    __PPC_RS(a) | __PPC_RB(s))
+#define PPC_SRW(d, a, s)       EMIT(PPC_INST_SRW | __PPC_RA(d) |             \
+                                    __PPC_RS(a) | __PPC_RB(s))
+/* slwi = rlwinm Rx, Ry, n, 0, 31-n */
+#define PPC_SLWI(d, a, i)      EMIT(PPC_INST_RLWINM | __PPC_RA(d) |          \
+                                    __PPC_RS(a) | __PPC_SH(i) |              \
+                                    __PPC_MB(0) | __PPC_ME(31-(i)))
+/* srwi = rlwinm Rx, Ry, 32-n, n, 31 */
+#define PPC_SRWI(d, a, i)      EMIT(PPC_INST_RLWINM | __PPC_RA(d) |          \
+                                    __PPC_RS(a) | __PPC_SH(32-(i)) |         \
+                                    __PPC_MB(i) | __PPC_ME(31))
+/* sldi = rldicr Rx, Ry, n, 63-n */
+#define PPC_SLDI(d, a, i)      EMIT(PPC_INST_RLDICR | __PPC_RA(d) |          \
+                                    __PPC_RS(a) | __PPC_SH(i) |              \
+                                    __PPC_MB(63-(i)) | (((i) & 0x20) >> 4))
+#define PPC_NEG(d, a)          EMIT(PPC_INST_NEG | __PPC_RT(d) | __PPC_RA(a))
+
+/* Long jump; (unconditional 'branch') */
+#define PPC_JMP(dest)          EMIT(PPC_INST_BRANCH |                        \
+                                    (((dest) - (ctx->idx * 4)) & 0x03fffffc))
+/* "cond" here covers BO:BI fields. */
+#define PPC_BCC_SHORT(cond, dest)      EMIT(PPC_INST_BRANCH_COND |           \
+                                            (((cond) & 0x3ff) << 16) |       \
+                                            (((dest) - (ctx->idx * 4)) &     \
+                                             0xfffc))
+#define PPC_LI32(d, i)         do { PPC_LI(d, IMM_L(i));                     \
+               if ((u32)(uintptr_t)(i) >= 32768) {                           \
+                       PPC_ADDIS(d, d, IMM_HA(i));                           \
+               } } while(0)
+#define PPC_LI64(d, i)         do {                                          \
+               if (!((uintptr_t)(i) & 0xffffffff00000000ULL))                \
+                       PPC_LI32(d, i);                                       \
+               else {                                                        \
+                       PPC_LIS(d, ((uintptr_t)(i) >> 48));                   \
+                       if ((uintptr_t)(i) & 0x0000ffff00000000ULL)           \
+                               PPC_ORI(d, d,                                 \
+                                       ((uintptr_t)(i) >> 32) & 0xffff);     \
+                       PPC_SLDI(d, d, 32);                                   \
+                       if ((uintptr_t)(i) & 0x00000000ffff0000ULL)           \
+                               PPC_ORIS(d, d,                                \
+                                        ((uintptr_t)(i) >> 16) & 0xffff);    \
+                       if ((uintptr_t)(i) & 0x000000000000ffffULL)           \
+                               PPC_ORI(d, d, (uintptr_t)(i) & 0xffff);       \
+               } } while (0);
+
+static inline bool is_nearbranch(int offset)
+{
+       return (offset < 32768) && (offset >= -32768);
+}
+
+/*
+ * The fly in the ointment of code size changing from pass to pass is
+ * avoided by padding the short branch case with a NOP.         If code size differs
+ * with different branch reaches we will have the issue of code moving from
+ * one pass to the next and will need a few passes to converge on a stable
+ * state.
+ */
+#define PPC_BCC(cond, dest)    do {                                          \
+               if (is_nearbranch((dest) - (ctx->idx * 4))) {                 \
+                       PPC_BCC_SHORT(cond, dest);                            \
+                       PPC_NOP();                                            \
+               } else {                                                      \
+                       /* Flip the 'T or F' bit to invert comparison */      \
+                       PPC_BCC_SHORT(cond ^ COND_CMP_TRUE, (ctx->idx+2)*4);  \
+                       PPC_JMP(dest);                                        \
+               } } while(0)
+
+/* To create a branch condition, select a bit of cr0... */
+#define CR0_LT         0
+#define CR0_GT         1
+#define CR0_EQ         2
+/* ...and modify BO[3] */
+#define COND_CMP_TRUE  0x100
+#define COND_CMP_FALSE 0x000
+/* Together, they make all required comparisons: */
+#define COND_GT                (CR0_GT | COND_CMP_TRUE)
+#define COND_GE                (CR0_LT | COND_CMP_FALSE)
+#define COND_EQ                (CR0_EQ | COND_CMP_TRUE)
+#define COND_NE                (CR0_EQ | COND_CMP_FALSE)
+#define COND_LT                (CR0_LT | COND_CMP_TRUE)
+
+#define SEEN_DATAREF 0x10000 /* might call external helpers */
+#define SEEN_XREG    0x20000 /* X reg is used */
+#define SEEN_MEM     0x40000 /* SEEN_MEM+(1<<n) = use mem[n] for temporary
+                             * storage */
+#define SEEN_MEM_MSK 0x0ffff
+
+struct codegen_context {
+       unsigned int seen;
+       unsigned int idx;
+       int pc_ret0; /* bpf index of first RET #0 instruction (if any) */
+};
+
+#endif
+
+#endif
diff --git a/arch/powerpc/net/bpf_jit_64.S b/arch/powerpc/net/bpf_jit_64.S
new file mode 100644 (file)
index 0000000..ff4506e
--- /dev/null
@@ -0,0 +1,138 @@
+/* bpf_jit.S: Packet/header access helper functions
+ * for PPC64 BPF compiler.
+ *
+ * Copyright 2011 Matt Evans <matt@ozlabs.org>, IBM Corporation
+ *
+ * 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 the Free Software Foundation; version 2
+ * of the License.
+ */
+
+#include <asm/ppc_asm.h>
+#include "bpf_jit.h"
+
+/*
+ * All of these routines are called directly from generated code,
+ * whose register usage is:
+ *
+ * r3          skb
+ * r4,r5       A,X
+ * r6          *** address parameter to helper ***
+ * r7-r10      scratch
+ * r14         skb->data
+ * r15         skb headlen
+ * r16-31      M[]
+ */
+
+/*
+ * To consider: These helpers are so small it could be better to just
+ * generate them inline.  Inline code can do the simple headlen check
+ * then branch directly to slow_path_XXX if required.  (In fact, could
+ * load a spare GPR with the address of slow_path_generic and pass size
+ * as an argument, making the call site a mtlr, li and bllr.)
+ *
+ * Technically, the "is addr < 0" check is unnecessary & slowing down
+ * the ABS path, as it's statically checked on generation.
+ */
+       .globl  sk_load_word
+sk_load_word:
+       cmpdi   r_addr, 0
+       blt     bpf_error
+       /* Are we accessing past headlen? */
+       subi    r_scratch1, r_HL, 4
+       cmpd    r_scratch1, r_addr
+       blt     bpf_slow_path_word
+       /* Nope, just hitting the header.  cr0 here is eq or gt! */
+       lwzx    r_A, r_D, r_addr
+       /* When big endian we don't need to byteswap. */
+       blr     /* Return success, cr0 != LT */
+
+       .globl  sk_load_half
+sk_load_half:
+       cmpdi   r_addr, 0
+       blt     bpf_error
+       subi    r_scratch1, r_HL, 2
+       cmpd    r_scratch1, r_addr
+       blt     bpf_slow_path_half
+       lhzx    r_A, r_D, r_addr
+       blr
+
+       .globl  sk_load_byte
+sk_load_byte:
+       cmpdi   r_addr, 0
+       blt     bpf_error
+       cmpd    r_HL, r_addr
+       ble     bpf_slow_path_byte
+       lbzx    r_A, r_D, r_addr
+       blr
+
+/*
+ * BPF_S_LDX_B_MSH: ldxb  4*([offset]&0xf)
+ * r_addr is the offset value, already known positive
+ */
+       .globl sk_load_byte_msh
+sk_load_byte_msh:
+       cmpd    r_HL, r_addr
+       ble     bpf_slow_path_byte_msh
+       lbzx    r_X, r_D, r_addr
+       rlwinm  r_X, r_X, 2, 32-4-2, 31-2
+       blr
+
+bpf_error:
+       /* Entered with cr0 = lt */
+       li      r3, 0
+       /* Generated code will 'blt epilogue', returning 0. */
+       blr
+
+/* Call out to skb_copy_bits:
+ * We'll need to back up our volatile regs first; we have
+ * local variable space at r1+(BPF_PPC_STACK_BASIC).
+ * Allocate a new stack frame here to remain ABI-compliant in
+ * stashing LR.
+ */
+#define bpf_slow_path_common(SIZE)                             \
+       mflr    r0;                                             \
+       std     r0, 16(r1);                                     \
+       /* R3 goes in parameter space of caller's frame */      \
+       std     r_skb, (BPF_PPC_STACKFRAME+48)(r1);             \
+       std     r_A, (BPF_PPC_STACK_BASIC+(0*8))(r1);           \
+       std     r_X, (BPF_PPC_STACK_BASIC+(1*8))(r1);           \
+       addi    r5, r1, BPF_PPC_STACK_BASIC+(2*8);              \
+       stdu    r1, -BPF_PPC_SLOWPATH_FRAME(r1);                \
+       /* R3 = r_skb, as passed */                             \
+       mr      r4, r_addr;                                     \
+       li      r6, SIZE;                                       \
+       bl      skb_copy_bits;                                  \
+       /* R3 = 0 on success */                                 \
+       addi    r1, r1, BPF_PPC_SLOWPATH_FRAME;                 \
+       ld      r0, 16(r1);                                     \
+       ld      r_A, (BPF_PPC_STACK_BASIC+(0*8))(r1);           \
+       ld      r_X, (BPF_PPC_STACK_BASIC+(1*8))(r1);           \
+       mtlr    r0;                                             \
+       cmpdi   r3, 0;                                          \
+       blt     bpf_error;      /* cr0 = LT */                  \
+       ld      r_skb, (BPF_PPC_STACKFRAME+48)(r1);             \
+       /* Great success! */
+
+bpf_slow_path_word:
+       bpf_slow_path_common(4)
+       /* Data value is on stack, and cr0 != LT */
+       lwz     r_A, BPF_PPC_STACK_BASIC+(2*8)(r1)
+       blr
+
+bpf_slow_path_half:
+       bpf_slow_path_common(2)
+       lhz     r_A, BPF_PPC_STACK_BASIC+(2*8)(r1)
+       blr
+
+bpf_slow_path_byte:
+       bpf_slow_path_common(1)
+       lbz     r_A, BPF_PPC_STACK_BASIC+(2*8)(r1)
+       blr
+
+bpf_slow_path_byte_msh:
+       bpf_slow_path_common(1)
+       lbz     r_X, BPF_PPC_STACK_BASIC+(2*8)(r1)
+       rlwinm  r_X, r_X, 2, 32-4-2, 31-2
+       blr
diff --git a/arch/powerpc/net/bpf_jit_comp.c b/arch/powerpc/net/bpf_jit_comp.c
new file mode 100644 (file)
index 0000000..73619d3
--- /dev/null
@@ -0,0 +1,694 @@
+/* bpf_jit_comp.c: BPF JIT compiler for PPC64
+ *
+ * Copyright 2011 Matt Evans <matt@ozlabs.org>, IBM Corporation
+ *
+ * Based on the x86 BPF compiler, by Eric Dumazet (eric.dumazet@gmail.com)
+ *
+ * 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 the Free Software Foundation; version 2
+ * of the License.
+ */
+#include <linux/moduleloader.h>
+#include <asm/cacheflush.h>
+#include <linux/netdevice.h>
+#include <linux/filter.h>
+#include "bpf_jit.h"
+
+#ifndef __BIG_ENDIAN
+/* There are endianness assumptions herein. */
+#error "Little-endian PPC not supported in BPF compiler"
+#endif
+
+int bpf_jit_enable __read_mostly;
+
+
+static inline void bpf_flush_icache(void *start, void *end)
+{
+       smp_wmb();
+       flush_icache_range((unsigned long)start, (unsigned long)end);
+}
+
+static void bpf_jit_build_prologue(struct sk_filter *fp, u32 *image,
+                                  struct codegen_context *ctx)
+{
+       int i;
+       const struct sock_filter *filter = fp->insns;
+
+       if (ctx->seen & (SEEN_MEM | SEEN_DATAREF)) {
+               /* Make stackframe */
+               if (ctx->seen & SEEN_DATAREF) {
+                       /* If we call any helpers (for loads), save LR */
+                       EMIT(PPC_INST_MFLR | __PPC_RT(0));
+                       PPC_STD(0, 1, 16);
+
+                       /* Back up non-volatile regs. */
+                       PPC_STD(r_D, 1, -(8*(32-r_D)));
+                       PPC_STD(r_HL, 1, -(8*(32-r_HL)));
+               }
+               if (ctx->seen & SEEN_MEM) {
+                       /*
+                        * Conditionally save regs r15-r31 as some will be used
+                        * for M[] data.
+                        */
+                       for (i = r_M; i < (r_M+16); i++) {
+                               if (ctx->seen & (1 << (i-r_M)))
+                                       PPC_STD(i, 1, -(8*(32-i)));
+                       }
+               }
+               EMIT(PPC_INST_STDU | __PPC_RS(1) | __PPC_RA(1) |
+                    (-BPF_PPC_STACKFRAME & 0xfffc));
+       }
+
+       if (ctx->seen & SEEN_DATAREF) {
+               /*
+                * If this filter needs to access skb data,
+                * prepare r_D and r_HL:
+                *  r_HL = skb->len - skb->data_len
+                *  r_D  = skb->data
+                */
+               PPC_LWZ_OFFS(r_scratch1, r_skb, offsetof(struct sk_buff,
+                                                        data_len));
+               PPC_LWZ_OFFS(r_HL, r_skb, offsetof(struct sk_buff, len));
+               PPC_SUB(r_HL, r_HL, r_scratch1);
+               PPC_LD_OFFS(r_D, r_skb, offsetof(struct sk_buff, data));
+       }
+
+       if (ctx->seen & SEEN_XREG) {
+               /*
+                * TODO: Could also detect whether first instr. sets X and
+                * avoid this (as below, with A).
+                */
+               PPC_LI(r_X, 0);
+       }
+
+       switch (filter[0].code) {
+       case BPF_S_RET_K:
+       case BPF_S_LD_W_LEN:
+       case BPF_S_ANC_PROTOCOL:
+       case BPF_S_ANC_IFINDEX:
+       case BPF_S_ANC_MARK:
+       case BPF_S_ANC_RXHASH:
+       case BPF_S_ANC_CPU:
+       case BPF_S_ANC_QUEUE:
+       case BPF_S_LD_W_ABS:
+       case BPF_S_LD_H_ABS:
+       case BPF_S_LD_B_ABS:
+               /* first instruction sets A register (or is RET 'constant') */
+               break;
+       default:
+               /* make sure we dont leak kernel information to user */
+               PPC_LI(r_A, 0);
+       }
+}
+
+static void bpf_jit_build_epilogue(u32 *image, struct codegen_context *ctx)
+{
+       int i;
+
+       if (ctx->seen & (SEEN_MEM | SEEN_DATAREF)) {
+               PPC_ADDI(1, 1, BPF_PPC_STACKFRAME);
+               if (ctx->seen & SEEN_DATAREF) {
+                       PPC_LD(0, 1, 16);
+                       PPC_MTLR(0);
+                       PPC_LD(r_D, 1, -(8*(32-r_D)));
+                       PPC_LD(r_HL, 1, -(8*(32-r_HL)));
+               }
+               if (ctx->seen & SEEN_MEM) {
+                       /* Restore any saved non-vol registers */
+                       for (i = r_M; i < (r_M+16); i++) {
+                               if (ctx->seen & (1 << (i-r_M)))
+                                       PPC_LD(i, 1, -(8*(32-i)));
+                       }
+               }
+       }
+       /* The RETs have left a return value in R3. */
+
+       PPC_BLR();
+}
+
+/* Assemble the body code between the prologue & epilogue. */
+static int bpf_jit_build_body(struct sk_filter *fp, u32 *image,
+                             struct codegen_context *ctx,
+                             unsigned int *addrs)
+{
+       const struct sock_filter *filter = fp->insns;
+       int flen = fp->len;
+       u8 *func;
+       unsigned int true_cond;
+       int i;
+
+       /* Start of epilogue code */
+       unsigned int exit_addr = addrs[flen];
+
+       for (i = 0; i < flen; i++) {
+               unsigned int K = filter[i].k;
+
+               /*
+                * addrs[] maps a BPF bytecode address into a real offset from
+                * the start of the body code.
+                */
+               addrs[i] = ctx->idx * 4;
+
+               switch (filter[i].code) {
+                       /*** ALU ops ***/
+               case BPF_S_ALU_ADD_X: /* A += X; */
+                       ctx->seen |= SEEN_XREG;
+                       PPC_ADD(r_A, r_A, r_X);
+                       break;
+               case BPF_S_ALU_ADD_K: /* A += K; */
+                       if (!K)
+                               break;
+                       PPC_ADDI(r_A, r_A, IMM_L(K));
+                       if (K >= 32768)
+                               PPC_ADDIS(r_A, r_A, IMM_HA(K));
+                       break;
+               case BPF_S_ALU_SUB_X: /* A -= X; */
+                       ctx->seen |= SEEN_XREG;
+                       PPC_SUB(r_A, r_A, r_X);
+                       break;
+               case BPF_S_ALU_SUB_K: /* A -= K */
+                       if (!K)
+                               break;
+                       PPC_ADDI(r_A, r_A, IMM_L(-K));
+                       if (K >= 32768)
+                               PPC_ADDIS(r_A, r_A, IMM_HA(-K));
+                       break;
+               case BPF_S_ALU_MUL_X: /* A *= X; */
+                       ctx->seen |= SEEN_XREG;
+                       PPC_MUL(r_A, r_A, r_X);
+                       break;
+               case BPF_S_ALU_MUL_K: /* A *= K */
+                       if (K < 32768)
+                               PPC_MULI(r_A, r_A, K);
+                       else {
+                               PPC_LI32(r_scratch1, K);
+                               PPC_MUL(r_A, r_A, r_scratch1);
+                       }
+                       break;
+               case BPF_S_ALU_DIV_X: /* A /= X; */
+                       ctx->seen |= SEEN_XREG;
+                       PPC_CMPWI(r_X, 0);
+                       if (ctx->pc_ret0 != -1) {
+                               PPC_BCC(COND_EQ, addrs[ctx->pc_ret0]);
+                       } else {
+                               /*
+                                * Exit, returning 0; first pass hits here
+                                * (longer worst-case code size).
+                                */
+                               PPC_BCC_SHORT(COND_NE, (ctx->idx*4)+12);
+                               PPC_LI(r_ret, 0);
+                               PPC_JMP(exit_addr);
+                       }
+                       PPC_DIVWU(r_A, r_A, r_X);
+                       break;
+               case BPF_S_ALU_DIV_K: /* A = reciprocal_divide(A, K); */
+                       PPC_LI32(r_scratch1, K);
+                       /* Top 32 bits of 64bit result -> A */
+                       PPC_MULHWU(r_A, r_A, r_scratch1);
+                       break;
+               case BPF_S_ALU_AND_X:
+                       ctx->seen |= SEEN_XREG;
+                       PPC_AND(r_A, r_A, r_X);
+                       break;
+               case BPF_S_ALU_AND_K:
+                       if (!IMM_H(K))
+                               PPC_ANDI(r_A, r_A, K);
+                       else {
+                               PPC_LI32(r_scratch1, K);
+                               PPC_AND(r_A, r_A, r_scratch1);
+                       }
+                       break;
+               case BPF_S_ALU_OR_X:
+                       ctx->seen |= SEEN_XREG;
+                       PPC_OR(r_A, r_A, r_X);
+                       break;
+               case BPF_S_ALU_OR_K:
+                       if (IMM_L(K))
+                               PPC_ORI(r_A, r_A, IMM_L(K));
+                       if (K >= 65536)
+                               PPC_ORIS(r_A, r_A, IMM_H(K));
+                       break;
+               case BPF_S_ALU_LSH_X: /* A <<= X; */
+                       ctx->seen |= SEEN_XREG;
+                       PPC_SLW(r_A, r_A, r_X);
+                       break;
+               case BPF_S_ALU_LSH_K:
+                       if (K == 0)
+                               break;
+                       else
+                               PPC_SLWI(r_A, r_A, K);
+                       break;
+               case BPF_S_ALU_RSH_X: /* A >>= X; */
+                       ctx->seen |= SEEN_XREG;
+                       PPC_SRW(r_A, r_A, r_X);
+                       break;
+               case BPF_S_ALU_RSH_K: /* A >>= K; */
+                       if (K == 0)
+                               break;
+                       else
+                               PPC_SRWI(r_A, r_A, K);
+                       break;
+               case BPF_S_ALU_NEG:
+                       PPC_NEG(r_A, r_A);
+                       break;
+               case BPF_S_RET_K:
+                       PPC_LI32(r_ret, K);
+                       if (!K) {
+                               if (ctx->pc_ret0 == -1)
+                                       ctx->pc_ret0 = i;
+                       }
+                       /*
+                        * If this isn't the very last instruction, branch to
+                        * the epilogue if we've stuff to clean up.  Otherwise,
+                        * if there's nothing to tidy, just return.  If we /are/
+                        * the last instruction, we're about to fall through to
+                        * the epilogue to return.
+                        */
+                       if (i != flen - 1) {
+                               /*
+                                * Note: 'seen' is properly valid only on pass
+                                * #2.  Both parts of this conditional are the
+                                * same instruction size though, meaning the
+                                * first pass will still correctly determine the
+                                * code size/addresses.
+                                */
+                               if (ctx->seen)
+                                       PPC_JMP(exit_addr);
+                               else
+                                       PPC_BLR();
+                       }
+                       break;
+               case BPF_S_RET_A:
+                       PPC_MR(r_ret, r_A);
+                       if (i != flen - 1) {
+                               if (ctx->seen)
+                                       PPC_JMP(exit_addr);
+                               else
+                                       PPC_BLR();
+                       }
+                       break;
+               case BPF_S_MISC_TAX: /* X = A */
+                       PPC_MR(r_X, r_A);
+                       break;
+               case BPF_S_MISC_TXA: /* A = X */
+                       ctx->seen |= SEEN_XREG;
+                       PPC_MR(r_A, r_X);
+                       break;
+
+                       /*** Constant loads/M[] access ***/
+               case BPF_S_LD_IMM: /* A = K */
+                       PPC_LI32(r_A, K);
+                       break;
+               case BPF_S_LDX_IMM: /* X = K */
+                       PPC_LI32(r_X, K);
+                       break;
+               case BPF_S_LD_MEM: /* A = mem[K] */
+                       PPC_MR(r_A, r_M + (K & 0xf));
+                       ctx->seen |= SEEN_MEM | (1<<(K & 0xf));
+                       break;
+               case BPF_S_LDX_MEM: /* X = mem[K] */
+                       PPC_MR(r_X, r_M + (K & 0xf));
+                       ctx->seen |= SEEN_MEM | (1<<(K & 0xf));
+                       break;
+               case BPF_S_ST: /* mem[K] = A */
+                       PPC_MR(r_M + (K & 0xf), r_A);
+                       ctx->seen |= SEEN_MEM | (1<<(K & 0xf));
+                       break;
+               case BPF_S_STX: /* mem[K] = X */
+                       PPC_MR(r_M + (K & 0xf), r_X);
+                       ctx->seen |= SEEN_XREG | SEEN_MEM | (1<<(K & 0xf));
+                       break;
+               case BPF_S_LD_W_LEN: /* A = skb->len; */
+                       BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, len) != 4);
+                       PPC_LWZ_OFFS(r_A, r_skb, offsetof(struct sk_buff, len));
+                       break;
+               case BPF_S_LDX_W_LEN: /* X = skb->len; */
+                       PPC_LWZ_OFFS(r_X, r_skb, offsetof(struct sk_buff, len));
+                       break;
+
+                       /*** Ancillary info loads ***/
+
+                       /* None of the BPF_S_ANC* codes appear to be passed by
+                        * sk_chk_filter().  The interpreter and the x86 BPF
+                        * compiler implement them so we do too -- they may be
+                        * planted in future.
+                        */
+               case BPF_S_ANC_PROTOCOL: /* A = ntohs(skb->protocol); */
+                       BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff,
+                                                 protocol) != 2);
+                       PPC_LHZ_OFFS(r_A, r_skb, offsetof(struct sk_buff,
+                                                         protocol));
+                       /* ntohs is a NOP with BE loads. */
+                       break;
+               case BPF_S_ANC_IFINDEX:
+                       PPC_LD_OFFS(r_scratch1, r_skb, offsetof(struct sk_buff,
+                                                               dev));
+                       PPC_CMPDI(r_scratch1, 0);
+                       if (ctx->pc_ret0 != -1) {
+                               PPC_BCC(COND_EQ, addrs[ctx->pc_ret0]);
+                       } else {
+                               /* Exit, returning 0; first pass hits here. */
+                               PPC_BCC_SHORT(COND_NE, (ctx->idx*4)+12);
+                               PPC_LI(r_ret, 0);
+                               PPC_JMP(exit_addr);
+                       }
+                       BUILD_BUG_ON(FIELD_SIZEOF(struct net_device,
+                                                 ifindex) != 4);
+                       PPC_LWZ_OFFS(r_A, r_scratch1,
+                                    offsetof(struct net_device, ifindex));
+                       break;
+               case BPF_S_ANC_MARK:
+                       BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, mark) != 4);
+                       PPC_LWZ_OFFS(r_A, r_skb, offsetof(struct sk_buff,
+                                                         mark));
+                       break;
+               case BPF_S_ANC_RXHASH:
+                       BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, rxhash) != 4);
+                       PPC_LWZ_OFFS(r_A, r_skb, offsetof(struct sk_buff,
+                                                         rxhash));
+                       break;
+               case BPF_S_ANC_QUEUE:
+                       BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff,
+                                                 queue_mapping) != 2);
+                       PPC_LHZ_OFFS(r_A, r_skb, offsetof(struct sk_buff,
+                                                         queue_mapping));
+                       break;
+               case BPF_S_ANC_CPU:
+#ifdef CONFIG_SMP
+                       /*
+                        * PACA ptr is r13:
+                        * raw_smp_processor_id() = local_paca->paca_index
+                        */
+                       BUILD_BUG_ON(FIELD_SIZEOF(struct paca_struct,
+                                                 paca_index) != 2);
+                       PPC_LHZ_OFFS(r_A, 13,
+                                    offsetof(struct paca_struct, paca_index));
+#else
+                       PPC_LI(r_A, 0);
+#endif
+                       break;
+
+                       /*** Absolute loads from packet header/data ***/
+               case BPF_S_LD_W_ABS:
+                       func = sk_load_word;
+                       goto common_load;
+               case BPF_S_LD_H_ABS:
+                       func = sk_load_half;
+                       goto common_load;
+               case BPF_S_LD_B_ABS:
+                       func = sk_load_byte;
+               common_load:
+                       /*
+                        * Load from [K].  Reference with the (negative)
+                        * SKF_NET_OFF/SKF_LL_OFF offsets is unsupported.
+                        */
+                       ctx->seen |= SEEN_DATAREF;
+                       if ((int)K < 0)
+                               return -ENOTSUPP;
+                       PPC_LI64(r_scratch1, func);
+                       PPC_MTLR(r_scratch1);
+                       PPC_LI32(r_addr, K);
+                       PPC_BLRL();
+                       /*
+                        * Helper returns 'lt' condition on error, and an
+                        * appropriate return value in r3
+                        */
+                       PPC_BCC(COND_LT, exit_addr);
+                       break;
+
+                       /*** Indirect loads from packet header/data ***/
+               case BPF_S_LD_W_IND:
+                       func = sk_load_word;
+                       goto common_load_ind;
+               case BPF_S_LD_H_IND:
+                       func = sk_load_half;
+                       goto common_load_ind;
+               case BPF_S_LD_B_IND:
+                       func = sk_load_byte;
+               common_load_ind:
+                       /*
+                        * Load from [X + K].  Negative offsets are tested for
+                        * in the helper functions, and result in a 'ret 0'.
+                        */
+                       ctx->seen |= SEEN_DATAREF | SEEN_XREG;
+                       PPC_LI64(r_scratch1, func);
+                       PPC_MTLR(r_scratch1);
+                       PPC_ADDI(r_addr, r_X, IMM_L(K));
+                       if (K >= 32768)
+                               PPC_ADDIS(r_addr, r_addr, IMM_HA(K));
+                       PPC_BLRL();
+                       /* If error, cr0.LT set */
+                       PPC_BCC(COND_LT, exit_addr);
+                       break;
+
+               case BPF_S_LDX_B_MSH:
+                       /*
+                        * x86 version drops packet (RET 0) when K<0, whereas
+                        * interpreter does allow K<0 (__load_pointer, special
+                        * ancillary data).  common_load returns ENOTSUPP if K<0,
+                        * so we fall back to interpreter & filter works.
+                        */
+                       func = sk_load_byte_msh;
+                       goto common_load;
+                       break;
+
+                       /*** Jump and branches ***/
+               case BPF_S_JMP_JA:
+                       if (K != 0)
+                               PPC_JMP(addrs[i + 1 + K]);
+                       break;
+
+               case BPF_S_JMP_JGT_K:
+               case BPF_S_JMP_JGT_X:
+                       true_cond = COND_GT;
+                       goto cond_branch;
+               case BPF_S_JMP_JGE_K:
+               case BPF_S_JMP_JGE_X:
+                       true_cond = COND_GE;
+                       goto cond_branch;
+               case BPF_S_JMP_JEQ_K:
+               case BPF_S_JMP_JEQ_X:
+                       true_cond = COND_EQ;
+                       goto cond_branch;
+               case BPF_S_JMP_JSET_K:
+               case BPF_S_JMP_JSET_X:
+                       true_cond = COND_NE;
+                       /* Fall through */
+               cond_branch:
+                       /* same targets, can avoid doing the test :) */
+                       if (filter[i].jt == filter[i].jf) {
+                               if (filter[i].jt > 0)
+                                       PPC_JMP(addrs[i + 1 + filter[i].jt]);
+                               break;
+                       }
+
+                       switch (filter[i].code) {
+                       case BPF_S_JMP_JGT_X:
+                       case BPF_S_JMP_JGE_X:
+                       case BPF_S_JMP_JEQ_X:
+                               ctx->seen |= SEEN_XREG;
+                               PPC_CMPLW(r_A, r_X);
+                               break;
+                       case BPF_S_JMP_JSET_X:
+                               ctx->seen |= SEEN_XREG;
+                               PPC_AND_DOT(r_scratch1, r_A, r_X);
+                               break;
+                       case BPF_S_JMP_JEQ_K:
+                       case BPF_S_JMP_JGT_K:
+                       case BPF_S_JMP_JGE_K:
+                               if (K < 32768)
+                                       PPC_CMPLWI(r_A, K);
+                               else {
+                                       PPC_LI32(r_scratch1, K);
+                                       PPC_CMPLW(r_A, r_scratch1);
+                               }
+                               break;
+                       case BPF_S_JMP_JSET_K:
+                               if (K < 32768)
+                                       /* PPC_ANDI is /only/ dot-form */
+                                       PPC_ANDI(r_scratch1, r_A, K);
+                               else {
+                                       PPC_LI32(r_scratch1, K);
+                                       PPC_AND_DOT(r_scratch1, r_A,
+                                                   r_scratch1);
+                               }
+                               break;
+                       }
+                       /* Sometimes branches are constructed "backward", with
+                        * the false path being the branch and true path being
+                        * a fallthrough to the next instruction.
+                        */
+                       if (filter[i].jt == 0)
+                               /* Swap the sense of the branch */
+                               PPC_BCC(true_cond ^ COND_CMP_TRUE,
+                                       addrs[i + 1 + filter[i].jf]);
+                       else {
+                               PPC_BCC(true_cond, addrs[i + 1 + filter[i].jt]);
+                               if (filter[i].jf != 0)
+                                       PPC_JMP(addrs[i + 1 + filter[i].jf]);
+                       }
+                       break;
+               default:
+                       /* The filter contains something cruel & unusual.
+                        * We don't handle it, but also there shouldn't be
+                        * anything missing from our list.
+                        */
+                       if (printk_ratelimit())
+                               pr_err("BPF filter opcode %04x (@%d) unsupported\n",
+                                      filter[i].code, i);
+                       return -ENOTSUPP;
+               }
+
+       }
+       /* Set end-of-body-code address for exit. */
+       addrs[i] = ctx->idx * 4;
+
+       return 0;
+}
+
+void bpf_jit_compile(struct sk_filter *fp)
+{
+       unsigned int proglen;
+       unsigned int alloclen;
+       u32 *image = NULL;
+       u32 *code_base;
+       unsigned int *addrs;
+       struct codegen_context cgctx;
+       int pass;
+       int flen = fp->len;
+
+       if (!bpf_j