Browse Source

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next

Pull networking updates from David Miller:

 1) New offloading infrastructure and example 'rocker' driver for
    offloading of switching and routing to hardware.

    This work was done by a large group of dedicated individuals, not
    limited to: Scott Feldman, Jiri Pirko, Thomas Graf, John Fastabend,
    Jamal Hadi Salim, Andy Gospodarek, Florian Fainelli, Roopa Prabhu

 2) Start making the networking operate on IOV iterators instead of
    modifying iov objects in-situ during transfers.  Thanks to Al Viro
    and Herbert Xu.

 3) A set of new netlink interfaces for the TIPC stack, from Richard
    Alpe.

 4) Remove unnecessary looping during ipv6 routing lookups, from Martin
    KaFai Lau.

 5) Add PAUSE frame generation support to gianfar driver, from Matei
    Pavaluca.

 6) Allow for larger reordering levels in TCP, which are easily
    achievable in the real world right now, from Eric Dumazet.

 7) Add a variable of napi_schedule that doesn't need to disable cpu
    interrupts, from Eric Dumazet.

 8) Use a doubly linked list to optimize neigh_parms_release(), from
    Nicolas Dichtel.

 9) Various enhancements to the kernel BPF verifier, and allow eBPF
    programs to actually be attached to sockets.  From Alexei
    Starovoitov.

10) Support TSO/LSO in sunvnet driver, from David L Stevens.

11) Allow controlling ECN usage via routing metrics, from Florian
    Westphal.

12) Remote checksum offload, from Tom Herbert.

13) Add split-header receive, BQL, and xmit_more support to amd-xgbe
    driver, from Thomas Lendacky.

14) Add MPLS support to openvswitch, from Simon Horman.

15) Support wildcard tunnel endpoints in ipv6 tunnels, from Steffen
    Klassert.

16) Do gro flushes on a per-device basis using a timer, from Eric
    Dumazet.  This tries to resolve the conflicting goals between the
    desired handling of bulk vs.  RPC-like traffic.

17) Allow userspace to ask for the CPU upon what a packet was
    received/steered, via SO_INCOMING_CPU.  From Eric Dumazet.

18) Limit GSO packets to half the current congestion window, from Eric
    Dumazet.

19) Add a generic helper so that all drivers set their RSS keys in a
    consistent way, from Eric Dumazet.

20) Add xmit_more support to enic driver, from Govindarajulu
    Varadarajan.

21) Add VLAN packet scheduler action, from Jiri Pirko.

22) Support configurable RSS hash functions via ethtool, from Eyal
    Perry.

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next: (1820 commits)
  Fix race condition between vxlan_sock_add and vxlan_sock_release
  net/macb: fix compilation warning for print_hex_dump() called with skb->mac_header
  net/mlx4: Add support for A0 steering
  net/mlx4: Refactor QUERY_PORT
  net/mlx4_core: Add explicit error message when rule doesn't meet configuration
  net/mlx4: Add A0 hybrid steering
  net/mlx4: Add mlx4_bitmap zone allocator
  net/mlx4: Add a check if there are too many reserved QPs
  net/mlx4: Change QP allocation scheme
  net/mlx4_core: Use tasklet for user-space CQ completion events
  net/mlx4_core: Mask out host side virtualization features for guests
  net/mlx4_en: Set csum level for encapsulated packets
  be2net: Export tunnel offloads only when a VxLAN tunnel is created
  gianfar: Fix dma check map error when DMA_API_DEBUG is enabled
  cxgb4/csiostor: Don't use MASTER_MUST for fw_hello call
  net: fec: only enable mdio interrupt before phy device link up
  net: fec: clear all interrupt events to support i.MX6SX
  net: fec: reset fep link status in suspend function
  net: sock: fix access via invalid file descriptor
  net: introduce helper macro for_each_cmsghdr
  ...
Linus Torvalds 10 years ago
parent
commit
70e71ca0af
100 changed files with 780 additions and 329 deletions
  1. 8 0
      Documentation/ABI/testing/sysfs-class-net
  2. 1 1
      Documentation/Changes
  3. 29 0
      Documentation/devicetree/bindings/btmrvl.txt
  4. 21 0
      Documentation/devicetree/bindings/bus/bcma.txt
  5. 10 2
      Documentation/devicetree/bindings/net/amd-xgbe.txt
  6. 5 0
      Documentation/devicetree/bindings/net/can/c_can.txt
  7. 8 1
      Documentation/devicetree/bindings/net/dsa/dsa.txt
  8. 24 11
      Documentation/devicetree/bindings/net/micrel.txt
  9. 2 1
      Documentation/devicetree/bindings/net/phy.txt
  10. 1 0
      Documentation/devicetree/bindings/net/sh_eth.txt
  11. 2 5
      Documentation/networking/bonding.txt
  12. 22 1
      Documentation/networking/ip-sysctl.txt
  13. 107 0
      Documentation/networking/ipvlan.txt
  14. 1 1
      Documentation/networking/ixgbe.txt
  15. 65 67
      Documentation/networking/stmmac.txt
  16. 59 0
      Documentation/networking/switchdev.txt
  17. 25 8
      Documentation/networking/timestamping.txt
  18. 78 12
      Documentation/networking/timestamping/txtimestamp.c
  19. 30 4
      Documentation/sysctl/net.txt
  20. 35 2
      MAINTAINERS
  21. 0 1
      arch/alpha/include/asm/Kbuild
  22. 5 0
      arch/alpha/include/uapi/asm/socket.h
  23. 0 1
      arch/arc/include/asm/Kbuild
  24. 0 1
      arch/arm/configs/davinci_all_defconfig
  25. 0 1
      arch/arm/include/asm/Kbuild
  26. 2 2
      arch/arm/kernel/sys_oabi-compat.c
  27. 1 0
      arch/arm/mach-mmp/gplugd.c
  28. 0 1
      arch/arm64/include/asm/Kbuild
  29. 0 1
      arch/avr32/include/asm/Kbuild
  30. 5 0
      arch/avr32/include/uapi/asm/socket.h
  31. 0 1
      arch/blackfin/include/asm/Kbuild
  32. 0 1
      arch/c6x/include/asm/Kbuild
  33. 0 1
      arch/cris/include/asm/Kbuild
  34. 5 0
      arch/cris/include/uapi/asm/socket.h
  35. 0 1
      arch/frv/include/asm/Kbuild
  36. 5 0
      arch/frv/include/uapi/asm/socket.h
  37. 0 1
      arch/hexagon/include/asm/Kbuild
  38. 0 1
      arch/ia64/include/asm/Kbuild
  39. 5 0
      arch/ia64/include/uapi/asm/socket.h
  40. 0 1
      arch/m32r/include/asm/Kbuild
  41. 5 0
      arch/m32r/include/uapi/asm/socket.h
  42. 0 1
      arch/m68k/include/asm/Kbuild
  43. 0 1
      arch/metag/include/asm/Kbuild
  44. 0 1
      arch/microblaze/include/asm/Kbuild
  45. 0 1
      arch/mips/include/asm/Kbuild
  46. 5 0
      arch/mips/include/uapi/asm/socket.h
  47. 2 2
      arch/mips/net/bpf_jit.c
  48. 0 1
      arch/mn10300/include/asm/Kbuild
  49. 5 0
      arch/mn10300/include/uapi/asm/socket.h
  50. 0 1
      arch/nios2/include/asm/Kbuild
  51. 0 1
      arch/openrisc/include/asm/Kbuild
  52. 0 1
      arch/parisc/include/asm/Kbuild
  53. 5 0
      arch/parisc/include/uapi/asm/socket.h
  54. 0 1
      arch/powerpc/configs/85xx/ge_imp3a_defconfig
  55. 0 1
      arch/powerpc/configs/86xx/gef_ppc9a_defconfig
  56. 0 1
      arch/powerpc/configs/86xx/gef_sbc310_defconfig
  57. 0 1
      arch/powerpc/configs/86xx/gef_sbc610_defconfig
  58. 0 1
      arch/powerpc/configs/86xx/sbc8641d_defconfig
  59. 0 1
      arch/powerpc/configs/c2k_defconfig
  60. 0 1
      arch/powerpc/configs/ppc64_defconfig
  61. 0 1
      arch/powerpc/configs/ppc64e_defconfig
  62. 0 1
      arch/powerpc/configs/ppc6xx_defconfig
  63. 0 1
      arch/powerpc/configs/pseries_defconfig
  64. 0 1
      arch/powerpc/configs/pseries_le_defconfig
  65. 0 1
      arch/powerpc/include/asm/Kbuild
  66. 1 0
      arch/powerpc/include/asm/ppc-opcode.h
  67. 5 0
      arch/powerpc/include/uapi/asm/socket.h
  68. 7 0
      arch/powerpc/net/bpf_jit.h
  69. 26 23
      arch/powerpc/net/bpf_jit_comp.c
  70. 0 1
      arch/s390/include/asm/Kbuild
  71. 5 0
      arch/s390/include/uapi/asm/socket.h
  72. 0 1
      arch/score/include/asm/Kbuild
  73. 0 1
      arch/sh/include/asm/Kbuild
  74. 0 1
      arch/sparc/include/asm/Kbuild
  75. 19 0
      arch/sparc/include/asm/vio.h
  76. 5 0
      arch/sparc/include/uapi/asm/socket.h
  77. 0 1
      arch/tile/configs/tilegx_defconfig
  78. 0 1
      arch/tile/configs/tilepro_defconfig
  79. 0 1
      arch/tile/include/asm/Kbuild
  80. 0 1
      arch/um/include/asm/Kbuild
  81. 0 1
      arch/unicore32/include/asm/Kbuild
  82. 0 7
      arch/x86/include/asm/hash.h
  83. 1 1
      arch/x86/lib/Makefile
  84. 0 92
      arch/x86/lib/hash.c
  85. 18 16
      arch/x86/net/bpf_jit_comp.c
  86. 0 1
      arch/xtensa/include/asm/Kbuild
  87. 5 0
      arch/xtensa/include/uapi/asm/socket.h
  88. 1 1
      crypto/af_alg.c
  89. 3 3
      crypto/algif_hash.c
  90. 7 7
      crypto/algif_skcipher.c
  91. 3 0
      drivers/atm/eni.c
  92. 1 0
      drivers/bcma/bcma_private.h
  93. 1 1
      drivers/bcma/driver_chipcommon.c
  94. 2 2
      drivers/bcma/driver_gpio.c
  95. 2 9
      drivers/bcma/driver_mips.c
  96. 2 2
      drivers/bcma/driver_pci_host.c
  97. 77 2
      drivers/bcma/main.c
  98. 1 0
      drivers/bcma/scan.c
  99. 1 0
      drivers/bluetooth/Kconfig
  100. 4 0
      drivers/bluetooth/ath3k.c

+ 8 - 0
Documentation/ABI/testing/sysfs-class-net

@@ -216,3 +216,11 @@ Contact:	netdev@vger.kernel.org
 Description:
 Description:
 		Indicates the interface protocol type as a decimal value. See
 		Indicates the interface protocol type as a decimal value. See
 		include/uapi/linux/if_arp.h for all possible values.
 		include/uapi/linux/if_arp.h for all possible values.
+
+What:		/sys/class/net/<iface>/phys_switch_id
+Date:		November 2014
+KernelVersion:	3.19
+Contact:	netdev@vger.kernel.org
+Description:
+		Indicates the unique physical switch identifier of a switch this
+		port belongs to, as a string.

+ 1 - 1
Documentation/Changes

@@ -383,7 +383,7 @@ o  <http://www.iptables.org/downloads.html>
 
 
 Ip-route2
 Ip-route2
 ---------
 ---------
-o  <ftp://ftp.tux.org/pub/net/ip-routing/iproute2-2.2.4-now-ss991023.tar.gz>
+o  <https://www.kernel.org/pub/linux/utils/net/iproute2/>
 
 
 OProfile
 OProfile
 --------
 --------

+ 29 - 0
Documentation/devicetree/bindings/btmrvl.txt

@@ -0,0 +1,29 @@
+btmrvl
+------
+
+Required properties:
+
+  - compatible : must be "btmrvl,cfgdata"
+
+Optional properties:
+
+  - btmrvl,cal-data : Calibration data downloaded to the device during
+		      initialization. This is an array of 28 values(u8).
+
+  - btmrvl,gpio-gap : gpio and gap (in msecs) combination to be
+		      configured.
+
+Example:
+
+GPIO pin 13 is configured as a wakeup source and GAP is set to 100 msecs
+in below example.
+
+btmrvl {
+	compatible = "btmrvl,cfgdata";
+
+	btmrvl,cal-data = /bits/ 8 <
+		0x37 0x01 0x1c 0x00 0xff 0xff 0xff 0xff 0x01 0x7f 0x04 0x02
+		0x00 0x00 0xba 0xce 0xc0 0xc6 0x2d 0x00 0x00 0x00 0x00 0x00
+		0x00 0x00 0xf0 0x00>;
+	btmrvl,gpio-gap = <0x0d64>;
+};

+ 21 - 0
Documentation/devicetree/bindings/bus/bcma.txt

@@ -8,6 +8,11 @@ Required properties:
 
 
 The cores on the AXI bus are automatically detected by bcma with the
 The cores on the AXI bus are automatically detected by bcma with the
 memory ranges they are using and they get registered afterwards.
 memory ranges they are using and they get registered afterwards.
+Automatic detection of the IRQ number is not working on
+BCM47xx/BCM53xx ARM SoCs. To assign IRQ numbers to the cores, provide
+them manually through device tree. Use an interrupt-map to specify the
+IRQ used by the devices on the bus. The first address is just an index,
+because we do not have any special register.
 
 
 The top-level axi bus may contain children representing attached cores
 The top-level axi bus may contain children representing attached cores
 (devices). This is needed since some hardware details can't be auto
 (devices). This is needed since some hardware details can't be auto
@@ -22,6 +27,22 @@ Example:
 		ranges = <0x00000000 0x18000000 0x00100000>;
 		ranges = <0x00000000 0x18000000 0x00100000>;
 		#address-cells = <1>;
 		#address-cells = <1>;
 		#size-cells = <1>;
 		#size-cells = <1>;
