Merge branch 'linus' into irq/core
Merge reason: update to almost-final-.36 Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
commit
14d4962dc8
331 changed files with 2634 additions and 1499 deletions
8
CREDITS
8
CREDITS
|
@ -3554,12 +3554,12 @@ E: cvance@nai.com
|
||||||
D: portions of the Linux Security Module (LSM) framework and security modules
|
D: portions of the Linux Security Module (LSM) framework and security modules
|
||||||
|
|
||||||
N: Petr Vandrovec
|
N: Petr Vandrovec
|
||||||
E: vandrove@vc.cvut.cz
|
E: petr@vandrovec.name
|
||||||
D: Small contributions to ncpfs
|
D: Small contributions to ncpfs
|
||||||
D: Matrox framebuffer driver
|
D: Matrox framebuffer driver
|
||||||
S: Chudenicka 8
|
S: 21513 Conradia Ct
|
||||||
S: 10200 Prague 10, Hostivar
|
S: Cupertino, CA 95014
|
||||||
S: Czech Republic
|
S: USA
|
||||||
|
|
||||||
N: Thibaut Varene
|
N: Thibaut Varene
|
||||||
E: T-Bone@parisc-linux.org
|
E: T-Bone@parisc-linux.org
|
||||||
|
|
|
@ -1,82 +1,35 @@
|
||||||
Linux* Base Driver for the Intel(R) PRO/1000 Family of Adapters
|
Linux* Base Driver for the Intel(R) PRO/1000 Family of Adapters
|
||||||
===============================================================
|
===============================================================
|
||||||
|
|
||||||
September 26, 2006
|
Intel Gigabit Linux driver.
|
||||||
|
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||||
|
|
||||||
Contents
|
Contents
|
||||||
========
|
========
|
||||||
|
|
||||||
- In This Release
|
|
||||||
- Identifying Your Adapter
|
- Identifying Your Adapter
|
||||||
- Building and Installation
|
|
||||||
- Command Line Parameters
|
- Command Line Parameters
|
||||||
- Speed and Duplex Configuration
|
- Speed and Duplex Configuration
|
||||||
- Additional Configurations
|
- Additional Configurations
|
||||||
- Known Issues
|
|
||||||
- Support
|
- Support
|
||||||
|
|
||||||
|
|
||||||
In This Release
|
|
||||||
===============
|
|
||||||
|
|
||||||
This file describes the Linux* Base Driver for the Intel(R) PRO/1000 Family
|
|
||||||
of Adapters. This driver includes support for Itanium(R)2-based systems.
|
|
||||||
|
|
||||||
For questions related to hardware requirements, refer to the documentation
|
|
||||||
supplied with your Intel PRO/1000 adapter. All hardware requirements listed
|
|
||||||
apply to use with Linux.
|
|
||||||
|
|
||||||
The following features are now available in supported kernels:
|
|
||||||
- Native VLANs
|
|
||||||
- Channel Bonding (teaming)
|
|
||||||
- SNMP
|
|
||||||
|
|
||||||
Channel Bonding documentation can be found in the Linux kernel source:
|
|
||||||
/Documentation/networking/bonding.txt
|
|
||||||
|
|
||||||
The driver information previously displayed in the /proc filesystem is not
|
|
||||||
supported in this release. Alternatively, you can use ethtool (version 1.6
|
|
||||||
or later), lspci, and ifconfig to obtain the same information.
|
|
||||||
|
|
||||||
Instructions on updating ethtool can be found in the section "Additional
|
|
||||||
Configurations" later in this document.
|
|
||||||
|
|
||||||
NOTE: The Intel(R) 82562v 10/100 Network Connection only provides 10/100
|
|
||||||
support.
|
|
||||||
|
|
||||||
|
|
||||||
Identifying Your Adapter
|
Identifying Your Adapter
|
||||||
========================
|
========================
|
||||||
|
|
||||||
For more information on how to identify your adapter, go to the Adapter &
|
For more information on how to identify your adapter, go to the Adapter &
|
||||||
Driver ID Guide at:
|
Driver ID Guide at:
|
||||||
|
|
||||||
http://support.intel.com/support/network/adapter/pro100/21397.htm
|
http://support.intel.com/support/go/network/adapter/idguide.htm
|
||||||
|
|
||||||
For the latest Intel network drivers for Linux, refer to the following
|
For the latest Intel network drivers for Linux, refer to the following
|
||||||
website. In the search field, enter your adapter name or type, or use the
|
website. In the search field, enter your adapter name or type, or use the
|
||||||
networking link on the left to search for your adapter:
|
networking link on the left to search for your adapter:
|
||||||
|
|
||||||
http://downloadfinder.intel.com/scripts-df/support_intel.asp
|
http://support.intel.com/support/go/network/adapter/home.htm
|
||||||
|
|
||||||
|
|
||||||
Command Line Parameters
|
Command Line Parameters
|
||||||
=======================
|
=======================
|
||||||
|
|
||||||
If the driver is built as a module, the following optional parameters
|
|
||||||
are used by entering them on the command line with the modprobe command
|
|
||||||
using this syntax:
|
|
||||||
|
|
||||||
modprobe e1000 [<option>=<VAL1>,<VAL2>,...]
|
|
||||||
|
|
||||||
For example, with two PRO/1000 PCI adapters, entering:
|
|
||||||
|
|
||||||
modprobe e1000 TxDescriptors=80,128
|
|
||||||
|
|
||||||
loads the e1000 driver with 80 TX descriptors for the first adapter and
|
|
||||||
128 TX descriptors for the second adapter.
|
|
||||||
|
|
||||||
The default value for each parameter is generally the recommended setting,
|
The default value for each parameter is generally the recommended setting,
|
||||||
unless otherwise noted.
|
unless otherwise noted.
|
||||||
|
|
||||||
|
@ -89,10 +42,6 @@ NOTES: For more information about the AutoNeg, Duplex, and Speed
|
||||||
parameters, see the application note at:
|
parameters, see the application note at:
|
||||||
http://www.intel.com/design/network/applnots/ap450.htm
|
http://www.intel.com/design/network/applnots/ap450.htm
|
||||||
|
|
||||||
A descriptor describes a data buffer and attributes related to
|
|
||||||
the data buffer. This information is accessed by the hardware.
|
|
||||||
|
|
||||||
|
|
||||||
AutoNeg
|
AutoNeg
|
||||||
-------
|
-------
|
||||||
(Supported only on adapters with copper connections)
|
(Supported only on adapters with copper connections)
|
||||||
|
@ -106,7 +55,6 @@ Duplex parameters must not be specified.
|
||||||
NOTE: Refer to the Speed and Duplex section of this readme for more
|
NOTE: Refer to the Speed and Duplex section of this readme for more
|
||||||
information on the AutoNeg parameter.
|
information on the AutoNeg parameter.
|
||||||
|
|
||||||
|
|
||||||
Duplex
|
Duplex
|
||||||
------
|
------
|
||||||
(Supported only on adapters with copper connections)
|
(Supported only on adapters with copper connections)
|
||||||
|
@ -119,7 +67,6 @@ set to auto-negotiate, the board auto-detects the correct duplex. If the
|
||||||
link partner is forced (either full or half), Duplex defaults to half-
|
link partner is forced (either full or half), Duplex defaults to half-
|
||||||
duplex.
|
duplex.
|
||||||
|
|
||||||
|
|
||||||
FlowControl
|
FlowControl
|
||||||
-----------
|
-----------
|
||||||
Valid Range: 0-3 (0=none, 1=Rx only, 2=Tx only, 3=Rx&Tx)
|
Valid Range: 0-3 (0=none, 1=Rx only, 2=Tx only, 3=Rx&Tx)
|
||||||
|
@ -128,16 +75,16 @@ Default Value: Reads flow control settings from the EEPROM
|
||||||
This parameter controls the automatic generation(Tx) and response(Rx)
|
This parameter controls the automatic generation(Tx) and response(Rx)
|
||||||
to Ethernet PAUSE frames.
|
to Ethernet PAUSE frames.
|
||||||
|
|
||||||
|
|
||||||
InterruptThrottleRate
|
InterruptThrottleRate
|
||||||
---------------------
|
---------------------
|
||||||
(not supported on Intel(R) 82542, 82543 or 82544-based adapters)
|
(not supported on Intel(R) 82542, 82543 or 82544-based adapters)
|
||||||
Valid Range: 0,1,3,100-100000 (0=off, 1=dynamic, 3=dynamic conservative)
|
Valid Range: 0,1,3,4,100-100000 (0=off, 1=dynamic, 3=dynamic conservative,
|
||||||
|
4=simplified balancing)
|
||||||
Default Value: 3
|
Default Value: 3
|
||||||
|
|
||||||
The driver can limit the amount of interrupts per second that the adapter
|
The driver can limit the amount of interrupts per second that the adapter
|
||||||
will generate for incoming packets. It does this by writing a value to the
|
will generate for incoming packets. It does this by writing a value to the
|
||||||
adapter that is based on the maximum amount of interrupts that the adapter
|
adapter that is based on the maximum amount of interrupts that the adapter
|
||||||
will generate per second.
|
will generate per second.
|
||||||
|
|
||||||
Setting InterruptThrottleRate to a value greater or equal to 100
|
Setting InterruptThrottleRate to a value greater or equal to 100
|
||||||
|
@ -146,37 +93,43 @@ per second, even if more packets have come in. This reduces interrupt
|
||||||
load on the system and can lower CPU utilization under heavy load,
|
load on the system and can lower CPU utilization under heavy load,
|
||||||
but will increase latency as packets are not processed as quickly.
|
but will increase latency as packets are not processed as quickly.
|
||||||
|
|
||||||
The default behaviour of the driver previously assumed a static
|
The default behaviour of the driver previously assumed a static
|
||||||
InterruptThrottleRate value of 8000, providing a good fallback value for
|
InterruptThrottleRate value of 8000, providing a good fallback value for
|
||||||
all traffic types,but lacking in small packet performance and latency.
|
all traffic types,but lacking in small packet performance and latency.
|
||||||
The hardware can handle many more small packets per second however, and
|
The hardware can handle many more small packets per second however, and
|
||||||
for this reason an adaptive interrupt moderation algorithm was implemented.
|
for this reason an adaptive interrupt moderation algorithm was implemented.
|
||||||
|
|
||||||
Since 7.3.x, the driver has two adaptive modes (setting 1 or 3) in which
|
Since 7.3.x, the driver has two adaptive modes (setting 1 or 3) in which
|
||||||
it dynamically adjusts the InterruptThrottleRate value based on the traffic
|
it dynamically adjusts the InterruptThrottleRate value based on the traffic
|
||||||
that it receives. After determining the type of incoming traffic in the last
|
that it receives. After determining the type of incoming traffic in the last
|
||||||
timeframe, it will adjust the InterruptThrottleRate to an appropriate value
|
timeframe, it will adjust the InterruptThrottleRate to an appropriate value
|
||||||
for that traffic.
|
for that traffic.
|
||||||
|
|
||||||
The algorithm classifies the incoming traffic every interval into
|
The algorithm classifies the incoming traffic every interval into
|
||||||
classes. Once the class is determined, the InterruptThrottleRate value is
|
classes. Once the class is determined, the InterruptThrottleRate value is
|
||||||
adjusted to suit that traffic type the best. There are three classes defined:
|
adjusted to suit that traffic type the best. There are three classes defined:
|
||||||
"Bulk traffic", for large amounts of packets of normal size; "Low latency",
|
"Bulk traffic", for large amounts of packets of normal size; "Low latency",
|
||||||
for small amounts of traffic and/or a significant percentage of small
|
for small amounts of traffic and/or a significant percentage of small
|
||||||
packets; and "Lowest latency", for almost completely small packets or
|
packets; and "Lowest latency", for almost completely small packets or
|
||||||
minimal traffic.
|
minimal traffic.
|
||||||
|
|
||||||
In dynamic conservative mode, the InterruptThrottleRate value is set to 4000
|
In dynamic conservative mode, the InterruptThrottleRate value is set to 4000
|
||||||
for traffic that falls in class "Bulk traffic". If traffic falls in the "Low
|
for traffic that falls in class "Bulk traffic". If traffic falls in the "Low
|
||||||
latency" or "Lowest latency" class, the InterruptThrottleRate is increased
|
latency" or "Lowest latency" class, the InterruptThrottleRate is increased
|
||||||
stepwise to 20000. This default mode is suitable for most applications.
|
stepwise to 20000. This default mode is suitable for most applications.
|
||||||
|
|
||||||
For situations where low latency is vital such as cluster or
|
For situations where low latency is vital such as cluster or
|
||||||
grid computing, the algorithm can reduce latency even more when
|
grid computing, the algorithm can reduce latency even more when
|
||||||
InterruptThrottleRate is set to mode 1. In this mode, which operates
|
InterruptThrottleRate is set to mode 1. In this mode, which operates
|
||||||
the same as mode 3, the InterruptThrottleRate will be increased stepwise to
|
the same as mode 3, the InterruptThrottleRate will be increased stepwise to
|
||||||
70000 for traffic in class "Lowest latency".
|
70000 for traffic in class "Lowest latency".
|
||||||
|
|
||||||
|
In simplified mode the interrupt rate is based on the ratio of Tx and
|
||||||
|
Rx traffic. If the bytes per second rate is approximately equal, the
|
||||||
|
interrupt rate will drop as low as 2000 interrupts per second. If the
|
||||||
|
traffic is mostly transmit or mostly receive, the interrupt rate could
|
||||||
|
be as high as 8000.
|
||||||
|
|
||||||
Setting InterruptThrottleRate to 0 turns off any interrupt moderation
|
Setting InterruptThrottleRate to 0 turns off any interrupt moderation
|
||||||
and may improve small packet latency, but is generally not suitable
|
and may improve small packet latency, but is generally not suitable
|
||||||
for bulk throughput traffic.
|
for bulk throughput traffic.
|
||||||
|
@ -212,8 +165,6 @@ NOTE: When e1000 is loaded with default settings and multiple adapters
|
||||||
be platform-specific. If CPU utilization is not a concern, use
|
be platform-specific. If CPU utilization is not a concern, use
|
||||||
RX_POLLING (NAPI) and default driver settings.
|
RX_POLLING (NAPI) and default driver settings.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
RxDescriptors
|
RxDescriptors
|
||||||
-------------
|
-------------
|
||||||
Valid Range: 80-256 for 82542 and 82543-based adapters
|
Valid Range: 80-256 for 82542 and 82543-based adapters
|
||||||
|
@ -225,15 +176,14 @@ by the driver. Increasing this value allows the driver to buffer more
|
||||||
incoming packets, at the expense of increased system memory utilization.
|
incoming packets, at the expense of increased system memory utilization.
|
||||||
|
|
||||||
Each descriptor is 16 bytes. A receive buffer is also allocated for each
|
Each descriptor is 16 bytes. A receive buffer is also allocated for each
|
||||||
descriptor and can be either 2048, 4096, 8192, or 16384 bytes, depending
|
descriptor and can be either 2048, 4096, 8192, or 16384 bytes, depending
|
||||||
on the MTU setting. The maximum MTU size is 16110.
|
on the MTU setting. The maximum MTU size is 16110.
|
||||||
|
|
||||||
NOTE: MTU designates the frame size. It only needs to be set for Jumbo
|
NOTE: MTU designates the frame size. It only needs to be set for Jumbo
|
||||||
Frames. Depending on the available system resources, the request
|
Frames. Depending on the available system resources, the request
|
||||||
for a higher number of receive descriptors may be denied. In this
|
for a higher number of receive descriptors may be denied. In this
|
||||||
case, use a lower number.
|
case, use a lower number.
|
||||||
|
|
||||||
|
|
||||||
RxIntDelay
|
RxIntDelay
|
||||||
----------
|
----------
|
||||||
Valid Range: 0-65535 (0=off)
|
Valid Range: 0-65535 (0=off)
|
||||||
|
@ -254,7 +204,6 @@ CAUTION: When setting RxIntDelay to a value other than 0, adapters may
|
||||||
restoring the network connection. To eliminate the potential
|
restoring the network connection. To eliminate the potential
|
||||||
for the hang ensure that RxIntDelay is set to 0.
|
for the hang ensure that RxIntDelay is set to 0.
|
||||||
|
|
||||||
|
|
||||||
RxAbsIntDelay
|
RxAbsIntDelay
|
||||||
-------------
|
-------------
|
||||||
(This parameter is supported only on 82540, 82545 and later adapters.)
|
(This parameter is supported only on 82540, 82545 and later adapters.)
|
||||||
|
@ -268,7 +217,6 @@ packet is received within the set amount of time. Proper tuning,
|
||||||
along with RxIntDelay, may improve traffic throughput in specific network
|
along with RxIntDelay, may improve traffic throughput in specific network
|
||||||
conditions.
|
conditions.
|
||||||
|
|
||||||
|
|
||||||
Speed
|
Speed
|
||||||
-----
|
-----
|
||||||
(This parameter is supported only on adapters with copper connections.)
|
(This parameter is supported only on adapters with copper connections.)
|
||||||
|
@ -280,7 +228,6 @@ Speed forces the line speed to the specified value in megabits per second
|
||||||
partner is set to auto-negotiate, the board will auto-detect the correct
|
partner is set to auto-negotiate, the board will auto-detect the correct
|
||||||
speed. Duplex should also be set when Speed is set to either 10 or 100.
|
speed. Duplex should also be set when Speed is set to either 10 or 100.
|
||||||
|
|
||||||
|
|
||||||
TxDescriptors
|
TxDescriptors
|
||||||
-------------
|
-------------
|
||||||
Valid Range: 80-256 for 82542 and 82543-based adapters
|
Valid Range: 80-256 for 82542 and 82543-based adapters
|
||||||
|
@ -295,6 +242,36 @@ NOTE: Depending on the available system resources, the request for a
|
||||||
higher number of transmit descriptors may be denied. In this case,
|
higher number of transmit descriptors may be denied. In this case,
|
||||||
use a lower number.
|
use a lower number.
|
||||||
|
|
||||||
|
TxDescriptorStep
|
||||||
|
----------------
|
||||||
|
Valid Range: 1 (use every Tx Descriptor)
|
||||||
|
4 (use every 4th Tx Descriptor)
|
||||||
|
|
||||||
|
Default Value: 1 (use every Tx Descriptor)
|
||||||
|
|
||||||
|
On certain non-Intel architectures, it has been observed that intense TX
|
||||||
|
traffic bursts of short packets may result in an improper descriptor
|
||||||
|
writeback. If this occurs, the driver will report a "TX Timeout" and reset
|
||||||
|
the adapter, after which the transmit flow will restart, though data may
|
||||||
|
have stalled for as much as 10 seconds before it resumes.
|
||||||
|
|
||||||
|
The improper writeback does not occur on the first descriptor in a system
|
||||||
|
memory cache-line, which is typically 32 bytes, or 4 descriptors long.
|
||||||
|
|
||||||
|
Setting TxDescriptorStep to a value of 4 will ensure that all TX descriptors
|
||||||
|
are aligned to the start of a system memory cache line, and so this problem
|
||||||
|
will not occur.
|
||||||
|
|
||||||
|
NOTES: Setting TxDescriptorStep to 4 effectively reduces the number of
|
||||||
|
TxDescriptors available for transmits to 1/4 of the normal allocation.
|
||||||
|
This has a possible negative performance impact, which may be
|
||||||
|
compensated for by allocating more descriptors using the TxDescriptors
|
||||||
|
module parameter.
|
||||||
|
|
||||||
|
There are other conditions which may result in "TX Timeout", which will
|
||||||
|
not be resolved by the use of the TxDescriptorStep parameter. As the
|
||||||
|
issue addressed by this parameter has never been observed on Intel
|
||||||
|
Architecture platforms, it should not be used on Intel platforms.
|
||||||
|
|
||||||
TxIntDelay
|
TxIntDelay
|
||||||
----------
|
----------
|
||||||
|
@ -307,7 +284,6 @@ efficiency if properly tuned for specific network traffic. If the
|
||||||
system is reporting dropped transmits, this value may be set too high
|
system is reporting dropped transmits, this value may be set too high
|
||||||
causing the driver to run out of available transmit descriptors.
|
causing the driver to run out of available transmit descriptors.
|
||||||
|
|
||||||
|
|
||||||
TxAbsIntDelay
|
TxAbsIntDelay
|
||||||
-------------
|
-------------
|
||||||
(This parameter is supported only on 82540, 82545 and later adapters.)
|
(This parameter is supported only on 82540, 82545 and later adapters.)
|
||||||
|
@ -330,6 +306,35 @@ Default Value: 1
|
||||||
A value of '1' indicates that the driver should enable IP checksum
|
A value of '1' indicates that the driver should enable IP checksum
|
||||||
offload for received packets (both UDP and TCP) to the adapter hardware.
|
offload for received packets (both UDP and TCP) to the adapter hardware.
|
||||||
|
|
||||||
|
Copybreak
|
||||||
|
---------
|
||||||
|
Valid Range: 0-xxxxxxx (0=off)
|
||||||
|
Default Value: 256
|
||||||
|
Usage: insmod e1000.ko copybreak=128
|
||||||
|
|
||||||
|
Driver copies all packets below or equaling this size to a fresh Rx
|
||||||
|
buffer before handing it up the stack.
|
||||||
|
|
||||||
|
This parameter is different than other parameters, in that it is a
|
||||||
|
single (not 1,1,1 etc.) parameter applied to all driver instances and
|
||||||
|
it is also available during runtime at
|
||||||
|
/sys/module/e1000/parameters/copybreak
|
||||||
|
|
||||||
|
SmartPowerDownEnable
|
||||||
|
--------------------
|
||||||
|
Valid Range: 0-1
|
||||||
|
Default Value: 0 (disabled)
|
||||||
|
|
||||||
|
Allows PHY to turn off in lower power states. The user can turn off
|
||||||
|
this parameter in supported chipsets.
|
||||||
|
|
||||||
|
KumeranLockLoss
|
||||||
|
---------------
|
||||||
|
Valid Range: 0-1
|
||||||
|
Default Value: 1 (enabled)
|
||||||
|
|
||||||
|
This workaround skips resetting the PHY at shutdown for the initial
|
||||||
|
silicon releases of ICH8 systems.
|
||||||
|
|
||||||
Speed and Duplex Configuration
|
Speed and Duplex Configuration
|
||||||
==============================
|
==============================
|
||||||
|
@ -385,40 +390,9 @@ If the link partner is forced to a specific speed and duplex, then this
|
||||||
parameter should not be used. Instead, use the Speed and Duplex parameters
|
parameter should not be used. Instead, use the Speed and Duplex parameters
|
||||||
previously mentioned to force the adapter to the same speed and duplex.
|
previously mentioned to force the adapter to the same speed and duplex.
|
||||||
|
|
||||||
|
|
||||||
Additional Configurations
|
Additional Configurations
|
||||||
=========================
|
=========================
|
||||||
|
|
||||||
Configuring the Driver on Different Distributions
|
|
||||||
-------------------------------------------------
|
|
||||||
Configuring a network driver to load properly when the system is started
|
|
||||||
is distribution dependent. Typically, the configuration process involves
|
|
||||||
adding an alias line to /etc/modules.conf or /etc/modprobe.conf as well
|
|
||||||
as editing other system startup scripts and/or configuration files. Many
|
|
||||||
popular Linux distributions ship with tools to make these changes for you.
|
|
||||||
To learn the proper way to configure a network device for your system,
|
|
||||||
refer to your distribution documentation. If during this process you are
|
|
||||||
asked for the driver or module name, the name for the Linux Base Driver
|
|
||||||
for the Intel(R) PRO/1000 Family of Adapters is e1000.
|
|
||||||
|
|
||||||
As an example, if you install the e1000 driver for two PRO/1000 adapters
|
|
||||||
(eth0 and eth1) and set the speed and duplex to 10full and 100half, add
|
|
||||||
the following to modules.conf or or modprobe.conf:
|
|
||||||
|
|
||||||
alias eth0 e1000
|
|
||||||
alias eth1 e1000
|
|
||||||
options e1000 Speed=10,100 Duplex=2,1
|
|
||||||
|
|
||||||
Viewing Link Messages
|
|
||||||
---------------------
|
|
||||||
Link messages will not be displayed to the console if the distribution is
|
|
||||||
restricting system messages. In order to see network driver link messages
|
|
||||||
on your console, set dmesg to eight by entering the following:
|
|
||||||
|
|
||||||
dmesg -n 8
|
|
||||||
|
|
||||||
NOTE: This setting is not saved across reboots.
|
|
||||||
|
|
||||||
Jumbo Frames
|
Jumbo Frames
|
||||||
------------
|
------------
|
||||||
Jumbo Frames support is enabled by changing the MTU to a value larger than
|
Jumbo Frames support is enabled by changing the MTU to a value larger than
|
||||||
|
@ -437,9 +411,11 @@ Additional Configurations
|
||||||
setting in a different location.
|
setting in a different location.
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
|
Degradation in throughput performance may be observed in some Jumbo frames
|
||||||
- To enable Jumbo Frames, increase the MTU size on the interface beyond
|
environments. If this is observed, increasing the application's socket buffer
|
||||||
1500.
|
size and/or increasing the /proc/sys/net/ipv4/tcp_*mem entry values may help.
|
||||||
|
See the specific application manual and /usr/src/linux*/Documentation/
|
||||||
|
networking/ip-sysctl.txt for more details.
|
||||||
|
|
||||||
- The maximum MTU setting for Jumbo Frames is 16110. This value coincides
|
- The maximum MTU setting for Jumbo Frames is 16110. This value coincides
|
||||||
with the maximum Jumbo Frames size of 16128.
|
with the maximum Jumbo Frames size of 16128.
|
||||||
|
@ -447,40 +423,11 @@ Additional Configurations
|
||||||
- Using Jumbo Frames at 10 or 100 Mbps may result in poor performance or
|
- Using Jumbo Frames at 10 or 100 Mbps may result in poor performance or
|
||||||
loss of link.
|
loss of link.
|
||||||
|
|
||||||
- Some Intel gigabit adapters that support Jumbo Frames have a frame size
|
|
||||||
limit of 9238 bytes, with a corresponding MTU size limit of 9216 bytes.
|
|
||||||
The adapters with this limitation are based on the Intel(R) 82571EB,
|
|
||||||
82572EI, 82573L and 80003ES2LAN controller. These correspond to the
|
|
||||||
following product names:
|
|
||||||
Intel(R) PRO/1000 PT Server Adapter
|
|
||||||
Intel(R) PRO/1000 PT Desktop Adapter
|
|
||||||
Intel(R) PRO/1000 PT Network Connection
|
|
||||||
Intel(R) PRO/1000 PT Dual Port Server Adapter
|
|
||||||
Intel(R) PRO/1000 PT Dual Port Network Connection
|
|
||||||
Intel(R) PRO/1000 PF Server Adapter
|
|
||||||
Intel(R) PRO/1000 PF Network Connection
|
|
||||||
Intel(R) PRO/1000 PF Dual Port Server Adapter
|
|
||||||
Intel(R) PRO/1000 PB Server Connection
|
|
||||||
Intel(R) PRO/1000 PL Network Connection
|
|
||||||
Intel(R) PRO/1000 EB Network Connection with I/O Acceleration
|
|
||||||
Intel(R) PRO/1000 EB Backplane Connection with I/O Acceleration
|
|
||||||
Intel(R) PRO/1000 PT Quad Port Server Adapter
|
|
||||||
|
|
||||||
- Adapters based on the Intel(R) 82542 and 82573V/E controller do not
|
- Adapters based on the Intel(R) 82542 and 82573V/E controller do not
|
||||||
support Jumbo Frames. These correspond to the following product names:
|
support Jumbo Frames. These correspond to the following product names:
|
||||||
Intel(R) PRO/1000 Gigabit Server Adapter
|
Intel(R) PRO/1000 Gigabit Server Adapter
|
||||||
Intel(R) PRO/1000 PM Network Connection
|
Intel(R) PRO/1000 PM Network Connection
|
||||||
|
|
||||||
- The following adapters do not support Jumbo Frames:
|
|
||||||
Intel(R) 82562V 10/100 Network Connection
|
|
||||||
Intel(R) 82566DM Gigabit Network Connection
|
|
||||||
Intel(R) 82566DC Gigabit Network Connection
|
|
||||||
Intel(R) 82566MM Gigabit Network Connection
|
|
||||||
Intel(R) 82566MC Gigabit Network Connection
|
|
||||||
Intel(R) 82562GT 10/100 Network Connection
|
|
||||||
Intel(R) 82562G 10/100 Network Connection
|
|
||||||
|
|
||||||
|
|
||||||
Ethtool
|
Ethtool
|
||||||
-------
|
-------
|
||||||
The driver utilizes the ethtool interface for driver configuration and
|
The driver utilizes the ethtool interface for driver configuration and
|
||||||
|
@ -490,142 +437,14 @@ Additional Configurations
|
||||||
The latest release of ethtool can be found from
|
The latest release of ethtool can be found from
|
||||||
http://sourceforge.net/projects/gkernel.
|
http://sourceforge.net/projects/gkernel.
|
||||||
|
|
||||||
NOTE: Ethtool 1.6 only supports a limited set of ethtool options. Support
|
|
||||||
for a more complete ethtool feature set can be enabled by upgrading
|
|
||||||
ethtool to ethtool-1.8.1.
|
|
||||||
|
|
||||||
Enabling Wake on LAN* (WoL)
|
Enabling Wake on LAN* (WoL)
|
||||||
---------------------------
|
---------------------------
|
||||||
WoL is configured through the Ethtool* utility. Ethtool is included with
|
WoL is configured through the Ethtool* utility.
|
||||||
all versions of Red Hat after Red Hat 7.2. For other Linux distributions,
|
|
||||||
download and install Ethtool from the following website:
|
|
||||||
http://sourceforge.net/projects/gkernel.
|
|
||||||
|
|
||||||
For instructions on enabling WoL with Ethtool, refer to the website listed
|
|
||||||
above.
|
|
||||||
|
|
||||||
WoL will be enabled on the system during the next shut down or reboot.
|
WoL will be enabled on the system during the next shut down or reboot.
|
||||||
For this driver version, in order to enable WoL, the e1000 driver must be
|
For this driver version, in order to enable WoL, the e1000 driver must be
|
||||||
loaded when shutting down or rebooting the system.
|
loaded when shutting down or rebooting the system.
|
||||||
|
|
||||||
Wake On LAN is only supported on port A for the following devices:
|
|
||||||
Intel(R) PRO/1000 PT Dual Port Network Connection
|
|
||||||
Intel(R) PRO/1000 PT Dual Port Server Connection
|
|
||||||
Intel(R) PRO/1000 PT Dual Port Server Adapter
|
|
||||||
Intel(R) PRO/1000 PF Dual Port Server Adapter
|
|
||||||
Intel(R) PRO/1000 PT Quad Port Server Adapter
|
|
||||||
|
|
||||||
NAPI
|
|
||||||
----
|
|
||||||
NAPI (Rx polling mode) is enabled in the e1000 driver.
|
|
||||||
|
|
||||||
See www.cyberus.ca/~hadi/usenix-paper.tgz for more information on NAPI.
|
|
||||||
|
|
||||||
|
|
||||||
Known Issues
|
|
||||||
============
|
|
||||||
|
|
||||||
Dropped Receive Packets on Half-duplex 10/100 Networks
|
|
||||||
------------------------------------------------------
|
|
||||||
If you have an Intel PCI Express adapter running at 10mbps or 100mbps, half-
|
|
||||||
duplex, you may observe occasional dropped receive packets. There are no
|
|
||||||
workarounds for this problem in this network configuration. The network must
|
|
||||||
be updated to operate in full-duplex, and/or 1000mbps only.
|
|
||||||
|
|
||||||
Jumbo Frames System Requirement
|
|
||||||
-------------------------------
|
|
||||||
Memory allocation failures have been observed on Linux systems with 64 MB
|
|
||||||
of RAM or less that are running Jumbo Frames. If you are using Jumbo
|
|
||||||
Frames, your system may require more than the advertised minimum
|
|
||||||
requirement of 64 MB of system memory.
|
|
||||||
|
|
||||||
Performance Degradation with Jumbo Frames
|
|
||||||
-----------------------------------------
|
|
||||||
Degradation in throughput performance may be observed in some Jumbo frames
|
|
||||||
environments. If this is observed, increasing the application's socket
|
|
||||||
buffer size and/or increasing the /proc/sys/net/ipv4/tcp_*mem entry values
|
|
||||||
may help. See the specific application manual and
|
|
||||||
/usr/src/linux*/Documentation/
|
|
||||||
networking/ip-sysctl.txt for more details.
|
|
||||||
|
|
||||||
Jumbo Frames on Foundry BigIron 8000 switch
|
|
||||||
-------------------------------------------
|
|
||||||
There is a known issue using Jumbo frames when connected to a Foundry
|
|
||||||
BigIron 8000 switch. This is a 3rd party limitation. If you experience
|
|
||||||
loss of packets, lower the MTU size.
|
|
||||||
|
|
||||||
Allocating Rx Buffers when Using Jumbo Frames
|
|
||||||
---------------------------------------------
|
|
||||||
Allocating Rx buffers when using Jumbo Frames on 2.6.x kernels may fail if
|
|
||||||
the available memory is heavily fragmented. This issue may be seen with PCI-X
|
|
||||||
adapters or with packet split disabled. This can be reduced or eliminated
|
|
||||||
by changing the amount of available memory for receive buffer allocation, by
|
|
||||||
increasing /proc/sys/vm/min_free_kbytes.
|
|
||||||
|
|
||||||
Multiple Interfaces on Same Ethernet Broadcast Network
|
|
||||||
------------------------------------------------------
|
|
||||||
Due to the default ARP behavior on Linux, it is not possible to have
|
|
||||||
one system on two IP networks in the same Ethernet broadcast domain
|
|
||||||
(non-partitioned switch) behave as expected. All Ethernet interfaces
|
|
||||||
will respond to IP traffic for any IP address assigned to the system.
|
|
||||||
This results in unbalanced receive traffic.
|
|
||||||
|
|
||||||
If you have multiple interfaces in a server, either turn on ARP
|
|
||||||
filtering by entering:
|
|
||||||
|
|
||||||
echo 1 > /proc/sys/net/ipv4/conf/all/arp_filter
|
|
||||||
(this only works if your kernel's version is higher than 2.4.5),
|
|
||||||
|
|
||||||
NOTE: This setting is not saved across reboots. The configuration
|
|
||||||
change can be made permanent by adding the line:
|
|
||||||
net.ipv4.conf.all.arp_filter = 1
|
|
||||||
to the file /etc/sysctl.conf
|
|
||||||
|
|
||||||
or,
|
|
||||||
|
|
||||||
install the interfaces in separate broadcast domains (either in
|
|
||||||
different switches or in a switch partitioned to VLANs).
|
|
||||||
|
|
||||||
82541/82547 can't link or are slow to link with some link partners
|
|
||||||
-----------------------------------------------------------------
|
|
||||||
There is a known compatibility issue with 82541/82547 and some
|
|
||||||
low-end switches where the link will not be established, or will
|
|
||||||
be slow to establish. In particular, these switches are known to
|
|
||||||
be incompatible with 82541/82547:
|
|
||||||
|
|
||||||
Planex FXG-08TE
|
|
||||||
I-O Data ETG-SH8
|
|
||||||
|
|
||||||
To workaround this issue, the driver can be compiled with an override
|
|
||||||
of the PHY's master/slave setting. Forcing master or forcing slave
|
|
||||||
mode will improve time-to-link.
|
|
||||||
|
|
||||||
# make CFLAGS_EXTRA=-DE1000_MASTER_SLAVE=<n>
|
|
||||||
|
|
||||||
Where <n> is:
|
|
||||||
|
|
||||||
0 = Hardware default
|
|
||||||
1 = Master mode
|
|
||||||
2 = Slave mode
|
|
||||||
3 = Auto master/slave
|
|
||||||
|
|
||||||
Disable rx flow control with ethtool
|
|
||||||
------------------------------------
|
|
||||||
In order to disable receive flow control using ethtool, you must turn
|
|
||||||
off auto-negotiation on the same command line.
|
|
||||||
|
|
||||||
For example:
|
|
||||||
|
|
||||||
ethtool -A eth? autoneg off rx off
|
|
||||||
|
|
||||||
Unplugging network cable while ethtool -p is running
|
|
||||||
----------------------------------------------------
|
|
||||||
In kernel versions 2.5.50 and later (including 2.6 kernel), unplugging
|
|
||||||
the network cable while ethtool -p is running will cause the system to
|
|
||||||
become unresponsive to keyboard commands, except for control-alt-delete.
|
|
||||||
Restarting the system appears to be the only remedy.
|
|
||||||
|
|
||||||
|
|
||||||
Support
|
Support
|
||||||
=======
|
=======
|
||||||
|
|
||||||
|
|
302
Documentation/networking/e1000e.txt
Normal file
302
Documentation/networking/e1000e.txt
Normal file
|
@ -0,0 +1,302 @@
|
||||||
|
Linux* Driver for Intel(R) Network Connection
|
||||||
|
===============================================================
|
||||||
|
|
||||||
|
Intel Gigabit Linux driver.
|
||||||
|
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||||
|
|
||||||
|
Contents
|
||||||
|
========
|
||||||
|
|
||||||
|
- Identifying Your Adapter
|
||||||
|
- Command Line Parameters
|
||||||
|
- Additional Configurations
|
||||||
|
- Support
|
||||||
|
|
||||||
|
Identifying Your Adapter
|
||||||
|
========================
|
||||||
|
|
||||||
|
The e1000e driver supports all PCI Express Intel(R) Gigabit Network
|
||||||
|
Connections, except those that are 82575, 82576 and 82580-based*.
|
||||||
|
|
||||||
|
* NOTE: The Intel(R) PRO/1000 P Dual Port Server Adapter is supported by
|
||||||
|
the e1000 driver, not the e1000e driver due to the 82546 part being used
|
||||||
|
behind a PCI Express bridge.
|
||||||
|
|
||||||
|
For more information on how to identify your adapter, go to the Adapter &
|
||||||
|
Driver ID Guide at:
|
||||||
|
|
||||||
|
http://support.intel.com/support/go/network/adapter/idguide.htm
|
||||||
|
|
||||||
|
For the latest Intel network drivers for Linux, refer to the following
|
||||||
|
website. In the search field, enter your adapter name or type, or use the
|
||||||
|
networking link on the left to search for your adapter:
|
||||||
|
|
||||||
|
http://support.intel.com/support/go/network/adapter/home.htm
|
||||||
|
|
||||||
|
Command Line Parameters
|
||||||
|
=======================
|
||||||
|
|
||||||
|
The default value for each parameter is generally the recommended setting,
|
||||||
|
unless otherwise noted.
|
||||||
|
|
||||||
|
NOTES: For more information about the InterruptThrottleRate,
|
||||||
|
RxIntDelay, TxIntDelay, RxAbsIntDelay, and TxAbsIntDelay
|
||||||
|
parameters, see the application note at:
|
||||||
|
http://www.intel.com/design/network/applnots/ap450.htm
|
||||||
|
|
||||||
|
InterruptThrottleRate
|
||||||
|
---------------------
|
||||||
|
Valid Range: 0,1,3,4,100-100000 (0=off, 1=dynamic, 3=dynamic conservative,
|
||||||
|
4=simplified balancing)
|
||||||
|
Default Value: 3
|
||||||
|
|
||||||
|
The driver can limit the amount of interrupts per second that the adapter
|
||||||
|
will generate for incoming packets. It does this by writing a value to the
|
||||||
|
adapter that is based on the maximum amount of interrupts that the adapter
|
||||||
|
will generate per second.
|
||||||
|
|
||||||
|
Setting InterruptThrottleRate to a value greater or equal to 100
|
||||||
|
will program the adapter to send out a maximum of that many interrupts
|
||||||
|
per second, even if more packets have come in. This reduces interrupt
|
||||||
|
load on the system and can lower CPU utilization under heavy load,
|
||||||
|
but will increase latency as packets are not processed as quickly.
|
||||||
|
|
||||||
|
The driver has two adaptive modes (setting 1 or 3) in which
|
||||||
|
it dynamically adjusts the InterruptThrottleRate value based on the traffic
|
||||||
|
that it receives. After determining the type of incoming traffic in the last
|
||||||
|
timeframe, it will adjust the InterruptThrottleRate to an appropriate value
|
||||||
|
for that traffic.
|
||||||
|
|
||||||
|
The algorithm classifies the incoming traffic every interval into
|
||||||
|
classes. Once the class is determined, the InterruptThrottleRate value is
|
||||||
|
adjusted to suit that traffic type the best. There are three classes defined:
|
||||||
|
"Bulk traffic", for large amounts of packets of normal size; "Low latency",
|
||||||
|
for small amounts of traffic and/or a significant percentage of small
|
||||||
|
packets; and "Lowest latency", for almost completely small packets or
|
||||||
|
minimal traffic.
|
||||||
|
|
||||||
|
In dynamic conservative mode, the InterruptThrottleRate value is set to 4000
|
||||||
|
for traffic that falls in class "Bulk traffic". If traffic falls in the "Low
|
||||||
|
latency" or "Lowest latency" class, the InterruptThrottleRate is increased
|
||||||
|
stepwise to 20000. This default mode is suitable for most applications.
|
||||||
|
|
||||||
|
For situations where low latency is vital such as cluster or
|
||||||
|
grid computing, the algorithm can reduce latency even more when
|
||||||
|
InterruptThrottleRate is set to mode 1. In this mode, which operates
|
||||||
|
the same as mode 3, the InterruptThrottleRate will be increased stepwise to
|
||||||
|
70000 for traffic in class "Lowest latency".
|
||||||
|
|
||||||
|
In simplified mode the interrupt rate is based on the ratio of Tx and
|
||||||
|
Rx traffic. If the bytes per second rate is approximately equal the
|
||||||
|
interrupt rate will drop as low as 2000 interrupts per second. If the
|
||||||
|
traffic is mostly transmit or mostly receive, the interrupt rate could
|
||||||
|
be as high as 8000.
|
||||||
|
|
||||||
|
Setting InterruptThrottleRate to 0 turns off any interrupt moderation
|
||||||
|
and may improve small packet latency, but is generally not suitable
|
||||||
|
for bulk throughput traffic.
|
||||||
|
|
||||||
|
NOTE: InterruptThrottleRate takes precedence over the TxAbsIntDelay and
|
||||||
|
RxAbsIntDelay parameters. In other words, minimizing the receive
|
||||||
|
and/or transmit absolute delays does not force the controller to
|
||||||
|
generate more interrupts than what the Interrupt Throttle Rate
|
||||||
|
allows.
|
||||||
|
|
||||||
|
NOTE: When e1000e is loaded with default settings and multiple adapters
|
||||||
|
are in use simultaneously, the CPU utilization may increase non-
|
||||||
|
linearly. In order to limit the CPU utilization without impacting
|
||||||
|
the overall throughput, we recommend that you load the driver as
|
||||||
|
follows:
|
||||||
|
|
||||||
|
modprobe e1000e InterruptThrottleRate=3000,3000,3000
|
||||||
|
|
||||||
|
This sets the InterruptThrottleRate to 3000 interrupts/sec for
|
||||||
|
the first, second, and third instances of the driver. The range
|
||||||
|
of 2000 to 3000 interrupts per second works on a majority of
|
||||||
|
systems and is a good starting point, but the optimal value will
|
||||||
|
be platform-specific. If CPU utilization is not a concern, use
|
||||||
|
RX_POLLING (NAPI) and default driver settings.
|
||||||
|
|
||||||
|
RxIntDelay
|
||||||
|
----------
|
||||||
|
Valid Range: 0-65535 (0=off)
|
||||||
|
Default Value: 0
|
||||||
|
|
||||||
|
This value delays the generation of receive interrupts in units of 1.024
|
||||||
|
microseconds. Receive interrupt reduction can improve CPU efficiency if
|
||||||
|
properly tuned for specific network traffic. Increasing this value adds
|
||||||
|
extra latency to frame reception and can end up decreasing the throughput
|
||||||
|
of TCP traffic. If the system is reporting dropped receives, this value
|
||||||
|
may be set too high, causing the driver to run out of available receive
|
||||||
|
descriptors.
|
||||||
|
|
||||||
|
CAUTION: When setting RxIntDelay to a value other than 0, adapters may
|
||||||
|
hang (stop transmitting) under certain network conditions. If
|
||||||
|
this occurs a NETDEV WATCHDOG message is logged in the system
|
||||||
|
event log. In addition, the controller is automatically reset,
|
||||||
|
restoring the network connection. To eliminate the potential
|
||||||
|
for the hang ensure that RxIntDelay is set to 0.
|
||||||
|
|
||||||
|
RxAbsIntDelay
|
||||||
|
-------------
|
||||||
|
Valid Range: 0-65535 (0=off)
|
||||||
|
Default Value: 8
|
||||||
|
|
||||||
|
This value, in units of 1.024 microseconds, limits the delay in which a
|
||||||
|
receive interrupt is generated. Useful only if RxIntDelay is non-zero,
|
||||||
|
this value ensures that an interrupt is generated after the initial
|
||||||
|
packet is received within the set amount of time. Proper tuning,
|
||||||
|
along with RxIntDelay, may improve traffic throughput in specific network
|
||||||
|
conditions.
|
||||||
|
|
||||||
|
TxIntDelay
|
||||||
|
----------
|
||||||
|
Valid Range: 0-65535 (0=off)
|
||||||
|
Default Value: 8
|
||||||
|
|
||||||
|
This value delays the generation of transmit interrupts in units of
|
||||||
|
1.024 microseconds. Transmit interrupt reduction can improve CPU
|
||||||
|
efficiency if properly tuned for specific network traffic. If the
|
||||||
|
system is reporting dropped transmits, this value may be set too high
|
||||||
|
causing the driver to run out of available transmit descriptors.
|
||||||
|
|
||||||
|
TxAbsIntDelay
|
||||||
|
-------------
|
||||||
|
Valid Range: 0-65535 (0=off)
|
||||||
|
Default Value: 32
|
||||||
|
|
||||||
|
This value, in units of 1.024 microseconds, limits the delay in which a
|
||||||
|
transmit interrupt is generated. Useful only if TxIntDelay is non-zero,
|
||||||
|
this value ensures that an interrupt is generated after the initial
|
||||||
|
packet is sent on the wire within the set amount of time. Proper tuning,
|
||||||
|
along with TxIntDelay, may improve traffic throughput in specific
|
||||||
|
network conditions.
|
||||||
|
|
||||||
|
Copybreak
|
||||||
|
---------
|
||||||
|
Valid Range: 0-xxxxxxx (0=off)
|
||||||
|
Default Value: 256
|
||||||
|
|
||||||
|
Driver copies all packets below or equaling this size to a fresh Rx
|
||||||
|
buffer before handing it up the stack.
|
||||||
|
|
||||||
|
This parameter is different than other parameters, in that it is a
|
||||||
|
single (not 1,1,1 etc.) parameter applied to all driver instances and
|
||||||
|
it is also available during runtime at
|
||||||
|
/sys/module/e1000e/parameters/copybreak
|
||||||
|
|
||||||
|
SmartPowerDownEnable
|
||||||
|
--------------------
|
||||||
|
Valid Range: 0-1
|
||||||
|
Default Value: 0 (disabled)
|
||||||
|
|
||||||
|
Allows PHY to turn off in lower power states. The user can set this parameter
|
||||||
|
in supported chipsets.
|
||||||
|
|
||||||
|
KumeranLockLoss
|
||||||
|
---------------
|
||||||
|
Valid Range: 0-1
|
||||||
|
Default Value: 1 (enabled)
|
||||||
|
|
||||||
|
This workaround skips resetting the PHY at shutdown for the initial
|
||||||
|
silicon releases of ICH8 systems.
|
||||||
|
|
||||||
|
IntMode
|
||||||
|
-------
|
||||||
|
Valid Range: 0-2 (0=legacy, 1=MSI, 2=MSI-X)
|
||||||
|
Default Value: 2
|
||||||
|
|
||||||
|
Allows changing the interrupt mode at module load time, without requiring a
|
||||||
|
recompile. If the driver load fails to enable a specific interrupt mode, the
|
||||||
|
driver will try other interrupt modes, from least to most compatible. The
|
||||||
|
interrupt order is MSI-X, MSI, Legacy. If specifying MSI (IntMode=1)
|
||||||
|
interrupts, only MSI and Legacy will be attempted.
|
||||||
|
|
||||||
|
CrcStripping
|
||||||
|
------------
|
||||||
|
Valid Range: 0-1
|
||||||
|
Default Value: 1 (enabled)
|
||||||
|
|
||||||
|
Strip the CRC from received packets before sending up the network stack. If
|
||||||
|
you have a machine with a BMC enabled but cannot receive IPMI traffic after
|
||||||
|
loading or enabling the driver, try disabling this feature.
|
||||||
|
|
||||||
|
WriteProtectNVM
|
||||||
|
---------------
|
||||||
|
Valid Range: 0-1
|
||||||
|
Default Value: 1 (enabled)
|
||||||
|
|
||||||
|
Set the hardware to ignore all write/erase cycles to the GbE region in the
|
||||||
|
ICHx NVM (non-volatile memory). This feature can be disabled by the
|
||||||
|
WriteProtectNVM module parameter (enabled by default) only after a hardware
|
||||||
|
reset, but the machine must be power cycled before trying to enable writes.
|
||||||
|
|
||||||
|
Note: the kernel boot option iomem=relaxed may need to be set if the kernel
|
||||||
|
config option CONFIG_STRICT_DEVMEM=y, if the root user wants to write the
|
||||||
|
NVM from user space via ethtool.
|
||||||
|
|
||||||
|
Additional Configurations
|
||||||
|
=========================
|
||||||
|
|
||||||
|
Jumbo Frames
|
||||||
|
------------
|
||||||
|
Jumbo Frames support is enabled by changing the MTU to a value larger than
|
||||||
|
the default of 1500. Use the ifconfig command to increase the MTU size.
|
||||||
|
For example:
|
||||||
|
|
||||||
|
ifconfig eth<x> mtu 9000 up
|
||||||
|
|
||||||
|
This setting is not saved across reboots.
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
|
- The maximum MTU setting for Jumbo Frames is 9216. This value coincides
|
||||||
|
with the maximum Jumbo Frames size of 9234 bytes.
|
||||||
|
|
||||||
|
- Using Jumbo Frames at 10 or 100 Mbps is not supported and may result in
|
||||||
|
poor performance or loss of link.
|
||||||
|
|
||||||
|
- Some adapters limit Jumbo Frames sized packets to a maximum of
|
||||||
|
4096 bytes and some adapters do not support Jumbo Frames.
|
||||||
|
|
||||||
|
|
||||||
|
Ethtool
|
||||||
|
-------
|
||||||
|
The driver utilizes the ethtool interface for driver configuration and
|
||||||
|
diagnostics, as well as displaying statistical information. We
|
||||||
|
strongly recommend downloading the latest version of Ethtool at:
|
||||||
|
|
||||||
|
http://sourceforge.net/projects/gkernel.
|
||||||
|
|
||||||
|
Speed and Duplex
|
||||||
|
----------------
|
||||||
|
Speed and Duplex are configured through the Ethtool* utility. For
|
||||||
|
instructions, refer to the Ethtool man page.
|
||||||
|
|
||||||
|
Enabling Wake on LAN* (WoL)
|
||||||
|
---------------------------
|
||||||
|
WoL is configured through the Ethtool* utility. For instructions on
|
||||||
|
enabling WoL with Ethtool, refer to the Ethtool man page.
|
||||||
|
|
||||||
|
WoL will be enabled on the system during the next shut down or reboot.
|
||||||
|
For this driver version, in order to enable WoL, the e1000e driver must be
|
||||||
|
loaded when shutting down or rebooting the system.
|
||||||
|
|
||||||
|
In most cases Wake On LAN is only supported on port A for multiple port
|
||||||
|
adapters. To verify if a port supports Wake on LAN run ethtool eth<X>.
|
||||||
|
|
||||||
|
|
||||||
|
Support
|
||||||
|
=======
|
||||||
|
|
||||||
|
For general information, go to the Intel support website at:
|
||||||
|
|
||||||
|
www.intel.com/support/
|
||||||
|
|
||||||
|
or the Intel Wired Networking project hosted by Sourceforge at:
|
||||||
|
|
||||||
|
http://sourceforge.net/projects/e1000
|
||||||
|
|
||||||
|
If an issue is identified with the released source code on the supported
|
||||||
|
kernel with a supported adapter, email the specific information related
|
||||||
|
to the issue to e1000-devel@lists.sf.net
|
40
Documentation/networking/ixgbevf.txt
Executable file → Normal file
40
Documentation/networking/ixgbevf.txt
Executable file → Normal file
|
@ -1,19 +1,16 @@
|
||||||
Linux* Base Driver for Intel(R) Network Connection
|
Linux* Base Driver for Intel(R) Network Connection
|
||||||
==================================================
|
==================================================
|
||||||
|
|
||||||
November 24, 2009
|
Intel Gigabit Linux driver.
|
||||||
|
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||||
|
|
||||||
Contents
|
Contents
|
||||||
========
|
========
|
||||||
|
|
||||||
- In This Release
|
|
||||||
- Identifying Your Adapter
|
- Identifying Your Adapter
|
||||||
- Known Issues/Troubleshooting
|
- Known Issues/Troubleshooting
|
||||||
- Support
|
- Support
|
||||||
|
|
||||||
In This Release
|
|
||||||
===============
|
|
||||||
|
|
||||||
This file describes the ixgbevf Linux* Base Driver for Intel Network
|
This file describes the ixgbevf Linux* Base Driver for Intel Network
|
||||||
Connection.
|
Connection.
|
||||||
|
|
||||||
|
@ -33,7 +30,7 @@ Identifying Your Adapter
|
||||||
For more information on how to identify your adapter, go to the Adapter &
|
For more information on how to identify your adapter, go to the Adapter &
|
||||||
Driver ID Guide at:
|
Driver ID Guide at:
|
||||||
|
|
||||||
http://support.intel.com/support/network/sb/CS-008441.htm
|
http://support.intel.com/support/go/network/adapter/idguide.htm
|
||||||
|
|
||||||
Known Issues/Troubleshooting
|
Known Issues/Troubleshooting
|
||||||
============================
|
============================
|
||||||
|
@ -57,34 +54,3 @@ or the Intel Wired Networking project hosted by Sourceforge at:
|
||||||
If an issue is identified with the released source code on the supported
|
If an issue is identified with the released source code on the supported
|
||||||
kernel with a supported adapter, email the specific information related
|
kernel with a supported adapter, email the specific information related
|
||||||
to the issue to e1000-devel@lists.sf.net
|
to the issue to e1000-devel@lists.sf.net
|
||||||
|
|
||||||
License
|
|
||||||
=======
|
|
||||||
|
|
||||||
Intel 10 Gigabit Linux driver.
|
|
||||||
Copyright(c) 1999 - 2009 Intel Corporation.
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms and conditions of the GNU General Public License,
|
|
||||||
version 2, as published by the Free Software Foundation.
|
|
||||||
|
|
||||||
This program is distributed in the hope 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.,
|
|
||||||
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
|
|
||||||
The full GNU General Public License is included in this distribution in
|
|
||||||
the file called "COPYING".
|
|
||||||
|
|
||||||
Trademarks
|
|
||||||
==========
|
|
||||||
|
|
||||||
Intel, Itanium, and Pentium are trademarks or registered trademarks of
|
|
||||||
Intel Corporation or its subsidiaries in the United States and other
|
|
||||||
countries.
|
|
||||||
|
|
||||||
* Other names and brands may be claimed as the property of others.
|
|
||||||
|
|
|
@ -478,7 +478,7 @@ static void prepare_hwpoison_fd(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opt_unpoison && !hwpoison_forget_fd) {
|
if (opt_unpoison && !hwpoison_forget_fd) {
|
||||||
sprintf(buf, "%s/renew-pfn", hwpoison_debug_fs);
|
sprintf(buf, "%s/unpoison-pfn", hwpoison_debug_fs);
|
||||||
hwpoison_forget_fd = checked_open(buf, O_WRONLY);
|
hwpoison_forget_fd = checked_open(buf, O_WRONLY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
52
MAINTAINERS
52
MAINTAINERS
|
@ -962,6 +962,23 @@ W: http://www.fluff.org/ben/linux/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/mach-s3c6410/
|
F: arch/arm/mach-s3c6410/
|
||||||
|
|
||||||
|
ARM/S5P ARM ARCHITECTURES
|
||||||
|
M: Kukjin Kim <kgene.kim@samsung.com>
|
||||||
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
|
L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
|
||||||
|
S: Maintained
|
||||||
|
F: arch/arm/mach-s5p*/
|
||||||
|
|
||||||
|
ARM/SAMSUNG S5P SERIES FIMC SUPPORT
|
||||||
|
M: Kyungmin Park <kyungmin.park@samsung.com>
|
||||||
|
M: Sylwester Nawrocki <s.nawrocki@samsung.com>
|
||||||
|
L: linux-arm-kernel@lists.infradead.org
|
||||||
|
L: linux-media@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
F: arch/arm/plat-s5p/dev-fimc*
|
||||||
|
F: arch/arm/plat-samsung/include/plat/*fimc*
|
||||||
|
F: drivers/media/video/s5p-fimc/
|
||||||
|
|
||||||
ARM/SHMOBILE ARM ARCHITECTURE
|
ARM/SHMOBILE ARM ARCHITECTURE
|
||||||
M: Paul Mundt <lethal@linux-sh.org>
|
M: Paul Mundt <lethal@linux-sh.org>
|
||||||
M: Magnus Damm <magnus.damm@gmail.com>
|
M: Magnus Damm <magnus.damm@gmail.com>
|
||||||
|
@ -2528,7 +2545,7 @@ S: Supported
|
||||||
F: drivers/scsi/gdt*
|
F: drivers/scsi/gdt*
|
||||||
|
|
||||||
GENERIC GPIO I2C DRIVER
|
GENERIC GPIO I2C DRIVER
|
||||||
M: Haavard Skinnemoen <hskinnemoen@atmel.com>
|
M: Haavard Skinnemoen <hskinnemoen@gmail.com>
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/i2c/busses/i2c-gpio.c
|
F: drivers/i2c/busses/i2c-gpio.c
|
||||||
F: include/linux/i2c-gpio.h
|
F: include/linux/i2c-gpio.h
|
||||||
|
@ -3056,16 +3073,27 @@ L: netdev@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/net/ixp2000/
|
F: drivers/net/ixp2000/
|
||||||
|
|
||||||
INTEL ETHERNET DRIVERS (e100/e1000/e1000e/igb/igbvf/ixgb/ixgbe)
|
INTEL ETHERNET DRIVERS (e100/e1000/e1000e/igb/igbvf/ixgb/ixgbe/ixgbevf)
|
||||||
M: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
|
M: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
|
||||||
M: Jesse Brandeburg <jesse.brandeburg@intel.com>
|
M: Jesse Brandeburg <jesse.brandeburg@intel.com>
|
||||||
M: Bruce Allan <bruce.w.allan@intel.com>
|
M: Bruce Allan <bruce.w.allan@intel.com>
|
||||||
M: Alex Duyck <alexander.h.duyck@intel.com>
|
M: Carolyn Wyborny <carolyn.wyborny@intel.com>
|
||||||
|
M: Don Skidmore <donald.c.skidmore@intel.com>
|
||||||
|
M: Greg Rose <gregory.v.rose@intel.com>
|
||||||
M: PJ Waskiewicz <peter.p.waskiewicz.jr@intel.com>
|
M: PJ Waskiewicz <peter.p.waskiewicz.jr@intel.com>
|
||||||
|
M: Alex Duyck <alexander.h.duyck@intel.com>
|
||||||
M: John Ronciak <john.ronciak@intel.com>
|
M: John Ronciak <john.ronciak@intel.com>
|
||||||
L: e1000-devel@lists.sourceforge.net
|
L: e1000-devel@lists.sourceforge.net
|
||||||
W: http://e1000.sourceforge.net/
|
W: http://e1000.sourceforge.net/
|
||||||
S: Supported
|
S: Supported
|
||||||
|
F: Documentation/networking/e100.txt
|
||||||
|
F: Documentation/networking/e1000.txt
|
||||||
|
F: Documentation/networking/e1000e.txt
|
||||||
|
F: Documentation/networking/igb.txt
|
||||||
|
F: Documentation/networking/igbvf.txt
|
||||||
|
F: Documentation/networking/ixgb.txt
|
||||||
|
F: Documentation/networking/ixgbe.txt
|
||||||
|
F: Documentation/networking/ixgbevf.txt
|
||||||
F: drivers/net/e100.c
|
F: drivers/net/e100.c
|
||||||
F: drivers/net/e1000/
|
F: drivers/net/e1000/
|
||||||
F: drivers/net/e1000e/
|
F: drivers/net/e1000e/
|
||||||
|
@ -3073,6 +3101,7 @@ F: drivers/net/igb/
|
||||||
F: drivers/net/igbvf/
|
F: drivers/net/igbvf/
|
||||||
F: drivers/net/ixgb/
|
F: drivers/net/ixgb/
|
||||||
F: drivers/net/ixgbe/
|
F: drivers/net/ixgbe/
|
||||||
|
F: drivers/net/ixgbevf/
|
||||||
|
|
||||||
INTEL PRO/WIRELESS 2100 NETWORK CONNECTION SUPPORT
|
INTEL PRO/WIRELESS 2100 NETWORK CONNECTION SUPPORT
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
|
@ -3787,9 +3816,8 @@ W: http://www.syskonnect.com
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
MATROX FRAMEBUFFER DRIVER
|
MATROX FRAMEBUFFER DRIVER
|
||||||
M: Petr Vandrovec <vandrove@vc.cvut.cz>
|
|
||||||
L: linux-fbdev@vger.kernel.org
|
L: linux-fbdev@vger.kernel.org
|
||||||
S: Maintained
|
S: Orphan
|
||||||
F: drivers/video/matrox/matroxfb_*
|
F: drivers/video/matrox/matroxfb_*
|
||||||
F: include/linux/matroxfb.h
|
F: include/linux/matroxfb.h
|
||||||
|
|
||||||
|
@ -3976,8 +4004,8 @@ S: Maintained
|
||||||
F: drivers/net/natsemi.c
|
F: drivers/net/natsemi.c
|
||||||
|
|
||||||
NCP FILESYSTEM
|
NCP FILESYSTEM
|
||||||
M: Petr Vandrovec <vandrove@vc.cvut.cz>
|
M: Petr Vandrovec <petr@vandrovec.name>
|
||||||
S: Maintained
|
S: Odd Fixes
|
||||||
F: fs/ncpfs/
|
F: fs/ncpfs/
|
||||||
|
|
||||||
NCR DUAL 700 SCSI DRIVER (MICROCHANNEL)
|
NCR DUAL 700 SCSI DRIVER (MICROCHANNEL)
|
||||||
|
@ -5008,6 +5036,12 @@ F: drivers/media/common/saa7146*
|
||||||
F: drivers/media/video/*7146*
|
F: drivers/media/video/*7146*
|
||||||
F: include/media/*7146*
|
F: include/media/*7146*
|
||||||
|
|
||||||
|
SAMSUNG AUDIO (ASoC) DRIVERS
|
||||||
|
M: Jassi Brar <jassi.brar@samsung.com>
|
||||||
|
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||||
|
S: Supported
|
||||||
|
F: sound/soc/s3c24xx
|
||||||
|
|
||||||
TLG2300 VIDEO4LINUX-2 DRIVER
|
TLG2300 VIDEO4LINUX-2 DRIVER
|
||||||
M: Huang Shijie <shijie8@gmail.com>
|
M: Huang Shijie <shijie8@gmail.com>
|
||||||
M: Kang Yong <kangyong@telegent.com>
|
M: Kang Yong <kangyong@telegent.com>
|
||||||
|
@ -6450,8 +6484,10 @@ F: include/linux/wm97xx.h
|
||||||
WOLFSON MICROELECTRONICS DRIVERS
|
WOLFSON MICROELECTRONICS DRIVERS
|
||||||
M: Mark Brown <broonie@opensource.wolfsonmicro.com>
|
M: Mark Brown <broonie@opensource.wolfsonmicro.com>
|
||||||
M: Ian Lartey <ian@opensource.wolfsonmicro.com>
|
M: Ian Lartey <ian@opensource.wolfsonmicro.com>
|
||||||
|
M: Dimitris Papastamos <dp@opensource.wolfsonmicro.com>
|
||||||
|
T: git git://opensource.wolfsonmicro.com/linux-2.6-asoc
|
||||||
T: git git://opensource.wolfsonmicro.com/linux-2.6-audioplus
|
T: git git://opensource.wolfsonmicro.com/linux-2.6-audioplus
|
||||||
W: http://opensource.wolfsonmicro.com/node/8
|
W: http://opensource.wolfsonmicro.com/content/linux-drivers-wolfson-devices
|
||||||
S: Supported
|
S: Supported
|
||||||
F: Documentation/hwmon/wm83??
|
F: Documentation/hwmon/wm83??
|
||||||
F: drivers/leds/leds-wm83*.c
|
F: drivers/leds/leds-wm83*.c
|
||||||
|
|
4
Makefile
4
Makefile
|
@ -1,8 +1,8 @@
|
||||||
VERSION = 2
|
VERSION = 2
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 36
|
SUBLEVEL = 36
|
||||||
EXTRAVERSION = -rc5
|
EXTRAVERSION = -rc8
|
||||||
NAME = Sheep on Meth
|
NAME = Flesh-Eating Bats with Fangs
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
# To see a list of typical targets execute "make help"
|
# To see a list of typical targets execute "make help"
|
||||||
|
|
|
@ -48,7 +48,7 @@ SYSCALL_DEFINE2(osf_sigprocmask, int, how, unsigned long, newmask)
|
||||||
sigset_t mask;
|
sigset_t mask;
|
||||||
unsigned long res;
|
unsigned long res;
|
||||||
|
|
||||||
siginitset(&mask, newmask & ~_BLOCKABLE);
|
siginitset(&mask, newmask & _BLOCKABLE);
|
||||||
res = sigprocmask(how, &mask, &oldmask);
|
res = sigprocmask(how, &mask, &oldmask);
|
||||||
if (!res) {
|
if (!res) {
|
||||||
force_successful_syscall_return();
|
force_successful_syscall_return();
|
||||||
|
|
|
@ -1101,6 +1101,20 @@ config ARM_ERRATA_720789
|
||||||
invalidated are not, resulting in an incoherency in the system page
|
invalidated are not, resulting in an incoherency in the system page
|
||||||
tables. The workaround changes the TLB flushing routines to invalidate
|
tables. The workaround changes the TLB flushing routines to invalidate
|
||||||
entries regardless of the ASID.
|
entries regardless of the ASID.
|
||||||
|
|
||||||
|
config ARM_ERRATA_743622
|
||||||
|
bool "ARM errata: Faulty hazard checking in the Store Buffer may lead to data corruption"
|
||||||
|
depends on CPU_V7
|
||||||
|
help
|
||||||
|
This option enables the workaround for the 743622 Cortex-A9
|
||||||
|
(r2p0..r2p2) erratum. Under very rare conditions, a faulty
|
||||||
|
optimisation in the Cortex-A9 Store Buffer may lead to data
|
||||||
|
corruption. This workaround sets a specific bit in the diagnostic
|
||||||
|
register of the Cortex-A9 which disables the Store Buffer
|
||||||
|
optimisation, preventing the defect from occurring. This has no
|
||||||
|
visible impact on the overall performance or power consumption of the
|
||||||
|
processor.
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
source "arch/arm/common/Kconfig"
|
source "arch/arm/common/Kconfig"
|
||||||
|
|
|
@ -1162,11 +1162,12 @@ space_cccc_001x(kprobe_opcode_t insn, struct arch_specific_insn *asi)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* MSR : cccc 0011 0x10 xxxx xxxx xxxx xxxx xxxx
|
* MSR : cccc 0011 0x10 xxxx xxxx xxxx xxxx xxxx
|
||||||
* Undef : cccc 0011 0x00 xxxx xxxx xxxx xxxx xxxx
|
* Undef : cccc 0011 0100 xxxx xxxx xxxx xxxx xxxx
|
||||||
* ALU op with S bit and Rd == 15 :
|
* ALU op with S bit and Rd == 15 :
|
||||||
* cccc 001x xxx1 xxxx 1111 xxxx xxxx xxxx
|
* cccc 001x xxx1 xxxx 1111 xxxx xxxx xxxx
|
||||||
*/
|
*/
|
||||||
if ((insn & 0x0f900000) == 0x03200000 || /* MSR & Undef */
|
if ((insn & 0x0fb00000) == 0x03200000 || /* MSR */
|
||||||
|
(insn & 0x0ff00000) == 0x03400000 || /* Undef */
|
||||||
(insn & 0x0e10f000) == 0x0210f000) /* ALU s-bit, R15 */
|
(insn & 0x0e10f000) == 0x0210f000) /* ALU s-bit, R15 */
|
||||||
return INSN_REJECTED;
|
return INSN_REJECTED;
|
||||||
|
|
||||||
|
@ -1177,7 +1178,7 @@ space_cccc_001x(kprobe_opcode_t insn, struct arch_specific_insn *asi)
|
||||||
* *S (bit 20) updates condition codes
|
* *S (bit 20) updates condition codes
|
||||||
* ADC/SBC/RSC reads the C flag
|
* ADC/SBC/RSC reads the C flag
|
||||||
*/
|
*/
|
||||||
insn &= 0xfff00fff; /* Rn = r0, Rd = r0 */
|
insn &= 0xffff0fff; /* Rd = r0 */
|
||||||
asi->insn[0] = insn;
|
asi->insn[0] = insn;
|
||||||
asi->insn_handler = (insn & (1 << 20)) ? /* S-bit */
|
asi->insn_handler = (insn & (1 << 20)) ? /* S-bit */
|
||||||
emulate_alu_imm_rwflags : emulate_alu_imm_rflags;
|
emulate_alu_imm_rwflags : emulate_alu_imm_rflags;
|
||||||
|
|
|
@ -28,17 +28,16 @@
|
||||||
|
|
||||||
static inline void arch_idle(void)
|
static inline void arch_idle(void)
|
||||||
{
|
{
|
||||||
#ifndef CONFIG_DEBUG_KERNEL
|
|
||||||
/*
|
/*
|
||||||
* Disable the processor clock. The processor will be automatically
|
* Disable the processor clock. The processor will be automatically
|
||||||
* re-enabled by an interrupt or by a reset.
|
* re-enabled by an interrupt or by a reset.
|
||||||
*/
|
*/
|
||||||
at91_sys_write(AT91_PMC_SCDR, AT91_PMC_PCK);
|
at91_sys_write(AT91_PMC_SCDR, AT91_PMC_PCK);
|
||||||
#else
|
#ifndef CONFIG_CPU_ARM920T
|
||||||
/*
|
/*
|
||||||
* Set the processor (CP15) into 'Wait for Interrupt' mode.
|
* Set the processor (CP15) into 'Wait for Interrupt' mode.
|
||||||
* Unlike disabling the processor clock via the PMC (above)
|
* Post-RM9200 processors need this in conjunction with the above
|
||||||
* this allows the processor to be woken via JTAG.
|
* to save power when idle.
|
||||||
*/
|
*/
|
||||||
cpu_do_idle();
|
cpu_do_idle();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -276,7 +276,7 @@ static void channel_disable(struct m2p_channel *ch)
|
||||||
v &= ~(M2P_CONTROL_STALL_IRQ_EN | M2P_CONTROL_NFB_IRQ_EN);
|
v &= ~(M2P_CONTROL_STALL_IRQ_EN | M2P_CONTROL_NFB_IRQ_EN);
|
||||||
m2p_set_control(ch, v);
|
m2p_set_control(ch, v);
|
||||||
|
|
||||||
while (m2p_channel_state(ch) == STATE_ON)
|
while (m2p_channel_state(ch) >= STATE_ON)
|
||||||
cpu_relax();
|
cpu_relax();
|
||||||
|
|
||||||
m2p_set_control(ch, 0x0);
|
m2p_set_control(ch, 0x0);
|
||||||
|
|
|
@ -122,6 +122,7 @@ config MACH_CPUIMX27
|
||||||
select IMX_HAVE_PLATFORM_IMX_I2C
|
select IMX_HAVE_PLATFORM_IMX_I2C
|
||||||
select IMX_HAVE_PLATFORM_IMX_UART
|
select IMX_HAVE_PLATFORM_IMX_UART
|
||||||
select IMX_HAVE_PLATFORM_MXC_NAND
|
select IMX_HAVE_PLATFORM_MXC_NAND
|
||||||
|
select MXC_ULPI if USB_ULPI
|
||||||
help
|
help
|
||||||
Include support for Eukrea CPUIMX27 platform. This includes
|
Include support for Eukrea CPUIMX27 platform. This includes
|
||||||
specific configurations for the module and its peripherals.
|
specific configurations for the module and its peripherals.
|
||||||
|
|
|
@ -259,7 +259,7 @@ static void __init eukrea_cpuimx27_init(void)
|
||||||
i2c_register_board_info(0, eukrea_cpuimx27_i2c_devices,
|
i2c_register_board_info(0, eukrea_cpuimx27_i2c_devices,
|
||||||
ARRAY_SIZE(eukrea_cpuimx27_i2c_devices));
|
ARRAY_SIZE(eukrea_cpuimx27_i2c_devices));
|
||||||
|
|
||||||
imx27_add_i2c_imx1(&cpuimx27_i2c1_data);
|
imx27_add_i2c_imx0(&cpuimx27_i2c1_data);
|
||||||
|
|
||||||
platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
|
platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <linux/sysdev.h>
|
#include <linux/sysdev.h>
|
||||||
#include <linux/serial_core.h>
|
#include <linux/serial_core.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/sched.h>
|
||||||
|
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <linux/sysdev.h>
|
#include <linux/sysdev.h>
|
||||||
#include <linux/serial_core.h>
|
#include <linux/serial_core.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/sched.h>
|
||||||
|
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#include <linux/sysdev.h>
|
#include <linux/sysdev.h>
|
||||||
#include <linux/serial_core.h>
|
#include <linux/serial_core.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/sched.h>
|
||||||
|
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
|
|
|
@ -173,11 +173,6 @@ static int s5pv210_clk_ip3_ctrl(struct clk *clk, int enable)
|
||||||
return s5p_gatectrl(S5P_CLKGATE_IP3, clk, enable);
|
return s5p_gatectrl(S5P_CLKGATE_IP3, clk, enable);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int s5pv210_clk_ip4_ctrl(struct clk *clk, int enable)
|
|
||||||
{
|
|
||||||
return s5p_gatectrl(S5P_CLKGATE_IP4, clk, enable);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int s5pv210_clk_mask0_ctrl(struct clk *clk, int enable)
|
static int s5pv210_clk_mask0_ctrl(struct clk *clk, int enable)
|
||||||
{
|
{
|
||||||
return s5p_gatectrl(S5P_CLK_SRC_MASK0, clk, enable);
|
return s5p_gatectrl(S5P_CLK_SRC_MASK0, clk, enable);
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/sysdev.h>
|
#include <linux/sysdev.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/sched.h>
|
||||||
|
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
|
|
|
@ -68,7 +68,7 @@ static void __init ct_ca9x4_init_irq(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
static void ct_ca9x4_timer_init(void)
|
static void __init ct_ca9x4_timer_init(void)
|
||||||
{
|
{
|
||||||
writel(0, MMIO_P2V(CT_CA9X4_TIMER0) + TIMER_CTRL);
|
writel(0, MMIO_P2V(CT_CA9X4_TIMER0) + TIMER_CTRL);
|
||||||
writel(0, MMIO_P2V(CT_CA9X4_TIMER1) + TIMER_CTRL);
|
writel(0, MMIO_P2V(CT_CA9X4_TIMER1) + TIMER_CTRL);
|
||||||
|
@ -222,7 +222,7 @@ static struct platform_device pmu_device = {
|
||||||
.resource = pmu_resources,
|
.resource = pmu_resources,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void ct_ca9x4_init(void)
|
static void __init ct_ca9x4_init(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,7 @@ void __init v2m_map_io(struct map_desc *tile, size_t num)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void v2m_timer_init(void)
|
static void __init v2m_timer_init(void)
|
||||||
{
|
{
|
||||||
writel(0, MMIO_P2V(V2M_TIMER0) + TIMER_CTRL);
|
writel(0, MMIO_P2V(V2M_TIMER0) + TIMER_CTRL);
|
||||||
writel(0, MMIO_P2V(V2M_TIMER1) + TIMER_CTRL);
|
writel(0, MMIO_P2V(V2M_TIMER1) + TIMER_CTRL);
|
||||||
|
|
|
@ -204,8 +204,12 @@ void __iomem * __arm_ioremap_pfn_caller(unsigned long pfn,
|
||||||
/*
|
/*
|
||||||
* Don't allow RAM to be mapped - this causes problems with ARMv6+
|
* Don't allow RAM to be mapped - this causes problems with ARMv6+
|
||||||
*/
|
*/
|
||||||
if (WARN_ON(pfn_valid(pfn)))
|
if (pfn_valid(pfn)) {
|
||||||
return NULL;
|
printk(KERN_WARNING "BUG: Your driver calls ioremap() on system memory. This leads\n"
|
||||||
|
KERN_WARNING "to architecturally unpredictable behaviour on ARMv6+, and ioremap()\n"
|
||||||
|
KERN_WARNING "will fail in the next kernel release. Please fix your driver.\n");
|
||||||
|
WARN_ON(1);
|
||||||
|
}
|
||||||
|
|
||||||
type = get_mem_type(mtype);
|
type = get_mem_type(mtype);
|
||||||
if (!type)
|
if (!type)
|
||||||
|
|
|
@ -248,7 +248,7 @@ static struct mem_type mem_types[] = {
|
||||||
},
|
},
|
||||||
[MT_MEMORY] = {
|
[MT_MEMORY] = {
|
||||||
.prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY |
|
.prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY |
|
||||||
L_PTE_USER | L_PTE_EXEC,
|
L_PTE_WRITE | L_PTE_EXEC,
|
||||||
.prot_l1 = PMD_TYPE_TABLE,
|
.prot_l1 = PMD_TYPE_TABLE,
|
||||||
.prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE,
|
.prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE,
|
||||||
.domain = DOMAIN_KERNEL,
|
.domain = DOMAIN_KERNEL,
|
||||||
|
@ -259,7 +259,7 @@ static struct mem_type mem_types[] = {
|
||||||
},
|
},
|
||||||
[MT_MEMORY_NONCACHED] = {
|
[MT_MEMORY_NONCACHED] = {
|
||||||
.prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY |
|
.prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY |
|
||||||
L_PTE_USER | L_PTE_EXEC | L_PTE_MT_BUFFERABLE,
|
L_PTE_WRITE | L_PTE_EXEC | L_PTE_MT_BUFFERABLE,
|
||||||
.prot_l1 = PMD_TYPE_TABLE,
|
.prot_l1 = PMD_TYPE_TABLE,
|
||||||
.prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE,
|
.prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE,
|
||||||
.domain = DOMAIN_KERNEL,
|
.domain = DOMAIN_KERNEL,
|
||||||
|
|
|
@ -253,6 +253,14 @@ __v7_setup:
|
||||||
orreq r10, r10, #1 << 22 @ set bit #22
|
orreq r10, r10, #1 << 22 @ set bit #22
|
||||||
mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register
|
mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_ARM_ERRATA_743622
|
||||||
|
teq r6, #0x20 @ present in r2p0
|
||||||
|
teqne r6, #0x21 @ present in r2p1
|
||||||
|
teqne r6, #0x22 @ present in r2p2
|
||||||
|
mrceq p15, 0, r10, c15, c0, 1 @ read diagnostic register
|
||||||
|
orreq r10, r10, #1 << 6 @ set bit #6
|
||||||
|
mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register
|
||||||
|
#endif
|
||||||
|
|
||||||
3: mov r10, #0
|
3: mov r10, #0
|
||||||
#ifdef HARVARD_CACHE
|
#ifdef HARVARD_CACHE
|
||||||
|
@ -365,7 +373,7 @@ __v7_ca9mp_proc_info:
|
||||||
b __v7_ca9mp_setup
|
b __v7_ca9mp_setup
|
||||||
.long cpu_arch_name
|
.long cpu_arch_name
|
||||||
.long cpu_elf_name
|
.long cpu_elf_name
|
||||||
.long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP
|
.long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP|HWCAP_TLS
|
||||||
.long cpu_v7_name
|
.long cpu_v7_name
|
||||||
.long v7_processor_functions
|
.long v7_processor_functions
|
||||||
.long v7wbi_tlb_fns
|
.long v7wbi_tlb_fns
|
||||||
|
|
|
@ -102,6 +102,7 @@ static int op_create_counter(int cpu, int event)
|
||||||
if (IS_ERR(pevent)) {
|
if (IS_ERR(pevent)) {
|
||||||
ret = PTR_ERR(pevent);
|
ret = PTR_ERR(pevent);
|
||||||
} else if (pevent->state != PERF_EVENT_STATE_ACTIVE) {
|
} else if (pevent->state != PERF_EVENT_STATE_ACTIVE) {
|
||||||
|
perf_event_release_kernel(pevent);
|
||||||
pr_warning("oprofile: failed to enable event %d "
|
pr_warning("oprofile: failed to enable event %d "
|
||||||
"on CPU %d\n", event, cpu);
|
"on CPU %d\n", event, cpu);
|
||||||
ret = -EBUSY;
|
ret = -EBUSY;
|
||||||
|
@ -365,6 +366,7 @@ int __init oprofile_arch_init(struct oprofile_operations *ops)
|
||||||
ret = init_driverfs();
|
ret = init_driverfs();
|
||||||
if (ret) {
|
if (ret) {
|
||||||
kfree(counter_config);
|
kfree(counter_config);
|
||||||
|
counter_config = NULL;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -402,7 +404,6 @@ void oprofile_arch_exit(void)
|
||||||
struct perf_event *event;
|
struct perf_event *event;
|
||||||
|
|
||||||
if (*perf_events) {
|
if (*perf_events) {
|
||||||
exit_driverfs();
|
|
||||||
for_each_possible_cpu(cpu) {
|
for_each_possible_cpu(cpu) {
|
||||||
for (id = 0; id < perf_num_counters; ++id) {
|
for (id = 0; id < perf_num_counters; ++id) {
|
||||||
event = perf_events[cpu][id];
|
event = perf_events[cpu][id];
|
||||||
|
@ -413,8 +414,10 @@ void oprofile_arch_exit(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (counter_config)
|
if (counter_config) {
|
||||||
kfree(counter_config);
|
kfree(counter_config);
|
||||||
|
exit_driverfs();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
int __init oprofile_arch_init(struct oprofile_operations *ops)
|
int __init oprofile_arch_init(struct oprofile_operations *ops)
|
||||||
|
|
|
@ -33,7 +33,7 @@ config OMAP_DEBUG_DEVICES
|
||||||
config OMAP_DEBUG_LEDS
|
config OMAP_DEBUG_LEDS
|
||||||
bool
|
bool
|
||||||
depends on OMAP_DEBUG_DEVICES
|
depends on OMAP_DEBUG_DEVICES
|
||||||
default y if LEDS
|
default y if LEDS_CLASS
|
||||||
|
|
||||||
config OMAP_RESET_CLOCKS
|
config OMAP_RESET_CLOCKS
|
||||||
bool "Reset unused clocks during boot"
|
bool "Reset unused clocks during boot"
|
||||||
|
|
|
@ -320,6 +320,7 @@ void flush_iotlb_page(struct iommu *obj, u32 da)
|
||||||
if ((start <= da) && (da < start + bytes)) {
|
if ((start <= da) && (da < start + bytes)) {
|
||||||
dev_dbg(obj->dev, "%s: %08x<=%08x(%x)\n",
|
dev_dbg(obj->dev, "%s: %08x<=%08x(%x)\n",
|
||||||
__func__, start, da, bytes);
|
__func__, start, da, bytes);
|
||||||
|
iotlb_load_cr(obj, &cr);
|
||||||
iommu_write_reg(obj, 1, MMU_FLUSH_ENTRY);
|
iommu_write_reg(obj, 1, MMU_FLUSH_ENTRY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -156,7 +156,7 @@ static irqreturn_t omap_mcbsp_rx_irq_handler(int irq, void *dev_id)
|
||||||
/* Writing zero to RSYNC_ERR clears the IRQ */
|
/* Writing zero to RSYNC_ERR clears the IRQ */
|
||||||
MCBSP_WRITE(mcbsp_rx, SPCR1, MCBSP_READ_CACHE(mcbsp_rx, SPCR1));
|
MCBSP_WRITE(mcbsp_rx, SPCR1, MCBSP_READ_CACHE(mcbsp_rx, SPCR1));
|
||||||
} else {
|
} else {
|
||||||
complete(&mcbsp_rx->tx_irq_completion);
|
complete(&mcbsp_rx->rx_irq_completion);
|
||||||
}
|
}
|
||||||
|
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
|
|
|
@ -435,7 +435,6 @@ static int s3c_adc_suspend(struct platform_device *pdev, pm_message_t state)
|
||||||
static int s3c_adc_resume(struct platform_device *pdev)
|
static int s3c_adc_resume(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct adc_device *adc = platform_get_drvdata(pdev);
|
struct adc_device *adc = platform_get_drvdata(pdev);
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
clk_enable(adc->clk);
|
clk_enable(adc->clk);
|
||||||
enable_irq(adc->irq);
|
enable_irq(adc->irq);
|
||||||
|
|
|
@ -48,6 +48,9 @@
|
||||||
#include <plat/clock.h>
|
#include <plat/clock.h>
|
||||||
#include <plat/cpu.h>
|
#include <plat/cpu.h>
|
||||||
|
|
||||||
|
#include <linux/serial_core.h>
|
||||||
|
#include <plat/regs-serial.h> /* for s3c24xx_uart_devs */
|
||||||
|
|
||||||
/* clock information */
|
/* clock information */
|
||||||
|
|
||||||
static LIST_HEAD(clocks);
|
static LIST_HEAD(clocks);
|
||||||
|
@ -65,6 +68,28 @@ static int clk_null_enable(struct clk *clk, int enable)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int dev_is_s3c_uart(struct device *dev)
|
||||||
|
{
|
||||||
|
struct platform_device **pdev = s3c24xx_uart_devs;
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < ARRAY_SIZE(s3c24xx_uart_devs); i++, pdev++)
|
||||||
|
if (*pdev && dev == &(*pdev)->dev)
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Serial drivers call get_clock() very early, before platform bus
|
||||||
|
* has been set up, this requires a special check to let them get
|
||||||
|
* a proper clock
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int dev_is_platform_device(struct device *dev)
|
||||||
|
{
|
||||||
|
return dev->bus == &platform_bus_type ||
|
||||||
|
(dev->bus == NULL && dev_is_s3c_uart(dev));
|
||||||
|
}
|
||||||
|
|
||||||
/* Clock API calls */
|
/* Clock API calls */
|
||||||
|
|
||||||
struct clk *clk_get(struct device *dev, const char *id)
|
struct clk *clk_get(struct device *dev, const char *id)
|
||||||
|
@ -73,7 +98,7 @@ struct clk *clk_get(struct device *dev, const char *id)
|
||||||
struct clk *clk = ERR_PTR(-ENOENT);
|
struct clk *clk = ERR_PTR(-ENOENT);
|
||||||
int idno;
|
int idno;
|
||||||
|
|
||||||
if (dev == NULL || dev->bus != &platform_bus_type)
|
if (dev == NULL || !dev_is_platform_device(dev))
|
||||||
idno = -1;
|
idno = -1;
|
||||||
else
|
else
|
||||||
idno = to_platform_device(dev)->id;
|
idno = to_platform_device(dev)->id;
|
||||||
|
|
|
@ -314,10 +314,9 @@ int module_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs,
|
||||||
vfree(module->arch.syminfo);
|
vfree(module->arch.syminfo);
|
||||||
module->arch.syminfo = NULL;
|
module->arch.syminfo = NULL;
|
||||||
|
|
||||||
return module_bug_finalize(hdr, sechdrs, module);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void module_arch_cleanup(struct module *module)
|
void module_arch_cleanup(struct module *module)
|
||||||
{
|
{
|
||||||
module_bug_cleanup(module);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -112,10 +112,9 @@ int module_finalize(const Elf_Ehdr *hdr,
|
||||||
const Elf_Shdr *sechdrs,
|
const Elf_Shdr *sechdrs,
|
||||||
struct module *me)
|
struct module *me)
|
||||||
{
|
{
|
||||||
return module_bug_finalize(hdr, sechdrs, me);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void module_arch_cleanup(struct module *mod)
|
void module_arch_cleanup(struct module *mod)
|
||||||
{
|
{
|
||||||
module_bug_cleanup(mod);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,9 +82,9 @@ typedef elf_fpreg_t elf_fpregset_t;
|
||||||
* These are used to set parameters in the core dumps.
|
* These are used to set parameters in the core dumps.
|
||||||
*/
|
*/
|
||||||
#define ELF_CLASS ELFCLASS32
|
#define ELF_CLASS ELFCLASS32
|
||||||
#if defined(__LITTLE_ENDIAN)
|
#if defined(__LITTLE_ENDIAN__)
|
||||||
#define ELF_DATA ELFDATA2LSB
|
#define ELF_DATA ELFDATA2LSB
|
||||||
#elif defined(__BIG_ENDIAN)
|
#elif defined(__BIG_ENDIAN__)
|
||||||
#define ELF_DATA ELFDATA2MSB
|
#define ELF_DATA ELFDATA2MSB
|
||||||
#else
|
#else
|
||||||
#error no endian defined
|
#error no endian defined
|
||||||
|
|
1
arch/m32r/kernel/.gitignore
vendored
Normal file
1
arch/m32r/kernel/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
vmlinux.lds
|
|
@ -28,6 +28,8 @@
|
||||||
|
|
||||||
#define DEBUG_SIG 0
|
#define DEBUG_SIG 0
|
||||||
|
|
||||||
|
#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
|
||||||
|
|
||||||
asmlinkage int
|
asmlinkage int
|
||||||
sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
|
sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
|
||||||
unsigned long r2, unsigned long r3, unsigned long r4,
|
unsigned long r2, unsigned long r3, unsigned long r4,
|
||||||
|
@ -254,7 +256,7 @@ give_sigsegv:
|
||||||
static int prev_insn(struct pt_regs *regs)
|
static int prev_insn(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
u16 inst;
|
u16 inst;
|
||||||
if (get_user(&inst, (u16 __user *)(regs->bpc - 2)))
|
if (get_user(inst, (u16 __user *)(regs->bpc - 2)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
if ((inst & 0xfff0) == 0x10f0) /* trap ? */
|
if ((inst & 0xfff0) == 0x10f0) /* trap ? */
|
||||||
regs->bpc -= 2;
|
regs->bpc -= 2;
|
||||||
|
|
|
@ -162,7 +162,7 @@ static void mac_init_asc( void )
|
||||||
void mac_mksound( unsigned int freq, unsigned int length )
|
void mac_mksound( unsigned int freq, unsigned int length )
|
||||||
{
|
{
|
||||||
__u32 cfreq = ( freq << 5 ) / 468;
|
__u32 cfreq = ( freq << 5 ) / 468;
|
||||||
__u32 flags;
|
unsigned long flags;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if ( mac_special_bell == NULL )
|
if ( mac_special_bell == NULL )
|
||||||
|
@ -224,7 +224,7 @@ static void mac_nosound( unsigned long ignored )
|
||||||
*/
|
*/
|
||||||
static void mac_quadra_start_bell( unsigned int freq, unsigned int length, unsigned int volume )
|
static void mac_quadra_start_bell( unsigned int freq, unsigned int length, unsigned int volume )
|
||||||
{
|
{
|
||||||
__u32 flags;
|
unsigned long flags;
|
||||||
|
|
||||||
/* if the bell is already ringing, ring longer */
|
/* if the bell is already ringing, ring longer */
|
||||||
if ( mac_bell_duration > 0 )
|
if ( mac_bell_duration > 0 )
|
||||||
|
@ -271,7 +271,7 @@ static void mac_quadra_start_bell( unsigned int freq, unsigned int length, unsig
|
||||||
static void mac_quadra_ring_bell( unsigned long ignored )
|
static void mac_quadra_ring_bell( unsigned long ignored )
|
||||||
{
|
{
|
||||||
int i, count = mac_asc_samplespersec / HZ;
|
int i, count = mac_asc_samplespersec / HZ;
|
||||||
__u32 flags;
|
unsigned long flags;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* we neither want a sound buffer overflow nor underflow, so we need to match
|
* we neither want a sound buffer overflow nor underflow, so we need to match
|
||||||
|
|
|
@ -13,6 +13,7 @@ config MIPS
|
||||||
select HAVE_KPROBES
|
select HAVE_KPROBES
|
||||||
select HAVE_KRETPROBES
|
select HAVE_KRETPROBES
|
||||||
select RTC_LIB if !MACH_LOONGSON
|
select RTC_LIB if !MACH_LOONGSON
|
||||||
|
select GENERIC_ATOMIC64 if !64BIT
|
||||||
|
|
||||||
mainmenu "Linux/MIPS Kernel Configuration"
|
mainmenu "Linux/MIPS Kernel Configuration"
|
||||||
|
|
||||||
|
@ -1646,8 +1647,16 @@ config MIPS_MT_SMP
|
||||||
select SYS_SUPPORTS_SMP
|
select SYS_SUPPORTS_SMP
|
||||||
select SMP_UP
|
select SMP_UP
|
||||||
help
|
help
|
||||||
This is a kernel model which is also known a VSMP or lately
|
This is a kernel model which is known a VSMP but lately has been
|
||||||
has been marketesed into SMVP.
|
marketesed into SMVP.
|
||||||
|
Virtual SMP uses the processor's VPEs to implement virtual
|
||||||
|
processors. In currently available configuration of the 34K processor
|
||||||
|
this allows for a dual processor. Both processors will share the same
|
||||||
|
primary caches; each will obtain the half of the TLB for it's own
|
||||||
|
exclusive use. For a layman this model can be described as similar to
|
||||||
|
what Intel calls Hyperthreading.
|
||||||
|
|
||||||
|
For further information see http://www.linux-mips.org/wiki/34K#VSMP
|
||||||
|
|
||||||
config MIPS_MT_SMTC
|
config MIPS_MT_SMTC
|
||||||
bool "SMTC: Use all TCs on all VPEs for SMP"
|
bool "SMTC: Use all TCs on all VPEs for SMP"
|
||||||
|
@ -1664,6 +1673,14 @@ config MIPS_MT_SMTC
|
||||||
help
|
help
|
||||||
This is a kernel model which is known a SMTC or lately has been
|
This is a kernel model which is known a SMTC or lately has been
|
||||||
marketesed into SMVP.
|
marketesed into SMVP.
|
||||||
|
is presenting the available TC's of the core as processors to Linux.
|
||||||
|
On currently available 34K processors this means a Linux system will
|
||||||
|
see up to 5 processors. The implementation of the SMTC kernel differs
|
||||||
|
significantly from VSMP and cannot efficiently coexist in the same
|
||||||
|
kernel binary so the choice between VSMP and SMTC is a compile time
|
||||||
|
decision.
|
||||||
|
|
||||||
|
For further information see http://www.linux-mips.org/wiki/34K#SMTC
|
||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@ int prom_argc;
|
||||||
char **prom_argv;
|
char **prom_argv;
|
||||||
char **prom_envp;
|
char **prom_envp;
|
||||||
|
|
||||||
void prom_init_cmdline(void)
|
void __init prom_init_cmdline(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -104,7 +104,7 @@ static inline void str2eaddr(unsigned char *ea, unsigned char *str)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int prom_get_ethernet_addr(char *ethernet_addr)
|
int __init prom_get_ethernet_addr(char *ethernet_addr)
|
||||||
{
|
{
|
||||||
char *ethaddr_str;
|
char *ethaddr_str;
|
||||||
|
|
||||||
|
@ -123,7 +123,6 @@ int prom_get_ethernet_addr(char *ethernet_addr)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(prom_get_ethernet_addr);
|
|
||||||
|
|
||||||
void __init prom_free_prom_memory(void)
|
void __init prom_free_prom_memory(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -59,7 +59,7 @@ $(obj)/piggy.o: $(obj)/dummy.o $(obj)/vmlinux.bin.z FORCE
|
||||||
hostprogs-y := calc_vmlinuz_load_addr
|
hostprogs-y := calc_vmlinuz_load_addr
|
||||||
|
|
||||||
VMLINUZ_LOAD_ADDRESS = $(shell $(obj)/calc_vmlinuz_load_addr \
|
VMLINUZ_LOAD_ADDRESS = $(shell $(obj)/calc_vmlinuz_load_addr \
|
||||||
$(objtree)/$(KBUILD_IMAGE) $(VMLINUX_LOAD_ADDRESS))
|
$(obj)/vmlinux.bin $(VMLINUX_LOAD_ADDRESS))
|
||||||
|
|
||||||
vmlinuzobjs-y += $(obj)/piggy.o
|
vmlinuzobjs-y += $(obj)/piggy.o
|
||||||
|
|
||||||
|
|
|
@ -83,3 +83,7 @@ config ARCH_SPARSEMEM_ENABLE
|
||||||
def_bool y
|
def_bool y
|
||||||
select SPARSEMEM_STATIC
|
select SPARSEMEM_STATIC
|
||||||
depends on CPU_CAVIUM_OCTEON
|
depends on CPU_CAVIUM_OCTEON
|
||||||
|
|
||||||
|
config CAVIUM_OCTEON_HELPER
|
||||||
|
def_bool y
|
||||||
|
depends on OCTEON_ETHERNET || PCI
|
||||||
|
|
|
@ -41,7 +41,7 @@ static int cnmips_cu2_call(struct notifier_block *nfb, unsigned long action,
|
||||||
return NOTIFY_OK; /* Let default notifier send signals */
|
return NOTIFY_OK; /* Let default notifier send signals */
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cnmips_cu2_setup(void)
|
static int __init cnmips_cu2_setup(void)
|
||||||
{
|
{
|
||||||
return cu2_notifier(cnmips_cu2_call, 0);
|
return cu2_notifier(cnmips_cu2_call, 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,4 +11,4 @@
|
||||||
|
|
||||||
obj-y += cvmx-bootmem.o cvmx-l2c.o cvmx-sysinfo.o octeon-model.o
|
obj-y += cvmx-bootmem.o cvmx-l2c.o cvmx-sysinfo.o octeon-model.o
|
||||||
|
|
||||||
obj-$(CONFIG_PCI) += cvmx-helper-errata.o cvmx-helper-jtag.o
|
obj-$(CONFIG_CAVIUM_OCTEON_HELPER) += cvmx-helper-errata.o cvmx-helper-jtag.o
|
||||||
|
|
|
@ -782,6 +782,10 @@ static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u)
|
||||||
*/
|
*/
|
||||||
#define atomic64_add_negative(i, v) (atomic64_add_return(i, (v)) < 0)
|
#define atomic64_add_negative(i, v) (atomic64_add_return(i, (v)) < 0)
|
||||||
|
|
||||||
|
#else /* !CONFIG_64BIT */
|
||||||
|
|
||||||
|
#include <asm-generic/atomic64.h>
|
||||||
|
|
||||||
#endif /* CONFIG_64BIT */
|
#endif /* CONFIG_64BIT */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -24,7 +24,7 @@ extern int cu2_notifier_call_chain(unsigned long val, void *v);
|
||||||
|
|
||||||
#define cu2_notifier(fn, pri) \
|
#define cu2_notifier(fn, pri) \
|
||||||
({ \
|
({ \
|
||||||
static struct notifier_block fn##_nb __cpuinitdata = { \
|
static struct notifier_block fn##_nb = { \
|
||||||
.notifier_call = fn, \
|
.notifier_call = fn, \
|
||||||
.priority = pri \
|
.priority = pri \
|
||||||
}; \
|
}; \
|
||||||
|
|
|
@ -321,6 +321,7 @@ struct gic_intrmask_regs {
|
||||||
*/
|
*/
|
||||||
struct gic_intr_map {
|
struct gic_intr_map {
|
||||||
unsigned int cpunum; /* Directed to this CPU */
|
unsigned int cpunum; /* Directed to this CPU */
|
||||||
|
#define GIC_UNUSED 0xdead /* Dummy data */
|
||||||
unsigned int pin; /* Directed to this Pin */
|
unsigned int pin; /* Directed to this Pin */
|
||||||
unsigned int polarity; /* Polarity : +/- */
|
unsigned int polarity; /* Polarity : +/- */
|
||||||
unsigned int trigtype; /* Trigger : Edge/Levl */
|
unsigned int trigtype; /* Trigger : Edge/Levl */
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#ifndef __ASM_MACH_TX49XX_KMALLOC_H
|
#ifndef __ASM_MACH_TX49XX_KMALLOC_H
|
||||||
#define __ASM_MACH_TX49XX_KMALLOC_H
|
#define __ASM_MACH_TX49XX_KMALLOC_H
|
||||||
|
|
||||||
#define ARCH_KMALLOC_MINALIGN L1_CACHE_BYTES
|
#define ARCH_DMA_MINALIGN L1_CACHE_BYTES
|
||||||
|
|
||||||
#endif /* __ASM_MACH_TX49XX_KMALLOC_H */
|
#endif /* __ASM_MACH_TX49XX_KMALLOC_H */
|
||||||
|
|
|
@ -88,9 +88,6 @@
|
||||||
|
|
||||||
#define GIC_EXT_INTR(x) x
|
#define GIC_EXT_INTR(x) x
|
||||||
|
|
||||||
/* Dummy data */
|
|
||||||
#define X 0xdead
|
|
||||||
|
|
||||||
/* External Interrupts used for IPI */
|
/* External Interrupts used for IPI */
|
||||||
#define GIC_IPI_EXT_INTR_RESCHED_VPE0 16
|
#define GIC_IPI_EXT_INTR_RESCHED_VPE0 16
|
||||||
#define GIC_IPI_EXT_INTR_CALLFNC_VPE0 17
|
#define GIC_IPI_EXT_INTR_CALLFNC_VPE0 17
|
||||||
|
|
|
@ -150,6 +150,20 @@ typedef struct { unsigned long pgprot; } pgprot_t;
|
||||||
((unsigned long)(x) - PAGE_OFFSET + PHYS_OFFSET)
|
((unsigned long)(x) - PAGE_OFFSET + PHYS_OFFSET)
|
||||||
#endif
|
#endif
|
||||||
#define __va(x) ((void *)((unsigned long)(x) + PAGE_OFFSET - PHYS_OFFSET))
|
#define __va(x) ((void *)((unsigned long)(x) + PAGE_OFFSET - PHYS_OFFSET))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* RELOC_HIDE was originally added by 6007b903dfe5f1d13e0c711ac2894bdd4a61b1ad
|
||||||
|
* (lmo) rsp. 8431fd094d625b94d364fe393076ccef88e6ce18 (kernel.org). The
|
||||||
|
* discussion can be found in lkml posting
|
||||||
|
* <a2ebde260608230500o3407b108hc03debb9da6e62c@mail.gmail.com> which is
|
||||||
|
* archived at http://lists.linuxcoding.com/kernel/2006-q3/msg17360.html
|
||||||
|
*
|
||||||
|
* It is unclear if the misscompilations mentioned in
|
||||||
|
* http://lkml.org/lkml/2010/8/8/138 also affect MIPS so we keep this one
|
||||||
|
* until GCC 3.x has been retired before we can apply
|
||||||
|
* https://patchwork.linux-mips.org/patch/1541/
|
||||||
|
*/
|
||||||
|
|
||||||
#define __pa_symbol(x) __pa(RELOC_HIDE((unsigned long)(x), 0))
|
#define __pa_symbol(x) __pa(RELOC_HIDE((unsigned long)(x), 0))
|
||||||
|
|
||||||
#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT)
|
#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT)
|
||||||
|
|
|
@ -88,6 +88,7 @@ typedef struct siginfo {
|
||||||
#ifdef __ARCH_SI_TRAPNO
|
#ifdef __ARCH_SI_TRAPNO
|
||||||
int _trapno; /* TRAP # which caused the signal */
|
int _trapno; /* TRAP # which caused the signal */
|
||||||
#endif
|
#endif
|
||||||
|
short _addr_lsb;
|
||||||
} _sigfault;
|
} _sigfault;
|
||||||
|
|
||||||
/* SIGPOLL, SIGXFSZ (To do ...) */
|
/* SIGPOLL, SIGXFSZ (To do ...) */
|
||||||
|
|
|
@ -146,7 +146,8 @@ register struct thread_info *__current_thread_info __asm__("$28");
|
||||||
#define _TIF_LOAD_WATCH (1<<TIF_LOAD_WATCH)
|
#define _TIF_LOAD_WATCH (1<<TIF_LOAD_WATCH)
|
||||||
|
|
||||||
/* work to do on interrupt/exception return */
|
/* work to do on interrupt/exception return */
|
||||||
#define _TIF_WORK_MASK (0x0000ffef & ~_TIF_SECCOMP)
|
#define _TIF_WORK_MASK (0x0000ffef & \
|
||||||
|
~(_TIF_SECCOMP | _TIF_SYSCALL_AUDIT))
|
||||||
/* work to do on any return to u-space */
|
/* work to do on any return to u-space */
|
||||||
#define _TIF_ALLWORK_MASK (0x8000ffff & ~_TIF_SECCOMP)
|
#define _TIF_ALLWORK_MASK (0x8000ffff & ~_TIF_SECCOMP)
|
||||||
|
|
||||||
|
|
|
@ -356,16 +356,19 @@
|
||||||
#define __NR_perf_event_open (__NR_Linux + 333)
|
#define __NR_perf_event_open (__NR_Linux + 333)
|
||||||
#define __NR_accept4 (__NR_Linux + 334)
|
#define __NR_accept4 (__NR_Linux + 334)
|
||||||
#define __NR_recvmmsg (__NR_Linux + 335)
|
#define __NR_recvmmsg (__NR_Linux + 335)
|
||||||
|
#define __NR_fanotify_init (__NR_Linux + 336)
|
||||||
|
#define __NR_fanotify_mark (__NR_Linux + 337)
|
||||||
|
#define __NR_prlimit64 (__NR_Linux + 338)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Offset of the last Linux o32 flavoured syscall
|
* Offset of the last Linux o32 flavoured syscall
|
||||||
*/
|
*/
|
||||||
#define __NR_Linux_syscalls 335
|
#define __NR_Linux_syscalls 338
|
||||||
|
|
||||||
#endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */
|
#endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */
|
||||||
|
|
||||||
#define __NR_O32_Linux 4000
|
#define __NR_O32_Linux 4000
|
||||||
#define __NR_O32_Linux_syscalls 335
|
#define __NR_O32_Linux_syscalls 338
|
||||||
|
|
||||||
#if _MIPS_SIM == _MIPS_SIM_ABI64
|
#if _MIPS_SIM == _MIPS_SIM_ABI64
|
||||||
|
|
||||||
|
@ -668,16 +671,19 @@
|
||||||
#define __NR_perf_event_open (__NR_Linux + 292)
|
#define __NR_perf_event_open (__NR_Linux + 292)
|
||||||
#define __NR_accept4 (__NR_Linux + 293)
|
#define __NR_accept4 (__NR_Linux + 293)
|
||||||
#define __NR_recvmmsg (__NR_Linux + 294)
|
#define __NR_recvmmsg (__NR_Linux + 294)
|
||||||
|
#define __NR_fanotify_init (__NR_Linux + 295)
|
||||||
|
#define __NR_fanotify_mark (__NR_Linux + 296)
|
||||||
|
#define __NR_prlimit64 (__NR_Linux + 297)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Offset of the last Linux 64-bit flavoured syscall
|
* Offset of the last Linux 64-bit flavoured syscall
|
||||||
*/
|
*/
|
||||||
#define __NR_Linux_syscalls 294
|
#define __NR_Linux_syscalls 297
|
||||||
|
|
||||||
#endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */
|
#endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */
|
||||||
|
|
||||||
#define __NR_64_Linux 5000
|
#define __NR_64_Linux 5000
|
||||||
#define __NR_64_Linux_syscalls 294
|
#define __NR_64_Linux_syscalls 297
|
||||||
|
|
||||||
#if _MIPS_SIM == _MIPS_SIM_NABI32
|
#if _MIPS_SIM == _MIPS_SIM_NABI32
|
||||||
|
|
||||||
|
@ -985,16 +991,19 @@
|
||||||
#define __NR_accept4 (__NR_Linux + 297)
|
#define __NR_accept4 (__NR_Linux + 297)
|
||||||
#define __NR_recvmmsg (__NR_Linux + 298)
|
#define __NR_recvmmsg (__NR_Linux + 298)
|
||||||
#define __NR_getdents64 (__NR_Linux + 299)
|
#define __NR_getdents64 (__NR_Linux + 299)
|
||||||
|
#define __NR_fanotify_init (__NR_Linux + 300)
|
||||||
|
#define __NR_fanotify_mark (__NR_Linux + 301)
|
||||||
|
#define __NR_prlimit64 (__NR_Linux + 302)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Offset of the last N32 flavoured syscall
|
* Offset of the last N32 flavoured syscall
|
||||||
*/
|
*/
|
||||||
#define __NR_Linux_syscalls 299
|
#define __NR_Linux_syscalls 302
|
||||||
|
|
||||||
#endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */
|
#endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */
|
||||||
|
|
||||||
#define __NR_N32_Linux 6000
|
#define __NR_N32_Linux 6000
|
||||||
#define __NR_N32_Linux_syscalls 299
|
#define __NR_N32_Linux_syscalls 302
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,6 @@
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/gic.h>
|
#include <asm/gic.h>
|
||||||
#include <asm/gcmpregs.h>
|
#include <asm/gcmpregs.h>
|
||||||
#include <asm/mips-boards/maltaint.h>
|
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
#include <linux/hardirq.h>
|
#include <linux/hardirq.h>
|
||||||
#include <asm-generic/bitops/find.h>
|
#include <asm-generic/bitops/find.h>
|
||||||
|
@ -131,7 +130,7 @@ static int gic_set_affinity(unsigned int irq, const struct cpumask *cpumask)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
irq -= _irqbase;
|
irq -= _irqbase;
|
||||||
pr_debug(KERN_DEBUG "%s(%d) called\n", __func__, irq);
|
pr_debug("%s(%d) called\n", __func__, irq);
|
||||||
cpumask_and(&tmp, cpumask, cpu_online_mask);
|
cpumask_and(&tmp, cpumask, cpu_online_mask);
|
||||||
if (cpus_empty(tmp))
|
if (cpus_empty(tmp))
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -222,7 +221,7 @@ static void __init gic_basic_init(int numintrs, int numvpes,
|
||||||
/* Setup specifics */
|
/* Setup specifics */
|
||||||
for (i = 0; i < mapsize; i++) {
|
for (i = 0; i < mapsize; i++) {
|
||||||
cpu = intrmap[i].cpunum;
|
cpu = intrmap[i].cpunum;
|
||||||
if (cpu == X)
|
if (cpu == GIC_UNUSED)
|
||||||
continue;
|
continue;
|
||||||
if (cpu == 0 && i != 0 && intrmap[i].flags == 0)
|
if (cpu == 0 && i != 0 && intrmap[i].flags == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -283,7 +283,7 @@ static int kgdb_mips_notify(struct notifier_block *self, unsigned long cmd,
|
||||||
struct pt_regs *regs = args->regs;
|
struct pt_regs *regs = args->regs;
|
||||||
int trap = (regs->cp0_cause & 0x7c) >> 2;
|
int trap = (regs->cp0_cause & 0x7c) >> 2;
|
||||||
|
|
||||||
/* Userpace events, ignore. */
|
/* Userspace events, ignore. */
|
||||||
if (user_mode(regs))
|
if (user_mode(regs))
|
||||||
return NOTIFY_DONE;
|
return NOTIFY_DONE;
|
||||||
|
|
||||||
|
|
|
@ -251,7 +251,7 @@ void sp_work_handle_request(void)
|
||||||
memset(&tz, 0, sizeof(tz));
|
memset(&tz, 0, sizeof(tz));
|
||||||
if ((ret.retval = sp_syscall(__NR_gettimeofday, (int)&tv,
|
if ((ret.retval = sp_syscall(__NR_gettimeofday, (int)&tv,
|
||||||
(int)&tz, 0, 0)) == 0)
|
(int)&tz, 0, 0)) == 0)
|
||||||
ret.retval = tv.tv_sec;
|
ret.retval = tv.tv_sec;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MTSP_SYSCALL_EXIT:
|
case MTSP_SYSCALL_EXIT:
|
||||||
|
|
|
@ -341,3 +341,10 @@ asmlinkage long sys32_lookup_dcookie(u32 a0, u32 a1, char __user *buf,
|
||||||
{
|
{
|
||||||
return sys_lookup_dcookie(merge_64(a0, a1), buf, len);
|
return sys_lookup_dcookie(merge_64(a0, a1), buf, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SYSCALL_DEFINE6(32_fanotify_mark, int, fanotify_fd, unsigned int, flags,
|
||||||
|
u64, a3, u64, a4, int, dfd, const char __user *, pathname)
|
||||||
|
{
|
||||||
|
return sys_fanotify_mark(fanotify_fd, flags, merge_64(a3, a4),
|
||||||
|
dfd, pathname);
|
||||||
|
}
|
||||||
|
|
|
@ -583,7 +583,10 @@ einval: li v0, -ENOSYS
|
||||||
sys sys_rt_tgsigqueueinfo 4
|
sys sys_rt_tgsigqueueinfo 4
|
||||||
sys sys_perf_event_open 5
|
sys sys_perf_event_open 5
|
||||||
sys sys_accept4 4
|
sys sys_accept4 4
|
||||||
sys sys_recvmmsg 5
|
sys sys_recvmmsg 5 /* 4335 */
|
||||||
|
sys sys_fanotify_init 2
|
||||||
|
sys sys_fanotify_mark 6
|
||||||
|
sys sys_prlimit64 4
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
/* We pre-compute the number of _instruction_ bytes needed to
|
/* We pre-compute the number of _instruction_ bytes needed to
|
||||||
|
|
|
@ -416,9 +416,12 @@ sys_call_table:
|
||||||
PTR sys_pipe2
|
PTR sys_pipe2
|
||||||
PTR sys_inotify_init1
|
PTR sys_inotify_init1
|
||||||
PTR sys_preadv
|
PTR sys_preadv
|
||||||
PTR sys_pwritev /* 5390 */
|
PTR sys_pwritev /* 5290 */
|
||||||
PTR sys_rt_tgsigqueueinfo
|
PTR sys_rt_tgsigqueueinfo
|
||||||
PTR sys_perf_event_open
|
PTR sys_perf_event_open
|
||||||
PTR sys_accept4
|
PTR sys_accept4
|
||||||
PTR sys_recvmmsg
|
PTR sys_recvmmsg
|
||||||
|
PTR sys_fanotify_init /* 5295 */
|
||||||
|
PTR sys_fanotify_mark
|
||||||
|
PTR sys_prlimit64
|
||||||
.size sys_call_table,.-sys_call_table
|
.size sys_call_table,.-sys_call_table
|
||||||
|
|
|
@ -419,5 +419,8 @@ EXPORT(sysn32_call_table)
|
||||||
PTR sys_perf_event_open
|
PTR sys_perf_event_open
|
||||||
PTR sys_accept4
|
PTR sys_accept4
|
||||||
PTR compat_sys_recvmmsg
|
PTR compat_sys_recvmmsg
|
||||||
PTR sys_getdents
|
PTR sys_getdents64
|
||||||
|
PTR sys_fanotify_init /* 6300 */
|
||||||
|
PTR sys_fanotify_mark
|
||||||
|
PTR sys_prlimit64
|
||||||
.size sysn32_call_table,.-sysn32_call_table
|
.size sysn32_call_table,.-sysn32_call_table
|
||||||
|
|
|
@ -538,5 +538,8 @@ sys_call_table:
|
||||||
PTR compat_sys_rt_tgsigqueueinfo
|
PTR compat_sys_rt_tgsigqueueinfo
|
||||||
PTR sys_perf_event_open
|
PTR sys_perf_event_open
|
||||||
PTR sys_accept4
|
PTR sys_accept4
|
||||||
PTR compat_sys_recvmmsg
|
PTR compat_sys_recvmmsg /* 4335 */
|
||||||
|
PTR sys_fanotify_init
|
||||||
|
PTR sys_32_fanotify_mark
|
||||||
|
PTR sys_prlimit64
|
||||||
.size sys_call_table,.-sys_call_table
|
.size sys_call_table,.-sys_call_table
|
||||||
|
|
|
@ -44,27 +44,39 @@ static inline int cpu_is_noncoherent_r10000(struct device *dev)
|
||||||
|
|
||||||
static gfp_t massage_gfp_flags(const struct device *dev, gfp_t gfp)
|
static gfp_t massage_gfp_flags(const struct device *dev, gfp_t gfp)
|
||||||
{
|
{
|
||||||
|
gfp_t dma_flag;
|
||||||
|
|
||||||
/* ignore region specifiers */
|
/* ignore region specifiers */
|
||||||
gfp &= ~(__GFP_DMA | __GFP_DMA32 | __GFP_HIGHMEM);
|
gfp &= ~(__GFP_DMA | __GFP_DMA32 | __GFP_HIGHMEM);
|
||||||
|
|
||||||
#ifdef CONFIG_ZONE_DMA
|
#ifdef CONFIG_ISA
|
||||||
if (dev == NULL)
|
if (dev == NULL)
|
||||||
gfp |= __GFP_DMA;
|
dma_flag = __GFP_DMA;
|
||||||
else if (dev->coherent_dma_mask < DMA_BIT_MASK(24))
|
|
||||||
gfp |= __GFP_DMA;
|
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_ZONE_DMA32
|
#if defined(CONFIG_ZONE_DMA32) && defined(CONFIG_ZONE_DMA)
|
||||||
if (dev->coherent_dma_mask < DMA_BIT_MASK(32))
|
if (dev->coherent_dma_mask < DMA_BIT_MASK(32))
|
||||||
gfp |= __GFP_DMA32;
|
dma_flag = __GFP_DMA;
|
||||||
|
else if (dev->coherent_dma_mask < DMA_BIT_MASK(64))
|
||||||
|
dma_flag = __GFP_DMA32;
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
;
|
#if defined(CONFIG_ZONE_DMA32) && !defined(CONFIG_ZONE_DMA)
|
||||||
|
if (dev->coherent_dma_mask < DMA_BIT_MASK(64))
|
||||||
|
dma_flag = __GFP_DMA32;
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
#if defined(CONFIG_ZONE_DMA) && !defined(CONFIG_ZONE_DMA32)
|
||||||
|
if (dev->coherent_dma_mask < DMA_BIT_MASK(64))
|
||||||
|
dma_flag = __GFP_DMA;
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
dma_flag = 0;
|
||||||
|
|
||||||
/* Don't invoke OOM killer */
|
/* Don't invoke OOM killer */
|
||||||
gfp |= __GFP_NORETRY;
|
gfp |= __GFP_NORETRY;
|
||||||
|
|
||||||
return gfp;
|
return gfp | dma_flag;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *dma_alloc_noncoherent(struct device *dev, size_t size,
|
void *dma_alloc_noncoherent(struct device *dev, size_t size,
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
#define tc_lsize 32
|
#define tc_lsize 32
|
||||||
|
|
||||||
extern unsigned long icache_way_size, dcache_way_size;
|
extern unsigned long icache_way_size, dcache_way_size;
|
||||||
unsigned long tcache_size;
|
static unsigned long tcache_size;
|
||||||
|
|
||||||
#include <asm/r4kcache.h>
|
#include <asm/r4kcache.h>
|
||||||
|
|
||||||
|
|
|
@ -385,6 +385,8 @@ static int __initdata msc_nr_eicirqs = ARRAY_SIZE(msc_eicirqmap);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define GIC_CPU_NMI GIC_MAP_TO_NMI_MSK
|
#define GIC_CPU_NMI GIC_MAP_TO_NMI_MSK
|
||||||
|
#define X GIC_UNUSED
|
||||||
|
|
||||||
static struct gic_intr_map gic_intr_map[GIC_NUM_INTRS] = {
|
static struct gic_intr_map gic_intr_map[GIC_NUM_INTRS] = {
|
||||||
{ X, X, X, X, 0 },
|
{ X, X, X, X, 0 },
|
||||||
{ X, X, X, X, 0 },
|
{ X, X, X, X, 0 },
|
||||||
|
@ -404,6 +406,7 @@ static struct gic_intr_map gic_intr_map[GIC_NUM_INTRS] = {
|
||||||
{ X, X, X, X, 0 },
|
{ X, X, X, X, 0 },
|
||||||
/* The remainder of this table is initialised by fill_ipi_map */
|
/* The remainder of this table is initialised by fill_ipi_map */
|
||||||
};
|
};
|
||||||
|
#undef X
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GCMP needs to be detected before any SMP initialisation
|
* GCMP needs to be detected before any SMP initialisation
|
||||||
|
|
|
@ -118,7 +118,7 @@ static int __init rc32434_pcibridge_init(void)
|
||||||
if (!((pcicvalue == PCIM_H_EA) ||
|
if (!((pcicvalue == PCIM_H_EA) ||
|
||||||
(pcicvalue == PCIM_H_IA_FIX) ||
|
(pcicvalue == PCIM_H_IA_FIX) ||
|
||||||
(pcicvalue == PCIM_H_IA_RR))) {
|
(pcicvalue == PCIM_H_IA_RR))) {
|
||||||
pr_err(KERN_ERR "PCI init error!!!\n");
|
pr_err("PCI init error!!!\n");
|
||||||
/* Not in Host Mode, return ERROR */
|
/* Not in Host Mode, return ERROR */
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,29 +22,19 @@
|
||||||
*/
|
*/
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
|
||||||
|
#include <asm/processor.h>
|
||||||
#include <asm/reboot.h>
|
#include <asm/reboot.h>
|
||||||
#include <glb.h>
|
#include <glb.h>
|
||||||
|
|
||||||
void pnx8550_machine_restart(char *command)
|
void pnx8550_machine_restart(char *command)
|
||||||
{
|
{
|
||||||
char head[] = "************* Machine restart *************";
|
|
||||||
char foot[] = "*******************************************";
|
|
||||||
|
|
||||||
printk("\n\n");
|
|
||||||
printk("%s\n", head);
|
|
||||||
if (command != NULL)
|
|
||||||
printk("* %s\n", command);
|
|
||||||
printk("%s\n", foot);
|
|
||||||
|
|
||||||
PNX8550_RST_CTL = PNX8550_RST_DO_SW_RST;
|
PNX8550_RST_CTL = PNX8550_RST_DO_SW_RST;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pnx8550_machine_halt(void)
|
void pnx8550_machine_halt(void)
|
||||||
{
|
{
|
||||||
printk("*** Machine halt. (Not implemented) ***\n");
|
while (1) {
|
||||||
}
|
if (cpu_wait)
|
||||||
|
cpu_wait();
|
||||||
void pnx8550_machine_power_off(void)
|
}
|
||||||
{
|
|
||||||
printk("*** Machine power off. (Not implemented) ***\n");
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,6 @@
|
||||||
extern void __init board_setup(void);
|
extern void __init board_setup(void);
|
||||||
extern void pnx8550_machine_restart(char *);
|
extern void pnx8550_machine_restart(char *);
|
||||||
extern void pnx8550_machine_halt(void);
|
extern void pnx8550_machine_halt(void);
|
||||||
extern void pnx8550_machine_power_off(void);
|
|
||||||
extern struct resource ioport_resource;
|
extern struct resource ioport_resource;
|
||||||
extern struct resource iomem_resource;
|
extern struct resource iomem_resource;
|
||||||
extern char *prom_getcmdline(void);
|
extern char *prom_getcmdline(void);
|
||||||
|
@ -100,7 +99,7 @@ void __init plat_mem_setup(void)
|
||||||
|
|
||||||
_machine_restart = pnx8550_machine_restart;
|
_machine_restart = pnx8550_machine_restart;
|
||||||
_machine_halt = pnx8550_machine_halt;
|
_machine_halt = pnx8550_machine_halt;
|
||||||
pm_power_off = pnx8550_machine_power_off;
|
pm_power_off = pnx8550_machine_halt;
|
||||||
|
|
||||||
/* Clear the Global 2 Register, PCI Inta Output Enable Registers
|
/* Clear the Global 2 Register, PCI Inta Output Enable Registers
|
||||||
Bit 1:Enable DAC Powerdown
|
Bit 1:Enable DAC Powerdown
|
||||||
|
|
|
@ -206,7 +206,7 @@ int module_finalize(const Elf_Ehdr *hdr,
|
||||||
const Elf_Shdr *sechdrs,
|
const Elf_Shdr *sechdrs,
|
||||||
struct module *me)
|
struct module *me)
|
||||||
{
|
{
|
||||||
return module_bug_finalize(hdr, sechdrs, me);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -214,5 +214,4 @@ int module_finalize(const Elf_Ehdr *hdr,
|
||||||
*/
|
*/
|
||||||
void module_arch_cleanup(struct module *mod)
|
void module_arch_cleanup(struct module *mod)
|
||||||
{
|
{
|
||||||
module_bug_cleanup(mod);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,13 +2,11 @@
|
||||||
# Makefile for the MN10300-specific memory management code
|
# Makefile for the MN10300-specific memory management code
|
||||||
#
|
#
|
||||||
|
|
||||||
|
cacheflush-y := cache.o cache-mn10300.o
|
||||||
|
cacheflush-$(CONFIG_MN10300_CACHE_WBACK) += cache-flush-mn10300.o
|
||||||
|
|
||||||
|
cacheflush-$(CONFIG_MN10300_CACHE_DISABLED) := cache-disabled.o
|
||||||
|
|
||||||
obj-y := \
|
obj-y := \
|
||||||
init.o fault.o pgtable.o extable.o tlb-mn10300.o mmu-context.o \
|
init.o fault.o pgtable.o extable.o tlb-mn10300.o mmu-context.o \
|
||||||
misalignment.o dma-alloc.o
|
misalignment.o dma-alloc.o $(cacheflush-y)
|
||||||
|
|
||||||
ifneq ($(CONFIG_MN10300_CACHE_DISABLED),y)
|
|
||||||
obj-y += cache.o cache-mn10300.o
|
|
||||||
ifeq ($(CONFIG_MN10300_CACHE_WBACK),y)
|
|
||||||
obj-y += cache-flush-mn10300.o
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
21
arch/mn10300/mm/cache-disabled.c
Normal file
21
arch/mn10300/mm/cache-disabled.c
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
/* Handle the cache being disabled
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Red Hat, Inc. All Rights Reserved.
|
||||||
|
* Written by David Howells (dhowells@redhat.com)
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public Licence
|
||||||
|
* as published by the Free Software Foundation; either version
|
||||||
|
* 2 of the Licence, or (at your option) any later version.
|
||||||
|
*/
|
||||||
|
#include <linux/mm.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* allow userspace to flush the instruction cache
|
||||||
|
*/
|
||||||
|
asmlinkage long sys_cacheflush(unsigned long start, unsigned long end)
|
||||||
|
{
|
||||||
|
if (end < start)
|
||||||
|
return -EINVAL;
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -54,13 +54,30 @@ EXPORT_SYMBOL(flush_icache_page);
|
||||||
void flush_icache_range(unsigned long start, unsigned long end)
|
void flush_icache_range(unsigned long start, unsigned long end)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_MN10300_CACHE_WBACK
|
#ifdef CONFIG_MN10300_CACHE_WBACK
|
||||||
unsigned long addr, size, off;
|
unsigned long addr, size, base, off;
|
||||||
struct page *page;
|
struct page *page;
|
||||||
pgd_t *pgd;
|
pgd_t *pgd;
|
||||||
pud_t *pud;
|
pud_t *pud;
|
||||||
pmd_t *pmd;
|
pmd_t *pmd;
|
||||||
pte_t *ppte, pte;
|
pte_t *ppte, pte;
|
||||||
|
|
||||||
|
if (end > 0x80000000UL) {
|
||||||
|
/* addresses above 0xa0000000 do not go through the cache */
|
||||||
|
if (end > 0xa0000000UL) {
|
||||||
|
end = 0xa0000000UL;
|
||||||
|
if (start >= end)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* kernel addresses between 0x80000000 and 0x9fffffff do not
|
||||||
|
* require page tables, so we just map such addresses directly */
|
||||||
|
base = (start >= 0x80000000UL) ? start : 0x80000000UL;
|
||||||
|
mn10300_dcache_flush_range(base, end);
|
||||||
|
if (base == start)
|
||||||
|
goto invalidate;
|
||||||
|
end = base;
|
||||||
|
}
|
||||||
|
|
||||||
for (; start < end; start += size) {
|
for (; start < end; start += size) {
|
||||||
/* work out how much of the page to flush */
|
/* work out how much of the page to flush */
|
||||||
off = start & (PAGE_SIZE - 1);
|
off = start & (PAGE_SIZE - 1);
|
||||||
|
@ -104,6 +121,7 @@ void flush_icache_range(unsigned long start, unsigned long end)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
invalidate:
|
||||||
mn10300_icache_inv();
|
mn10300_icache_inv();
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(flush_icache_range);
|
EXPORT_SYMBOL(flush_icache_range);
|
||||||
|
|
|
@ -941,11 +941,10 @@ int module_finalize(const Elf_Ehdr *hdr,
|
||||||
nsyms = newptr - (Elf_Sym *)symhdr->sh_addr;
|
nsyms = newptr - (Elf_Sym *)symhdr->sh_addr;
|
||||||
DEBUGP("NEW num_symtab %lu\n", nsyms);
|
DEBUGP("NEW num_symtab %lu\n", nsyms);
|
||||||
symhdr->sh_size = nsyms * sizeof(Elf_Sym);
|
symhdr->sh_size = nsyms * sizeof(Elf_Sym);
|
||||||
return module_bug_finalize(hdr, sechdrs, me);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void module_arch_cleanup(struct module *mod)
|
void module_arch_cleanup(struct module *mod)
|
||||||
{
|
{
|
||||||
deregister_unwind_table(mod);
|
deregister_unwind_table(mod);
|
||||||
module_bug_cleanup(mod);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,11 +63,6 @@ int module_finalize(const Elf_Ehdr *hdr,
|
||||||
const Elf_Shdr *sechdrs, struct module *me)
|
const Elf_Shdr *sechdrs, struct module *me)
|
||||||
{
|
{
|
||||||
const Elf_Shdr *sect;
|
const Elf_Shdr *sect;
|
||||||
int err;
|
|
||||||
|
|
||||||
err = module_bug_finalize(hdr, sechdrs, me);
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
|
|
||||||
/* Apply feature fixups */
|
/* Apply feature fixups */
|
||||||
sect = find_section(hdr, sechdrs, "__ftr_fixup");
|
sect = find_section(hdr, sechdrs, "__ftr_fixup");
|
||||||
|
@ -101,5 +96,4 @@ int module_finalize(const Elf_Ehdr *hdr,
|
||||||
|
|
||||||
void module_arch_cleanup(struct module *mod)
|
void module_arch_cleanup(struct module *mod)
|
||||||
{
|
{
|
||||||
module_bug_cleanup(mod);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,7 +57,7 @@ static struct clk *mpc5121_clk_get(struct device *dev, const char *id)
|
||||||
int id_match = 0;
|
int id_match = 0;
|
||||||
|
|
||||||
if (dev == NULL || id == NULL)
|
if (dev == NULL || id == NULL)
|
||||||
return NULL;
|
return clk;
|
||||||
|
|
||||||
mutex_lock(&clocks_mutex);
|
mutex_lock(&clocks_mutex);
|
||||||
list_for_each_entry(p, &clocks, node) {
|
list_for_each_entry(p, &clocks, node) {
|
||||||
|
|
|
@ -99,7 +99,7 @@ static void __init efika_pcisetup(void)
|
||||||
if (bus_range == NULL || len < 2 * sizeof(int)) {
|
if (bus_range == NULL || len < 2 * sizeof(int)) {
|
||||||
printk(KERN_WARNING EFIKA_PLATFORM_NAME
|
printk(KERN_WARNING EFIKA_PLATFORM_NAME
|
||||||
": Can't get bus-range for %s\n", pcictrl->full_name);
|
": Can't get bus-range for %s\n", pcictrl->full_name);
|
||||||
return;
|
goto out_put;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bus_range[1] == bus_range[0])
|
if (bus_range[1] == bus_range[0])
|
||||||
|
@ -111,12 +111,12 @@ static void __init efika_pcisetup(void)
|
||||||
printk(" controlled by %s\n", pcictrl->full_name);
|
printk(" controlled by %s\n", pcictrl->full_name);
|
||||||
printk("\n");
|
printk("\n");
|
||||||
|
|
||||||
hose = pcibios_alloc_controller(of_node_get(pcictrl));
|
hose = pcibios_alloc_controller(pcictrl);
|
||||||
if (!hose) {
|
if (!hose) {
|
||||||
printk(KERN_WARNING EFIKA_PLATFORM_NAME
|
printk(KERN_WARNING EFIKA_PLATFORM_NAME
|
||||||
": Can't allocate PCI controller structure for %s\n",
|
": Can't allocate PCI controller structure for %s\n",
|
||||||
pcictrl->full_name);
|
pcictrl->full_name);
|
||||||
return;
|
goto out_put;
|
||||||
}
|
}
|
||||||
|
|
||||||
hose->first_busno = bus_range[0];
|
hose->first_busno = bus_range[0];
|
||||||
|
@ -124,6 +124,9 @@ static void __init efika_pcisetup(void)
|
||||||
hose->ops = &rtas_pci_ops;
|
hose->ops = &rtas_pci_ops;
|
||||||
|
|
||||||
pci_process_bridge_OF_ranges(hose, pcictrl, 0);
|
pci_process_bridge_OF_ranges(hose, pcictrl, 0);
|
||||||
|
return;
|
||||||
|
out_put:
|
||||||
|
of_node_put(pcictrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -325,12 +325,16 @@ int mpc5200_psc_ac97_gpio_reset(int psc_number)
|
||||||
clrbits32(&simple_gpio->simple_dvo, sync | out);
|
clrbits32(&simple_gpio->simple_dvo, sync | out);
|
||||||
clrbits8(&wkup_gpio->wkup_dvo, reset);
|
clrbits8(&wkup_gpio->wkup_dvo, reset);
|
||||||
|
|
||||||
/* wait at lease 1 us */
|
/* wait for 1 us */
|
||||||
udelay(2);
|
udelay(1);
|
||||||
|
|
||||||
/* Deassert reset */
|
/* Deassert reset */
|
||||||
setbits8(&wkup_gpio->wkup_dvo, reset);
|
setbits8(&wkup_gpio->wkup_dvo, reset);
|
||||||
|
|
||||||
|
/* wait at least 200ns */
|
||||||
|
/* 7 ~= (200ns * timebase) / ns2sec */
|
||||||
|
__delay(7);
|
||||||
|
|
||||||
/* Restore pin-muxing */
|
/* Restore pin-muxing */
|
||||||
out_be32(&simple_gpio->port_config, mux);
|
out_be32(&simple_gpio->port_config, mux);
|
||||||
|
|
||||||
|
|
|
@ -407,10 +407,9 @@ int module_finalize(const Elf_Ehdr *hdr,
|
||||||
{
|
{
|
||||||
vfree(me->arch.syminfo);
|
vfree(me->arch.syminfo);
|
||||||
me->arch.syminfo = NULL;
|
me->arch.syminfo = NULL;
|
||||||
return module_bug_finalize(hdr, sechdrs, me);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void module_arch_cleanup(struct module *mod)
|
void module_arch_cleanup(struct module *mod)
|
||||||
{
|
{
|
||||||
module_bug_cleanup(mod);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -149,13 +149,11 @@ int module_finalize(const Elf_Ehdr *hdr,
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
ret |= module_dwarf_finalize(hdr, sechdrs, me);
|
ret |= module_dwarf_finalize(hdr, sechdrs, me);
|
||||||
ret |= module_bug_finalize(hdr, sechdrs, me);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void module_arch_cleanup(struct module *mod)
|
void module_arch_cleanup(struct module *mod)
|
||||||
{
|
{
|
||||||
module_bug_cleanup(mod);
|
|
||||||
module_dwarf_cleanup(mod);
|
module_dwarf_cleanup(mod);
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,6 +40,11 @@ static char *mixer = HOSTAUDIO_DEV_MIXER;
|
||||||
" This is used to specify the host mixer device to the hostaudio driver.\n"\
|
" This is used to specify the host mixer device to the hostaudio driver.\n"\
|
||||||
" The default is \"" HOSTAUDIO_DEV_MIXER "\".\n\n"
|
" The default is \"" HOSTAUDIO_DEV_MIXER "\".\n\n"
|
||||||
|
|
||||||
|
module_param(dsp, charp, 0644);
|
||||||
|
MODULE_PARM_DESC(dsp, DSP_HELP);
|
||||||
|
module_param(mixer, charp, 0644);
|
||||||
|
MODULE_PARM_DESC(mixer, MIXER_HELP);
|
||||||
|
|
||||||
#ifndef MODULE
|
#ifndef MODULE
|
||||||
static int set_dsp(char *name, int *add)
|
static int set_dsp(char *name, int *add)
|
||||||
{
|
{
|
||||||
|
@ -56,15 +61,6 @@ static int set_mixer(char *name, int *add)
|
||||||
}
|
}
|
||||||
|
|
||||||
__uml_setup("mixer=", set_mixer, "mixer=<mixer device>\n" MIXER_HELP);
|
__uml_setup("mixer=", set_mixer, "mixer=<mixer device>\n" MIXER_HELP);
|
||||||
|
|
||||||
#else /*MODULE*/
|
|
||||||
|
|
||||||
module_param(dsp, charp, 0644);
|
|
||||||
MODULE_PARM_DESC(dsp, DSP_HELP);
|
|
||||||
|
|
||||||
module_param(mixer, charp, 0644);
|
|
||||||
MODULE_PARM_DESC(mixer, MIXER_HELP);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* /dev/dsp file operations */
|
/* /dev/dsp file operations */
|
||||||
|
|
|
@ -255,18 +255,6 @@ static void uml_net_tx_timeout(struct net_device *dev)
|
||||||
netif_wake_queue(dev);
|
netif_wake_queue(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int uml_net_set_mac(struct net_device *dev, void *addr)
|
|
||||||
{
|
|
||||||
struct uml_net_private *lp = netdev_priv(dev);
|
|
||||||
struct sockaddr *hwaddr = addr;
|
|
||||||
|
|
||||||
spin_lock_irq(&lp->lock);
|
|
||||||
eth_mac_addr(dev, hwaddr->sa_data);
|
|
||||||
spin_unlock_irq(&lp->lock);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int uml_net_change_mtu(struct net_device *dev, int new_mtu)
|
static int uml_net_change_mtu(struct net_device *dev, int new_mtu)
|
||||||
{
|
{
|
||||||
dev->mtu = new_mtu;
|
dev->mtu = new_mtu;
|
||||||
|
@ -373,7 +361,7 @@ static const struct net_device_ops uml_netdev_ops = {
|
||||||
.ndo_start_xmit = uml_net_start_xmit,
|
.ndo_start_xmit = uml_net_start_xmit,
|
||||||
.ndo_set_multicast_list = uml_net_set_multicast_list,
|
.ndo_set_multicast_list = uml_net_set_multicast_list,
|
||||||
.ndo_tx_timeout = uml_net_tx_timeout,
|
.ndo_tx_timeout = uml_net_tx_timeout,
|
||||||
.ndo_set_mac_address = uml_net_set_mac,
|
.ndo_set_mac_address = eth_mac_addr,
|
||||||
.ndo_change_mtu = uml_net_change_mtu,
|
.ndo_change_mtu = uml_net_change_mtu,
|
||||||
.ndo_validate_addr = eth_validate_addr,
|
.ndo_validate_addr = eth_validate_addr,
|
||||||
};
|
};
|
||||||
|
@ -472,7 +460,8 @@ static void eth_configure(int n, void *init, char *mac,
|
||||||
((*transport->user->init)(&lp->user, dev) != 0))
|
((*transport->user->init)(&lp->user, dev) != 0))
|
||||||
goto out_unregister;
|
goto out_unregister;
|
||||||
|
|
||||||
eth_mac_addr(dev, device->mac);
|
/* don't use eth_mac_addr, it will not work here */
|
||||||
|
memcpy(dev->dev_addr, device->mac, ETH_ALEN);
|
||||||
dev->mtu = transport->user->mtu;
|
dev->mtu = transport->user->mtu;
|
||||||
dev->netdev_ops = ¨_netdev_ops;
|
dev->netdev_ops = ¨_netdev_ops;
|
||||||
dev->ethtool_ops = ¨_net_ethtool_ops;
|
dev->ethtool_ops = ¨_net_ethtool_ops;
|
||||||
|
|
|
@ -163,6 +163,7 @@ struct ubd {
|
||||||
struct scatterlist sg[MAX_SG];
|
struct scatterlist sg[MAX_SG];
|
||||||
struct request *request;
|
struct request *request;
|
||||||
int start_sg, end_sg;
|
int start_sg, end_sg;
|
||||||
|
sector_t rq_pos;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DEFAULT_COW { \
|
#define DEFAULT_COW { \
|
||||||
|
@ -187,6 +188,7 @@ struct ubd {
|
||||||
.request = NULL, \
|
.request = NULL, \
|
||||||
.start_sg = 0, \
|
.start_sg = 0, \
|
||||||
.end_sg = 0, \
|
.end_sg = 0, \
|
||||||
|
.rq_pos = 0, \
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Protected by ubd_lock */
|
/* Protected by ubd_lock */
|
||||||
|
@ -1228,7 +1230,6 @@ static void do_ubd_request(struct request_queue *q)
|
||||||
{
|
{
|
||||||
struct io_thread_req *io_req;
|
struct io_thread_req *io_req;
|
||||||
struct request *req;
|
struct request *req;
|
||||||
sector_t sector;
|
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
while(1){
|
while(1){
|
||||||
|
@ -1239,12 +1240,12 @@ static void do_ubd_request(struct request_queue *q)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
dev->request = req;
|
dev->request = req;
|
||||||
|
dev->rq_pos = blk_rq_pos(req);
|
||||||
dev->start_sg = 0;
|
dev->start_sg = 0;
|
||||||
dev->end_sg = blk_rq_map_sg(q, req, dev->sg);
|
dev->end_sg = blk_rq_map_sg(q, req, dev->sg);
|
||||||
}
|
}
|
||||||
|
|
||||||
req = dev->request;
|
req = dev->request;
|
||||||
sector = blk_rq_pos(req);
|
|
||||||
while(dev->start_sg < dev->end_sg){
|
while(dev->start_sg < dev->end_sg){
|
||||||
struct scatterlist *sg = &dev->sg[dev->start_sg];
|
struct scatterlist *sg = &dev->sg[dev->start_sg];
|
||||||
|
|
||||||
|
@ -1256,10 +1257,9 @@ static void do_ubd_request(struct request_queue *q)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
prepare_request(req, io_req,
|
prepare_request(req, io_req,
|
||||||
(unsigned long long)sector << 9,
|
(unsigned long long)dev->rq_pos << 9,
|
||||||
sg->offset, sg->length, sg_page(sg));
|
sg->offset, sg->length, sg_page(sg));
|
||||||
|
|
||||||
sector += sg->length >> 9;
|
|
||||||
n = os_write_file(thread_fd, &io_req,
|
n = os_write_file(thread_fd, &io_req,
|
||||||
sizeof(struct io_thread_req *));
|
sizeof(struct io_thread_req *));
|
||||||
if(n != sizeof(struct io_thread_req *)){
|
if(n != sizeof(struct io_thread_req *)){
|
||||||
|
@ -1272,6 +1272,7 @@ static void do_ubd_request(struct request_queue *q)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dev->rq_pos += sg->length >> 9;
|
||||||
dev->start_sg++;
|
dev->start_sg++;
|
||||||
}
|
}
|
||||||
dev->end_sg = 0;
|
dev->end_sg = 0;
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
#include <asm/ia32.h>
|
#include <asm/ia32.h>
|
||||||
|
|
||||||
#undef WARN_OLD
|
#undef WARN_OLD
|
||||||
#undef CORE_DUMP /* probably broken */
|
#undef CORE_DUMP /* definitely broken */
|
||||||
|
|
||||||
static int load_aout_binary(struct linux_binprm *, struct pt_regs *regs);
|
static int load_aout_binary(struct linux_binprm *, struct pt_regs *regs);
|
||||||
static int load_aout_library(struct file *);
|
static int load_aout_library(struct file *);
|
||||||
|
@ -131,21 +131,15 @@ static void set_brk(unsigned long start, unsigned long end)
|
||||||
* macros to write out all the necessary info.
|
* macros to write out all the necessary info.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int dump_write(struct file *file, const void *addr, int nr)
|
#include <linux/coredump.h>
|
||||||
{
|
|
||||||
return file->f_op->write(file, addr, nr, &file->f_pos) == nr;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define DUMP_WRITE(addr, nr) \
|
#define DUMP_WRITE(addr, nr) \
|
||||||
if (!dump_write(file, (void *)(addr), (nr))) \
|
if (!dump_write(file, (void *)(addr), (nr))) \
|
||||||
goto end_coredump;
|
goto end_coredump;
|
||||||
|
|
||||||
#define DUMP_SEEK(offset) \
|
#define DUMP_SEEK(offset) \
|
||||||
if (file->f_op->llseek) { \
|
if (!dump_seek(file, offset)) \
|
||||||
if (file->f_op->llseek(file, (offset), 0) != (offset)) \
|
goto end_coredump;
|
||||||
goto end_coredump; \
|
|
||||||
} else \
|
|
||||||
file->f_pos = (offset)
|
|
||||||
|
|
||||||
#define START_DATA() (u.u_tsize << PAGE_SHIFT)
|
#define START_DATA() (u.u_tsize << PAGE_SHIFT)
|
||||||
#define START_STACK(u) (u.start_stack)
|
#define START_STACK(u) (u.start_stack)
|
||||||
|
@ -217,12 +211,6 @@ static int aout_core_dump(long signr, struct pt_regs *regs, struct file *file,
|
||||||
dump_size = dump.u_ssize << PAGE_SHIFT;
|
dump_size = dump.u_ssize << PAGE_SHIFT;
|
||||||
DUMP_WRITE(dump_start, dump_size);
|
DUMP_WRITE(dump_start, dump_size);
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
* Finally dump the task struct. Not be used by gdb, but
|
|
||||||
* could be useful
|
|
||||||
*/
|
|
||||||
set_fs(KERNEL_DS);
|
|
||||||
DUMP_WRITE(current, sizeof(*current));
|
|
||||||
end_coredump:
|
end_coredump:
|
||||||
set_fs(fs);
|
set_fs(fs);
|
||||||
return has_dumped;
|
return has_dumped;
|
||||||
|
|
|
@ -61,7 +61,7 @@ struct cstate_entry {
|
||||||
unsigned int ecx;
|
unsigned int ecx;
|
||||||
} states[ACPI_PROCESSOR_MAX_POWER];
|
} states[ACPI_PROCESSOR_MAX_POWER];
|
||||||
};
|
};
|
||||||
static struct cstate_entry *cpu_cstate_entry; /* per CPU ptr */
|
static struct cstate_entry __percpu *cpu_cstate_entry; /* per CPU ptr */
|
||||||
|
|
||||||
static short mwait_supported[ACPI_PROCESSOR_MAX_POWER];
|
static short mwait_supported[ACPI_PROCESSOR_MAX_POWER];
|
||||||
|
|
||||||
|
|
|
@ -368,16 +368,22 @@ static int __init pcc_cpufreq_do_osc(acpi_handle *handle)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
out_obj = output.pointer;
|
out_obj = output.pointer;
|
||||||
if (out_obj->type != ACPI_TYPE_BUFFER)
|
if (out_obj->type != ACPI_TYPE_BUFFER) {
|
||||||
return -ENODEV;
|
ret = -ENODEV;
|
||||||
|
goto out_free;
|
||||||
|
}
|
||||||
|
|
||||||
errors = *((u32 *)out_obj->buffer.pointer) & ~(1 << 0);
|
errors = *((u32 *)out_obj->buffer.pointer) & ~(1 << 0);
|
||||||
if (errors)
|
if (errors) {
|
||||||
return -ENODEV;
|
ret = -ENODEV;
|
||||||
|
goto out_free;
|
||||||
|
}
|
||||||
|
|
||||||
supported = *((u32 *)(out_obj->buffer.pointer + 4));
|
supported = *((u32 *)(out_obj->buffer.pointer + 4));
|
||||||
if (!(supported & 0x1))
|
if (!(supported & 0x1)) {
|
||||||
return -ENODEV;
|
ret = -ENODEV;
|
||||||
|
goto out_free;
|
||||||
|
}
|
||||||
|
|
||||||
out_free:
|
out_free:
|
||||||
kfree(output.pointer);
|
kfree(output.pointer);
|
||||||
|
|
|
@ -141,6 +141,7 @@ void mce_amd_feature_init(struct cpuinfo_x86 *c)
|
||||||
address = (low & MASK_BLKPTR_LO) >> 21;
|
address = (low & MASK_BLKPTR_LO) >> 21;
|
||||||
if (!address)
|
if (!address)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
address += MCG_XBLK_ADDR;
|
address += MCG_XBLK_ADDR;
|
||||||
} else
|
} else
|
||||||
++address;
|
++address;
|
||||||
|
@ -148,12 +149,8 @@ void mce_amd_feature_init(struct cpuinfo_x86 *c)
|
||||||
if (rdmsr_safe(address, &low, &high))
|
if (rdmsr_safe(address, &low, &high))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (!(high & MASK_VALID_HI)) {
|
if (!(high & MASK_VALID_HI))
|
||||||
if (block)
|
continue;
|
||||||
continue;
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(high & MASK_CNTP_HI) ||
|
if (!(high & MASK_CNTP_HI) ||
|
||||||
(high & MASK_LOCKED_HI))
|
(high & MASK_LOCKED_HI))
|
||||||
|
|
|
@ -216,7 +216,7 @@ static __cpuinit int thermal_throttle_add_dev(struct sys_device *sys_dev,
|
||||||
err = sysfs_add_file_to_group(&sys_dev->kobj,
|
err = sysfs_add_file_to_group(&sys_dev->kobj,
|
||||||
&attr_core_power_limit_count.attr,
|
&attr_core_power_limit_count.attr,
|
||||||
thermal_attr_group.name);
|
thermal_attr_group.name);
|
||||||
if (cpu_has(c, X86_FEATURE_PTS))
|
if (cpu_has(c, X86_FEATURE_PTS)) {
|
||||||
err = sysfs_add_file_to_group(&sys_dev->kobj,
|
err = sysfs_add_file_to_group(&sys_dev->kobj,
|
||||||
&attr_package_throttle_count.attr,
|
&attr_package_throttle_count.attr,
|
||||||
thermal_attr_group.name);
|
thermal_attr_group.name);
|
||||||
|
@ -224,6 +224,7 @@ static __cpuinit int thermal_throttle_add_dev(struct sys_device *sys_dev,
|
||||||
err = sysfs_add_file_to_group(&sys_dev->kobj,
|
err = sysfs_add_file_to_group(&sys_dev->kobj,
|
||||||
&attr_package_power_limit_count.attr,
|
&attr_package_power_limit_count.attr,
|
||||||
thermal_attr_group.name);
|
thermal_attr_group.name);
|
||||||
|
}
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
|
@ -660,8 +660,12 @@ static int p4_pmu_handle_irq(struct pt_regs *regs)
|
||||||
for (idx = 0; idx < x86_pmu.num_counters; idx++) {
|
for (idx = 0; idx < x86_pmu.num_counters; idx++) {
|
||||||
int overflow;
|
int overflow;
|
||||||
|
|
||||||
if (!test_bit(idx, cpuc->active_mask))
|
if (!test_bit(idx, cpuc->active_mask)) {
|
||||||
|
/* catch in-flight IRQs */
|
||||||
|
if (__test_and_clear_bit(idx, cpuc->running))
|
||||||
|
handled++;
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
event = cpuc->events[idx];
|
event = cpuc->events[idx];
|
||||||
hwc = &event->hw;
|
hwc = &event->hw;
|
||||||
|
|
|
@ -239,11 +239,10 @@ int module_finalize(const Elf_Ehdr *hdr,
|
||||||
apply_paravirt(pseg, pseg + para->sh_size);
|
apply_paravirt(pseg, pseg + para->sh_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
return module_bug_finalize(hdr, sechdrs, me);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void module_arch_cleanup(struct module *mod)
|
void module_arch_cleanup(struct module *mod)
|
||||||
{
|
{
|
||||||
alternatives_smp_module_del(mod);
|
alternatives_smp_module_del(mod);
|
||||||
module_bug_cleanup(mod);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -766,7 +766,6 @@ static void init_vmcb(struct vcpu_svm *svm)
|
||||||
|
|
||||||
control->iopm_base_pa = iopm_base;
|
control->iopm_base_pa = iopm_base;
|
||||||
control->msrpm_base_pa = __pa(svm->msrpm);
|
control->msrpm_base_pa = __pa(svm->msrpm);
|
||||||
control->tsc_offset = 0;
|
|
||||||
control->int_ctl = V_INTR_MASKING_MASK;
|
control->int_ctl = V_INTR_MASKING_MASK;
|
||||||
|
|
||||||
init_seg(&save->es);
|
init_seg(&save->es);
|
||||||
|
@ -902,6 +901,7 @@ static struct kvm_vcpu *svm_create_vcpu(struct kvm *kvm, unsigned int id)
|
||||||
svm->vmcb_pa = page_to_pfn(page) << PAGE_SHIFT;
|
svm->vmcb_pa = page_to_pfn(page) << PAGE_SHIFT;
|
||||||
svm->asid_generation = 0;
|
svm->asid_generation = 0;
|
||||||
init_vmcb(svm);
|
init_vmcb(svm);
|
||||||
|
svm->vmcb->control.tsc_offset = 0-native_read_tsc();
|
||||||
|
|
||||||
err = fx_init(&svm->vcpu);
|
err = fx_init(&svm->vcpu);
|
||||||
if (err)
|
if (err)
|
||||||
|
|
|
@ -420,9 +420,11 @@ int __init acpi_scan_nodes(unsigned long start, unsigned long end)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for_each_node_mask(i, nodes_parsed)
|
for (i = 0; i < num_node_memblks; i++)
|
||||||
e820_register_active_regions(i, nodes[i].start >> PAGE_SHIFT,
|
e820_register_active_regions(memblk_nodeid[i],
|
||||||
nodes[i].end >> PAGE_SHIFT);
|
node_memblk_range[i].start >> PAGE_SHIFT,
|
||||||
|
node_memblk_range[i].end >> PAGE_SHIFT);
|
||||||
|
|
||||||
/* for out of order entries in SRAT */
|
/* for out of order entries in SRAT */
|
||||||
sort_node_map();
|
sort_node_map();
|
||||||
if (!nodes_cover_memory(nodes)) {
|
if (!nodes_cover_memory(nodes)) {
|
||||||
|
|
|
@ -674,6 +674,7 @@ static int __init ppro_init(char **cpu_type)
|
||||||
case 0x0f:
|
case 0x0f:
|
||||||
case 0x16:
|
case 0x16:
|
||||||
case 0x17:
|
case 0x17:
|
||||||
|
case 0x1d:
|
||||||
*cpu_type = "i386/core_2";
|
*cpu_type = "i386/core_2";
|
||||||
break;
|
break;
|
||||||
case 0x1a:
|
case 0x1a:
|
||||||
|
|
|
@ -489,8 +489,9 @@ static void xen_hvm_setup_cpu_clockevents(void)
|
||||||
__init void xen_hvm_init_time_ops(void)
|
__init void xen_hvm_init_time_ops(void)
|
||||||
{
|
{
|
||||||
/* vector callback is needed otherwise we cannot receive interrupts
|
/* vector callback is needed otherwise we cannot receive interrupts
|
||||||
* on cpu > 0 */
|
* on cpu > 0 and at this point we don't know how many cpus are
|
||||||
if (!xen_have_vector_callback && num_present_cpus() > 1)
|
* available */
|
||||||
|
if (!xen_have_vector_callback)
|
||||||
return;
|
return;
|
||||||
if (!xen_feature(XENFEAT_hvm_safe_pvclock)) {
|
if (!xen_feature(XENFEAT_hvm_safe_pvclock)) {
|
||||||
printk(KERN_INFO "Xen doesn't support pvclock on HVM,"
|
printk(KERN_INFO "Xen doesn't support pvclock on HVM,"
|
||||||
|
|
|
@ -938,6 +938,7 @@ int elv_register_queue(struct request_queue *q)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
kobject_uevent(&e->kobj, KOBJ_ADD);
|
kobject_uevent(&e->kobj, KOBJ_ADD);
|
||||||
|
e->registered = 1;
|
||||||
}
|
}
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
@ -947,6 +948,7 @@ static void __elv_unregister_queue(struct elevator_queue *e)
|
||||||
{
|
{
|
||||||
kobject_uevent(&e->kobj, KOBJ_REMOVE);
|
kobject_uevent(&e->kobj, KOBJ_REMOVE);
|
||||||
kobject_del(&e->kobj);
|
kobject_del(&e->kobj);
|
||||||
|
e->registered = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void elv_unregister_queue(struct request_queue *q)
|
void elv_unregister_queue(struct request_queue *q)
|
||||||
|
@ -1042,11 +1044,13 @@ static int elevator_switch(struct request_queue *q, struct elevator_type *new_e)
|
||||||
|
|
||||||
spin_unlock_irq(q->queue_lock);
|
spin_unlock_irq(q->queue_lock);
|
||||||
|
|
||||||
__elv_unregister_queue(old_elevator);
|
if (old_elevator->registered) {
|
||||||
|
__elv_unregister_queue(old_elevator);
|
||||||
|
|
||||||
err = elv_register_queue(q);
|
err = elv_register_queue(q);
|
||||||
if (err)
|
if (err)
|
||||||
goto fail_register;
|
goto fail_register;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* finally exit old elevator and turn off BYPASS.
|
* finally exit old elevator and turn off BYPASS.
|
||||||
|
|
|
@ -105,7 +105,7 @@ config ACPI_EC_DEBUGFS
|
||||||
|
|
||||||
Be aware that using this interface can confuse your Embedded
|
Be aware that using this interface can confuse your Embedded
|
||||||
Controller in a way that a normal reboot is not enough. You then
|
Controller in a way that a normal reboot is not enough. You then
|
||||||
have to power of your system, and remove the laptop battery for
|
have to power off your system, and remove the laptop battery for
|
||||||
some seconds.
|
some seconds.
|
||||||
An Embedded Controller typically is available on laptops and reads
|
An Embedded Controller typically is available on laptops and reads
|
||||||
sensor values like battery state and temperature.
|
sensor values like battery state and temperature.
|
||||||
|
|
|
@ -382,31 +382,32 @@ static void acpi_pad_remove_sysfs(struct acpi_device *device)
|
||||||
device_remove_file(&device->dev, &dev_attr_rrtime);
|
device_remove_file(&device->dev, &dev_attr_rrtime);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Query firmware how many CPUs should be idle */
|
/*
|
||||||
static int acpi_pad_pur(acpi_handle handle, int *num_cpus)
|
* Query firmware how many CPUs should be idle
|
||||||
|
* return -1 on failure
|
||||||
|
*/
|
||||||
|
static int acpi_pad_pur(acpi_handle handle)
|
||||||
{
|
{
|
||||||
struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
|
struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
|
||||||
union acpi_object *package;
|
union acpi_object *package;
|
||||||
int rev, num, ret = -EINVAL;
|
int num = -1;
|
||||||
|
|
||||||
if (ACPI_FAILURE(acpi_evaluate_object(handle, "_PUR", NULL, &buffer)))
|
if (ACPI_FAILURE(acpi_evaluate_object(handle, "_PUR", NULL, &buffer)))
|
||||||
return -EINVAL;
|
return num;
|
||||||
|
|
||||||
if (!buffer.length || !buffer.pointer)
|
if (!buffer.length || !buffer.pointer)
|
||||||
return -EINVAL;
|
return num;
|
||||||
|
|
||||||
package = buffer.pointer;
|
package = buffer.pointer;
|
||||||
if (package->type != ACPI_TYPE_PACKAGE || package->package.count != 2)
|
|
||||||
goto out;
|
if (package->type == ACPI_TYPE_PACKAGE &&
|
||||||
rev = package->package.elements[0].integer.value;
|
package->package.count == 2 &&
|
||||||
num = package->package.elements[1].integer.value;
|
package->package.elements[0].integer.value == 1) /* rev 1 */
|
||||||
if (rev != 1 || num < 0)
|
|
||||||
goto out;
|
num = package->package.elements[1].integer.value;
|
||||||
*num_cpus = num;
|
|
||||||
ret = 0;
|
|
||||||
out:
|
|
||||||
kfree(buffer.pointer);
|
kfree(buffer.pointer);
|
||||||
return ret;
|
return num;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Notify firmware how many CPUs are idle */
|
/* Notify firmware how many CPUs are idle */
|
||||||
|
@ -433,7 +434,8 @@ static void acpi_pad_handle_notify(acpi_handle handle)
|
||||||
uint32_t idle_cpus;
|
uint32_t idle_cpus;
|
||||||
|
|
||||||
mutex_lock(&isolated_cpus_lock);
|
mutex_lock(&isolated_cpus_lock);
|
||||||
if (acpi_pad_pur(handle, &num_cpus)) {
|
num_cpus = acpi_pad_pur(handle);
|
||||||
|
if (num_cpus < 0) {
|
||||||
mutex_unlock(&isolated_cpus_lock);
|
mutex_unlock(&isolated_cpus_lock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -854,6 +854,7 @@ struct acpi_bit_register_info {
|
||||||
ACPI_BITMASK_POWER_BUTTON_STATUS | \
|
ACPI_BITMASK_POWER_BUTTON_STATUS | \
|
||||||
ACPI_BITMASK_SLEEP_BUTTON_STATUS | \
|
ACPI_BITMASK_SLEEP_BUTTON_STATUS | \
|
||||||
ACPI_BITMASK_RT_CLOCK_STATUS | \
|
ACPI_BITMASK_RT_CLOCK_STATUS | \
|
||||||
|
ACPI_BITMASK_PCIEXP_WAKE_DISABLE | \
|
||||||
ACPI_BITMASK_WAKE_STATUS)
|
ACPI_BITMASK_WAKE_STATUS)
|
||||||
|
|
||||||
#define ACPI_BITMASK_TIMER_ENABLE 0x0001
|
#define ACPI_BITMASK_TIMER_ENABLE 0x0001
|
||||||
|
|
|
@ -109,7 +109,7 @@ void acpi_ex_enter_interpreter(void)
|
||||||
*
|
*
|
||||||
* DESCRIPTION: Reacquire the interpreter execution region from within the
|
* DESCRIPTION: Reacquire the interpreter execution region from within the
|
||||||
* interpreter code. Failure to enter the interpreter region is a
|
* interpreter code. Failure to enter the interpreter region is a
|
||||||
* fatal system error. Used in conjuction with
|
* fatal system error. Used in conjunction with
|
||||||
* relinquish_interpreter
|
* relinquish_interpreter
|
||||||
*
|
*
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
|
@ -149,7 +149,7 @@ acpi_rs_move_data(void *destination, void *source, u16 item_count, u8 move_type)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 16-, 32-, and 64-bit cases must use the move macros that perform
|
* 16-, 32-, and 64-bit cases must use the move macros that perform
|
||||||
* endian conversion and/or accomodate hardware that cannot perform
|
* endian conversion and/or accommodate hardware that cannot perform
|
||||||
* misaligned memory transfers
|
* misaligned memory transfers
|
||||||
*/
|
*/
|
||||||
case ACPI_RSC_MOVE16:
|
case ACPI_RSC_MOVE16:
|
||||||
|
|
|
@ -34,6 +34,6 @@ config ACPI_APEI_ERST_DEBUG
|
||||||
depends on ACPI_APEI
|
depends on ACPI_APEI
|
||||||
help
|
help
|
||||||
ERST is a way provided by APEI to save and retrieve hardware
|
ERST is a way provided by APEI to save and retrieve hardware
|
||||||
error infomation to and from a persistent store. Enable this
|
error information to and from a persistent store. Enable this
|
||||||
if you want to debugging and testing the ERST kernel support
|
if you want to debugging and testing the ERST kernel support
|
||||||
and firmware implementation.
|
and firmware implementation.
|
||||||
|
|
|
@ -445,11 +445,15 @@ EXPORT_SYMBOL_GPL(apei_resources_sub);
|
||||||
int apei_resources_request(struct apei_resources *resources,
|
int apei_resources_request(struct apei_resources *resources,
|
||||||
const char *desc)
|
const char *desc)
|
||||||
{
|
{
|
||||||
struct apei_res *res, *res_bak;
|
struct apei_res *res, *res_bak = NULL;
|
||||||
struct resource *r;
|
struct resource *r;
|
||||||
|
int rc;
|
||||||
|
|
||||||
apei_resources_sub(resources, &apei_resources_all);
|
rc = apei_resources_sub(resources, &apei_resources_all);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
rc = -EINVAL;
|
||||||
list_for_each_entry(res, &resources->iomem, list) {
|
list_for_each_entry(res, &resources->iomem, list) {
|
||||||
r = request_mem_region(res->start, res->end - res->start,
|
r = request_mem_region(res->start, res->end - res->start,
|
||||||
desc);
|
desc);
|
||||||
|
@ -475,7 +479,11 @@ int apei_resources_request(struct apei_resources *resources,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
apei_resources_merge(&apei_resources_all, resources);
|
rc = apei_resources_merge(&apei_resources_all, resources);
|
||||||
|
if (rc) {
|
||||||
|
pr_err(APEI_PFX "Fail to merge resources!\n");
|
||||||
|
goto err_unmap_ioport;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
err_unmap_ioport:
|
err_unmap_ioport:
|
||||||
|
@ -491,12 +499,13 @@ err_unmap_iomem:
|
||||||
break;
|
break;
|
||||||
release_mem_region(res->start, res->end - res->start);
|
release_mem_region(res->start, res->end - res->start);
|
||||||
}
|
}
|
||||||
return -EINVAL;
|
return rc;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(apei_resources_request);
|
EXPORT_SYMBOL_GPL(apei_resources_request);
|
||||||
|
|
||||||
void apei_resources_release(struct apei_resources *resources)
|
void apei_resources_release(struct apei_resources *resources)
|
||||||
{
|
{
|
||||||
|
int rc;
|
||||||
struct apei_res *res;
|
struct apei_res *res;
|
||||||
|
|
||||||
list_for_each_entry(res, &resources->iomem, list)
|
list_for_each_entry(res, &resources->iomem, list)
|
||||||
|
@ -504,7 +513,9 @@ void apei_resources_release(struct apei_resources *resources)
|
||||||
list_for_each_entry(res, &resources->ioport, list)
|
list_for_each_entry(res, &resources->ioport, list)
|
||||||
release_region(res->start, res->end - res->start);
|
release_region(res->start, res->end - res->start);
|
||||||
|
|
||||||
apei_resources_sub(&apei_resources_all, resources);
|
rc = apei_resources_sub(&apei_resources_all, resources);
|
||||||
|
if (rc)
|
||||||
|
pr_err(APEI_PFX "Fail to sub resources!\n");
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(apei_resources_release);
|
EXPORT_SYMBOL_GPL(apei_resources_release);
|
||||||
|
|
||||||
|
|
|
@ -426,7 +426,9 @@ DEFINE_SIMPLE_ATTRIBUTE(error_inject_fops, NULL,
|
||||||
|
|
||||||
static int einj_check_table(struct acpi_table_einj *einj_tab)
|
static int einj_check_table(struct acpi_table_einj *einj_tab)
|
||||||
{
|
{
|
||||||
if (einj_tab->header_length != sizeof(struct acpi_table_einj))
|
if ((einj_tab->header_length !=
|
||||||
|
(sizeof(struct acpi_table_einj) - sizeof(einj_tab->header)))
|
||||||
|
&& (einj_tab->header_length != sizeof(struct acpi_table_einj)))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (einj_tab->header.length < sizeof(struct acpi_table_einj))
|
if (einj_tab->header.length < sizeof(struct acpi_table_einj))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* APEI Error Record Serialization Table debug support
|
* APEI Error Record Serialization Table debug support
|
||||||
*
|
*
|
||||||
* ERST is a way provided by APEI to save and retrieve hardware error
|
* ERST is a way provided by APEI to save and retrieve hardware error
|
||||||
* infomation to and from a persistent store. This file provide the
|
* information to and from a persistent store. This file provide the
|
||||||
* debugging/testing support for ERST kernel support and firmware
|
* debugging/testing support for ERST kernel support and firmware
|
||||||
* implementation.
|
* implementation.
|
||||||
*
|
*
|
||||||
|
@ -111,11 +111,13 @@ retry:
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
if (len > erst_dbg_buf_len) {
|
if (len > erst_dbg_buf_len) {
|
||||||
kfree(erst_dbg_buf);
|
void *p;
|
||||||
rc = -ENOMEM;
|
rc = -ENOMEM;
|
||||||
erst_dbg_buf = kmalloc(len, GFP_KERNEL);
|
p = kmalloc(len, GFP_KERNEL);
|
||||||
if (!erst_dbg_buf)
|
if (!p)
|
||||||
goto out;
|
goto out;
|
||||||
|
kfree(erst_dbg_buf);
|
||||||
|
erst_dbg_buf = p;
|
||||||
erst_dbg_buf_len = len;
|
erst_dbg_buf_len = len;
|
||||||
goto retry;
|
goto retry;
|
||||||
}
|
}
|
||||||
|
@ -150,11 +152,13 @@ static ssize_t erst_dbg_write(struct file *filp, const char __user *ubuf,
|
||||||
if (mutex_lock_interruptible(&erst_dbg_mutex))
|
if (mutex_lock_interruptible(&erst_dbg_mutex))
|
||||||
return -EINTR;
|
return -EINTR;
|
||||||
if (usize > erst_dbg_buf_len) {
|
if (usize > erst_dbg_buf_len) {
|
||||||
kfree(erst_dbg_buf);
|
void *p;
|
||||||
rc = -ENOMEM;
|
rc = -ENOMEM;
|
||||||
erst_dbg_buf = kmalloc(usize, GFP_KERNEL);
|
p = kmalloc(usize, GFP_KERNEL);
|
||||||
if (!erst_dbg_buf)
|
if (!p)
|
||||||
goto out;
|
goto out;
|
||||||
|
kfree(erst_dbg_buf);
|
||||||
|
erst_dbg_buf = p;
|
||||||
erst_dbg_buf_len = usize;
|
erst_dbg_buf_len = usize;
|
||||||
}
|
}
|
||||||
rc = copy_from_user(erst_dbg_buf, ubuf, usize);
|
rc = copy_from_user(erst_dbg_buf, ubuf, usize);
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue