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 ...
This commit is contained in:
commit
70e71ca0af
@ -216,3 +216,11 @@ Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the interface protocol type as a decimal value. See
|
||||
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.
|
||||
|
@ -383,7 +383,7 @@ o <http://www.iptables.org/downloads.html>
|
||||
|
||||
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
|
||||
--------
|
||||
|
29
Documentation/devicetree/bindings/btmrvl.txt
Normal file
29
Documentation/devicetree/bindings/btmrvl.txt
Normal file
@ -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>;
|
||||
};
|
@ -8,6 +8,11 @@ Required properties:
|
||||
|
||||
The cores on the AXI bus are automatically detected by bcma with the
|
||||
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
|
||||
(devices). This is needed since some hardware details can't be auto
|
||||
@ -22,6 +27,22 @@ Example:
|
||||
ranges = <0x00000000 0x18000000 0x00100000>;
|
||||
#address-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 {
|
||||
reg = <0x00000000 0x1000>;
|
||||
|
@ -7,7 +7,10 @@ Required properties:
|
||||
- PCS registers
|
||||
- interrupt-parent: Should be the phandle for the interrupt controller
|
||||
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:
|
||||
- DMA clock for the amd-xgbe device (used for calculating the
|
||||
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
|
||||
by UEFI.
|
||||
- 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:
|
||||
xgbe@e0700000 {
|
||||
@ -30,7 +36,9 @@ Example:
|
||||
reg = <0 0xe0700000 0 0x80000>,
|
||||
<0 0xe0780000 0 0x80000>;
|
||||
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>;
|
||||
clock-names = "dma_clk", "ptp_clk";
|
||||
phy-handle = <&phy>;
|
||||
|
@ -4,6 +4,8 @@ Bosch C_CAN/D_CAN controller Device Tree Bindings
|
||||
Required properties:
|
||||
- compatible : Should be "bosch,c_can" for C_CAN controllers and
|
||||
"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
|
||||
registers map
|
||||
- interrupts : property with a value describing the interrupt
|
||||
@ -12,6 +14,9 @@ Required properties:
|
||||
Optional properties:
|
||||
- ti,hwmods : Must be "d_can<n>" or "c_can<n>", n being the
|
||||
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
|
||||
resources from TI, omap hwmod data base during device registration.
|
||||
|
@ -10,7 +10,7 @@ Required properties:
|
||||
- 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
|
||||
|
||||
Optionnal properties:
|
||||
Optional properties:
|
||||
- interrupts : property with a value describing the switch
|
||||
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
|
||||
- #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
|
||||
|
||||
Each port children node must have the following mandatory properties:
|
||||
|
@ -6,19 +6,32 @@ Optional properties:
|
||||
|
||||
- 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.
|
||||
|
||||
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.
|
||||
|
@ -19,7 +19,6 @@ Optional Properties:
|
||||
specifications. If neither of these are specified, the default is to
|
||||
assume clause 22. The compatible list may also contain other
|
||||
elements.
|
||||
- max-speed: Maximum PHY supported speed (10, 100, 1000...)
|
||||
|
||||
If the phy's identifier is known then the list may contain an entry
|
||||
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,
|
||||
followed by 10 bits of a vendor specific ID.
|
||||
|
||||
- max-speed: Maximum PHY supported speed (10, 100, 1000...)
|
||||
|
||||
Example:
|
||||
|
||||
ethernet-phy@0 {
|
||||
|
@ -9,6 +9,7 @@ Required properties:
|
||||
"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-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-r7s72100" if the device is a part of R7S72100 SoC.
|
||||
- reg: offset and length of (1) the E-DMAC/feLic register block (required),
|
||||
|
@ -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
|
||||
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
|
||||
order is highly variable, and is unlikely to be zero. The level
|
||||
|
@ -383,9 +383,17 @@ tcp_orphan_retries - INTEGER
|
||||
may consume significant resources. Cf. tcp_max_orphans.
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
Bug-to-bug compatibility with some broken printers.
|
||||
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
|
||||
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/*:
|
||||
ratelimit - INTEGER
|
||||
Limit the maximal rates for sending ICMPv6 packets.
|
||||
|
107
Documentation/networking/ipvlan.txt
Normal file
107
Documentation/networking/ipvlan.txt
Normal file
@ -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
|
@ -138,7 +138,7 @@ Other ethtool Commands:
|
||||
To enable Flow Director
|
||||
ethtool -K ethX ntuple on
|
||||
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
|
||||
To see the list of filters currently present:
|
||||
ethtool -u ethX
|
||||
|
@ -1,12 +1,12 @@
|
||||
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>
|
||||
|
||||
This is the driver for the MAC 10/100/1000 on-chip Ethernet controllers
|
||||
(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
|
||||
FF1152AMT0221 D1215994A VIRTEX FPGA board.
|
||||
|
||||
@ -22,6 +22,9 @@ The kernel configuration option is STMMAC_ETH:
|
||||
Device Drivers ---> Network device support ---> Ethernet (1000 Mbit) --->
|
||||
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:
|
||||
debug: message level (0: no output, 16: all);
|
||||
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 descriptors in the ring and informs the DMA engine that there is a packet
|
||||
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
|
||||
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
|
||||
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.
|
||||
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
|
||||
buffers in order to avoid the memcpy (Zero-copy).
|
||||
buffers in order to avoid the memcpy (zero-copy).
|
||||
|
||||
4.3) Interrupt Mitigation
|
||||
The driver is able to mitigate the number of its DMA interrupts
|
||||
using NAPI for the reception on chips older than the 3.50.
|
||||
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.
|
||||
|
||||
4.4) WOL
|
||||
@ -79,7 +75,7 @@ Wake up on Lan feature through Magic and Unicast frames are supported for the
|
||||
GMAC core.
|
||||
|
||||
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.
|
||||
|
||||
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,
|
||||
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
|
||||
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
|
||||
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.
|
||||
|
||||
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
|
||||
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 {
|
||||
char *phy_bus_name;
|
||||
@ -125,15 +131,18 @@ struct plat_stmmacenet_data {
|
||||
int force_sf_dma_mode;
|
||||
int force_thresh_dma_mode;
|
||||
int riwt_off;
|
||||
int max_speed;
|
||||
int maxmtu;
|
||||
void (*fix_mac_speed)(void *priv, unsigned int speed);
|
||||
void (*bus_setup)(void __iomem *ioaddr);
|
||||
void *(*setup)(struct platform_device *pdev);
|
||||
void (*free)(struct platform_device *pdev, void *priv);
|
||||
int (*init)(struct platform_device *pdev, void *priv);
|
||||
void (*exit)(struct platform_device *pdev, void *priv);
|
||||
void *custom_cfg;
|
||||
void *custom_data;
|
||||
void *bsp_priv;
|
||||
};
|
||||
};
|
||||
|
||||
Where:
|
||||
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
|
||||
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 common.h: common definitions and VFTs;
|
||||
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 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 norm_desc.c: functions for handling normal descriptors;
|
||||
o chain_mode.c/ring_mode.c:: functions to manage RING/CHAINED modes;
|
||||
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
|
||||
|
||||
@ -298,23 +318,14 @@ to get statistics: e.g. using: ethtool -S ethX
|
||||
(that shows the Management counters (MMC) if supported)
|
||||
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:
|
||||
|
||||
/sys/kernel/debug/stmmaceth/descriptors_status
|
||||
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
|
||||
|
||||
@ -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
|
||||
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),
|
||||
which enables precise synchronization of clocks in measurement and
|
||||
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.
|
||||
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.
|
||||
This information is available at run-time by looking at the
|
||||
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.
|
||||
Also thanks to these registers it is possible to look at the
|
||||
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
Documentation/networking/switchdev.txt
Normal file
59
Documentation/networking/switchdev.txt
Normal file
@ -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.
|
@ -122,7 +122,7 @@ SOF_TIMESTAMPING_RAW_HARDWARE:
|
||||
|
||||
1.3.3 Timestamp Options
|
||||
|
||||
The interface supports one option
|
||||
The interface supports the options
|
||||
|
||||
SOF_TIMESTAMPING_OPT_ID:
|
||||
|
||||
@ -130,19 +130,36 @@ SOF_TIMESTAMPING_OPT_ID:
|
||||
have multiple concurrent timestamping requests outstanding. Packets
|
||||
can be reordered in the transmit path, for instance in the packet
|
||||
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
|
||||
timestamp is always looped along with a struct sock_extended_err.
|
||||
The option modifies field ee_data to pass an id that is unique
|
||||
among all possibly concurrently outstanding timestamp requests for
|
||||
that socket. In practice, it is a monotonically increasing u32
|
||||
(that wraps).
|
||||
that socket.
|
||||
|
||||
In datagram sockets, the counter increments on each send call. In
|
||||
stream sockets, it increments with every byte.
|
||||
|
||||
SOF_TIMESTAMPING_OPT_CMSG:
|
||||
|
||||
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
|
||||
|
@ -46,6 +46,7 @@
|
||||
#include <netpacket/packet.h>
|
||||
#include <poll.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@ -58,6 +59,14 @@
|
||||
#include <time.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 */
|
||||
static int cfg_proto = SOCK_STREAM;
|
||||
static int cfg_ipproto = IPPROTO_TCP;
|
||||
@ -65,6 +74,8 @@ static int cfg_num_pkts = 4;
|
||||
static int do_ipv4 = 1;
|
||||
static int do_ipv6 = 1;
|
||||
static int cfg_payload_len = 10;
|
||||
static bool cfg_show_payload;
|
||||
static bool cfg_do_pktinfo;
|
||||
static uint16_t dest_port = 9000;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
/* 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)
|
||||
{
|
||||
struct pollfd pollfd;
|
||||
@ -156,10 +191,9 @@ static void __recv_errmsg_cmsg(struct msghdr *msg, int payload_len)
|
||||
cm->cmsg_type == SCM_TIMESTAMPING) {
|
||||
tss = (void *) CMSG_DATA(cm);
|
||||
} 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);
|
||||
if (serr->ee_errno != ENOMSG ||
|
||||
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 = 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
|
||||
fprintf(stderr, "unknown cmsg %d,%d\n",
|
||||
cm->cmsg_level, cm->cmsg_type);
|
||||
@ -206,7 +250,11 @@ static int recv_errmsg(int fd)
|
||||
if (ret == -1 && errno != EAGAIN)
|
||||
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);
|
||||
return ret == -1;
|
||||
@ -215,9 +263,9 @@ static int recv_errmsg(int fd)
|
||||
static void do_test(int family, unsigned int opt)
|
||||
{
|
||||
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 */
|
||||
fprintf(stderr, "test: skipping datagram over IPv6\n");
|
||||
return;
|
||||
@ -239,7 +287,6 @@ static void do_test(int family, unsigned int opt)
|
||||
error(1, errno, "socket");
|
||||
|
||||
if (cfg_proto == SOCK_STREAM) {
|
||||
val = 1;
|
||||
if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY,
|
||||
(char*) &val, sizeof(val)))
|
||||
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 |
|
||||
SOF_TIMESTAMPING_OPT_CMSG |
|
||||
SOF_TIMESTAMPING_OPT_ID;
|
||||
if (setsockopt(fd, SOL_SOCKET, SO_TIMESTAMPING,
|
||||
(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++) {
|
||||
memset(&ts_prev, 0, sizeof(ts_prev));
|
||||
memset(buf, 'a' + i, total_len);
|
||||
buf[total_len - 2] = '\n';
|
||||
buf[total_len - 1] = '\0';
|
||||
|
||||
if (cfg_proto == SOCK_RAW) {
|
||||
struct udphdr *udph;
|
||||
@ -324,11 +382,13 @@ static void __attribute__((noreturn)) usage(const char *filepath)
|
||||
" -4: only IPv4\n"
|
||||
" -6: only IPv6\n"
|
||||
" -h: show this message\n"
|
||||
" -I: request PKTINFO\n"
|
||||
" -l N: send N bytes at a time\n"
|
||||
" -r: use raw\n"
|
||||
" -R: use raw (IP_HDRINCL)\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);
|
||||
exit(1);
|
||||
}
|
||||
@ -338,7 +398,7 @@ static void parse_opt(int argc, char **argv)
|
||||
int proto_count = 0;
|
||||
char c;
|
||||
|
||||
while ((c = getopt(argc, argv, "46hl:p:rRu")) != -1) {
|
||||
while ((c = getopt(argc, argv, "46hIl:p:rRux")) != -1) {
|
||||
switch (c) {
|
||||
case '4':
|
||||
do_ipv6 = 0;
|
||||
@ -346,6 +406,9 @@ static void parse_opt(int argc, char **argv)
|
||||
case '6':
|
||||
do_ipv4 = 0;
|
||||
break;
|
||||
case 'I':
|
||||
cfg_do_pktinfo = true;
|
||||
break;
|
||||
case 'r':
|
||||
proto_count++;
|
||||
cfg_proto = SOCK_RAW;
|
||||
@ -367,6 +430,9 @@ static void parse_opt(int argc, char **argv)
|
||||
case 'p':
|
||||
dest_port = strtoul(optarg, NULL, 10);
|
||||
break;
|
||||
case 'x':
|
||||
cfg_show_payload = true;
|
||||
break;
|
||||
case 'h':
|
||||
default:
|
||||
usage(argv[0]);
|
||||
|
@ -120,10 +120,14 @@ seconds.
|
||||
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
|
||||
-------------
|
||||
@ -138,6 +142,28 @@ netdev_max_backlog
|
||||
Maximum number of packets, queued on the INPUT side, when the interface
|
||||
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
|
||||
----------------------
|
||||
|
||||
|
37
MAINTAINERS
37
MAINTAINERS
@ -2332,6 +2332,14 @@ F: security/capability.c
|
||||
F: security/commoncap.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
|
||||
M: Arnd Bergmann <arnd@arndb.de>
|
||||
L: linuxppc-dev@lists.ozlabs.org
|
||||
@ -4752,6 +4760,13 @@ S: Maintained
|
||||
F: net/ieee802154/
|
||||
F: net/mac802154/
|
||||
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
|
||||
|
||||
IGORPLUG-USB IR RECEIVER
|
||||
@ -5931,6 +5946,11 @@ M: Russell King <rmk+kernel@arm.linux.org.uk>
|
||||
S: Maintained
|
||||
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)
|
||||
M: Mirko Lindner <mlindner@marvell.com>
|
||||
M: Stephen Hemminger <stephen@networkplumber.org>
|
||||
@ -7956,6 +7976,13 @@ F: drivers/hid/hid-roccat*
|
||||
F: include/linux/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
|
||||
P: Comtrol Corp.
|
||||
W: http://www.comtrol.com
|
||||
@ -8003,11 +8030,10 @@ S: Maintained
|
||||
F: drivers/media/dvb-frontends/rtl2832_sdr*
|
||||
|
||||
RTL8180 WIRELESS DRIVER
|
||||
M: "John W. Linville" <linville@tuxdriver.com>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
W: http://wireless.kernel.org/
|
||||
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/
|
||||
|
||||
RTL8187 WIRELESS DRIVER
|
||||
@ -9160,6 +9186,13 @@ F: lib/swiotlb.c
|
||||
F: arch/*/kernel/pci-swiotlb.c
|
||||
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
|
||||
M: Vineet Gupta <vgupta@synopsys.com>
|
||||
S: Supported
|
||||
|
@ -3,7 +3,6 @@
|
||||
generic-y += clkdev.h
|
||||
generic-y += cputime.h
|
||||
generic-y += exec.h
|
||||
generic-y += hash.h
|
||||
generic-y += irq_work.h
|
||||
generic-y += mcs_spinlock.h
|
||||
generic-y += preempt.h
|
||||
|
@ -87,4 +87,9 @@
|
||||
|
||||
#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 */
|
||||
|
@ -12,7 +12,6 @@ generic-y += fb.h
|
||||
generic-y += fcntl.h
|
||||
generic-y += ftrace.h
|
||||
generic-y += hardirq.h
|
||||
generic-y += hash.h
|
||||
generic-y += hw_irq.h
|
||||
generic-y += ioctl.h
|
||||
generic-y += ioctls.h
|
||||
|
@ -97,7 +97,6 @@ CONFIG_PPP_ASYNC=m
|
||||
CONFIG_PPP_SYNC_TTY=m
|
||||
CONFIG_PPP_DEFLATE=m
|
||||
CONFIG_NETCONSOLE=y
|
||||
CONFIG_NETPOLL_TRAP=y
|
||||
# CONFIG_INPUT_MOUSEDEV is not set
|
||||
CONFIG_INPUT_EVDEV=m
|
||||
CONFIG_INPUT_EVBUG=m
|
||||
|
@ -7,7 +7,6 @@ generic-y += current.h
|
||||
generic-y += emergency-restart.h
|
||||
generic-y += errno.h
|
||||
generic-y += exec.h
|
||||
generic-y += hash.h
|
||||
generic-y += ioctl.h
|
||||
generic-y += ipcbuf.h
|
||||
generic-y += irq_regs.h
|
||||
|
@ -400,7 +400,7 @@ asmlinkage long sys_oabi_sendto(int fd, void __user *buff,
|
||||
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;
|
||||
int msg_namelen;
|
||||
@ -446,7 +446,7 @@ asmlinkage long sys_oabi_socketcall(int call, unsigned long __user *args)
|
||||
break;
|
||||
case SYS_SENDMSG:
|
||||
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;
|
||||
default:
|
||||
r = sys_socketcall(call, args);
|
||||
|
@ -158,6 +158,7 @@ struct pxa168_eth_platform_data gplugd_eth_platform_data = {
|
||||
.port_number = 0,
|
||||
.phy_addr = 0,
|
||||
.speed = 0, /* Autonagotiation */
|
||||
.intf = PHY_INTERFACE_MODE_RMII,
|
||||
.init = gplugd_eth_init,
|
||||
};
|
||||
|
||||
|
@ -14,7 +14,6 @@ generic-y += early_ioremap.h
|
||||
generic-y += emergency-restart.h
|
||||
generic-y += errno.h
|
||||
generic-y += ftrace.h
|
||||
generic-y += hash.h
|
||||
generic-y += hw_irq.h
|
||||
generic-y += ioctl.h
|
||||
generic-y += ioctls.h
|
||||
|
@ -7,7 +7,6 @@ generic-y += div64.h
|
||||
generic-y += emergency-restart.h
|
||||
generic-y += exec.h
|
||||
generic-y += futex.h
|
||||
generic-y += hash.h
|
||||
generic-y += irq_regs.h
|
||||
generic-y += irq_work.h
|
||||
generic-y += local.h
|
||||
|
@ -80,4 +80,9 @@
|
||||
|
||||
#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 */
|
||||
|
@ -10,7 +10,6 @@ generic-y += emergency-restart.h
|
||||
generic-y += errno.h
|
||||
generic-y += fb.h
|
||||
generic-y += futex.h
|
||||
generic-y += hash.h
|
||||
generic-y += hw_irq.h
|
||||
generic-y += ioctl.h
|
||||
generic-y += ipcbuf.h
|
||||
|
@ -15,7 +15,6 @@ generic-y += exec.h
|
||||
generic-y += fb.h
|
||||
generic-y += fcntl.h
|
||||
generic-y += futex.h
|
||||
generic-y += hash.h
|
||||
generic-y += hw_irq.h
|
||||
generic-y += io.h
|
||||
generic-y += ioctl.h
|
||||
|
@ -7,7 +7,6 @@ generic-y += barrier.h
|
||||
generic-y += clkdev.h
|
||||
generic-y += cputime.h
|
||||
generic-y += exec.h
|
||||
generic-y += hash.h
|
||||
generic-y += irq_work.h
|
||||
generic-y += kvm_para.h
|
||||
generic-y += linkage.h
|
||||
|
@ -82,6 +82,11 @@
|
||||
|
||||
#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 */
|
||||
|
||||
|
||||
|
@ -2,7 +2,6 @@
|
||||
generic-y += clkdev.h
|
||||
generic-y += cputime.h
|
||||
generic-y += exec.h
|
||||
generic-y += hash.h
|
||||
generic-y += irq_work.h
|
||||
generic-y += mcs_spinlock.h
|
||||
generic-y += preempt.h
|
||||
|
@ -80,5 +80,10 @@
|
||||
|
||||
#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 */
|
||||
|
||||
|
@ -16,7 +16,6 @@ generic-y += fb.h
|
||||
generic-y += fcntl.h
|
||||
generic-y += ftrace.h
|
||||
generic-y += hardirq.h
|
||||
generic-y += hash.h
|
||||
generic-y += hw_irq.h
|
||||
generic-y += ioctl.h
|
||||
generic-y += ioctls.h
|
||||
|
@ -1,7 +1,6 @@
|
||||
|
||||
generic-y += clkdev.h
|
||||
generic-y += exec.h
|
||||
generic-y += hash.h
|
||||
generic-y += irq_work.h
|
||||
generic-y += kvm_para.h
|
||||
generic-y += mcs_spinlock.h
|
||||
|
@ -89,4 +89,9 @@
|
||||
|
||||
#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 */
|
||||
|
@ -2,7 +2,6 @@
|
||||
generic-y += clkdev.h
|
||||
generic-y += cputime.h
|
||||
generic-y += exec.h
|
||||
generic-y += hash.h
|
||||
generic-y += irq_work.h
|
||||
generic-y += mcs_spinlock.h
|
||||
generic-y += module.h
|
||||
|
@ -80,4 +80,9 @@
|
||||
|
||||
#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 */
|
||||
|
@ -6,7 +6,6 @@ generic-y += device.h
|
||||
generic-y += emergency-restart.h
|
||||
generic-y += errno.h
|
||||
generic-y += exec.h
|
||||
generic-y += hash.h
|
||||
generic-y += hw_irq.h
|
||||
generic-y += ioctl.h
|
||||
generic-y += ipcbuf.h
|
||||
|
@ -13,7 +13,6 @@ generic-y += fb.h
|
||||
generic-y += fcntl.h
|
||||
generic-y += futex.h
|
||||
generic-y += hardirq.h
|
||||
generic-y += hash.h
|
||||
generic-y += hw_irq.h
|
||||
generic-y += ioctl.h
|
||||
generic-y += ioctls.h
|
||||
|
@ -4,7 +4,6 @@ generic-y += clkdev.h
|
||||
generic-y += cputime.h
|
||||
generic-y += device.h
|
||||
generic-y += exec.h
|
||||
generic-y += hash.h
|
||||
generic-y += irq_work.h
|
||||
generic-y += mcs_spinlock.h
|
||||
generic-y += preempt.h
|
||||
|
@ -3,7 +3,6 @@ generic-y += cputime.h
|
||||
generic-y += current.h
|
||||
generic-y += dma-contiguous.h
|
||||
generic-y += emergency-restart.h
|
||||
generic-y += hash.h
|
||||
generic-y += irq_work.h
|
||||
generic-y += local64.h
|
||||
generic-y += mcs_spinlock.h
|
||||
|
@ -98,4 +98,9 @@
|
||||
|
||||
#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 */
|
||||
|
@ -426,7 +426,7 @@ static inline void emit_mod(unsigned int dst, unsigned int src,
|
||||
u32 *p = &ctx->target[ctx->idx];
|
||||
uasm_i_divu(&p, dst, src);
|
||||
p = &ctx->target[ctx->idx + 1];
|
||||
uasm_i_mflo(&p, dst);
|
||||
uasm_i_mfhi(&p, dst);
|
||||
}
|
||||
ctx->idx += 2; /* 2 insts */
|
||||
}
|
||||
@ -971,7 +971,7 @@ load_ind:
|
||||
break;
|
||||
case BPF_ALU | BPF_MOD | BPF_K:
|
||||
/* A %= k */
|
||||
if (k == 1 || optimize_div(&k)) {
|
||||
if (k == 1) {
|
||||
ctx->flags |= SEEN_A;
|
||||
emit_jit_reg_move(r_A, r_zero, ctx);
|
||||
} else {
|
||||
|
@ -3,7 +3,6 @@ generic-y += barrier.h
|
||||
generic-y += clkdev.h
|
||||
generic-y += cputime.h
|
||||
generic-y += exec.h
|
||||
generic-y += hash.h
|
||||
generic-y += irq_work.h
|
||||
generic-y += mcs_spinlock.h
|
||||
generic-y += preempt.h
|
||||
|
@ -80,4 +80,9 @@
|
||||
|
||||
#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 */
|
||||
|
@ -19,7 +19,6 @@ generic-y += fcntl.h
|
||||
generic-y += ftrace.h
|
||||
generic-y += futex.h
|
||||
generic-y += hardirq.h
|
||||
generic-y += hash.h
|
||||
generic-y += hw_irq.h
|
||||
generic-y += ioctl.h
|
||||
generic-y += ioctls.h
|
||||
|
@ -25,7 +25,6 @@ generic-y += fcntl.h
|
||||
generic-y += ftrace.h
|
||||
generic-y += futex.h
|
||||
generic-y += hardirq.h
|
||||
generic-y += hash.h
|
||||
generic-y += hw_irq.h
|
||||
generic-y += ioctl.h
|
||||
generic-y += ioctls.h
|
||||
|
@ -7,7 +7,6 @@ generic-y += device.h
|
||||
generic-y += div64.h
|
||||
generic-y += emergency-restart.h
|
||||
generic-y += exec.h
|
||||
generic-y += hash.h
|
||||
generic-y += hw_irq.h
|
||||
generic-y += irq_regs.h
|
||||
generic-y += irq_work.h
|
||||
|
@ -79,4 +79,9 @@
|
||||
|
||||
#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 */
|
||||
|
@ -100,7 +100,6 @@ CONFIG_NETDEVICES=y
|
||||
CONFIG_BONDING=m
|
||||
CONFIG_DUMMY=m
|
||||
CONFIG_NETCONSOLE=y
|
||||
CONFIG_NETPOLL_TRAP=y
|
||||
CONFIG_TUN=m
|
||||
# CONFIG_NET_VENDOR_3COM is not set
|
||||
CONFIG_FS_ENET=y
|
||||
|
@ -113,7 +113,6 @@ CONFIG_SLIP_COMPRESSED=y
|
||||
CONFIG_SLIP_SMART=y
|
||||
CONFIG_SLIP_MODE_SLIP6=y
|
||||
CONFIG_NETCONSOLE=y
|
||||
CONFIG_NETPOLL_TRAP=y
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
# CONFIG_SERIO is not set
|
||||
|
@ -114,7 +114,6 @@ CONFIG_SLIP_COMPRESSED=y
|
||||
CONFIG_SLIP_SMART=y
|
||||
CONFIG_SLIP_MODE_SLIP6=y
|
||||
CONFIG_NETCONSOLE=y
|
||||
CONFIG_NETPOLL_TRAP=y
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
# CONFIG_SERIO is not set
|
||||
|
@ -165,7 +165,6 @@ CONFIG_SLIP_COMPRESSED=y
|
||||
CONFIG_SLIP_SMART=y
|
||||
CONFIG_SLIP_MODE_SLIP6=y
|
||||
CONFIG_NETCONSOLE=y
|
||||
CONFIG_NETPOLL_TRAP=y
|
||||
CONFIG_INPUT_FF_MEMLESS=m
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
|
@ -167,7 +167,6 @@ CONFIG_SLIP_COMPRESSED=y
|
||||
CONFIG_SLIP_SMART=y
|
||||
CONFIG_SLIP_MODE_SLIP6=y
|
||||
CONFIG_NETCONSOLE=y
|
||||
CONFIG_NETPOLL_TRAP=y
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
# CONFIG_SERIO is not set
|
||||
|
@ -211,7 +211,6 @@ CONFIG_MV643XX_ETH=y
|
||||
# CONFIG_NETDEV_10000 is not set
|
||||
# CONFIG_ATM_DRIVERS is not set
|
||||
CONFIG_NETCONSOLE=m
|
||||
CONFIG_NETPOLL_TRAP=y
|
||||
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
|
@ -154,7 +154,6 @@ CONFIG_WINDFARM_PM121=y
|
||||
CONFIG_BONDING=m
|
||||
CONFIG_DUMMY=m
|
||||
CONFIG_NETCONSOLE=y
|
||||
CONFIG_NETPOLL_TRAP=y
|
||||
CONFIG_TUN=m
|
||||
CONFIG_VIRTIO_NET=m
|
||||
CONFIG_VHOST_NET=m
|
||||
|
@ -103,7 +103,6 @@ CONFIG_NETDEVICES=y
|
||||
CONFIG_BONDING=m
|
||||
CONFIG_DUMMY=m
|
||||
CONFIG_NETCONSOLE=y
|
||||
CONFIG_NETPOLL_TRAP=y
|
||||
CONFIG_TUN=m
|
||||
CONFIG_VORTEX=y
|
||||
CONFIG_ACENIC=y
|
||||
|
@ -629,7 +629,6 @@ CONFIG_SLIP_SMART=y
|
||||
CONFIG_NET_FC=y
|
||||
CONFIG_NETCONSOLE=m
|
||||
CONFIG_NETCONSOLE_DYNAMIC=y
|
||||
CONFIG_NETPOLL_TRAP=y
|
||||
CONFIG_VIRTIO_NET=m
|
||||
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
||||
CONFIG_INPUT_JOYDEV=m
|
||||
|
@ -133,7 +133,6 @@ CONFIG_DM_UEVENT=y
|
||||
CONFIG_BONDING=m
|
||||
CONFIG_DUMMY=m
|
||||
CONFIG_NETCONSOLE=y
|
||||
CONFIG_NETPOLL_TRAP=y
|
||||
CONFIG_TUN=m
|
||||
CONFIG_VIRTIO_NET=m
|
||||
CONFIG_VHOST_NET=m
|
||||
|
@ -134,7 +134,6 @@ CONFIG_DM_UEVENT=y
|
||||
CONFIG_BONDING=m
|
||||
CONFIG_DUMMY=m
|
||||
CONFIG_NETCONSOLE=y
|
||||
CONFIG_NETPOLL_TRAP=y
|
||||
CONFIG_TUN=m
|
||||
CONFIG_VIRTIO_NET=m
|
||||
CONFIG_VHOST_NET=m
|
||||
|
@ -1,6 +1,5 @@
|
||||
|
||||
generic-y += clkdev.h
|
||||
generic-y += hash.h
|
||||
generic-y += irq_work.h
|
||||
generic-y += mcs_spinlock.h
|
||||
generic-y += preempt.h
|
||||
|
@ -204,6 +204,7 @@
|
||||
#define PPC_INST_ERATSX_DOT 0x7c000127
|
||||
|
||||
/* Misc instructions for BPF compiler */
|
||||
#define PPC_INST_LBZ 0x88000000
|
||||
#define PPC_INST_LD 0xe8000000
|
||||
#define PPC_INST_LHZ 0xa0000000
|
||||
#define PPC_INST_LHBRX 0x7c00062c
|
||||
|
@ -87,4 +87,9 @@
|
||||
|
||||
#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 */
|
||||
|
@ -87,6 +87,9 @@ DECLARE_LOAD_FUNC(sk_load_byte_msh);
|
||||
#define PPC_STD(r, base, i) EMIT(PPC_INST_STD | ___PPC_RS(r) | \
|
||||
___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) | \
|
||||
___PPC_RA(base) | IMM_L(i))
|
||||
#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) | \
|
||||
___PPC_RA(base) | ___PPC_RB(b))
|
||||
/* 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); \
|
||||
else { PPC_ADDIS(r, base, IMM_HA(i)); \
|
||||
PPC_LD(r, r, IMM_L(i)); } } while(0)
|
||||
|
@ -181,40 +181,29 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
|
||||
}
|
||||
break;
|
||||
case BPF_ALU | BPF_MOD | 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 {
|
||||
PPC_BCC_SHORT(COND_NE, (ctx->idx*4)+12);
|
||||
PPC_LI(r_ret, 0);
|
||||
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);
|
||||
break;
|
||||
case BPF_ALU | BPF_MOD | BPF_K: /* A %= K; */
|
||||
PPC_LI32(r_scratch2, K);
|
||||
PPC_DIVWU(r_scratch1, r_A, r_scratch2);
|
||||
PPC_MUL(r_scratch1, r_scratch2, r_scratch1);
|
||||
PPC_SUB(r_A, r_A, r_scratch1);
|
||||
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);
|
||||
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;
|
||||
case BPF_ALU | BPF_MOD | BPF_K: /* A %= K; */
|
||||
PPC_LI32(r_scratch2, K);
|
||||
PPC_DIVWU(r_scratch1, r_A, r_scratch2);
|
||||
PPC_MUL(r_scratch1, r_scratch2, r_scratch1);
|
||||
PPC_SUB(r_A, r_A, r_scratch1);
|
||||
break;
|
||||
case BPF_ALU | BPF_DIV | BPF_K: /* A /= K */
|
||||
if (K == 1)
|
||||
@ -361,6 +350,11 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
|
||||
protocol));
|
||||
break;
|
||||
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,
|
||||
dev));
|
||||
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]);
|
||||
} else {
|
||||
/* 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_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));
|
||||
} else {
|
||||
PPC_LHZ_OFFS(r_A, r_scratch1,
|
||||
offsetof(struct net_device, type));
|
||||
}
|
||||
|
||||
break;
|
||||
case BPF_ANC | SKF_AD_MARK:
|
||||
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,
|
||||
queue_mapping));
|
||||
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:
|
||||
#ifdef CONFIG_SMP
|
||||
/*
|
||||
|
@ -1,7 +1,6 @@
|
||||
|
||||
|
||||
generic-y += clkdev.h
|
||||
generic-y += hash.h
|
||||
generic-y += irq_work.h
|
||||
generic-y += mcs_spinlock.h
|
||||
generic-y += preempt.h
|
||||
|
@ -86,4 +86,9 @@
|
||||
|
||||
#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 */
|
||||
|
@ -5,7 +5,6 @@ header-y +=
|
||||
generic-y += barrier.h
|
||||
generic-y += clkdev.h
|
||||
generic-y += cputime.h
|
||||
generic-y += hash.h
|
||||
generic-y += irq_work.h
|
||||
generic-y += mcs_spinlock.h
|
||||
generic-y += preempt.h
|
||||
|
@ -8,7 +8,6 @@ generic-y += emergency-restart.h
|
||||
generic-y += errno.h
|
||||
generic-y += exec.h
|
||||
generic-y += fcntl.h
|
||||
generic-y += hash.h
|
||||
generic-y += ioctl.h
|
||||
generic-y += ipcbuf.h
|
||||
generic-y += irq_regs.h
|
||||
|
@ -6,7 +6,6 @@ generic-y += cputime.h
|
||||
generic-y += div64.h
|
||||
generic-y += emergency-restart.h
|
||||
generic-y += exec.h
|
||||
generic-y += hash.h
|
||||
generic-y += irq_regs.h
|
||||
generic-y += irq_work.h
|
||||
generic-y += linkage.h
|
||||
|
@ -247,6 +247,25 @@ struct vio_net_desc {
|
||||
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
|
||||
|
||||
struct vio_dring_state {
|
||||
|
@ -76,6 +76,11 @@
|
||||
|
||||
#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 */
|
||||
#define SO_SECURITY_AUTHENTICATION 0x5001
|
||||
#define SO_SECURITY_ENCRYPTION_TRANSPORT 0x5002
|
||||
|
@ -218,7 +218,6 @@ CONFIG_MACVLAN=m
|
||||
CONFIG_MACVTAP=m
|
||||
CONFIG_NETCONSOLE=m
|
||||
CONFIG_NETCONSOLE_DYNAMIC=y
|
||||
CONFIG_NETPOLL_TRAP=y
|
||||
CONFIG_TUN=y
|
||||
CONFIG_VETH=m
|
||||
CONFIG_NET_DSA_MV88E6060=y
|
||||
|
@ -337,7 +337,6 @@ CONFIG_MACVLAN=m
|
||||
CONFIG_MACVTAP=m
|
||||
CONFIG_NETCONSOLE=m
|
||||
CONFIG_NETCONSOLE_DYNAMIC=y
|
||||
CONFIG_NETPOLL_TRAP=y
|
||||
CONFIG_TUN=y
|
||||
CONFIG_VETH=m
|
||||
CONFIG_NET_DSA_MV88E6060=y
|
||||
|
@ -11,7 +11,6 @@ generic-y += errno.h
|
||||
generic-y += exec.h
|
||||
generic-y += fb.h
|
||||
generic-y += fcntl.h
|
||||
generic-y += hash.h
|
||||
generic-y += hw_irq.h
|
||||
generic-y += ioctl.h
|
||||
generic-y += ioctls.h
|
||||
|
@ -10,7 +10,6 @@ generic-y += exec.h
|
||||
generic-y += ftrace.h
|
||||
generic-y += futex.h
|
||||
generic-y += hardirq.h
|
||||
generic-y += hash.h
|
||||
generic-y += hw_irq.h
|
||||
generic-y += io.h
|
||||
generic-y += irq_regs.h
|
||||
|
@ -16,7 +16,6 @@ generic-y += fcntl.h
|
||||
generic-y += ftrace.h
|
||||
generic-y += futex.h
|
||||
generic-y += hardirq.h
|
||||
generic-y += hash.h
|
||||
generic-y += hw_irq.h
|
||||
generic-y += ioctl.h
|
||||
generic-y += ioctls.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 */
|
@ -23,7 +23,7 @@ lib-y += memcpy_$(BITS).o
|
||||
lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.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)
|
||||
obj-y += atomic64_32.o
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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_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)
|
||||
*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) \
|
||||
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;
|
||||
}
|
||||
|
||||
static inline bool is_simm32(s64 value)
|
||||
static bool is_simm32(s64 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_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();
|
||||
|
||||
@ -133,24 +133,24 @@ static const int reg2hex[] = {
|
||||
* which need extra byte of 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 */
|
||||
static inline u8 add_1mod(u8 byte, u32 reg)
|
||||
static u8 add_1mod(u8 byte, u32 reg)
|
||||
{
|
||||
if (is_ereg(reg))
|
||||
byte |= 1;
|
||||
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))
|
||||
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' */
|
||||
static inline u8 add_1reg(u8 byte, u32 dst_reg)
|
||||
static u8 add_1reg(u8 byte, u32 dst_reg)
|
||||
{
|
||||
return byte + reg2hex[dst_reg];
|
||||
}
|
||||
|
||||
/* 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);
|
||||
}
|
||||
@ -178,7 +178,7 @@ static void jit_fill_hole(void *area, unsigned int size)
|
||||
}
|
||||
|
||||
struct jit_context {
|
||||
unsigned int cleanup_addr; /* epilogue code offset */
|
||||
int cleanup_addr; /* epilogue code offset */
|
||||
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;
|
||||
int insn_cnt = bpf_prog->len;
|
||||
bool seen_ld_abs = ctx->seen_ld_abs | (oldproglen == 0);
|
||||
bool seen_exit = false;
|
||||
u8 temp[BPF_MAX_INSN_SIZE + BPF_INSN_SAFETY];
|
||||
int i;
|
||||
int proglen = 0;
|
||||
@ -854,10 +855,11 @@ common_load:
|
||||
goto common_load;
|
||||
|
||||
case BPF_JMP | BPF_EXIT:
|
||||
if (i != insn_cnt - 1) {
|
||||
if (seen_exit) {
|
||||
jmp_offset = ctx->cleanup_addr - addrs[i];
|
||||
goto emit_jmp;
|
||||
}
|
||||
seen_exit = true;
|
||||
/* update cleanup_addr */
|
||||
ctx->cleanup_addr = proglen;
|
||||
/* mov rbx, qword ptr [rbp-X] */
|
||||
|
@ -9,7 +9,6 @@ generic-y += errno.h
|
||||
generic-y += exec.h
|
||||
generic-y += fcntl.h
|
||||
generic-y += hardirq.h
|
||||
generic-y += hash.h
|
||||
generic-y += ioctl.h
|
||||
generic-y += irq_regs.h
|
||||
generic-y += irq_work.h
|
||||
|
@ -91,4 +91,9 @@
|
||||
|
||||
#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 */
|
||||
|
@ -399,7 +399,7 @@ int af_alg_cmsg_send(struct msghdr *msg, struct af_alg_control *con)
|
||||
{
|
||||
struct cmsghdr *cmsg;
|
||||
|
||||
for (cmsg = CMSG_FIRSTHDR(msg); cmsg; cmsg = CMSG_NXTHDR(msg, cmsg)) {
|
||||
for_each_cmsghdr(cmsg, msg) {
|
||||
if (!CMSG_OK(msg, cmsg))
|
||||
return -EINVAL;
|
||||
if (cmsg->cmsg_level != SOL_ALG)
|
||||
|
@ -42,7 +42,7 @@ static int hash_sendmsg(struct kiocb *unused, struct socket *sock,
|
||||
struct alg_sock *ask = alg_sk(sk);
|
||||
struct hash_ctx *ctx = ask->private;
|
||||
unsigned long iovlen;
|
||||
struct iovec *iov;
|
||||
const struct iovec *iov;
|
||||
long copied = 0;
|
||||
int err;
|
||||
|
||||
@ -58,7 +58,7 @@ static int hash_sendmsg(struct kiocb *unused, struct socket *sock,
|
||||
|
||||
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++) {
|
||||
unsigned long seglen = iov->iov_len;
|
||||
char __user *from = iov->iov_base;
|
||||
@ -174,7 +174,7 @@ static int hash_recvmsg(struct kiocb *unused, struct socket *sock,
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
err = memcpy_toiovec(msg->msg_iov, ctx->result, len);
|
||||
err = memcpy_to_msg(msg, ctx->result, len);
|
||||
|
||||
unlock:
|
||||
release_sock(sk);
|
||||
|
@ -298,9 +298,9 @@ static int skcipher_sendmsg(struct kiocb *unused, struct socket *sock,
|
||||
len = min_t(unsigned long, len,
|
||||
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)
|
||||
goto unlock;
|
||||
|
||||
@ -337,8 +337,8 @@ static int skcipher_sendmsg(struct kiocb *unused, struct socket *sock,
|
||||
if (!sg_page(sg + i))
|
||||
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) {
|
||||
__free_page(sg_page(sg + i));
|
||||
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 scatterlist *sg;
|
||||
unsigned long iovlen;
|
||||
struct iovec *iov;
|
||||
const struct iovec *iov;
|
||||
int err = -EAGAIN;
|
||||
int used;
|
||||
long copied = 0;
|
||||
|
||||
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++) {
|
||||
unsigned long seglen = iov->iov_len;
|
||||
char __user *from = iov->iov_base;
|
||||
|
@ -356,6 +356,8 @@ static int do_rx_dma(struct atm_vcc *vcc,struct sk_buff *skb,
|
||||
if (skb) {
|
||||
paddr = pci_map_single(eni_dev->pci_dev,skb->data,skb->len,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
if (pci_dma_mapping_error(eni_dev->pci_dev, paddr))
|
||||
goto dma_map_error;
|
||||
ENI_PRV_PADDR(skb) = paddr;
|
||||
if (paddr & 3)
|
||||
printk(KERN_CRIT DEV_LABEL "(itf %d): VCI %d has "
|
||||
@ -481,6 +483,7 @@ trouble:
|
||||
if (paddr)
|
||||
pci_unmap_single(eni_dev->pci_dev,paddr,skb->len,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
dma_map_error:
|
||||
if (skb) dev_kfree_skb_irq(skb);
|
||||
return -1;
|
||||
}
|
||||
|
@ -24,6 +24,7 @@ struct bcma_bus;
|
||||
/* main.c */
|
||||
bool bcma_wait_value(struct bcma_device *core, u16 reg, u32 mask, u32 value,
|
||||
int timeout);
|
||||
void bcma_prepare_core(struct bcma_bus *bus, struct bcma_device *core);
|
||||
int bcma_bus_register(struct bcma_bus *bus);
|
||||
void bcma_bus_unregister(struct bcma_bus *bus);
|
||||
int __init bcma_bus_early_register(struct bcma_bus *bus,
|
||||
|
@ -339,7 +339,7 @@ void bcma_chipco_serial_init(struct bcma_drv_cc *cc)
|
||||
return;
|
||||
}
|
||||
|
||||
irq = bcma_core_irq(cc->core);
|
||||
irq = bcma_core_irq(cc->core, 0);
|
||||
|
||||
/* Determine the registers of the UARTs */
|
||||
cc->nr_serial_ports = (cc->capabilities & BCMA_CC_CAP_NRUART);
|
||||
|
@ -152,7 +152,7 @@ static int bcma_gpio_irq_domain_init(struct bcma_drv_cc *cc)
|
||||
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",
|
||||
cc);
|
||||
if (err)
|
||||
@ -183,7 +183,7 @@ static void bcma_gpio_irq_domain_exit(struct bcma_drv_cc *cc)
|
||||
return;
|
||||
|
||||
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++) {
|
||||
int irq = irq_find_mapping(cc->irq_domain, gpio);
|
||||
|
||||
|
@ -115,7 +115,7 @@ static u32 bcma_core_mips_irqflag(struct bcma_device *dev)
|
||||
* If disabled, 5 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;
|
||||
u32 irqflag;
|
||||
@ -133,13 +133,6 @@ static unsigned int bcma_core_mips_irq(struct bcma_device *dev)
|
||||
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)
|
||||
{
|
||||
unsigned int oldirq = bcma_core_mips_irq(dev);
|
||||
@ -423,7 +416,7 @@ void bcma_core_mips_init(struct bcma_drv_mips *mcore)
|
||||
break;
|
||||
default:
|
||||
list_for_each_entry(core, &bus->cores, list) {
|
||||
core->irq = bcma_core_irq(core);
|
||||
core->irq = bcma_core_irq(core, 0);
|
||||
}
|
||||
bcma_err(bus,
|
||||
"Unknown device (0x%x) found, can not configure IRQs\n",
|
||||
|
@ -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));
|
||||
|
||||
/* 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);
|
||||
|
||||
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,
|
||||
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);
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include <linux/bcma/bcma.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_irq.h>
|
||||
|
||||
MODULE_DESCRIPTION("Broadcom's specific AMBA driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
@ -153,6 +154,46 @@ static struct device_node *bcma_of_find_child_device(struct platform_device *par
|
||||
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,
|
||||
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);
|
||||
if (node)
|
||||
core->dev.of_node = node;
|
||||
|
||||
core->irq = bcma_of_get_irq(parent, core, 0);
|
||||
}
|
||||
#else
|
||||
static void bcma_of_fill_device(struct platform_device *parent,
|
||||
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 */
|
||||
|
||||
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.bus = &bcma_bus_type;
|
||||
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:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void bcma_register_core(struct bcma_bus *bus, struct bcma_device *core)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = device_register(&core->dev);
|
||||
if (err) {
|
||||
|
@ -505,6 +505,7 @@ int bcma_bus_scan(struct bcma_bus *bus)
|
||||
bus->nr_cores++;
|
||||
other_core = bcma_find_core_reverse(bus, core->id.id);
|
||||
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",
|
||||
core->core_index, bcma_device_name(&core->id),
|
||||
|
@ -210,6 +210,7 @@ config BT_MRVL_SDIO
|
||||
tristate "Marvell BT-over-SDIO driver"
|
||||
depends on BT_MRVL && MMC
|
||||
select FW_LOADER
|
||||
select WANT_DEV_COREDUMP
|
||||
help
|
||||
The driver for Marvell Bluetooth chipsets with SDIO interface.
|
||||
|
||||
|
@ -79,6 +79,7 @@ static const struct usb_device_id ath3k_table[] = {
|
||||
{ USB_DEVICE(0x0489, 0xe057) },
|
||||
{ USB_DEVICE(0x0489, 0xe056) },
|
||||
{ USB_DEVICE(0x0489, 0xe05f) },
|
||||
{ USB_DEVICE(0x0489, 0xe078) },
|
||||
{ USB_DEVICE(0x04c5, 0x1330) },
|
||||
{ USB_DEVICE(0x04CA, 0x3004) },
|
||||
{ USB_DEVICE(0x04CA, 0x3005) },
|
||||
@ -105,6 +106,7 @@ static const struct usb_device_id ath3k_table[] = {
|
||||
{ USB_DEVICE(0x13d3, 0x3375) },
|
||||
{ USB_DEVICE(0x13d3, 0x3393) },
|
||||
{ USB_DEVICE(0x13d3, 0x3402) },
|
||||
{ USB_DEVICE(0x13d3, 0x3408) },
|
||||
{ USB_DEVICE(0x13d3, 0x3432) },
|
||||
|
||||
/* 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, 0xe057), .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(0x04ca, 0x3004), .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, 0x3393), .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 },
|
||||
|
||||
/* Atheros AR5BBU22 with sflash firmware */
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user