+		#interrupt-cells = <1>;
+		interrupt-map-mask = <0x000fffff 0xffff>;
+		interrupt-map =
+			/* Ethernet Controller 0 */
+			<0x00024000 0 &gic GIC_SPI 147 IRQ_TYPE_LEVEL_HIGH>,
+
+			/* Ethernet Controller 1 */
+			<0x00025000 0 &gic GIC_SPI 148 IRQ_TYPE_LEVEL_HIGH>;
+
+			/* PCIe Controller 0 */
+			<0x00012000 0 &gic GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>,
+			<0x00012000 1 &gic GIC_SPI 127 IRQ_TYPE_LEVEL_HIGH>,
+			<0x00012000 2 &gic GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH>,
+			<0x00012000 3 &gic GIC_SPI 129 IRQ_TYPE_LEVEL_HIGH>,
+			<0x00012000 4 &gic GIC_SPI 130 IRQ_TYPE_LEVEL_HIGH>,
+			<0x00012000 5 &gic GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>;
 
 
 		chipcommon {
 		chipcommon {
 			reg = <0x00000000 0x1000>;
 			reg = <0x00000000 0x1000>;

+ 10 - 2
Documentation/devicetree/bindings/net/amd-xgbe.txt

@@ -7,7 +7,10 @@ Required properties:
    - PCS registers
    - PCS registers
 - interrupt-parent: Should be the phandle for the interrupt controller
 - interrupt-parent: Should be the phandle for the interrupt controller
   that services interrupts for this device
   that services interrupts for this device
-- interrupts: Should contain the amd-xgbe interrupt
+- interrupts: Should contain the amd-xgbe interrupt(s). The first interrupt
+  listed is required and is the general device interrupt. If the optional
+  amd,per-channel-interrupt property is specified, then one additional
+  interrupt for each DMA channel supported by the device should be specified
 - clocks:
 - clocks:
    - DMA clock for the amd-xgbe device (used for calculating the
    - DMA clock for the amd-xgbe device (used for calculating the
      correct Rx interrupt watchdog timer value on a DMA channel
      correct Rx interrupt watchdog timer value on a DMA channel
@@ -23,6 +26,9 @@ Optional properties:
 - mac-address: mac address to be assigned to the device. Can be overridden
 - mac-address: mac address to be assigned to the device. Can be overridden
   by UEFI.
   by UEFI.
 - dma-coherent: Present if dma operations are coherent
 - dma-coherent: Present if dma operations are coherent
+- amd,per-channel-interrupt: Indicates that Rx and Tx complete will generate
+  a unique interrupt for each DMA channel - this requires an additional
+  interrupt be configured for each DMA channel
 
 
 Example:
 Example:
 	xgbe@e0700000 {
 	xgbe@e0700000 {
@@ -30,7 +36,9 @@ Example:
 		reg = <0 0xe0700000 0 0x80000>,
 		reg = <0 0xe0700000 0 0x80000>,
 		      <0 0xe0780000 0 0x80000>;
 		      <0 0xe0780000 0 0x80000>;
 		interrupt-parent = <&gic>;
 		interrupt-parent = <&gic>;
-		interrupts = <0 325 4>;
+		interrupts = <0 325 4>,
+			     <0 326 1>, <0 327 1>, <0 328 1>, <0 329 1>;
+		amd,per-channel-interrupt;
 		clocks = <&xgbe_dma_clk>, <&xgbe_ptp_clk>;
 		clocks = <&xgbe_dma_clk>, <&xgbe_ptp_clk>;
 		clock-names = "dma_clk", "ptp_clk";
 		clock-names = "dma_clk", "ptp_clk";
 		phy-handle = <&phy>;
 		phy-handle = <&phy>;

+ 5 - 0
Documentation/devicetree/bindings/net/can/c_can.txt

@@ -4,6 +4,8 @@ Bosch C_CAN/D_CAN controller Device Tree Bindings
 Required properties:
 Required properties:
 - compatible		: Should be "bosch,c_can" for C_CAN controllers and
 - compatible		: Should be "bosch,c_can" for C_CAN controllers and
 			  "bosch,d_can" for D_CAN controllers.
 			  "bosch,d_can" for D_CAN controllers.
+			  Can be "ti,dra7-d_can", "ti,am3352-d_can" or
+			  "ti,am4372-d_can".
 - reg			: physical base address and size of the C_CAN/D_CAN
 - reg			: physical base address and size of the C_CAN/D_CAN
 			  registers map
 			  registers map
 - interrupts		: property with a value describing the interrupt
 - interrupts		: property with a value describing the interrupt
@@ -12,6 +14,9 @@ Required properties:
 Optional properties:
 Optional properties:
 - ti,hwmods		: Must be "d_can<n>" or "c_can<n>", n being the
 - ti,hwmods		: Must be "d_can<n>" or "c_can<n>", n being the
 			  instance number
 			  instance number
+- syscon-raminit	: Handle to system control region that contains the
+			  RAMINIT register, register offset to the RAMINIT
+			  register and the CAN instance number (0 offset).
 
 
 Note: "ti,hwmods" field is used to fetch the base address and irq
 Note: "ti,hwmods" field is used to fetch the base address and irq
 resources from TI, omap hwmod data base during device registration.
 resources from TI, omap hwmod data base during device registration.

+ 8 - 1
Documentation/devicetree/bindings/net/dsa/dsa.txt

@@ -10,7 +10,7 @@ Required properties:
 - dsa,ethernet		: Should be a phandle to a valid Ethernet device node
 - dsa,ethernet		: Should be a phandle to a valid Ethernet device node
 - dsa,mii-bus		: Should be a phandle to a valid MDIO bus device node
 - dsa,mii-bus		: Should be a phandle to a valid MDIO bus device node
 
 
-Optionnal properties:
+Optional properties:
 - interrupts		: property with a value describing the switch
 - interrupts		: property with a value describing the switch
 			  interrupt number (not supported by the driver)
 			  interrupt number (not supported by the driver)
 
 
@@ -23,6 +23,13 @@ Each of these switch child nodes should have the following required properties:
 - #address-cells	: Must be 1
 - #address-cells	: Must be 1
 - #size-cells		: Must be 0
 - #size-cells		: Must be 0
 
 
+A switch child node has the following optional property:
+
+- eeprom-length		: Set to the length of an EEPROM connected to the
+			  switch. Must be set if the switch can not detect
+			  the presence and/or size of a connected EEPROM,
+			  otherwise optional.
+
 A switch may have multiple "port" children nodes
 A switch may have multiple "port" children nodes
 
 
 Each port children node must have the following mandatory properties:
 Each port children node must have the following mandatory properties:

+ 24 - 11
Documentation/devicetree/bindings/net/micrel.txt

@@ -6,19 +6,32 @@ Optional properties:
 
 
  - micrel,led-mode : LED mode value to set for PHYs with configurable LEDs.
  - micrel,led-mode : LED mode value to set for PHYs with configurable LEDs.
 
 
-              Configure the LED mode with single value. The list of PHYs and
-	      the bits that are currently supported:
+	Configure the LED mode with single value. The list of PHYs and the
+	bits that are currently supported:
 
 
-	      KSZ8001: register 0x1e, bits 15..14
-	      KSZ8041: register 0x1e, bits 15..14
-	      KSZ8021: register 0x1f, bits 5..4
-	      KSZ8031: register 0x1f, bits 5..4
-	      KSZ8051: register 0x1f, bits 5..4
+	KSZ8001: register 0x1e, bits 15..14
+	KSZ8041: register 0x1e, bits 15..14
+	KSZ8021: register 0x1f, bits 5..4
+	KSZ8031: register 0x1f, bits 5..4
+	KSZ8051: register 0x1f, bits 5..4
+	KSZ8081: register 0x1f, bits 5..4
+	KSZ8091: register 0x1f, bits 5..4
 
 
-              See the respective PHY datasheet for the mode values.
+	See the respective PHY datasheet for the mode values.
+
+ - micrel,rmii-reference-clock-select-25-mhz: RMII Reference Clock Select
+						bit selects 25 MHz mode
+
+	Setting the RMII Reference Clock Select bit enables 25 MHz rather
+	than 50 MHz clock mode.
+
+	Note that this option in only needed for certain PHY revisions with a
+	non-standard, inverted function of this configuration bit.
+	Specifically, a clock reference ("rmii-ref" below) is always needed to
+	actually select a mode.
 
 
  - clocks, clock-names: contains clocks according to the common clock bindings.
  - clocks, clock-names: contains clocks according to the common clock bindings.
 
 
-              supported clocks:
-	      - KSZ8021, KSZ8031: "rmii-ref": The RMII refence input clock. Used
-		to determine the XI input clock.
+	supported clocks:
+	- KSZ8021, KSZ8031, KSZ8081, KSZ8091: "rmii-ref": The RMII reference
+	  input clock. Used to determine the XI input clock.

+ 2 - 1
Documentation/devicetree/bindings/net/phy.txt

@@ -19,7 +19,6 @@ Optional Properties:
   specifications. If neither of these are specified, the default is to
   specifications. If neither of these are specified, the default is to
   assume clause 22. The compatible list may also contain other
   assume clause 22. The compatible list may also contain other
   elements.
   elements.
-- max-speed: Maximum PHY supported speed (10, 100, 1000...)
 
 
   If the phy's identifier is known then the list may contain an entry
   If the phy's identifier is known then the list may contain an entry
   of the form: "ethernet-phy-idAAAA.BBBB" where
   of the form: "ethernet-phy-idAAAA.BBBB" where
@@ -29,6 +28,8 @@ Optional Properties:
             4 hex digits. This is the chip vendor OUI bits 19:24,
             4 hex digits. This is the chip vendor OUI bits 19:24,
             followed by 10 bits of a vendor specific ID.
             followed by 10 bits of a vendor specific ID.
 
 
+- max-speed: Maximum PHY supported speed (10, 100, 1000...)
+
 Example:
 Example:
 
 
 ethernet-phy@0 {
 ethernet-phy@0 {

+ 1 - 0
Documentation/devicetree/bindings/net/sh_eth.txt

@@ -9,6 +9,7 @@ Required properties:
 	      "renesas,ether-r8a7779"  if the device is a part of R8A7779 SoC.
 	      "renesas,ether-r8a7779"  if the device is a part of R8A7779 SoC.
 	      "renesas,ether-r8a7790"  if the device is a part of R8A7790 SoC.
 	      "renesas,ether-r8a7790"  if the device is a part of R8A7790 SoC.
 	      "renesas,ether-r8a7791"  if the device is a part of R8A7791 SoC.
 	      "renesas,ether-r8a7791"  if the device is a part of R8A7791 SoC.
+	      "renesas,ether-r8a7793"  if the device is a part of R8A7793 SoC.
 	      "renesas,ether-r8a7794"  if the device is a part of R8A7794 SoC.
 	      "renesas,ether-r8a7794"  if the device is a part of R8A7794 SoC.
 	      "renesas,ether-r7s72100" if the device is a part of R7S72100 SoC.
 	      "renesas,ether-r7s72100" if the device is a part of R7S72100 SoC.
 - reg: offset and length of (1) the E-DMAC/feLic register block (required),
 - reg: offset and length of (1) the E-DMAC/feLic register block (required),

+ 2 - 5
Documentation/networking/bonding.txt

@@ -2230,11 +2230,8 @@ balance-rr: This mode is the only mode that will permit a single
 
 
 	It is possible to adjust TCP/IP's congestion limits by
 	It is possible to adjust TCP/IP's congestion limits by
 	altering the net.ipv4.tcp_reordering sysctl parameter.  The
 	altering the net.ipv4.tcp_reordering sysctl parameter.  The
-	usual default value is 3, and the maximum useful value is 127.
-	For a four interface balance-rr bond, expect that a single
-	TCP/IP stream will utilize no more than approximately 2.3
-	interface's worth of throughput, even after adjusting
-	tcp_reordering.
+	usual default value is 3. But keep in mind TCP stack is able
+	to automatically increase this when it detects reorders.
 
 
 	Note that the fraction of packets that will be delivered out of
 	Note that the fraction of packets that will be delivered out of
 	order is highly variable, and is unlikely to be zero.  The level
 	order is highly variable, and is unlikely to be zero.  The level

+ 22 - 1
Documentation/networking/ip-sysctl.txt

@@ -383,9 +383,17 @@ tcp_orphan_retries - INTEGER
 	may consume significant resources. Cf. tcp_max_orphans.
 	may consume significant resources. Cf. tcp_max_orphans.
 
 
 tcp_reordering - INTEGER
 tcp_reordering - INTEGER
-	Maximal reordering of packets in a TCP stream.
+	Initial reordering level of packets in a TCP stream.
+	TCP stack can then dynamically adjust flow reordering level
+	between this initial value and tcp_max_reordering
 	Default: 3
 	Default: 3
 
 
+tcp_max_reordering - INTEGER
+	Maximal reordering level of packets in a TCP stream.
+	300 is a fairly conservative value, but you might increase it
+	if paths are using per packet load balancing (like bonding rr mode)
+	Default: 300
+
 tcp_retrans_collapse - BOOLEAN
 tcp_retrans_collapse - BOOLEAN
 	Bug-to-bug compatibility with some broken printers.
 	Bug-to-bug compatibility with some broken printers.
 	On retransmit try to send bigger packets to work around bugs in
 	On retransmit try to send bigger packets to work around bugs in
@@ -1466,6 +1474,19 @@ suppress_frag_ndisc - INTEGER
 	1 - (default) discard fragmented neighbor discovery packets
 	1 - (default) discard fragmented neighbor discovery packets
 	0 - allow fragmented neighbor discovery packets
 	0 - allow fragmented neighbor discovery packets
 
 
+optimistic_dad - BOOLEAN
+	Whether to perform Optimistic Duplicate Address Detection (RFC 4429).
+		0: disabled (default)
+		1: enabled
+
+use_optimistic - BOOLEAN
+	If enabled, do not classify optimistic addresses as deprecated during
+	source address selection.  Preferred addresses will still be chosen
+	before optimistic addresses, subject to other ranking in the source
+	address selection algorithm.
+		0: disabled (default)
+		1: enabled
+
 icmp/*:
 icmp/*:
 ratelimit - INTEGER
 ratelimit - INTEGER
 	Limit the maximal rates for sending ICMPv6 packets.
 	Limit the maximal rates for sending ICMPv6 packets.

+ 107 - 0
Documentation/networking/ipvlan.txt

@@ -0,0 +1,107 @@
+
+                            IPVLAN Driver HOWTO
+
+Initial Release:
+	Mahesh Bandewar <maheshb AT google.com>
+
+1. Introduction:
+	This is conceptually very similar to the macvlan driver with one major
+exception of using L3 for mux-ing /demux-ing among slaves. This property makes
+the master device share the L2 with it's slave devices. I have developed this
+driver in conjuntion with network namespaces and not sure if there is use case
+outside of it.
+
+
+2. Building and Installation:
+	In order to build the driver, please select the config item CONFIG_IPVLAN.
+The driver can be built into the kernel (CONFIG_IPVLAN=y) or as a module
+(CONFIG_IPVLAN=m).
+
+
+3. Configuration:
+	There are no module parameters for this driver and it can be configured
+using IProute2/ip utility.
+
+	ip link add link <master-dev> <slave-dev> type ipvlan mode { l2 | L3 }
+
+	e.g. ip link add link ipvl0 eth0 type ipvlan mode l2
+
+
+4. Operating modes:
+	IPvlan has two modes of operation - L2 and L3. For a given master device,
+you can select one of these two modes and all slaves on that master will
+operate in the same (selected) mode. The RX mode is almost identical except
+that in L3 mode the slaves wont receive any multicast / broadcast traffic.
+L3 mode is more restrictive since routing is controlled from the other (mostly)
+default namespace.
+
+4.1 L2 mode:
+	In this mode TX processing happens on the stack instance attached to the
+slave device and packets are switched and queued to the master device to send
+out. In this mode the slaves will RX/TX multicast and broadcast (if applicable)
+as well.
+
+4.2 L3 mode:
+	In this mode TX processing upto L3 happens on the stack instance attached
+to the slave device and packets are switched to the stack instance of the
+master device for the L2 processing and routing from that instance will be
+used before packets are queued on the outbound device. In this mode the slaves
+will not receive nor can send multicast / broadcast traffic.
+
+
+5. What to choose (macvlan vs. ipvlan)?
+	These two devices are very similar in many regards and the specific use
+case could very well define which device to choose. if one of the following
+situations defines your use case then you can choose to use ipvlan -
+	(a) The Linux host that is connected to the external switch / router has
+policy configured that allows only one mac per port.
+	(b) No of virtual devices created on a master exceed the mac capacity and
+puts the NIC in promiscous mode and degraded performance is a concern.
+	(c) If the slave device is to be put into the hostile / untrusted network
+namespace where L2 on the slave could be changed / misused.
+
+
+6. Example configuration:
+
+  +=============================================================+
+  |  Host: host1                                                |
+  |                                                             |
+  |   +----------------------+      +----------------------+    |
+  |   |   NS:ns0             |      |  NS:ns1              |    |
+  |   |                      |      |                      |    |
+  |   |                      |      |                      |    |
+  |   |        ipvl0         |      |         ipvl1        |    |
+  |   +----------#-----------+      +-----------#----------+    |
+  |              #                              #               |
+  |              ################################               |
+  |                              # eth0                         |
+  +==============================#==============================+
+
+
+	(a) Create two network namespaces - ns0, ns1
+		ip netns add ns0
+		ip netns add ns1
+
+	(b) Create two ipvlan slaves on eth0 (master device)
+		ip link add link eth0 ipvl0 type ipvlan mode l2
+		ip link add link eth0 ipvl1 type ipvlan mode l2
+
+	(c) Assign slaves to the respective network namespaces
+		ip link set dev ipvl0 netns ns0
+		ip link set dev ipvl1 netns ns1
+
+	(d) Now switch to the namespace (ns0 or ns1) to configure the slave devices
+		- For ns0
+			(1) ip netns exec ns0 bash
+			(2) ip link set dev ipvl0 up
+			(3) ip link set dev lo up
+			(4) ip -4 addr add 127.0.0.1 dev lo
+			(5) ip -4 addr add $IPADDR dev ipvl0
+			(6) ip -4 route add default via $ROUTER dev ipvl0
+		- For ns1
+			(1) ip netns exec ns1 bash
+			(2) ip link set dev ipvl1 up
+			(3) ip link set dev lo up
+			(4) ip -4 addr add 127.0.0.1 dev lo
+			(5) ip -4 addr add $IPADDR dev ipvl1
+			(6) ip -4 route add default via $ROUTER dev ipvl1

+ 1 - 1
Documentation/networking/ixgbe.txt

@@ -138,7 +138,7 @@ Other ethtool Commands:
 To enable Flow Director
 To enable Flow Director
 	ethtool -K ethX ntuple on
 	ethtool -K ethX ntuple on
 To add a filter
 To add a filter
-	Use -U switch. e.g., ethtool -U ethX flow-type tcp4 src-ip 0x178000a
+	Use -U switch. e.g., ethtool -U ethX flow-type tcp4 src-ip 10.0.128.23
         action 1
         action 1
 To see the list of filters currently present:
 To see the list of filters currently present:
 	ethtool -u ethX
 	ethtool -u ethX

+ 65 - 67
Documentation/networking/stmmac.txt

@@ -1,12 +1,12 @@
        STMicroelectronics 10/100/1000 Synopsys Ethernet driver
        STMicroelectronics 10/100/1000 Synopsys Ethernet driver
 
 
-Copyright (C) 2007-2013  STMicroelectronics Ltd
+Copyright (C) 2007-2014  STMicroelectronics Ltd
 Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
 Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
 
 
 This is the driver for the MAC 10/100/1000 on-chip Ethernet controllers
 This is the driver for the MAC 10/100/1000 on-chip Ethernet controllers
 (Synopsys IP blocks).
 (Synopsys IP blocks).
 
 
-Currently this network device driver is for all STM embedded MAC/GMAC
+Currently this network device driver is for all STi embedded MAC/GMAC
 (i.e. 7xxx/5xxx SoCs), SPEAr (arm), Loongson1B (mips) and XLINX XC2V3000
 (i.e. 7xxx/5xxx SoCs), SPEAr (arm), Loongson1B (mips) and XLINX XC2V3000
 FF1152AMT0221 D1215994A VIRTEX FPGA board.
 FF1152AMT0221 D1215994A VIRTEX FPGA board.
 
 
@@ -22,6 +22,9 @@ The kernel configuration option is STMMAC_ETH:
  Device Drivers ---> Network device support ---> Ethernet (1000 Mbit) --->
  Device Drivers ---> Network device support ---> Ethernet (1000 Mbit) --->
  STMicroelectronics 10/100/1000 Ethernet driver (STMMAC_ETH)
  STMicroelectronics 10/100/1000 Ethernet driver (STMMAC_ETH)
 
 
+CONFIG_STMMAC_PLATFORM: is to enable the platform driver.
+CONFIG_STMMAC_PCI: is to enable the pci driver.
+
 2) Driver parameters list:
 2) Driver parameters list:
 	debug: message level (0: no output, 16: all);
 	debug: message level (0: no output, 16: all);
 	phyaddr: to manually provide the physical address to the PHY device;
 	phyaddr: to manually provide the physical address to the PHY device;
@@ -45,10 +48,11 @@ Driver parameters can be also passed in command line by using:
 The xmit method is invoked when the kernel needs to transmit a packet; it sets
 The xmit method is invoked when the kernel needs to transmit a packet; it sets
 the descriptors in the ring and informs the DMA engine that there is a packet
 the descriptors in the ring and informs the DMA engine that there is a packet
 ready to be transmitted.
 ready to be transmitted.
-Once the controller has finished transmitting the packet, an interrupt is
-triggered; So the driver will be able to release the socket buffers.
 By default, the driver sets the NETIF_F_SG bit in the features field of the
 By default, the driver sets the NETIF_F_SG bit in the features field of the
-net_device structure enabling the scatter/gather feature.
+net_device structure enabling the scatter-gather feature. This is true on
+chips and configurations where the checksum can be done in hardware.
+Once the controller has finished transmitting the packet, napi will be
+scheduled to release the transmit resources.
 
 
 4.2) Receive process
 4.2) Receive process
 When one or more packets are received, an interrupt happens. The interrupts
 When one or more packets are received, an interrupt happens. The interrupts
@@ -58,20 +62,12 @@ This is based on NAPI so the interrupt handler signals only if there is work
 to be done, and it exits.
 to be done, and it exits.
 Then the poll method will be scheduled at some future point.
 Then the poll method will be scheduled at some future point.
 The incoming packets are stored, by the DMA, in a list of pre-allocated socket
 The incoming packets are stored, by the DMA, in a list of pre-allocated socket
-buffers in order to avoid the memcpy (Zero-copy).
+buffers in order to avoid the memcpy (zero-copy).
 
 
 4.3) Interrupt Mitigation
 4.3) Interrupt Mitigation
 The driver is able to mitigate the number of its DMA interrupts
 The driver is able to mitigate the number of its DMA interrupts
 using NAPI for the reception on chips older than the 3.50.
 using NAPI for the reception on chips older than the 3.50.
 New chips have an HW RX-Watchdog used for this mitigation.
 New chips have an HW RX-Watchdog used for this mitigation.
-
-On Tx-side, the mitigation schema is based on a SW timer that calls the
-tx function (stmmac_tx) to reclaim the resource after transmitting the
-frames.
-Also there is another parameter (like a threshold) used to program
-the descriptors avoiding to set the interrupt on completion bit in
-when the frame is sent (xmit).
-
 Mitigation parameters can be tuned by ethtool.
 Mitigation parameters can be tuned by ethtool.
 
 
 4.4) WOL
 4.4) WOL
@@ -79,7 +75,7 @@ Wake up on Lan feature through Magic and Unicast frames are supported for the
 GMAC core.
 GMAC core.
 
 
 4.5) DMA descriptors
 4.5) DMA descriptors
-Driver handles both normal and enhanced descriptors. The latter has been only
+Driver handles both normal and alternate descriptors. The latter has been only
 tested on DWC Ether MAC 10/100/1000 Universal version 3.41a and later.
 tested on DWC Ether MAC 10/100/1000 Universal version 3.41a and later.
 
 
 STMMAC supports DMA descriptor to operate both in dual buffer (RING)
 STMMAC supports DMA descriptor to operate both in dual buffer (RING)
@@ -91,9 +87,20 @@ In CHAINED mode each descriptor will have pointer to next descriptor in
 the list, hence creating the explicit chaining in the descriptor itself,
 the list, hence creating the explicit chaining in the descriptor itself,
 whereas such explicit chaining is not possible in RING mode.
 whereas such explicit chaining is not possible in RING mode.
 
 
+4.5.1) Extended descriptors
+	The extended descriptors give us information about the Ethernet payload
+	when it is carrying PTP packets or TCP/UDP/ICMP over IP.
+	These are not available on GMAC Synopsys chips older than the 3.50.
+	At probe time the driver will decide if these can be actually used.
+	This support also is mandatory for PTPv2 because the extra descriptors
+	are used for saving the hardware timestamps and Extended Status.
+
 4.6) Ethtool support
 4.6) Ethtool support
-Ethtool is supported. Driver statistics and internal errors can be taken using:
-ethtool -S ethX command. It is possible to dump registers etc.
+Ethtool is supported.
+
+For example, driver statistics (including RMON), internal errors can be taken
+using:
+  # ethtool -S ethX command
 
 
 4.7) Jumbo and Segmentation Offloading
 4.7) Jumbo and Segmentation Offloading
 Jumbo frames are supported and tested for the GMAC.
 Jumbo frames are supported and tested for the GMAC.
@@ -101,12 +108,11 @@ The GSO has been also added but it's performed in software.
 LRO is not supported.
 LRO is not supported.
 
 
 4.8) Physical
 4.8) Physical
-The driver is compatible with PAL to work with PHY and GPHY devices.
+The driver is compatible with Physical Abstraction Layer to be connected with
+PHY and GPHY devices.
 
 
 4.9) Platform information
 4.9) Platform information
-Several driver's information can be passed through the platform
-These are included in the include/linux/stmmac.h header file
-and detailed below as well:
+Several information can be passed through the platform and device-tree.
 
 
 struct plat_stmmacenet_data {
 struct plat_stmmacenet_data {
 	char *phy_bus_name;
 	char *phy_bus_name;
@@ -125,15 +131,18 @@ struct plat_stmmacenet_data {
 	int force_sf_dma_mode;
 	int force_sf_dma_mode;
 	int force_thresh_dma_mode;
 	int force_thresh_dma_mode;
 	int riwt_off;
 	int riwt_off;
+	int max_speed;
+	int maxmtu;
 	void (*fix_mac_speed)(void *priv, unsigned int speed);
 	void (*fix_mac_speed)(void *priv, unsigned int speed);
 	void (*bus_setup)(void __iomem *ioaddr);
 	void (*bus_setup)(void __iomem *ioaddr);
 	void *(*setup)(struct platform_device *pdev);
 	void *(*setup)(struct platform_device *pdev);
+	void (*free)(struct platform_device *pdev, void *priv);
 	int (*init)(struct platform_device *pdev, void *priv);
 	int (*init)(struct platform_device *pdev, void *priv);
 	void (*exit)(struct platform_device *pdev, void *priv);
 	void (*exit)(struct platform_device *pdev, void *priv);
 	void *custom_cfg;
 	void *custom_cfg;
 	void *custom_data;
 	void *custom_data;
 	void *bsp_priv;
 	void *bsp_priv;
- };
+};
 
 
 Where:
 Where:
  o phy_bus_name: phy bus name to attach to the stmmac.
  o phy_bus_name: phy bus name to attach to the stmmac.
@@ -258,32 +267,43 @@ and the second one, with a real PHY device attached to the bus,
 by using the stmmac_mdio_bus_data structure (to provide the id, the
 by using the stmmac_mdio_bus_data structure (to provide the id, the
 reset procedure etc).
 reset procedure etc).
 
 
-4.10) List of source files:
- o Kconfig
- o Makefile
- o stmmac_main.c: main network device driver;
- o stmmac_mdio.c: mdio functions;
- o stmmac_pci: PCI driver;
- o stmmac_platform.c: platform driver
- o stmmac_ethtool.c: ethtool support;
- o stmmac_timer.[ch]: timer code used for mitigating the driver dma interrupts
-		      (only tested on ST40 platforms based);
+Note that, starting from new chips, where it is available the HW capability
+register, many configurations are discovered at run-time for example to
+understand if EEE, HW csum, PTP, enhanced descriptor etc are actually
+available. As strategy adopted in this driver, the information from the HW
+capability register can replace what has been passed from the platform.
+
+4.10) Device-tree support.
+
+Please see the following document:
+	Documentation/devicetree/bindings/net/stmmac.txt
+
+and the stmmac_of_data structure inside the include/linux/stmmac.h header file.
+
+4.11) This is a summary of the content of some relevant files:
+ o stmmac_main.c: to implement the main network device driver;
+ o stmmac_mdio.c: to provide mdio functions;
+ o stmmac_pci: this the PCI driver;
+ o stmmac_platform.c: this the platform driver (OF supported)
+ o stmmac_ethtool.c: to implement the ethtool support;
  o stmmac.h: private driver structure;
  o stmmac.h: private driver structure;
  o common.h: common definitions and VFTs;
  o common.h: common definitions and VFTs;
  o descs.h: descriptor structure definitions;
  o descs.h: descriptor structure definitions;
- o dwmac1000_core.c: GMAC core functions;
- o dwmac1000_dma.c:  dma functions for the GMAC chip;
- o dwmac1000.h: specific header file for the GMAC;
- o dwmac100_core: MAC 100 core and dma code;
- o dwmac100_dma.c: dma functions for the MAC chip;
+ o dwmac1000_core.c: dwmac GiGa core functions;
+ o dwmac1000_dma.c: dma functions for the GMAC chip;
+ o dwmac1000.h: specific header file for the dwmac GiGa;
+ o dwmac100_core: dwmac 100 core code;
+ o dwmac100_dma.c: dma functions for the dwmac 100 chip;
  o dwmac1000.h: specific header file for the MAC;
  o dwmac1000.h: specific header file for the MAC;
- o dwmac_lib.c: generic DMA functions shared among chips;
+ o dwmac_lib.c: generic DMA functions;
  o enh_desc.c: functions for handling enhanced descriptors;
  o enh_desc.c: functions for handling enhanced descriptors;
  o norm_desc.c: functions for handling normal descriptors;
  o norm_desc.c: functions for handling normal descriptors;
  o chain_mode.c/ring_mode.c:: functions to manage RING/CHAINED modes;
  o chain_mode.c/ring_mode.c:: functions to manage RING/CHAINED modes;
  o mmc_core.c/mmc.h: Management MAC Counters;
  o mmc_core.c/mmc.h: Management MAC Counters;
- o stmmac_hwtstamp.c: HW timestamp support for PTP
- o stmmac_ptp.c: PTP 1588 clock
+ o stmmac_hwtstamp.c: HW timestamp support for PTP;
+ o stmmac_ptp.c: PTP 1588 clock;
+ o dwmac-<XXX>.c: these are for the platform glue-logic file; e.g. dwmac-sti.c
+   for STMicroelectronics SoCs.
 
 
 5) Debug Information
 5) Debug Information
 
 
@@ -298,23 +318,14 @@ to get statistics: e.g. using: ethtool -S ethX
 (that shows the Management counters (MMC) if supported)
 (that shows the Management counters (MMC) if supported)
 or sees the MAC/DMA registers: e.g. using: ethtool -d ethX
 or sees the MAC/DMA registers: e.g. using: ethtool -d ethX
 
 
-Compiling the Kernel with CONFIG_DEBUG_FS and enabling the
-STMMAC_DEBUG_FS option the driver will export the following
+Compiling the Kernel with CONFIG_DEBUG_FS the driver will export the following
 debugfs entries:
 debugfs entries:
 
 
 /sys/kernel/debug/stmmaceth/descriptors_status
 /sys/kernel/debug/stmmaceth/descriptors_status
   To show the DMA TX/RX descriptor rings
   To show the DMA TX/RX descriptor rings
 
 
-Developer can also use the "debug" module parameter to get
-further debug information.
-
-In the end, there are other macros (that cannot be enabled
-via menuconfig) to turn-on the RX/TX DMA debugging,
-specific MAC core debug printk etc. Others to enable the
-debug in the TX and RX processes.
-All these are only useful during the developing stage
-and should never enabled inside the code for general usage.
-In fact, these can generate an huge amount of debug messages.
+Developer can also use the "debug" module parameter to get further debug
+information (please see: NETIF Msg Level).
 
 
 6) Energy Efficient Ethernet
 6) Energy Efficient Ethernet
 
 
@@ -337,15 +348,7 @@ To enter in Tx LPI mode the driver needs to have a software timer
 that enable and disable the LPI mode when there is nothing to be
 that enable and disable the LPI mode when there is nothing to be
 transmitted.
 transmitted.
 
 
-7) Extended descriptors
-The extended descriptors give us information about the receive Ethernet payload
-when it is carrying PTP packets or TCP/UDP/ICMP over IP.
-These are not available on GMAC Synopsys chips older than the 3.50.
-At probe time the driver will decide if these can be actually used.
-This support also is mandatory for PTPv2 because the extra descriptors 6 and 7
-are used for saving the hardware timestamps.
-
-8) Precision Time Protocol (PTP)
+7) Precision Time Protocol (PTP)
 The driver supports the IEEE 1588-2002, Precision Time Protocol (PTP),
 The driver supports the IEEE 1588-2002, Precision Time Protocol (PTP),
 which enables precise synchronization of clocks in measurement and
 which enables precise synchronization of clocks in measurement and
 control systems implemented with technologies such as network
 control systems implemented with technologies such as network
@@ -355,7 +358,7 @@ In addition to the basic timestamp features mentioned in IEEE 1588-2002
 Timestamps, new GMAC cores support the advanced timestamp features.
 Timestamps, new GMAC cores support the advanced timestamp features.
 IEEE 1588-2008 that can be enabled when configure the Kernel.
 IEEE 1588-2008 that can be enabled when configure the Kernel.
 
 
-9) SGMII/RGMII supports
+8) SGMII/RGMII supports
 New GMAC devices provide own way to manage RGMII/SGMII.
 New GMAC devices provide own way to manage RGMII/SGMII.
 This information is available at run-time by looking at the
 This information is available at run-time by looking at the
 HW capability register. This means that the stmmac can manage
 HW capability register. This means that the stmmac can manage
@@ -364,8 +367,3 @@ In fact, the HW provides a subset of extended registers to
 restart the ANE, verify Full/Half duplex mode and Speed.
 restart the ANE, verify Full/Half duplex mode and Speed.
 Also thanks to these registers it is possible to look at the
 Also thanks to these registers it is possible to look at the
 Auto-negotiated Link Parter Ability.
 Auto-negotiated Link Parter Ability.
-
-10) TODO:
- o XGMAC is not supported.
- o Complete the TBI & RTBI support.
- o extend VLAN support for 3.70a SYNP GMAC.

+ 59 - 0
Documentation/networking/switchdev.txt

@@ -0,0 +1,59 @@
+Switch (and switch-ish) device drivers HOWTO
+===========================
+
+Please note that the word "switch" is here used in very generic meaning.
+This include devices supporting L2/L3 but also various flow offloading chips,
+including switches embedded into SR-IOV NICs.
+
+Lets describe a topology a bit. Imagine the following example:
+
+       +----------------------------+    +---------------+
+       |     SOME switch chip       |    |      CPU      |
+       +----------------------------+    +---------------+
+       port1 port2 port3 port4 MNGMNT    |     PCI-E     |
+         |     |     |     |     |       +---------------+
+        PHY   PHY    |     |     |         |  NIC0 NIC1
+                     |     |     |         |   |    |
+                     |     |     +- PCI-E -+   |    |
+                     |     +------- MII -------+    |
+                     +------------- MII ------------+
+
+In this example, there are two independent lines between the switch silicon
+and CPU. NIC0 and NIC1 drivers are not aware of a switch presence. They are
+separate from the switch driver. SOME switch chip is by managed by a driver
+via PCI-E device MNGMNT. Note that MNGMNT device, NIC0 and NIC1 may be
+connected to some other type of bus.
+
+Now, for the previous example show the representation in kernel:
+
+       +----------------------------+    +---------------+
+       |     SOME switch chip       |    |      CPU      |
+       +----------------------------+    +---------------+
+       sw0p0 sw0p1 sw0p2 sw0p3 MNGMNT    |     PCI-E     |
+         |     |     |     |     |       +---------------+
+        PHY   PHY    |     |     |         |  eth0 eth1
+                     |     |     |         |   |    |
+                     |     |     +- PCI-E -+   |    |
+                     |     +------- MII -------+    |
+                     +------------- MII ------------+
+
+Lets call the example switch driver for SOME switch chip "SOMEswitch". This
+driver takes care of PCI-E device MNGMNT. There is a netdevice instance sw0pX
+created for each port of a switch. These netdevices are instances
+of "SOMEswitch" driver. sw0pX netdevices serve as a "representation"
+of the switch chip. eth0 and eth1 are instances of some other existing driver.
+
+The only difference of the switch-port netdevice from the ordinary netdevice
+is that is implements couple more NDOs:
+
+  ndo_switch_parent_id_get - This returns the same ID for two port netdevices
+			     of the same physical switch chip. This is
+			     mandatory to be implemented by all switch drivers
+			     and serves the caller for recognition of a port
+			     netdevice.
+  ndo_switch_parent_* - Functions that serve for a manipulation of the switch
+			chip itself (it can be though of as a "parent" of the
+			port, therefore the name). They are not port-specific.
+			Caller might use arbitrary port netdevice of the same
+			switch and it will make no difference.
+  ndo_switch_port_* - Functions that serve for a port-specific manipulation.

+ 25 - 8
Documentation/networking/timestamping.txt

@@ -122,7 +122,7 @@ SOF_TIMESTAMPING_RAW_HARDWARE:
 
 
 1.3.3 Timestamp Options
 1.3.3 Timestamp Options
 
 
-The interface supports one option
+The interface supports the options
 
 
 SOF_TIMESTAMPING_OPT_ID:
 SOF_TIMESTAMPING_OPT_ID:
 
 
@@ -130,19 +130,36 @@ SOF_TIMESTAMPING_OPT_ID:
   have multiple concurrent timestamping requests outstanding. Packets
   have multiple concurrent timestamping requests outstanding. Packets
   can be reordered in the transmit path, for instance in the packet
   can be reordered in the transmit path, for instance in the packet
   scheduler. In that case timestamps will be queued onto the error
   scheduler. In that case timestamps will be queued onto the error
-  queue out of order from the original send() calls. This option
-  embeds a counter that is incremented at send() time, to order
-  timestamps within a flow.
+  queue out of order from the original send() calls. It is not always
+  possible to uniquely match timestamps to the original send() calls
+  based on timestamp order or payload inspection alone, then.
+
+  This option associates each packet at send() with a unique
+  identifier and returns that along with the timestamp. The identifier
+  is derived from a per-socket u32 counter (that wraps). For datagram
+  sockets, the counter increments with each sent packet. For stream
+  sockets, it increments with every byte.
+
+  The counter starts at zero. It is initialized the first time that
+  the socket option is enabled. It is reset each time the option is
+  enabled after having been disabled. Resetting the counter does not
+  change the identifiers of existing packets in the system.
 
 
   This option is implemented only for transmit timestamps. There, the
   This option is implemented only for transmit timestamps. There, the
   timestamp is always looped along with a struct sock_extended_err.
   timestamp is always looped along with a struct sock_extended_err.
   The option modifies field ee_data to pass an id that is unique
   The option modifies field ee_data to pass an id that is unique
   among all possibly concurrently outstanding timestamp requests for
   among all possibly concurrently outstanding timestamp requests for
-  that socket. In practice, it is a monotonically increasing u32
-  (that wraps).
+  that socket.
+
+
+SOF_TIMESTAMPING_OPT_CMSG:
 
 
-  In datagram sockets, the counter increments on each send call. In
-  stream sockets, it increments with every byte.
+  Support recv() cmsg for all timestamped packets. Control messages
+  are already supported unconditionally on all packets with receive
+  timestamps and on IPv6 packets with transmit timestamp. This option
+  extends them to IPv4 packets with transmit timestamp. One use case
+  is to correlate packets with their egress device, by enabling socket
+  option IP_PKTINFO simultaneously.
 
 
 
 
 1.4 Bytestream Timestamps
 1.4 Bytestream Timestamps

+ 78 - 12
Documentation/networking/timestamping/txtimestamp.c

@@ -46,6 +46,7 @@
 #include <netpacket/packet.h>
 #include <netpacket/packet.h>
 #include <poll.h>
 #include <poll.h>
 #include <stdarg.h>
 #include <stdarg.h>
+#include <stdbool.h>
 #include <stdint.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdlib.h>
@@ -58,6 +59,14 @@
 #include <time.h>
 #include <time.h>
 #include <unistd.h>
 #include <unistd.h>
 
 
+/* ugly hack to work around netinet/in.h and linux/ipv6.h conflicts */
+#ifndef in6_pktinfo
+struct in6_pktinfo {
+	struct in6_addr	ipi6_addr;
+	int		ipi6_ifindex;
+};
+#endif
+
 /* command line parameters */
 /* command line parameters */
 static int cfg_proto = SOCK_STREAM;
 static int cfg_proto = SOCK_STREAM;
 static int cfg_ipproto = IPPROTO_TCP;
 static int cfg_ipproto = IPPROTO_TCP;
@@ -65,6 +74,8 @@ static int cfg_num_pkts = 4;
 static int do_ipv4 = 1;
 static int do_ipv4 = 1;
 static int do_ipv6 = 1;
 static int do_ipv6 = 1;
 static int cfg_payload_len = 10;
 static int cfg_payload_len = 10;
+static bool cfg_show_payload;
+static bool cfg_do_pktinfo;
 static uint16_t dest_port = 9000;
 static uint16_t dest_port = 9000;
 
 
 static struct sockaddr_in daddr;
 static struct sockaddr_in daddr;
@@ -131,6 +142,30 @@ static void print_timestamp(struct scm_timestamping *tss, int tstype,
 	__print_timestamp(tsname, &tss->ts[0], tskey, payload_len);
 	__print_timestamp(tsname, &tss->ts[0], tskey, payload_len);
 }
 }
 
 
+/* TODO: convert to check_and_print payload once API is stable */
+static void print_payload(char *data, int len)
+{
+	int i;
+
+	if (len > 70)
+		len = 70;
+
+	fprintf(stderr, "payload: ");
+	for (i = 0; i < len; i++)
+		fprintf(stderr, "%02hhx ", data[i]);
+	fprintf(stderr, "\n");
+}
+
+static void print_pktinfo(int family, int ifindex, void *saddr, void *daddr)
+{
+	char sa[INET6_ADDRSTRLEN], da[INET6_ADDRSTRLEN];
+
+	fprintf(stderr, "         pktinfo: ifindex=%u src=%s dst=%s\n",
+		ifindex,
+		saddr ? inet_ntop(family, saddr, sa, sizeof(sa)) : "unknown",
+		daddr ? inet_ntop(family, daddr, da, sizeof(da)) : "unknown");
+}
+
 static void __poll(int fd)
 static void __poll(int fd)
 {
 {
 	struct pollfd pollfd;
 	struct pollfd pollfd;
@@ -156,10 +191,9 @@ static void __recv_errmsg_cmsg(struct msghdr *msg, int payload_len)
 		    cm->cmsg_type == SCM_TIMESTAMPING) {
 		    cm->cmsg_type == SCM_TIMESTAMPING) {
 			tss = (void *) CMSG_DATA(cm);
 			tss = (void *) CMSG_DATA(cm);
 		} else if ((cm->cmsg_level == SOL_IP &&
 		} else if ((cm->cmsg_level == SOL_IP &&
-		     cm->cmsg_type == IP_RECVERR) ||
-		    (cm->cmsg_level == SOL_IPV6 &&
-		     cm->cmsg_type == IPV6_RECVERR)) {
-
+			    cm->cmsg_type == IP_RECVERR) ||
+			   (cm->cmsg_level == SOL_IPV6 &&
+			    cm->cmsg_type == IPV6_RECVERR)) {
 			serr = (void *) CMSG_DATA(cm);
 			serr = (void *) CMSG_DATA(cm);
 			if (serr->ee_errno != ENOMSG ||
 			if (serr->ee_errno != ENOMSG ||
 			    serr->ee_origin != SO_EE_ORIGIN_TIMESTAMPING) {
 			    serr->ee_origin != SO_EE_ORIGIN_TIMESTAMPING) {
@@ -168,6 +202,16 @@ static void __recv_errmsg_cmsg(struct msghdr *msg, int payload_len)
 						serr->ee_origin);
 						serr->ee_origin);
 				serr = NULL;
 				serr = NULL;
 			}
 			}
+		} else if (cm->cmsg_level == SOL_IP &&
+			   cm->cmsg_type == IP_PKTINFO) {
+			struct in_pktinfo *info = (void *) CMSG_DATA(cm);
+			print_pktinfo(AF_INET, info->ipi_ifindex,
+				      &info->ipi_spec_dst, &info->ipi_addr);
+		} else if (cm->cmsg_level == SOL_IPV6 &&
+			   cm->cmsg_type == IPV6_PKTINFO) {
+			struct in6_pktinfo *info6 = (void *) CMSG_DATA(cm);
+			print_pktinfo(AF_INET6, info6->ipi6_ifindex,
+				      NULL, &info6->ipi6_addr);
 		} else
 		} else
 			fprintf(stderr, "unknown cmsg %d,%d\n",
 			fprintf(stderr, "unknown cmsg %d,%d\n",
 					cm->cmsg_level, cm->cmsg_type);
 					cm->cmsg_level, cm->cmsg_type);
@@ -206,7 +250,11 @@ static int recv_errmsg(int fd)
 	if (ret == -1 && errno != EAGAIN)
 	if (ret == -1 && errno != EAGAIN)
 		error(1, errno, "recvmsg");
 		error(1, errno, "recvmsg");
 
 
-	__recv_errmsg_cmsg(&msg, ret);
+	if (ret > 0) {
+		__recv_errmsg_cmsg(&msg, ret);
+		if (cfg_show_payload)
+			print_payload(data, cfg_payload_len);
+	}
 
 
 	free(data);
 	free(data);
 	return ret == -1;
 	return ret == -1;
@@ -215,9 +263,9 @@ static int recv_errmsg(int fd)
 static void do_test(int family, unsigned int opt)
 static void do_test(int family, unsigned int opt)
 {
 {
 	char *buf;
 	char *buf;
-	int fd, i, val, total_len;
+	int fd, i, val = 1, total_len;
 
 
-	if (family == IPPROTO_IPV6 && cfg_proto != SOCK_STREAM) {
+	if (family == AF_INET6 && cfg_proto != SOCK_STREAM) {
 		/* due to lack of checksum generation code */
 		/* due to lack of checksum generation code */
 		fprintf(stderr, "test: skipping datagram over IPv6\n");
 		fprintf(stderr, "test: skipping datagram over IPv6\n");
 		return;
 		return;
@@ -239,7 +287,6 @@ static void do_test(int family, unsigned int opt)
 		error(1, errno, "socket");
 		error(1, errno, "socket");
 
 
 	if (cfg_proto == SOCK_STREAM) {
 	if (cfg_proto == SOCK_STREAM) {
-		val = 1;
 		if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY,
 		if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY,
 			       (char*) &val, sizeof(val)))
 			       (char*) &val, sizeof(val)))
 			error(1, 0, "setsockopt no nagle");
 			error(1, 0, "setsockopt no nagle");
@@ -253,7 +300,20 @@ static void do_test(int family, unsigned int opt)
 		}
 		}
 	}
 	}
 
 
+	if (cfg_do_pktinfo) {
+		if (family == AF_INET6) {
+			if (setsockopt(fd, SOL_IPV6, IPV6_RECVPKTINFO,
+				       &val, sizeof(val)))
+				error(1, errno, "setsockopt pktinfo ipv6");
+		} else {
+			if (setsockopt(fd, SOL_IP, IP_PKTINFO,
+				       &val, sizeof(val)))
+				error(1, errno, "setsockopt pktinfo ipv4");
+		}
+	}
+
 	opt |= SOF_TIMESTAMPING_SOFTWARE |
 	opt |= SOF_TIMESTAMPING_SOFTWARE |
+	       SOF_TIMESTAMPING_OPT_CMSG |
 	       SOF_TIMESTAMPING_OPT_ID;
 	       SOF_TIMESTAMPING_OPT_ID;
 	if (setsockopt(fd, SOL_SOCKET, SO_TIMESTAMPING,
 	if (setsockopt(fd, SOL_SOCKET, SO_TIMESTAMPING,
 		       (char *) &opt, sizeof(opt)))
 		       (char *) &opt, sizeof(opt)))
@@ -262,8 +322,6 @@ static void do_test(int family, unsigned int opt)
 	for (i = 0; i < cfg_num_pkts; i++) {
 	for (i = 0; i < cfg_num_pkts; i++) {
 		memset(&ts_prev, 0, sizeof(ts_prev));
 		memset(&ts_prev, 0, sizeof(ts_prev));
 		memset(buf, 'a' + i, total_len);
 		memset(buf, 'a' + i, total_len);
-		buf[total_len - 2] = '\n';
-		buf[total_len - 1] = '\0';
 
 
 		if (cfg_proto == SOCK_RAW) {
 		if (cfg_proto == SOCK_RAW) {
 			struct udphdr *udph;
 			struct udphdr *udph;
@@ -324,11 +382,13 @@ static void __attribute__((noreturn)) usage(const char *filepath)
 			"  -4:   only IPv4\n"
 			"  -4:   only IPv4\n"
 			"  -6:   only IPv6\n"
 			"  -6:   only IPv6\n"
 			"  -h:   show this message\n"
 			"  -h:   show this message\n"
+			"  -I:   request PKTINFO\n"
 			"  -l N: send N bytes at a time\n"
 			"  -l N: send N bytes at a time\n"
 			"  -r:   use raw\n"
 			"  -r:   use raw\n"
 			"  -R:   use raw (IP_HDRINCL)\n"
 			"  -R:   use raw (IP_HDRINCL)\n"
 			"  -p N: connect to port N\n"
 			"  -p N: connect to port N\n"
-			"  -u:   use udp\n",
+			"  -u:   use udp\n"
+			"  -x:   show payload (up to 70 bytes)\n",
 			filepath);
 			filepath);
 	exit(1);
 	exit(1);
 }
 }
@@ -338,7 +398,7 @@ static void parse_opt(int argc, char **argv)
 	int proto_count = 0;
 	int proto_count = 0;
 	char c;
 	char c;
 
 
-	while ((c = getopt(argc, argv, "46hl:p:rRu")) != -1) {
+	while ((c = getopt(argc, argv, "46hIl:p:rRux")) != -1) {
 		switch (c) {
 		switch (c) {
 		case '4':
 		case '4':
 			do_ipv6 = 0;
 			do_ipv6 = 0;
@@ -346,6 +406,9 @@ static void parse_opt(int argc, char **argv)
 		case '6':
 		case '6':
 			do_ipv4 = 0;
 			do_ipv4 = 0;
 			break;
 			break;
+		case 'I':
+			cfg_do_pktinfo = true;
+			break;
 		case 'r':
 		case 'r':
 			proto_count++;
 			proto_count++;
 			cfg_proto = SOCK_RAW;
 			cfg_proto = SOCK_RAW;
@@ -367,6 +430,9 @@ static void parse_opt(int argc, char **argv)
 		case 'p':
 		case 'p':
 			dest_port = strtoul(optarg, NULL, 10);
 			dest_port = strtoul(optarg, NULL, 10);
 			break;
 			break;
+		case 'x':
+			cfg_show_payload = true;
+			break;
 		case 'h':
 		case 'h':
 		default:
 		default:
 			usage(argv[0]);
 			usage(argv[0]);

+ 30 - 4
Documentation/sysctl/net.txt

@@ -120,10 +120,14 @@ seconds.
 warnings
 warnings
 --------
 --------
 
 
-This controls console messages from the networking stack that can occur because
-of problems on the network like duplicate address or bad checksums. Normally,
-this should be enabled, but if the problem persists the messages can be
-disabled.
+This sysctl is now unused.
+
+This was used to control console messages from the networking stack that
+occur because of problems on the network like duplicate address or bad
+checksums.
+
+These messages are now emitted at KERN_DEBUG and can generally be enabled
+and controlled by the dynamic_debug facility.
 
 
 netdev_budget
 netdev_budget
 -------------
 -------------
@@ -138,6 +142,28 @@ netdev_max_backlog
 Maximum number  of  packets,  queued  on  the  INPUT  side, when the interface
 Maximum number  of  packets,  queued  on  the  INPUT  side, when the interface
 receives packets faster than kernel can process them.
 receives packets faster than kernel can process them.
 
 
+netdev_rss_key
+--------------
+
+RSS (Receive Side Scaling) enabled drivers use a 40 bytes host key that is
+randomly generated.
+Some user space might need to gather its content even if drivers do not
+provide ethtool -x support yet.
+
+myhost:~# cat /proc/sys/net/core/netdev_rss_key
+84:50:f4:00:a8:15:d1:a7:e9:7f:1d:60:35:c7:47:25:42:97:74:ca:56:bb:b6:a1:d8: ... (52 bytes total)
+
+File contains nul bytes if no driver ever called netdev_rss_key_fill() function.
+Note:
+/proc/sys/net/core/netdev_rss_key contains 52 bytes of key,
+but most drivers only use 40 bytes of it.
+
+myhost:~# ethtool -x eth0
+RX flow hash indirection table for eth0 with 8 RX ring(s):
+    0:    0     1     2     3     4     5     6     7
+RSS hash key:
+84:50:f4:00:a8:15:d1:a7:e9:7f:1d:60:35:c7:47:25:42:97:74:ca:56:bb:b6:a1:d8:43:e3:c9:0c:fd:17:55:c2:3a:4d:69:ed:f1:42:89
+
 netdev_tstamp_prequeue
 netdev_tstamp_prequeue
 ----------------------
 ----------------------
 
 

+ 35 - 2
MAINTAINERS

@@ -2332,6 +2332,14 @@ F:	security/capability.c
 F:	security/commoncap.c
 F:	security/commoncap.c
 F:	kernel/capability.c
 F:	kernel/capability.c
 
 
+CC2520 IEEE-802.15.4 RADIO DRIVER
+M:	Varka Bhadram <varkabhadram@gmail.com>
+L:	linux-wpan@vger.kernel.org
+S:	Maintained
+F:	drivers/net/ieee802154/cc2520.c
+F:	include/linux/spi/cc2520.h
+F:	Documentation/devicetree/bindings/net/ieee802154/cc2520.txt
+
 CELL BROADBAND ENGINE ARCHITECTURE
 CELL BROADBAND ENGINE ARCHITECTURE
 M:	Arnd Bergmann <arnd@arndb.de>
 M:	Arnd Bergmann <arnd@arndb.de>
 L:	linuxppc-dev@lists.ozlabs.org
 L:	linuxppc-dev@lists.ozlabs.org
@@ -4752,6 +4760,13 @@ S:	Maintained
 F:	net/ieee802154/
 F:	net/ieee802154/
 F:	net/mac802154/
 F:	net/mac802154/
 F:	drivers/net/ieee802154/
 F:	drivers/net/ieee802154/
+F:	include/linux/nl802154.h
+F:	include/linux/ieee802154.h
+F:	include/net/nl802154.h
+F:	include/net/mac802154.h
+F:	include/net/af_ieee802154.h
+F:	include/net/cfg802154.h
+F:	include/net/ieee802154_netdev.h
 F:	Documentation/networking/ieee802154.txt
 F:	Documentation/networking/ieee802154.txt
 
 
 IGORPLUG-USB IR RECEIVER
 IGORPLUG-USB IR RECEIVER
@@ -5931,6 +5946,11 @@ M:	Russell King <rmk+kernel@arm.linux.org.uk>
 S:	Maintained
 S:	Maintained
 F:	drivers/gpu/drm/armada/
 F:	drivers/gpu/drm/armada/
 
 
+MARVELL 88E6352 DSA support
+M:	Guenter Roeck <linux@roeck-us.net>
+S:	Maintained
+F:	drivers/net/dsa/mv88e6352.c
+
 MARVELL GIGABIT ETHERNET DRIVERS (skge/sky2)
 MARVELL GIGABIT ETHERNET DRIVERS (skge/sky2)
 M:	Mirko Lindner <mlindner@marvell.com>
 M:	Mirko Lindner <mlindner@marvell.com>
 M:	Stephen Hemminger <stephen@networkplumber.org>
 M:	Stephen Hemminger <stephen@networkplumber.org>
@@ -7956,6 +7976,13 @@ F:	drivers/hid/hid-roccat*
 F:	include/linux/hid-roccat*
 F:	include/linux/hid-roccat*
 F:	Documentation/ABI/*/sysfs-driver-hid-roccat*
 F:	Documentation/ABI/*/sysfs-driver-hid-roccat*
 
 
+ROCKER DRIVER
+M:	Jiri Pirko <jiri@resnulli.us>
+M:	Scott Feldman <sfeldma@gmail.com>
+L:	netdev@vger.kernel.org
+S:	Supported
+F:	drivers/net/ethernet/rocker/
+
 ROCKETPORT DRIVER
 ROCKETPORT DRIVER
 P:	Comtrol Corp.
 P:	Comtrol Corp.
 W:	http://www.comtrol.com
 W:	http://www.comtrol.com
@@ -8003,11 +8030,10 @@ S:	Maintained
 F:	drivers/media/dvb-frontends/rtl2832_sdr*
 F:	drivers/media/dvb-frontends/rtl2832_sdr*
 
 
 RTL8180 WIRELESS DRIVER
 RTL8180 WIRELESS DRIVER
-M:	"John W. Linville" <linville@tuxdriver.com>
 L:	linux-wireless@vger.kernel.org
 L:	linux-wireless@vger.kernel.org
 W:	http://wireless.kernel.org/
 W:	http://wireless.kernel.org/
 T:	git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git
 T:	git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git
-S:	Maintained
+S:	Orphan
 F:	drivers/net/wireless/rtl818x/rtl8180/
 F:	drivers/net/wireless/rtl818x/rtl8180/
 
 
 RTL8187 WIRELESS DRIVER
 RTL8187 WIRELESS DRIVER
@@ -9160,6 +9186,13 @@ F:	lib/swiotlb.c
 F:	arch/*/kernel/pci-swiotlb.c
 F:	arch/*/kernel/pci-swiotlb.c
 F:	include/linux/swiotlb.h
 F:	include/linux/swiotlb.h
 
 
+SWITCHDEV
+M:	Jiri Pirko <jiri@resnulli.us>
+L:	netdev@vger.kernel.org
+S:	Supported
+F:	net/switchdev/
+F:	include/net/switchdev.h
+
 SYNOPSYS ARC ARCHITECTURE
 SYNOPSYS ARC ARCHITECTURE
 M:	Vineet Gupta <vgupta@synopsys.com>
 M:	Vineet Gupta <vgupta@synopsys.com>
 S:	Supported
 S:	Supported

+ 0 - 1
arch/alpha/include/asm/Kbuild

@@ -3,7 +3,6 @@
 generic-y += clkdev.h
 generic-y += clkdev.h
 generic-y += cputime.h
 generic-y += cputime.h
 generic-y += exec.h
 generic-y += exec.h
-generic-y += hash.h
 generic-y += irq_work.h
 generic-y += irq_work.h
 generic-y += mcs_spinlock.h
 generic-y += mcs_spinlock.h
 generic-y += preempt.h
 generic-y += preempt.h

+ 5 - 0
arch/alpha/include/uapi/asm/socket.h

@@ -87,4 +87,9 @@
 
 
 #define SO_BPF_EXTENSIONS	48
 #define SO_BPF_EXTENSIONS	48
 
 
+#define SO_INCOMING_CPU		49
+
+#define SO_ATTACH_BPF		50
+#define SO_DETACH_BPF		SO_DETACH_FILTER
+
 #endif /* _UAPI_ASM_SOCKET_H */
 #endif /* _UAPI_ASM_SOCKET_H */

+ 0 - 1
arch/arc/include/asm/Kbuild

@@ -12,7 +12,6 @@ generic-y += fb.h
 generic-y += fcntl.h
 generic-y += fcntl.h
 generic-y += ftrace.h
 generic-y += ftrace.h
 generic-y += hardirq.h
 generic-y += hardirq.h
-generic-y += hash.h
 generic-y += hw_irq.h
 generic-y += hw_irq.h
 generic-y += ioctl.h
 generic-y += ioctl.h
 generic-y += ioctls.h
 generic-y += ioctls.h

+ 0 - 1
arch/arm/configs/davinci_all_defconfig

@@ -97,7 +97,6 @@ CONFIG_PPP_ASYNC=m
 CONFIG_PPP_SYNC_TTY=m
 CONFIG_PPP_SYNC_TTY=m
 CONFIG_PPP_DEFLATE=m
 CONFIG_PPP_DEFLATE=m
 CONFIG_NETCONSOLE=y
 CONFIG_NETCONSOLE=y
-CONFIG_NETPOLL_TRAP=y
 # CONFIG_INPUT_MOUSEDEV is not set
 # CONFIG_INPUT_MOUSEDEV is not set
 CONFIG_INPUT_EVDEV=m
 CONFIG_INPUT_EVDEV=m
 CONFIG_INPUT_EVBUG=m
 CONFIG_INPUT_EVBUG=m

+ 0 - 1
arch/arm/include/asm/Kbuild

@@ -7,7 +7,6 @@ generic-y += current.h
 generic-y += emergency-restart.h
 generic-y += emergency-restart.h
 generic-y += errno.h
 generic-y += errno.h
 generic-y += exec.h
 generic-y += exec.h
-generic-y += hash.h
 generic-y += ioctl.h
 generic-y += ioctl.h
 generic-y += ipcbuf.h
 generic-y += ipcbuf.h
 generic-y += irq_regs.h
 generic-y += irq_regs.h

+ 2 - 2
arch/arm/kernel/sys_oabi-compat.c

@@ -400,7 +400,7 @@ asmlinkage long sys_oabi_sendto(int fd, void __user *buff,
 	return sys_sendto(fd, buff, len, flags, addr, addrlen);
 	return sys_sendto(fd, buff, len, flags, addr, addrlen);
 }
 }
 
 
-asmlinkage long sys_oabi_sendmsg(int fd, struct msghdr __user *msg, unsigned flags)
+asmlinkage long sys_oabi_sendmsg(int fd, struct user_msghdr __user *msg, unsigned flags)
 {
 {
 	struct sockaddr __user *addr;
 	struct sockaddr __user *addr;
 	int msg_namelen;
 	int msg_namelen;
@@ -446,7 +446,7 @@ asmlinkage long sys_oabi_socketcall(int call, unsigned long __user *args)
 		break;
 		break;
 	case SYS_SENDMSG:
 	case SYS_SENDMSG:
 		if (copy_from_user(a, args, 3 * sizeof(long)) == 0)
 		if (copy_from_user(a, args, 3 * sizeof(long)) == 0)
-			r = sys_oabi_sendmsg(a[0], (struct msghdr __user *)a[1], a[2]);
+			r = sys_oabi_sendmsg(a[0], (struct user_msghdr __user *)a[1], a[2]);
 		break;
 		break;
 	default:
 	default:
 		r = sys_socketcall(call, args);
 		r = sys_socketcall(call, args);

+ 1 - 0
arch/arm/mach-mmp/gplugd.c

@@ -158,6 +158,7 @@ struct pxa168_eth_platform_data gplugd_eth_platform_data = {
 	.port_number = 0,
 	.port_number = 0,
 	.phy_addr    = 0,
 	.phy_addr    = 0,
 	.speed       = 0, /* Autonagotiation */
 	.speed       = 0, /* Autonagotiation */
+	.intf        = PHY_INTERFACE_MODE_RMII,
 	.init        = gplugd_eth_init,
 	.init        = gplugd_eth_init,
 };
 };
 
 

+ 0 - 1
arch/arm64/include/asm/Kbuild

@@ -14,7 +14,6 @@ generic-y += early_ioremap.h
 generic-y += emergency-restart.h
 generic-y += emergency-restart.h
 generic-y += errno.h
 generic-y += errno.h
 generic-y += ftrace.h
 generic-y += ftrace.h
-generic-y += hash.h
 generic-y += hw_irq.h
 generic-y += hw_irq.h
 generic-y += ioctl.h
 generic-y += ioctl.h
 generic-y += ioctls.h
 generic-y += ioctls.h

+ 0 - 1
arch/avr32/include/asm/Kbuild

@@ -7,7 +7,6 @@ generic-y += div64.h
 generic-y += emergency-restart.h
 generic-y += emergency-restart.h
 generic-y += exec.h
 generic-y += exec.h
 generic-y += futex.h
 generic-y += futex.h
-generic-y += hash.h
 generic-y += irq_regs.h
 generic-y += irq_regs.h
 generic-y += irq_work.h
 generic-y += irq_work.h
 generic-y += local.h
 generic-y += local.h

+ 5 - 0
arch/avr32/include/uapi/asm/socket.h

@@ -80,4 +80,9 @@
 
 
 #define SO_BPF_EXTENSIONS	48
 #define SO_BPF_EXTENSIONS	48
 
 
+#define SO_INCOMING_CPU		49
+
+#define SO_ATTACH_BPF		50
+#define SO_DETACH_BPF		SO_DETACH_FILTER
+
 #endif /* _UAPI__ASM_AVR32_SOCKET_H */
 #endif /* _UAPI__ASM_AVR32_SOCKET_H */

+ 0 - 1
arch/blackfin/include/asm/Kbuild

@@ -10,7 +10,6 @@ generic-y += emergency-restart.h
 generic-y += errno.h
 generic-y += errno.h
 generic-y += fb.h
 generic-y += fb.h
 generic-y += futex.h
 generic-y += futex.h
-generic-y += hash.h
 generic-y += hw_irq.h
 generic-y += hw_irq.h
 generic-y += ioctl.h
 generic-y += ioctl.h
 generic-y += ipcbuf.h
 generic-y += ipcbuf.h

+ 0 - 1
arch/c6x/include/asm/Kbuild

@@ -15,7 +15,6 @@ generic-y += exec.h
 generic-y += fb.h
 generic-y += fb.h
 generic-y += fcntl.h
 generic-y += fcntl.h
 generic-y += futex.h
 generic-y += futex.h
-generic-y += hash.h
 generic-y += hw_irq.h
 generic-y += hw_irq.h
 generic-y += io.h
 generic-y += io.h
 generic-y += ioctl.h
 generic-y += ioctl.h

+ 0 - 1
arch/cris/include/asm/Kbuild

@@ -7,7 +7,6 @@ generic-y += barrier.h
 generic-y += clkdev.h
 generic-y += clkdev.h
 generic-y += cputime.h
 generic-y += cputime.h
 generic-y += exec.h
 generic-y += exec.h
-generic-y += hash.h
 generic-y += irq_work.h
 generic-y += irq_work.h
 generic-y += kvm_para.h
 generic-y += kvm_para.h
 generic-y += linkage.h
 generic-y += linkage.h

+ 5 - 0
arch/cris/include/uapi/asm/socket.h

@@ -82,6 +82,11 @@
 
 
 #define SO_BPF_EXTENSIONS	48
 #define SO_BPF_EXTENSIONS	48
 
 
+#define SO_INCOMING_CPU		49
+
+#define SO_ATTACH_BPF		50
+#define SO_DETACH_BPF		SO_DETACH_FILTER
+
 #endif /* _ASM_SOCKET_H */
 #endif /* _ASM_SOCKET_H */
 
 
 
 

+ 0 - 1
arch/frv/include/asm/Kbuild

@@ -2,7 +2,6 @@
 generic-y += clkdev.h
 generic-y += clkdev.h
 generic-y += cputime.h
 generic-y += cputime.h
 generic-y += exec.h
 generic-y += exec.h
-generic-y += hash.h
 generic-y += irq_work.h
 generic-y += irq_work.h
 generic-y += mcs_spinlock.h
 generic-y += mcs_spinlock.h
 generic-y += preempt.h
 generic-y += preempt.h

+ 5 - 0
arch/frv/include/uapi/asm/socket.h

@@ -80,5 +80,10 @@
 
 
 #define SO_BPF_EXTENSIONS	48
 #define SO_BPF_EXTENSIONS	48
 
 
+#define SO_INCOMING_CPU		49
+
+#define SO_ATTACH_BPF		50
+#define SO_DETACH_BPF		SO_DETACH_FILTER
+
 #endif /* _ASM_SOCKET_H */
 #endif /* _ASM_SOCKET_H */
 
 

+ 0 - 1
arch/hexagon/include/asm/Kbuild

@@ -16,7 +16,6 @@ generic-y += fb.h
 generic-y += fcntl.h
 generic-y += fcntl.h
 generic-y += ftrace.h
 generic-y += ftrace.h
 generic-y += hardirq.h
 generic-y += hardirq.h
-generic-y += hash.h
 generic-y += hw_irq.h
 generic-y += hw_irq.h
 generic-y += ioctl.h
 generic-y += ioctl.h
 generic-y += ioctls.h
 generic-y += ioctls.h

+ 0 - 1
arch/ia64/include/asm/Kbuild

@@ -1,7 +1,6 @@
 
 
 generic-y += clkdev.h
 generic-y += clkdev.h
 generic-y += exec.h
 generic-y += exec.h
-generic-y += hash.h
 generic-y += irq_work.h
 generic-y += irq_work.h
 generic-y += kvm_para.h
 generic-y += kvm_para.h
 generic-y += mcs_spinlock.h
 generic-y += mcs_spinlock.h

+ 5 - 0
arch/ia64/include/uapi/asm/socket.h

@@ -89,4 +89,9 @@
 
 
 #define SO_BPF_EXTENSIONS	48
 #define SO_BPF_EXTENSIONS	48
 
 
+#define SO_INCOMING_CPU		49
+
+#define SO_ATTACH_BPF		50
+#define SO_DETACH_BPF		SO_DETACH_FILTER
+
 #endif /* _ASM_IA64_SOCKET_H */
 #endif /* _ASM_IA64_SOCKET_H */

+ 0 - 1
arch/m32r/include/asm/Kbuild

@@ -2,7 +2,6 @@
 generic-y += clkdev.h
 generic-y += clkdev.h
 generic-y += cputime.h
 generic-y += cputime.h
 generic-y += exec.h
 generic-y += exec.h
-generic-y += hash.h
 generic-y += irq_work.h
 generic-y += irq_work.h
 generic-y += mcs_spinlock.h
 generic-y += mcs_spinlock.h
 generic-y += module.h
 generic-y += module.h

+ 5 - 0
arch/m32r/include/uapi/asm/socket.h

@@ -80,4 +80,9 @@
 
 
 #define SO_BPF_EXTENSIONS	48
 #define SO_BPF_EXTENSIONS	48
 
 
+#define SO_INCOMING_CPU		49
+
+#define SO_ATTACH_BPF		50
+#define SO_DETACH_BPF		SO_DETACH_FILTER
+
 #endif /* _ASM_M32R_SOCKET_H */
 #endif /* _ASM_M32R_SOCKET_H */

+ 0 - 1
arch/m68k/include/asm/Kbuild

@@ -6,7 +6,6 @@ generic-y += device.h
 generic-y += emergency-restart.h
 generic-y += emergency-restart.h
 generic-y += errno.h
 generic-y += errno.h
 generic-y += exec.h
 generic-y += exec.h
-generic-y += hash.h
 generic-y += hw_irq.h
 generic-y += hw_irq.h
 generic-y += ioctl.h
 generic-y += ioctl.h
 generic-y += ipcbuf.h
 generic-y += ipcbuf.h

+ 0 - 1
arch/metag/include/asm/Kbuild

@@ -13,7 +13,6 @@ generic-y += fb.h
 generic-y += fcntl.h
 generic-y += fcntl.h
 generic-y += futex.h
 generic-y += futex.h
 generic-y += hardirq.h
 generic-y += hardirq.h
-generic-y += hash.h
 generic-y += hw_irq.h
 generic-y += hw_irq.h
 generic-y += ioctl.h
 generic-y += ioctl.h
 generic-y += ioctls.h
 generic-y += ioctls.h

+ 0 - 1
arch/microblaze/include/asm/Kbuild

@@ -4,7 +4,6 @@ generic-y += clkdev.h
 generic-y += cputime.h
 generic-y += cputime.h
 generic-y += device.h
 generic-y += device.h
 generic-y += exec.h
 generic-y += exec.h
-generic-y += hash.h
 generic-y += irq_work.h
 generic-y += irq_work.h
 generic-y += mcs_spinlock.h
 generic-y += mcs_spinlock.h
 generic-y += preempt.h
 generic-y += preempt.h

+ 0 - 1
arch/mips/include/asm/Kbuild

@@ -3,7 +3,6 @@ generic-y += cputime.h
 generic-y += current.h
 generic-y += current.h
 generic-y += dma-contiguous.h
 generic-y += dma-contiguous.h
 generic-y += emergency-restart.h
 generic-y += emergency-restart.h
-generic-y += hash.h
 generic-y += irq_work.h
 generic-y += irq_work.h
 generic-y += local64.h
 generic-y += local64.h
 generic-y += mcs_spinlock.h
 generic-y += mcs_spinlock.h

+ 5 - 0
arch/mips/include/uapi/asm/socket.h

@@ -98,4 +98,9 @@
 
 
 #define SO_BPF_EXTENSIONS	48
 #define SO_BPF_EXTENSIONS	48
 
 
+#define SO_INCOMING_CPU		49
+
+#define SO_ATTACH_BPF		50
+#define SO_DETACH_BPF		SO_DETACH_FILTER
+
 #endif /* _UAPI_ASM_SOCKET_H */
 #endif /* _UAPI_ASM_SOCKET_H */

+ 2 - 2
arch/mips/net/bpf_jit.c

@@ -426,7 +426,7 @@ static inline void emit_mod(unsigned int dst, unsigned int src,
 		u32 *p = &ctx->target[ctx->idx];
 		u32 *p = &ctx->target[ctx->idx];
 		uasm_i_divu(&p, dst, src);
 		uasm_i_divu(&p, dst, src);
 		p = &ctx->target[ctx->idx + 1];
 		p = &ctx->target[ctx->idx + 1];
-		uasm_i_mflo(&p, dst);
+		uasm_i_mfhi(&p, dst);
 	}
 	}
 	ctx->idx += 2; /* 2 insts */
 	ctx->idx += 2; /* 2 insts */
 }
 }
@@ -971,7 +971,7 @@ load_ind:
 			break;
 			break;
 		case BPF_ALU | BPF_MOD | BPF_K:
 		case BPF_ALU | BPF_MOD | BPF_K:
 			/* A %= k */
 			/* A %= k */
-			if (k == 1 || optimize_div(&k)) {
+			if (k == 1) {
 				ctx->flags |= SEEN_A;
 				ctx->flags |= SEEN_A;
 				emit_jit_reg_move(r_A, r_zero, ctx);
 				emit_jit_reg_move(r_A, r_zero, ctx);
 			} else {
 			} else {

+ 0 - 1
arch/mn10300/include/asm/Kbuild

@@ -3,7 +3,6 @@ generic-y += barrier.h
 generic-y += clkdev.h
 generic-y += clkdev.h
 generic-y += cputime.h
 generic-y += cputime.h
 generic-y += exec.h
 generic-y += exec.h
-generic-y += hash.h
 generic-y += irq_work.h
 generic-y += irq_work.h
 generic-y += mcs_spinlock.h
 generic-y += mcs_spinlock.h
 generic-y += preempt.h
 generic-y += preempt.h

+ 5 - 0
arch/mn10300/include/uapi/asm/socket.h

@@ -80,4 +80,9 @@
 
 
 #define SO_BPF_EXTENSIONS	48
 #define SO_BPF_EXTENSIONS	48
 
 
+#define SO_INCOMING_CPU		49
+
+#define SO_ATTACH_BPF		50
+#define SO_DETACH_BPF		SO_DETACH_FILTER
+
 #endif /* _ASM_SOCKET_H */
 #endif /* _ASM_SOCKET_H */

+ 0 - 1
arch/nios2/include/asm/Kbuild

@@ -19,7 +19,6 @@ generic-y += fcntl.h
 generic-y += ftrace.h
 generic-y += ftrace.h
 generic-y += futex.h
 generic-y += futex.h
 generic-y += hardirq.h
 generic-y += hardirq.h
-generic-y += hash.h
 generic-y += hw_irq.h
 generic-y += hw_irq.h
 generic-y += ioctl.h
 generic-y += ioctl.h
 generic-y += ioctls.h
 generic-y += ioctls.h

+ 0 - 1
arch/openrisc/include/asm/Kbuild

@@ -25,7 +25,6 @@ generic-y += fcntl.h
 generic-y += ftrace.h
 generic-y += ftrace.h
 generic-y += futex.h
 generic-y += futex.h
 generic-y += hardirq.h
 generic-y += hardirq.h
-generic-y += hash.h
 generic-y += hw_irq.h
 generic-y += hw_irq.h
 generic-y += ioctl.h
 generic-y += ioctl.h
 generic-y += ioctls.h
 generic-y += ioctls.h

+ 0 - 1
arch/parisc/include/asm/Kbuild

@@ -7,7 +7,6 @@ generic-y += device.h
 generic-y += div64.h
 generic-y += div64.h
 generic-y += emergency-restart.h
 generic-y += emergency-restart.h
 generic-y += exec.h
 generic-y += exec.h
-generic-y += hash.h
 generic-y += hw_irq.h
 generic-y += hw_irq.h
 generic-y += irq_regs.h
 generic-y += irq_regs.h
 generic-y += irq_work.h
 generic-y += irq_work.h

+ 5 - 0
arch/parisc/include/uapi/asm/socket.h

@@ -79,4 +79,9 @@
 
 
 #define SO_BPF_EXTENSIONS	0x4029
 #define SO_BPF_EXTENSIONS	0x4029
 
 
+#define SO_INCOMING_CPU		0x402A
+
+#define SO_ATTACH_BPF		0x402B
+#define SO_DETACH_BPF		SO_DETACH_FILTER
+
 #endif /* _UAPI_ASM_SOCKET_H */
 #endif /* _UAPI_ASM_SOCKET_H */

+ 0 - 1
arch/powerpc/configs/85xx/ge_imp3a_defconfig

@@ -100,7 +100,6 @@ CONFIG_NETDEVICES=y
 CONFIG_BONDING=m
 CONFIG_BONDING=m
 CONFIG_DUMMY=m
 CONFIG_DUMMY=m
 CONFIG_NETCONSOLE=y
 CONFIG_NETCONSOLE=y
-CONFIG_NETPOLL_TRAP=y
 CONFIG_TUN=m
 CONFIG_TUN=m
 # CONFIG_NET_VENDOR_3COM is not set
 # CONFIG_NET_VENDOR_3COM is not set
 CONFIG_FS_ENET=y
 CONFIG_FS_ENET=y

+ 0 - 1
arch/powerpc/configs/86xx/gef_ppc9a_defconfig

@@ -113,7 +113,6 @@ CONFIG_SLIP_COMPRESSED=y
 CONFIG_SLIP_SMART=y
 CONFIG_SLIP_SMART=y
 CONFIG_SLIP_MODE_SLIP6=y
 CONFIG_SLIP_MODE_SLIP6=y
 CONFIG_NETCONSOLE=y
 CONFIG_NETCONSOLE=y
-CONFIG_NETPOLL_TRAP=y
 # CONFIG_INPUT_KEYBOARD is not set
 # CONFIG_INPUT_KEYBOARD is not set
 # CONFIG_INPUT_MOUSE is not set
 # CONFIG_INPUT_MOUSE is not set
 # CONFIG_SERIO is not set
 # CONFIG_SERIO is not set

+ 0 - 1
arch/powerpc/configs/86xx/gef_sbc310_defconfig

@@ -114,7 +114,6 @@ CONFIG_SLIP_COMPRESSED=y
 CONFIG_SLIP_SMART=y
 CONFIG_SLIP_SMART=y
 CONFIG_SLIP_MODE_SLIP6=y
 CONFIG_SLIP_MODE_SLIP6=y
 CONFIG_NETCONSOLE=y
 CONFIG_NETCONSOLE=y
-CONFIG_NETPOLL_TRAP=y
 # CONFIG_INPUT_KEYBOARD is not set
 # CONFIG_INPUT_KEYBOARD is not set
 # CONFIG_INPUT_MOUSE is not set
 # CONFIG_INPUT_MOUSE is not set
 # CONFIG_SERIO is not set
 # CONFIG_SERIO is not set

+ 0 - 1
arch/powerpc/configs/86xx/gef_sbc610_defconfig

@@ -165,7 +165,6 @@ CONFIG_SLIP_COMPRESSED=y
 CONFIG_SLIP_SMART=y
 CONFIG_SLIP_SMART=y
 CONFIG_SLIP_MODE_SLIP6=y
 CONFIG_SLIP_MODE_SLIP6=y
 CONFIG_NETCONSOLE=y
 CONFIG_NETCONSOLE=y
-CONFIG_NETPOLL_TRAP=y
 CONFIG_INPUT_FF_MEMLESS=m
 CONFIG_INPUT_FF_MEMLESS=m
 # CONFIG_INPUT_KEYBOARD is not set
 # CONFIG_INPUT_KEYBOARD is not set
 # CONFIG_INPUT_MOUSE is not set
 # CONFIG_INPUT_MOUSE is not set

+ 0 - 1
arch/powerpc/configs/86xx/sbc8641d_defconfig

@@ -167,7 +167,6 @@ CONFIG_SLIP_COMPRESSED=y
 CONFIG_SLIP_SMART=y
 CONFIG_SLIP_SMART=y
 CONFIG_SLIP_MODE_SLIP6=y
 CONFIG_SLIP_MODE_SLIP6=y
 CONFIG_NETCONSOLE=y
 CONFIG_NETCONSOLE=y
-CONFIG_NETPOLL_TRAP=y
 # CONFIG_INPUT_KEYBOARD is not set
 # CONFIG_INPUT_KEYBOARD is not set
 # CONFIG_INPUT_MOUSE is not set
 # CONFIG_INPUT_MOUSE is not set
 # CONFIG_SERIO is not set
 # CONFIG_SERIO is not set

+ 0 - 1
arch/powerpc/configs/c2k_defconfig

@@ -211,7 +211,6 @@ CONFIG_MV643XX_ETH=y
 # CONFIG_NETDEV_10000 is not set
 # CONFIG_NETDEV_10000 is not set
 # CONFIG_ATM_DRIVERS is not set
 # CONFIG_ATM_DRIVERS is not set
 CONFIG_NETCONSOLE=m
 CONFIG_NETCONSOLE=m
-CONFIG_NETPOLL_TRAP=y
 # CONFIG_INPUT_MOUSEDEV_PSAUX is not set
 # CONFIG_INPUT_MOUSEDEV_PSAUX is not set
 CONFIG_INPUT_EVDEV=y
 CONFIG_INPUT_EVDEV=y
 # CONFIG_INPUT_KEYBOARD is not set
 # CONFIG_INPUT_KEYBOARD is not set

+ 0 - 1
arch/powerpc/configs/ppc64_defconfig

@@ -154,7 +154,6 @@ CONFIG_WINDFARM_PM121=y
 CONFIG_BONDING=m
 CONFIG_BONDING=m
 CONFIG_DUMMY=m
 CONFIG_DUMMY=m
 CONFIG_NETCONSOLE=y
 CONFIG_NETCONSOLE=y
-CONFIG_NETPOLL_TRAP=y
 CONFIG_TUN=m
 CONFIG_TUN=m
 CONFIG_VIRTIO_NET=m
 CONFIG_VIRTIO_NET=m
 CONFIG_VHOST_NET=m
 CONFIG_VHOST_NET=m

+ 0 - 1
arch/powerpc/configs/ppc64e_defconfig

@@ -103,7 +103,6 @@ CONFIG_NETDEVICES=y
 CONFIG_BONDING=m
 CONFIG_BONDING=m
 CONFIG_DUMMY=m
 CONFIG_DUMMY=m
 CONFIG_NETCONSOLE=y
 CONFIG_NETCONSOLE=y
-CONFIG_NETPOLL_TRAP=y
 CONFIG_TUN=m
 CONFIG_TUN=m
 CONFIG_VORTEX=y
 CONFIG_VORTEX=y
 CONFIG_ACENIC=y
 CONFIG_ACENIC=y

+ 0 - 1
arch/powerpc/configs/ppc6xx_defconfig

@@ -629,7 +629,6 @@ CONFIG_SLIP_SMART=y
 CONFIG_NET_FC=y
 CONFIG_NET_FC=y
 CONFIG_NETCONSOLE=m
 CONFIG_NETCONSOLE=m
 CONFIG_NETCONSOLE_DYNAMIC=y
 CONFIG_NETCONSOLE_DYNAMIC=y
-CONFIG_NETPOLL_TRAP=y
 CONFIG_VIRTIO_NET=m
 CONFIG_VIRTIO_NET=m
 # CONFIG_INPUT_MOUSEDEV_PSAUX is not set
 # CONFIG_INPUT_MOUSEDEV_PSAUX is not set
 CONFIG_INPUT_JOYDEV=m
 CONFIG_INPUT_JOYDEV=m

+ 0 - 1
arch/powerpc/configs/pseries_defconfig

@@ -133,7 +133,6 @@ CONFIG_DM_UEVENT=y
 CONFIG_BONDING=m
 CONFIG_BONDING=m
 CONFIG_DUMMY=m
 CONFIG_DUMMY=m
 CONFIG_NETCONSOLE=y
 CONFIG_NETCONSOLE=y
-CONFIG_NETPOLL_TRAP=y
 CONFIG_TUN=m
 CONFIG_TUN=m
 CONFIG_VIRTIO_NET=m
 CONFIG_VIRTIO_NET=m
 CONFIG_VHOST_NET=m
 CONFIG_VHOST_NET=m

+ 0 - 1
arch/powerpc/configs/pseries_le_defconfig

@@ -134,7 +134,6 @@ CONFIG_DM_UEVENT=y
 CONFIG_BONDING=m
 CONFIG_BONDING=m
 CONFIG_DUMMY=m
 CONFIG_DUMMY=m
 CONFIG_NETCONSOLE=y
 CONFIG_NETCONSOLE=y
-CONFIG_NETPOLL_TRAP=y
 CONFIG_TUN=m
 CONFIG_TUN=m
 CONFIG_VIRTIO_NET=m
 CONFIG_VIRTIO_NET=m
 CONFIG_VHOST_NET=m
 CONFIG_VHOST_NET=m

+ 0 - 1
arch/powerpc/include/asm/Kbuild

@@ -1,6 +1,5 @@
 
 
 generic-y += clkdev.h
 generic-y += clkdev.h
-generic-y += hash.h
 generic-y += irq_work.h
 generic-y += irq_work.h
 generic-y += mcs_spinlock.h
 generic-y += mcs_spinlock.h
 generic-y += preempt.h
 generic-y += preempt.h

+ 1 - 0
arch/powerpc/include/asm/ppc-opcode.h

@@ -204,6 +204,7 @@
 #define PPC_INST_ERATSX_DOT		0x7c000127
 #define PPC_INST_ERATSX_DOT		0x7c000127
 
 
 /* Misc instructions for BPF compiler */
 /* Misc instructions for BPF compiler */
+#define PPC_INST_LBZ			0x88000000
 #define PPC_INST_LD			0xe8000000
 #define PPC_INST_LD			0xe8000000
 #define PPC_INST_LHZ			0xa0000000
 #define PPC_INST_LHZ			0xa0000000
 #define PPC_INST_LHBRX			0x7c00062c
 #define PPC_INST_LHBRX			0x7c00062c

+ 5 - 0
arch/powerpc/include/uapi/asm/socket.h

@@ -87,4 +87,9 @@
 
 
 #define SO_BPF_EXTENSIONS	48
 #define SO_BPF_EXTENSIONS	48
 
 
+#define SO_INCOMING_CPU		49
+
+#define SO_ATTACH_BPF		50
+#define SO_DETACH_BPF		SO_DETACH_FILTER
+
 #endif	/* _ASM_POWERPC_SOCKET_H */
 #endif	/* _ASM_POWERPC_SOCKET_H */

+ 7 - 0
arch/powerpc/net/bpf_jit.h

@@ -87,6 +87,9 @@ DECLARE_LOAD_FUNC(sk_load_byte_msh);
 #define PPC_STD(r, base, i)	EMIT(PPC_INST_STD | ___PPC_RS(r) |	      \
 #define PPC_STD(r, base, i)	EMIT(PPC_INST_STD | ___PPC_RS(r) |	      \
 				     ___PPC_RA(base) | ((i) & 0xfffc))
 				     ___PPC_RA(base) | ((i) & 0xfffc))
 
 
+
+#define PPC_LBZ(r, base, i)	EMIT(PPC_INST_LBZ | ___PPC_RT(r) |	      \
+				     ___PPC_RA(base) | IMM_L(i))
 #define PPC_LD(r, base, i)	EMIT(PPC_INST_LD | ___PPC_RT(r) |	      \
 #define PPC_LD(r, base, i)	EMIT(PPC_INST_LD | ___PPC_RT(r) |	      \
 				     ___PPC_RA(base) | IMM_L(i))
 				     ___PPC_RA(base) | IMM_L(i))
 #define PPC_LWZ(r, base, i)	EMIT(PPC_INST_LWZ | ___PPC_RT(r) |	      \
 #define PPC_LWZ(r, base, i)	EMIT(PPC_INST_LWZ | ___PPC_RT(r) |	      \
@@ -96,6 +99,10 @@ DECLARE_LOAD_FUNC(sk_load_byte_msh);
 #define PPC_LHBRX(r, base, b)	EMIT(PPC_INST_LHBRX | ___PPC_RT(r) |	      \
 #define PPC_LHBRX(r, base, b)	EMIT(PPC_INST_LHBRX | ___PPC_RT(r) |	      \
 				     ___PPC_RA(base) | ___PPC_RB(b))
 				     ___PPC_RA(base) | ___PPC_RB(b))
 /* Convenience helpers for the above with 'far' offsets: */
 /* Convenience helpers for the above with 'far' offsets: */
