mirror of https://gitee.com/openkylin/linux.git
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
Pull networking updates from David Miller:
"This is a re-do of the net-next pull request for the current merge
window. The only difference from the one I made the other day is that
this has Eliezer's interface renames and the timeout handling changes
made based upon your feedback, as well as a few bug fixes that have
trickeled in.
Highlights:
1) Low latency device polling, eliminating the cost of interrupt
handling and context switches. Allows direct polling of a network
device from socket operations, such as recvmsg() and poll().
Currently ixgbe, mlx4, and bnx2x support this feature.
Full high level description, performance numbers, and design in
commit 0a4db187a9
("Merge branch 'll_poll'")
From Eliezer Tamir.
2) With the routing cache removed, ip_check_mc_rcu() gets exercised
more than ever before in the case where we have lots of multicast
addresses. Use a hash table instead of a simple linked list, from
Eric Dumazet.
3) Add driver for Atheros CQA98xx 802.11ac wireless devices, from
Bartosz Markowski, Janusz Dziedzic, Kalle Valo, Marek Kwaczynski,
Marek Puzyniak, Michal Kazior, and Sujith Manoharan.
4) Support reporting the TUN device persist flag to userspace, from
Pavel Emelyanov.
5) Allow controlling network device VF link state using netlink, from
Rony Efraim.
6) Support GRE tunneling in openvswitch, from Pravin B Shelar.
7) Adjust SOCK_MIN_RCVBUF and SOCK_MIN_SNDBUF for modern times, from
Daniel Borkmann and Eric Dumazet.
8) Allow controlling of TCP quickack behavior on a per-route basis,
from Cong Wang.
9) Several bug fixes and improvements to vxlan from Stephen
Hemminger, Pravin B Shelar, and Mike Rapoport. In particular,
support receiving on multiple UDP ports.
10) Major cleanups, particular in the area of debugging and cookie
lifetime handline, to the SCTP protocol code. From Daniel
Borkmann.
11) Allow packets to cross network namespaces when traversing tunnel
devices. From Nicolas Dichtel.
12) Allow monitoring netlink traffic via AF_PACKET sockets, in a
manner akin to how we monitor real network traffic via ptype_all.
From Daniel Borkmann.
13) Several bug fixes and improvements for the new alx device driver,
from Johannes Berg.
14) Fix scalability issues in the netem packet scheduler's time queue,
by using an rbtree. From Eric Dumazet.
15) Several bug fixes in TCP loss recovery handling, from Yuchung
Cheng.
16) Add support for GSO segmentation of MPLS packets, from Simon
Horman.
17) Make network notifiers have a real data type for the opaque
pointer that's passed into them. Use this to properly handle
network device flag changes in arp_netdev_event(). From Jiri
Pirko and Timo Teräs.
18) Convert several drivers over to module_pci_driver(), from Peter
Huewe.
19) tcp_fixup_rcvbuf() can loop 500 times over loopback, just use a
O(1) calculation instead. From Eric Dumazet.
20) Support setting of explicit tunnel peer addresses in ipv6, just
like ipv4. From Nicolas Dichtel.
21) Protect x86 BPF JIT against spraying attacks, from Eric Dumazet.
22) Prevent a single high rate flow from overruning an individual cpu
during RX packet processing via selective flow shedding. From
Willem de Bruijn.
23) Don't use spinlocks in TCP md5 signing fast paths, from Eric
Dumazet.
24) Don't just drop GSO packets which are above the TBF scheduler's
burst limit, chop them up so they are in-bounds instead. Also
from Eric Dumazet.
25) VLAN offloads are missed when configured on top of a bridge, fix
from Vlad Yasevich.
26) Support IPV6 in ping sockets. From Lorenzo Colitti.
27) Receive flow steering targets should be updated at poll() time
too, from David Majnemer.
28) Fix several corner case regressions in PMTU/redirect handling due
to the routing cache removal, from Timo Teräs.
29) We have to be mindful of ipv4 mapped ipv6 sockets in
upd_v6_push_pending_frames(). From Hannes Frederic Sowa.
30) Fix L2TP sequence number handling bugs, from James Chapman."
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next: (1214 commits)
drivers/net: caif: fix wrong rtnl_is_locked() usage
drivers/net: enic: release rtnl_lock on error-path
vhost-net: fix use-after-free in vhost_net_flush
net: mv643xx_eth: do not use port number as platform device id
net: sctp: confirm route during forward progress
virtio_net: fix race in RX VQ processing
virtio: support unlocked queue poll
net/cadence/macb: fix bug/typo in extracting gem_irq_read_clear bit
Documentation: Fix references to defunct linux-net@vger.kernel.org
net/fs: change busy poll time accounting
net: rename low latency sockets functions to busy poll
bridge: fix some kernel warning in multicast timer
sfc: Fix memory leak when discarding scattered packets
sit: fix tunnel update via netlink
dt:net:stmmac: Add dt specific phy reset callback support.
dt:net:stmmac: Add support to dwmac version 3.610 and 3.710
dt:net:stmmac: Allocate platform data only if its NULL.
net:stmmac: fix memleak in the open method
ipv6: rt6_check_neigh should successfully verify neigh if no NUD information are available
net: ipv6: fix wrong ping_v6_sendmsg return value
...
This commit is contained in:
commit
496322bc91
|
@ -127,14 +127,11 @@
|
|||
!Finclude/net/cfg80211.h cfg80211_ibss_params
|
||||
!Finclude/net/cfg80211.h cfg80211_connect_params
|
||||
!Finclude/net/cfg80211.h cfg80211_pmksa
|
||||
!Finclude/net/cfg80211.h cfg80211_send_rx_auth
|
||||
!Finclude/net/cfg80211.h cfg80211_send_auth_timeout
|
||||
!Finclude/net/cfg80211.h cfg80211_send_rx_assoc
|
||||
!Finclude/net/cfg80211.h cfg80211_send_assoc_timeout
|
||||
!Finclude/net/cfg80211.h cfg80211_send_deauth
|
||||
!Finclude/net/cfg80211.h __cfg80211_send_deauth
|
||||
!Finclude/net/cfg80211.h cfg80211_send_disassoc
|
||||
!Finclude/net/cfg80211.h __cfg80211_send_disassoc
|
||||
!Finclude/net/cfg80211.h cfg80211_rx_mlme_mgmt
|
||||
!Finclude/net/cfg80211.h cfg80211_auth_timeout
|
||||
!Finclude/net/cfg80211.h cfg80211_rx_assoc_resp
|
||||
!Finclude/net/cfg80211.h cfg80211_assoc_timeout
|
||||
!Finclude/net/cfg80211.h cfg80211_tx_mlme_mgmt
|
||||
!Finclude/net/cfg80211.h cfg80211_ibss_joined
|
||||
!Finclude/net/cfg80211.h cfg80211_connect_result
|
||||
!Finclude/net/cfg80211.h cfg80211_roamed
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
* Allwinner EMAC ethernet controller
|
||||
|
||||
Required properties:
|
||||
- compatible: should be "allwinner,sun4i-emac".
|
||||
- reg: address and length of the register set for the device.
|
||||
- interrupts: interrupt for the device
|
||||
- phy: A phandle to a phy node defining the PHY address (as the reg
|
||||
property, a single integer).
|
||||
- clocks: A phandle to the reference clock for this device
|
||||
|
||||
Optional properties:
|
||||
- (local-)mac-address: mac address to be used by this driver
|
||||
|
||||
Example:
|
||||
|
||||
emac: ethernet@01c0b000 {
|
||||
compatible = "allwinner,sun4i-emac";
|
||||
reg = <0x01c0b000 0x1000>;
|
||||
interrupts = <55>;
|
||||
clocks = <&ahb_gates 17>;
|
||||
phy = <&phy0>;
|
||||
};
|
|
@ -0,0 +1,26 @@
|
|||
* Allwinner A10 MDIO Ethernet Controller interface
|
||||
|
||||
Required properties:
|
||||
- compatible: should be "allwinner,sun4i-mdio".
|
||||
- reg: address and length of the register set for the device.
|
||||
|
||||
Optional properties:
|
||||
- phy-supply: phandle to a regulator if the PHY needs one
|
||||
|
||||
Example at the SoC level:
|
||||
mdio@01c0b080 {
|
||||
compatible = "allwinner,sun4i-mdio";
|
||||
reg = <0x01c0b080 0x14>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
|
||||
And at the board level:
|
||||
|
||||
mdio@01c0b080 {
|
||||
phy-supply = <®_emac_3v3>;
|
||||
|
||||
phy0: ethernet-phy@0 {
|
||||
reg = <0>;
|
||||
};
|
||||
};
|
|
@ -0,0 +1,38 @@
|
|||
* Synopsys ARC EMAC 10/100 Ethernet driver (EMAC)
|
||||
|
||||
Required properties:
|
||||
- compatible: Should be "snps,arc-emac"
|
||||
- reg: Address and length of the register set for the device
|
||||
- interrupts: Should contain the EMAC interrupts
|
||||
- clock-frequency: CPU frequency. It is needed to calculate and set polling
|
||||
period of EMAC.
|
||||
- max-speed: Maximum supported data-rate in Mbit/s. In some HW configurations
|
||||
bandwidth of external memory controller might be a limiting factor. That's why
|
||||
it's required to specify which data-rate is supported on current SoC or FPGA.
|
||||
For example if only 10 Mbit/s is supported (10BASE-T) set "10". If 100 Mbit/s is
|
||||
supported (100BASE-TX) set "100".
|
||||
- phy: PHY device attached to the EMAC via MDIO bus
|
||||
|
||||
Child nodes of the driver are the individual PHY devices connected to the
|
||||
MDIO bus. They must have a "reg" property given the PHY address on the MDIO bus.
|
||||
|
||||
Optional properties:
|
||||
- mac-address: 6 bytes, mac address
|
||||
|
||||
Examples:
|
||||
|
||||
ethernet@c0fc2000 {
|
||||
compatible = "snps,arc-emac";
|
||||
reg = <0xc0fc2000 0x3c>;
|
||||
interrupts = <6>;
|
||||
mac-address = [ 00 11 22 33 44 55 ];
|
||||
clock-frequency = <80000000>;
|
||||
max-speed = <100>;
|
||||
phy = <&phy0>;
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
phy0: ethernet-phy@0 {
|
||||
reg = <1>;
|
||||
};
|
||||
};
|
|
@ -16,6 +16,8 @@ Optional properties:
|
|||
|
||||
- clock-frequency : The oscillator frequency driving the flexcan device
|
||||
|
||||
- xceiver-supply: Regulator that powers the CAN transceiver
|
||||
|
||||
Example:
|
||||
|
||||
can@1c000 {
|
||||
|
|
|
@ -28,6 +28,8 @@ Optional properties:
|
|||
Slave Properties:
|
||||
Required properties:
|
||||
- phy_id : Specifies slave phy id
|
||||
- phy-mode : The interface between the SoC and the PHY (a string
|
||||
that of_get_phy_mode() can understand)
|
||||
- mac-address : Specifies slave MAC address
|
||||
|
||||
Optional properties:
|
||||
|
@ -58,11 +60,13 @@ Examples:
|
|||
cpts_clock_shift = <29>;
|
||||
cpsw_emac0: slave@0 {
|
||||
phy_id = <&davinci_mdio>, <0>;
|
||||
phy-mode = "rgmii-txid";
|
||||
/* Filled in by U-Boot */
|
||||
mac-address = [ 00 00 00 00 00 00 ];
|
||||
};
|
||||
cpsw_emac1: slave@1 {
|
||||
phy_id = <&davinci_mdio>, <1>;
|
||||
phy-mode = "rgmii-txid";
|
||||
/* Filled in by U-Boot */
|
||||
mac-address = [ 00 00 00 00 00 00 ];
|
||||
};
|
||||
|
@ -84,11 +88,13 @@ Examples:
|
|||
cpts_clock_shift = <29>;
|
||||
cpsw_emac0: slave@0 {
|
||||
phy_id = <&davinci_mdio>, <0>;
|
||||
phy-mode = "rgmii-txid";
|
||||
/* Filled in by U-Boot */
|
||||
mac-address = [ 00 00 00 00 00 00 ];
|
||||
};
|
||||
cpsw_emac1: slave@1 {
|
||||
phy_id = <&davinci_mdio>, <1>;
|
||||
phy-mode = "rgmii-txid";
|
||||
/* Filled in by U-Boot */
|
||||
mac-address = [ 00 00 00 00 00 00 ];
|
||||
};
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
Davicom DM9000 Fast Ethernet controller
|
||||
|
||||
Required properties:
|
||||
- compatible = "davicom,dm9000";
|
||||
- reg : physical addresses and sizes of registers, must contain 2 entries:
|
||||
first entry : address register,
|
||||
second entry : data register.
|
||||
- interrupt-parent : interrupt controller to which the device is connected
|
||||
- interrupts : interrupt specifier specific to interrupt controller
|
||||
|
||||
Optional properties:
|
||||
- local-mac-address : A bytestring of 6 bytes specifying Ethernet MAC address
|
||||
to use (from firmware or bootloader)
|
||||
- davicom,no-eeprom : Configuration EEPROM is not available
|
||||
- davicom,ext-phy : Use external PHY
|
||||
|
||||
Example:
|
||||
|
||||
ethernet@18000000 {
|
||||
compatible = "davicom,dm9000";
|
||||
reg = <0x18000000 0x2 0x18000004 0x2>;
|
||||
interrupt-parent = <&gpn>;
|
||||
interrupts = <7 4>;
|
||||
local-mac-address = [00 00 de ad be ef];
|
||||
davicom,no-eeprom;
|
||||
};
|
|
@ -0,0 +1,85 @@
|
|||
Marvell Orion/Discovery ethernet controller
|
||||
=============================================
|
||||
|
||||
The Marvell Discovery ethernet controller can be found on Marvell Orion SoCs
|
||||
(Kirkwood, Dove, Orion5x, and Discovery Innovation) and as part of Marvell
|
||||
Discovery system controller chips (mv64[345]60).
|
||||
|
||||
The Discovery ethernet controller is described with two levels of nodes. The
|
||||
first level describes the ethernet controller itself and the second level
|
||||
describes up to 3 ethernet port nodes within that controller. The reason for
|
||||
the multiple levels is that the port registers are interleaved within a single
|
||||
set of controller registers. Each port node describes port-specific properties.
|
||||
|
||||
Note: The above separation is only true for Discovery system controllers.
|
||||
For Orion SoCs we stick to the separation, although there each controller has
|
||||
only one port associated. Multiple ports are implemented as multiple single-port
|
||||
controllers. As Kirkwood has some issues with proper initialization after reset,
|
||||
an extra compatible string is added for it.
|
||||
|
||||
* Ethernet controller node
|
||||
|
||||
Required controller properties:
|
||||
- #address-cells: shall be 1.
|
||||
- #size-cells: shall be 0.
|
||||
- compatible: shall be one of "marvell,orion-eth", "marvell,kirkwood-eth".
|
||||
- reg: address and length of the controller registers.
|
||||
|
||||
Optional controller properties:
|
||||
- clocks: phandle reference to the controller clock.
|
||||
- marvell,tx-checksum-limit: max tx packet size for hardware checksum.
|
||||
|
||||
* Ethernet port node
|
||||
|
||||
Required port properties:
|
||||
- device_type: shall be "network".
|
||||
- compatible: shall be one of "marvell,orion-eth-port",
|
||||
"marvell,kirkwood-eth-port".
|
||||
- reg: port number relative to ethernet controller, shall be 0, 1, or 2.
|
||||
- interrupts: port interrupt.
|
||||
- local-mac-address: 6 bytes MAC address.
|
||||
|
||||
Optional port properties:
|
||||
- marvell,tx-queue-size: size of the transmit ring buffer.
|
||||
- marvell,tx-sram-addr: address of transmit descriptor buffer located in SRAM.
|
||||
- marvell,tx-sram-size: size of transmit descriptor buffer located in SRAM.
|
||||
- marvell,rx-queue-size: size of the receive ring buffer.
|
||||
- marvell,rx-sram-addr: address of receive descriptor buffer located in SRAM.
|
||||
- marvell,rx-sram-size: size of receive descriptor buffer located in SRAM.
|
||||
|
||||
and
|
||||
|
||||
- phy-handle: phandle reference to ethernet PHY.
|
||||
|
||||
or
|
||||
|
||||
- speed: port speed if no PHY connected.
|
||||
- duplex: port mode if no PHY connected.
|
||||
|
||||
* Node example:
|
||||
|
||||
mdio-bus {
|
||||
...
|
||||
ethphy: ethernet-phy@8 {
|
||||
device_type = "ethernet-phy";
|
||||
...
|
||||
};
|
||||
};
|
||||
|
||||
eth: ethernet-controller@72000 {
|
||||
compatible = "marvell,orion-eth";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0x72000 0x2000>;
|
||||
clocks = <&gate_clk 2>;
|
||||
marvell,tx-checksum-limit = <1600>;
|
||||
|
||||
ethernet@0 {
|
||||
device_type = "network";
|
||||
compatible = "marvell,orion-eth-port";
|
||||
reg = <0>;
|
||||
interrupts = <29>;
|
||||
phy-handle = <ðphy>;
|
||||
local-mac-address = [00 00 00 00 00 00];
|
||||
};
|
||||
};
|
|
@ -0,0 +1,9 @@
|
|||
Micrel KS8851 Ethernet mac
|
||||
|
||||
Required properties:
|
||||
- compatible = "micrel,ks8851-ml" of parallel interface
|
||||
- reg : 2 physical address and size of registers for data and command
|
||||
- interrupts : interrupt connection
|
||||
|
||||
Optional properties:
|
||||
- local-mac-address : Ethernet mac address to use
|
|
@ -12,6 +12,16 @@ Required properties:
|
|||
property
|
||||
- phy-mode: String, operation mode of the PHY interface.
|
||||
Supported values are: "mii", "rmii", "gmii", "rgmii".
|
||||
- snps,phy-addr phy address to connect to.
|
||||
- snps,reset-gpio gpio number for phy reset.
|
||||
- snps,reset-active-low boolean flag to indicate if phy reset is active low.
|
||||
- snps,reset-delays-us is triplet of delays
|
||||
The 1st cell is reset pre-delay in micro seconds.
|
||||
The 2nd cell is reset pulse in micro seconds.
|
||||
The 3rd cell is reset post-delay in micro seconds.
|
||||
- snps,pbl Programmable Burst Length
|
||||
- snps,fixed-burst Program the DMA to use the fixed burst mode
|
||||
- snps,mixed-burst Program the DMA to use the mixed burst mode
|
||||
|
||||
Optional properties:
|
||||
- mac-address: 6 bytes, mac address
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
* VIA Velocity 10/100/1000 Network Controller
|
||||
|
||||
Required properties:
|
||||
- compatible : Should be "via,velocity-vt6110"
|
||||
- reg : Address and length of the io space
|
||||
- interrupts : Should contain the controller interrupt line
|
||||
|
||||
Optional properties:
|
||||
- no-eeprom : PCI network cards use an external EEPROM to store data. Embedded
|
||||
devices quite often set this data in uboot and do not provide an eeprom.
|
||||
Specify this option if you have no external eeprom.
|
||||
|
||||
Examples:
|
||||
|
||||
eth0@d8004000 {
|
||||
compatible = "via,velocity-vt6110";
|
||||
reg = <0xd8004000 0x400>;
|
||||
interrupts = <10>;
|
||||
no-eeprom;
|
||||
};
|
|
@ -18,6 +18,7 @@ chrp Common Hardware Reference Platform
|
|||
cirrus Cirrus Logic, Inc.
|
||||
cortina Cortina Systems, Inc.
|
||||
dallas Maxim Integrated Products (formerly Dallas Semiconductor)
|
||||
davicom DAVICOM Semiconductor, Inc.
|
||||
denx Denx Software Engineering
|
||||
emmicro EM Microelectronic
|
||||
epson Seiko Epson Corp.
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
ifenslave
|
|
@ -88,8 +88,6 @@ gianfar.txt
|
|||
- Gianfar Ethernet Driver.
|
||||
ieee802154.txt
|
||||
- Linux IEEE 802.15.4 implementation, API and drivers
|
||||
ifenslave.c
|
||||
- Configure network interfaces for parallel routing (bonding).
|
||||
igb.txt
|
||||
- README for the Intel Gigabit Ethernet Driver (igb).
|
||||
igbvf.txt
|
||||
|
|
|
@ -1,11 +1,6 @@
|
|||
# kbuild trick to avoid linker error. Can be omitted if a module is built.
|
||||
obj- := dummy.o
|
||||
|
||||
# List of programs to build
|
||||
hostprogs-y := ifenslave
|
||||
|
||||
HOSTCFLAGS_ifenslave.o += -I$(objtree)/usr/include
|
||||
|
||||
# Tell kbuild to always build the programs
|
||||
always := $(hostprogs-y)
|
||||
|
||||
|
|
|
@ -70,9 +70,10 @@ list, mail to linux-arcnet@tichy.ch.uj.edu.pl.
|
|||
There are archives of the mailing list at:
|
||||
http://epistolary.org/mailman/listinfo.cgi/arcnet
|
||||
|
||||
The people on linux-net@vger.kernel.org have also been known to be very
|
||||
helpful, especially when we're talking about ALPHA Linux kernels that may or
|
||||
may not work right in the first place.
|
||||
The people on linux-net@vger.kernel.org (now defunct, replaced by
|
||||
netdev@vger.kernel.org) have also been known to be very helpful, especially
|
||||
when we're talking about ALPHA Linux kernels that may or may not work right
|
||||
in the first place.
|
||||
|
||||
|
||||
Other Drivers and Info
|
||||
|
|
|
@ -104,8 +104,7 @@ Table of Contents
|
|||
==============================
|
||||
|
||||
Most popular distro kernels ship with the bonding driver
|
||||
already available as a module and the ifenslave user level control
|
||||
program installed and ready for use. If your distro does not, or you
|
||||
already available as a module. If your distro does not, or you
|
||||
have need to compile bonding from source (e.g., configuring and
|
||||
installing a mainline kernel from kernel.org), you'll need to perform
|
||||
the following steps:
|
||||
|
@ -124,46 +123,13 @@ device support" section. It is recommended that you configure the
|
|||
driver as module since it is currently the only way to pass parameters
|
||||
to the driver or configure more than one bonding device.
|
||||
|
||||
Build and install the new kernel and modules, then continue
|
||||
below to install ifenslave.
|
||||
Build and install the new kernel and modules.
|
||||
|
||||
1.2 Install ifenslave Control Utility
|
||||
1.2 Bonding Control Utility
|
||||
-------------------------------------
|
||||
|
||||
The ifenslave user level control program is included in the
|
||||
kernel source tree, in the file Documentation/networking/ifenslave.c.
|
||||
It is generally recommended that you use the ifenslave that
|
||||
corresponds to the kernel that you are using (either from the same
|
||||
source tree or supplied with the distro), however, ifenslave
|
||||
executables from older kernels should function (but features newer
|
||||
than the ifenslave release are not supported). Running an ifenslave
|
||||
that is newer than the kernel is not supported, and may or may not
|
||||
work.
|
||||
|
||||
To install ifenslave, do the following:
|
||||
|
||||
# gcc -Wall -O -I/usr/src/linux/include ifenslave.c -o ifenslave
|
||||
# cp ifenslave /sbin/ifenslave
|
||||
|
||||
If your kernel source is not in "/usr/src/linux," then replace
|
||||
"/usr/src/linux/include" in the above with the location of your kernel
|
||||
source include directory.
|
||||
|
||||
You may wish to back up any existing /sbin/ifenslave, or, for
|
||||
testing or informal use, tag the ifenslave to the kernel version
|
||||
(e.g., name the ifenslave executable /sbin/ifenslave-2.6.10).
|
||||
|
||||
IMPORTANT NOTE:
|
||||
|
||||
If you omit the "-I" or specify an incorrect directory, you
|
||||
may end up with an ifenslave that is incompatible with the kernel
|
||||
you're trying to build it for. Some distros (e.g., Red Hat from 7.1
|
||||
onwards) do not have /usr/include/linux symbolically linked to the
|
||||
default kernel source include directory.
|
||||
|
||||
SECOND IMPORTANT NOTE:
|
||||
If you plan to configure bonding using sysfs or using the
|
||||
/etc/network/interfaces file, you do not need to use ifenslave.
|
||||
It is recommended to configure bonding via iproute2 (netlink)
|
||||
or sysfs, the old ifenslave control utility is obsolete.
|
||||
|
||||
2. Bonding Driver Options
|
||||
=========================
|
||||
|
@ -337,6 +303,12 @@ arp_validate
|
|||
such a situation, validation of backup slaves must be
|
||||
disabled.
|
||||
|
||||
The validation of ARP requests on backup slaves is mainly
|
||||
helping bonding to decide which slaves are more likely to
|
||||
work in case of the active slave failure, it doesn't really
|
||||
guarantee that the backup slave will work if it's selected
|
||||
as the next active slave.
|
||||
|
||||
This option is useful in network configurations in which
|
||||
multiple bonding hosts are concurrently issuing ARPs to one or
|
||||
more targets beyond a common switch. Should the link between
|
||||
|
@ -349,6 +321,25 @@ arp_validate
|
|||
|
||||
This option was added in bonding version 3.1.0.
|
||||
|
||||
arp_all_targets
|
||||
|
||||
Specifies the quantity of arp_ip_targets that must be reachable
|
||||
in order for the ARP monitor to consider a slave as being up.
|
||||
This option affects only active-backup mode for slaves with
|
||||
arp_validation enabled.
|
||||
|
||||
Possible values are:
|
||||
|
||||
any or 0
|
||||
|
||||
consider the slave up only when any of the arp_ip_targets
|
||||
is reachable
|
||||
|
||||
all or 1
|
||||
|
||||
consider the slave up only when all of the arp_ip_targets
|
||||
are reachable
|
||||
|
||||
downdelay
|
||||
|
||||
Specifies the time, in milliseconds, to wait before disabling
|
||||
|
@ -851,7 +842,7 @@ resend_igmp
|
|||
==============================
|
||||
|
||||
You can configure bonding using either your distro's network
|
||||
initialization scripts, or manually using either ifenslave or the
|
||||
initialization scripts, or manually using either iproute2 or the
|
||||
sysfs interface. Distros generally use one of three packages for the
|
||||
network initialization scripts: initscripts, sysconfig or interfaces.
|
||||
Recent versions of these packages have support for bonding, while older
|
||||
|
@ -1160,7 +1151,7 @@ not support this method for specifying multiple bonding interfaces; for
|
|||
those instances, see the "Configuring Multiple Bonds Manually" section,
|
||||
below.
|
||||
|
||||
3.3 Configuring Bonding Manually with Ifenslave
|
||||
3.3 Configuring Bonding Manually with iproute2
|
||||
-----------------------------------------------
|
||||
|
||||
This section applies to distros whose network initialization
|
||||
|
@ -1171,7 +1162,7 @@ version 8.
|
|||
The general method for these systems is to place the bonding
|
||||
module parameters into a config file in /etc/modprobe.d/ (as
|
||||
appropriate for the installed distro), then add modprobe and/or
|
||||
ifenslave commands to the system's global init script. The name of
|
||||
`ip link` commands to the system's global init script. The name of
|
||||
the global init script differs; for sysconfig, it is
|
||||
/etc/init.d/boot.local and for initscripts it is /etc/rc.d/rc.local.
|
||||
|
||||
|
@ -1183,8 +1174,8 @@ reboots, edit the appropriate file (/etc/init.d/boot.local or
|
|||
modprobe bonding mode=balance-alb miimon=100
|
||||
modprobe e100
|
||||
ifconfig bond0 192.168.1.1 netmask 255.255.255.0 up
|
||||
ifenslave bond0 eth0
|
||||
ifenslave bond0 eth1
|
||||
ip link set eth0 master bond0
|
||||
ip link set eth1 master bond0
|
||||
|
||||
Replace the example bonding module parameters and bond0
|
||||
network configuration (IP address, netmask, etc) with the appropriate
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -685,6 +685,15 @@ ip_dynaddr - BOOLEAN
|
|||
occurs.
|
||||
Default: 0
|
||||
|
||||
ip_early_demux - BOOLEAN
|
||||
Optimize input packet processing down to one demux for
|
||||
certain kinds of local sockets. Currently we only do this
|
||||
for established TCP sockets.
|
||||
|
||||
It may add an additional cost for pure routing workloads that
|
||||
reduces overall throughput, in such case you should disable it.
|
||||
Default: 1
|
||||
|
||||
icmp_echo_ignore_all - BOOLEAN
|
||||
If set non-zero, then the kernel will ignore all ICMP ECHO
|
||||
requests sent to it.
|
||||
|
@ -729,7 +738,7 @@ icmp_ignore_bogus_error_responses - BOOLEAN
|
|||
frames. Such violations are normally logged via a kernel warning.
|
||||
If this is set to TRUE, the kernel will not give such warnings, which
|
||||
will avoid log file clutter.
|
||||
Default: FALSE
|
||||
Default: 1
|
||||
|
||||
icmp_errors_use_inbound_ifaddr - BOOLEAN
|
||||
|
||||
|
|
|
@ -181,6 +181,19 @@ snat_reroute - BOOLEAN
|
|||
always be the same as the original route so it is an optimisation
|
||||
to disable snat_reroute and avoid the recalculation.
|
||||
|
||||
sync_persist_mode - INTEGER
|
||||
default 0
|
||||
|
||||
Controls the synchronisation of connections when using persistence
|
||||
|
||||
0: All types of connections are synchronised
|
||||
1: Attempt to reduce the synchronisation traffic depending on
|
||||
the connection type. For persistent services avoid synchronisation
|
||||
for normal connections, do it only for persistence templates.
|
||||
In such case, for TCP and SCTP it may need enabling sloppy_tcp and
|
||||
sloppy_sctp flags on backup servers. For non-persistent services
|
||||
such optimization is not applied, mode 0 is assumed.
|
||||
|
||||
sync_version - INTEGER
|
||||
default 1
|
||||
|
||||
|
|
|
@ -114,7 +114,7 @@ Some parameters are constrained, specifically:
|
|||
- nm_frame_nr must equal the actual number of frames as specified above.
|
||||
|
||||
When the kernel can't allocate physically continuous memory for a ring block,
|
||||
it will fall back to use physically discontinous memory. This might affect
|
||||
it will fall back to use physically discontinuous memory. This might affect
|
||||
performance negatively, in order to avoid this the nm_frame_size parameter
|
||||
should be chosen to be as small as possible for the required frame size and
|
||||
the number of blocks should be increased instead.
|
||||
|
@ -274,9 +274,9 @@ This example assumes some ring parameters of the ring setup are available.
|
|||
/* Get next frame header */
|
||||
hdr = rx_ring + frame_offset;
|
||||
|
||||
if (hdr->nm_status == NL_MMAP_STATUS_VALID)
|
||||
if (hdr->nm_status == NL_MMAP_STATUS_VALID) {
|
||||
/* Regular memory mapped frame */
|
||||
nlh = (void *hdr) + NL_MMAP_HDRLEN;
|
||||
nlh = (void *)hdr + NL_MMAP_HDRLEN;
|
||||
len = hdr->nm_len;
|
||||
|
||||
/* Release empty message immediately. May happen
|
||||
|
|
|
@ -704,6 +704,12 @@ So it seems to be a good candidate to be used with packet fanout.
|
|||
Minimal example code by Daniel Borkmann based on Chetan Loke's lolpcap (compile
|
||||
it with gcc -Wall -O2 blob.c, and try things like "./a.out eth0", etc.):
|
||||
|
||||
/* Written from scratch, but kernel-to-user space API usage
|
||||
* dissected from lolpcap:
|
||||
* Copyright 2011, Chetan Loke <loke.chetan@gmail.com>
|
||||
* License: GPL, version 2.0
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
|
@ -722,27 +728,6 @@ it with gcc -Wall -O2 blob.c, and try things like "./a.out eth0", etc.):
|
|||
#include <linux/if_ether.h>
|
||||
#include <linux/ip.h>
|
||||
|
||||
#define BLOCK_SIZE (1 << 22)
|
||||
#define FRAME_SIZE 2048
|
||||
|
||||
#define NUM_BLOCKS 64
|
||||
#define NUM_FRAMES ((BLOCK_SIZE * NUM_BLOCKS) / FRAME_SIZE)
|
||||
|
||||
#define BLOCK_RETIRE_TOV_IN_MS 64
|
||||
#define BLOCK_PRIV_AREA_SZ 13
|
||||
|
||||
#define ALIGN_8(x) (((x) + 8 - 1) & ~(8 - 1))
|
||||
|
||||
#define BLOCK_STATUS(x) ((x)->h1.block_status)
|
||||
#define BLOCK_NUM_PKTS(x) ((x)->h1.num_pkts)
|
||||
#define BLOCK_O2FP(x) ((x)->h1.offset_to_first_pkt)
|
||||
#define BLOCK_LEN(x) ((x)->h1.blk_len)
|
||||
#define BLOCK_SNUM(x) ((x)->h1.seq_num)
|
||||
#define BLOCK_O2PRIV(x) ((x)->offset_to_priv)
|
||||
#define BLOCK_PRIV(x) ((void *) ((uint8_t *) (x) + BLOCK_O2PRIV(x)))
|
||||
#define BLOCK_HDR_LEN (ALIGN_8(sizeof(struct block_desc)))
|
||||
#define BLOCK_PLUS_PRIV(sz_pri) (BLOCK_HDR_LEN + ALIGN_8((sz_pri)))
|
||||
|
||||
#ifndef likely
|
||||
# define likely(x) __builtin_expect(!!(x), 1)
|
||||
#endif
|
||||
|
@ -765,7 +750,7 @@ struct ring {
|
|||
static unsigned long packets_total = 0, bytes_total = 0;
|
||||
static sig_atomic_t sigint = 0;
|
||||
|
||||
void sighandler(int num)
|
||||
static void sighandler(int num)
|
||||
{
|
||||
sigint = 1;
|
||||
}
|
||||
|
@ -774,6 +759,8 @@ static int setup_socket(struct ring *ring, char *netdev)
|
|||
{
|
||||
int err, i, fd, v = TPACKET_V3;
|
||||
struct sockaddr_ll ll;
|
||||
unsigned int blocksiz = 1 << 22, framesiz = 1 << 11;
|
||||
unsigned int blocknum = 64;
|
||||
|
||||
fd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
|
||||
if (fd < 0) {
|
||||
|
@ -788,13 +775,12 @@ static int setup_socket(struct ring *ring, char *netdev)
|
|||
}
|
||||
|
||||
memset(&ring->req, 0, sizeof(ring->req));
|
||||
ring->req.tp_block_size = BLOCK_SIZE;
|
||||
ring->req.tp_frame_size = FRAME_SIZE;
|
||||
ring->req.tp_block_nr = NUM_BLOCKS;
|
||||
ring->req.tp_frame_nr = NUM_FRAMES;
|
||||
ring->req.tp_retire_blk_tov = BLOCK_RETIRE_TOV_IN_MS;
|
||||
ring->req.tp_sizeof_priv = BLOCK_PRIV_AREA_SZ;
|
||||
ring->req.tp_feature_req_word |= TP_FT_REQ_FILL_RXHASH;
|
||||
ring->req.tp_block_size = blocksiz;
|
||||
ring->req.tp_frame_size = framesiz;
|
||||
ring->req.tp_block_nr = blocknum;
|
||||
ring->req.tp_frame_nr = (blocksiz * blocknum) / framesiz;
|
||||
ring->req.tp_retire_blk_tov = 60;
|
||||
ring->req.tp_feature_req_word = TP_FT_REQ_FILL_RXHASH;
|
||||
|
||||
err = setsockopt(fd, SOL_PACKET, PACKET_RX_RING, &ring->req,
|
||||
sizeof(ring->req));
|
||||
|
@ -804,8 +790,7 @@ static int setup_socket(struct ring *ring, char *netdev)
|
|||
}
|
||||
|
||||
ring->map = mmap(NULL, ring->req.tp_block_size * ring->req.tp_block_nr,
|
||||
PROT_READ | PROT_WRITE, MAP_SHARED | MAP_LOCKED,
|
||||
fd, 0);
|
||||
PROT_READ | PROT_WRITE, MAP_SHARED | MAP_LOCKED, fd, 0);
|
||||
if (ring->map == MAP_FAILED) {
|
||||
perror("mmap");
|
||||
exit(1);
|
||||
|
@ -835,58 +820,6 @@ static int setup_socket(struct ring *ring, char *netdev)
|
|||
return fd;
|
||||
}
|
||||
|
||||
#ifdef __checked
|
||||
static uint64_t prev_block_seq_num = 0;
|
||||
|
||||
void assert_block_seq_num(struct block_desc *pbd)
|
||||
{
|
||||
if (unlikely(prev_block_seq_num + 1 != BLOCK_SNUM(pbd))) {
|
||||
printf("prev_block_seq_num:%"PRIu64", expected seq:%"PRIu64" != "
|
||||
"actual seq:%"PRIu64"\n", prev_block_seq_num,
|
||||
prev_block_seq_num + 1, (uint64_t) BLOCK_SNUM(pbd));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
prev_block_seq_num = BLOCK_SNUM(pbd);
|
||||
}
|
||||
|
||||
static void assert_block_len(struct block_desc *pbd, uint32_t bytes, int block_num)
|
||||
{
|
||||
if (BLOCK_NUM_PKTS(pbd)) {
|
||||
if (unlikely(bytes != BLOCK_LEN(pbd))) {
|
||||
printf("block:%u with %upackets, expected len:%u != actual len:%u\n",
|
||||
block_num, BLOCK_NUM_PKTS(pbd), bytes, BLOCK_LEN(pbd));
|
||||
exit(1);
|
||||
}
|
||||
} else {
|
||||
if (unlikely(BLOCK_LEN(pbd) != BLOCK_PLUS_PRIV(BLOCK_PRIV_AREA_SZ))) {
|
||||
printf("block:%u, expected len:%lu != actual len:%u\n",
|
||||
block_num, BLOCK_HDR_LEN, BLOCK_LEN(pbd));
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void assert_block_header(struct block_desc *pbd, const int block_num)
|
||||
{
|
||||
uint32_t block_status = BLOCK_STATUS(pbd);
|
||||
|
||||
if (unlikely((block_status & TP_STATUS_USER) == 0)) {
|
||||
printf("block:%u, not in TP_STATUS_USER\n", block_num);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
assert_block_seq_num(pbd);
|
||||
}
|
||||
#else
|
||||
static inline void assert_block_header(struct block_desc *pbd, const int block_num)
|
||||
{
|
||||
}
|
||||
static void assert_block_len(struct block_desc *pbd, uint32_t bytes, int block_num)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
static void display(struct tpacket3_hdr *ppd)
|
||||
{
|
||||
struct ethhdr *eth = (struct ethhdr *) ((uint8_t *) ppd + ppd->tp_mac);
|
||||
|
@ -916,37 +849,27 @@ static void display(struct tpacket3_hdr *ppd)
|
|||
|
||||
static void walk_block(struct block_desc *pbd, const int block_num)
|
||||
{
|
||||
int num_pkts = BLOCK_NUM_PKTS(pbd), i;
|
||||
int num_pkts = pbd->h1.num_pkts, i;
|
||||
unsigned long bytes = 0;
|
||||
unsigned long bytes_with_padding = BLOCK_PLUS_PRIV(BLOCK_PRIV_AREA_SZ);
|
||||
struct tpacket3_hdr *ppd;
|
||||
|
||||
assert_block_header(pbd, block_num);
|
||||
|
||||
ppd = (struct tpacket3_hdr *) ((uint8_t *) pbd + BLOCK_O2FP(pbd));
|
||||
ppd = (struct tpacket3_hdr *) ((uint8_t *) pbd +
|
||||
pbd->h1.offset_to_first_pkt);
|
||||
for (i = 0; i < num_pkts; ++i) {
|
||||
bytes += ppd->tp_snaplen;
|
||||
if (ppd->tp_next_offset)
|
||||
bytes_with_padding += ppd->tp_next_offset;
|
||||
else
|
||||
bytes_with_padding += ALIGN_8(ppd->tp_snaplen + ppd->tp_mac);
|
||||
|
||||
display(ppd);
|
||||
|
||||
ppd = (struct tpacket3_hdr *) ((uint8_t *) ppd + ppd->tp_next_offset);
|
||||
__sync_synchronize();
|
||||
ppd = (struct tpacket3_hdr *) ((uint8_t *) ppd +
|
||||
ppd->tp_next_offset);
|
||||
}
|
||||
|
||||
assert_block_len(pbd, bytes_with_padding, block_num);
|
||||
|
||||
packets_total += num_pkts;
|
||||
bytes_total += bytes;
|
||||
}
|
||||
|
||||
void flush_block(struct block_desc *pbd)
|
||||
static void flush_block(struct block_desc *pbd)
|
||||
{
|
||||
BLOCK_STATUS(pbd) = TP_STATUS_KERNEL;
|
||||
__sync_synchronize();
|
||||
pbd->h1.block_status = TP_STATUS_KERNEL;
|
||||
}
|
||||
|
||||
static void teardown_socket(struct ring *ring, int fd)
|
||||
|
@ -962,7 +885,7 @@ int main(int argc, char **argp)
|
|||
socklen_t len;
|
||||
struct ring ring;
|
||||
struct pollfd pfd;
|
||||
unsigned int block_num = 0;
|
||||
unsigned int block_num = 0, blocks = 64;
|
||||
struct block_desc *pbd;
|
||||
struct tpacket_stats_v3 stats;
|
||||
|
||||
|
@ -984,15 +907,15 @@ int main(int argc, char **argp)
|
|||
|
||||
while (likely(!sigint)) {
|
||||
pbd = (struct block_desc *) ring.rd[block_num].iov_base;
|
||||
retry_block:
|
||||
if ((BLOCK_STATUS(pbd) & TP_STATUS_USER) == 0) {
|
||||
|
||||
if ((pbd->h1.block_status & TP_STATUS_USER) == 0) {
|
||||
poll(&pfd, 1, -1);
|
||||
goto retry_block;
|
||||
continue;
|
||||
}
|
||||
|
||||
walk_block(pbd, block_num);
|
||||
flush_block(pbd);
|
||||
block_num = (block_num + 1) % NUM_BLOCKS;
|
||||
block_num = (block_num + 1) % blocks;
|
||||
}
|
||||
|
||||
len = sizeof(stats);
|
||||
|
|
|
@ -163,6 +163,64 @@ and unnecessary. If there are fewer hardware queues than CPUs, then
|
|||
RPS might be beneficial if the rps_cpus for each queue are the ones that
|
||||
share the same memory domain as the interrupting CPU for that queue.
|
||||
|
||||
==== RPS Flow Limit
|
||||
|
||||
RPS scales kernel receive processing across CPUs without introducing
|
||||
reordering. The trade-off to sending all packets from the same flow
|
||||
to the same CPU is CPU load imbalance if flows vary in packet rate.
|
||||
In the extreme case a single flow dominates traffic. Especially on
|
||||
common server workloads with many concurrent connections, such
|
||||
behavior indicates a problem such as a misconfiguration or spoofed
|
||||
source Denial of Service attack.
|
||||
|
||||
Flow Limit is an optional RPS feature that prioritizes small flows
|
||||
during CPU contention by dropping packets from large flows slightly
|
||||
ahead of those from small flows. It is active only when an RPS or RFS
|
||||
destination CPU approaches saturation. Once a CPU's input packet
|
||||
queue exceeds half the maximum queue length (as set by sysctl
|
||||
net.core.netdev_max_backlog), the kernel starts a per-flow packet
|
||||
count over the last 256 packets. If a flow exceeds a set ratio (by
|
||||
default, half) of these packets when a new packet arrives, then the
|
||||
new packet is dropped. Packets from other flows are still only
|
||||
dropped once the input packet queue reaches netdev_max_backlog.
|
||||
No packets are dropped when the input packet queue length is below
|
||||
the threshold, so flow limit does not sever connections outright:
|
||||
even large flows maintain connectivity.
|
||||
|
||||
== Interface
|
||||
|
||||
Flow limit is compiled in by default (CONFIG_NET_FLOW_LIMIT), but not
|
||||
turned on. It is implemented for each CPU independently (to avoid lock
|
||||
and cache contention) and toggled per CPU by setting the relevant bit
|
||||
in sysctl net.core.flow_limit_cpu_bitmap. It exposes the same CPU
|
||||
bitmap interface as rps_cpus (see above) when called from procfs:
|
||||
|
||||
/proc/sys/net/core/flow_limit_cpu_bitmap
|
||||
|
||||
Per-flow rate is calculated by hashing each packet into a hashtable
|
||||
bucket and incrementing a per-bucket counter. The hash function is
|
||||
the same that selects a CPU in RPS, but as the number of buckets can
|
||||
be much larger than the number of CPUs, flow limit has finer-grained
|
||||
identification of large flows and fewer false positives. The default
|
||||
table has 4096 buckets. This value can be modified through sysctl
|
||||
|
||||
net.core.flow_limit_table_len
|
||||
|
||||
The value is only consulted when a new table is allocated. Modifying
|
||||
it does not update active tables.
|
||||
|
||||
== Suggested Configuration
|
||||
|
||||
Flow limit is useful on systems with many concurrent connections,
|
||||
where a single connection taking up 50% of a CPU indicates a problem.
|
||||
In such environments, enable the feature on all CPUs that handle
|
||||
network rx interrupts (as set in /proc/irq/N/smp_affinity).
|
||||
|
||||
The feature depends on the input packet queue length to exceed
|
||||
the flow limit threshold (50%) + the flow history length (256).
|
||||
Setting net.core.netdev_max_backlog to either 1000 or 10000
|
||||
performed well in experiments.
|
||||
|
||||
|
||||
RFS: Receive Flow Steering
|
||||
==========================
|
||||
|
|
|
@ -359,7 +359,7 @@ steps you should take:
|
|||
- OK, it's a driver problem.
|
||||
|
||||
You need to generate a report. Typically this is an email to the
|
||||
maintainer and/or linux-net@vger.kernel.org. The maintainer's
|
||||
maintainer and/or netdev@vger.kernel.org. The maintainer's
|
||||
email address will be in the driver source or in the MAINTAINERS file.
|
||||
|
||||
- The contents of your report will vary a lot depending upon the
|
||||
|
|
|
@ -121,6 +121,38 @@ IPv6 addresses:
|
|||
print a compressed IPv6 address as described by
|
||||
http://tools.ietf.org/html/rfc5952
|
||||
|
||||
IPv4/IPv6 addresses (generic, with port, flowinfo, scope):
|
||||
|
||||
%pIS 1.2.3.4 or 0001:0002:0003:0004:0005:0006:0007:0008
|
||||
%piS 001.002.003.004 or 00010002000300040005000600070008
|
||||
%pISc 1.2.3.4 or 1:2:3:4:5:6:7:8
|
||||
%pISpc 1.2.3.4:12345 or [1:2:3:4:5:6:7:8]:12345
|
||||
%p[Ii]S[pfschnbl]
|
||||
|
||||
For printing an IP address without the need to distinguish whether it's
|
||||
of type AF_INET or AF_INET6, a pointer to a valid 'struct sockaddr',
|
||||
specified through 'IS' or 'iS', can be passed to this format specifier.
|
||||
|
||||
The additional 'p', 'f', and 's' specifiers are used to specify port
|
||||
(IPv4, IPv6), flowinfo (IPv6) and scope (IPv6). Ports have a ':' prefix,
|
||||
flowinfo a '/' and scope a '%', each followed by the actual value.
|
||||
|
||||
In case of an IPv6 address the compressed IPv6 address as described by
|
||||
http://tools.ietf.org/html/rfc5952 is being used if the additional
|
||||
specifier 'c' is given. The IPv6 address is surrounded by '[', ']' in
|
||||
case of additional specifiers 'p', 'f' or 's' as suggested by
|
||||
https://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-07
|
||||
|
||||
In case of IPv4 addresses, the additional 'h', 'n', 'b', and 'l'
|
||||
specifiers can be used as well and are ignored in case of an IPv6
|
||||
address.
|
||||
|
||||
Further examples:
|
||||
|
||||
%pISfc 1.2.3.4 or [1:2:3:4:5:6:7:8]/123456789
|
||||
%pISsc 1.2.3.4 or [1:2:3:4:5:6:7:8]%1234567890
|
||||
%pISpfc 1.2.3.4:12345 or [1:2:3:4:5:6:7:8]:12345/123456789
|
||||
|
||||
UUID/GUID addresses:
|
||||
|
||||
%pUb 00010203-0405-0607-0809-0a0b0c0d0e0f
|
||||
|
|
|
@ -26,7 +26,7 @@ Table : Subdirectories in /proc/sys/net
|
|||
ipv4 IP version 4 x25 X.25 protocol
|
||||
ipx IPX token-ring IBM token ring
|
||||
bridge Bridging decnet DEC net
|
||||
ipv6 IP version 6
|
||||
ipv6 IP version 6 tipc TIPC
|
||||
..............................................................................
|
||||
|
||||
1. /proc/sys/net/core - Network core options
|
||||
|
@ -50,6 +50,29 @@ The maximum number of packets that kernel can handle on a NAPI interrupt,
|
|||
it's a Per-CPU variable.
|
||||
Default: 64
|
||||
|
||||
low_latency_read
|
||||
----------------
|
||||
Low latency busy poll timeout for socket reads. (needs CONFIG_NET_LL_RX_POLL)
|
||||
Approximate time in us to busy loop waiting for packets on the device queue.
|
||||
This sets the default value of the SO_LL socket option.
|
||||
Can be set or overridden per socket by setting socket option SO_LL, which is
|
||||
the preferred method of enabling.
|
||||
If you need to enable the feature globally via sysctl, a value of 50 is recommended.
|
||||
Will increase power usage.
|
||||
Default: 0 (off)
|
||||
|
||||
low_latency_poll
|
||||
----------------
|
||||
Low latency busy poll timeout for poll and select. (needs CONFIG_NET_LL_RX_POLL)
|
||||
Approximate time in us to busy loop waiting for events.
|
||||
Recommended value depends on the number of sockets you poll on.
|
||||
For several sockets 50, for several hundreds 100.
|
||||
For more than that you probably want to use epoll.
|
||||
Note that only sockets with SO_LL set will be busy polled, so you want to either
|
||||
selectively set SO_LL on those sockets or set sysctl.net.low_latency_read globally.
|
||||
Will increase power usage.
|
||||
Default: 0 (off)
|
||||
|
||||
rmem_default
|
||||
------------
|
||||
|
||||
|
@ -93,8 +116,7 @@ netdev_budget
|
|||
|
||||
Maximum number of packets taken from all interfaces in one polling cycle (NAPI
|
||||
poll). In one polling cycle interfaces which are registered to polling are
|
||||
probed in a round-robin manner. The limit of packets in one such probe can be
|
||||
set per-device via sysfs class/net/<device>/weight .
|
||||
probed in a round-robin manner.
|
||||
|
||||
netdev_max_backlog
|
||||
------------------
|
||||
|
@ -201,3 +223,18 @@ IPX.
|
|||
The /proc/net/ipx_route table holds a list of IPX routes. For each route it
|
||||
gives the destination network, the router node (or Directly) and the network
|
||||
address of the router (or Connected) for internal networks.
|
||||
|
||||
6. TIPC
|
||||
-------------------------------------------------------
|
||||
|
||||
The TIPC protocol now has a tunable for the receive memory, similar to the
|
||||
tcp_rmem - i.e. a vector of 3 INTEGERs: (min, default, max)
|
||||
|
||||
# cat /proc/sys/net/tipc/tipc_rmem
|
||||
4252725 34021800 68043600
|
||||
#
|
||||
|
||||
The max value is set to CONN_OVERLOAD_LIMIT, and the default and min values
|
||||
are scaled (shifted) versions of that same value. Note that the min value
|
||||
is not at this point in time used in any meaningful way, but the triplet is
|
||||
preserved in order to be consistent with things like tcp_rmem.
|
||||
|
|
|
@ -2332,6 +2332,11 @@ M: Jaya Kumar <jayakumar.alsa@gmail.com>
|
|||
S: Maintained
|
||||
F: sound/pci/cs5535audio/
|
||||
|
||||
CW1200 WLAN driver
|
||||
M: Solomon Peachy <pizza@shaftnet.org>
|
||||
S: Maintained
|
||||
F: drivers/net/wireless/cw1200/
|
||||
|
||||
CX18 VIDEO4LINUX DRIVER
|
||||
M: Andy Walls <awalls@md.metrocast.net>
|
||||
L: ivtv-devel@ivtvdriver.org (moderated for non-subscribers)
|
||||
|
|
|
@ -81,4 +81,6 @@
|
|||
|
||||
#define SO_SELECT_ERR_QUEUE 45
|
||||
|
||||
#define SO_LL 46
|
||||
|
||||
#endif /* _UAPI_ASM_SOCKET_H */
|
||||
|
|
|
@ -214,10 +214,12 @@ ldo4_reg: regulator@6 {
|
|||
|
||||
&cpsw_emac0 {
|
||||
phy_id = <&davinci_mdio>, <0>;
|
||||
phy-mode = "mii";
|
||||
};
|
||||
|
||||
&cpsw_emac1 {
|
||||
phy_id = <&davinci_mdio>, <1>;
|
||||
phy-mode = "mii";
|
||||
};
|
||||
|
||||
&mac {
|
||||
|
|
|
@ -467,8 +467,10 @@ &davinci_mdio {
|
|||
|
||||
&cpsw_emac0 {
|
||||
phy_id = <&davinci_mdio>, <0>;
|
||||
phy-mode = "rgmii-txid";
|
||||
};
|
||||
|
||||
&cpsw_emac1 {
|
||||
phy_id = <&davinci_mdio>, <1>;
|
||||
phy-mode = "rgmii-txid";
|
||||
};
|
||||
|
|
|
@ -392,3 +392,13 @@ &davinci_mdio {
|
|||
pinctrl-0 = <&davinci_mdio_default>;
|
||||
pinctrl-1 = <&davinci_mdio_sleep>;
|
||||
};
|
||||
|
||||
&cpsw_emac0 {
|
||||
phy_id = <&davinci_mdio>, <0>;
|
||||
phy-mode = "rgmii-txid";
|
||||
};
|
||||
|
||||
&cpsw_emac1 {
|
||||
phy_id = <&davinci_mdio>, <1>;
|
||||
phy-mode = "rgmii-txid";
|
||||
};
|
||||
|
|
|
@ -155,12 +155,14 @@ timing0: timing0 {
|
|||
can0: can@80032000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&can0_pins_a>;
|
||||
xceiver-supply = <®_can_3v3>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
can1: can@80034000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&can1_pins_a>;
|
||||
xceiver-supply = <®_can_3v3>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
@ -319,6 +321,16 @@ reg_lcd_3v3: lcd-3v3 {
|
|||
gpio = <&gpio3 30 0>;
|
||||
enable-active-high;
|
||||
};
|
||||
|
||||
reg_can_3v3: can-3v3 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "can-3v3";
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
gpio = <&gpio2 13 0>;
|
||||
enable-active-high;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
sound {
|
||||
|
|
|
@ -27,6 +27,21 @@ chosen {
|
|||
};
|
||||
|
||||
soc@01c20000 {
|
||||
emac: ethernet@01c0b000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&emac_pins_a>;
|
||||
phy = <&phy1>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
mdio@01c0b080 {
|
||||
status = "okay";
|
||||
|
||||
phy1: ethernet-phy@1 {
|
||||
reg = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
pinctrl@01c20800 {
|
||||
led_pins_cubieboard: led_pins@0 {
|
||||
allwinner,pins = "PH20", "PH21";
|
||||
|
|
|
@ -23,10 +23,51 @@ chosen {
|
|||
};
|
||||
|
||||
soc@01c20000 {
|
||||
emac: ethernet@01c0b000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&emac_pins_a>;
|
||||
phy = <&phy0>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
mdio@01c0b080 {
|
||||
phy-supply = <®_emac_3v3>;
|
||||
status = "okay";
|
||||
|
||||
phy0: ethernet-phy@0 {
|
||||
reg = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
pio: pinctrl@01c20800 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&hackberry_hogs>;
|
||||
|
||||
hackberry_hogs: hogs@0 {
|
||||
allwinner,pins = "PH19";
|
||||
allwinner,function = "gpio_out";
|
||||
allwinner,drive = <0>;
|
||||
allwinner,pull = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
uart0: serial@01c28000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart0_pins_a>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
regulators {
|
||||
compatible = "simple-bus";
|
||||
|
||||
reg_emac_3v3: emac-3v3 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "emac-3v3";
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
enable-active-high;
|
||||
gpio = <&pio 7 19 0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -167,6 +167,22 @@ soc@01c20000 {
|
|||
reg = <0x01c20000 0x300000>;
|
||||
ranges;
|
||||
|
||||
emac: ethernet@01c0b000 {
|
||||
compatible = "allwinner,sun4i-emac";
|
||||
reg = <0x01c0b000 0x1000>;
|
||||
interrupts = <55>;
|
||||
clocks = <&ahb_gates 17>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
mdio@01c0b080 {
|
||||
compatible = "allwinner,sun4i-mdio";
|
||||
reg = <0x01c0b080 0x14>;
|
||||
status = "disabled";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
|
||||
intc: interrupt-controller@01c20400 {
|
||||
compatible = "allwinner,sun4i-ic";
|
||||
reg = <0x01c20400 0x400>;
|
||||
|
@ -226,6 +242,17 @@ i2c2_pins_a: i2c2@0 {
|
|||
allwinner,drive = <0>;
|
||||
allwinner,pull = <0>;
|
||||
};
|
||||
|
||||
emac_pins_a: emac0@0 {
|
||||
allwinner,pins = "PA0", "PA1", "PA2",
|
||||
"PA3", "PA4", "PA5", "PA6",
|
||||
"PA7", "PA8", "PA9", "PA10",
|
||||
"PA11", "PA12", "PA13", "PA14",
|
||||
"PA15", "PA16";
|
||||
allwinner,function = "emac";
|
||||
allwinner,drive = <0>;
|
||||
allwinner,pull = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
timer@01c20c00 {
|
||||
|
|
|
@ -286,3 +286,4 @@ CONFIG_SOC_OMAP5=y
|
|||
CONFIG_TI_DAVINCI_MDIO=y
|
||||
CONFIG_TI_DAVINCI_CPDMA=y
|
||||
CONFIG_TI_CPSW=y
|
||||
CONFIG_AT803X_PHY=y
|
||||
|
|
|
@ -108,7 +108,6 @@ config SOC_IMX25
|
|||
select ARCH_MXC_IOMUX_V3
|
||||
select COMMON_CLK
|
||||
select CPU_ARM926T
|
||||
select HAVE_CAN_FLEXCAN if CAN
|
||||
select MXC_AVIC
|
||||
|
||||
config SOC_IMX27
|
||||
|
@ -134,7 +133,6 @@ config SOC_IMX35
|
|||
select ARCH_MXC_IOMUX_V3
|
||||
select COMMON_CLK
|
||||
select CPU_V6K
|
||||
select HAVE_CAN_FLEXCAN if CAN
|
||||
select HAVE_EPIT
|
||||
select MXC_AVIC
|
||||
select SMP_ON_UP if SMP
|
||||
|
@ -774,7 +772,6 @@ comment "Device tree only"
|
|||
|
||||
config SOC_IMX53
|
||||
bool "i.MX53 support"
|
||||
select HAVE_CAN_FLEXCAN if CAN
|
||||
select HAVE_IMX_SRC
|
||||
select IMX_HAVE_PLATFORM_IMX2_WDT
|
||||
select PINCTRL
|
||||
|
@ -797,7 +794,6 @@ config SOC_IMX6Q
|
|||
select CPU_V7
|
||||
select HAVE_ARM_SCU if SMP
|
||||
select HAVE_ARM_TWD if LOCAL_TIMERS
|
||||
select HAVE_CAN_FLEXCAN if CAN
|
||||
select HAVE_IMX_ANATOP
|
||||
select HAVE_IMX_GPC
|
||||
select HAVE_IMX_MMDC
|
||||
|
|
|
@ -13,10 +13,10 @@ extern const struct imx_fec_data imx25_fec_data;
|
|||
imx_add_fec(&imx25_fec_data, pdata)
|
||||
|
||||
extern const struct imx_flexcan_data imx25_flexcan_data[];
|
||||
#define imx25_add_flexcan(id, pdata) \
|
||||
imx_add_flexcan(&imx25_flexcan_data[id], pdata)
|
||||
#define imx25_add_flexcan0(pdata) imx25_add_flexcan(0, pdata)
|
||||
#define imx25_add_flexcan1(pdata) imx25_add_flexcan(1, pdata)
|
||||
#define imx25_add_flexcan(id) \
|
||||
imx_add_flexcan(&imx25_flexcan_data[id])
|
||||
#define imx25_add_flexcan0() imx25_add_flexcan(0)
|
||||
#define imx25_add_flexcan1() imx25_add_flexcan(1)
|
||||
|
||||
extern const struct imx_fsl_usb2_udc_data imx25_fsl_usb2_udc_data;
|
||||
#define imx25_add_fsl_usb2_udc(pdata) \
|
||||
|
|
|
@ -17,10 +17,10 @@ extern const struct imx_fsl_usb2_udc_data imx35_fsl_usb2_udc_data;
|
|||
imx_add_fsl_usb2_udc(&imx35_fsl_usb2_udc_data, pdata)
|
||||
|
||||
extern const struct imx_flexcan_data imx35_flexcan_data[];
|
||||
#define imx35_add_flexcan(id, pdata) \
|
||||
imx_add_flexcan(&imx35_flexcan_data[id], pdata)
|
||||
#define imx35_add_flexcan0(pdata) imx35_add_flexcan(0, pdata)
|
||||
#define imx35_add_flexcan1(pdata) imx35_add_flexcan(1, pdata)
|
||||
#define imx35_add_flexcan(id) \
|
||||
imx_add_flexcan(&imx35_flexcan_data[id])
|
||||
#define imx35_add_flexcan0() imx35_add_flexcan(0)
|
||||
#define imx35_add_flexcan1() imx35_add_flexcan(1)
|
||||
|
||||
extern const struct imx_imx2_wdt_data imx35_imx2_wdt_data;
|
||||
#define imx35_add_imx2_wdt() \
|
||||
|
|
|
@ -4,7 +4,6 @@ config IMX_HAVE_PLATFORM_FEC
|
|||
|
||||
config IMX_HAVE_PLATFORM_FLEXCAN
|
||||
bool
|
||||
select HAVE_CAN_FLEXCAN if CAN
|
||||
|
||||
config IMX_HAVE_PLATFORM_FSL_USB2_UDC
|
||||
bool
|
||||
|
|
|
@ -50,7 +50,6 @@ struct platform_device *__init imx_add_fec(
|
|||
const struct imx_fec_data *data,
|
||||
const struct fec_platform_data *pdata);
|
||||
|
||||
#include <linux/can/platform/flexcan.h>
|
||||
struct imx_flexcan_data {
|
||||
int id;
|
||||
resource_size_t iobase;
|
||||
|
@ -58,8 +57,7 @@ struct imx_flexcan_data {
|
|||
resource_size_t irq;
|
||||
};
|
||||
struct platform_device *__init imx_add_flexcan(
|
||||
const struct imx_flexcan_data *data,
|
||||
const struct flexcan_platform_data *pdata);
|
||||
const struct imx_flexcan_data *data);
|
||||
|
||||
#include <linux/fsl_devices.h>
|
||||
struct imx_fsl_usb2_udc_data {
|
||||
|
|
|
@ -38,8 +38,7 @@ const struct imx_flexcan_data imx35_flexcan_data[] __initconst = {
|
|||
#endif /* ifdef CONFIG_SOC_IMX35 */
|
||||
|
||||
struct platform_device *__init imx_add_flexcan(
|
||||
const struct imx_flexcan_data *data,
|
||||
const struct flexcan_platform_data *pdata)
|
||||
const struct imx_flexcan_data *data)
|
||||
{
|
||||
struct resource res[] = {
|
||||
{
|
||||
|
@ -54,5 +53,5 @@ struct platform_device *__init imx_add_flexcan(
|
|||
};
|
||||
|
||||
return imx_add_platform_device("flexcan", data->id,
|
||||
res, ARRAY_SIZE(res), pdata, sizeof(*pdata));
|
||||
res, ARRAY_SIZE(res), NULL, 0);
|
||||
}
|
||||
|
|
|
@ -279,7 +279,7 @@ void __init eukrea_mbimxsd25_baseboard_init(void)
|
|||
imx25_add_imx_fb(&eukrea_mximxsd_fb_pdata);
|
||||
imx25_add_imx_ssi(0, &eukrea_mbimxsd_ssi_pdata);
|
||||
|
||||
imx25_add_flexcan1(NULL);
|
||||
imx25_add_flexcan1();
|
||||
imx25_add_sdhci_esdhc_imx(0, &sd1_pdata);
|
||||
|
||||
gpio_request(GPIO_LED1, "LED1");
|
||||
|
|
|
@ -287,7 +287,7 @@ void __init eukrea_mbimxsd35_baseboard_init(void)
|
|||
|
||||
imx35_add_imx_ssi(0, &eukrea_mbimxsd_ssi_pdata);
|
||||
|
||||
imx35_add_flexcan1(NULL);
|
||||
imx35_add_flexcan1();
|
||||
imx35_add_sdhci_esdhc_imx(0, &sd1_pdata);
|
||||
|
||||
gpio_request(GPIO_LED1, "LED1");
|
||||
|
|
|
@ -249,7 +249,7 @@ static void __init mx25pdk_init(void)
|
|||
imx25_add_imx_i2c0(&mx25_3ds_i2c0_data);
|
||||
|
||||
gpio_request_one(MX25PDK_CAN_PWDN, GPIOF_OUT_INIT_LOW, "can-pwdn");
|
||||
imx25_add_flexcan0(NULL);
|
||||
imx25_add_flexcan0();
|
||||
}
|
||||
|
||||
static void __init mx25pdk_timer_init(void)
|
||||
|
|
|
@ -385,7 +385,7 @@ static void __init pcm043_init(void)
|
|||
if (!otg_mode_host)
|
||||
imx35_add_fsl_usb2_udc(&otg_device_pdata);
|
||||
|
||||
imx35_add_flexcan1(NULL);
|
||||
imx35_add_flexcan1();
|
||||
imx35_add_sdhci_esdhc_imx(0, &sd1_pdata);
|
||||
}
|
||||
|
||||
|
|
|
@ -10,7 +10,6 @@ config SOC_IMX28
|
|||
select ARM_AMBA
|
||||
select ARM_CPU_SUSPEND if PM
|
||||
select CPU_ARM926T
|
||||
select HAVE_CAN_FLEXCAN if CAN
|
||||
select PINCTRL_IMX28
|
||||
|
||||
config ARCH_MXS
|
||||
|
|
|
@ -14,7 +14,6 @@
|
|||
#include <linux/clk/mxs.h>
|
||||
#include <linux/clkdev.h>
|
||||
#include <linux/clocksource.h>
|
||||
#include <linux/can/platform/flexcan.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/gpio.h>
|
||||
|
@ -77,41 +76,6 @@ static inline void __mxs_togl(u32 mask, void __iomem *reg)
|
|||
__raw_writel(mask, reg + MXS_TOG_ADDR);
|
||||
}
|
||||
|
||||
/*
|
||||
* MX28EVK_FLEXCAN_SWITCH is shared between both flexcan controllers
|
||||
*/
|
||||
#define MX28EVK_FLEXCAN_SWITCH MXS_GPIO_NR(2, 13)
|
||||
|
||||
static int flexcan0_en, flexcan1_en;
|
||||
|
||||
static void mx28evk_flexcan_switch(void)
|
||||
{
|
||||
if (flexcan0_en || flexcan1_en)
|
||||
gpio_set_value(MX28EVK_FLEXCAN_SWITCH, 1);
|
||||
else
|
||||
gpio_set_value(MX28EVK_FLEXCAN_SWITCH, 0);
|
||||
}
|
||||
|
||||
static void mx28evk_flexcan0_switch(int enable)
|
||||
{
|
||||
flexcan0_en = enable;
|
||||
mx28evk_flexcan_switch();
|
||||
}
|
||||
|
||||
static void mx28evk_flexcan1_switch(int enable)
|
||||
{
|
||||
flexcan1_en = enable;
|
||||
mx28evk_flexcan_switch();
|
||||
}
|
||||
|
||||
static struct flexcan_platform_data flexcan_pdata[2];
|
||||
|
||||
static struct of_dev_auxdata mxs_auxdata_lookup[] __initdata = {
|
||||
OF_DEV_AUXDATA("fsl,imx28-flexcan", 0x80032000, NULL, &flexcan_pdata[0]),
|
||||
OF_DEV_AUXDATA("fsl,imx28-flexcan", 0x80034000, NULL, &flexcan_pdata[1]),
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
#define OCOTP_WORD_OFFSET 0x20
|
||||
#define OCOTP_WORD_COUNT 0x20
|
||||
|
||||
|
@ -271,15 +235,6 @@ static void __init imx28_evk_init(void)
|
|||
mxs_saif_clkmux_select(MXS_DIGCTL_SAIF_CLKMUX_EXTMSTR0);
|
||||
}
|
||||
|
||||
static void __init imx28_evk_post_init(void)
|
||||
{
|
||||
if (!gpio_request_one(MX28EVK_FLEXCAN_SWITCH, GPIOF_DIR_OUT,
|
||||
"flexcan-switch")) {
|
||||
flexcan_pdata[0].transceiver_switch = mx28evk_flexcan0_switch;
|
||||
flexcan_pdata[1].transceiver_switch = mx28evk_flexcan1_switch;
|
||||
}
|
||||
}
|
||||
|
||||
static int apx4devkit_phy_fixup(struct phy_device *phy)
|
||||
{
|
||||
phy->dev_flags |= MICREL_PHY_50MHZ_CLK;
|
||||
|
@ -485,13 +440,10 @@ static void __init mxs_machine_init(void)
|
|||
crystalfontz_init();
|
||||
|
||||
of_platform_populate(NULL, of_default_bus_match_table,
|
||||
mxs_auxdata_lookup, parent);
|
||||
NULL, parent);
|
||||
|
||||
if (of_machine_is_compatible("karo,tx28"))
|
||||
tx28_post_init();
|
||||
|
||||
if (of_machine_is_compatible("fsl,imx28-evk"))
|
||||
imx28_evk_post_init();
|
||||
}
|
||||
|
||||
#define MX23_CLKCTRL_RESET_OFFSET 0x120
|
||||
|
|
|
@ -378,7 +378,7 @@ static struct resource sh_eth_resources[] = {
|
|||
};
|
||||
|
||||
static struct platform_device sh_eth_device = {
|
||||
.name = "sh-eth",
|
||||
.name = "r8a7740-gether",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &sh_eth_platdata,
|
||||
|
|
|
@ -594,7 +594,7 @@ static struct clk_lookup lookups[] = {
|
|||
CLKDEV_DEV_ID("e6860000.sdhi", &mstp_clks[MSTP313]),
|
||||
CLKDEV_DEV_ID("sh_mmcif", &mstp_clks[MSTP312]),
|
||||
CLKDEV_DEV_ID("e6bd0000.mmcif", &mstp_clks[MSTP312]),
|
||||
CLKDEV_DEV_ID("sh-eth", &mstp_clks[MSTP309]),
|
||||
CLKDEV_DEV_ID("r8a7740-gether", &mstp_clks[MSTP309]),
|
||||
CLKDEV_DEV_ID("e9a00000.sh-eth", &mstp_clks[MSTP309]),
|
||||
CLKDEV_DEV_ID("renesas_tpu_pwm", &mstp_clks[MSTP304]),
|
||||
|
||||
|
|
|
@ -145,7 +145,7 @@ static struct clk_lookup lookups[] = {
|
|||
CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP323]), /* SDHI0 */
|
||||
CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP322]), /* SDHI1 */
|
||||
CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP321]), /* SDHI2 */
|
||||
CLKDEV_DEV_ID("sh-eth", &mstp_clks[MSTP114]), /* Ether */
|
||||
CLKDEV_DEV_ID("r8a777x-ether", &mstp_clks[MSTP114]), /* Ether */
|
||||
CLKDEV_DEV_ID("ehci-platform", &mstp_clks[MSTP100]), /* USB EHCI port0/1 */
|
||||
CLKDEV_DEV_ID("ohci-platform", &mstp_clks[MSTP100]), /* USB OHCI port0/1 */
|
||||
CLKDEV_DEV_ID("i2c-rcar.0", &mstp_clks[MSTP030]), /* I2C0 */
|
||||
|
|
|
@ -165,7 +165,7 @@ static struct clk_lookup lookups[] = {
|
|||
CLKDEV_DEV_ID("rcar-pcie", &mstp_clks[MSTP116]), /* PCIe */
|
||||
CLKDEV_DEV_ID("sata_rcar", &mstp_clks[MSTP115]), /* SATA */
|
||||
CLKDEV_DEV_ID("fc600000.sata", &mstp_clks[MSTP115]), /* SATA w/DT */
|
||||
CLKDEV_DEV_ID("sh-eth", &mstp_clks[MSTP114]), /* Ether */
|
||||
CLKDEV_DEV_ID("r8a777x-ether", &mstp_clks[MSTP114]), /* Ether */
|
||||
CLKDEV_DEV_ID("ehci-platform.1", &mstp_clks[MSTP101]), /* USB EHCI port2 */
|
||||
CLKDEV_DEV_ID("ohci-platform.1", &mstp_clks[MSTP101]), /* USB OHCI port2 */
|
||||
CLKDEV_DEV_ID("ehci-platform.0", &mstp_clks[MSTP100]), /* USB EHCI port0/1 */
|
||||
|
|
|
@ -900,8 +900,7 @@ void bpf_jit_compile(struct sk_filter *fp)
|
|||
#endif
|
||||
|
||||
alloc_size = 4 * ctx.idx;
|
||||
ctx.target = module_alloc(max(sizeof(struct work_struct),
|
||||
alloc_size));
|
||||
ctx.target = module_alloc(alloc_size);
|
||||
if (unlikely(ctx.target == NULL))
|
||||
goto out;
|
||||
|
||||
|
@ -927,19 +926,8 @@ void bpf_jit_compile(struct sk_filter *fp)
|
|||
return;
|
||||
}
|
||||
|
||||
static void bpf_jit_free_worker(struct work_struct *work)
|
||||
{
|
||||
module_free(NULL, work);
|
||||
}
|
||||
|
||||
void bpf_jit_free(struct sk_filter *fp)
|
||||
{
|
||||
struct work_struct *work;
|
||||
|
||||
if (fp->bpf_func != sk_run_filter) {
|
||||
work = (struct work_struct *)fp->bpf_func;
|
||||
|
||||
INIT_WORK(work, bpf_jit_free_worker);
|
||||
schedule_work(work);
|
||||
}
|
||||
if (fp->bpf_func != sk_run_filter)
|
||||
module_free(NULL, fp->bpf_func);
|
||||
}
|
||||
|
|
|
@ -74,4 +74,6 @@
|
|||
|
||||
#define SO_SELECT_ERR_QUEUE 45
|
||||
|
||||
#define SO_LL 46
|
||||
|
||||
#endif /* __ASM_AVR32_SOCKET_H */
|
||||
|
|
|
@ -2,9 +2,7 @@ if ETRAX_ARCH_V10
|
|||
|
||||
config ETRAX_ETHERNET
|
||||
bool "Ethernet support"
|
||||
depends on ETRAX_ARCH_V10
|
||||
select ETHERNET
|
||||
select NET_CORE
|
||||
depends on ETRAX_ARCH_V10 && NETDEVICES
|
||||
select MII
|
||||
help
|
||||
This option enables the ETRAX 100LX built-in 10/100Mbit Ethernet
|
||||
|
|
|
@ -2,9 +2,7 @@ if ETRAX_ARCH_V32
|
|||
|
||||
config ETRAX_ETHERNET
|
||||
bool "Ethernet support"
|
||||
depends on ETRAX_ARCH_V32
|
||||
select ETHERNET
|
||||
select NET_CORE
|
||||
depends on ETRAX_ARCH_V32 && NETDEVICES
|
||||
select MII
|
||||
help
|
||||
This option enables the ETRAX FS built-in 10/100Mbit Ethernet
|
||||
|
|
|
@ -76,6 +76,8 @@
|
|||
|
||||
#define SO_SELECT_ERR_QUEUE 45
|
||||
|
||||
#define SO_LL 46
|
||||
|
||||
#endif /* _ASM_SOCKET_H */
|
||||
|
||||
|
||||
|
|
|
@ -74,5 +74,7 @@
|
|||
|
||||
#define SO_SELECT_ERR_QUEUE 45
|
||||
|
||||
#define SO_LL 46
|
||||
|
||||
#endif /* _ASM_SOCKET_H */
|
||||
|
||||
|
|
|
@ -74,4 +74,6 @@
|
|||
|
||||
#define SO_SELECT_ERR_QUEUE 45
|
||||
|
||||
#define SO_LL 46
|
||||
|
||||
#endif /* _ASM_SOCKET_H */
|
||||
|
|
|
@ -268,7 +268,7 @@ static __inline__ int dev_is_ethdev(struct net_device *dev)
|
|||
static int
|
||||
simeth_device_event(struct notifier_block *this,unsigned long event, void *ptr)
|
||||
{
|
||||
struct net_device *dev = ptr;
|
||||
struct net_device *dev = netdev_notifier_info_to_dev(ptr);
|
||||
struct simeth_local *local;
|
||||
struct in_device *in_dev;
|
||||
struct in_ifaddr **ifap = NULL;
|
||||
|
|
|
@ -83,4 +83,6 @@
|
|||
|
||||
#define SO_SELECT_ERR_QUEUE 45
|
||||
|
||||
#define SO_LL 46
|
||||
|
||||
#endif /* _ASM_IA64_SOCKET_H */
|
||||
|
|
|
@ -74,4 +74,6 @@
|
|||
|
||||
#define SO_SELECT_ERR_QUEUE 45
|
||||
|
||||
#define SO_LL 46
|
||||
|
||||
#endif /* _ASM_M32R_SOCKET_H */
|
||||
|
|
|
@ -845,6 +845,10 @@ int __init board_register_devices(void)
|
|||
!bcm63xx_nvram_get_mac_address(board.enet1.mac_addr))
|
||||
bcm63xx_enet_register(1, &board.enet1);
|
||||
|
||||
if (board.has_enetsw &&
|
||||
!bcm63xx_nvram_get_mac_address(board.enetsw.mac_addr))
|
||||
bcm63xx_enetsw_register(&board.enetsw);
|
||||
|
||||
if (board.has_usbd)
|
||||
bcm63xx_usbd_register(&board.usbd);
|
||||
|
||||
|
|
|
@ -9,16 +9,60 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/export.h>
|
||||
#include <bcm63xx_dev_enet.h>
|
||||
#include <bcm63xx_io.h>
|
||||
#include <bcm63xx_regs.h>
|
||||
|
||||
#ifdef BCMCPU_RUNTIME_DETECT
|
||||
static const unsigned long bcm6348_regs_enetdmac[] = {
|
||||
[ENETDMAC_CHANCFG] = ENETDMAC_CHANCFG_REG,
|
||||
[ENETDMAC_IR] = ENETDMAC_IR_REG,
|
||||
[ENETDMAC_IRMASK] = ENETDMAC_IRMASK_REG,
|
||||
[ENETDMAC_MAXBURST] = ENETDMAC_MAXBURST_REG,
|
||||
};
|
||||
|
||||
static const unsigned long bcm6345_regs_enetdmac[] = {
|
||||
[ENETDMAC_CHANCFG] = ENETDMA_6345_CHANCFG_REG,
|
||||
[ENETDMAC_IR] = ENETDMA_6345_IR_REG,
|
||||
[ENETDMAC_IRMASK] = ENETDMA_6345_IRMASK_REG,
|
||||
[ENETDMAC_MAXBURST] = ENETDMA_6345_MAXBURST_REG,
|
||||
[ENETDMAC_BUFALLOC] = ENETDMA_6345_BUFALLOC_REG,
|
||||
[ENETDMAC_RSTART] = ENETDMA_6345_RSTART_REG,
|
||||
[ENETDMAC_FC] = ENETDMA_6345_FC_REG,
|
||||
[ENETDMAC_LEN] = ENETDMA_6345_LEN_REG,
|
||||
};
|
||||
|
||||
const unsigned long *bcm63xx_regs_enetdmac;
|
||||
EXPORT_SYMBOL(bcm63xx_regs_enetdmac);
|
||||
|
||||
static __init void bcm63xx_enetdmac_regs_init(void)
|
||||
{
|
||||
if (BCMCPU_IS_6345())
|
||||
bcm63xx_regs_enetdmac = bcm6345_regs_enetdmac;
|
||||
else
|
||||
bcm63xx_regs_enetdmac = bcm6348_regs_enetdmac;
|
||||
}
|
||||
#else
|
||||
static __init void bcm63xx_enetdmac_regs_init(void) { }
|
||||
#endif
|
||||
|
||||
static struct resource shared_res[] = {
|
||||
{
|
||||
.start = -1, /* filled at runtime */
|
||||
.end = -1, /* filled at runtime */
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.start = -1, /* filled at runtime */
|
||||
.end = -1, /* filled at runtime */
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.start = -1, /* filled at runtime */
|
||||
.end = -1, /* filled at runtime */
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device bcm63xx_enet_shared_device = {
|
||||
|
@ -94,6 +138,71 @@ static struct platform_device bcm63xx_enet1_device = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct resource enetsw_res[] = {
|
||||
{
|
||||
/* start & end filled at runtime */
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
/* start filled at runtime */
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
{
|
||||
/* start filled at runtime */
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct bcm63xx_enetsw_platform_data enetsw_pd;
|
||||
|
||||
static struct platform_device bcm63xx_enetsw_device = {
|
||||
.name = "bcm63xx_enetsw",
|
||||
.num_resources = ARRAY_SIZE(enetsw_res),
|
||||
.resource = enetsw_res,
|
||||
.dev = {
|
||||
.platform_data = &enetsw_pd,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init register_shared(void)
|
||||
{
|
||||
int ret, chan_count;
|
||||
|
||||
if (shared_device_registered)
|
||||
return 0;
|
||||
|
||||
bcm63xx_enetdmac_regs_init();
|
||||
|
||||
shared_res[0].start = bcm63xx_regset_address(RSET_ENETDMA);
|
||||
shared_res[0].end = shared_res[0].start;
|
||||
if (BCMCPU_IS_6345())
|
||||
shared_res[0].end += (RSET_6345_ENETDMA_SIZE) - 1;
|
||||
else
|
||||
shared_res[0].end += (RSET_ENETDMA_SIZE) - 1;
|
||||
|
||||
if (BCMCPU_IS_6328() || BCMCPU_IS_6362() || BCMCPU_IS_6368())
|
||||
chan_count = 32;
|
||||
else if (BCMCPU_IS_6345())
|
||||
chan_count = 8;
|
||||
else
|
||||
chan_count = 16;
|
||||
|
||||
shared_res[1].start = bcm63xx_regset_address(RSET_ENETDMAC);
|
||||
shared_res[1].end = shared_res[1].start;
|
||||
shared_res[1].end += RSET_ENETDMAC_SIZE(chan_count) - 1;
|
||||
|
||||
shared_res[2].start = bcm63xx_regset_address(RSET_ENETDMAS);
|
||||
shared_res[2].end = shared_res[2].start;
|
||||
shared_res[2].end += RSET_ENETDMAS_SIZE(chan_count) - 1;
|
||||
|
||||
ret = platform_device_register(&bcm63xx_enet_shared_device);
|
||||
if (ret)
|
||||
return ret;
|
||||
shared_device_registered = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __init bcm63xx_enet_register(int unit,
|
||||
const struct bcm63xx_enet_platform_data *pd)
|
||||
{
|
||||
|
@ -104,22 +213,12 @@ int __init bcm63xx_enet_register(int unit,
|
|||
if (unit > 1)
|
||||
return -ENODEV;
|
||||
|
||||
if (unit == 1 && BCMCPU_IS_6338())
|
||||
if (unit == 1 && (BCMCPU_IS_6338() || BCMCPU_IS_6345()))
|
||||
return -ENODEV;
|
||||
|
||||
if (!shared_device_registered) {
|
||||
shared_res[0].start = bcm63xx_regset_address(RSET_ENETDMA);
|
||||
shared_res[0].end = shared_res[0].start;
|
||||
if (BCMCPU_IS_6338())
|
||||
shared_res[0].end += (RSET_ENETDMA_SIZE / 2) - 1;
|
||||
else
|
||||
shared_res[0].end += (RSET_ENETDMA_SIZE) - 1;
|
||||
|
||||
ret = platform_device_register(&bcm63xx_enet_shared_device);
|
||||
if (ret)
|
||||
return ret;
|
||||
shared_device_registered = 1;
|
||||
}
|
||||
ret = register_shared();
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (unit == 0) {
|
||||
enet0_res[0].start = bcm63xx_regset_address(RSET_ENET0);
|
||||
|
@ -155,8 +254,62 @@ int __init bcm63xx_enet_register(int unit,
|
|||
dpd->phy_interrupt = bcm63xx_get_irq_number(IRQ_ENET_PHY);
|
||||
}
|
||||
|
||||
dpd->dma_chan_en_mask = ENETDMAC_CHANCFG_EN_MASK;
|
||||
dpd->dma_chan_int_mask = ENETDMAC_IR_PKTDONE_MASK;
|
||||
if (BCMCPU_IS_6345()) {
|
||||
dpd->dma_chan_en_mask |= ENETDMAC_CHANCFG_CHAINING_MASK;
|
||||
dpd->dma_chan_en_mask |= ENETDMAC_CHANCFG_WRAP_EN_MASK;
|
||||
dpd->dma_chan_en_mask |= ENETDMAC_CHANCFG_FLOWC_EN_MASK;
|
||||
dpd->dma_chan_int_mask |= ENETDMA_IR_BUFDONE_MASK;
|
||||
dpd->dma_chan_int_mask |= ENETDMA_IR_NOTOWNER_MASK;
|
||||
dpd->dma_chan_width = ENETDMA_6345_CHAN_WIDTH;
|
||||
dpd->dma_desc_shift = ENETDMA_6345_DESC_SHIFT;
|
||||
} else {
|
||||
dpd->dma_has_sram = true;
|
||||
dpd->dma_chan_width = ENETDMA_CHAN_WIDTH;
|
||||
}
|
||||
|
||||
ret = platform_device_register(pdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __init
|
||||
bcm63xx_enetsw_register(const struct bcm63xx_enetsw_platform_data *pd)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!BCMCPU_IS_6328() && !BCMCPU_IS_6362() && !BCMCPU_IS_6368())
|
||||
return -ENODEV;
|
||||
|
||||
ret = register_shared();
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
enetsw_res[0].start = bcm63xx_regset_address(RSET_ENETSW);
|
||||
enetsw_res[0].end = enetsw_res[0].start;
|
||||
enetsw_res[0].end += RSET_ENETSW_SIZE - 1;
|
||||
enetsw_res[1].start = bcm63xx_get_irq_number(IRQ_ENETSW_RXDMA0);
|
||||
enetsw_res[2].start = bcm63xx_get_irq_number(IRQ_ENETSW_TXDMA0);
|
||||
if (!enetsw_res[2].start)
|
||||
enetsw_res[2].start = -1;
|
||||
|
||||
memcpy(bcm63xx_enetsw_device.dev.platform_data, pd, sizeof(*pd));
|
||||
|
||||
if (BCMCPU_IS_6328())
|
||||
enetsw_pd.num_ports = ENETSW_PORTS_6328;
|
||||
else if (BCMCPU_IS_6362() || BCMCPU_IS_6368())
|
||||
enetsw_pd.num_ports = ENETSW_PORTS_6368;
|
||||
|
||||
enetsw_pd.dma_has_sram = true;
|
||||
enetsw_pd.dma_chan_width = ENETDMA_CHAN_WIDTH;
|
||||
enetsw_pd.dma_chan_en_mask = ENETDMAC_CHANCFG_EN_MASK;
|
||||
enetsw_pd.dma_chan_int_mask = ENETDMAC_IR_PKTDONE_MASK;
|
||||
|
||||
ret = platform_device_register(&bcm63xx_enetsw_device);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -173,7 +173,10 @@ enum bcm63xx_regs_set {
|
|||
#define BCM_6358_RSET_SPI_SIZE 1804
|
||||
#define BCM_6368_RSET_SPI_SIZE 1804
|
||||
#define RSET_ENET_SIZE 2048
|
||||
#define RSET_ENETDMA_SIZE 2048
|
||||
#define RSET_ENETDMA_SIZE 256
|
||||
#define RSET_6345_ENETDMA_SIZE 64
|
||||
#define RSET_ENETDMAC_SIZE(chans) (16 * (chans))
|
||||
#define RSET_ENETDMAS_SIZE(chans) (16 * (chans))
|
||||
#define RSET_ENETSW_SIZE 65536
|
||||
#define RSET_UART_SIZE 24
|
||||
#define RSET_UDC_SIZE 256
|
||||
|
@ -298,7 +301,7 @@ enum bcm63xx_regs_set {
|
|||
#define BCM_6345_USBDMA_BASE (0xfffe2800)
|
||||
#define BCM_6345_ENET0_BASE (0xfffe1800)
|
||||
#define BCM_6345_ENETDMA_BASE (0xfffe2800)
|
||||
#define BCM_6345_ENETDMAC_BASE (0xfffe2900)
|
||||
#define BCM_6345_ENETDMAC_BASE (0xfffe2840)
|
||||
#define BCM_6345_ENETDMAS_BASE (0xfffe2a00)
|
||||
#define BCM_6345_ENETSW_BASE (0xdeadbeef)
|
||||
#define BCM_6345_PCMCIA_BASE (0xfffe2028)
|
||||
|
|
|
@ -4,6 +4,8 @@
|
|||
#include <linux/if_ether.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <bcm63xx_regs.h>
|
||||
|
||||
/*
|
||||
* on board ethernet platform data
|
||||
*/
|
||||
|
@ -37,9 +39,129 @@ struct bcm63xx_enet_platform_data {
|
|||
int phy_id, int reg),
|
||||
void (*mii_write)(struct net_device *dev,
|
||||
int phy_id, int reg, int val));
|
||||
|
||||
/* DMA channel enable mask */
|
||||
u32 dma_chan_en_mask;
|
||||
|
||||
/* DMA channel interrupt mask */
|
||||
u32 dma_chan_int_mask;
|
||||
|
||||
/* DMA engine has internal SRAM */
|
||||
bool dma_has_sram;
|
||||
|
||||
/* DMA channel register width */
|
||||
unsigned int dma_chan_width;
|
||||
|
||||
/* DMA descriptor shift */
|
||||
unsigned int dma_desc_shift;
|
||||
};
|
||||
|
||||
/*
|
||||
* on board ethernet switch platform data
|
||||
*/
|
||||
#define ENETSW_MAX_PORT 8
|
||||
#define ENETSW_PORTS_6328 5 /* 4 FE PHY + 1 RGMII */
|
||||
#define ENETSW_PORTS_6368 6 /* 4 FE PHY + 2 RGMII */
|
||||
|
||||
#define ENETSW_RGMII_PORT0 4
|
||||
|
||||
struct bcm63xx_enetsw_port {
|
||||
int used;
|
||||
int phy_id;
|
||||
|
||||
int bypass_link;
|
||||
int force_speed;
|
||||
int force_duplex_full;
|
||||
|
||||
const char *name;
|
||||
};
|
||||
|
||||
struct bcm63xx_enetsw_platform_data {
|
||||
char mac_addr[ETH_ALEN];
|
||||
int num_ports;
|
||||
struct bcm63xx_enetsw_port used_ports[ENETSW_MAX_PORT];
|
||||
|
||||
/* DMA channel enable mask */
|
||||
u32 dma_chan_en_mask;
|
||||
|
||||
/* DMA channel interrupt mask */
|
||||
u32 dma_chan_int_mask;
|
||||
|
||||
/* DMA channel register width */
|
||||
unsigned int dma_chan_width;
|
||||
|
||||
/* DMA engine has internal SRAM */
|
||||
bool dma_has_sram;
|
||||
};
|
||||
|
||||
int __init bcm63xx_enet_register(int unit,
|
||||
const struct bcm63xx_enet_platform_data *pd);
|
||||
|
||||
int bcm63xx_enetsw_register(const struct bcm63xx_enetsw_platform_data *pd);
|
||||
|
||||
enum bcm63xx_regs_enetdmac {
|
||||
ENETDMAC_CHANCFG,
|
||||
ENETDMAC_IR,
|
||||
ENETDMAC_IRMASK,
|
||||
ENETDMAC_MAXBURST,
|
||||
ENETDMAC_BUFALLOC,
|
||||
ENETDMAC_RSTART,
|
||||
ENETDMAC_FC,
|
||||
ENETDMAC_LEN,
|
||||
};
|
||||
|
||||
static inline unsigned long bcm63xx_enetdmacreg(enum bcm63xx_regs_enetdmac reg)
|
||||
{
|
||||
#ifdef BCMCPU_RUNTIME_DETECT
|
||||
extern const unsigned long *bcm63xx_regs_enetdmac;
|
||||
|
||||
return bcm63xx_regs_enetdmac[reg];
|
||||
#else
|
||||
#ifdef CONFIG_BCM63XX_CPU_6345
|
||||
switch (reg) {
|
||||
case ENETDMAC_CHANCFG:
|
||||
return ENETDMA_6345_CHANCFG_REG;
|
||||
case ENETDMAC_IR:
|
||||
return ENETDMA_6345_IR_REG;
|
||||
case ENETDMAC_IRMASK:
|
||||
return ENETDMA_6345_IRMASK_REG;
|
||||
case ENETDMAC_MAXBURST:
|
||||
return ENETDMA_6345_MAXBURST_REG;
|
||||
case ENETDMAC_BUFALLOC:
|
||||
return ENETDMA_6345_BUFALLOC_REG;
|
||||
case ENETDMAC_RSTART:
|
||||
return ENETDMA_6345_RSTART_REG;
|
||||
case ENETDMAC_FC:
|
||||
return ENETDMA_6345_FC_REG;
|
||||
case ENETDMAC_LEN:
|
||||
return ENETDMA_6345_LEN_REG;
|
||||
}
|
||||
#endif
|
||||
#if defined(CONFIG_BCM63XX_CPU_6328) || \
|
||||
defined(CONFIG_BCM63XX_CPU_6338) || \
|
||||
defined(CONFIG_BCM63XX_CPU_6348) || \
|
||||
defined(CONFIG_BCM63XX_CPU_6358) || \
|
||||
defined(CONFIG_BCM63XX_CPU_6362) || \
|
||||
defined(CONFIG_BCM63XX_CPU_6368)
|
||||
switch (reg) {
|
||||
case ENETDMAC_CHANCFG:
|
||||
return ENETDMAC_CHANCFG_REG;
|
||||
case ENETDMAC_IR:
|
||||
return ENETDMAC_IR_REG;
|
||||
case ENETDMAC_IRMASK:
|
||||
return ENETDMAC_IRMASK_REG;
|
||||
case ENETDMAC_MAXBURST:
|
||||
return ENETDMAC_MAXBURST_REG;
|
||||
case ENETDMAC_BUFALLOC:
|
||||
case ENETDMAC_RSTART:
|
||||
case ENETDMAC_FC:
|
||||
case ENETDMAC_LEN:
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#endif /* ! BCM63XX_DEV_ENET_H_ */
|
||||
|
|
|
@ -727,6 +727,8 @@
|
|||
/*************************************************************************
|
||||
* _REG relative to RSET_ENETDMA
|
||||
*************************************************************************/
|
||||
#define ENETDMA_CHAN_WIDTH 0x10
|
||||
#define ENETDMA_6345_CHAN_WIDTH 0x40
|
||||
|
||||
/* Controller Configuration Register */
|
||||
#define ENETDMA_CFG_REG (0x0)
|
||||
|
@ -782,31 +784,56 @@
|
|||
/* State Ram Word 4 */
|
||||
#define ENETDMA_SRAM4_REG(x) (0x20c + (x) * 0x10)
|
||||
|
||||
/* Broadcom 6345 ENET DMA definitions */
|
||||
#define ENETDMA_6345_CHANCFG_REG (0x00)
|
||||
|
||||
#define ENETDMA_6345_MAXBURST_REG (0x40)
|
||||
|
||||
#define ENETDMA_6345_RSTART_REG (0x08)
|
||||
|
||||
#define ENETDMA_6345_LEN_REG (0x0C)
|
||||
|
||||
#define ENETDMA_6345_IR_REG (0x14)
|
||||
|
||||
#define ENETDMA_6345_IRMASK_REG (0x18)
|
||||
|
||||
#define ENETDMA_6345_FC_REG (0x1C)
|
||||
|
||||
#define ENETDMA_6345_BUFALLOC_REG (0x20)
|
||||
|
||||
/* Shift down for EOP, SOP and WRAP bits */
|
||||
#define ENETDMA_6345_DESC_SHIFT (3)
|
||||
|
||||
/*************************************************************************
|
||||
* _REG relative to RSET_ENETDMAC
|
||||
*************************************************************************/
|
||||
|
||||
/* Channel Configuration register */
|
||||
#define ENETDMAC_CHANCFG_REG(x) ((x) * 0x10)
|
||||
#define ENETDMAC_CHANCFG_REG (0x0)
|
||||
#define ENETDMAC_CHANCFG_EN_SHIFT 0
|
||||
#define ENETDMAC_CHANCFG_EN_MASK (1 << ENETDMAC_CHANCFG_EN_SHIFT)
|
||||
#define ENETDMAC_CHANCFG_PKTHALT_SHIFT 1
|
||||
#define ENETDMAC_CHANCFG_PKTHALT_MASK (1 << ENETDMAC_CHANCFG_PKTHALT_SHIFT)
|
||||
#define ENETDMAC_CHANCFG_BUFHALT_SHIFT 2
|
||||
#define ENETDMAC_CHANCFG_BUFHALT_MASK (1 << ENETDMAC_CHANCFG_BUFHALT_SHIFT)
|
||||
#define ENETDMAC_CHANCFG_CHAINING_SHIFT 2
|
||||
#define ENETDMAC_CHANCFG_CHAINING_MASK (1 << ENETDMAC_CHANCFG_CHAINING_SHIFT)
|
||||
#define ENETDMAC_CHANCFG_WRAP_EN_SHIFT 3
|
||||
#define ENETDMAC_CHANCFG_WRAP_EN_MASK (1 << ENETDMAC_CHANCFG_WRAP_EN_SHIFT)
|
||||
#define ENETDMAC_CHANCFG_FLOWC_EN_SHIFT 4
|
||||
#define ENETDMAC_CHANCFG_FLOWC_EN_MASK (1 << ENETDMAC_CHANCFG_FLOWC_EN_SHIFT)
|
||||
|
||||
/* Interrupt Control/Status register */
|
||||
#define ENETDMAC_IR_REG(x) (0x4 + (x) * 0x10)
|
||||
#define ENETDMAC_IR_REG (0x4)
|
||||
#define ENETDMAC_IR_BUFDONE_MASK (1 << 0)
|
||||
#define ENETDMAC_IR_PKTDONE_MASK (1 << 1)
|
||||
#define ENETDMAC_IR_NOTOWNER_MASK (1 << 2)
|
||||
|
||||
/* Interrupt Mask register */
|
||||
#define ENETDMAC_IRMASK_REG(x) (0x8 + (x) * 0x10)
|
||||
#define ENETDMAC_IRMASK_REG (0x8)
|
||||
|
||||
/* Maximum Burst Length */
|
||||
#define ENETDMAC_MAXBURST_REG(x) (0xc + (x) * 0x10)
|
||||
#define ENETDMAC_MAXBURST_REG (0xc)
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
|
@ -814,26 +841,76 @@
|
|||
*************************************************************************/
|
||||
|
||||
/* Ring Start Address register */
|
||||
#define ENETDMAS_RSTART_REG(x) ((x) * 0x10)
|
||||
#define ENETDMAS_RSTART_REG (0x0)
|
||||
|
||||
/* State Ram Word 2 */
|
||||
#define ENETDMAS_SRAM2_REG(x) (0x4 + (x) * 0x10)
|
||||
#define ENETDMAS_SRAM2_REG (0x4)
|
||||
|
||||
/* State Ram Word 3 */
|
||||
#define ENETDMAS_SRAM3_REG(x) (0x8 + (x) * 0x10)
|
||||
#define ENETDMAS_SRAM3_REG (0x8)
|
||||
|
||||
/* State Ram Word 4 */
|
||||
#define ENETDMAS_SRAM4_REG(x) (0xc + (x) * 0x10)
|
||||
#define ENETDMAS_SRAM4_REG (0xc)
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
* _REG relative to RSET_ENETSW
|
||||
*************************************************************************/
|
||||
|
||||
/* Port traffic control */
|
||||
#define ENETSW_PTCTRL_REG(x) (0x0 + (x))
|
||||
#define ENETSW_PTCTRL_RXDIS_MASK (1 << 0)
|
||||
#define ENETSW_PTCTRL_TXDIS_MASK (1 << 1)
|
||||
|
||||
/* Switch mode register */
|
||||
#define ENETSW_SWMODE_REG (0xb)
|
||||
#define ENETSW_SWMODE_FWD_EN_MASK (1 << 1)
|
||||
|
||||
/* IMP override Register */
|
||||
#define ENETSW_IMPOV_REG (0xe)
|
||||
#define ENETSW_IMPOV_FORCE_MASK (1 << 7)
|
||||
#define ENETSW_IMPOV_TXFLOW_MASK (1 << 5)
|
||||
#define ENETSW_IMPOV_RXFLOW_MASK (1 << 4)
|
||||
#define ENETSW_IMPOV_1000_MASK (1 << 3)
|
||||
#define ENETSW_IMPOV_100_MASK (1 << 2)
|
||||
#define ENETSW_IMPOV_FDX_MASK (1 << 1)
|
||||
#define ENETSW_IMPOV_LINKUP_MASK (1 << 0)
|
||||
|
||||
/* Port override Register */
|
||||
#define ENETSW_PORTOV_REG(x) (0x58 + (x))
|
||||
#define ENETSW_PORTOV_ENABLE_MASK (1 << 6)
|
||||
#define ENETSW_PORTOV_TXFLOW_MASK (1 << 5)
|
||||
#define ENETSW_PORTOV_RXFLOW_MASK (1 << 4)
|
||||
#define ENETSW_PORTOV_1000_MASK (1 << 3)
|
||||
#define ENETSW_PORTOV_100_MASK (1 << 2)
|
||||
#define ENETSW_PORTOV_FDX_MASK (1 << 1)
|
||||
#define ENETSW_PORTOV_LINKUP_MASK (1 << 0)
|
||||
|
||||
/* MDIO control register */
|
||||
#define ENETSW_MDIOC_REG (0xb0)
|
||||
#define ENETSW_MDIOC_EXT_MASK (1 << 16)
|
||||
#define ENETSW_MDIOC_REG_SHIFT 20
|
||||
#define ENETSW_MDIOC_PHYID_SHIFT 25
|
||||
#define ENETSW_MDIOC_RD_MASK (1 << 30)
|
||||
#define ENETSW_MDIOC_WR_MASK (1 << 31)
|
||||
|
||||
/* MDIO data register */
|
||||
#define ENETSW_MDIOD_REG (0xb4)
|
||||
|
||||
/* Global Management Configuration Register */
|
||||
#define ENETSW_GMCR_REG (0x200)
|
||||
#define ENETSW_GMCR_RST_MIB_MASK (1 << 0)
|
||||
|
||||
/* MIB register */
|
||||
#define ENETSW_MIB_REG(x) (0x2800 + (x) * 4)
|
||||
#define ENETSW_MIB_REG_COUNT 47
|
||||
|
||||
/* Jumbo control register port mask register */
|
||||
#define ENETSW_JMBCTL_PORT_REG (0x4004)
|
||||
|
||||
/* Jumbo control mib good frame register */
|
||||
#define ENETSW_JMBCTL_MAXSIZE_REG (0x4008)
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
* _REG relative to RSET_OHCI_PRIV
|
||||
|
|
|
@ -24,6 +24,7 @@ struct board_info {
|
|||
/* enabled feature/device */
|
||||
unsigned int has_enet0:1;
|
||||
unsigned int has_enet1:1;
|
||||
unsigned int has_enetsw:1;
|
||||
unsigned int has_pci:1;
|
||||
unsigned int has_pccard:1;
|
||||
unsigned int has_ohci0:1;
|
||||
|
@ -36,6 +37,7 @@ struct board_info {
|
|||
/* ethernet config */
|
||||
struct bcm63xx_enet_platform_data enet0;
|
||||
struct bcm63xx_enet_platform_data enet1;
|
||||
struct bcm63xx_enetsw_platform_data enetsw;
|
||||
|
||||
/* USB config */
|
||||
struct bcm63xx_usbd_platform_data usbd;
|
||||
|
|
|
@ -92,4 +92,6 @@
|
|||
|
||||
#define SO_SELECT_ERR_QUEUE 45
|
||||
|
||||
#define SO_LL 46
|
||||
|
||||
#endif /* _UAPI_ASM_SOCKET_H */
|
||||
|
|
|
@ -331,7 +331,8 @@ static int tx4939_netdev_event(struct notifier_block *this,
|
|||
unsigned long event,
|
||||
void *ptr)
|
||||
{
|
||||
struct net_device *dev = ptr;
|
||||
struct net_device *dev = netdev_notifier_info_to_dev(ptr);
|
||||
|
||||
if (event == NETDEV_CHANGE && netif_carrier_ok(dev)) {
|
||||
__u64 bit = 0;
|
||||
if (dev->irq == TXX9_IRQ_BASE + TX4939_IR_ETH(0))
|
||||
|
|
|
@ -74,4 +74,6 @@
|
|||
|
||||
#define SO_SELECT_ERR_QUEUE 45
|
||||
|
||||
#define SO_LL 46
|
||||
|
||||
#endif /* _ASM_SOCKET_H */
|
||||
|
|
|
@ -73,6 +73,8 @@
|
|||
|
||||
#define SO_SELECT_ERR_QUEUE 0x4026
|
||||
|
||||
#define SO_LL 0x4027
|
||||
|
||||
/* O_NONBLOCK clashes with the bits used for socket types. Therefore we
|
||||
* have to define SOCK_NONBLOCK to a different value here.
|
||||
*/
|
||||
|
|
|
@ -668,7 +668,6 @@ config SBUS
|
|||
|
||||
config FSL_SOC
|
||||
bool
|
||||
select HAVE_CAN_FLEXCAN if NET && CAN
|
||||
|
||||
config FSL_PCI
|
||||
bool
|
||||
|
|
|
@ -81,4 +81,6 @@
|
|||
|
||||
#define SO_SELECT_ERR_QUEUE 45
|
||||
|
||||
#define SO_LL 46
|
||||
|
||||
#endif /* _ASM_POWERPC_SOCKET_H */
|
||||
|
|
|
@ -650,8 +650,7 @@ void bpf_jit_compile(struct sk_filter *fp)
|
|||
|
||||
proglen = cgctx.idx * 4;
|
||||
alloclen = proglen + FUNCTION_DESCR_SIZE;
|
||||
image = module_alloc(max_t(unsigned int, alloclen,
|
||||
sizeof(struct work_struct)));
|
||||
image = module_alloc(alloclen);
|
||||
if (!image)
|
||||
goto out;
|
||||
|
||||
|
@ -688,20 +687,8 @@ void bpf_jit_compile(struct sk_filter *fp)
|
|||
return;
|
||||
}
|
||||
|
||||
static void jit_free_defer(struct work_struct *arg)
|
||||
{
|
||||
module_free(NULL, arg);
|
||||
}
|
||||
|
||||
/* run from softirq, we must use a work_struct to call
|
||||
* module_free() from process context
|
||||
*/
|
||||
void bpf_jit_free(struct sk_filter *fp)
|
||||
{
|
||||
if (fp->bpf_func != sk_run_filter) {
|
||||
struct work_struct *work = (struct work_struct *)fp->bpf_func;
|
||||
|
||||
INIT_WORK(work, jit_free_defer);
|
||||
schedule_work(work);
|
||||
}
|
||||
if (fp->bpf_func != sk_run_filter)
|
||||
module_free(NULL, fp->bpf_func);
|
||||
}
|
||||
|
|
|
@ -80,4 +80,6 @@
|
|||
|
||||
#define SO_SELECT_ERR_QUEUE 45
|
||||
|
||||
#define SO_LL 46
|
||||
|
||||
#endif /* _ASM_SOCKET_H */
|
||||
|
|
|
@ -85,7 +85,7 @@ static struct sh_eth_plat_data sh7763_eth_pdata = {
|
|||
};
|
||||
|
||||
static struct platform_device espt_eth_device = {
|
||||
.name = "sh-eth",
|
||||
.name = "sh7763-gether",
|
||||
.resource = sh_eth_resources,
|
||||
.num_resources = ARRAY_SIZE(sh_eth_resources),
|
||||
.dev = {
|
||||
|
|
|
@ -82,7 +82,7 @@ static struct sh_eth_plat_data sh7757_eth0_pdata = {
|
|||
};
|
||||
|
||||
static struct platform_device sh7757_eth0_device = {
|
||||
.name = "sh-eth",
|
||||
.name = "sh7757-ether",
|
||||
.resource = sh_eth0_resources,
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(sh_eth0_resources),
|
||||
|
@ -111,7 +111,7 @@ static struct sh_eth_plat_data sh7757_eth1_pdata = {
|
|||
};
|
||||
|
||||
static struct platform_device sh7757_eth1_device = {
|
||||
.name = "sh-eth",
|
||||
.name = "sh7757-ether",
|
||||
.resource = sh_eth1_resources,
|
||||
.id = 1,
|
||||
.num_resources = ARRAY_SIZE(sh_eth1_resources),
|
||||
|
@ -157,7 +157,7 @@ static struct sh_eth_plat_data sh7757_eth_giga0_pdata = {
|
|||
};
|
||||
|
||||
static struct platform_device sh7757_eth_giga0_device = {
|
||||
.name = "sh-eth",
|
||||
.name = "sh7757-gether",
|
||||
.resource = sh_eth_giga0_resources,
|
||||
.id = 2,
|
||||
.num_resources = ARRAY_SIZE(sh_eth_giga0_resources),
|
||||
|
@ -192,7 +192,7 @@ static struct sh_eth_plat_data sh7757_eth_giga1_pdata = {
|
|||
};
|
||||
|
||||
static struct platform_device sh7757_eth_giga1_device = {
|
||||
.name = "sh-eth",
|
||||
.name = "sh7757-gether",
|
||||
.resource = sh_eth_giga1_resources,
|
||||
.id = 3,
|
||||
.num_resources = ARRAY_SIZE(sh_eth_giga1_resources),
|
||||
|
|
|
@ -165,8 +165,8 @@ static struct sh_eth_plat_data sh_eth_plat = {
|
|||
};
|
||||
|
||||
static struct platform_device sh_eth_device = {
|
||||
.name = "sh-eth",
|
||||
.id = 0,
|
||||
.name = "sh7724-ether",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &sh_eth_plat,
|
||||
},
|
||||
|
|
|
@ -128,8 +128,8 @@ static struct resource sh_eth0_resources[] = {
|
|||
};
|
||||
|
||||
static struct platform_device sh_eth0_device = {
|
||||
.name = "sh-eth",
|
||||
.id = 0,
|
||||
.name = "sh771x-ether",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = PHY_ID,
|
||||
},
|
||||
|
@ -151,8 +151,8 @@ static struct resource sh_eth1_resources[] = {
|
|||
};
|
||||
|
||||
static struct platform_device sh_eth1_device = {
|
||||
.name = "sh-eth",
|
||||
.id = 1,
|
||||
.name = "sh771x-ether",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = PHY_ID,
|
||||
},
|
||||
|
|
|
@ -380,8 +380,8 @@ static struct sh_eth_plat_data sh_eth_plat = {
|
|||
};
|
||||
|
||||
static struct platform_device sh_eth_device = {
|
||||
.name = "sh-eth",
|
||||
.id = 0,
|
||||
.name = "sh7724-ether",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &sh_eth_plat,
|
||||
},
|
||||
|
|
|
@ -93,7 +93,7 @@ static struct sh_eth_plat_data sh7763_eth_pdata = {
|
|||
};
|
||||
|
||||
static struct platform_device sh7763rdp_eth_device = {
|
||||
.name = "sh-eth",
|
||||
.name = "sh7763-gether",
|
||||
.resource = sh_eth_resources,
|
||||
.num_resources = ARRAY_SIZE(sh_eth_resources),
|
||||
.dev = {
|
||||
|
|
|
@ -124,8 +124,8 @@ static struct resource eth_resources[] = {
|
|||
};
|
||||
|
||||
static struct platform_device eth_device = {
|
||||
.name = "sh-eth",
|
||||
.id = -1,
|
||||
.name = "sh7619-ether",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = (void *)1,
|
||||
},
|
||||
|
|
|
@ -329,7 +329,7 @@ static struct clk_lookup lookups[] = {
|
|||
CLKDEV_DEV_ID("i2c-sh_mobile.0", &mstp_clks[HWBLK_IIC0]),
|
||||
CLKDEV_DEV_ID("i2c-sh_mobile.1", &mstp_clks[HWBLK_IIC1]),
|
||||
CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[HWBLK_MMC]),
|
||||
CLKDEV_DEV_ID("sh-eth.0", &mstp_clks[HWBLK_ETHER]),
|
||||
CLKDEV_DEV_ID("sh7724-ether.0", &mstp_clks[HWBLK_ETHER]),
|
||||
CLKDEV_CON_ID("atapi0", &mstp_clks[HWBLK_ATAPI]),
|
||||
CLKDEV_CON_ID("tpu0", &mstp_clks[HWBLK_TPU]),
|
||||
CLKDEV_CON_ID("irda0", &mstp_clks[HWBLK_IRDA]),
|
||||
|
|
|
@ -238,7 +238,7 @@ static struct clk_lookup lookups[] = {
|
|||
CLKDEV_CON_ID("adc0", &mstp_clks[MSTP313]),
|
||||
CLKDEV_CON_ID("mtu0", &mstp_clks[MSTP312]),
|
||||
CLKDEV_CON_ID("iebus0", &mstp_clks[MSTP304]),
|
||||
CLKDEV_DEV_ID("sh-eth.0", &mstp_clks[MSTP114]),
|
||||
CLKDEV_DEV_ID("sh7734-gether.0", &mstp_clks[MSTP114]),
|
||||
CLKDEV_CON_ID("rtc0", &mstp_clks[MSTP303]),
|
||||
CLKDEV_CON_ID("hif0", &mstp_clks[MSTP302]),
|
||||
CLKDEV_CON_ID("stif0", &mstp_clks[MSTP301]),
|
||||
|
|
|
@ -70,6 +70,8 @@
|
|||
|
||||
#define SO_SELECT_ERR_QUEUE 0x0029
|
||||
|
||||
#define SO_LL 0x0030
|
||||
|
||||
/* Security levels - as per NRL IPv6 - don't actually do anything */
|
||||
#define SO_SECURITY_AUTHENTICATION 0x5001
|
||||
#define SO_SECURITY_ENCRYPTION_TRANSPORT 0x5002
|
||||
|
|
|
@ -785,9 +785,7 @@ cond_branch: f_offset = addrs[i + filter[i].jf];
|
|||
break;
|
||||
}
|
||||
if (proglen == oldproglen) {
|
||||
image = module_alloc(max_t(unsigned int,
|
||||
proglen,
|
||||
sizeof(struct work_struct)));
|
||||
image = module_alloc(proglen);
|
||||
if (!image)
|
||||
goto out;
|
||||
}
|
||||
|
@ -806,20 +804,8 @@ cond_branch: f_offset = addrs[i + filter[i].jf];
|
|||
return;
|
||||
}
|
||||
|
||||
static void jit_free_defer(struct work_struct *arg)
|
||||
{
|
||||
module_free(NULL, arg);
|
||||
}
|
||||
|
||||
/* run from softirq, we must use a work_struct to call
|
||||
* module_free() from process context
|
||||
*/
|
||||
void bpf_jit_free(struct sk_filter *fp)
|
||||
{
|
||||
if (fp->bpf_func != sk_run_filter) {
|
||||
struct work_struct *work = (struct work_struct *)fp->bpf_func;
|
||||
|
||||
INIT_WORK(work, jit_free_defer);
|
||||
schedule_work(work);
|
||||
}
|
||||
if (fp->bpf_func != sk_run_filter)
|
||||
module_free(NULL, fp->bpf_func);
|
||||
}
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <linux/netdevice.h>
|
||||
#include <linux/filter.h>
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/random.h>
|
||||
|
||||
/*
|
||||
* Conventions :
|
||||
|
@ -144,6 +145,39 @@ static int pkt_type_offset(void)
|
|||
return -1;
|
||||
}
|
||||
|
||||
struct bpf_binary_header {
|
||||
unsigned int pages;
|
||||
/* Note : for security reasons, bpf code will follow a randomly
|
||||
* sized amount of int3 instructions
|
||||
*/
|
||||
u8 image[];
|
||||
};
|
||||
|
||||
static struct bpf_binary_header *bpf_alloc_binary(unsigned int proglen,
|
||||
u8 **image_ptr)
|
||||
{
|
||||
unsigned int sz, hole;
|
||||
struct bpf_binary_header *header;
|
||||
|
||||
/* Most of BPF filters are really small,
|
||||
* but if some of them fill a page, allow at least
|
||||
* 128 extra bytes to insert a random section of int3
|
||||
*/
|
||||
sz = round_up(proglen + sizeof(*header) + 128, PAGE_SIZE);
|
||||
header = module_alloc(sz);
|
||||
if (!header)
|
||||
return NULL;
|
||||
|
||||
memset(header, 0xcc, sz); /* fill whole space with int3 instructions */
|
||||
|
||||
header->pages = sz / PAGE_SIZE;
|
||||
hole = sz - (proglen + sizeof(*header));
|
||||
|
||||
/* insert a random number of int3 instructions before BPF code */
|
||||
*image_ptr = &header->image[prandom_u32() % hole];
|
||||
return header;
|
||||
}
|
||||
|
||||
void bpf_jit_compile(struct sk_filter *fp)
|
||||
{
|
||||
u8 temp[64];
|
||||
|
@ -153,6 +187,7 @@ void bpf_jit_compile(struct sk_filter *fp)
|
|||
int t_offset, f_offset;
|
||||
u8 t_op, f_op, seen = 0, pass;
|
||||
u8 *image = NULL;
|
||||
struct bpf_binary_header *header = NULL;
|
||||
u8 *func;
|
||||
int pc_ret0 = -1; /* bpf index of first RET #0 instruction (if any) */
|
||||
unsigned int cleanup_addr; /* epilogue code offset */
|
||||
|
@ -693,7 +728,7 @@ cond_branch: f_offset = addrs[i + filter[i].jf] - addrs[i];
|
|||
if (unlikely(proglen + ilen > oldproglen)) {
|
||||
pr_err("bpb_jit_compile fatal error\n");
|
||||
kfree(addrs);
|
||||
module_free(NULL, image);
|
||||
module_free(NULL, header);
|
||||
return;
|
||||
}
|
||||
memcpy(image + proglen, temp, ilen);
|
||||
|
@ -717,10 +752,8 @@ cond_branch: f_offset = addrs[i + filter[i].jf] - addrs[i];
|
|||
break;
|
||||
}
|
||||
if (proglen == oldproglen) {
|
||||
image = module_alloc(max_t(unsigned int,
|
||||
proglen,
|
||||
sizeof(struct work_struct)));
|
||||
if (!image)
|
||||
header = bpf_alloc_binary(proglen, &image);
|
||||
if (!header)
|
||||
goto out;
|
||||
}
|
||||
oldproglen = proglen;
|
||||
|
@ -730,7 +763,8 @@ cond_branch: f_offset = addrs[i + filter[i].jf] - addrs[i];
|
|||
bpf_jit_dump(flen, proglen, pass, image);
|
||||
|
||||
if (image) {
|
||||
bpf_flush_icache(image, image + proglen);
|
||||
bpf_flush_icache(header, image + proglen);
|
||||
set_memory_ro((unsigned long)header, header->pages);
|
||||
fp->bpf_func = (void *)image;
|
||||
}
|
||||
out:
|
||||
|
@ -738,20 +772,13 @@ cond_branch: f_offset = addrs[i + filter[i].jf] - addrs[i];
|
|||
return;
|
||||
}
|
||||
|
||||
static void jit_free_defer(struct work_struct *arg)
|
||||
{
|
||||
module_free(NULL, arg);
|
||||
}
|
||||
|
||||
/* run from softirq, we must use a work_struct to call
|
||||
* module_free() from process context
|
||||
*/
|
||||
void bpf_jit_free(struct sk_filter *fp)
|
||||
{
|
||||
if (fp->bpf_func != sk_run_filter) {
|
||||
struct work_struct *work = (struct work_struct *)fp->bpf_func;
|
||||
unsigned long addr = (unsigned long)fp->bpf_func & PAGE_MASK;
|
||||
struct bpf_binary_header *header = (void *)addr;
|
||||
|
||||
INIT_WORK(work, jit_free_defer);
|
||||
schedule_work(work);
|
||||
set_memory_rw(addr, header->pages);
|
||||
module_free(NULL, header);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -85,4 +85,6 @@
|
|||
|
||||
#define SO_SELECT_ERR_QUEUE 45
|
||||
|
||||
#define SO_LL 46
|
||||
|
||||
#endif /* _XTENSA_SOCKET_H */
|
||||
|
|
|
@ -1403,7 +1403,7 @@ static void amb_free_rx_skb (struct atm_vcc * atm_vcc, struct sk_buff * skb) {
|
|||
rx.host_address = cpu_to_be32 (virt_to_bus (skb->data));
|
||||
|
||||
skb->data = skb->head;
|
||||
skb->tail = skb->head;
|
||||
skb_reset_tail_pointer(skb);
|
||||
skb->len = 0;
|
||||
|
||||
if (!rx_give (dev, &rx, pool)) {
|
||||
|
|
|
@ -26,6 +26,7 @@ config BCMA_HOST_PCI_POSSIBLE
|
|||
config BCMA_HOST_PCI
|
||||
bool "Support for BCMA on PCI-host bus"
|
||||
depends on BCMA_HOST_PCI_POSSIBLE
|
||||
default y
|
||||
|
||||
config BCMA_DRIVER_PCI_HOSTMODE
|
||||
bool "Driver for PCI core working in hostmode"
|
||||
|
|
|
@ -22,6 +22,8 @@
|
|||
struct bcma_bus;
|
||||
|
||||
/* main.c */
|
||||
bool bcma_wait_value(struct bcma_device *core, u16 reg, u32 mask, u32 value,
|
||||
int timeout);
|
||||
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,
|
||||
|
|
|
@ -9,6 +9,25 @@
|
|||
#include <linux/export.h>
|
||||
#include <linux/bcma/bcma.h>
|
||||
|
||||
static bool bcma_core_wait_value(struct bcma_device *core, u16 reg, u32 mask,
|
||||
u32 value, int timeout)
|
||||
{
|
||||
unsigned long deadline = jiffies + timeout;
|
||||
u32 val;
|
||||
|
||||
do {
|
||||
val = bcma_aread32(core, reg);
|
||||
if ((val & mask) == value)
|
||||
return true;
|
||||
cpu_relax();
|
||||
udelay(10);
|
||||
} while (!time_after_eq(jiffies, deadline));
|
||||
|
||||
bcma_warn(core->bus, "Timeout waiting for register 0x%04X!\n", reg);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool bcma_core_is_enabled(struct bcma_device *core)
|
||||
{
|
||||
if ((bcma_aread32(core, BCMA_IOCTL) & (BCMA_IOCTL_CLK | BCMA_IOCTL_FGC))
|
||||
|
@ -25,13 +44,15 @@ void bcma_core_disable(struct bcma_device *core, u32 flags)
|
|||
if (bcma_aread32(core, BCMA_RESET_CTL) & BCMA_RESET_CTL_RESET)
|
||||
return;
|
||||
|
||||
bcma_awrite32(core, BCMA_IOCTL, flags);
|
||||
bcma_aread32(core, BCMA_IOCTL);
|
||||
udelay(10);
|
||||
bcma_core_wait_value(core, BCMA_RESET_ST, ~0, 0, 300);
|
||||
|
||||
bcma_awrite32(core, BCMA_RESET_CTL, BCMA_RESET_CTL_RESET);
|
||||
bcma_aread32(core, BCMA_RESET_CTL);
|
||||
udelay(1);
|
||||
|
||||
bcma_awrite32(core, BCMA_IOCTL, flags);
|
||||
bcma_aread32(core, BCMA_IOCTL);
|
||||
udelay(10);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(bcma_core_disable);
|
||||
|
||||
|
@ -43,6 +64,7 @@ int bcma_core_enable(struct bcma_device *core, u32 flags)
|
|||
bcma_aread32(core, BCMA_IOCTL);
|
||||
|
||||
bcma_awrite32(core, BCMA_RESET_CTL, 0);
|
||||
bcma_aread32(core, BCMA_RESET_CTL);
|
||||
udelay(1);
|
||||
|
||||
bcma_awrite32(core, BCMA_IOCTL, (BCMA_IOCTL_CLK | flags));
|
||||
|
|
|
@ -140,8 +140,15 @@ void bcma_core_chipcommon_init(struct bcma_drv_cc *cc)
|
|||
bcma_core_chipcommon_early_init(cc);
|
||||
|
||||
if (cc->core->id.rev >= 20) {
|
||||
bcma_cc_write32(cc, BCMA_CC_GPIOPULLUP, 0);
|
||||
bcma_cc_write32(cc, BCMA_CC_GPIOPULLDOWN, 0);
|
||||
u32 pullup = 0, pulldown = 0;
|
||||
|
||||
if (cc->core->bus->chipinfo.id == BCMA_CHIP_ID_BCM43142) {
|
||||
pullup = 0x402e0;
|
||||
pulldown = 0x20500;
|
||||
}
|
||||
|
||||
bcma_cc_write32(cc, BCMA_CC_GPIOPULLUP, pullup);
|
||||
bcma_cc_write32(cc, BCMA_CC_GPIOPULLDOWN, pulldown);
|
||||
}
|
||||
|
||||
if (cc->capabilities & BCMA_CC_CAP_PMU)
|
||||
|
|
|
@ -56,6 +56,109 @@ void bcma_chipco_regctl_maskset(struct bcma_drv_cc *cc, u32 offset, u32 mask,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(bcma_chipco_regctl_maskset);
|
||||
|
||||
static u32 bcma_pmu_xtalfreq(struct bcma_drv_cc *cc)
|
||||
{
|
||||
u32 ilp_ctl, alp_hz;
|
||||
|
||||
if (!(bcma_cc_read32(cc, BCMA_CC_PMU_STAT) &
|
||||
BCMA_CC_PMU_STAT_EXT_LPO_AVAIL))
|
||||
return 0;
|
||||
|
||||
bcma_cc_write32(cc, BCMA_CC_PMU_XTAL_FREQ,
|
||||
BIT(BCMA_CC_PMU_XTAL_FREQ_MEASURE_SHIFT));
|
||||
usleep_range(1000, 2000);
|
||||
|
||||
ilp_ctl = bcma_cc_read32(cc, BCMA_CC_PMU_XTAL_FREQ);
|
||||
ilp_ctl &= BCMA_CC_PMU_XTAL_FREQ_ILPCTL_MASK;
|
||||
|
||||
bcma_cc_write32(cc, BCMA_CC_PMU_XTAL_FREQ, 0);
|
||||
|
||||
alp_hz = ilp_ctl * 32768 / 4;
|
||||
return (alp_hz + 50000) / 100000 * 100;
|
||||
}
|
||||
|
||||
static void bcma_pmu2_pll_init0(struct bcma_drv_cc *cc, u32 xtalfreq)
|
||||
{
|
||||
struct bcma_bus *bus = cc->core->bus;
|
||||
u32 freq_tgt_target = 0, freq_tgt_current;
|
||||
u32 pll0, mask;
|
||||
|
||||
switch (bus->chipinfo.id) {
|
||||
case BCMA_CHIP_ID_BCM43142:
|
||||
/* pmu2_xtaltab0_adfll_485 */
|
||||
switch (xtalfreq) {
|
||||
case 12000:
|
||||
freq_tgt_target = 0x50D52;
|
||||
break;
|
||||
case 20000:
|
||||
freq_tgt_target = 0x307FE;
|
||||
break;
|
||||
case 26000:
|
||||
freq_tgt_target = 0x254EA;
|
||||
break;
|
||||
case 37400:
|
||||
freq_tgt_target = 0x19EF8;
|
||||
break;
|
||||
case 52000:
|
||||
freq_tgt_target = 0x12A75;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (!freq_tgt_target) {
|
||||
bcma_err(bus, "Unknown TGT frequency for xtalfreq %d\n",
|
||||
xtalfreq);
|
||||
return;
|
||||
}
|
||||
|
||||
pll0 = bcma_chipco_pll_read(cc, BCMA_CC_PMU15_PLL_PLLCTL0);
|
||||
freq_tgt_current = (pll0 & BCMA_CC_PMU15_PLL_PC0_FREQTGT_MASK) >>
|
||||
BCMA_CC_PMU15_PLL_PC0_FREQTGT_SHIFT;
|
||||
|
||||
if (freq_tgt_current == freq_tgt_target) {
|
||||
bcma_debug(bus, "Target TGT frequency already set\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Turn off PLL */
|
||||
switch (bus->chipinfo.id) {
|
||||
case BCMA_CHIP_ID_BCM43142:
|
||||
mask = (u32)~(BCMA_RES_4314_HT_AVAIL |
|
||||
BCMA_RES_4314_MACPHY_CLK_AVAIL);
|
||||
|
||||
bcma_cc_mask32(cc, BCMA_CC_PMU_MINRES_MSK, mask);
|
||||
bcma_cc_mask32(cc, BCMA_CC_PMU_MAXRES_MSK, mask);
|
||||
bcma_wait_value(cc->core, BCMA_CLKCTLST,
|
||||
BCMA_CLKCTLST_HAVEHT, 0, 20000);
|
||||
break;
|
||||
}
|
||||
|
||||
pll0 &= ~BCMA_CC_PMU15_PLL_PC0_FREQTGT_MASK;
|
||||
pll0 |= freq_tgt_target << BCMA_CC_PMU15_PLL_PC0_FREQTGT_SHIFT;
|
||||
bcma_chipco_pll_write(cc, BCMA_CC_PMU15_PLL_PLLCTL0, pll0);
|
||||
|
||||
/* Flush */
|
||||
if (cc->pmu.rev >= 2)
|
||||
bcma_cc_set32(cc, BCMA_CC_PMU_CTL, BCMA_CC_PMU_CTL_PLL_UPD);
|
||||
|
||||
/* TODO: Do we need to update OTP? */
|
||||
}
|
||||
|
||||
static void bcma_pmu_pll_init(struct bcma_drv_cc *cc)
|
||||
{
|
||||
struct bcma_bus *bus = cc->core->bus;
|
||||
u32 xtalfreq = bcma_pmu_xtalfreq(cc);
|
||||
|
||||
switch (bus->chipinfo.id) {
|
||||
case BCMA_CHIP_ID_BCM43142:
|
||||
if (xtalfreq == 0)
|
||||
xtalfreq = 20000;
|
||||
bcma_pmu2_pll_init0(cc, xtalfreq);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void bcma_pmu_resources_init(struct bcma_drv_cc *cc)
|
||||
{
|
||||
struct bcma_bus *bus = cc->core->bus;
|
||||
|
@ -66,6 +169,25 @@ static void bcma_pmu_resources_init(struct bcma_drv_cc *cc)
|
|||
min_msk = 0x200D;
|
||||
max_msk = 0xFFFF;
|
||||
break;
|
||||
case BCMA_CHIP_ID_BCM43142:
|
||||
min_msk = BCMA_RES_4314_LPLDO_PU |
|
||||
BCMA_RES_4314_PMU_SLEEP_DIS |
|
||||
BCMA_RES_4314_PMU_BG_PU |
|
||||
BCMA_RES_4314_CBUCK_LPOM_PU |
|
||||
BCMA_RES_4314_CBUCK_PFM_PU |
|
||||
BCMA_RES_4314_CLDO_PU |
|
||||
BCMA_RES_4314_LPLDO2_LVM |
|
||||
BCMA_RES_4314_WL_PMU_PU |
|
||||
BCMA_RES_4314_LDO3P3_PU |
|
||||
BCMA_RES_4314_OTP_PU |
|
||||
BCMA_RES_4314_WL_PWRSW_PU |
|
||||
BCMA_RES_4314_LQ_AVAIL |
|
||||
BCMA_RES_4314_LOGIC_RET |
|
||||
BCMA_RES_4314_MEM_SLEEP |
|
||||
BCMA_RES_4314_MACPHY_RET |
|
||||
BCMA_RES_4314_WL_CORE_READY;
|
||||
max_msk = 0x3FFFFFFF;
|
||||
break;
|
||||
default:
|
||||
bcma_debug(bus, "PMU resource config unknown or not needed for device 0x%04X\n",
|
||||
bus->chipinfo.id);
|
||||
|
@ -165,6 +287,7 @@ void bcma_pmu_init(struct bcma_drv_cc *cc)
|
|||
bcma_cc_set32(cc, BCMA_CC_PMU_CTL,
|
||||
BCMA_CC_PMU_CTL_NOILPONW);
|
||||
|
||||
bcma_pmu_pll_init(cc);
|
||||
bcma_pmu_resources_init(cc);
|
||||
bcma_pmu_workarounds(cc);
|
||||
}
|
||||
|
|
|
@ -30,7 +30,7 @@ struct bcma_sflash_tbl_e {
|
|||
u16 numblocks;
|
||||
};
|
||||
|
||||
static struct bcma_sflash_tbl_e bcma_sflash_st_tbl[] = {
|
||||
static const struct bcma_sflash_tbl_e bcma_sflash_st_tbl[] = {
|
||||
{ "M25P20", 0x11, 0x10000, 4, },
|
||||
{ "M25P40", 0x12, 0x10000, 8, },
|
||||
|
||||
|
@ -41,7 +41,7 @@ static struct bcma_sflash_tbl_e bcma_sflash_st_tbl[] = {
|
|||
{ 0 },
|
||||
};
|
||||
|
||||
static struct bcma_sflash_tbl_e bcma_sflash_sst_tbl[] = {
|
||||
static const struct bcma_sflash_tbl_e bcma_sflash_sst_tbl[] = {
|
||||
{ "SST25WF512", 1, 0x1000, 16, },
|
||||
{ "SST25VF512", 0x48, 0x1000, 16, },
|
||||
{ "SST25WF010", 2, 0x1000, 32, },
|
||||
|
@ -59,7 +59,7 @@ static struct bcma_sflash_tbl_e bcma_sflash_sst_tbl[] = {
|
|||
{ 0 },
|
||||
};
|
||||
|
||||
static struct bcma_sflash_tbl_e bcma_sflash_at_tbl[] = {
|
||||
static const struct bcma_sflash_tbl_e bcma_sflash_at_tbl[] = {
|
||||
{ "AT45DB011", 0xc, 256, 512, },
|
||||
{ "AT45DB021", 0x14, 256, 1024, },
|
||||
{ "AT45DB041", 0x1c, 256, 2048, },
|
||||
|
@ -89,7 +89,7 @@ int bcma_sflash_init(struct bcma_drv_cc *cc)
|
|||
{
|
||||
struct bcma_bus *bus = cc->core->bus;
|
||||
struct bcma_sflash *sflash = &cc->sflash;
|
||||
struct bcma_sflash_tbl_e *e;
|
||||
const struct bcma_sflash_tbl_e *e;
|
||||
u32 id, id2;
|
||||
|
||||
switch (cc->capabilities & BCMA_CC_CAP_FLASHT) {
|
||||
|
|
|
@ -275,6 +275,7 @@ static DEFINE_PCI_DEVICE_TABLE(bcma_pci_bridge_tbl) = {
|
|||
{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4357) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4358) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4359) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4365) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4727) },
|
||||
{ 0, },
|
||||
};
|
||||
|
|
|
@ -93,6 +93,25 @@ struct bcma_device *bcma_find_core_unit(struct bcma_bus *bus, u16 coreid,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
bool bcma_wait_value(struct bcma_device *core, u16 reg, u32 mask, u32 value,
|
||||
int timeout)
|
||||
{
|
||||
unsigned long deadline = jiffies + timeout;
|
||||
u32 val;
|
||||
|
||||
do {
|
||||
val = bcma_read32(core, reg);
|
||||
if ((val & mask) == value)
|
||||
return true;
|
||||
cpu_relax();
|
||||
udelay(10);
|
||||
} while (!time_after_eq(jiffies, deadline));
|
||||
|
||||
bcma_warn(core->bus, "Timeout waiting for register 0x%04X!\n", reg);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static void bcma_release_core_dev(struct device *dev)
|
||||
{
|
||||
struct bcma_device *core = container_of(dev, struct bcma_device, dev);
|
||||
|
|
|
@ -72,12 +72,12 @@ static int bcma_fill_sprom_with_fallback(struct bcma_bus *bus,
|
|||
* R/W ops.
|
||||
**************************************************/
|
||||
|
||||
static void bcma_sprom_read(struct bcma_bus *bus, u16 offset, u16 *sprom)
|
||||
static void bcma_sprom_read(struct bcma_bus *bus, u16 offset, u16 *sprom,
|
||||
size_t words)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < SSB_SPROMSIZE_WORDS_R4; i++)
|
||||
sprom[i] = bcma_read16(bus->drv_cc.core,
|
||||
offset + (i * 2));
|
||||
for (i = 0; i < words; i++)
|
||||
sprom[i] = bcma_read16(bus->drv_cc.core, offset + (i * 2));
|
||||
}
|
||||
|
||||
/**************************************************
|
||||
|
@ -124,29 +124,29 @@ static inline u8 bcma_crc8(u8 crc, u8 data)
|
|||
return t[crc ^ data];
|
||||
}
|
||||
|
||||
static u8 bcma_sprom_crc(const u16 *sprom)
|
||||
static u8 bcma_sprom_crc(const u16 *sprom, size_t words)
|
||||
{
|
||||
int word;
|
||||
u8 crc = 0xFF;
|
||||
|
||||
for (word = 0; word < SSB_SPROMSIZE_WORDS_R4 - 1; word++) {
|
||||
for (word = 0; word < words - 1; word++) {
|
||||
crc = bcma_crc8(crc, sprom[word] & 0x00FF);
|
||||
crc = bcma_crc8(crc, (sprom[word] & 0xFF00) >> 8);
|
||||
}
|
||||
crc = bcma_crc8(crc, sprom[SSB_SPROMSIZE_WORDS_R4 - 1] & 0x00FF);
|
||||
crc = bcma_crc8(crc, sprom[words - 1] & 0x00FF);
|
||||
crc ^= 0xFF;
|
||||
|
||||
return crc;
|
||||
}
|
||||
|
||||
static int bcma_sprom_check_crc(const u16 *sprom)
|
||||
static int bcma_sprom_check_crc(const u16 *sprom, size_t words)
|
||||
{
|
||||
u8 crc;
|
||||
u8 expected_crc;
|
||||
u16 tmp;
|
||||
|
||||
crc = bcma_sprom_crc(sprom);
|
||||
tmp = sprom[SSB_SPROMSIZE_WORDS_R4 - 1] & SSB_SPROM_REVISION_CRC;
|
||||
crc = bcma_sprom_crc(sprom, words);
|
||||
tmp = sprom[words - 1] & SSB_SPROM_REVISION_CRC;
|
||||
expected_crc = tmp >> SSB_SPROM_REVISION_CRC_SHIFT;
|
||||
if (crc != expected_crc)
|
||||
return -EPROTO;
|
||||
|
@ -154,21 +154,25 @@ static int bcma_sprom_check_crc(const u16 *sprom)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int bcma_sprom_valid(const u16 *sprom)
|
||||
static int bcma_sprom_valid(struct bcma_bus *bus, const u16 *sprom,
|
||||
size_t words)
|
||||
{
|
||||
u16 revision;
|
||||
int err;
|
||||
|
||||
err = bcma_sprom_check_crc(sprom);
|
||||
err = bcma_sprom_check_crc(sprom, words);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
revision = sprom[SSB_SPROMSIZE_WORDS_R4 - 1] & SSB_SPROM_REVISION_REV;
|
||||
if (revision != 8 && revision != 9) {
|
||||
revision = sprom[words - 1] & SSB_SPROM_REVISION_REV;
|
||||
if (revision != 8 && revision != 9 && revision != 10) {
|
||||
pr_err("Unsupported SPROM revision: %d\n", revision);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
bus->sprom.revision = revision;
|
||||
bcma_debug(bus, "Found SPROM revision %d\n", revision);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -208,9 +212,6 @@ static void bcma_sprom_extract_r8(struct bcma_bus *bus, const u16 *sprom)
|
|||
BUILD_BUG_ON(ARRAY_SIZE(pwr_info_offset) !=
|
||||
ARRAY_SIZE(bus->sprom.core_pwr_info));
|
||||
|
||||
bus->sprom.revision = sprom[SSB_SPROMSIZE_WORDS_R4 - 1] &
|
||||
SSB_SPROM_REVISION_REV;
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
v = sprom[SPOFF(SSB_SPROM8_IL0MAC) + i];
|
||||
*(((__be16 *)bus->sprom.il0mac) + i) = cpu_to_be16(v);
|
||||
|
@ -502,7 +503,7 @@ static bool bcma_sprom_onchip_available(struct bcma_bus *bus)
|
|||
case BCMA_CHIP_ID_BCM4331:
|
||||
present = chip_status & BCMA_CC_CHIPST_4331_OTP_PRESENT;
|
||||
break;
|
||||
|
||||
case BCMA_CHIP_ID_BCM43142:
|
||||
case BCMA_CHIP_ID_BCM43224:
|
||||
case BCMA_CHIP_ID_BCM43225:
|
||||
/* for these chips OTP is always available */
|
||||
|
@ -550,7 +551,9 @@ int bcma_sprom_get(struct bcma_bus *bus)
|
|||
{
|
||||
u16 offset = BCMA_CC_SPROM;
|
||||
u16 *sprom;
|
||||
int err = 0;
|
||||
size_t sprom_sizes[] = { SSB_SPROMSIZE_WORDS_R4,
|
||||
SSB_SPROMSIZE_WORDS_R10, };
|
||||
int i, err = 0;
|
||||
|
||||
if (!bus->drv_cc.core)
|
||||
return -EOPNOTSUPP;
|
||||
|
@ -579,32 +582,37 @@ int bcma_sprom_get(struct bcma_bus *bus)
|
|||
}
|
||||
}
|
||||
|
||||
sprom = kcalloc(SSB_SPROMSIZE_WORDS_R4, sizeof(u16),
|
||||
GFP_KERNEL);
|
||||
if (!sprom)
|
||||
return -ENOMEM;
|
||||
|
||||
if (bus->chipinfo.id == BCMA_CHIP_ID_BCM4331 ||
|
||||
bus->chipinfo.id == BCMA_CHIP_ID_BCM43431)
|
||||
bcma_chipco_bcm4331_ext_pa_lines_ctl(&bus->drv_cc, false);
|
||||
|
||||
bcma_debug(bus, "SPROM offset 0x%x\n", offset);
|
||||
bcma_sprom_read(bus, offset, sprom);
|
||||
for (i = 0; i < ARRAY_SIZE(sprom_sizes); i++) {
|
||||
size_t words = sprom_sizes[i];
|
||||
|
||||
sprom = kcalloc(words, sizeof(u16), GFP_KERNEL);
|
||||
if (!sprom)
|
||||
return -ENOMEM;
|
||||
|
||||
bcma_sprom_read(bus, offset, sprom, words);
|
||||
err = bcma_sprom_valid(bus, sprom, words);
|
||||
if (!err)
|
||||
break;
|
||||
|
||||
kfree(sprom);
|
||||
}
|
||||
|
||||
if (bus->chipinfo.id == BCMA_CHIP_ID_BCM4331 ||
|
||||
bus->chipinfo.id == BCMA_CHIP_ID_BCM43431)
|
||||
bcma_chipco_bcm4331_ext_pa_lines_ctl(&bus->drv_cc, true);
|
||||
|
||||
err = bcma_sprom_valid(sprom);
|
||||
if (err) {
|
||||
bcma_warn(bus, "invalid sprom read from the PCIe card, try to use fallback sprom\n");
|
||||
bcma_warn(bus, "Invalid SPROM read from the PCIe card, trying to use fallback SPROM\n");
|
||||
err = bcma_fill_sprom_with_fallback(bus, &bus->sprom);
|
||||
goto out;
|
||||
} else {
|
||||
bcma_sprom_extract_r8(bus, sprom);
|
||||
kfree(sprom);
|
||||
}
|
||||
|
||||
bcma_sprom_extract_r8(bus, sprom);
|
||||
|
||||
out:
|
||||
kfree(sprom);
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -554,6 +554,7 @@ static int btmrvl_sdio_card_to_host(struct btmrvl_private *priv)
|
|||
skb = bt_skb_alloc(num_blocks * blksz + BTSDIO_DMA_ALIGN, GFP_ATOMIC);
|
||||
if (skb == NULL) {
|
||||
BT_ERR("No free skb");
|
||||
ret = -ENOMEM;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue