You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1674 commits)
qlcnic: adding co maintainer
ixgbe: add support for active DA cables
ixgbe: dcb, do not tag tc_prio_control frames
ixgbe: fix ixgbe_tx_is_paused logic
ixgbe: always enable vlan strip/insert when DCB is enabled
ixgbe: remove some redundant code in setting FCoE FIP filter
ixgbe: fix wrong offset to fc_frame_header in ixgbe_fcoe_ddp
ixgbe: fix header len when unsplit packet overflows to data buffer
ipv6: Never schedule DAD timer on dead address
ipv6: Use POSTDAD state
ipv6: Use state_lock to protect ifa state
ipv6: Replace inet6_ifaddr->dead with state
cxgb4: notify upper drivers if the device is already up when they load
cxgb4: keep interrupts available when the ports are brought down
cxgb4: fix initial addition of MAC address
cnic: Return SPQ credit to bnx2x after ring setup and shutdown.
cnic: Convert cnic_local_flags to atomic ops.
can: Fix SJA1000 command register writes on SMP systems
bridge: fix build for CONFIG_SYSFS disabled
ARCNET: Limit com20020 PCI ID matches for SOHARD cards
...
Fix up various conflicts with pcmcia tree drivers/net/
{pcmcia/3c589_cs.c, wireless/orinoco/orinoco_cs.c and
wireless/orinoco/spectrum_cs.c} and feature removal
(Documentation/feature-removal-schedule.txt).
Also fix a non-content conflict due to pm_qos_requirement getting
renamed in the PM tree (now pm_qos_request) in net/mac80211/scan.c
This commit is contained in:
@@ -0,0 +1,29 @@
|
|||||||
|
rfkill - radio frequency (RF) connector kill switch support
|
||||||
|
|
||||||
|
For details to this subsystem look at Documentation/rfkill.txt.
|
||||||
|
|
||||||
|
What: /sys/class/rfkill/rfkill[0-9]+/state
|
||||||
|
Date: 09-Jul-2007
|
||||||
|
KernelVersion v2.6.22
|
||||||
|
Contact: linux-wireless@vger.kernel.org
|
||||||
|
Description: Current state of the transmitter.
|
||||||
|
This file is deprecated and sheduled to be removed in 2014,
|
||||||
|
because its not possible to express the 'soft and hard block'
|
||||||
|
state of the rfkill driver.
|
||||||
|
Values: A numeric value.
|
||||||
|
0: RFKILL_STATE_SOFT_BLOCKED
|
||||||
|
transmitter is turned off by software
|
||||||
|
1: RFKILL_STATE_UNBLOCKED
|
||||||
|
transmitter is (potentially) active
|
||||||
|
2: RFKILL_STATE_HARD_BLOCKED
|
||||||
|
transmitter is forced off by something outside of
|
||||||
|
the driver's control.
|
||||||
|
|
||||||
|
What: /sys/class/rfkill/rfkill[0-9]+/claim
|
||||||
|
Date: 09-Jul-2007
|
||||||
|
KernelVersion v2.6.22
|
||||||
|
Contact: linux-wireless@vger.kernel.org
|
||||||
|
Description: This file is deprecated because there no longer is a way to
|
||||||
|
claim just control over a single rfkill instance.
|
||||||
|
This file is scheduled to be removed in 2012.
|
||||||
|
Values: 0: Kernel handles events
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
rfkill - radio frequency (RF) connector kill switch support
|
||||||
|
|
||||||
|
For details to this subsystem look at Documentation/rfkill.txt.
|
||||||
|
|
||||||
|
For the deprecated /sys/class/rfkill/*/state and
|
||||||
|
/sys/class/rfkill/*/claim knobs of this interface look in
|
||||||
|
Documentation/ABI/obsolete/sysfs-class-rfkill.
|
||||||
|
|
||||||
|
What: /sys/class/rfkill
|
||||||
|
Date: 09-Jul-2007
|
||||||
|
KernelVersion: v2.6.22
|
||||||
|
Contact: linux-wireless@vger.kernel.org,
|
||||||
|
Description: The rfkill class subsystem folder.
|
||||||
|
Each registered rfkill driver is represented by an rfkillX
|
||||||
|
subfolder (X being an integer > 0).
|
||||||
|
|
||||||
|
|
||||||
|
What: /sys/class/rfkill/rfkill[0-9]+/name
|
||||||
|
Date: 09-Jul-2007
|
||||||
|
KernelVersion v2.6.22
|
||||||
|
Contact: linux-wireless@vger.kernel.org
|
||||||
|
Description: Name assigned by driver to this key (interface or driver name).
|
||||||
|
Values: arbitrary string.
|
||||||
|
|
||||||
|
|
||||||
|
What: /sys/class/rfkill/rfkill[0-9]+/type
|
||||||
|
Date: 09-Jul-2007
|
||||||
|
KernelVersion v2.6.22
|
||||||
|
Contact: linux-wireless@vger.kernel.org
|
||||||
|
Description: Driver type string ("wlan", "bluetooth", etc).
|
||||||
|
Values: See include/linux/rfkill.h.
|
||||||
|
|
||||||
|
|
||||||
|
What: /sys/class/rfkill/rfkill[0-9]+/persistent
|
||||||
|
Date: 09-Jul-2007
|
||||||
|
KernelVersion v2.6.22
|
||||||
|
Contact: linux-wireless@vger.kernel.org
|
||||||
|
Description: Whether the soft blocked state is initialised from non-volatile
|
||||||
|
storage at startup.
|
||||||
|
Values: A numeric value.
|
||||||
|
0: false
|
||||||
|
1: true
|
||||||
|
|
||||||
|
|
||||||
|
What: /sys/class/rfkill/rfkill[0-9]+/hard
|
||||||
|
Date: 12-March-2010
|
||||||
|
KernelVersion v2.6.34
|
||||||
|
Contact: linux-wireless@vger.kernel.org
|
||||||
|
Description: Current hardblock state. This file is read only.
|
||||||
|
Values: A numeric value.
|
||||||
|
0: inactive
|
||||||
|
The transmitter is (potentially) active.
|
||||||
|
1: active
|
||||||
|
The transmitter is forced off by something outside of
|
||||||
|
the driver's control.
|
||||||
|
|
||||||
|
|
||||||
|
What: /sys/class/rfkill/rfkill[0-9]+/soft
|
||||||
|
Date: 12-March-2010
|
||||||
|
KernelVersion v2.6.34
|
||||||
|
Contact: linux-wireless@vger.kernel.org
|
||||||
|
Description: Current softblock state. This file is read and write.
|
||||||
|
Values: A numeric value.
|
||||||
|
0: inactive
|
||||||
|
The transmitter is (potentially) active.
|
||||||
|
1: active
|
||||||
|
The transmitter is turned off by software.
|
||||||
@@ -49,7 +49,7 @@ o oprofile 0.9 # oprofiled --version
|
|||||||
o udev 081 # udevinfo -V
|
o udev 081 # udevinfo -V
|
||||||
o grub 0.93 # grub --version
|
o grub 0.93 # grub --version
|
||||||
o mcelog 0.6
|
o mcelog 0.6
|
||||||
o iptables 1.4.1 # iptables -V
|
o iptables 1.4.2 # iptables -V
|
||||||
|
|
||||||
|
|
||||||
Kernel compilation
|
Kernel compilation
|
||||||
|
|||||||
@@ -241,16 +241,6 @@ Who: Thomas Gleixner <tglx@linutronix.de>
|
|||||||
|
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
What (Why):
|
|
||||||
- xt_recent: the old ipt_recent proc dir
|
|
||||||
(superseded by /proc/net/xt_recent)
|
|
||||||
|
|
||||||
When: January 2009 or Linux 2.7.0, whichever comes first
|
|
||||||
Why: Superseded by newer revisions or modules
|
|
||||||
Who: Jan Engelhardt <jengelh@computergmbh.de>
|
|
||||||
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
What: GPIO autorequest on gpio_direction_{input,output}() in gpiolib
|
What: GPIO autorequest on gpio_direction_{input,output}() in gpiolib
|
||||||
When: February 2010
|
When: February 2010
|
||||||
Why: All callers should use explicit gpio_request()/gpio_free().
|
Why: All callers should use explicit gpio_request()/gpio_free().
|
||||||
@@ -520,6 +510,24 @@ Who: Hans de Goede <hdegoede@redhat.com>
|
|||||||
|
|
||||||
----------------------------
|
----------------------------
|
||||||
|
|
||||||
|
What: sysfs-class-rfkill state file
|
||||||
|
When: Feb 2014
|
||||||
|
Files: net/rfkill/core.c
|
||||||
|
Why: Documented as obsolete since Feb 2010. This file is limited to 3
|
||||||
|
states while the rfkill drivers can have 4 states.
|
||||||
|
Who: anybody or Florian Mickler <florian@mickler.org>
|
||||||
|
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
What: sysfs-class-rfkill claim file
|
||||||
|
When: Feb 2012
|
||||||
|
Files: net/rfkill/core.c
|
||||||
|
Why: It is not possible to claim an rfkill driver since 2007. This is
|
||||||
|
Documented as obsolete since Feb 2010.
|
||||||
|
Who: anybody or Florian Mickler <florian@mickler.org>
|
||||||
|
|
||||||
|
----------------------------
|
||||||
|
|
||||||
What: capifs
|
What: capifs
|
||||||
When: February 2011
|
When: February 2011
|
||||||
Files: drivers/isdn/capi/capifs.*
|
Files: drivers/isdn/capi/capifs.*
|
||||||
@@ -579,6 +587,35 @@ Who: Len Brown <len.brown@intel.com>
|
|||||||
|
|
||||||
----------------------------
|
----------------------------
|
||||||
|
|
||||||
|
What: iwlwifi 50XX module parameters
|
||||||
|
When: 2.6.40
|
||||||
|
Why: The "..50" modules parameters were used to configure 5000 series and
|
||||||
|
up devices; different set of module parameters also available for 4965
|
||||||
|
with same functionalities. Consolidate both set into single place
|
||||||
|
in drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||||
|
|
||||||
|
Who: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||||
|
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
What: iwl4965 alias support
|
||||||
|
When: 2.6.40
|
||||||
|
Why: Internal alias support has been present in module-init-tools for some
|
||||||
|
time, the MODULE_ALIAS("iwl4965") boilerplate aliases can be removed
|
||||||
|
with no impact.
|
||||||
|
|
||||||
|
Who: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||||
|
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
What: xt_NOTRACK
|
||||||
|
Files: net/netfilter/xt_NOTRACK.c
|
||||||
|
When: April 2011
|
||||||
|
Why: Superseded by xt_CT
|
||||||
|
Who: Netfilter developer team <netfilter-devel@vger.kernel.org>
|
||||||
|
|
||||||
|
---------------------------
|
||||||
|
|
||||||
What: video4linux /dev/vtx teletext API support
|
What: video4linux /dev/vtx teletext API support
|
||||||
When: 2.6.35
|
When: 2.6.35
|
||||||
Files: drivers/media/video/saa5246a.c drivers/media/video/saa5249.c
|
Files: drivers/media/video/saa5246a.c drivers/media/video/saa5249.c
|
||||||
|
|||||||
@@ -0,0 +1,212 @@
|
|||||||
|
Linux CAIF
|
||||||
|
===========
|
||||||
|
copyright (C) ST-Ericsson AB 2010
|
||||||
|
Author: Sjur Brendeland/ sjur.brandeland@stericsson.com
|
||||||
|
License terms: GNU General Public License (GPL) version 2
|
||||||
|
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
------------
|
||||||
|
CAIF is a MUX protocol used by ST-Ericsson cellular modems for
|
||||||
|
communication between Modem and host. The host processes can open virtual AT
|
||||||
|
channels, initiate GPRS Data connections, Video channels and Utility Channels.
|
||||||
|
The Utility Channels are general purpose pipes between modem and host.
|
||||||
|
|
||||||
|
ST-Ericsson modems support a number of transports between modem
|
||||||
|
and host. Currently, UART and Loopback are available for Linux.
|
||||||
|
|
||||||
|
|
||||||
|
Architecture:
|
||||||
|
------------
|
||||||
|
The implementation of CAIF is divided into:
|
||||||
|
* CAIF Socket Layer, Kernel API, and Net Device.
|
||||||
|
* CAIF Core Protocol Implementation
|
||||||
|
* CAIF Link Layer, implemented as NET devices.
|
||||||
|
|
||||||
|
|
||||||
|
RTNL
|
||||||
|
!
|
||||||
|
! +------+ +------+ +------+
|
||||||
|
! +------+! +------+! +------+!
|
||||||
|
! ! Sock !! !Kernel!! ! Net !!
|
||||||
|
! ! API !+ ! API !+ ! Dev !+ <- CAIF Client APIs
|
||||||
|
! +------+ +------! +------+
|
||||||
|
! ! ! !
|
||||||
|
! +----------!----------+
|
||||||
|
! +------+ <- CAIF Protocol Implementation
|
||||||
|
+-------> ! CAIF !
|
||||||
|
! Core !
|
||||||
|
+------+
|
||||||
|
+--------!--------+
|
||||||
|
! !
|
||||||
|
+------+ +-----+
|
||||||
|
! ! ! TTY ! <- Link Layer (Net Devices)
|
||||||
|
+------+ +-----+
|
||||||
|
|
||||||
|
|
||||||
|
Using the Kernel API
|
||||||
|
----------------------
|
||||||
|
The Kernel API is used for accessing CAIF channels from the
|
||||||
|
kernel.
|
||||||
|
The user of the API has to implement two callbacks for receive
|
||||||
|
and control.
|
||||||
|
The receive callback gives a CAIF packet as a SKB. The control
|
||||||
|
callback will
|
||||||
|
notify of channel initialization complete, and flow-on/flow-
|
||||||
|
off.
|
||||||
|
|
||||||
|
|
||||||
|
struct caif_device caif_dev = {
|
||||||
|
.caif_config = {
|
||||||
|
.name = "MYDEV"
|
||||||
|
.type = CAIF_CHTY_AT
|
||||||
|
}
|
||||||
|
.receive_cb = my_receive,
|
||||||
|
.control_cb = my_control,
|
||||||
|
};
|
||||||
|
caif_add_device(&caif_dev);
|
||||||
|
caif_transmit(&caif_dev, skb);
|
||||||
|
|
||||||
|
See the caif_kernel.h for details about the CAIF kernel API.
|
||||||
|
|
||||||
|
|
||||||
|
I M P L E M E N T A T I O N
|
||||||
|
===========================
|
||||||
|
===========================
|
||||||
|
|
||||||
|
CAIF Core Protocol Layer
|
||||||
|
=========================================
|
||||||
|
|
||||||
|
CAIF Core layer implements the CAIF protocol as defined by ST-Ericsson.
|
||||||
|
It implements the CAIF protocol stack in a layered approach, where
|
||||||
|
each layer described in the specification is implemented as a separate layer.
|
||||||
|
The architecture is inspired by the design patterns "Protocol Layer" and
|
||||||
|
"Protocol Packet".
|
||||||
|
|
||||||
|
== CAIF structure ==
|
||||||
|
The Core CAIF implementation contains:
|
||||||
|
- Simple implementation of CAIF.
|
||||||
|
- Layered architecture (a la Streams), each layer in the CAIF
|
||||||
|
specification is implemented in a separate c-file.
|
||||||
|
- Clients must implement PHY layer to access physical HW
|
||||||
|
with receive and transmit functions.
|
||||||
|
- Clients must call configuration function to add PHY layer.
|
||||||
|
- Clients must implement CAIF layer to consume/produce
|
||||||
|
CAIF payload with receive and transmit functions.
|
||||||
|
- Clients must call configuration function to add and connect the
|
||||||
|
Client layer.
|
||||||
|
- When receiving / transmitting CAIF Packets (cfpkt), ownership is passed
|
||||||
|
to the called function (except for framing layers' receive functions
|
||||||
|
or if a transmit function returns an error, in which case the caller
|
||||||
|
must free the packet).
|
||||||
|
|
||||||
|
Layered Architecture
|
||||||
|
--------------------
|
||||||
|
The CAIF protocol can be divided into two parts: Support functions and Protocol
|
||||||
|
Implementation. The support functions include:
|
||||||
|
|
||||||
|
- CFPKT CAIF Packet. Implementation of CAIF Protocol Packet. The
|
||||||
|
CAIF Packet has functions for creating, destroying and adding content
|
||||||
|
and for adding/extracting header and trailers to protocol packets.
|
||||||
|
|
||||||
|
- CFLST CAIF list implementation.
|
||||||
|
|
||||||
|
- CFGLUE CAIF Glue. Contains OS Specifics, such as memory
|
||||||
|
allocation, endianness, etc.
|
||||||
|
|
||||||
|
The CAIF Protocol implementation contains:
|
||||||
|
|
||||||
|
- CFCNFG CAIF Configuration layer. Configures the CAIF Protocol
|
||||||
|
Stack and provides a Client interface for adding Link-Layer and
|
||||||
|
Driver interfaces on top of the CAIF Stack.
|
||||||
|
|
||||||
|
- CFCTRL CAIF Control layer. Encodes and Decodes control messages
|
||||||
|
such as enumeration and channel setup. Also matches request and
|
||||||
|
response messages.
|
||||||
|
|
||||||
|
- CFSERVL General CAIF Service Layer functionality; handles flow
|
||||||
|
control and remote shutdown requests.
|
||||||
|
|
||||||
|
- CFVEI CAIF VEI layer. Handles CAIF AT Channels on VEI (Virtual
|
||||||
|
External Interface). This layer encodes/decodes VEI frames.
|
||||||
|
|
||||||
|
- CFDGML CAIF Datagram layer. Handles CAIF Datagram layer (IP
|
||||||
|
traffic), encodes/decodes Datagram frames.
|
||||||
|
|
||||||
|
- CFMUX CAIF Mux layer. Handles multiplexing between multiple
|
||||||
|
physical bearers and multiple channels such as VEI, Datagram, etc.
|
||||||
|
The MUX keeps track of the existing CAIF Channels and
|
||||||
|
Physical Instances and selects the apropriate instance based
|
||||||
|
on Channel-Id and Physical-ID.
|
||||||
|
|
||||||
|
- CFFRML CAIF Framing layer. Handles Framing i.e. Frame length
|
||||||
|
and frame checksum.
|
||||||
|
|
||||||
|
- CFSERL CAIF Serial layer. Handles concatenation/split of frames
|
||||||
|
into CAIF Frames with correct length.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
+---------+
|
||||||
|
| Config |
|
||||||
|
| CFCNFG |
|
||||||
|
+---------+
|
||||||
|
!
|
||||||
|
+---------+ +---------+ +---------+
|
||||||
|
| AT | | Control | | Datagram|
|
||||||
|
| CFVEIL | | CFCTRL | | CFDGML |
|
||||||
|
+---------+ +---------+ +---------+
|
||||||
|
\_____________!______________/
|
||||||
|
!
|
||||||
|
+---------+
|
||||||
|
| MUX |
|
||||||
|
| |
|
||||||
|
+---------+
|
||||||
|
_____!_____
|
||||||
|
/ \
|
||||||
|
+---------+ +---------+
|
||||||
|
| CFFRML | | CFFRML |
|
||||||
|
| Framing | | Framing |
|
||||||
|
+---------+ +---------+
|
||||||
|
! !
|
||||||
|
+---------+ +---------+
|
||||||
|
| | | Serial |
|
||||||
|
| | | CFSERL |
|
||||||
|
+---------+ +---------+
|
||||||
|
|
||||||
|
|
||||||
|
In this layered approach the following "rules" apply.
|
||||||
|
- All layers embed the same structure "struct cflayer"
|
||||||
|
- A layer does not depend on any other layer's private data.
|
||||||
|
- Layers are stacked by setting the pointers
|
||||||
|
layer->up , layer->dn
|
||||||
|
- In order to send data upwards, each layer should do
|
||||||
|
layer->up->receive(layer->up, packet);
|
||||||
|
- In order to send data downwards, each layer should do
|
||||||
|
layer->dn->transmit(layer->dn, packet);
|
||||||
|
|
||||||
|
|
||||||
|
Linux Driver Implementation
|
||||||
|
===========================
|
||||||
|
|
||||||
|
Linux GPRS Net Device and CAIF socket are implemented on top of the
|
||||||
|
CAIF Core protocol. The Net device and CAIF socket have an instance of
|
||||||
|
'struct cflayer', just like the CAIF Core protocol stack.
|
||||||
|
Net device and Socket implement the 'receive()' function defined by
|
||||||
|
'struct cflayer', just like the rest of the CAIF stack. In this way, transmit and
|
||||||
|
receive of packets is handled as by the rest of the layers: the 'dn->transmit()'
|
||||||
|
function is called in order to transmit data.
|
||||||
|
|
||||||
|
The layer on top of the CAIF Core implementation is
|
||||||
|
sometimes referred to as the "Client layer".
|
||||||
|
|
||||||
|
|
||||||
|
Configuration of Link Layer
|
||||||
|
---------------------------
|
||||||
|
The Link Layer is implemented as Linux net devices (struct net_device).
|
||||||
|
Payload handling and registration is done using standard Linux mechanisms.
|
||||||
|
|
||||||
|
The CAIF Protocol relies on a loss-less link layer without implementing
|
||||||
|
retransmission. This implies that packet drops must not happen.
|
||||||
|
Therefore a flow-control mechanism is implemented where the physical
|
||||||
|
interface can initiate flow stop for all CAIF Channels.
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
Copyright (C) ST-Ericsson AB 2010
|
||||||
|
Author: Sjur Brendeland/ sjur.brandeland@stericsson.com
|
||||||
|
License terms: GNU General Public License (GPL) version 2
|
||||||
|
---------------------------------------------------------
|
||||||
|
|
||||||
|
=== Start ===
|
||||||
|
If you have compiled CAIF for modules do:
|
||||||
|
|
||||||
|
$modprobe crc_ccitt
|
||||||
|
$modprobe caif
|
||||||
|
$modprobe caif_socket
|
||||||
|
$modprobe chnl_net
|
||||||
|
|
||||||
|
|
||||||
|
=== Preparing the setup with a STE modem ===
|
||||||
|
|
||||||
|
If you are working on integration of CAIF you should make sure
|
||||||
|
that the kernel is built with module support.
|
||||||
|
|
||||||
|
There are some things that need to be tweaked to get the host TTY correctly
|
||||||
|
set up to talk to the modem.
|
||||||
|
Since the CAIF stack is running in the kernel and we want to use the existing
|
||||||
|
TTY, we are installing our physical serial driver as a line discipline above
|
||||||
|
the TTY device.
|
||||||
|
|
||||||
|
To achieve this we need to install the N_CAIF ldisc from user space.
|
||||||
|
The benefit is that we can hook up to any TTY.
|
||||||
|
|
||||||
|
The use of Start-of-frame-extension (STX) must also be set as
|
||||||
|
module parameter "ser_use_stx".
|
||||||
|
|
||||||
|
Normally Frame Checksum is always used on UART, but this is also provided as a
|
||||||
|
module parameter "ser_use_fcs".
|
||||||
|
|
||||||
|
$ modprobe caif_serial ser_ttyname=/dev/ttyS0 ser_use_stx=yes
|
||||||
|
$ ifconfig caif_ttyS0 up
|
||||||
|
|
||||||
|
PLEASE NOTE: There is a limitation in Android shell.
|
||||||
|
It only accepts one argument to insmod/modprobe!
|
||||||
|
|
||||||
|
=== Trouble shooting ===
|
||||||
|
|
||||||
|
There are debugfs parameters provided for serial communication.
|
||||||
|
/sys/kernel/debug/caif_serial/<tty-name>/
|
||||||
|
|
||||||
|
* ser_state: Prints the bit-mask status where
|
||||||
|
- 0x02 means SENDING, this is a transient state.
|
||||||
|
- 0x10 means FLOW_OFF_SENT, i.e. the previous frame has not been sent
|
||||||
|
and is blocking further send operation. Flow OFF has been propagated
|
||||||
|
to all CAIF Channels using this TTY.
|
||||||
|
|
||||||
|
* tty_status: Prints the bit-mask tty status information
|
||||||
|
- 0x01 - tty->warned is on.
|
||||||
|
- 0x02 - tty->low_latency is on.
|
||||||
|
- 0x04 - tty->packed is on.
|
||||||
|
- 0x08 - tty->flow_stopped is on.
|
||||||
|
- 0x10 - tty->hw_stopped is on.
|
||||||
|
- 0x20 - tty->stopped is on.
|
||||||
|
|
||||||
|
* last_tx_msg: Binary blob Prints the last transmitted frame.
|
||||||
|
This can be printed with
|
||||||
|
$od --format=x1 /sys/kernel/debug/caif_serial/<tty>/last_rx_msg.
|
||||||
|
The first two tx messages sent look like this. Note: The initial
|
||||||
|
byte 02 is start of frame extension (STX) used for re-syncing
|
||||||
|
upon errors.
|
||||||
|
|
||||||
|
- Enumeration:
|
||||||
|
0000000 02 05 00 00 03 01 d2 02
|
||||||
|
| | | | | |
|
||||||
|
STX(1) | | | |
|
||||||
|
Length(2)| | |
|
||||||
|
Control Channel(1)
|
||||||
|
Command:Enumeration(1)
|
||||||
|
Link-ID(1)
|
||||||
|
Checksum(2)
|
||||||
|
- Channel Setup:
|
||||||
|
0000000 02 07 00 00 00 21 a1 00 48 df
|
||||||
|
| | | | | | | |
|
||||||
|
STX(1) | | | | | |
|
||||||
|
Length(2)| | | | |
|
||||||
|
Control Channel(1)
|
||||||
|
Command:Channel Setup(1)
|
||||||
|
Channel Type(1)
|
||||||
|
Priority and Link-ID(1)
|
||||||
|
Endpoint(1)
|
||||||
|
Checksum(2)
|
||||||
|
|
||||||
|
* last_rx_msg: Prints the last transmitted frame.
|
||||||
|
The RX messages for LinkSetup look almost identical but they have the
|
||||||
|
bit 0x20 set in the command bit, and Channel Setup has added one byte
|
||||||
|
before Checksum containing Channel ID.
|
||||||
|
NOTE: Several CAIF Messages might be concatenated. The maximum debug
|
||||||
|
buffer size is 128 bytes.
|
||||||
|
|
||||||
|
== Error Scenarios:
|
||||||
|
- last_tx_msg contains channel setup message and last_rx_msg is empty ->
|
||||||
|
The host seems to be able to send over the UART, at least the CAIF ldisc get
|
||||||
|
notified that sending is completed.
|
||||||
|
|
||||||
|
- last_tx_msg contains enumeration message and last_rx_msg is empty ->
|
||||||
|
The host is not able to send the message from UART, the tty has not been
|
||||||
|
able to complete the transmit operation.
|
||||||
|
|
||||||
|
- if /sys/kernel/debug/caif_serial/<tty>/tty_status is non-zero there
|
||||||
|
might be problems transmitting over UART.
|
||||||
|
E.g. host and modem wiring is not correct you will typically see
|
||||||
|
tty_status = 0x10 (hw_stopped) and ser_state = 0x10 (FLOW_OFF_SENT).
|
||||||
|
You will probably see the enumeration message in last_tx_message
|
||||||
|
and empty last_rx_message.
|
||||||
@@ -588,6 +588,37 @@ ip_local_port_range - 2 INTEGERS
|
|||||||
(i.e. by default) range 1024-4999 is enough to issue up to
|
(i.e. by default) range 1024-4999 is enough to issue up to
|
||||||
2000 connections per second to systems supporting timestamps.
|
2000 connections per second to systems supporting timestamps.
|
||||||
|
|
||||||
|
ip_local_reserved_ports - list of comma separated ranges
|
||||||
|
Specify the ports which are reserved for known third-party
|
||||||
|
applications. These ports will not be used by automatic port
|
||||||
|
assignments (e.g. when calling connect() or bind() with port
|
||||||
|
number 0). Explicit port allocation behavior is unchanged.
|
||||||
|
|
||||||
|
The format used for both input and output is a comma separated
|
||||||
|
list of ranges (e.g. "1,2-4,10-10" for ports 1, 2, 3, 4 and
|
||||||
|
10). Writing to the file will clear all previously reserved
|
||||||
|
ports and update the current list with the one given in the
|
||||||
|
input.
|
||||||
|
|
||||||
|
Note that ip_local_port_range and ip_local_reserved_ports
|
||||||
|
settings are independent and both are considered by the kernel
|
||||||
|
when determining which ports are available for automatic port
|
||||||
|
assignments.
|
||||||
|
|
||||||
|
You can reserve ports which are not in the current
|
||||||
|
ip_local_port_range, e.g.:
|
||||||
|
|
||||||
|
$ cat /proc/sys/net/ipv4/ip_local_port_range
|
||||||
|
32000 61000
|
||||||
|
$ cat /proc/sys/net/ipv4/ip_local_reserved_ports
|
||||||
|
8080,9148
|
||||||
|
|
||||||
|
although this is redundant. However such a setting is useful
|
||||||
|
if later the port range is changed to a value that will
|
||||||
|
include the reserved ports.
|
||||||
|
|
||||||
|
Default: Empty
|
||||||
|
|
||||||
ip_nonlocal_bind - BOOLEAN
|
ip_nonlocal_bind - BOOLEAN
|
||||||
If set, allows processes to bind() to non-local IP addresses,
|
If set, allows processes to bind() to non-local IP addresses,
|
||||||
which can be quite useful - but may break some applications.
|
which can be quite useful - but may break some applications.
|
||||||
|
|||||||
@@ -1,44 +1,95 @@
|
|||||||
This brief document describes how to use the kernel's PPPoL2TP driver
|
This document describes how to use the kernel's L2TP drivers to
|
||||||
to provide L2TP functionality. L2TP is a protocol that tunnels one or
|
provide L2TP functionality. L2TP is a protocol that tunnels one or
|
||||||
more PPP sessions over a UDP tunnel. It is commonly used for VPNs
|
more sessions over an IP tunnel. It is commonly used for VPNs
|
||||||
(L2TP/IPSec) and by ISPs to tunnel subscriber PPP sessions over an IP
|
(L2TP/IPSec) and by ISPs to tunnel subscriber PPP sessions over an IP
|
||||||
network infrastructure.
|
network infrastructure. With L2TPv3, it is also useful as a Layer-2
|
||||||
|
tunneling infrastructure.
|
||||||
|
|
||||||
|
Features
|
||||||
|
========
|
||||||
|
|
||||||
|
L2TPv2 (PPP over L2TP (UDP tunnels)).
|
||||||
|
L2TPv3 ethernet pseudowires.
|
||||||
|
L2TPv3 PPP pseudowires.
|
||||||
|
L2TPv3 IP encapsulation.
|
||||||
|
Netlink sockets for L2TPv3 configuration management.
|
||||||
|
|
||||||
|
History
|
||||||
|
=======
|
||||||
|
|
||||||
|
The original pppol2tp driver was introduced in 2.6.23 and provided
|
||||||
|
L2TPv2 functionality (rfc2661). L2TPv2 is used to tunnel one or more PPP
|
||||||
|
sessions over a UDP tunnel.
|
||||||
|
|
||||||
|
L2TPv3 (rfc3931) changes the protocol to allow different frame types
|
||||||
|
to be passed over an L2TP tunnel by moving the PPP-specific parts of
|
||||||
|
the protocol out of the core L2TP packet headers. Each frame type is
|
||||||
|
known as a pseudowire type. Ethernet, PPP, HDLC, Frame Relay and ATM
|
||||||
|
pseudowires for L2TP are defined in separate RFC standards. Another
|
||||||
|
change for L2TPv3 is that it can be carried directly over IP with no
|
||||||
|
UDP header (UDP is optional). It is also possible to create static
|
||||||
|
unmanaged L2TPv3 tunnels manually without a control protocol
|
||||||
|
(userspace daemon) to manage them.
|
||||||
|
|
||||||
|
To support L2TPv3, the original pppol2tp driver was split up to
|
||||||
|
separate the L2TP and PPP functionality. Existing L2TPv2 userspace
|
||||||
|
apps should be unaffected as the original pppol2tp sockets API is
|
||||||
|
retained. L2TPv3, however, uses netlink to manage L2TPv3 tunnels and
|
||||||
|
sessions.
|
||||||
|
|
||||||
Design
|
Design
|
||||||
======
|
======
|
||||||
|
|
||||||
The PPPoL2TP driver, drivers/net/pppol2tp.c, provides a mechanism by
|
The L2TP protocol separates control and data frames. The L2TP kernel
|
||||||
which PPP frames carried through an L2TP session are passed through
|
drivers handle only L2TP data frames; control frames are always
|
||||||
the kernel's PPP subsystem. The standard PPP daemon, pppd, handles all
|
handled by userspace. L2TP control frames carry messages between L2TP
|
||||||
PPP interaction with the peer. PPP network interfaces are created for
|
clients/servers and are used to setup / teardown tunnels and
|
||||||
each local PPP endpoint.
|
sessions. An L2TP client or server is implemented in userspace.
|
||||||
|
|
||||||
The L2TP protocol http://www.faqs.org/rfcs/rfc2661.html defines L2TP
|
Each L2TP tunnel is implemented using a UDP or L2TPIP socket; L2TPIP
|
||||||
control and data frames. L2TP control frames carry messages between
|
provides L2TPv3 IP encapsulation (no UDP) and is implemented using a
|
||||||
L2TP clients/servers and are used to setup / teardown tunnels and
|
new l2tpip socket family. The tunnel socket is typically created by
|
||||||
sessions. An L2TP client or server is implemented in userspace and
|
userspace, though for unmanaged L2TPv3 tunnels, the socket can also be
|
||||||
will use a regular UDP socket per tunnel. L2TP data frames carry PPP
|
created by the kernel. Each L2TP session (pseudowire) gets a network
|
||||||
frames, which may be PPP control or PPP data. The kernel's PPP
|
interface instance. In the case of PPP, these interfaces are created
|
||||||
|
indirectly by pppd using a pppol2tp socket. In the case of ethernet,
|
||||||
|
the netdevice is created upon a netlink request to create an L2TPv3
|
||||||
|
ethernet pseudowire.
|
||||||
|
|
||||||
|
For PPP, the PPPoL2TP driver, net/l2tp/l2tp_ppp.c, provides a
|
||||||
|
mechanism by which PPP frames carried through an L2TP session are
|
||||||
|
passed through the kernel's PPP subsystem. The standard PPP daemon,
|
||||||
|
pppd, handles all PPP interaction with the peer. PPP network
|
||||||
|
interfaces are created for each local PPP endpoint. The kernel's PPP
|
||||||
subsystem arranges for PPP control frames to be delivered to pppd,
|
subsystem arranges for PPP control frames to be delivered to pppd,
|
||||||
while data frames are forwarded as usual.
|
while data frames are forwarded as usual.
|
||||||
|
|
||||||
|
For ethernet, the L2TPETH driver, net/l2tp/l2tp_eth.c, implements a
|
||||||
|
netdevice driver, managing virtual ethernet devices, one per
|
||||||
|
pseudowire. These interfaces can be managed using standard Linux tools
|
||||||
|
such as "ip" and "ifconfig". If only IP frames are passed over the
|
||||||
|
tunnel, the interface can be given an IP addresses of itself and its
|
||||||
|
peer. If non-IP frames are to be passed over the tunnel, the interface
|
||||||
|
can be added to a bridge using brctl. All L2TP datapath protocol
|
||||||
|
functions are handled by the L2TP core driver.
|
||||||
|
|
||||||
Each tunnel and session within a tunnel is assigned a unique tunnel_id
|
Each tunnel and session within a tunnel is assigned a unique tunnel_id
|
||||||
and session_id. These ids are carried in the L2TP header of every
|
and session_id. These ids are carried in the L2TP header of every
|
||||||
control and data packet. The pppol2tp driver uses them to lookup
|
control and data packet. (Actually, in L2TPv3, the tunnel_id isn't
|
||||||
internal tunnel and/or session contexts. Zero tunnel / session ids are
|
present in data frames - it is inferred from the IP connection on
|
||||||
treated specially - zero ids are never assigned to tunnels or sessions
|
which the packet was received.) The L2TP driver uses the ids to lookup
|
||||||
in the network. In the driver, the tunnel context keeps a pointer to
|
internal tunnel and/or session contexts to determine how to handle the
|
||||||
the tunnel UDP socket. The session context keeps a pointer to the
|
packet. Zero tunnel / session ids are treated specially - zero ids are
|
||||||
PPPoL2TP socket, as well as other data that lets the driver interface
|
never assigned to tunnels or sessions in the network. In the driver,
|
||||||
to the kernel PPP subsystem.
|
the tunnel context keeps a reference to the tunnel UDP or L2TPIP
|
||||||
|
socket. The session context holds data that lets the driver interface
|
||||||
|
to the kernel's network frame type subsystems, i.e. PPP, ethernet.
|
||||||
|
|
||||||
Note that the pppol2tp kernel driver handles only L2TP data frames;
|
Userspace Programming
|
||||||
L2TP control frames are simply passed up to userspace in the UDP
|
=====================
|
||||||
tunnel socket. The kernel handles all datapath aspects of the
|
|
||||||
protocol, including data packet resequencing (if enabled).
|
|
||||||
|
|
||||||
There are a number of requirements on the userspace L2TP daemon in
|
For L2TPv2, there are a number of requirements on the userspace L2TP
|
||||||
order to use the pppol2tp driver.
|
daemon in order to use the pppol2tp driver.
|
||||||
|
|
||||||
1. Use a UDP socket per tunnel.
|
1. Use a UDP socket per tunnel.
|
||||||
|
|
||||||
@@ -86,6 +137,35 @@ In addition to the standard PPP ioctls, a PPPIOCGL2TPSTATS is provided
|
|||||||
to retrieve tunnel and session statistics from the kernel using the
|
to retrieve tunnel and session statistics from the kernel using the
|
||||||
PPPoX socket of the appropriate tunnel or session.
|
PPPoX socket of the appropriate tunnel or session.
|
||||||
|
|
||||||
|
For L2TPv3, userspace must use the netlink API defined in
|
||||||
|
include/linux/l2tp.h to manage tunnel and session contexts. The
|
||||||
|
general procedure to create a new L2TP tunnel with one session is:-
|
||||||
|
|
||||||
|
1. Open a GENL socket using L2TP_GENL_NAME for configuring the kernel
|
||||||
|
using netlink.
|
||||||
|
|
||||||
|
2. Create a UDP or L2TPIP socket for the tunnel.
|
||||||
|
|
||||||
|
3. Create a new L2TP tunnel using a L2TP_CMD_TUNNEL_CREATE
|
||||||
|
request. Set attributes according to desired tunnel parameters,
|
||||||
|
referencing the UDP or L2TPIP socket created in the previous step.
|
||||||
|
|
||||||
|
4. Create a new L2TP session in the tunnel using a
|
||||||
|
L2TP_CMD_SESSION_CREATE request.
|
||||||
|
|
||||||
|
The tunnel and all of its sessions are closed when the tunnel socket
|
||||||
|
is closed. The netlink API may also be used to delete sessions and
|
||||||
|
tunnels. Configuration and status info may be set or read using netlink.
|
||||||
|
|
||||||
|
The L2TP driver also supports static (unmanaged) L2TPv3 tunnels. These
|
||||||
|
are where there is no L2TP control message exchange with the peer to
|
||||||
|
setup the tunnel; the tunnel is configured manually at each end of the
|
||||||
|
tunnel. There is no need for an L2TP userspace application in this
|
||||||
|
case -- the tunnel socket is created by the kernel and configured
|
||||||
|
using parameters sent in the L2TP_CMD_TUNNEL_CREATE netlink
|
||||||
|
request. The "ip" utility of iproute2 has commands for managing static
|
||||||
|
L2TPv3 tunnels; do "ip l2tp help" for more information.
|
||||||
|
|
||||||
Debugging
|
Debugging
|
||||||
=========
|
=========
|
||||||
|
|
||||||
@@ -102,6 +182,69 @@ PPPOL2TP_MSG_CONTROL userspace - kernel interface
|
|||||||
PPPOL2TP_MSG_SEQ sequence numbers handling
|
PPPOL2TP_MSG_SEQ sequence numbers handling
|
||||||
PPPOL2TP_MSG_DATA data packets
|
PPPOL2TP_MSG_DATA data packets
|
||||||
|
|
||||||
|
If enabled, files under a l2tp debugfs directory can be used to dump
|
||||||
|
kernel state about L2TP tunnels and sessions. To access it, the
|
||||||
|
debugfs filesystem must first be mounted.
|
||||||
|
|
||||||
|
# mount -t debugfs debugfs /debug
|
||||||
|
|
||||||
|
Files under the l2tp directory can then be accessed.
|
||||||
|
|
||||||
|
# cat /debug/l2tp/tunnels
|
||||||
|
|
||||||
|
The debugfs files should not be used by applications to obtain L2TP
|
||||||
|
state information because the file format is subject to change. It is
|
||||||
|
implemented to provide extra debug information to help diagnose
|
||||||
|
problems.) Users should use the netlink API.
|
||||||
|
|
||||||
|
/proc/net/pppol2tp is also provided for backwards compaibility with
|
||||||
|
the original pppol2tp driver. It lists information about L2TPv2
|
||||||
|
tunnels and sessions only. Its use is discouraged.
|
||||||
|
|
||||||
|
Unmanaged L2TPv3 Tunnels
|
||||||
|
========================
|
||||||
|
|
||||||
|
Some commercial L2TP products support unmanaged L2TPv3 ethernet
|
||||||
|
tunnels, where there is no L2TP control protocol; tunnels are
|
||||||
|
configured at each side manually. New commands are available in
|
||||||
|
iproute2's ip utility to support this.
|
||||||
|
|
||||||
|
To create an L2TPv3 ethernet pseudowire between local host 192.168.1.1
|
||||||
|
and peer 192.168.1.2, using IP addresses 10.5.1.1 and 10.5.1.2 for the
|
||||||
|
tunnel endpoints:-
|
||||||
|
|
||||||
|
# modprobe l2tp_eth
|
||||||
|
# modprobe l2tp_netlink
|
||||||
|
|
||||||
|
# ip l2tp add tunnel tunnel_id 1 peer_tunnel_id 1 udp_sport 5000 \
|
||||||
|
udp_dport 5000 encap udp local 192.168.1.1 remote 192.168.1.2
|
||||||
|
# ip l2tp add session tunnel_id 1 session_id 1 peer_session_id 1
|
||||||
|
# ifconfig -a
|
||||||
|
# ip addr add 10.5.1.2/32 peer 10.5.1.1/32 dev l2tpeth0
|
||||||
|
# ifconfig l2tpeth0 up
|
||||||
|
|
||||||
|
Choose IP addresses to be the address of a local IP interface and that
|
||||||
|
of the remote system. The IP addresses of the l2tpeth0 interface can be
|
||||||
|
anything suitable.
|
||||||
|
|
||||||
|
Repeat the above at the peer, with ports, tunnel/session ids and IP
|
||||||
|
addresses reversed. The tunnel and session IDs can be any non-zero
|
||||||
|
32-bit number, but the values must be reversed at the peer.
|
||||||
|
|
||||||
|
Host 1 Host2
|
||||||
|
udp_sport=5000 udp_sport=5001
|
||||||
|
udp_dport=5001 udp_dport=5000
|
||||||
|
tunnel_id=42 tunnel_id=45
|
||||||
|
peer_tunnel_id=45 peer_tunnel_id=42
|
||||||
|
session_id=128 session_id=5196755
|
||||||
|
peer_session_id=5196755 peer_session_id=128
|
||||||
|
|
||||||
|
When done at both ends of the tunnel, it should be possible to send
|
||||||
|
data over the network. e.g.
|
||||||
|
|
||||||
|
# ping 10.5.1.1
|
||||||
|
|
||||||
|
|
||||||
Sample Userspace Code
|
Sample Userspace Code
|
||||||
=====================
|
=====================
|
||||||
|
|
||||||
@@ -158,12 +301,48 @@ Sample Userspace Code
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
Miscellaneous
|
Internal Implementation
|
||||||
============
|
=======================
|
||||||
|
|
||||||
The PPPoL2TP driver was developed as part of the OpenL2TP project by
|
The driver keeps a struct l2tp_tunnel context per L2TP tunnel and a
|
||||||
|
struct l2tp_session context for each session. The l2tp_tunnel is
|
||||||
|
always associated with a UDP or L2TP/IP socket and keeps a list of
|
||||||
|
sessions in the tunnel. The l2tp_session context keeps kernel state
|
||||||
|
about the session. It has private data which is used for data specific
|
||||||
|
to the session type. With L2TPv2, the session always carried PPP
|
||||||
|
traffic. With L2TPv3, the session can also carry ethernet frames
|
||||||
|
(ethernet pseudowire) or other data types such as ATM, HDLC or Frame
|
||||||
|
Relay.
|
||||||
|
|
||||||
|
When a tunnel is first opened, the reference count on the socket is
|
||||||
|
increased using sock_hold(). This ensures that the kernel socket
|
||||||
|
cannot be removed while L2TP's data structures reference it.
|
||||||
|
|
||||||
|
Some L2TP sessions also have a socket (PPP pseudowires) while others
|
||||||
|
do not (ethernet pseudowires). We can't use the socket reference count
|
||||||
|
as the reference count for session contexts. The L2TP implementation
|
||||||
|
therefore has its own internal reference counts on the session
|
||||||
|
contexts.
|
||||||
|
|
||||||
|
To Do
|
||||||
|
=====
|
||||||
|
|
||||||
|
Add L2TP tunnel switching support. This would route tunneled traffic
|
||||||
|
from one L2TP tunnel into another. Specified in
|
||||||
|
http://tools.ietf.org/html/draft-ietf-l2tpext-tunnel-switching-08
|
||||||
|
|
||||||
|
Add L2TPv3 VLAN pseudowire support.
|
||||||
|
|
||||||
|
Add L2TPv3 IP pseudowire support.
|
||||||
|
|
||||||
|
Add L2TPv3 ATM pseudowire support.
|
||||||
|
|
||||||
|
Miscellaneous
|
||||||
|
=============
|
||||||
|
|
||||||
|
The L2TP drivers were developed as part of the OpenL2TP project by
|
||||||
Katalix Systems Ltd. OpenL2TP is a full-featured L2TP client / server,
|
Katalix Systems Ltd. OpenL2TP is a full-featured L2TP client / server,
|
||||||
designed from the ground up to have the L2TP datapath in the
|
designed from the ground up to have the L2TP datapath in the
|
||||||
kernel. The project also implemented the pppol2tp plugin for pppd
|
kernel. The project also implemented the pppol2tp plugin for pppd
|
||||||
which allows pppd to use the kernel driver. Details can be found at
|
which allows pppd to use the kernel driver. Details can be found at
|
||||||
http://openl2tp.sourceforge.net.
|
http://www.openl2tp.org.
|
||||||
|
|||||||
@@ -20,23 +20,23 @@ the rest of the skbuff, if any more information does exist.
|
|||||||
Packet Layer to Device Driver
|
Packet Layer to Device Driver
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
||||||
First Byte = 0x00
|
First Byte = 0x00 (X25_IFACE_DATA)
|
||||||
|
|
||||||
This indicates that the rest of the skbuff contains data to be transmitted
|
This indicates that the rest of the skbuff contains data to be transmitted
|
||||||
over the LAPB link. The LAPB link should already exist before any data is
|
over the LAPB link. The LAPB link should already exist before any data is
|
||||||
passed down.
|
passed down.
|
||||||
|
|
||||||
First Byte = 0x01
|
First Byte = 0x01 (X25_IFACE_CONNECT)
|
||||||
|
|
||||||
Establish the LAPB link. If the link is already established then the connect
|
Establish the LAPB link. If the link is already established then the connect
|
||||||
confirmation message should be returned as soon as possible.
|
confirmation message should be returned as soon as possible.
|
||||||
|
|
||||||
First Byte = 0x02
|
First Byte = 0x02 (X25_IFACE_DISCONNECT)
|
||||||
|
|
||||||
Terminate the LAPB link. If it is already disconnected then the disconnect
|
Terminate the LAPB link. If it is already disconnected then the disconnect
|
||||||
confirmation message should be returned as soon as possible.
|
confirmation message should be returned as soon as possible.
|
||||||
|
|
||||||
First Byte = 0x03
|
First Byte = 0x03 (X25_IFACE_PARAMS)
|
||||||
|
|
||||||
LAPB parameters. To be defined.
|
LAPB parameters. To be defined.
|
||||||
|
|
||||||
@@ -44,22 +44,22 @@ LAPB parameters. To be defined.
|
|||||||
Device Driver to Packet Layer
|
Device Driver to Packet Layer
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
||||||
First Byte = 0x00
|
First Byte = 0x00 (X25_IFACE_DATA)
|
||||||
|
|
||||||
This indicates that the rest of the skbuff contains data that has been
|
This indicates that the rest of the skbuff contains data that has been
|
||||||
received over the LAPB link.
|
received over the LAPB link.
|
||||||
|
|
||||||
First Byte = 0x01
|
First Byte = 0x01 (X25_IFACE_CONNECT)
|
||||||
|
|
||||||
LAPB link has been established. The same message is used for both a LAPB
|
LAPB link has been established. The same message is used for both a LAPB
|
||||||
link connect_confirmation and a connect_indication.
|
link connect_confirmation and a connect_indication.
|
||||||
|
|
||||||
First Byte = 0x02
|
First Byte = 0x02 (X25_IFACE_DISCONNECT)
|
||||||
|
|
||||||
LAPB link has been terminated. This same message is used for both a LAPB
|
LAPB link has been terminated. This same message is used for both a LAPB
|
||||||
link disconnect_confirmation and a disconnect_indication.
|
link disconnect_confirmation and a disconnect_indication.
|
||||||
|
|
||||||
First Byte = 0x03
|
First Byte = 0x03 (X25_IFACE_PARAMS)
|
||||||
|
|
||||||
LAPB parameters. To be defined.
|
LAPB parameters. To be defined.
|
||||||
|
|
||||||
|
|||||||
+11
-29
@@ -99,37 +99,15 @@ system. Also, it is possible to switch all rfkill drivers (or all drivers of
|
|||||||
a specified type) into a state which also updates the default state for
|
a specified type) into a state which also updates the default state for
|
||||||
hotplugged devices.
|
hotplugged devices.
|
||||||
|
|
||||||
After an application opens /dev/rfkill, it can read the current state of
|
After an application opens /dev/rfkill, it can read the current state of all
|
||||||
all devices, and afterwards can poll the descriptor for hotplug or state
|
devices. Changes can be either obtained by either polling the descriptor for
|
||||||
change events.
|
hotplug or state change events or by listening for uevents emitted by the
|
||||||
|
rfkill core framework.
|
||||||
|
|
||||||
Applications must ignore operations (the "op" field) they do not handle,
|
Additionally, each rfkill device is registered in sysfs and emits uevents.
|
||||||
this allows the API to be extended in the future.
|
|
||||||
|
|
||||||
Additionally, each rfkill device is registered in sysfs and there has the
|
rfkill devices issue uevents (with an action of "change"), with the following
|
||||||
following attributes:
|
environment variables set:
|
||||||
|
|
||||||
name: Name assigned by driver to this key (interface or driver name).
|
|
||||||
type: Driver type string ("wlan", "bluetooth", etc).
|
|
||||||
persistent: Whether the soft blocked state is initialised from
|
|
||||||
non-volatile storage at startup.
|
|
||||||
state: Current state of the transmitter
|
|
||||||
0: RFKILL_STATE_SOFT_BLOCKED
|
|
||||||
transmitter is turned off by software
|
|
||||||
1: RFKILL_STATE_UNBLOCKED
|
|
||||||
transmitter is (potentially) active
|
|
||||||
2: RFKILL_STATE_HARD_BLOCKED
|
|
||||||
transmitter is forced off by something outside of
|
|
||||||
the driver's control.
|
|
||||||
This file is deprecated because it can only properly show
|
|
||||||
three of the four possible states, soft-and-hard-blocked is
|
|
||||||
missing.
|
|
||||||
claim: 0: Kernel handles events
|
|
||||||
This file is deprecated because there no longer is a way to
|
|
||||||
claim just control over a single rfkill instance.
|
|
||||||
|
|
||||||
rfkill devices also issue uevents (with an action of "change"), with the
|
|
||||||
following environment variables set:
|
|
||||||
|
|
||||||
RFKILL_NAME
|
RFKILL_NAME
|
||||||
RFKILL_STATE
|
RFKILL_STATE
|
||||||
@@ -137,3 +115,7 @@ RFKILL_TYPE
|
|||||||
|
|
||||||
The contents of these variables corresponds to the "name", "state" and
|
The contents of these variables corresponds to the "name", "state" and
|
||||||
"type" sysfs files explained above.
|
"type" sysfs files explained above.
|
||||||
|
|
||||||
|
|
||||||
|
For further details consult Documentation/ABI/stable/dev-rfkill and
|
||||||
|
Documentation/ABI/stable/sysfs-class-rfkill.
|
||||||
|
|||||||
@@ -84,6 +84,16 @@ netdev_max_backlog
|
|||||||
Maximum number of packets, queued on the INPUT side, when the interface
|
Maximum number of packets, queued on the INPUT side, when the interface
|
||||||
receives packets faster than kernel can process them.
|
receives packets faster than kernel can process them.
|
||||||
|
|
||||||
|
netdev_tstamp_prequeue
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
If set to 0, RX packet timestamps can be sampled after RPS processing, when
|
||||||
|
the target CPU processes packets. It might give some delay on timestamps, but
|
||||||
|
permit to distribute the load on several cpus.
|
||||||
|
|
||||||
|
If set to 1 (default), timestamps are sampled as soon as possible, before
|
||||||
|
queueing.
|
||||||
|
|
||||||
optmem_max
|
optmem_max
|
||||||
----------
|
----------
|
||||||
|
|
||||||
|
|||||||
+6
-5
@@ -1521,9 +1521,10 @@ M: Andy Whitcroft <apw@canonical.com>
|
|||||||
S: Supported
|
S: Supported
|
||||||
F: scripts/checkpatch.pl
|
F: scripts/checkpatch.pl
|
||||||
|
|
||||||
CISCO 10G ETHERNET DRIVER
|
CISCO VIC ETHERNET NIC DRIVER
|
||||||
M: Scott Feldman <scofeldm@cisco.com>
|
M: Scott Feldman <scofeldm@cisco.com>
|
||||||
M: Joe Eykholt <jeykholt@cisco.com>
|
M: Vasanthy Kolluri <vkolluri@cisco.com>
|
||||||
|
M: Roopa Prabhu <roprabhu@cisco.com>
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/net/enic/
|
F: drivers/net/enic/
|
||||||
|
|
||||||
@@ -3044,10 +3045,9 @@ F: net/ipv4/netfilter/ipt_MASQUERADE.c
|
|||||||
IP1000A 10/100/1000 GIGABIT ETHERNET DRIVER
|
IP1000A 10/100/1000 GIGABIT ETHERNET DRIVER
|
||||||
M: Francois Romieu <romieu@fr.zoreil.com>
|
M: Francois Romieu <romieu@fr.zoreil.com>
|
||||||
M: Sorbica Shieh <sorbica@icplus.com.tw>
|
M: Sorbica Shieh <sorbica@icplus.com.tw>
|
||||||
M: Jesse Huang <jesse@icplus.com.tw>
|
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/net/ipg.c
|
F: drivers/net/ipg.*
|
||||||
|
|
||||||
IPATH DRIVER
|
IPATH DRIVER
|
||||||
M: Ralph Campbell <infinipath@qlogic.com>
|
M: Ralph Campbell <infinipath@qlogic.com>
|
||||||
@@ -3895,7 +3895,6 @@ M: Ramkrishna Vepa <ram.vepa@neterion.com>
|
|||||||
M: Rastapur Santosh <santosh.rastapur@neterion.com>
|
M: Rastapur Santosh <santosh.rastapur@neterion.com>
|
||||||
M: Sivakumar Subramani <sivakumar.subramani@neterion.com>
|
M: Sivakumar Subramani <sivakumar.subramani@neterion.com>
|
||||||
M: Sreenivasa Honnur <sreenivasa.honnur@neterion.com>
|
M: Sreenivasa Honnur <sreenivasa.honnur@neterion.com>
|
||||||
M: Anil Murthy <anil.murthy@neterion.com>
|
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
W: http://trac.neterion.com/cgi-bin/trac.cgi/wiki/Linux?Anonymous
|
W: http://trac.neterion.com/cgi-bin/trac.cgi/wiki/Linux?Anonymous
|
||||||
W: http://trac.neterion.com/cgi-bin/trac.cgi/wiki/X3100Linux?Anonymous
|
W: http://trac.neterion.com/cgi-bin/trac.cgi/wiki/X3100Linux?Anonymous
|
||||||
@@ -4000,6 +3999,7 @@ F: net/rfkill/
|
|||||||
F: net/wireless/
|
F: net/wireless/
|
||||||
F: include/net/ieee80211*
|
F: include/net/ieee80211*
|
||||||
F: include/linux/wireless.h
|
F: include/linux/wireless.h
|
||||||
|
F: include/linux/iw_handler.h
|
||||||
F: drivers/net/wireless/
|
F: drivers/net/wireless/
|
||||||
|
|
||||||
NETWORKING DRIVERS
|
NETWORKING DRIVERS
|
||||||
@@ -4631,6 +4631,7 @@ F: drivers/net/qla3xxx.*
|
|||||||
|
|
||||||
QLOGIC QLCNIC (1/10)Gb ETHERNET DRIVER
|
QLOGIC QLCNIC (1/10)Gb ETHERNET DRIVER
|
||||||
M: Amit Kumar Salecha <amit.salecha@qlogic.com>
|
M: Amit Kumar Salecha <amit.salecha@qlogic.com>
|
||||||
|
M: Anirban Chakraborty <anirban.chakraborty@qlogic.com>
|
||||||
M: linux-driver@qlogic.com
|
M: linux-driver@qlogic.com
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|||||||
@@ -201,9 +201,9 @@ static struct resource pcm970_sja1000_resources[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct sja1000_platform_data pcm970_sja1000_platform_data = {
|
struct sja1000_platform_data pcm970_sja1000_platform_data = {
|
||||||
.clock = 16000000 / 2,
|
.osc_freq = 16000000,
|
||||||
.ocr = 0x40 | 0x18,
|
.ocr = OCR_TX1_PULLDOWN | OCR_TX0_PUSHPULL,
|
||||||
.cdr = 0x40,
|
.cdr = CDR_CBP,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device pcm970_sja1000 = {
|
static struct platform_device pcm970_sja1000 = {
|
||||||
|
|||||||
@@ -530,9 +530,9 @@ static struct resource pcm970_sja1000_resources[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct sja1000_platform_data pcm970_sja1000_platform_data = {
|
struct sja1000_platform_data pcm970_sja1000_platform_data = {
|
||||||
.clock = 16000000 / 2,
|
.osc_freq = 16000000,
|
||||||
.ocr = 0x40 | 0x18,
|
.ocr = OCR_TX1_PULLDOWN | OCR_TX0_PUSHPULL,
|
||||||
.cdr = 0x40,
|
.cdr = CDR_CBP,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device pcm970_sja1000 = {
|
static struct platform_device pcm970_sja1000 = {
|
||||||
|
|||||||
@@ -73,7 +73,6 @@ static struct pxa2xx_spi_chip mcp251x_chip_info4 = {
|
|||||||
|
|
||||||
static struct mcp251x_platform_data mcp251x_info = {
|
static struct mcp251x_platform_data mcp251x_info = {
|
||||||
.oscillator_frequency = 16E6,
|
.oscillator_frequency = 16E6,
|
||||||
.model = CAN_MCP251X_MCP2515,
|
|
||||||
.board_specific_setup = NULL,
|
.board_specific_setup = NULL,
|
||||||
.power_enable = NULL,
|
.power_enable = NULL,
|
||||||
.transceiver_enable = NULL
|
.transceiver_enable = NULL
|
||||||
@@ -81,7 +80,7 @@ static struct mcp251x_platform_data mcp251x_info = {
|
|||||||
|
|
||||||
static struct spi_board_info mcp251x_board_info[] = {
|
static struct spi_board_info mcp251x_board_info[] = {
|
||||||
{
|
{
|
||||||
.modalias = "mcp251x",
|
.modalias = "mcp2515",
|
||||||
.max_speed_hz = 6500000,
|
.max_speed_hz = 6500000,
|
||||||
.bus_num = 3,
|
.bus_num = 3,
|
||||||
.chip_select = 0,
|
.chip_select = 0,
|
||||||
@@ -90,7 +89,7 @@ static struct spi_board_info mcp251x_board_info[] = {
|
|||||||
.irq = gpio_to_irq(ICONTROL_MCP251x_nIRQ1)
|
.irq = gpio_to_irq(ICONTROL_MCP251x_nIRQ1)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.modalias = "mcp251x",
|
.modalias = "mcp2515",
|
||||||
.max_speed_hz = 6500000,
|
.max_speed_hz = 6500000,
|
||||||
.bus_num = 3,
|
.bus_num = 3,
|
||||||
.chip_select = 1,
|
.chip_select = 1,
|
||||||
@@ -99,7 +98,7 @@ static struct spi_board_info mcp251x_board_info[] = {
|
|||||||
.irq = gpio_to_irq(ICONTROL_MCP251x_nIRQ2)
|
.irq = gpio_to_irq(ICONTROL_MCP251x_nIRQ2)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.modalias = "mcp251x",
|
.modalias = "mcp2515",
|
||||||
.max_speed_hz = 6500000,
|
.max_speed_hz = 6500000,
|
||||||
.bus_num = 4,
|
.bus_num = 4,
|
||||||
.chip_select = 0,
|
.chip_select = 0,
|
||||||
@@ -108,7 +107,7 @@ static struct spi_board_info mcp251x_board_info[] = {
|
|||||||
.irq = gpio_to_irq(ICONTROL_MCP251x_nIRQ3)
|
.irq = gpio_to_irq(ICONTROL_MCP251x_nIRQ3)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.modalias = "mcp251x",
|
.modalias = "mcp2515",
|
||||||
.max_speed_hz = 6500000,
|
.max_speed_hz = 6500000,
|
||||||
.bus_num = 4,
|
.bus_num = 4,
|
||||||
.chip_select = 1,
|
.chip_select = 1,
|
||||||
|
|||||||
@@ -414,15 +414,13 @@ static int zeus_mcp2515_transceiver_enable(int enable)
|
|||||||
|
|
||||||
static struct mcp251x_platform_data zeus_mcp2515_pdata = {
|
static struct mcp251x_platform_data zeus_mcp2515_pdata = {
|
||||||
.oscillator_frequency = 16*1000*1000,
|
.oscillator_frequency = 16*1000*1000,
|
||||||
.model = CAN_MCP251X_MCP2515,
|
|
||||||
.board_specific_setup = zeus_mcp2515_setup,
|
.board_specific_setup = zeus_mcp2515_setup,
|
||||||
.transceiver_enable = zeus_mcp2515_transceiver_enable,
|
|
||||||
.power_enable = zeus_mcp2515_transceiver_enable,
|
.power_enable = zeus_mcp2515_transceiver_enable,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct spi_board_info zeus_spi_board_info[] = {
|
static struct spi_board_info zeus_spi_board_info[] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
.modalias = "mcp251x",
|
.modalias = "mcp2515",
|
||||||
.platform_data = &zeus_mcp2515_pdata,
|
.platform_data = &zeus_mcp2515_pdata,
|
||||||
.irq = gpio_to_irq(ZEUS_CAN_GPIO),
|
.irq = gpio_to_irq(ZEUS_CAN_GPIO),
|
||||||
.max_speed_hz = 1*1000*1000,
|
.max_speed_hz = 1*1000*1000,
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
#include <asm/registers.h>
|
#include <asm/registers.h>
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/irqflags.h>
|
#include <asm/irqflags.h>
|
||||||
|
#include <asm/cache.h>
|
||||||
|
|
||||||
#include <asm-generic/cmpxchg.h>
|
#include <asm-generic/cmpxchg.h>
|
||||||
#include <asm-generic/cmpxchg-local.h>
|
#include <asm-generic/cmpxchg-local.h>
|
||||||
@@ -96,4 +97,14 @@ extern struct dentry *of_debugfs_root;
|
|||||||
|
|
||||||
#define arch_align_stack(x) (x)
|
#define arch_align_stack(x) (x)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MicroBlaze doesn't handle unaligned accesses in hardware.
|
||||||
|
*
|
||||||
|
* Based on this we force the IP header alignment in network drivers.
|
||||||
|
* We also modify NET_SKB_PAD to be a cacheline in size, thus maintaining
|
||||||
|
* cacheline alignment of buffers.
|
||||||
|
*/
|
||||||
|
#define NET_IP_ALIGN 2
|
||||||
|
#define NET_SKB_PAD L1_CACHE_BYTES
|
||||||
|
|
||||||
#endif /* _ASM_MICROBLAZE_SYSTEM_H */
|
#endif /* _ASM_MICROBLAZE_SYSTEM_H */
|
||||||
|
|||||||
@@ -83,3 +83,57 @@ static int __init swarm_pata_init(void)
|
|||||||
device_initcall(swarm_pata_init);
|
device_initcall(swarm_pata_init);
|
||||||
|
|
||||||
#endif /* defined(CONFIG_SIBYTE_SWARM) || defined(CONFIG_SIBYTE_LITTLESUR) */
|
#endif /* defined(CONFIG_SIBYTE_SWARM) || defined(CONFIG_SIBYTE_LITTLESUR) */
|
||||||
|
|
||||||
|
#define sb1250_dev_struct(num) \
|
||||||
|
static struct resource sb1250_res##num = { \
|
||||||
|
.name = "SB1250 MAC " __stringify(num), \
|
||||||
|
.flags = IORESOURCE_MEM, \
|
||||||
|
.start = A_MAC_CHANNEL_BASE(num), \
|
||||||
|
.end = A_MAC_CHANNEL_BASE(num + 1) -1, \
|
||||||
|
};\
|
||||||
|
static struct platform_device sb1250_dev##num = { \
|
||||||
|
.name = "sb1250-mac", \
|
||||||
|
.id = num, \
|
||||||
|
.resource = &sb1250_res##num, \
|
||||||
|
.num_resources = 1, \
|
||||||
|
}
|
||||||
|
|
||||||
|
sb1250_dev_struct(0);
|
||||||
|
sb1250_dev_struct(1);
|
||||||
|
sb1250_dev_struct(2);
|
||||||
|
sb1250_dev_struct(3);
|
||||||
|
|
||||||
|
static struct platform_device *sb1250_devs[] __initdata = {
|
||||||
|
&sb1250_dev0,
|
||||||
|
&sb1250_dev1,
|
||||||
|
&sb1250_dev2,
|
||||||
|
&sb1250_dev3,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init sb1250_device_init(void)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/* Set the number of available units based on the SOC type. */
|
||||||
|
switch (soc_type) {
|
||||||
|
case K_SYS_SOC_TYPE_BCM1250:
|
||||||
|
case K_SYS_SOC_TYPE_BCM1250_ALT:
|
||||||
|
ret = platform_add_devices(sb1250_devs, 3);
|
||||||
|
break;
|
||||||
|
case K_SYS_SOC_TYPE_BCM1120:
|
||||||
|
case K_SYS_SOC_TYPE_BCM1125:
|
||||||
|
case K_SYS_SOC_TYPE_BCM1125H:
|
||||||
|
case K_SYS_SOC_TYPE_BCM1250_ALT2: /* Hybrid */
|
||||||
|
ret = platform_add_devices(sb1250_devs, 2);
|
||||||
|
break;
|
||||||
|
case K_SYS_SOC_TYPE_BCM1x55:
|
||||||
|
case K_SYS_SOC_TYPE_BCM1x80:
|
||||||
|
ret = platform_add_devices(sb1250_devs, 4);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ret = -ENODEV;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
device_initcall(sb1250_device_init);
|
||||||
|
|||||||
@@ -394,6 +394,7 @@ config ATM_HE_USE_SUNI
|
|||||||
config ATM_SOLOS
|
config ATM_SOLOS
|
||||||
tristate "Solos ADSL2+ PCI Multiport card driver"
|
tristate "Solos ADSL2+ PCI Multiport card driver"
|
||||||
depends on PCI
|
depends on PCI
|
||||||
|
select FW_LOADER
|
||||||
help
|
help
|
||||||
Support for the Solos multiport ADSL2+ card.
|
Support for the Solos multiport ADSL2+ card.
|
||||||
|
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ static int atmtcp_send_control(struct atm_vcc *vcc,int type,
|
|||||||
*(struct atm_vcc **) &new_msg->vcc = vcc;
|
*(struct atm_vcc **) &new_msg->vcc = vcc;
|
||||||
old_test = test_bit(flag,&vcc->flags);
|
old_test = test_bit(flag,&vcc->flags);
|
||||||
out_vcc->push(out_vcc,skb);
|
out_vcc->push(out_vcc,skb);
|
||||||
add_wait_queue(sk_atm(vcc)->sk_sleep, &wait);
|
add_wait_queue(sk_sleep(sk_atm(vcc)), &wait);
|
||||||
while (test_bit(flag,&vcc->flags) == old_test) {
|
while (test_bit(flag,&vcc->flags) == old_test) {
|
||||||
mb();
|
mb();
|
||||||
out_vcc = PRIV(vcc->dev) ? PRIV(vcc->dev)->vcc : NULL;
|
out_vcc = PRIV(vcc->dev) ? PRIV(vcc->dev)->vcc : NULL;
|
||||||
@@ -80,7 +80,7 @@ static int atmtcp_send_control(struct atm_vcc *vcc,int type,
|
|||||||
schedule();
|
schedule();
|
||||||
}
|
}
|
||||||
set_current_state(TASK_RUNNING);
|
set_current_state(TASK_RUNNING);
|
||||||
remove_wait_queue(sk_atm(vcc)->sk_sleep, &wait);
|
remove_wait_queue(sk_sleep(sk_atm(vcc)), &wait);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,7 +105,7 @@ static int atmtcp_recv_control(const struct atmtcp_control *msg)
|
|||||||
msg->type);
|
msg->type);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
wake_up(sk_atm(vcc)->sk_sleep);
|
wake_up(sk_sleep(sk_atm(vcc)));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user