+#define PPC_LBZ_OFFS(r, base, i) do { if ((i) < 32768) PPC_LBZ(r, base, i);   \
+		else {	PPC_ADDIS(r, base, IMM_HA(i));			      \
+			PPC_LBZ(r, r, IMM_L(i)); } } while(0)
+
 #define PPC_LD_OFFS(r, base, i) do { if ((i) < 32768) PPC_LD(r, base, i);     \
 #define PPC_LD_OFFS(r, base, i) do { if ((i) < 32768) PPC_LD(r, base, i);     \
 		else {	PPC_ADDIS(r, base, IMM_HA(i));			      \
 		else {	PPC_ADDIS(r, base, IMM_HA(i));			      \
 			PPC_LD(r, r, IMM_L(i)); } } while(0)
 			PPC_LD(r, r, IMM_L(i)); } } while(0)

+ 26 - 23
arch/powerpc/net/bpf_jit_comp.c

@@ -181,6 +181,7 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
 			}
 			}
 			break;
 			break;
 		case BPF_ALU | BPF_MOD | BPF_X: /* A %= X; */
 		case BPF_ALU | BPF_MOD | BPF_X: /* A %= X; */
+		case BPF_ALU | BPF_DIV | BPF_X: /* A /= X; */
 			ctx->seen |= SEEN_XREG;
 			ctx->seen |= SEEN_XREG;
 			PPC_CMPWI(r_X, 0);
 			PPC_CMPWI(r_X, 0);
 			if (ctx->pc_ret0 != -1) {
 			if (ctx->pc_ret0 != -1) {
@@ -190,9 +191,13 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
 				PPC_LI(r_ret, 0);
 				PPC_LI(r_ret, 0);
 				PPC_JMP(exit_addr);
 				PPC_JMP(exit_addr);
 			}
 			}
