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-2.6.25
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.25: (1470 commits) [IPV6] ADDRLABEL: Fix double free on label deletion. [PPP]: Sparse warning fixes. [IPV4] fib_trie: remove unneeded NULL check [IPV4] fib_trie: More whitespace cleanup. [NET_SCHED]: Use nla_policy for attribute validation in ematches [NET_SCHED]: Use nla_policy for attribute validation in actions [NET_SCHED]: Use nla_policy for attribute validation in classifiers [NET_SCHED]: Use nla_policy for attribute validation in packet schedulers [NET_SCHED]: sch_api: introduce constant for rate table size [NET_SCHED]: Use typeful attribute parsing helpers [NET_SCHED]: Use typeful attribute construction helpers [NET_SCHED]: Use NLA_PUT_STRING for string dumping [NET_SCHED]: Use nla_nest_start/nla_nest_end [NET_SCHED]: Propagate nla_parse return value [NET_SCHED]: act_api: use PTR_ERR in tcf_action_init/tcf_action_get [NET_SCHED]: act_api: use nlmsg_parse [NET_SCHED]: act_api: fix netlink API conversion bug [NET_SCHED]: sch_netem: use nla_parse_nested_compat [NET_SCHED]: sch_atm: fix format string warning [NETNS]: Add namespace for ICMP replying code. ...
This commit is contained in:
@@ -1353,6 +1353,14 @@ S: Gen Stedmanstraat 212
|
||||
S: 5623 HZ Eindhoven
|
||||
S: The Netherlands
|
||||
|
||||
N: Oliver Hartkopp
|
||||
E: oliver.hartkopp@volkswagen.de
|
||||
W: http://www.volkswagen.de
|
||||
D: Controller Area Network (network layer core)
|
||||
S: Brieffach 1776
|
||||
S: 38436 Wolfsburg
|
||||
S: Germany
|
||||
|
||||
N: Andrew Haylett
|
||||
E: ajh@primag.co.uk
|
||||
D: Selection mechanism
|
||||
@@ -3306,6 +3314,14 @@ S: Universit=E9 de Rennes I
|
||||
S: F-35042 Rennes Cedex
|
||||
S: France
|
||||
|
||||
N: Urs Thuermann
|
||||
E: urs.thuermann@volkswagen.de
|
||||
W: http://www.volkswagen.de
|
||||
D: Controller Area Network (network layer core)
|
||||
S: Brieffach 1776
|
||||
S: 38436 Wolfsburg
|
||||
S: Germany
|
||||
|
||||
N: Jon Tombs
|
||||
E: jon@gte.esi.us.es
|
||||
W: http://www.esi.us.es/~jon
|
||||
|
||||
@@ -249,15 +249,6 @@ Who: Tejun Heo <htejun@gmail.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: iptables SAME target
|
||||
When: 1.1. 2008
|
||||
Files: net/ipv4/netfilter/ipt_SAME.c, include/linux/netfilter_ipv4/ipt_SAME.h
|
||||
Why: Obsolete for multiple years now, NAT core provides the same behaviour.
|
||||
Unfixable broken wrt. 32/64 bit cleanness.
|
||||
Who: Patrick McHardy <kaber@trash.net>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: The arch/ppc and include/asm-ppc directories
|
||||
When: Jun 2008
|
||||
Why: The arch/powerpc tree is the merged architecture for ppc32 and ppc64
|
||||
@@ -289,15 +280,6 @@ Who: Thomas Gleixner <tglx@linutronix.de>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: shaper network driver
|
||||
When: January 2008
|
||||
Files: drivers/net/shaper.c, include/linux/if_shaper.h
|
||||
Why: This driver has been marked obsolete for many years.
|
||||
It was only designed to work on lower speed links and has design
|
||||
flaws that lead to machine crashes. The qdisc infrastructure in
|
||||
2.4 or later kernels, provides richer features and is more robust.
|
||||
Who: Stephen Hemminger <shemminger@linux-foundation.org>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: i2c-i810, i2c-prosavage and i2c-savage4
|
||||
@@ -306,3 +288,69 @@ Why: These drivers are superseded by i810fb, intelfb and savagefb.
|
||||
Who: Jean Delvare <khali@linux-fr.org>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: bcm43xx wireless network driver
|
||||
When: 2.6.26
|
||||
Files: drivers/net/wireless/bcm43xx
|
||||
Why: This driver's functionality has been replaced by the
|
||||
mac80211-based b43 and b43legacy drivers.
|
||||
Who: John W. Linville <linville@tuxdriver.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: ieee80211 softmac wireless networking component
|
||||
When: 2.6.26 (or after removal of bcm43xx and port of zd1211rw to mac80211)
|
||||
Files: net/ieee80211/softmac
|
||||
Why: No in-kernel drivers will depend on it any longer.
|
||||
Who: John W. Linville <linville@tuxdriver.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: rc80211-simple rate control algorithm for mac80211
|
||||
When: 2.6.26
|
||||
Files: net/mac80211/rc80211-simple.c
|
||||
Why: This algorithm was provided for reference but always exhibited bad
|
||||
responsiveness and performance and has some serious flaws. It has been
|
||||
replaced by rc80211-pid.
|
||||
Who: Stefano Brivio <stefano.brivio@polimi.it>
|
||||
|
||||
---------------------------
|
||||
|
||||
What (Why):
|
||||
- include/linux/netfilter_ipv4/ipt_TOS.h ipt_tos.h header files
|
||||
(superseded by xt_TOS/xt_tos target & match)
|
||||
|
||||
- "forwarding" header files like ipt_mac.h in
|
||||
include/linux/netfilter_ipv4/ and include/linux/netfilter_ipv6/
|
||||
|
||||
- xt_CONNMARK match revision 0
|
||||
(superseded by xt_CONNMARK match revision 1)
|
||||
|
||||
- xt_MARK target revisions 0 and 1
|
||||
(superseded by xt_MARK match revision 2)
|
||||
|
||||
- xt_connmark match revision 0
|
||||
(superseded by xt_connmark match revision 1)
|
||||
|
||||
- xt_conntrack match revision 0
|
||||
(superseded by xt_conntrack match revision 1)
|
||||
|
||||
- xt_iprange match revision 0,
|
||||
include/linux/netfilter_ipv4/ipt_iprange.h
|
||||
(superseded by xt_iprange match revision 1)
|
||||
|
||||
- xt_mark match revision 0
|
||||
(superseded by xt_mark match revision 1)
|
||||
|
||||
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: b43 support for firmware revision < 410
|
||||
When: July 2008
|
||||
Why: The support code for the old firmware hurts code readability/maintainability
|
||||
and slightly hurts runtime performance. Bugfixes for the old firmware
|
||||
are not provided by Broadcom anymore.
|
||||
Who: Michael Buesch <mb@bu3sch.de>
|
||||
|
||||
@@ -24,6 +24,8 @@ baycom.txt
|
||||
- info on the driver for Baycom style amateur radio modems
|
||||
bridge.txt
|
||||
- where to get user space programs for ethernet bridging with Linux.
|
||||
can.txt
|
||||
- documentation on CAN protocol family.
|
||||
cops.txt
|
||||
- info on the COPS LocalTalk Linux driver
|
||||
cs89x0.txt
|
||||
@@ -82,8 +84,6 @@ policy-routing.txt
|
||||
- IP policy-based routing
|
||||
ray_cs.txt
|
||||
- Raylink Wireless LAN card driver info.
|
||||
shaper.txt
|
||||
- info on the module that can shape/limit transmitted traffic.
|
||||
sk98lin.txt
|
||||
- Marvell Yukon Chipset / SysKonnect SK-98xx compliant Gigabit
|
||||
Ethernet Adapter family driver info
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
Linux Ethernet Bonding Driver HOWTO
|
||||
|
||||
Latest update: 24 April 2006
|
||||
Latest update: 12 November 2007
|
||||
|
||||
Initial release : Thomas Davis <tadavis at lbl.gov>
|
||||
Corrections, HA extensions : 2000/10/03-15 :
|
||||
@@ -166,12 +166,17 @@ to use ifenslave.
|
||||
2. Bonding Driver Options
|
||||
=========================
|
||||
|
||||
Options for the bonding driver are supplied as parameters to
|
||||
the bonding module at load time. They may be given as command line
|
||||
arguments to the insmod or modprobe command, but are usually specified
|
||||
in either the /etc/modules.conf or /etc/modprobe.conf configuration
|
||||
file, or in a distro-specific configuration file (some of which are
|
||||
detailed in the next section).
|
||||
Options for the bonding driver are supplied as parameters to the
|
||||
bonding module at load time, or are specified via sysfs.
|
||||
|
||||
Module options may be given as command line arguments to the
|
||||
insmod or modprobe command, but are usually specified in either the
|
||||
/etc/modules.conf or /etc/modprobe.conf configuration file, or in a
|
||||
distro-specific configuration file (some of which are detailed in the next
|
||||
section).
|
||||
|
||||
Details on bonding support for sysfs is provided in the
|
||||
"Configuring Bonding Manually via Sysfs" section, below.
|
||||
|
||||
The available bonding driver parameters are listed below. If a
|
||||
parameter is not specified the default value is used. When initially
|
||||
@@ -812,11 +817,13 @@ the system /etc/modules.conf or /etc/modprobe.conf configuration file.
|
||||
3.2 Configuration with Initscripts Support
|
||||
------------------------------------------
|
||||
|
||||
This section applies to distros using a version of initscripts
|
||||
with bonding support, for example, Red Hat Linux 9 or Red Hat
|
||||
Enterprise Linux version 3 or 4. On these systems, the network
|
||||
initialization scripts have some knowledge of bonding, and can be
|
||||
configured to control bonding devices.
|
||||
This section applies to distros using a recent version of
|
||||
initscripts with bonding support, for example, Red Hat Enterprise Linux
|
||||
version 3 or later, Fedora, etc. On these systems, the network
|
||||
initialization scripts have knowledge of bonding, and can be configured to
|
||||
control bonding devices. Note that older versions of the initscripts
|
||||
package have lower levels of support for bonding; this will be noted where
|
||||
applicable.
|
||||
|
||||
These distros will not automatically load the network adapter
|
||||
driver unless the ethX device is configured with an IP address.
|
||||
@@ -864,11 +871,31 @@ USERCTL=no
|
||||
Be sure to change the networking specific lines (IPADDR,
|
||||
NETMASK, NETWORK and BROADCAST) to match your network configuration.
|
||||
|
||||
Finally, it is necessary to edit /etc/modules.conf (or
|
||||
/etc/modprobe.conf, depending upon your distro) to load the bonding
|
||||
module with your desired options when the bond0 interface is brought
|
||||
up. The following lines in /etc/modules.conf (or modprobe.conf) will
|
||||
load the bonding module, and select its options:
|
||||
For later versions of initscripts, such as that found with Fedora
|
||||
7 and Red Hat Enterprise Linux version 5 (or later), it is possible, and,
|
||||
indeed, preferable, to specify the bonding options in the ifcfg-bond0
|
||||
file, e.g. a line of the format:
|
||||
|
||||
BONDING_OPTS="mode=active-backup arp_interval=60 arp_ip_target=+192.168.1.254"
|
||||
|
||||
will configure the bond with the specified options. The options
|
||||
specified in BONDING_OPTS are identical to the bonding module parameters
|
||||
except for the arp_ip_target field. Each target should be included as a
|
||||
separate option and should be preceded by a '+' to indicate it should be
|
||||
added to the list of queried targets, e.g.,
|
||||
|
||||
arp_ip_target=+192.168.1.1 arp_ip_target=+192.168.1.2
|
||||
|
||||
is the proper syntax to specify multiple targets. When specifying
|
||||
options via BONDING_OPTS, it is not necessary to edit /etc/modules.conf or
|
||||
/etc/modprobe.conf.
|
||||
|
||||
For older versions of initscripts that do not support
|
||||
BONDING_OPTS, it is necessary to edit /etc/modules.conf (or
|
||||
/etc/modprobe.conf, depending upon your distro) to load the bonding module
|
||||
with your desired options when the bond0 interface is brought up. The
|
||||
following lines in /etc/modules.conf (or modprobe.conf) will load the
|
||||
bonding module, and select its options:
|
||||
|
||||
alias bond0 bonding
|
||||
options bond0 mode=balance-alb miimon=100
|
||||
@@ -883,9 +910,10 @@ up and running.
|
||||
3.2.1 Using DHCP with Initscripts
|
||||
---------------------------------
|
||||
|
||||
Recent versions of initscripts (the version supplied with
|
||||
Fedora Core 3 and Red Hat Enterprise Linux 4 is reported to work) do
|
||||
have support for assigning IP information to bonding devices via DHCP.
|
||||
Recent versions of initscripts (the versions supplied with Fedora
|
||||
Core 3 and Red Hat Enterprise Linux 4, or later versions, are reported to
|
||||
work) have support for assigning IP information to bonding devices via
|
||||
DHCP.
|
||||
|
||||
To configure bonding for DHCP, configure it as described
|
||||
above, except replace the line "BOOTPROTO=none" with "BOOTPROTO=dhcp"
|
||||
@@ -895,18 +923,14 @@ is case sensitive.
|
||||
3.2.2 Configuring Multiple Bonds with Initscripts
|
||||
-------------------------------------------------
|
||||
|
||||
At this writing, the initscripts package does not directly
|
||||
support loading the bonding driver multiple times, so the process for
|
||||
doing so is the same as described in the "Configuring Multiple Bonds
|
||||
Manually" section, below.
|
||||
|
||||
NOTE: It has been observed that some Red Hat supplied kernels
|
||||
are apparently unable to rename modules at load time (the "-o bond1"
|
||||
part). Attempts to pass that option to modprobe will produce an
|
||||
"Operation not permitted" error. This has been reported on some
|
||||
Fedora Core kernels, and has been seen on RHEL 4 as well. On kernels
|
||||
exhibiting this problem, it will be impossible to configure multiple
|
||||
bonds with differing parameters.
|
||||
Initscripts packages that are included with Fedora 7 and Red Hat
|
||||
Enterprise Linux 5 support multiple bonding interfaces by simply
|
||||
specifying the appropriate BONDING_OPTS= in ifcfg-bondX where X is the
|
||||
number of the bond. This support requires sysfs support in the kernel,
|
||||
and a bonding driver of version 3.0.0 or later. Other configurations may
|
||||
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
|
||||
-----------------------------------------------
|
||||
@@ -977,15 +1001,58 @@ initialization scripts lack support for configuring multiple bonds.
|
||||
options, you may wish to use the "max_bonds" module parameter,
|
||||
documented above.
|
||||
|
||||
To create multiple bonding devices with differing options, it
|
||||
is necessary to use bonding parameters exported by sysfs, documented
|
||||
in the section below.
|
||||
To create multiple bonding devices with differing options, it is
|
||||
preferrable to use bonding parameters exported by sysfs, documented in the
|
||||
section below.
|
||||
|
||||
For versions of bonding without sysfs support, the only means to
|
||||
provide multiple instances of bonding with differing options is to load
|
||||
the bonding driver multiple times. Note that current versions of the
|
||||
sysconfig network initialization scripts handle this automatically; if
|
||||
your distro uses these scripts, no special action is needed. See the
|
||||
section Configuring Bonding Devices, above, if you're not sure about your
|
||||
network initialization scripts.
|
||||
|
||||
To load multiple instances of the module, it is necessary to
|
||||
specify a different name for each instance (the module loading system
|
||||
requires that every loaded module, even multiple instances of the same
|
||||
module, have a unique name). This is accomplished by supplying multiple
|
||||
sets of bonding options in /etc/modprobe.conf, for example:
|
||||
|
||||
alias bond0 bonding
|
||||
options bond0 -o bond0 mode=balance-rr miimon=100
|
||||
|
||||
alias bond1 bonding
|
||||
options bond1 -o bond1 mode=balance-alb miimon=50
|
||||
|
||||
will load the bonding module two times. The first instance is
|
||||
named "bond0" and creates the bond0 device in balance-rr mode with an
|
||||
miimon of 100. The second instance is named "bond1" and creates the
|
||||
bond1 device in balance-alb mode with an miimon of 50.
|
||||
|
||||
In some circumstances (typically with older distributions),
|
||||
the above does not work, and the second bonding instance never sees
|
||||
its options. In that case, the second options line can be substituted
|
||||
as follows:
|
||||
|
||||
install bond1 /sbin/modprobe --ignore-install bonding -o bond1 \
|
||||
mode=balance-alb miimon=50
|
||||
|
||||
This may be repeated any number of times, specifying a new and
|
||||
unique name in place of bond1 for each subsequent instance.
|
||||
|
||||
It has been observed that some Red Hat supplied kernels are unable
|
||||
to rename modules at load time (the "-o bond1" part). Attempts to pass
|
||||
that option to modprobe will produce an "Operation not permitted" error.
|
||||
This has been reported on some Fedora Core kernels, and has been seen on
|
||||
RHEL 4 as well. On kernels exhibiting this problem, it will be impossible
|
||||
to configure multiple bonds with differing parameters (as they are older
|
||||
kernels, and also lack sysfs support).
|
||||
|
||||
3.4 Configuring Bonding Manually via Sysfs
|
||||
------------------------------------------
|
||||
|
||||
Starting with version 3.0, Channel Bonding may be configured
|
||||
Starting with version 3.0.0, Channel Bonding may be configured
|
||||
via the sysfs interface. This interface allows dynamic configuration
|
||||
of all bonds in the system without unloading the module. It also
|
||||
allows for adding and removing bonds at runtime. Ifenslave is no
|
||||
@@ -1030,9 +1097,6 @@ To enslave interface eth0 to bond bond0:
|
||||
To free slave eth0 from bond bond0:
|
||||
# echo -eth0 > /sys/class/net/bond0/bonding/slaves
|
||||
|
||||
NOTE: The bond must be up before slaves can be added. All
|
||||
slaves are freed when the interface is brought down.
|
||||
|
||||
When an interface is enslaved to a bond, symlinks between the
|
||||
two are created in the sysfs filesystem. In this case, you would get
|
||||
/sys/class/net/bond0/slave_eth0 pointing to /sys/class/net/eth0, and
|
||||
@@ -1622,6 +1686,15 @@ one for each switch in the network). This will insure that,
|
||||
regardless of which switch is active, the ARP monitor has a suitable
|
||||
target to query.
|
||||
|
||||
Note, also, that of late many switches now support a functionality
|
||||
generally referred to as "trunk failover." This is a feature of the
|
||||
switch that causes the link state of a particular switch port to be set
|
||||
down (or up) when the state of another switch port goes down (or up).
|
||||
It's purpose is to propogate link failures from logically "exterior" ports
|
||||
to the logically "interior" ports that bonding is able to monitor via
|
||||
miimon. Availability and configuration for trunk failover varies by
|
||||
switch, but this can be a viable alternative to the ARP monitor when using
|
||||
suitable switches.
|
||||
|
||||
12. Configuring Bonding for Maximum Throughput
|
||||
==============================================
|
||||
@@ -1709,7 +1782,7 @@ balance-rr: This mode is the only mode that will permit a single
|
||||
interfaces. It is therefore the only mode that will allow a
|
||||
single TCP/IP stream to utilize more than one interface's
|
||||
worth of throughput. This comes at a cost, however: the
|
||||
striping often results in peer systems receiving packets out
|
||||
striping generally results in peer systems receiving packets out
|
||||
of order, causing TCP/IP's congestion control system to kick
|
||||
in, often by retransmitting segments.
|
||||
|
||||
@@ -1721,22 +1794,20 @@ balance-rr: This mode is the only mode that will permit a single
|
||||
interface's worth of throughput, even after adjusting
|
||||
tcp_reordering.
|
||||
|
||||
Note that this out of order delivery occurs when both the
|
||||
sending and receiving systems are utilizing a multiple
|
||||
interface bond. Consider a configuration in which a
|
||||
balance-rr bond feeds into a single higher capacity network
|
||||
channel (e.g., multiple 100Mb/sec ethernets feeding a single
|
||||
gigabit ethernet via an etherchannel capable switch). In this
|
||||
configuration, traffic sent from the multiple 100Mb devices to
|
||||
a destination connected to the gigabit device will not see
|
||||
packets out of order. However, traffic sent from the gigabit
|
||||
device to the multiple 100Mb devices may or may not see
|
||||
traffic out of order, depending upon the balance policy of the
|
||||
switch. Many switches do not support any modes that stripe
|
||||
traffic (instead choosing a port based upon IP or MAC level
|
||||
addresses); for those devices, traffic flowing from the
|
||||
gigabit device to the many 100Mb devices will only utilize one
|
||||
interface.
|
||||
Note that the fraction of packets that will be delivered out of
|
||||
order is highly variable, and is unlikely to be zero. The level
|
||||
of reordering depends upon a variety of factors, including the
|
||||
networking interfaces, the switch, and the topology of the
|
||||
configuration. Speaking in general terms, higher speed network
|
||||
cards produce more reordering (due to factors such as packet
|
||||
coalescing), and a "many to many" topology will reorder at a
|
||||
higher rate than a "many slow to one fast" configuration.
|
||||
|
||||
Many switches do not support any modes that stripe traffic
|
||||
(instead choosing a port based upon IP or MAC level addresses);
|
||||
for those devices, traffic for a particular connection flowing
|
||||
through the switch to a balance-rr bond will not utilize greater
|
||||
than one interface's worth of bandwidth.
|
||||
|
||||
If you are utilizing protocols other than TCP/IP, UDP for
|
||||
example, and your application can tolerate out of order
|
||||
@@ -1936,6 +2007,10 @@ Failover may be delayed via the downdelay bonding module option.
|
||||
13.2 Duplicated Incoming Packets
|
||||
--------------------------------
|
||||
|
||||
NOTE: Starting with version 3.0.2, the bonding driver has logic to
|
||||
suppress duplicate packets, which should largely eliminate this problem.
|
||||
The following description is kept for reference.
|
||||
|
||||
It is not uncommon to observe a short burst of duplicated
|
||||
traffic when the bonding device is first used, or after it has been
|
||||
idle for some period of time. This is most easily observed by issuing
|
||||
@@ -2096,6 +2171,9 @@ The new driver was designed to be SMP safe from the start.
|
||||
EtherExpress PRO/100 and a 3com 3c905b, for example). For most modes,
|
||||
devices need not be of the same speed.
|
||||
|
||||
Starting with version 3.2.1, bonding also supports Infiniband
|
||||
slaves in active-backup mode.
|
||||
|
||||
3. How many bonding devices can I have?
|
||||
|
||||
There is no limit.
|
||||
@@ -2154,11 +2232,15 @@ switches currently available support 802.3ad.
|
||||
|
||||
8. Where does a bonding device get its MAC address from?
|
||||
|
||||
If not explicitly configured (with ifconfig or ip link), the
|
||||
MAC address of the bonding device is taken from its first slave
|
||||
device. This MAC address is then passed to all following slaves and
|
||||
remains persistent (even if the first slave is removed) until the
|
||||
bonding device is brought down or reconfigured.
|
||||
When using slave devices that have fixed MAC addresses, or when
|
||||
the fail_over_mac option is enabled, the bonding device's MAC address is
|
||||
the MAC address of the active slave.
|
||||
|
||||
For other configurations, if not explicitly configured (with
|
||||
ifconfig or ip link), the MAC address of the bonding device is taken from
|
||||
its first slave device. This MAC address is then passed to all following
|
||||
slaves and remains persistent (even if the first slave is removed) until
|
||||
the bonding device is brought down or reconfigured.
|
||||
|
||||
If you wish to change the MAC address, you can set it with
|
||||
ifconfig or ip link:
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -14,24 +14,35 @@ Introduction
|
||||
============
|
||||
|
||||
Datagram Congestion Control Protocol (DCCP) is an unreliable, connection
|
||||
based protocol designed to solve issues present in UDP and TCP particularly
|
||||
for real time and multimedia traffic.
|
||||
oriented protocol designed to solve issues present in UDP and TCP, particularly
|
||||
for real-time and multimedia (streaming) traffic.
|
||||
It divides into a base protocol (RFC 4340) and plugable congestion control
|
||||
modules called CCIDs. Like plugable TCP congestion control, at least one CCID
|
||||
needs to be enabled in order for the protocol to function properly. In the Linux
|
||||
implementation, this is the TCP-like CCID2 (RFC 4341). Additional CCIDs, such as
|
||||
the TCP-friendly CCID3 (RFC 4342), are optional.
|
||||
For a brief introduction to CCIDs and suggestions for choosing a CCID to match
|
||||
given applications, see section 10 of RFC 4340.
|
||||
|
||||
It has a base protocol and pluggable congestion control IDs (CCIDs).
|
||||
|
||||
It is at proposed standard RFC status and the homepage for DCCP as a protocol
|
||||
is at:
|
||||
http://www.read.cs.ucla.edu/dccp/
|
||||
DCCP is a Proposed Standard (RFC 2026), and the homepage for DCCP as a protocol
|
||||
is at http://www.ietf.org/html.charters/dccp-charter.html
|
||||
|
||||
Missing features
|
||||
================
|
||||
|
||||
The DCCP implementation does not currently have all the features that are in
|
||||
the RFC.
|
||||
The Linux DCCP implementation does not currently support all the features that are
|
||||
specified in RFCs 4340...42.
|
||||
|
||||
The known bugs are at:
|
||||
http://linux-net.osdl.org/index.php/TODO#DCCP
|
||||
|
||||
For more up-to-date versions of the DCCP implementation, please consider using
|
||||
the experimental DCCP test tree; instructions for checking this out are on:
|
||||
http://linux-net.osdl.org/index.php/DCCP_Testing#Experimental_DCCP_source_tree
|
||||
|
||||
|
||||
Socket options
|
||||
==============
|
||||
|
||||
@@ -46,6 +57,12 @@ can be set before calling bind().
|
||||
DCCP_SOCKOPT_GET_CUR_MPS is read-only and retrieves the current maximum packet
|
||||
size (application payload size) in bytes, see RFC 4340, section 14.
|
||||
|
||||
DCCP_SOCKOPT_SERVER_TIMEWAIT enables the server (listening socket) to hold
|
||||
timewait state when closing the connection (RFC 4340, 8.3). The usual case is
|
||||
that the closing server sends a CloseReq, whereupon the client holds timewait
|
||||
state. When this boolean socket option is on, the server sends a Close instead
|
||||
and will enter TIMEWAIT. This option must be set after accept() returns.
|
||||
|
||||
DCCP_SOCKOPT_SEND_CSCOV and DCCP_SOCKOPT_RECV_CSCOV are used for setting the
|
||||
partial checksum coverage (RFC 4340, sec. 9.2). The default is that checksums
|
||||
always cover the entire packet and that only fully covered application data is
|
||||
@@ -72,6 +89,8 @@ DCCP_SOCKOPT_CCID_TX_INFO
|
||||
Returns a `struct tfrc_tx_info' in optval; the buffer for optval and
|
||||
optlen must be set to at least sizeof(struct tfrc_tx_info).
|
||||
|
||||
On unidirectional connections it is useful to close the unused half-connection
|
||||
via shutdown (SHUT_WR or SHUT_RD): this will reduce per-packet processing costs.
|
||||
|
||||
Sysctl variables
|
||||
================
|
||||
@@ -123,6 +142,12 @@ sync_ratelimit = 125 ms
|
||||
sequence-invalid packets on the same socket (RFC 4340, 7.5.4). The unit
|
||||
of this parameter is milliseconds; a value of 0 disables rate-limiting.
|
||||
|
||||
IOCTLS
|
||||
======
|
||||
FIONREAD
|
||||
Works as in udp(7): returns in the `int' argument pointer the size of
|
||||
the next pending datagram in bytes, or 0 when no datagram is pending.
|
||||
|
||||
Notes
|
||||
=====
|
||||
|
||||
|
||||
@@ -446,6 +446,33 @@ tcp_dma_copybreak - INTEGER
|
||||
and CONFIG_NET_DMA is enabled.
|
||||
Default: 4096
|
||||
|
||||
UDP variables:
|
||||
|
||||
udp_mem - vector of 3 INTEGERs: min, pressure, max
|
||||
Number of pages allowed for queueing by all UDP sockets.
|
||||
|
||||
min: Below this number of pages UDP is not bothered about its
|
||||
memory appetite. When amount of memory allocated by UDP exceeds
|
||||
this number, UDP starts to moderate memory usage.
|
||||
|
||||
pressure: This value was introduced to follow format of tcp_mem.
|
||||
|
||||
max: Number of pages allowed for queueing by all UDP sockets.
|
||||
|
||||
Default is calculated at boot time from amount of available memory.
|
||||
|
||||
udp_rmem_min - INTEGER
|
||||
Minimal size of receive buffer used by UDP sockets in moderation.
|
||||
Each UDP socket is able to use the size for receiving data, even if
|
||||
total pages of UDP sockets exceed udp_mem pressure. The unit is byte.
|
||||
Default: 4096
|
||||
|
||||
udp_wmem_min - INTEGER
|
||||
Minimal size of send buffer used by UDP sockets in moderation.
|
||||
Each UDP socket is able to use the size for sending data, even if
|
||||
total pages of UDP sockets exceed udp_mem pressure. The unit is byte.
|
||||
Default: 4096
|
||||
|
||||
CIPSOv4 Variables:
|
||||
|
||||
cipso_cache_enable - BOOLEAN
|
||||
|
||||
@@ -1,48 +0,0 @@
|
||||
Traffic Shaper For Linux
|
||||
|
||||
This is the current BETA release of the traffic shaper for Linux. It works
|
||||
within the following limits:
|
||||
|
||||
o Minimum shaping speed is currently about 9600 baud (it can only
|
||||
shape down to 1 byte per clock tick)
|
||||
|
||||
o Maximum is about 256K, it will go above this but get a bit blocky.
|
||||
|
||||
o If you ifconfig the master device that a shaper is attached to down
|
||||
then your machine will follow.
|
||||
|
||||
o The shaper must be a module.
|
||||
|
||||
|
||||
Setup:
|
||||
|
||||
A shaper device is configured using the shapeconfig program.
|
||||
Typically you will do something like this
|
||||
|
||||
shapecfg attach shaper0 eth1
|
||||
shapecfg speed shaper0 64000
|
||||
ifconfig shaper0 myhost netmask 255.255.255.240 broadcast 1.2.3.4.255 up
|
||||
route add -net some.network netmask a.b.c.d dev shaper0
|
||||
|
||||
The shaper should have the same IP address as the device it is attached to
|
||||
for normal use.
|
||||
|
||||
Gotchas:
|
||||
|
||||
The shaper shapes transmitted traffic. It's rather impossible to
|
||||
shape received traffic except at the end (or a router) transmitting it.
|
||||
|
||||
Gated/routed/rwhod/mrouted all see the shaper as an additional device
|
||||
and will treat it as such unless patched. Note that for mrouted you can run
|
||||
mrouted tunnels via a traffic shaper to control bandwidth usage.
|
||||
|
||||
The shaper is device/route based. This makes it very easy to use
|
||||
with any setup BUT less flexible. You may need to use iproute2 to set up
|
||||
multiple route tables to get the flexibility.
|
||||
|
||||
There is no "borrowing" or "sharing" scheme. This is a simple
|
||||
traffic limiter. We implement Van Jacobson and Sally Floyd's CBQ
|
||||
architecture into Linux 2.2. This is the preferred solution. Shaper is
|
||||
for simple or back compatible setups.
|
||||
|
||||
Alan
|
||||
@@ -236,7 +236,7 @@
|
||||
|
||||
This displays UDP-Lite statistics variables, whose meaning is as follows.
|
||||
|
||||
InDatagrams: Total number of received datagrams.
|
||||
InDatagrams: The total number of datagrams delivered to users.
|
||||
|
||||
NoPorts: Number of packets received to an unknown port.
|
||||
These cases are counted separately (not as InErrors).
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
XFRM proc - /proc/net/xfrm_* files
|
||||
==================================
|
||||
Masahide NAKAMURA <nakam@linux-ipv6.org>
|
||||
|
||||
|
||||
Transformation Statistics
|
||||
-------------------------
|
||||
xfrm_proc is a statistics shown factor dropped by transformation
|
||||
for developer.
|
||||
It is a counter designed from current transformation source code
|
||||
and defined like linux private MIB.
|
||||
|
||||
Inbound statistics
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
XfrmInError:
|
||||
All errors which is not matched others
|
||||
XfrmInBufferError:
|
||||
No buffer is left
|
||||
XfrmInHdrError:
|
||||
Header error
|
||||
XfrmInNoStates:
|
||||
No state is found
|
||||
i.e. Either inbound SPI, address, or IPsec protocol at SA is wrong
|
||||
XfrmInStateProtoError:
|
||||
Transformation protocol specific error
|
||||
e.g. SA key is wrong
|
||||
XfrmInStateModeError:
|
||||
Transformation mode specific error
|
||||
XfrmInSeqOutOfWindow:
|
||||
Sequence out of window
|
||||
XfrmInStateExpired:
|
||||
State is expired
|
||||
XfrmInStateMismatch:
|
||||
State has mismatch option
|
||||
e.g. UDP encapsulation type is mismatch
|
||||
XfrmInStateInvalid:
|
||||
State is invalid
|
||||
XfrmInTmplMismatch:
|
||||
No matching template for states
|
||||
e.g. Inbound SAs are correct but SP rule is wrong
|
||||
XfrmInNoPols:
|
||||
No policy is found for states
|
||||
e.g. Inbound SAs are correct but no SP is found
|
||||
XfrmInPolBlock:
|
||||
Policy discards
|
||||
XfrmInPolError:
|
||||
Policy error
|
||||
|
||||
Outbound errors
|
||||
~~~~~~~~~~~~~~~
|
||||
XfrmOutError:
|
||||
All errors which is not matched others
|
||||
XfrmOutBundleGenError:
|
||||
Bundle generation error
|
||||
XfrmOutBundleCheckError:
|
||||
Bundle check error
|
||||
XfrmOutNoStates:
|
||||
No state is found
|
||||
XfrmOutStateProtoError:
|
||||
Transformation protocol specific error
|
||||
XfrmOutStateModeError:
|
||||
Transformation mode specific error
|
||||
XfrmOutStateExpired:
|
||||
State is expired
|
||||
XfrmOutPolBlock:
|
||||
Policy discards
|
||||
XfrmOutPolDead:
|
||||
Policy is dead
|
||||
XfrmOutPolError:
|
||||
Policy error
|
||||
+45
-3
@@ -646,6 +646,17 @@ M: ecashin@coraid.com
|
||||
W: http://www.coraid.com/support/linux
|
||||
S: Supported
|
||||
|
||||
ATHEROS ATH5K WIRELESS DRIVER
|
||||
P: Jiri Slaby
|
||||
M: jirislaby@gmail.com
|
||||
P: Nick Kossifidis
|
||||
M: mickflemm@gmail.com
|
||||
P: Luis R. Rodriguez
|
||||
M: mcgrof@gmail.com
|
||||
L: linux-wireless@vger.kernel.org
|
||||
L: ath5k-devel@lists.ath5k.org
|
||||
S: Maintained
|
||||
|
||||
ATL1 ETHERNET DRIVER
|
||||
P: Jay Cliburn
|
||||
M: jcliburn@gmail.com
|
||||
@@ -809,7 +820,7 @@ P: Stefano Brivio
|
||||
M: stefano.brivio@polimi.it
|
||||
L: linux-wireless@vger.kernel.org
|
||||
W: http://bcm43xx.berlios.de/
|
||||
S: Maintained
|
||||
S: Obsolete
|
||||
|
||||
BEFS FILE SYSTEM
|
||||
P: Sergey S. Kostyliov
|
||||
@@ -982,6 +993,15 @@ M: corbet@lwn.net
|
||||
L: video4linux-list@redhat.com
|
||||
S: Maintained
|
||||
|
||||
CAN NETWORK LAYER
|
||||
P: Urs Thuermann
|
||||
M: urs.thuermann@volkswagen.de
|
||||
P: Oliver Hartkopp
|
||||
M: oliver.hartkopp@volkswagen.de
|
||||
L: socketcan-core@lists.berlios.de
|
||||
W: http://developer.berlios.de/projects/socketcan/
|
||||
S: Maintained
|
||||
|
||||
CALGARY x86-64 IOMMU
|
||||
P: Muli Ben-Yehuda
|
||||
M: muli@il.ibm.com
|
||||
@@ -2027,10 +2047,12 @@ W: http://sourceforge.net/projects/e1000/
|
||||
S: Supported
|
||||
|
||||
INTEL PRO/WIRELESS 2100 NETWORK CONNECTION SUPPORT
|
||||
P: Yi Zhu
|
||||
P: Zhu Yi
|
||||
M: yi.zhu@intel.com
|
||||
P: James Ketrenos
|
||||
M: jketreno@linux.intel.com
|
||||
P: Reinette Chatre
|
||||
M: reinette.chatre@intel.com
|
||||
L: linux-wireless@vger.kernel.org
|
||||
L: ipw2100-devel@lists.sourceforge.net
|
||||
W: http://lists.sourceforge.net/mailman/listinfo/ipw2100-devel
|
||||
@@ -2038,10 +2060,12 @@ W: http://ipw2100.sourceforge.net
|
||||
S: Supported
|
||||
|
||||
INTEL PRO/WIRELESS 2915ABG NETWORK CONNECTION SUPPORT
|
||||
P: Yi Zhu
|
||||
P: Zhu Yi
|
||||
M: yi.zhu@intel.com
|
||||
P: James Ketrenos
|
||||
M: jketreno@linux.intel.com
|
||||
P: Reinette Chatre
|
||||
M: reinette.chatre@intel.com
|
||||
L: linux-wireless@vger.kernel.org
|
||||
L: ipw2100-devel@lists.sourceforge.net
|
||||
W: http://lists.sourceforge.net/mailman/listinfo/ipw2100-devel
|
||||
@@ -2051,6 +2075,8 @@ S: Supported
|
||||
INTEL WIRELESS WIFI LINK (iwlwifi)
|
||||
P: Zhu Yi
|
||||
M: yi.zhu@intel.com
|
||||
P: Reinette Chatre
|
||||
M: reinette.chatre@intel.com
|
||||
L: linux-wireless@vger.kernel.org
|
||||
L: ipw3945-devel@lists.sourceforge.net
|
||||
W: http://intellinuxwireless.org
|
||||
@@ -2482,6 +2508,16 @@ W: http://linuxwireless.org/
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.git
|
||||
S: Maintained
|
||||
|
||||
MAC80211 PID RATE CONTROL
|
||||
P: Stefano Brivio
|
||||
M: stefano.brivio@polimi.it
|
||||
P: Mattias Nissler
|
||||
M: mattias.nissler@gmx.de
|
||||
L: linux-wireless@vger.kernel.org
|
||||
W: http://linuxwireless.org/en/developers/Documentation/mac80211/RateControl/PID
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.git
|
||||
S: Maintained
|
||||
|
||||
MACVLAN DRIVER
|
||||
P: Patrick McHardy
|
||||
M: kaber@trash.net
|
||||
@@ -3183,6 +3219,12 @@ M: mporter@kernel.crashing.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
RDC R6040 FAST ETHERNET DRIVER
|
||||
P: Florian Fainelli
|
||||
M: florian.fainelli@telecomint.eu
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
READ-COPY UPDATE (RCU)
|
||||
P: Dipankar Sarma
|
||||
M: dipankar@in.ibm.com
|
||||
|
||||
@@ -497,11 +497,6 @@ simeth_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
struct net_device *dev = dev_id;
|
||||
|
||||
if ( dev == NULL ) {
|
||||
printk(KERN_WARNING "simeth: irq %d for unknown device\n", irq);
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
/*
|
||||
* very simple loop because we get interrupts only when receiving
|
||||
*/
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
obj-y += setup.o pci.o time.o idle.o powersave.o iommu.o
|
||||
obj-y += setup.o pci.o time.o idle.o powersave.o iommu.o dma_lib.o
|
||||
obj-$(CONFIG_PPC_PASEMI_MDIO) += gpio_mdio.o
|
||||
obj-$(CONFIG_ELECTRA_IDE) += electra_ide.o
|
||||
obj-$(CONFIG_PPC_PASEMI_CPUFREQ) += cpufreq.o
|
||||
|
||||
@@ -0,0 +1,488 @@
|
||||
/*
|
||||
* Copyright (C) 2006-2007 PA Semi, Inc
|
||||
*
|
||||
* Common functions for DMA access on PA Semi PWRficient
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/of.h>
|
||||
|
||||
#include <asm/pasemi_dma.h>
|
||||
|
||||
#define MAX_TXCH 64
|
||||
#define MAX_RXCH 64
|
||||
|
||||
static struct pasdma_status *dma_status;
|
||||
|
||||
static void __iomem *iob_regs;
|
||||
static void __iomem *mac_regs[6];
|
||||
static void __iomem *dma_regs;
|
||||
|
||||
static int base_hw_irq;
|
||||
|
||||
static int num_txch, num_rxch;
|
||||
|
||||
static struct pci_dev *dma_pdev;
|
||||
|
||||
/* Bitmaps to handle allocation of channels */
|
||||
|
||||
static DECLARE_BITMAP(txch_free, MAX_TXCH);
|
||||
static DECLARE_BITMAP(rxch_free, MAX_RXCH);
|
||||
|
||||
/* pasemi_read_iob_reg - read IOB register
|
||||
* @reg: Register to read (offset into PCI CFG space)
|
||||
*/
|
||||
unsigned int pasemi_read_iob_reg(unsigned int reg)
|
||||
{
|
||||
return in_le32(iob_regs+reg);
|
||||
}
|
||||
EXPORT_SYMBOL(pasemi_read_iob_reg);
|
||||
|
||||
/* pasemi_write_iob_reg - write IOB register
|
||||
* @reg: Register to write to (offset into PCI CFG space)
|
||||
* @val: Value to write
|
||||
*/
|
||||
void pasemi_write_iob_reg(unsigned int reg, unsigned int val)
|
||||
{
|
||||
out_le32(iob_regs+reg, val);
|
||||
}
|
||||
EXPORT_SYMBOL(pasemi_write_iob_reg);
|
||||
|
||||
/* pasemi_read_mac_reg - read MAC register
|
||||
* @intf: MAC interface
|
||||
* @reg: Register to read (offset into PCI CFG space)
|
||||
*/
|
||||
unsigned int pasemi_read_mac_reg(int intf, unsigned int reg)
|
||||
{
|
||||
return in_le32(mac_regs[intf]+reg);
|
||||
}
|
||||
EXPORT_SYMBOL(pasemi_read_mac_reg);
|
||||
|
||||
/* pasemi_write_mac_reg - write MAC register
|
||||
* @intf: MAC interface
|
||||
* @reg: Register to write to (offset into PCI CFG space)
|
||||
* @val: Value to write
|
||||
*/
|
||||
void pasemi_write_mac_reg(int intf, unsigned int reg, unsigned int val)
|
||||
{
|
||||
out_le32(mac_regs[intf]+reg, val);
|
||||
}
|
||||
EXPORT_SYMBOL(pasemi_write_mac_reg);
|
||||
|
||||
/* pasemi_read_dma_reg - read DMA register
|
||||
* @reg: Register to read (offset into PCI CFG space)
|
||||
*/
|
||||
unsigned int pasemi_read_dma_reg(unsigned int reg)
|
||||
{
|
||||
return in_le32(dma_regs+reg);
|
||||
}
|
||||
EXPORT_SYMBOL(pasemi_read_dma_reg);
|
||||
|
||||
/* pasemi_write_dma_reg - write DMA register
|
||||
* @reg: Register to write to (offset into PCI CFG space)
|
||||
* @val: Value to write
|
||||
*/
|
||||
void pasemi_write_dma_reg(unsigned int reg, unsigned int val)
|
||||
{
|
||||
out_le32(dma_regs+reg, val);
|
||||
}
|
||||
EXPORT_SYMBOL(pasemi_write_dma_reg);
|
||||
|
||||
static int pasemi_alloc_tx_chan(enum pasemi_dmachan_type type)
|
||||
{
|
||||
int bit;
|
||||
int start, limit;
|
||||
|
||||
switch (type & (TXCHAN_EVT0|TXCHAN_EVT1)) {
|
||||
case TXCHAN_EVT0:
|
||||
start = 0;
|
||||
limit = 10;
|
||||
break;
|
||||
case TXCHAN_EVT1:
|
||||
start = 10;
|
||||
limit = MAX_TXCH;
|
||||
break;
|
||||
default:
|
||||
start = 0;
|
||||
limit = MAX_TXCH;
|
||||
break;
|
||||
}
|
||||
retry:
|
||||
bit = find_next_bit(txch_free, MAX_TXCH, start);
|
||||
if (bit >= limit)
|
||||
return -ENOSPC;
|
||||
if (!test_and_clear_bit(bit, txch_free))
|
||||
goto retry;
|
||||
|
||||
return bit;
|
||||
}
|
||||
|
||||
static void pasemi_free_tx_chan(int chan)
|
||||
{
|
||||
BUG_ON(test_bit(chan, txch_free));
|
||||
set_bit(chan, txch_free);
|
||||
}
|
||||
|
||||
static int pasemi_alloc_rx_chan(void)
|
||||
{
|
||||
int bit;
|
||||
retry:
|
||||
bit = find_first_bit(rxch_free, MAX_RXCH);
|
||||
if (bit >= MAX_TXCH)
|
||||
return -ENOSPC;
|
||||
if (!test_and_clear_bit(bit, rxch_free))
|
||||
goto retry;
|
||||
|
||||
return bit;
|
||||
}
|
||||
|
||||
static void pasemi_free_rx_chan(int chan)
|
||||
{
|
||||
BUG_ON(test_bit(chan, rxch_free));
|
||||
set_bit(chan, rxch_free);
|
||||
}
|
||||
|
||||
/* pasemi_dma_alloc_chan - Allocate a DMA channel
|
||||
* @type: Type of channel to allocate
|
||||
* @total_size: Total size of structure to allocate (to allow for more
|
||||
* room behind the structure to be used by the client)
|
||||
* @offset: Offset in bytes from start of the total structure to the beginning
|
||||
* of struct pasemi_dmachan. Needed when struct pasemi_dmachan is
|
||||
* not the first member of the client structure.
|
||||
*
|
||||
* pasemi_dma_alloc_chan allocates a DMA channel for use by a client. The
|
||||
* type argument specifies whether it's a RX or TX channel, and in the case
|
||||
* of TX channels which group it needs to belong to (if any).
|
||||
*
|
||||
* Returns a pointer to the total structure allocated on success, NULL
|
||||
* on failure.
|
||||
*/
|
||||
void *pasemi_dma_alloc_chan(enum pasemi_dmachan_type type,
|
||||
int total_size, int offset)
|
||||
{
|
||||
void *buf;
|
||||
struct pasemi_dmachan *chan;
|
||||
int chno;
|
||||
|
||||
BUG_ON(total_size < sizeof(struct pasemi_dmachan));
|
||||
|
||||
buf = kzalloc(total_size, GFP_KERNEL);
|
||||
|
||||
if (!buf)
|
||||
return NULL;
|
||||
chan = buf + offset;
|
||||
|
||||
chan->priv = buf;
|
||||
|
||||
switch (type & (TXCHAN|RXCHAN)) {
|
||||
case RXCHAN:
|
||||
chno = pasemi_alloc_rx_chan();
|
||||
chan->chno = chno;
|
||||
chan->irq = irq_create_mapping(NULL,
|
||||
base_hw_irq + num_txch + chno);
|
||||
chan->status = &dma_status->rx_sta[chno];
|
||||
break;
|
||||
case TXCHAN:
|
||||
chno = pasemi_alloc_tx_chan(type);
|
||||
chan->chno = chno;
|
||||
chan->irq = irq_create_mapping(NULL, base_hw_irq + chno);
|
||||
chan->status = &dma_status->tx_sta[chno];
|
||||
break;
|
||||
}
|
||||
|
||||
chan->chan_type = type;
|
||||
|
||||
return chan;
|
||||
}
|
||||
EXPORT_SYMBOL(pasemi_dma_alloc_chan);
|
||||
|
||||
/* pasemi_dma_free_chan - Free a previously allocated channel
|
||||
* @chan: Channel to free
|
||||
*
|
||||
* Frees a previously allocated channel. It will also deallocate any
|
||||
* descriptor ring associated with the channel, if allocated.
|
||||
*/
|
||||
void pasemi_dma_free_chan(struct pasemi_dmachan *chan)
|
||||
{
|
||||
if (chan->ring_virt)
|
||||
pasemi_dma_free_ring(chan);
|
||||
|
||||
switch (chan->chan_type & (RXCHAN|TXCHAN)) {
|
||||
case RXCHAN:
|
||||
pasemi_free_rx_chan(chan->chno);
|
||||
break;
|
||||
case TXCHAN:
|
||||
pasemi_free_tx_chan(chan->chno);
|
||||
break;
|
||||
}
|
||||
|
||||
kfree(chan->priv);
|
||||
}
|
||||
EXPORT_SYMBOL(pasemi_dma_free_chan);
|
||||
|
||||
/* pasemi_dma_alloc_ring - Allocate descriptor ring for a channel
|
||||
* @chan: Channel for which to allocate
|
||||
* @ring_size: Ring size in 64-bit (8-byte) words
|
||||
*
|
||||
* Allocate a descriptor ring for a channel. Returns 0 on success, errno
|
||||
* on failure. The passed in struct pasemi_dmachan is updated with the
|
||||
* virtual and DMA addresses of the ring.
|
||||
*/
|
||||
int pasemi_dma_alloc_ring(struct pasemi_dmachan *chan, int ring_size)
|
||||
{
|
||||
BUG_ON(chan->ring_virt);
|
||||
|
||||
chan->ring_size = ring_size;
|
||||
|
||||
chan->ring_virt = dma_alloc_coherent(&dma_pdev->dev,
|
||||
ring_size * sizeof(u64),
|
||||
&chan->ring_dma, GFP_KERNEL);
|
||||
|
||||
if (!chan->ring_virt)
|
||||
return -ENOMEM;
|
||||
|
||||
memset(chan->ring_virt, 0, ring_size * sizeof(u64));
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(pasemi_dma_alloc_ring);
|
||||
|
||||
/* pasemi_dma_free_ring - Free an allocated descriptor ring for a channel
|
||||
* @chan: Channel for which to free the descriptor ring
|
||||
*
|
||||
* Frees a previously allocated descriptor ring for a channel.
|
||||
*/
|
||||
void pasemi_dma_free_ring(struct pasemi_dmachan *chan)
|
||||
{
|
||||
BUG_ON(!chan->ring_virt);
|
||||
|
||||
dma_free_coherent(&dma_pdev->dev, chan->ring_size * sizeof(u64),
|
||||
chan->ring_virt, chan->ring_dma);
|
||||
chan->ring_virt = NULL;
|
||||
chan->ring_size = 0;
|
||||
chan->ring_dma = 0;
|
||||
}
|
||||
EXPORT_SYMBOL(pasemi_dma_free_ring);
|
||||
|
||||
/* pasemi_dma_start_chan - Start a DMA channel
|
||||
* @chan: Channel to start
|
||||
* @cmdsta: Additional CCMDSTA/TCMDSTA bits to write
|
||||
*
|
||||
* Enables (starts) a DMA channel with optional additional arguments.
|
||||
*/
|
||||
void pasemi_dma_start_chan(const struct pasemi_dmachan *chan, const u32 cmdsta)
|
||||
{
|
||||
if (chan->chan_type == RXCHAN)
|
||||
pasemi_write_dma_reg(PAS_DMA_RXCHAN_CCMDSTA(chan->chno),
|
||||
cmdsta | PAS_DMA_RXCHAN_CCMDSTA_EN);
|
||||
else
|
||||
pasemi_write_dma_reg(PAS_DMA_TXCHAN_TCMDSTA(chan->chno),
|
||||
cmdsta | PAS_DMA_TXCHAN_TCMDSTA_EN);
|
||||
}
|
||||
EXPORT_SYMBOL(pasemi_dma_start_chan);
|
||||
|
||||
/* pasemi_dma_stop_chan - Stop a DMA channel
|
||||
* @chan: Channel to stop
|
||||
*
|
||||
* Stops (disables) a DMA channel. This is done by setting the ST bit in the
|
||||
* CMDSTA register and waiting on the ACT (active) bit to clear, then
|
||||
* finally disabling the whole channel.
|
||||
*
|
||||
* This function will only try for a short while for the channel to stop, if
|
||||
* it doesn't it will return failure.
|
||||
*
|
||||
* Returns 1 on success, 0 on failure.
|
||||
*/
|
||||
#define MAX_RETRIES 5000
|
||||
int pasemi_dma_stop_chan(const struct pasemi_dmachan *chan)
|
||||
{
|
||||
int reg, retries;
|
||||
u32 sta;
|
||||
|
||||
if (chan->chan_type == RXCHAN) {
|
||||
reg = PAS_DMA_RXCHAN_CCMDSTA(chan->chno);
|
||||
pasemi_write_dma_reg(reg, PAS_DMA_RXCHAN_CCMDSTA_ST);
|
||||
for (retries = 0; retries < MAX_RETRIES; retries++) {
|
||||
sta = pasemi_read_dma_reg(reg);
|
||||
if (!(sta & PAS_DMA_RXCHAN_CCMDSTA_ACT)) {
|
||||
pasemi_write_dma_reg(reg, 0);
|
||||
return 1;
|
||||
}
|
||||
cond_resched();
|
||||
}
|
||||
} else {
|
||||
reg = PAS_DMA_TXCHAN_TCMDSTA(chan->chno);
|
||||
pasemi_write_dma_reg(reg, PAS_DMA_TXCHAN_TCMDSTA_ST);
|
||||
for (retries = 0; retries < MAX_RETRIES; retries++) {
|
||||
sta = pasemi_read_dma_reg(reg);
|
||||
if (!(sta & PAS_DMA_TXCHAN_TCMDSTA_ACT)) {
|
||||
pasemi_write_dma_reg(reg, 0);
|
||||
return 1;
|
||||
}
|
||||
cond_resched();
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(pasemi_dma_stop_chan);
|
||||
|
||||
/* pasemi_dma_alloc_buf - Allocate a buffer to use for DMA
|
||||
* @chan: Channel to allocate for
|
||||
* @size: Size of buffer in bytes
|
||||
* @handle: DMA handle
|
||||
*
|
||||
* Allocate a buffer to be used by the DMA engine for read/write,
|
||||
* similar to dma_alloc_coherent().
|
||||
*
|
||||
* Returns the virtual address of the buffer, or NULL in case of failure.
|
||||
*/
|
||||
void *pasemi_dma_alloc_buf(struct pasemi_dmachan *chan, int size,
|
||||
dma_addr_t *handle)
|
||||
{
|
||||
return dma_alloc_coherent(&dma_pdev->dev, size, handle, GFP_KERNEL);
|
||||
}
|
||||
EXPORT_SYMBOL(pasemi_dma_alloc_buf);
|
||||
|
||||
/* pasemi_dma_free_buf - Free a buffer used for DMA
|
||||
* @chan: Channel the buffer was allocated for
|
||||
* @size: Size of buffer in bytes
|
||||
* @handle: DMA handle
|
||||
*
|
||||
* Frees a previously allocated buffer.
|
||||
*/
|
||||
void pasemi_dma_free_buf(struct pasemi_dmachan *chan, int size,
|
||||
dma_addr_t *handle)
|
||||
{
|
||||
dma_free_coherent(&dma_pdev->dev, size, handle, GFP_KERNEL);
|
||||
}
|
||||
EXPORT_SYMBOL(pasemi_dma_free_buf);
|
||||
|
||||
static void *map_onedev(struct pci_dev *p, int index)
|
||||
{
|
||||
struct device_node *dn;
|
||||
void __iomem *ret;
|
||||
|
||||
dn = pci_device_to_OF_node(p);
|
||||
if (!dn)
|
||||
goto fallback;
|
||||
|
||||
ret = of_iomap(dn, index);
|
||||
if (!ret)
|
||||
goto fallback;
|
||||
|
||||
return ret;
|
||||
fallback:
|
||||
/* This is hardcoded and ugly, but we have some firmware versions
|
||||
* that don't provide the register space in the device tree. Luckily
|
||||
* they are at well-known locations so we can just do the math here.
|
||||
*/
|
||||
return ioremap(0xe0000000 + (p->devfn << 12), 0x2000);
|
||||
}
|
||||
|
||||
/* pasemi_dma_init - Initialize the PA Semi DMA library
|
||||
*
|
||||
* This function initializes the DMA library. It must be called before
|
||||
* any other function in the library.
|
||||
*
|
||||
* Returns 0 on success, errno on failure.
|
||||
*/
|
||||
int pasemi_dma_init(void)
|
||||
{
|
||||
static spinlock_t init_lock = SPIN_LOCK_UNLOCKED;
|
||||
struct pci_dev *iob_pdev;
|
||||
struct pci_dev *pdev;
|
||||
struct resource res;
|
||||
struct device_node *dn;
|
||||
int i, intf, err = 0;
|
||||
u32 tmp;
|
||||
|
||||
if (!machine_is(pasemi))
|
||||
return -ENODEV;
|
||||
|
||||
spin_lock(&init_lock);
|
||||
|
||||
/* Make sure we haven't already initialized */
|
||||
if (dma_pdev)
|
||||
goto out;
|
||||
|
||||
iob_pdev = pci_get_device(PCI_VENDOR_ID_PASEMI, 0xa001, NULL);
|
||||
if (!iob_pdev) {
|
||||
BUG();
|
||||
printk(KERN_WARNING "Can't find I/O Bridge\n");
|
||||
err = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
iob_regs = map_onedev(iob_pdev, 0);
|
||||
|
||||
dma_pdev = pci_get_device(PCI_VENDOR_ID_PASEMI, 0xa007, NULL);
|
||||
if (!dma_pdev) {
|
||||
BUG();
|
||||
printk(KERN_WARNING "Can't find DMA controller\n");
|
||||
err = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
dma_regs = map_onedev(dma_pdev, 0);
|
||||
base_hw_irq = virq_to_hw(dma_pdev->irq);
|
||||
|
||||
pci_read_config_dword(dma_pdev, PAS_DMA_CAP_TXCH, &tmp);
|
||||
num_txch = (tmp & PAS_DMA_CAP_TXCH_TCHN_M) >> PAS_DMA_CAP_TXCH_TCHN_S;
|
||||
|
||||
pci_read_config_dword(dma_pdev, PAS_DMA_CAP_RXCH, &tmp);
|
||||
num_rxch = (tmp & PAS_DMA_CAP_RXCH_RCHN_M) >> PAS_DMA_CAP_RXCH_RCHN_S;
|
||||
|
||||
intf = 0;
|
||||
for (pdev = pci_get_device(PCI_VENDOR_ID_PASEMI, 0xa006, NULL);
|
||||
pdev;
|
||||
pdev = pci_get_device(PCI_VENDOR_ID_PASEMI, 0xa006, pdev))
|
||||
mac_regs[intf++] = map_onedev(pdev, 0);
|
||||
|
||||
pci_dev_put(pdev);
|
||||
|
||||
for (pdev = pci_get_device(PCI_VENDOR_ID_PASEMI, 0xa005, NULL);
|
||||
pdev;
|
||||
pdev = pci_get_device(PCI_VENDOR_ID_PASEMI, 0xa005, pdev))
|
||||
mac_regs[intf++] = map_onedev(pdev, 0);
|
||||
|
||||
pci_dev_put(pdev);
|
||||
|
||||
dn = pci_device_to_OF_node(iob_pdev);
|
||||
if (dn)
|
||||
err = of_address_to_resource(dn, 1, &res);
|
||||
if (!dn || err) {
|
||||
/* Fallback for old firmware */
|
||||
res.start = 0xfd800000;
|
||||
res.end = res.start + 0x1000;
|
||||
}
|
||||
dma_status = __ioremap(res.start, res.end-res.start, 0);
|
||||
pci_dev_put(iob_pdev);
|
||||
|
||||
for (i = 0; i < MAX_TXCH; i++)
|
||||
__set_bit(i, txch_free);
|
||||
|
||||
for (i = 0; i < MAX_RXCH; i++)
|
||||
__set_bit(i, rxch_free);
|
||||
|
||||
printk(KERN_INFO "PA Semi PWRficient DMA library initialized "
|
||||
"(%d tx, %d rx channels)\n", num_txch, num_rxch);
|
||||
|
||||
out:
|
||||
spin_unlock(&init_lock);
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(pasemi_dma_init);
|
||||
@@ -9,6 +9,7 @@ extern void __devinit pas_pci_dma_dev_setup(struct pci_dev *dev);
|
||||
extern void __iomem *pasemi_pci_getcfgaddr(struct pci_dev *dev, int offset);
|
||||
|
||||
extern void __init alloc_iobmap_l2(void);
|
||||
extern void __init pasemi_map_registers(void);
|
||||
|
||||
/* Power savings modes, implemented in asm */
|
||||
extern void idle_spin(void);
|
||||
|
||||
@@ -272,7 +272,7 @@ scc_enet_timeout(struct net_device *dev)
|
||||
* This is called from the CPM handler, not the MPC core interrupt.
|
||||
*/
|
||||
static irqreturn_t
|
||||
scc_enet_interrupt(int irq, void * dev_id)
|
||||
scc_enet_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
struct net_device *dev = dev_id;
|
||||
volatile struct scc_enet_private *cep;
|
||||
@@ -280,7 +280,7 @@ scc_enet_interrupt(int irq, void * dev_id)
|
||||
ushort int_events;
|
||||
int must_restart;
|
||||
|
||||
cep = (struct scc_enet_private *)dev->priv;
|
||||
cep = dev->priv;
|
||||
|
||||
/* Get the interrupt events that caused us to be here.
|
||||
*/
|
||||
|
||||
@@ -524,7 +524,7 @@ fcc_enet_timeout(struct net_device *dev)
|
||||
|
||||
/* The interrupt handler. */
|
||||
static irqreturn_t
|
||||
fcc_enet_interrupt(int irq, void * dev_id)
|
||||
fcc_enet_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
struct net_device *dev = dev_id;
|
||||
volatile struct fcc_enet_private *cep;
|
||||
@@ -532,7 +532,7 @@ fcc_enet_interrupt(int irq, void * dev_id)
|
||||
ushort int_events;
|
||||
int must_restart;
|
||||
|
||||
cep = (struct fcc_enet_private *)dev->priv;
|
||||
cep = dev->priv;
|
||||
|
||||
/* Get the interrupt events that caused us to be here.
|
||||
*/
|
||||
|
||||
@@ -2163,7 +2163,6 @@ static int __devinit amb_init (amb_dev * dev)
|
||||
static void setup_dev(amb_dev *dev, struct pci_dev *pci_dev)
|
||||
{
|
||||
unsigned char pool;
|
||||
memset (dev, 0, sizeof(amb_dev));
|
||||
|
||||
// set up known dev items straight away
|
||||
dev->pci_dev = pci_dev;
|
||||
@@ -2253,7 +2252,7 @@ static int __devinit amb_probe(struct pci_dev *pci_dev, const struct pci_device_
|
||||
goto out_disable;
|
||||
}
|
||||
|
||||
dev = kmalloc (sizeof(amb_dev), GFP_KERNEL);
|
||||
dev = kzalloc(sizeof(amb_dev), GFP_KERNEL);
|
||||
if (!dev) {
|
||||
PRINTK (KERN_ERR, "out of memory!");
|
||||
err = -ENOMEM;
|
||||
|
||||
+6
-8
@@ -1,5 +1,3 @@
|
||||
/* $Id: he.c,v 1.18 2003/05/06 22:57:15 chas Exp $ */
|
||||
|
||||
/*
|
||||
|
||||
he.c
|
||||
@@ -99,10 +97,6 @@
|
||||
#define HPRINTK(fmt,args...) do { } while (0)
|
||||
#endif /* HE_DEBUG */
|
||||
|
||||
/* version definition */
|
||||
|
||||
static char *version = "$Id: he.c,v 1.18 2003/05/06 22:57:15 chas Exp $";
|
||||
|
||||
/* declarations */
|
||||
|
||||
static int he_open(struct atm_vcc *vcc);
|
||||
@@ -366,7 +360,7 @@ he_init_one(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent)
|
||||
struct he_dev *he_dev = NULL;
|
||||
int err = 0;
|
||||
|
||||
printk(KERN_INFO "he: %s\n", version);
|
||||
printk(KERN_INFO "ATM he driver\n");
|
||||
|
||||
if (pci_enable_device(pci_dev))
|
||||
return -EIO;
|
||||
@@ -1643,6 +1637,8 @@ he_stop(struct he_dev *he_dev)
|
||||
|
||||
if (he_dev->rbpl_base) {
|
||||
#ifdef USE_RBPL_POOL
|
||||
int i;
|
||||
|
||||
for (i = 0; i < CONFIG_RBPL_SIZE; ++i) {
|
||||
void *cpuaddr = he_dev->rbpl_virt[i].virt;
|
||||
dma_addr_t dma_handle = he_dev->rbpl_base[i].phys;
|
||||
@@ -1665,6 +1661,8 @@ he_stop(struct he_dev *he_dev)
|
||||
#ifdef USE_RBPS
|
||||
if (he_dev->rbps_base) {
|
||||
#ifdef USE_RBPS_POOL
|
||||
int i;
|
||||
|
||||
for (i = 0; i < CONFIG_RBPS_SIZE; ++i) {
|
||||
void *cpuaddr = he_dev->rbps_virt[i].virt;
|
||||
dma_addr_t dma_handle = he_dev->rbps_base[i].phys;
|
||||
@@ -2933,7 +2931,7 @@ he_proc_read(struct atm_dev *dev, loff_t *pos, char *page)
|
||||
|
||||
left = *pos;
|
||||
if (!left--)
|
||||
return sprintf(page, "%s\n", version);
|
||||
return sprintf(page, "ATM he driver\n");
|
||||
|
||||
if (!left--)
|
||||
return sprintf(page, "%s%s\n\n",
|
||||
|
||||
@@ -104,7 +104,6 @@ int cn_queue_add_callback(struct cn_queue_dev *dev, char *name, struct cb_id *id
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
cbq->nls = dev->nls;
|
||||
cbq->seq = 0;
|
||||
cbq->group = cbq->id.id.idx;
|
||||
|
||||
@@ -146,7 +145,6 @@ struct cn_queue_dev *cn_queue_alloc_dev(char *name, struct sock *nls)
|
||||
spin_lock_init(&dev->queue_lock);
|
||||
|
||||
dev->nls = nls;
|
||||
dev->netlink_groups = 0;
|
||||
|
||||
dev->cn_queue = create_workqueue(dev->name);
|
||||
if (!dev->cn_queue) {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user