-			PPC_DIVWU(r_scratch1, r_A, r_X);
-			PPC_MUL(r_scratch1, r_X, r_scratch1);
-			PPC_SUB(r_A, r_A, r_scratch1);
+			if (code == (BPF_ALU | BPF_MOD | BPF_X)) {
+				PPC_DIVWU(r_scratch1, r_A, r_X);
+				PPC_MUL(r_scratch1, r_X, r_scratch1);
+				PPC_SUB(r_A, r_A, r_scratch1);
+			} else {
+				PPC_DIVWU(r_A, r_A, r_X);
+			}
 			break;
 			break;
 		case BPF_ALU | BPF_MOD | BPF_K: /* A %= K; */
 		case BPF_ALU | BPF_MOD | BPF_K: /* A %= K; */
 			PPC_LI32(r_scratch2, K);
 			PPC_LI32(r_scratch2, K);
@@ -200,22 +205,6 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
 			PPC_MUL(r_scratch1, r_scratch2, r_scratch1);
 			PPC_MUL(r_scratch1, r_scratch2, r_scratch1);
 			PPC_SUB(r_A, r_A, r_scratch1);
 			PPC_SUB(r_A, r_A, r_scratch1);
 			break;
 			break;
-		case BPF_ALU | BPF_DIV | BPF_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_ALU | BPF_DIV | BPF_K: /* A /= K */
 		case BPF_ALU | BPF_DIV | BPF_K: /* A /= K */
 			if (K == 1)
 			if (K == 1)
 				break;
 				break;
@@ -361,6 +350,11 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
 							    protocol));
 							    protocol));
 			break;
 			break;
 		case BPF_ANC | SKF_AD_IFINDEX:
 		case BPF_ANC | SKF_AD_IFINDEX:
+		case BPF_ANC | SKF_AD_HATYPE:
+			BUILD_BUG_ON(FIELD_SIZEOF(struct net_device,
+						ifindex) != 4);
+			BUILD_BUG_ON(FIELD_SIZEOF(struct net_device,
+						type) != 2);
 			PPC_LD_OFFS(r_scratch1, r_skb, offsetof(struct sk_buff,
 			PPC_LD_OFFS(r_scratch1, r_skb, offsetof(struct sk_buff,
 								dev));
 								dev));
 			PPC_CMPDI(r_scratch1, 0);
 			PPC_CMPDI(r_scratch1, 0);
@@ -368,14 +362,18 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
 				PPC_BCC(COND_EQ, addrs[ctx->pc_ret0]);
 				PPC_BCC(COND_EQ, addrs[ctx->pc_ret0]);
 			} else {
 			} else {
 				/* Exit, returning 0; first pass hits here. */
 				/* Exit, returning 0; first pass hits here. */
-				PPC_BCC_SHORT(COND_NE, (ctx->idx*4)+12);
+				PPC_BCC_SHORT(COND_NE, ctx->idx * 4 + 12);
 				PPC_LI(r_ret, 0);
 				PPC_LI(r_ret, 0);
 				PPC_JMP(exit_addr);
 				PPC_JMP(exit_addr);
 			}
 			}
-			BUILD_BUG_ON(FIELD_SIZEOF(struct net_device,
-						  ifindex) != 4);
-			PPC_LWZ_OFFS(r_A, r_scratch1,
+			if (code == (BPF_ANC | SKF_AD_IFINDEX)) {
+				PPC_LWZ_OFFS(r_A, r_scratch1,
 				     offsetof(struct net_device, ifindex));
 				     offsetof(struct net_device, ifindex));
+			} else {
+				PPC_LHZ_OFFS(r_A, r_scratch1,
+				     offsetof(struct net_device, type));
+			}
+
 			break;
 			break;
 		case BPF_ANC | SKF_AD_MARK:
 		case BPF_ANC | SKF_AD_MARK:
 			BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, mark) != 4);
 			BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, mark) != 4);
@@ -407,6 +405,11 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
 			PPC_LHZ_OFFS(r_A, r_skb, offsetof(struct sk_buff,
 			PPC_LHZ_OFFS(r_A, r_skb, offsetof(struct sk_buff,
 							  queue_mapping));
 							  queue_mapping));
 			break;
 			break;
+		case BPF_ANC | SKF_AD_PKTTYPE:
+			PPC_LBZ_OFFS(r_A, r_skb, PKT_TYPE_OFFSET());
+			PPC_ANDI(r_A, r_A, PKT_TYPE_MAX);
+			PPC_SRWI(r_A, r_A, 5);
+			break;
 		case BPF_ANC | SKF_AD_CPU:
 		case BPF_ANC | SKF_AD_CPU:
 #ifdef CONFIG_SMP
 #ifdef CONFIG_SMP
 			/*
 			/*

+ 0 - 1
arch/s390/include/asm/Kbuild

@@ -1,7 +1,6 @@
 
 
 
 
 generic-y += clkdev.h
 generic-y += clkdev.h
-generic-y += hash.h
 generic-y += irq_work.h
 generic-y += irq_work.h
 generic-y += mcs_spinlock.h
 generic-y += mcs_spinlock.h
 generic-y += preempt.h
 generic-y += preempt.h

+ 5 - 0
arch/s390/include/uapi/asm/socket.h

@@ -86,4 +86,9 @@
 
 
 #define SO_BPF_EXTENSIONS	48
 #define SO_BPF_EXTENSIONS	48
 
 
+#define SO_INCOMING_CPU		49
+
+#define SO_ATTACH_BPF		50
+#define SO_DETACH_BPF		SO_DETACH_FILTER
+
 #endif /* _ASM_SOCKET_H */
 #endif /* _ASM_SOCKET_H */

+ 0 - 1
arch/score/include/asm/Kbuild

@@ -5,7 +5,6 @@ header-y +=
 generic-y += barrier.h
 generic-y += barrier.h
 generic-y += clkdev.h
 generic-y += clkdev.h
 generic-y += cputime.h
 generic-y += cputime.h
-generic-y += hash.h
 generic-y += irq_work.h
 generic-y += irq_work.h
 generic-y += mcs_spinlock.h
 generic-y += mcs_spinlock.h
 generic-y += preempt.h
 generic-y += preempt.h

+ 0 - 1
arch/sh/include/asm/Kbuild

@@ -8,7 +8,6 @@ generic-y += emergency-restart.h
 generic-y += errno.h
 generic-y += errno.h
 generic-y += exec.h
 generic-y += exec.h
 generic-y += fcntl.h
 generic-y += fcntl.h
-generic-y += hash.h
 generic-y += ioctl.h
 generic-y += ioctl.h
 generic-y += ipcbuf.h
 generic-y += ipcbuf.h
 generic-y += irq_regs.h
 generic-y += irq_regs.h

+ 0 - 1
arch/sparc/include/asm/Kbuild

@@ -6,7 +6,6 @@ generic-y += cputime.h
 generic-y += div64.h
 generic-y += div64.h
 generic-y += emergency-restart.h
 generic-y += emergency-restart.h
 generic-y += exec.h
 generic-y += exec.h
-generic-y += hash.h
 generic-y += irq_regs.h
 generic-y += irq_regs.h
 generic-y += irq_work.h
 generic-y += irq_work.h
 generic-y += linkage.h
 generic-y += linkage.h

+ 19 - 0
arch/sparc/include/asm/vio.h

@@ -247,6 +247,25 @@ struct vio_net_desc {
 	struct ldc_trans_cookie	cookies[0];
 	struct ldc_trans_cookie	cookies[0];
 };
 };
 
 
+struct vio_net_dext {
+	u8		flags;
+#define VNET_PKT_HASH			0x01
+#define	VNET_PKT_HCK_IPV4_HDRCKSUM	0x02
+#define	VNET_PKT_HCK_FULLCKSUM		0x04
+#define	VNET_PKT_IPV4_LSO		0x08
+#define	VNET_PKT_HCK_IPV4_HDRCKSUM_OK	0x10
+#define	VNET_PKT_HCK_FULLCKSUM_OK	0x20
+
+	u8		vnet_hashval;
+	u16		ipv4_lso_mss;
+	u32		resv3;
+};
+
+static inline struct vio_net_dext *vio_net_ext(struct vio_net_desc *desc)
+{
+	return (struct vio_net_dext *)&desc->cookies[2];
+}
+
 #define VIO_MAX_RING_COOKIES	24
 #define VIO_MAX_RING_COOKIES	24
 
 
 struct vio_dring_state {
 struct vio_dring_state {

+ 5 - 0
arch/sparc/include/uapi/asm/socket.h

@@ -76,6 +76,11 @@
 
 
 #define SO_BPF_EXTENSIONS	0x0032
 #define SO_BPF_EXTENSIONS	0x0032
 
 
+#define SO_INCOMING_CPU		0x0033
+
+#define SO_ATTACH_BPF		0x0034
+#define SO_DETACH_BPF		SO_DETACH_FILTER
+
 /* Security levels - as per NRL IPv6 - don't actually do anything */
 /* Security levels - as per NRL IPv6 - don't actually do anything */
 #define SO_SECURITY_AUTHENTICATION		0x5001
 #define SO_SECURITY_AUTHENTICATION		0x5001
 #define SO_SECURITY_ENCRYPTION_TRANSPORT	0x5002
 #define SO_SECURITY_ENCRYPTION_TRANSPORT	0x5002

+ 0 - 1
arch/tile/configs/tilegx_defconfig

@@ -218,7 +218,6 @@ CONFIG_MACVLAN=m
 CONFIG_MACVTAP=m
 CONFIG_MACVTAP=m
 CONFIG_NETCONSOLE=m
 CONFIG_NETCONSOLE=m
 CONFIG_NETCONSOLE_DYNAMIC=y
 CONFIG_NETCONSOLE_DYNAMIC=y
-CONFIG_NETPOLL_TRAP=y
 CONFIG_TUN=y
 CONFIG_TUN=y
 CONFIG_VETH=m
 CONFIG_VETH=m
 CONFIG_NET_DSA_MV88E6060=y
 CONFIG_NET_DSA_MV88E6060=y

+ 0 - 1
arch/tile/configs/tilepro_defconfig

@@ -337,7 +337,6 @@ CONFIG_MACVLAN=m
 CONFIG_MACVTAP=m
 CONFIG_MACVTAP=m
 CONFIG_NETCONSOLE=m
 CONFIG_NETCONSOLE=m
 CONFIG_NETCONSOLE_DYNAMIC=y
 CONFIG_NETCONSOLE_DYNAMIC=y
-CONFIG_NETPOLL_TRAP=y
 CONFIG_TUN=y
 CONFIG_TUN=y
 CONFIG_VETH=m
 CONFIG_VETH=m
 CONFIG_NET_DSA_MV88E6060=y
 CONFIG_NET_DSA_MV88E6060=y

+ 0 - 1
arch/tile/include/asm/Kbuild

@@ -11,7 +11,6 @@ generic-y += errno.h
 generic-y += exec.h
 generic-y += exec.h
 generic-y += fb.h
 generic-y += fb.h
 generic-y += fcntl.h
 generic-y += fcntl.h
-generic-y += hash.h
 generic-y += hw_irq.h
 generic-y += hw_irq.h
 generic-y += ioctl.h
 generic-y += ioctl.h
 generic-y += ioctls.h
 generic-y += ioctls.h

+ 0 - 1
arch/um/include/asm/Kbuild

@@ -10,7 +10,6 @@ generic-y += exec.h
 generic-y += ftrace.h
 generic-y += ftrace.h
 generic-y += futex.h
 generic-y += futex.h
 generic-y += hardirq.h
 generic-y += hardirq.h
-generic-y += hash.h
 generic-y += hw_irq.h
 generic-y += hw_irq.h
 generic-y += io.h
 generic-y += io.h
 generic-y += irq_regs.h
 generic-y += irq_regs.h

+ 0 - 1
arch/unicore32/include/asm/Kbuild

@@ -16,7 +16,6 @@ generic-y += fcntl.h
 generic-y += ftrace.h
 generic-y += ftrace.h
 generic-y += futex.h
 generic-y += futex.h
 generic-y += hardirq.h
 generic-y += hardirq.h
-generic-y += hash.h
 generic-y += hw_irq.h
 generic-y += hw_irq.h
 generic-y += ioctl.h
 generic-y += ioctl.h
 generic-y += ioctls.h
 generic-y += ioctls.h

+ 0 - 7
arch/x86/include/asm/hash.h

@@ -1,7 +0,0 @@
-#ifndef _ASM_X86_HASH_H
-#define _ASM_X86_HASH_H
-
-struct fast_hash_ops;
-extern void setup_arch_fast_hash(struct fast_hash_ops *ops);
-
-#endif /* _ASM_X86_HASH_H */

+ 1 - 1
arch/x86/lib/Makefile

@@ -23,7 +23,7 @@ lib-y += memcpy_$(BITS).o
 lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o
 lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o
 lib-$(CONFIG_INSTRUCTION_DECODER) += insn.o inat.o
 lib-$(CONFIG_INSTRUCTION_DECODER) += insn.o inat.o
 
 
-obj-y += msr.o msr-reg.o msr-reg-export.o hash.o
+obj-y += msr.o msr-reg.o msr-reg-export.o
 
 
 ifeq ($(CONFIG_X86_32),y)
 ifeq ($(CONFIG_X86_32),y)
         obj-y += atomic64_32.o
         obj-y += atomic64_32.o

+ 0 - 92
arch/x86/lib/hash.c

@@ -1,92 +0,0 @@
-/*
- * Some portions derived from code covered by the following notice:
- *
- * Copyright (c) 2010-2013 Intel Corporation. All rights reserved.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- *   * Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *   * Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in
- *     the documentation and/or other materials provided with the
- *     distribution.
- *   * Neither the name of Intel Corporation nor the names of its
- *     contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <linux/hash.h>
-#include <linux/init.h>
-
-#include <asm/processor.h>
-#include <asm/cpufeature.h>
-#include <asm/hash.h>
-
-static inline u32 crc32_u32(u32 crc, u32 val)
-{
-#ifdef CONFIG_AS_CRC32
-	asm ("crc32l %1,%0\n" : "+r" (crc) : "rm" (val));
-#else
-	asm (".byte 0xf2, 0x0f, 0x38, 0xf1, 0xc1" : "+a" (crc) : "c" (val));
-#endif
-	return crc;
-}
-
-static u32 intel_crc4_2_hash(const void *data, u32 len, u32 seed)
-{
-	const u32 *p32 = (const u32 *) data;
-	u32 i, tmp = 0;
-
-	for (i = 0; i < len / 4; i++)
-		seed = crc32_u32(seed, *p32++);
-
-	switch (len & 3) {
-	case 3:
-		tmp |= *((const u8 *) p32 + 2) << 16;
-		/* fallthrough */
-	case 2:
-		tmp |= *((const u8 *) p32 + 1) << 8;
-		/* fallthrough */
-	case 1:
-		tmp |= *((const u8 *) p32);
-		seed = crc32_u32(seed, tmp);
-		break;
-	}
-
-	return seed;
-}
-
-static u32 intel_crc4_2_hash2(const u32 *data, u32 len, u32 seed)
-{
-	const u32 *p32 = (const u32 *) data;
-	u32 i;
-
-	for (i = 0; i < len; i++)
-		seed = crc32_u32(seed, *p32++);
-
-	return seed;
-}
-
-void __init setup_arch_fast_hash(struct fast_hash_ops *ops)
-{
-	if (cpu_has_xmm4_2) {
-		ops->hash  = intel_crc4_2_hash;
-		ops->hash2 = intel_crc4_2_hash2;
-	}
-}

+ 18 - 16
arch/x86/net/bpf_jit_comp.c

@@ -24,7 +24,7 @@ extern u8 sk_load_byte_positive_offset[];
 extern u8 sk_load_word_negative_offset[], sk_load_half_negative_offset[];
 extern u8 sk_load_word_negative_offset[], sk_load_half_negative_offset[];
 extern u8 sk_load_byte_negative_offset[];
 extern u8 sk_load_byte_negative_offset[];
 
 
-static inline u8 *emit_code(u8 *ptr, u32 bytes, unsigned int len)
+static u8 *emit_code(u8 *ptr, u32 bytes, unsigned int len)
 {
 {
 	if (len == 1)
 	if (len == 1)
 		*ptr = bytes;
 		*ptr = bytes;
@@ -52,12 +52,12 @@ static inline u8 *emit_code(u8 *ptr, u32 bytes, unsigned int len)
 #define EMIT4_off32(b1, b2, b3, b4, off) \
 #define EMIT4_off32(b1, b2, b3, b4, off) \
 	do {EMIT4(b1, b2, b3, b4); EMIT(off, 4); } while (0)
 	do {EMIT4(b1, b2, b3, b4); EMIT(off, 4); } while (0)
 
 
-static inline bool is_imm8(int value)
+static bool is_imm8(int value)
 {
 {
 	return value <= 127 && value >= -128;
 	return value <= 127 && value >= -128;
 }
 }
 
 
-static inline bool is_simm32(s64 value)
+static bool is_simm32(s64 value)
 {
 {
 	return value == (s64) (s32) value;
 	return value == (s64) (s32) value;
 }
 }
@@ -94,7 +94,7 @@ static int bpf_size_to_x86_bytes(int bpf_size)
 #define X86_JGE 0x7D
 #define X86_JGE 0x7D
 #define X86_JG  0x7F
 #define X86_JG  0x7F
 
 
-static inline void bpf_flush_icache(void *start, void *end)
+static void bpf_flush_icache(void *start, void *end)
 {
 {
 	mm_segment_t old_fs = get_fs();
 	mm_segment_t old_fs = get_fs();
 
 
@@ -133,24 +133,24 @@ static const int reg2hex[] = {
  * which need extra byte of encoding.
  * which need extra byte of encoding.
  * rax,rcx,...,rbp have simpler encoding
  * rax,rcx,...,rbp have simpler encoding
  */
  */
-static inline bool is_ereg(u32 reg)
+static bool is_ereg(u32 reg)
 {
 {
-	if (reg == BPF_REG_5 || reg == AUX_REG ||
-	    (reg >= BPF_REG_7 && reg <= BPF_REG_9))
-		return true;
-	else
-		return false;
+	return (1 << reg) & (BIT(BPF_REG_5) |
+			     BIT(AUX_REG) |
+			     BIT(BPF_REG_7) |
+			     BIT(BPF_REG_8) |
+			     BIT(BPF_REG_9));
 }
 }
 
 
 /* add modifiers if 'reg' maps to x64 registers r8..r15 */
 /* add modifiers if 'reg' maps to x64 registers r8..r15 */
-static inline u8 add_1mod(u8 byte, u32 reg)
+static u8 add_1mod(u8 byte, u32 reg)
 {
 {
 	if (is_ereg(reg))
 	if (is_ereg(reg))
 		byte |= 1;
 		byte |= 1;
 	return byte;
 	return byte;
 }
 }
 
 
-static inline u8 add_2mod(u8 byte, u32 r1, u32 r2)
+static u8 add_2mod(u8 byte, u32 r1, u32 r2)
 {
 {
 	if (is_ereg(r1))
 	if (is_ereg(r1))
 		byte |= 1;
 		byte |= 1;
@@ -160,13 +160,13 @@ static inline u8 add_2mod(u8 byte, u32 r1, u32 r2)
 }
 }
 
 
 /* encode 'dst_reg' register into x64 opcode 'byte' */
 /* encode 'dst_reg' register into x64 opcode 'byte' */
-static inline u8 add_1reg(u8 byte, u32 dst_reg)
+static u8 add_1reg(u8 byte, u32 dst_reg)
 {
 {
 	return byte + reg2hex[dst_reg];
 	return byte + reg2hex[dst_reg];
 }
 }
 
 
 /* encode 'dst_reg' and 'src_reg' registers into x64 opcode 'byte' */
 /* encode 'dst_reg' and 'src_reg' registers into x64 opcode 'byte' */
-static inline u8 add_2reg(u8 byte, u32 dst_reg, u32 src_reg)
+static u8 add_2reg(u8 byte, u32 dst_reg, u32 src_reg)
 {
 {
 	return byte + reg2hex[dst_reg] + (reg2hex[src_reg] << 3);
 	return byte + reg2hex[dst_reg] + (reg2hex[src_reg] << 3);
 }
 }
@@ -178,7 +178,7 @@ static void jit_fill_hole(void *area, unsigned int size)
 }
 }
 
 
 struct jit_context {
 struct jit_context {
-	unsigned int cleanup_addr; /* epilogue code offset */
+	int cleanup_addr; /* epilogue code offset */
 	bool seen_ld_abs;
 	bool seen_ld_abs;
 };
 };
 
 
@@ -192,6 +192,7 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image,
 	struct bpf_insn *insn = bpf_prog->insnsi;
 	struct bpf_insn *insn = bpf_prog->insnsi;
 	int insn_cnt = bpf_prog->len;
 	int insn_cnt = bpf_prog->len;
 	bool seen_ld_abs = ctx->seen_ld_abs | (oldproglen == 0);
 	bool seen_ld_abs = ctx->seen_ld_abs | (oldproglen == 0);
+	bool seen_exit = false;
 	u8 temp[BPF_MAX_INSN_SIZE + BPF_INSN_SAFETY];
 	u8 temp[BPF_MAX_INSN_SIZE + BPF_INSN_SAFETY];
 	int i;
 	int i;
 	int proglen = 0;
 	int proglen = 0;
@@ -854,10 +855,11 @@ common_load:
 			goto common_load;
 			goto common_load;
 
 
 		case BPF_JMP | BPF_EXIT:
 		case BPF_JMP | BPF_EXIT:
-			if (i != insn_cnt - 1) {
+			if (seen_exit) {
 				jmp_offset = ctx->cleanup_addr - addrs[i];
 				jmp_offset = ctx->cleanup_addr - addrs[i];
 				goto emit_jmp;
 				goto emit_jmp;
 			}
 			}
+			seen_exit = true;
 			/* update cleanup_addr */
 			/* update cleanup_addr */
 			ctx->cleanup_addr = proglen;
 			ctx->cleanup_addr = proglen;
 			/* mov rbx, qword ptr [rbp-X] */
 			/* mov rbx, qword ptr [rbp-X] */

+ 0 - 1
arch/xtensa/include/asm/Kbuild

@@ -9,7 +9,6 @@ generic-y += errno.h
 generic-y += exec.h
 generic-y += exec.h
 generic-y += fcntl.h
 generic-y += fcntl.h
 generic-y += hardirq.h
 generic-y += hardirq.h
-generic-y += hash.h
 generic-y += ioctl.h
 generic-y += ioctl.h
 generic-y += irq_regs.h
 generic-y += irq_regs.h
 generic-y += irq_work.h
 generic-y += irq_work.h

+ 5 - 0
arch/xtensa/include/uapi/asm/socket.h

@@ -91,4 +91,9 @@
 
 
 #define SO_BPF_EXTENSIONS	48
 #define SO_BPF_EXTENSIONS	48
 
 
+#define SO_INCOMING_CPU		49
+
+#define SO_ATTACH_BPF		50
+#define SO_DETACH_BPF		SO_DETACH_FILTER
+
 #endif	/* _XTENSA_SOCKET_H */
 #endif	/* _XTENSA_SOCKET_H */

+ 1 - 1
crypto/af_alg.c

@@ -399,7 +399,7 @@ int af_alg_cmsg_send(struct msghdr *msg, struct af_alg_control *con)
 {
 {
 	struct cmsghdr *cmsg;
 	struct cmsghdr *cmsg;
 
 
-	for (cmsg = CMSG_FIRSTHDR(msg); cmsg; cmsg = CMSG_NXTHDR(msg, cmsg)) {
+	for_each_cmsghdr(cmsg, msg) {
 		if (!CMSG_OK(msg, cmsg))
 		if (!CMSG_OK(msg, cmsg))
 			return -EINVAL;
 			return -EINVAL;
 		if (cmsg->cmsg_level != SOL_ALG)
 		if (cmsg->cmsg_level != SOL_ALG)

+ 3 - 3
crypto/algif_hash.c

@@ -42,7 +42,7 @@ static int hash_sendmsg(struct kiocb *unused, struct socket *sock,
 	struct alg_sock *ask = alg_sk(sk);
 	struct alg_sock *ask = alg_sk(sk);
 	struct hash_ctx *ctx = ask->private;
 	struct hash_ctx *ctx = ask->private;
 	unsigned long iovlen;
 	unsigned long iovlen;
-	struct iovec *iov;
+	const struct iovec *iov;
 	long copied = 0;
 	long copied = 0;
 	int err;
 	int err;
 
 
@@ -58,7 +58,7 @@ static int hash_sendmsg(struct kiocb *unused, struct socket *sock,
 
 
 	ctx->more = 0;
 	ctx->more = 0;
 
 
-	for (iov = msg->msg_iov, iovlen = msg->msg_iovlen; iovlen > 0;
+	for (iov = msg->msg_iter.iov, iovlen = msg->msg_iter.nr_segs; iovlen > 0;
 	     iovlen--, iov++) {
 	     iovlen--, iov++) {
 		unsigned long seglen = iov->iov_len;
 		unsigned long seglen = iov->iov_len;
 		char __user *from = iov->iov_base;
 		char __user *from = iov->iov_base;
@@ -174,7 +174,7 @@ static int hash_recvmsg(struct kiocb *unused, struct socket *sock,
 			goto unlock;
 			goto unlock;
 	}
 	}
 
 
-	err = memcpy_toiovec(msg->msg_iov, ctx->result, len);
+	err = memcpy_to_msg(msg, ctx->result, len);
 
 
 unlock:
 unlock:
 	release_sock(sk);
 	release_sock(sk);

+ 7 - 7
crypto/algif_skcipher.c

@@ -298,9 +298,9 @@ static int skcipher_sendmsg(struct kiocb *unused, struct socket *sock,
 			len = min_t(unsigned long, len,
 			len = min_t(unsigned long, len,
 				    PAGE_SIZE - sg->offset - sg->length);
 				    PAGE_SIZE - sg->offset - sg->length);
 
 
-			err = memcpy_fromiovec(page_address(sg_page(sg)) +
-					       sg->offset + sg->length,
-					       msg->msg_iov, len);
+			err = memcpy_from_msg(page_address(sg_page(sg)) +
+					      sg->offset + sg->length,
+					      msg, len);
 			if (err)
 			if (err)
 				goto unlock;
 				goto unlock;
 
 
@@ -337,8 +337,8 @@ static int skcipher_sendmsg(struct kiocb *unused, struct socket *sock,
 			if (!sg_page(sg + i))
 			if (!sg_page(sg + i))
 				goto unlock;
 				goto unlock;
 
 
-			err = memcpy_fromiovec(page_address(sg_page(sg + i)),
-					       msg->msg_iov, plen);
+			err = memcpy_from_msg(page_address(sg_page(sg + i)),
+					      msg, plen);
 			if (err) {
 			if (err) {
 				__free_page(sg_page(sg + i));
 				__free_page(sg_page(sg + i));
 				sg_assign_page(sg + i, NULL);
 				sg_assign_page(sg + i, NULL);
@@ -429,13 +429,13 @@ static int skcipher_recvmsg(struct kiocb *unused, struct socket *sock,
 	struct skcipher_sg_list *sgl;
 	struct skcipher_sg_list *sgl;
 	struct scatterlist *sg;
 	struct scatterlist *sg;
 	unsigned long iovlen;
 	unsigned long iovlen;
-	struct iovec *iov;
+	const struct iovec *iov;
 	int err = -EAGAIN;
 	int err = -EAGAIN;
 	int used;
 	int used;
 	long copied = 0;
 	long copied = 0;
 
 
 	lock_sock(sk);
 	lock_sock(sk);
-	for (iov = msg->msg_iov, iovlen = msg->msg_iovlen; iovlen > 0;
+	for (iov = msg->msg_iter.iov, iovlen = msg->msg_iter.nr_segs; iovlen > 0;
 	     iovlen--, iov++) {
 	     iovlen--, iov++) {
 		unsigned long seglen = iov->iov_len;
 		unsigned long seglen = iov->iov_len;
 		char __user *from = iov->iov_base;
 		char __user *from = iov->iov_base;

+ 3 - 0
drivers/atm/eni.c

@@ -356,6 +356,8 @@ static int do_rx_dma(struct atm_vcc *vcc,struct sk_buff *skb,
 	if (skb) {
 	if (skb) {
 		paddr = pci_map_single(eni_dev->pci_dev,skb->data,skb->len,
 		paddr = pci_map_single(eni_dev->pci_dev,skb->data,skb->len,
 		    PCI_DMA_FROMDEVICE);
 		    PCI_DMA_FROMDEVICE);
+		if (pci_dma_mapping_error(eni_dev->pci_dev, paddr))
+			goto dma_map_error;
 		ENI_PRV_PADDR(skb) = paddr;
 		ENI_PRV_PADDR(skb) = paddr;
 		if (paddr & 3)
 		if (paddr & 3)
 			printk(KERN_CRIT DEV_LABEL "(itf %d): VCI %d has "
 			printk(KERN_CRIT DEV_LABEL "(itf %d): VCI %d has "
@@ -481,6 +483,7 @@ trouble:
 	if (paddr)
 	if (paddr)
 		pci_unmap_single(eni_dev->pci_dev,paddr,skb->len,
 		pci_unmap_single(eni_dev->pci_dev,paddr,skb->len,
 		    PCI_DMA_FROMDEVICE);
 		    PCI_DMA_FROMDEVICE);
+dma_map_error:
 	if (skb) dev_kfree_skb_irq(skb);
 	if (skb) dev_kfree_skb_irq(skb);
 	return -1;
 	return -1;
 }
 }

+ 1 - 0
drivers/bcma/bcma_private.h

@@ -24,6 +24,7 @@ struct bcma_bus;
 /* main.c */
 /* main.c */
 bool bcma_wait_value(struct bcma_device *core, u16 reg, u32 mask, u32 value,
 bool bcma_wait_value(struct bcma_device *core, u16 reg, u32 mask, u32 value,
 		     int timeout);
 		     int timeout);
+void bcma_prepare_core(struct bcma_bus *bus, struct bcma_device *core);
 int bcma_bus_register(struct bcma_bus *bus);
 int bcma_bus_register(struct bcma_bus *bus);
 void bcma_bus_unregister(struct bcma_bus *bus);
 void bcma_bus_unregister(struct bcma_bus *bus);
 int __init bcma_bus_early_register(struct bcma_bus *bus,
 int __init bcma_bus_early_register(struct bcma_bus *bus,

+ 1 - 1
drivers/bcma/driver_chipcommon.c

@@ -339,7 +339,7 @@ void bcma_chipco_serial_init(struct bcma_drv_cc *cc)
 		return;
 		return;
 	}
 	}
 
 
-	irq = bcma_core_irq(cc->core);
+	irq = bcma_core_irq(cc->core, 0);
 
 
 	/* Determine the registers of the UARTs */
 	/* Determine the registers of the UARTs */
 	cc->nr_serial_ports = (cc->capabilities & BCMA_CC_CAP_NRUART);
 	cc->nr_serial_ports = (cc->capabilities & BCMA_CC_CAP_NRUART);

+ 2 - 2
drivers/bcma/driver_gpio.c

@@ -152,7 +152,7 @@ static int bcma_gpio_irq_domain_init(struct bcma_drv_cc *cc)
 					 handle_simple_irq);
 					 handle_simple_irq);
 	}
 	}
 
 
-	hwirq = bcma_core_irq(cc->core);
+	hwirq = bcma_core_irq(cc->core, 0);
 	err = request_irq(hwirq, bcma_gpio_irq_handler, IRQF_SHARED, "gpio",
 	err = request_irq(hwirq, bcma_gpio_irq_handler, IRQF_SHARED, "gpio",
 			  cc);
 			  cc);
 	if (err)
 	if (err)
@@ -183,7 +183,7 @@ static void bcma_gpio_irq_domain_exit(struct bcma_drv_cc *cc)
 		return;
 		return;
 
 
 	bcma_cc_mask32(cc, BCMA_CC_IRQMASK, ~BCMA_CC_IRQ_GPIO);
 	bcma_cc_mask32(cc, BCMA_CC_IRQMASK, ~BCMA_CC_IRQ_GPIO);
-	free_irq(bcma_core_irq(cc->core), cc);
+	free_irq(bcma_core_irq(cc->core, 0), cc);
 	for (gpio = 0; gpio < chip->ngpio; gpio++) {
 	for (gpio = 0; gpio < chip->ngpio; gpio++) {
 		int irq = irq_find_mapping(cc->irq_domain, gpio);
 		int irq = irq_find_mapping(cc->irq_domain, gpio);
 
 

+ 2 - 9
drivers/bcma/driver_mips.c

@@ -115,7 +115,7 @@ static u32 bcma_core_mips_irqflag(struct bcma_device *dev)
  * If disabled, 5 is returned.
  * If disabled, 5 is returned.
  * If not supported, 6 is returned.
  * If not supported, 6 is returned.
  */
  */
-static unsigned int bcma_core_mips_irq(struct bcma_device *dev)
+unsigned int bcma_core_mips_irq(struct bcma_device *dev)
 {
 {
 	struct bcma_device *mdev = dev->bus->drv_mips.core;
 	struct bcma_device *mdev = dev->bus->drv_mips.core;
 	u32 irqflag;
 	u32 irqflag;
@@ -133,13 +133,6 @@ static unsigned int bcma_core_mips_irq(struct bcma_device *dev)
 	return 5;
 	return 5;
 }
 }
 
 
-unsigned int bcma_core_irq(struct bcma_device *dev)
-{
-	unsigned int mips_irq = bcma_core_mips_irq(dev);
-	return mips_irq <= 4 ? mips_irq + 2 : 0;
-}
-EXPORT_SYMBOL(bcma_core_irq);
-
 static void bcma_core_mips_set_irq(struct bcma_device *dev, unsigned int irq)
 static void bcma_core_mips_set_irq(struct bcma_device *dev, unsigned int irq)
 {
 {
 	unsigned int oldirq = bcma_core_mips_irq(dev);
 	unsigned int oldirq = bcma_core_mips_irq(dev);
@@ -423,7 +416,7 @@ void bcma_core_mips_init(struct bcma_drv_mips *mcore)
 		break;
 		break;
 	default:
 	default:
 		list_for_each_entry(core, &bus->cores, list) {
 		list_for_each_entry(core, &bus->cores, list) {
-			core->irq = bcma_core_irq(core);
+			core->irq = bcma_core_irq(core, 0);
 		}
 		}
 		bcma_err(bus,
 		bcma_err(bus,
 			 "Unknown device (0x%x) found, can not configure IRQs\n",
 			 "Unknown device (0x%x) found, can not configure IRQs\n",

+ 2 - 2
drivers/bcma/driver_pci_host.c

@@ -593,7 +593,7 @@ int bcma_core_pci_plat_dev_init(struct pci_dev *dev)
 	pr_info("PCI: Fixing up device %s\n", pci_name(dev));
 	pr_info("PCI: Fixing up device %s\n", pci_name(dev));
 
 
 	/* Fix up interrupt lines */
 	/* Fix up interrupt lines */
-	dev->irq = bcma_core_irq(pc_host->pdev->core);
+	dev->irq = bcma_core_irq(pc_host->pdev->core, 0);
 	pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq);
 	pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq);
 
 
 	readrq = pcie_get_readrq(dev);
 	readrq = pcie_get_readrq(dev);
@@ -617,6 +617,6 @@ int bcma_core_pci_pcibios_map_irq(const struct pci_dev *dev)
 
 
 	pc_host = container_of(dev->bus->ops, struct bcma_drv_pci_host,
 	pc_host = container_of(dev->bus->ops, struct bcma_drv_pci_host,
 			       pci_ops);
 			       pci_ops);
-	return bcma_core_irq(pc_host->pdev->core);
+	return bcma_core_irq(pc_host->pdev->core, 0);
 }
 }
 EXPORT_SYMBOL(bcma_core_pci_pcibios_map_irq);
 EXPORT_SYMBOL(bcma_core_pci_pcibios_map_irq);

+ 77 - 2
drivers/bcma/main.c

@@ -11,6 +11,7 @@
 #include <linux/bcma/bcma.h>
 #include <linux/bcma/bcma.h>
 #include <linux/slab.h>
 #include <linux/slab.h>
 #include <linux/of_address.h>
 #include <linux/of_address.h>
+#include <linux/of_irq.h>
 
 
 MODULE_DESCRIPTION("Broadcom's specific AMBA driver");
 MODULE_DESCRIPTION("Broadcom's specific AMBA driver");
 MODULE_LICENSE("GPL");
 MODULE_LICENSE("GPL");
@@ -153,6 +154,46 @@ static struct device_node *bcma_of_find_child_device(struct platform_device *par
 	return NULL;
 	return NULL;
 }
 }
 
 
+static int bcma_of_irq_parse(struct platform_device *parent,
+			     struct bcma_device *core,
+			     struct of_phandle_args *out_irq, int num)
+{
+	__be32 laddr[1];
+	int rc;
+
+	if (core->dev.of_node) {
+		rc = of_irq_parse_one(core->dev.of_node, num, out_irq);
+		if (!rc)
+			return rc;
+	}
+
+	out_irq->np = parent->dev.of_node;
+	out_irq->args_count = 1;
+	out_irq->args[0] = num;
+
+	laddr[0] = cpu_to_be32(core->addr);
+	return of_irq_parse_raw(laddr, out_irq);
+}
+
+static unsigned int bcma_of_get_irq(struct platform_device *parent,
+				    struct bcma_device *core, int num)
+{
+	struct of_phandle_args out_irq;
+	int ret;
+
+	if (!parent || !parent->dev.of_node)
+		return 0;
+
+	ret = bcma_of_irq_parse(parent, core, &out_irq, num);
+	if (ret) {
+		bcma_debug(core->bus, "bcma_of_get_irq() failed with rc=%d\n",
+			   ret);
+		return 0;
+	}
+
+	return irq_create_of_mapping(&out_irq);
+}
+
 static void bcma_of_fill_device(struct platform_device *parent,
 static void bcma_of_fill_device(struct platform_device *parent,
 				struct bcma_device *core)
 				struct bcma_device *core)
 {
 {
@@ -161,18 +202,47 @@ static void bcma_of_fill_device(struct platform_device *parent,
 	node = bcma_of_find_child_device(parent, core);
 	node = bcma_of_find_child_device(parent, core);
 	if (node)
 	if (node)
 		core->dev.of_node = node;
 		core->dev.of_node = node;
+
+	core->irq = bcma_of_get_irq(parent, core, 0);
 }
 }
 #else
 #else
 static void bcma_of_fill_device(struct platform_device *parent,
 static void bcma_of_fill_device(struct platform_device *parent,
 				struct bcma_device *core)
 				struct bcma_device *core)
 {
 {
 }
 }
+static inline unsigned int bcma_of_get_irq(struct platform_device *parent,
+					   struct bcma_device *core, int num)
+{
+	return 0;
+}
 #endif /* CONFIG_OF */
 #endif /* CONFIG_OF */
 
 
-static void bcma_register_core(struct bcma_bus *bus, struct bcma_device *core)
+unsigned int bcma_core_irq(struct bcma_device *core, int num)
 {
 {
-	int err;
+	struct bcma_bus *bus = core->bus;
+	unsigned int mips_irq;
+
+	switch (bus->hosttype) {
+	case BCMA_HOSTTYPE_PCI:
+		return bus->host_pci->irq;
+	case BCMA_HOSTTYPE_SOC:
+		if (bus->drv_mips.core && num == 0) {
+			mips_irq = bcma_core_mips_irq(core);
+			return mips_irq <= 4 ? mips_irq + 2 : 0;
+		}
+		if (bus->host_pdev)
+			return bcma_of_get_irq(bus->host_pdev, core, num);
+		return 0;
+	case BCMA_HOSTTYPE_SDIO:
+		return 0;
+	}
 
 
+	return 0;
+}
+EXPORT_SYMBOL(bcma_core_irq);
+
+void bcma_prepare_core(struct bcma_bus *bus, struct bcma_device *core)
+{
 	core->dev.release = bcma_release_core_dev;
 	core->dev.release = bcma_release_core_dev;
 	core->dev.bus = &bcma_bus_type;
 	core->dev.bus = &bcma_bus_type;
 	dev_set_name(&core->dev, "bcma%d:%d", bus->num, core->core_index);
 	dev_set_name(&core->dev, "bcma%d:%d", bus->num, core->core_index);
@@ -196,6 +266,11 @@ static void bcma_register_core(struct bcma_bus *bus, struct bcma_device *core)
 	case BCMA_HOSTTYPE_SDIO:
 	case BCMA_HOSTTYPE_SDIO:
 		break;
 		break;
 	}
 	}
+}
+
+static void bcma_register_core(struct bcma_bus *bus, struct bcma_device *core)
+{
+	int err;
 
 
 	err = device_register(&core->dev);
 	err = device_register(&core->dev);
 	if (err) {
 	if (err) {

+ 1 - 0
drivers/bcma/scan.c

@@ -505,6 +505,7 @@ int bcma_bus_scan(struct bcma_bus *bus)
 		bus->nr_cores++;
 		bus->nr_cores++;
 		other_core = bcma_find_core_reverse(bus, core->id.id);
 		other_core = bcma_find_core_reverse(bus, core->id.id);
 		core->core_unit = (other_core == NULL) ? 0 : other_core->core_unit + 1;
 		core->core_unit = (other_core == NULL) ? 0 : other_core->core_unit + 1;
+		bcma_prepare_core(bus, core);
 
 
 		bcma_info(bus, "Core %d found: %s (manuf 0x%03X, id 0x%03X, rev 0x%02X, class 0x%X)\n",
 		bcma_info(bus, "Core %d found: %s (manuf 0x%03X, id 0x%03X, rev 0x%02X, class 0x%X)\n",
 			  core->core_index, bcma_device_name(&core->id),
 			  core->core_index, bcma_device_name(&core->id),

+ 1 - 0
drivers/bluetooth/Kconfig

@@ -210,6 +210,7 @@ config BT_MRVL_SDIO
 	tristate "Marvell BT-over-SDIO driver"
 	tristate "Marvell BT-over-SDIO driver"
 	depends on BT_MRVL && MMC
 	depends on BT_MRVL && MMC
 	select FW_LOADER
 	select FW_LOADER
+	select WANT_DEV_COREDUMP
 	help
 	help
 	  The driver for Marvell Bluetooth chipsets with SDIO interface.
 	  The driver for Marvell Bluetooth chipsets with SDIO interface.
 
 

+ 4 - 0
drivers/bluetooth/ath3k.c

@@ -79,6 +79,7 @@ static const struct usb_device_id ath3k_table[] = {
 	{ USB_DEVICE(0x0489, 0xe057) },
 	{ USB_DEVICE(0x0489, 0xe057) },
 	{ USB_DEVICE(0x0489, 0xe056) },
 	{ USB_DEVICE(0x0489, 0xe056) },
 	{ USB_DEVICE(0x0489, 0xe05f) },
 	{ USB_DEVICE(0x0489, 0xe05f) },
+	{ USB_DEVICE(0x0489, 0xe078) },
 	{ USB_DEVICE(0x04c5, 0x1330) },
 	{ USB_DEVICE(0x04c5, 0x1330) },
 	{ USB_DEVICE(0x04CA, 0x3004) },
 	{ USB_DEVICE(0x04CA, 0x3004) },
 	{ USB_DEVICE(0x04CA, 0x3005) },
 	{ USB_DEVICE(0x04CA, 0x3005) },
@@ -105,6 +106,7 @@ static const struct usb_device_id ath3k_table[] = {
 	{ USB_DEVICE(0x13d3, 0x3375) },
 	{ USB_DEVICE(0x13d3, 0x3375) },
 	{ USB_DEVICE(0x13d3, 0x3393) },
 	{ USB_DEVICE(0x13d3, 0x3393) },
 	{ USB_DEVICE(0x13d3, 0x3402) },
 	{ USB_DEVICE(0x13d3, 0x3402) },
+	{ USB_DEVICE(0x13d3, 0x3408) },
 	{ USB_DEVICE(0x13d3, 0x3432) },
 	{ USB_DEVICE(0x13d3, 0x3432) },
 
 
 	/* Atheros AR5BBU12 with sflash firmware */
 	/* Atheros AR5BBU12 with sflash firmware */
@@ -130,6 +132,7 @@ static const struct usb_device_id ath3k_blist_tbl[] = {
 	{ USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x0489, 0xe05f), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x0489, 0xe05f), .driver_info = BTUSB_ATH3012 },
+	{ USB_DEVICE(0x0489, 0xe078), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
@@ -156,6 +159,7 @@ static const struct usb_device_id ath3k_blist_tbl[] = {
 	{ USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x13d3, 0x3402), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x13d3, 0x3402), .driver_info = BTUSB_ATH3012 },
+	{ USB_DEVICE(0x13d3, 0x3408), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 },
 	{ USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 },
 
 
 	/* Atheros AR5BBU22 with sflash firmware */
 	/* Atheros AR5BBU22 with sflash firmware */

Some files were not shown because too many files changed in this diff