Merge branch 'fix/misc' into topic/misc
This commit is contained in:
commit
84cc5c0bd3
@ -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,11 +75,11 @@ 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
|
||||||
@ -177,6 +124,12 @@ 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
|
||||||
@ -233,7 +184,6 @@ NOTE: MTU designates the frame size. It only needs to be set for Jumbo
|
|||||||
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
38
MAINTAINERS
38
MAINTAINERS
@ -969,6 +969,16 @@ L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
|
|||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/mach-s5p*/
|
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>
|
||||||
@ -2535,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
|
||||||
@ -3063,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/
|
||||||
@ -3080,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
|
||||||
@ -5008,6 +5030,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 +6478,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 = -rc7
|
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"
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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 ...) */
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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)) {
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
if (old_elevator->registered) {
|
||||||
__elv_unregister_queue(old_elevator);
|
__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.
|
||||||
|
@ -204,6 +204,23 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* There have a NVIF method in MSI GX723 DSDT need call by Nvidia
|
||||||
|
* driver (e.g. nouveau) when user press brightness hotkey.
|
||||||
|
* Currently, nouveau driver didn't do the job and it causes there
|
||||||
|
* have a infinite while loop in DSDT when user press hotkey.
|
||||||
|
* We add MSI GX723's dmi information to this table for workaround
|
||||||
|
* this issue.
|
||||||
|
* Will remove MSI GX723 from the table after nouveau grows support.
|
||||||
|
*/
|
||||||
|
.callback = dmi_disable_osi_vista,
|
||||||
|
.ident = "MSI GX723",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "Micro-Star International"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "GX723"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
.callback = dmi_disable_osi_vista,
|
.callback = dmi_disable_osi_vista,
|
||||||
.ident = "Sony VGN-NS10J_S",
|
.ident = "Sony VGN-NS10J_S",
|
||||||
.matches = {
|
.matches = {
|
||||||
|
@ -346,4 +346,5 @@ void __init acpi_early_processor_set_pdc(void)
|
|||||||
acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT,
|
acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT,
|
||||||
ACPI_UINT32_MAX,
|
ACPI_UINT32_MAX,
|
||||||
early_init_pdc, NULL, NULL, NULL);
|
early_init_pdc, NULL, NULL, NULL);
|
||||||
|
acpi_get_devices("ACPI0007", early_init_pdc, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
@ -3156,7 +3156,6 @@ static int __devinit ia_init_one(struct pci_dev *pdev,
|
|||||||
{
|
{
|
||||||
struct atm_dev *dev;
|
struct atm_dev *dev;
|
||||||
IADEV *iadev;
|
IADEV *iadev;
|
||||||
unsigned long flags;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
iadev = kzalloc(sizeof(*iadev), GFP_KERNEL);
|
iadev = kzalloc(sizeof(*iadev), GFP_KERNEL);
|
||||||
@ -3188,19 +3187,14 @@ static int __devinit ia_init_one(struct pci_dev *pdev,
|
|||||||
ia_dev[iadev_count] = iadev;
|
ia_dev[iadev_count] = iadev;
|
||||||
_ia_dev[iadev_count] = dev;
|
_ia_dev[iadev_count] = dev;
|
||||||
iadev_count++;
|
iadev_count++;
|
||||||
spin_lock_init(&iadev->misc_lock);
|
|
||||||
/* First fixes first. I don't want to think about this now. */
|
|
||||||
spin_lock_irqsave(&iadev->misc_lock, flags);
|
|
||||||
if (ia_init(dev) || ia_start(dev)) {
|
if (ia_init(dev) || ia_start(dev)) {
|
||||||
IF_INIT(printk("IA register failed!\n");)
|
IF_INIT(printk("IA register failed!\n");)
|
||||||
iadev_count--;
|
iadev_count--;
|
||||||
ia_dev[iadev_count] = NULL;
|
ia_dev[iadev_count] = NULL;
|
||||||
_ia_dev[iadev_count] = NULL;
|
_ia_dev[iadev_count] = NULL;
|
||||||
spin_unlock_irqrestore(&iadev->misc_lock, flags);
|
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto err_out_deregister_dev;
|
goto err_out_deregister_dev;
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&iadev->misc_lock, flags);
|
|
||||||
IF_EVENT(printk("iadev_count = %d\n", iadev_count);)
|
IF_EVENT(printk("iadev_count = %d\n", iadev_count);)
|
||||||
|
|
||||||
iadev->next_board = ia_boards;
|
iadev->next_board = ia_boards;
|
||||||
|
@ -1022,7 +1022,7 @@ typedef struct iadev_t {
|
|||||||
struct dle_q rx_dle_q;
|
struct dle_q rx_dle_q;
|
||||||
struct free_desc_q *rx_free_desc_qhead;
|
struct free_desc_q *rx_free_desc_qhead;
|
||||||
struct sk_buff_head rx_dma_q;
|
struct sk_buff_head rx_dma_q;
|
||||||
spinlock_t rx_lock, misc_lock;
|
spinlock_t rx_lock;
|
||||||
struct atm_vcc **rx_open; /* list of all open VCs */
|
struct atm_vcc **rx_open; /* list of all open VCs */
|
||||||
u16 num_rx_desc, rx_buf_sz, rxing;
|
u16 num_rx_desc, rx_buf_sz, rxing;
|
||||||
u32 rx_pkt_ram, rx_tmp_cnt;
|
u32 rx_pkt_ram, rx_tmp_cnt;
|
||||||
|
@ -444,6 +444,7 @@ static ssize_t console_show(struct device *dev, struct device_attribute *attr,
|
|||||||
struct atm_dev *atmdev = container_of(dev, struct atm_dev, class_dev);
|
struct atm_dev *atmdev = container_of(dev, struct atm_dev, class_dev);
|
||||||
struct solos_card *card = atmdev->dev_data;
|
struct solos_card *card = atmdev->dev_data;
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
|
unsigned int len;
|
||||||
|
|
||||||
spin_lock(&card->cli_queue_lock);
|
spin_lock(&card->cli_queue_lock);
|
||||||
skb = skb_dequeue(&card->cli_queue[SOLOS_CHAN(atmdev)]);
|
skb = skb_dequeue(&card->cli_queue[SOLOS_CHAN(atmdev)]);
|
||||||
@ -451,11 +452,12 @@ static ssize_t console_show(struct device *dev, struct device_attribute *attr,
|
|||||||
if(skb == NULL)
|
if(skb == NULL)
|
||||||
return sprintf(buf, "No data.\n");
|
return sprintf(buf, "No data.\n");
|
||||||
|
|
||||||
memcpy(buf, skb->data, skb->len);
|
len = skb->len;
|
||||||
dev_dbg(&card->dev->dev, "len: %d\n", skb->len);
|
memcpy(buf, skb->data, len);
|
||||||
|
dev_dbg(&card->dev->dev, "len: %d\n", len);
|
||||||
|
|
||||||
kfree_skb(skb);
|
kfree_skb(skb);
|
||||||
return skb->len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int send_command(struct solos_card *card, int dev, const char *buf, size_t size)
|
static int send_command(struct solos_card *card, int dev, const char *buf, size_t size)
|
||||||
|
@ -202,6 +202,7 @@ static int virtblk_get_id(struct gendisk *disk, char *id_str)
|
|||||||
struct virtio_blk *vblk = disk->private_data;
|
struct virtio_blk *vblk = disk->private_data;
|
||||||
struct request *req;
|
struct request *req;
|
||||||
struct bio *bio;
|
struct bio *bio;
|
||||||
|
int err;
|
||||||
|
|
||||||
bio = bio_map_kern(vblk->disk->queue, id_str, VIRTIO_BLK_ID_BYTES,
|
bio = bio_map_kern(vblk->disk->queue, id_str, VIRTIO_BLK_ID_BYTES,
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
@ -215,7 +216,10 @@ static int virtblk_get_id(struct gendisk *disk, char *id_str)
|
|||||||
}
|
}
|
||||||
|
|
||||||
req->cmd_type = REQ_TYPE_SPECIAL;
|
req->cmd_type = REQ_TYPE_SPECIAL;
|
||||||
return blk_execute_rq(vblk->disk->queue, vblk->disk, req, false);
|
err = blk_execute_rq(vblk->disk->queue, vblk->disk, req, false);
|
||||||
|
blk_put_request(req);
|
||||||
|
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int virtblk_locked_ioctl(struct block_device *bdev, fmode_t mode,
|
static int virtblk_locked_ioctl(struct block_device *bdev, fmode_t mode,
|
||||||
|
@ -879,7 +879,7 @@ int __devinit ioat2_dma_probe(struct ioatdma_device *device, int dca)
|
|||||||
dma->device_issue_pending = ioat2_issue_pending;
|
dma->device_issue_pending = ioat2_issue_pending;
|
||||||
dma->device_alloc_chan_resources = ioat2_alloc_chan_resources;
|
dma->device_alloc_chan_resources = ioat2_alloc_chan_resources;
|
||||||
dma->device_free_chan_resources = ioat2_free_chan_resources;
|
dma->device_free_chan_resources = ioat2_free_chan_resources;
|
||||||
dma->device_tx_status = ioat_tx_status;
|
dma->device_tx_status = ioat_dma_tx_status;
|
||||||
|
|
||||||
err = ioat_probe(device);
|
err = ioat_probe(device);
|
||||||
if (err)
|
if (err)
|
||||||
|
@ -2231,6 +2231,9 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
|
|||||||
dev_priv->mchdev_lock = &mchdev_lock;
|
dev_priv->mchdev_lock = &mchdev_lock;
|
||||||
spin_unlock(&mchdev_lock);
|
spin_unlock(&mchdev_lock);
|
||||||
|
|
||||||
|
/* XXX Prevent module unload due to memory corruption bugs. */
|
||||||
|
__module_get(THIS_MODULE);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out_workqueue_free:
|
out_workqueue_free:
|
||||||
|
@ -238,8 +238,8 @@ int intel_fbdev_destroy(struct drm_device *dev,
|
|||||||
|
|
||||||
drm_framebuffer_cleanup(&ifb->base);
|
drm_framebuffer_cleanup(&ifb->base);
|
||||||
if (ifb->obj) {
|
if (ifb->obj) {
|
||||||
drm_gem_object_handle_unreference(ifb->obj);
|
|
||||||
drm_gem_object_unreference(ifb->obj);
|
drm_gem_object_unreference(ifb->obj);
|
||||||
|
ifb->obj = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -352,7 +352,6 @@ nouveau_fbcon_destroy(struct drm_device *dev, struct nouveau_fbdev *nfbdev)
|
|||||||
|
|
||||||
if (nouveau_fb->nvbo) {
|
if (nouveau_fb->nvbo) {
|
||||||
nouveau_bo_unmap(nouveau_fb->nvbo);
|
nouveau_bo_unmap(nouveau_fb->nvbo);
|
||||||
drm_gem_object_handle_unreference_unlocked(nouveau_fb->nvbo->gem);
|
|
||||||
drm_gem_object_unreference_unlocked(nouveau_fb->nvbo->gem);
|
drm_gem_object_unreference_unlocked(nouveau_fb->nvbo->gem);
|
||||||
nouveau_fb->nvbo = NULL;
|
nouveau_fb->nvbo = NULL;
|
||||||
}
|
}
|
||||||
|
@ -79,7 +79,6 @@ nouveau_notifier_takedown_channel(struct nouveau_channel *chan)
|
|||||||
mutex_lock(&dev->struct_mutex);
|
mutex_lock(&dev->struct_mutex);
|
||||||
nouveau_bo_unpin(chan->notifier_bo);
|
nouveau_bo_unpin(chan->notifier_bo);
|
||||||
mutex_unlock(&dev->struct_mutex);
|
mutex_unlock(&dev->struct_mutex);
|
||||||
drm_gem_object_handle_unreference_unlocked(chan->notifier_bo->gem);
|
|
||||||
drm_gem_object_unreference_unlocked(chan->notifier_bo->gem);
|
drm_gem_object_unreference_unlocked(chan->notifier_bo->gem);
|
||||||
drm_mm_takedown(&chan->notifier_heap);
|
drm_mm_takedown(&chan->notifier_heap);
|
||||||
}
|
}
|
||||||
|
@ -1137,7 +1137,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
|
|||||||
|
|
||||||
WREG32(RCU_IND_INDEX, 0x203);
|
WREG32(RCU_IND_INDEX, 0x203);
|
||||||
efuse_straps_3 = RREG32(RCU_IND_DATA);
|
efuse_straps_3 = RREG32(RCU_IND_DATA);
|
||||||
efuse_box_bit_127_124 = (u8)(efuse_straps_3 & 0xF0000000) >> 28;
|
efuse_box_bit_127_124 = (u8)((efuse_straps_3 & 0xF0000000) >> 28);
|
||||||
|
|
||||||
switch(efuse_box_bit_127_124) {
|
switch(efuse_box_bit_127_124) {
|
||||||
case 0x0:
|
case 0x0:
|
||||||
@ -1407,6 +1407,7 @@ int evergreen_mc_init(struct radeon_device *rdev)
|
|||||||
rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024;
|
rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024;
|
||||||
rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024;
|
rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024;
|
||||||
rdev->mc.visible_vram_size = rdev->mc.aper_size;
|
rdev->mc.visible_vram_size = rdev->mc.aper_size;
|
||||||
|
rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
|
||||||
r600_vram_gtt_location(rdev, &rdev->mc);
|
r600_vram_gtt_location(rdev, &rdev->mc);
|
||||||
radeon_update_bandwidth_info(rdev);
|
radeon_update_bandwidth_info(rdev);
|
||||||
|
|
||||||
@ -1520,7 +1521,7 @@ void evergreen_disable_interrupt_state(struct radeon_device *rdev)
|
|||||||
{
|
{
|
||||||
u32 tmp;
|
u32 tmp;
|
||||||
|
|
||||||
WREG32(CP_INT_CNTL, 0);
|
WREG32(CP_INT_CNTL, CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
|
||||||
WREG32(GRBM_INT_CNTL, 0);
|
WREG32(GRBM_INT_CNTL, 0);
|
||||||
WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
|
WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
|
||||||
WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
|
WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
|
||||||
|
@ -1030,6 +1030,7 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size)
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
rdev->cp.ready = true;
|
rdev->cp.ready = true;
|
||||||
|
rdev->mc.active_vram_size = rdev->mc.real_vram_size;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1047,6 +1048,7 @@ void r100_cp_fini(struct radeon_device *rdev)
|
|||||||
void r100_cp_disable(struct radeon_device *rdev)
|
void r100_cp_disable(struct radeon_device *rdev)
|
||||||
{
|
{
|
||||||
/* Disable ring */
|
/* Disable ring */
|
||||||
|
rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
|
||||||
rdev->cp.ready = false;
|
rdev->cp.ready = false;
|
||||||
WREG32(RADEON_CP_CSQ_MODE, 0);
|
WREG32(RADEON_CP_CSQ_MODE, 0);
|
||||||
WREG32(RADEON_CP_CSQ_CNTL, 0);
|
WREG32(RADEON_CP_CSQ_CNTL, 0);
|
||||||
@ -2295,6 +2297,7 @@ void r100_vram_init_sizes(struct radeon_device *rdev)
|
|||||||
/* FIXME we don't use the second aperture yet when we could use it */
|
/* FIXME we don't use the second aperture yet when we could use it */
|
||||||
if (rdev->mc.visible_vram_size > rdev->mc.aper_size)
|
if (rdev->mc.visible_vram_size > rdev->mc.aper_size)
|
||||||
rdev->mc.visible_vram_size = rdev->mc.aper_size;
|
rdev->mc.visible_vram_size = rdev->mc.aper_size;
|
||||||
|
rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
|
||||||
config_aper_size = RREG32(RADEON_CONFIG_APER_SIZE);
|
config_aper_size = RREG32(RADEON_CONFIG_APER_SIZE);
|
||||||
if (rdev->flags & RADEON_IS_IGP) {
|
if (rdev->flags & RADEON_IS_IGP) {
|
||||||
uint32_t tom;
|
uint32_t tom;
|
||||||
|
@ -1248,6 +1248,7 @@ int r600_mc_init(struct radeon_device *rdev)
|
|||||||
rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
|
rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
|
||||||
rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
|
rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
|
||||||
rdev->mc.visible_vram_size = rdev->mc.aper_size;
|
rdev->mc.visible_vram_size = rdev->mc.aper_size;
|
||||||
|
rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
|
||||||
r600_vram_gtt_location(rdev, &rdev->mc);
|
r600_vram_gtt_location(rdev, &rdev->mc);
|
||||||
|
|
||||||
if (rdev->flags & RADEON_IS_IGP) {
|
if (rdev->flags & RADEON_IS_IGP) {
|
||||||
@ -1917,6 +1918,7 @@ void r600_pciep_wreg(struct radeon_device *rdev, u32 reg, u32 v)
|
|||||||
*/
|
*/
|
||||||
void r600_cp_stop(struct radeon_device *rdev)
|
void r600_cp_stop(struct radeon_device *rdev)
|
||||||
{
|
{
|
||||||
|
rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
|
||||||
WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1));
|
WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2910,7 +2912,7 @@ static void r600_disable_interrupt_state(struct radeon_device *rdev)
|
|||||||
{
|
{
|
||||||
u32 tmp;
|
u32 tmp;
|
||||||
|
|
||||||
WREG32(CP_INT_CNTL, 0);
|
WREG32(CP_INT_CNTL, CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
|
||||||
WREG32(GRBM_INT_CNTL, 0);
|
WREG32(GRBM_INT_CNTL, 0);
|
||||||
WREG32(DxMODE_INT_MASK, 0);
|
WREG32(DxMODE_INT_MASK, 0);
|
||||||
if (ASIC_IS_DCE3(rdev)) {
|
if (ASIC_IS_DCE3(rdev)) {
|
||||||
|
@ -532,6 +532,7 @@ int r600_blit_init(struct radeon_device *rdev)
|
|||||||
memcpy(ptr + rdev->r600_blit.ps_offset, r6xx_ps, r6xx_ps_size * 4);
|
memcpy(ptr + rdev->r600_blit.ps_offset, r6xx_ps, r6xx_ps_size * 4);
|
||||||
radeon_bo_kunmap(rdev->r600_blit.shader_obj);
|
radeon_bo_kunmap(rdev->r600_blit.shader_obj);
|
||||||
radeon_bo_unreserve(rdev->r600_blit.shader_obj);
|
radeon_bo_unreserve(rdev->r600_blit.shader_obj);
|
||||||
|
rdev->mc.active_vram_size = rdev->mc.real_vram_size;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -539,6 +540,7 @@ void r600_blit_fini(struct radeon_device *rdev)
|
|||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
|
rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
|
||||||
if (rdev->r600_blit.shader_obj == NULL)
|
if (rdev->r600_blit.shader_obj == NULL)
|
||||||
return;
|
return;
|
||||||
/* If we can't reserve the bo, unref should be enough to destroy
|
/* If we can't reserve the bo, unref should be enough to destroy
|
||||||
|
@ -344,6 +344,7 @@ struct radeon_mc {
|
|||||||
* about vram size near mc fb location */
|
* about vram size near mc fb location */
|
||||||
u64 mc_vram_size;
|
u64 mc_vram_size;
|
||||||
u64 visible_vram_size;
|
u64 visible_vram_size;
|
||||||
|
u64 active_vram_size;
|
||||||
u64 gtt_size;
|
u64 gtt_size;
|
||||||
u64 gtt_start;
|
u64 gtt_start;
|
||||||
u64 gtt_end;
|
u64 gtt_end;
|
||||||
|
@ -1558,39 +1558,39 @@ radeon_atombios_get_tv_info(struct radeon_device *rdev)
|
|||||||
switch (tv_info->ucTV_BootUpDefaultStandard) {
|
switch (tv_info->ucTV_BootUpDefaultStandard) {
|
||||||
case ATOM_TV_NTSC:
|
case ATOM_TV_NTSC:
|
||||||
tv_std = TV_STD_NTSC;
|
tv_std = TV_STD_NTSC;
|
||||||
DRM_INFO("Default TV standard: NTSC\n");
|
DRM_DEBUG_KMS("Default TV standard: NTSC\n");
|
||||||
break;
|
break;
|
||||||
case ATOM_TV_NTSCJ:
|
case ATOM_TV_NTSCJ:
|
||||||
tv_std = TV_STD_NTSC_J;
|
tv_std = TV_STD_NTSC_J;
|
||||||
DRM_INFO("Default TV standard: NTSC-J\n");
|
DRM_DEBUG_KMS("Default TV standard: NTSC-J\n");
|
||||||
break;
|
break;
|
||||||
case ATOM_TV_PAL:
|
case ATOM_TV_PAL:
|
||||||
tv_std = TV_STD_PAL;
|
tv_std = TV_STD_PAL;
|
||||||
DRM_INFO("Default TV standard: PAL\n");
|
DRM_DEBUG_KMS("Default TV standard: PAL\n");
|
||||||
break;
|
break;
|
||||||
case ATOM_TV_PALM:
|
case ATOM_TV_PALM:
|
||||||
tv_std = TV_STD_PAL_M;
|
tv_std = TV_STD_PAL_M;
|
||||||
DRM_INFO("Default TV standard: PAL-M\n");
|
DRM_DEBUG_KMS("Default TV standard: PAL-M\n");
|
||||||
break;
|
break;
|
||||||
case ATOM_TV_PALN:
|
case ATOM_TV_PALN:
|
||||||
tv_std = TV_STD_PAL_N;
|
tv_std = TV_STD_PAL_N;
|
||||||
DRM_INFO("Default TV standard: PAL-N\n");
|
DRM_DEBUG_KMS("Default TV standard: PAL-N\n");
|
||||||
break;
|
break;
|
||||||
case ATOM_TV_PALCN:
|
case ATOM_TV_PALCN:
|
||||||
tv_std = TV_STD_PAL_CN;
|
tv_std = TV_STD_PAL_CN;
|
||||||
DRM_INFO("Default TV standard: PAL-CN\n");
|
DRM_DEBUG_KMS("Default TV standard: PAL-CN\n");
|
||||||
break;
|
break;
|
||||||
case ATOM_TV_PAL60:
|
case ATOM_TV_PAL60:
|
||||||
tv_std = TV_STD_PAL_60;
|
tv_std = TV_STD_PAL_60;
|
||||||
DRM_INFO("Default TV standard: PAL-60\n");
|
DRM_DEBUG_KMS("Default TV standard: PAL-60\n");
|
||||||
break;
|
break;
|
||||||
case ATOM_TV_SECAM:
|
case ATOM_TV_SECAM:
|
||||||
tv_std = TV_STD_SECAM;
|
tv_std = TV_STD_SECAM;
|
||||||
DRM_INFO("Default TV standard: SECAM\n");
|
DRM_DEBUG_KMS("Default TV standard: SECAM\n");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
tv_std = TV_STD_NTSC;
|
tv_std = TV_STD_NTSC;
|
||||||
DRM_INFO("Unknown TV standard; defaulting to NTSC\n");
|
DRM_DEBUG_KMS("Unknown TV standard; defaulting to NTSC\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -913,47 +913,47 @@ radeon_combios_get_tv_info(struct radeon_device *rdev)
|
|||||||
switch (RBIOS8(tv_info + 7) & 0xf) {
|
switch (RBIOS8(tv_info + 7) & 0xf) {
|
||||||
case 1:
|
case 1:
|
||||||
tv_std = TV_STD_NTSC;
|
tv_std = TV_STD_NTSC;
|
||||||
DRM_INFO("Default TV standard: NTSC\n");
|
DRM_DEBUG_KMS("Default TV standard: NTSC\n");
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
tv_std = TV_STD_PAL;
|
tv_std = TV_STD_PAL;
|
||||||
DRM_INFO("Default TV standard: PAL\n");
|
DRM_DEBUG_KMS("Default TV standard: PAL\n");
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
tv_std = TV_STD_PAL_M;
|
tv_std = TV_STD_PAL_M;
|
||||||
DRM_INFO("Default TV standard: PAL-M\n");
|
DRM_DEBUG_KMS("Default TV standard: PAL-M\n");
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
tv_std = TV_STD_PAL_60;
|
tv_std = TV_STD_PAL_60;
|
||||||
DRM_INFO("Default TV standard: PAL-60\n");
|
DRM_DEBUG_KMS("Default TV standard: PAL-60\n");
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
tv_std = TV_STD_NTSC_J;
|
tv_std = TV_STD_NTSC_J;
|
||||||
DRM_INFO("Default TV standard: NTSC-J\n");
|
DRM_DEBUG_KMS("Default TV standard: NTSC-J\n");
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
tv_std = TV_STD_SCART_PAL;
|
tv_std = TV_STD_SCART_PAL;
|
||||||
DRM_INFO("Default TV standard: SCART-PAL\n");
|
DRM_DEBUG_KMS("Default TV standard: SCART-PAL\n");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
tv_std = TV_STD_NTSC;
|
tv_std = TV_STD_NTSC;
|
||||||
DRM_INFO
|
DRM_DEBUG_KMS
|
||||||
("Unknown TV standard; defaulting to NTSC\n");
|
("Unknown TV standard; defaulting to NTSC\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ((RBIOS8(tv_info + 9) >> 2) & 0x3) {
|
switch ((RBIOS8(tv_info + 9) >> 2) & 0x3) {
|
||||||
case 0:
|
case 0:
|
||||||
DRM_INFO("29.498928713 MHz TV ref clk\n");
|
DRM_DEBUG_KMS("29.498928713 MHz TV ref clk\n");
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
DRM_INFO("28.636360000 MHz TV ref clk\n");
|
DRM_DEBUG_KMS("28.636360000 MHz TV ref clk\n");
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
DRM_INFO("14.318180000 MHz TV ref clk\n");
|
DRM_DEBUG_KMS("14.318180000 MHz TV ref clk\n");
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
DRM_INFO("27.000000000 MHz TV ref clk\n");
|
DRM_DEBUG_KMS("27.000000000 MHz TV ref clk\n");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -1324,7 +1324,7 @@ bool radeon_legacy_get_tmds_info_from_combios(struct radeon_encoder *encoder,
|
|||||||
|
|
||||||
if (tmds_info) {
|
if (tmds_info) {
|
||||||
ver = RBIOS8(tmds_info);
|
ver = RBIOS8(tmds_info);
|
||||||
DRM_INFO("DFP table revision: %d\n", ver);
|
DRM_DEBUG_KMS("DFP table revision: %d\n", ver);
|
||||||
if (ver == 3) {
|
if (ver == 3) {
|
||||||
n = RBIOS8(tmds_info + 5) + 1;
|
n = RBIOS8(tmds_info + 5) + 1;
|
||||||
if (n > 4)
|
if (n > 4)
|
||||||
@ -1408,7 +1408,7 @@ bool radeon_legacy_get_ext_tmds_info_from_combios(struct radeon_encoder *encoder
|
|||||||
offset = combios_get_table_offset(dev, COMBIOS_EXT_TMDS_INFO_TABLE);
|
offset = combios_get_table_offset(dev, COMBIOS_EXT_TMDS_INFO_TABLE);
|
||||||
if (offset) {
|
if (offset) {
|
||||||
ver = RBIOS8(offset);
|
ver = RBIOS8(offset);
|
||||||
DRM_INFO("External TMDS Table revision: %d\n", ver);
|
DRM_DEBUG_KMS("External TMDS Table revision: %d\n", ver);
|
||||||
tmds->slave_addr = RBIOS8(offset + 4 + 2);
|
tmds->slave_addr = RBIOS8(offset + 4 + 2);
|
||||||
tmds->slave_addr >>= 1; /* 7 bit addressing */
|
tmds->slave_addr >>= 1; /* 7 bit addressing */
|
||||||
gpio = RBIOS8(offset + 4 + 3);
|
gpio = RBIOS8(offset + 4 + 3);
|
||||||
|
@ -97,7 +97,6 @@ static void radeonfb_destroy_pinned_object(struct drm_gem_object *gobj)
|
|||||||
radeon_bo_unpin(rbo);
|
radeon_bo_unpin(rbo);
|
||||||
radeon_bo_unreserve(rbo);
|
radeon_bo_unreserve(rbo);
|
||||||
}
|
}
|
||||||
drm_gem_object_handle_unreference(gobj);
|
|
||||||
drm_gem_object_unreference_unlocked(gobj);
|
drm_gem_object_unreference_unlocked(gobj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
|
|||||||
u32 c = 0;
|
u32 c = 0;
|
||||||
|
|
||||||
rbo->placement.fpfn = 0;
|
rbo->placement.fpfn = 0;
|
||||||
rbo->placement.lpfn = 0;
|
rbo->placement.lpfn = rbo->rdev->mc.active_vram_size >> PAGE_SHIFT;
|
||||||
rbo->placement.placement = rbo->placements;
|
rbo->placement.placement = rbo->placements;
|
||||||
rbo->placement.busy_placement = rbo->placements;
|
rbo->placement.busy_placement = rbo->placements;
|
||||||
if (domain & RADEON_GEM_DOMAIN_VRAM)
|
if (domain & RADEON_GEM_DOMAIN_VRAM)
|
||||||
|
@ -124,11 +124,8 @@ static inline int radeon_bo_wait(struct radeon_bo *bo, u32 *mem_type,
|
|||||||
int r;
|
int r;
|
||||||
|
|
||||||
r = ttm_bo_reserve(&bo->tbo, true, no_wait, false, 0);
|
r = ttm_bo_reserve(&bo->tbo, true, no_wait, false, 0);
|
||||||
if (unlikely(r != 0)) {
|
if (unlikely(r != 0))
|
||||||
if (r != -ERESTARTSYS)
|
|
||||||
dev_err(bo->rdev->dev, "%p reserve failed for wait\n", bo);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
|
||||||
spin_lock(&bo->tbo.lock);
|
spin_lock(&bo->tbo.lock);
|
||||||
if (mem_type)
|
if (mem_type)
|
||||||
*mem_type = bo->tbo.mem.mem_type;
|
*mem_type = bo->tbo.mem.mem_type;
|
||||||
|
@ -693,6 +693,7 @@ void rs600_mc_init(struct radeon_device *rdev)
|
|||||||
rdev->mc.real_vram_size = RREG32(RADEON_CONFIG_MEMSIZE);
|
rdev->mc.real_vram_size = RREG32(RADEON_CONFIG_MEMSIZE);
|
||||||
rdev->mc.mc_vram_size = rdev->mc.real_vram_size;
|
rdev->mc.mc_vram_size = rdev->mc.real_vram_size;
|
||||||
rdev->mc.visible_vram_size = rdev->mc.aper_size;
|
rdev->mc.visible_vram_size = rdev->mc.aper_size;
|
||||||
|
rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
|
||||||
rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev);
|
rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev);
|
||||||
base = RREG32_MC(R_000004_MC_FB_LOCATION);
|
base = RREG32_MC(R_000004_MC_FB_LOCATION);
|
||||||
base = G_000004_MC_FB_START(base) << 16;
|
base = G_000004_MC_FB_START(base) << 16;
|
||||||
|
@ -157,6 +157,7 @@ void rs690_mc_init(struct radeon_device *rdev)
|
|||||||
rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
|
rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
|
||||||
rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
|
rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
|
||||||
rdev->mc.visible_vram_size = rdev->mc.aper_size;
|
rdev->mc.visible_vram_size = rdev->mc.aper_size;
|
||||||
|
rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
|
||||||
base = RREG32_MC(R_000100_MCCFG_FB_LOCATION);
|
base = RREG32_MC(R_000100_MCCFG_FB_LOCATION);
|
||||||
base = G_000100_MC_FB_START(base) << 16;
|
base = G_000100_MC_FB_START(base) << 16;
|
||||||
rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev);
|
rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev);
|
||||||
|
@ -267,6 +267,7 @@ static void rv770_mc_program(struct radeon_device *rdev)
|
|||||||
*/
|
*/
|
||||||
void r700_cp_stop(struct radeon_device *rdev)
|
void r700_cp_stop(struct radeon_device *rdev)
|
||||||
{
|
{
|
||||||
|
rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
|
||||||
WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
|
WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -992,6 +993,7 @@ int rv770_mc_init(struct radeon_device *rdev)
|
|||||||
rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
|
rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
|
||||||
rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
|
rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
|
||||||
rdev->mc.visible_vram_size = rdev->mc.aper_size;
|
rdev->mc.visible_vram_size = rdev->mc.aper_size;
|
||||||
|
rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
|
||||||
r600_vram_gtt_location(rdev, &rdev->mc);
|
r600_vram_gtt_location(rdev, &rdev->mc);
|
||||||
radeon_update_bandwidth_info(rdev);
|
radeon_update_bandwidth_info(rdev);
|
||||||
|
|
||||||
|
@ -441,6 +441,43 @@ out_err:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call bo::reserved and with the lru lock held.
|
||||||
|
* Will release GPU memory type usage on destruction.
|
||||||
|
* This is the place to put in driver specific hooks.
|
||||||
|
* Will release the bo::reserved lock and the
|
||||||
|
* lru lock on exit.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void ttm_bo_cleanup_memtype_use(struct ttm_buffer_object *bo)
|
||||||
|
{
|
||||||
|
struct ttm_bo_global *glob = bo->glob;
|
||||||
|
|
||||||
|
if (bo->ttm) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Release the lru_lock, since we don't want to have
|
||||||
|
* an atomic requirement on ttm_tt[unbind|destroy].
|
||||||
|
*/
|
||||||
|
|
||||||
|
spin_unlock(&glob->lru_lock);
|
||||||
|
ttm_tt_unbind(bo->ttm);
|
||||||
|
ttm_tt_destroy(bo->ttm);
|
||||||
|
bo->ttm = NULL;
|
||||||
|
spin_lock(&glob->lru_lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bo->mem.mm_node) {
|
||||||
|
drm_mm_put_block(bo->mem.mm_node);
|
||||||
|
bo->mem.mm_node = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
atomic_set(&bo->reserved, 0);
|
||||||
|
wake_up_all(&bo->event_queue);
|
||||||
|
spin_unlock(&glob->lru_lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If bo idle, remove from delayed- and lru lists, and unref.
|
* If bo idle, remove from delayed- and lru lists, and unref.
|
||||||
* If not idle, and already on delayed list, do nothing.
|
* If not idle, and already on delayed list, do nothing.
|
||||||
@ -456,6 +493,7 @@ static int ttm_bo_cleanup_refs(struct ttm_buffer_object *bo, bool remove_all)
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
spin_lock(&bo->lock);
|
spin_lock(&bo->lock);
|
||||||
|
retry:
|
||||||
(void) ttm_bo_wait(bo, false, false, !remove_all);
|
(void) ttm_bo_wait(bo, false, false, !remove_all);
|
||||||
|
|
||||||
if (!bo->sync_obj) {
|
if (!bo->sync_obj) {
|
||||||
@ -464,31 +502,52 @@ static int ttm_bo_cleanup_refs(struct ttm_buffer_object *bo, bool remove_all)
|
|||||||
spin_unlock(&bo->lock);
|
spin_unlock(&bo->lock);
|
||||||
|
|
||||||
spin_lock(&glob->lru_lock);
|
spin_lock(&glob->lru_lock);
|
||||||
put_count = ttm_bo_del_from_lru(bo);
|
ret = ttm_bo_reserve_locked(bo, false, !remove_all, false, 0);
|
||||||
|
|
||||||
ret = ttm_bo_reserve_locked(bo, false, false, false, 0);
|
/**
|
||||||
BUG_ON(ret);
|
* Someone else has the object reserved. Bail and retry.
|
||||||
if (bo->ttm)
|
*/
|
||||||
ttm_tt_unbind(bo->ttm);
|
|
||||||
|
if (unlikely(ret == -EBUSY)) {
|
||||||
|
spin_unlock(&glob->lru_lock);
|
||||||
|
spin_lock(&bo->lock);
|
||||||
|
goto requeue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* We can re-check for sync object without taking
|
||||||
|
* the bo::lock since setting the sync object requires
|
||||||
|
* also bo::reserved. A busy object at this point may
|
||||||
|
* be caused by another thread starting an accelerated
|
||||||
|
* eviction.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (unlikely(bo->sync_obj)) {
|
||||||
|
atomic_set(&bo->reserved, 0);
|
||||||
|
wake_up_all(&bo->event_queue);
|
||||||
|
spin_unlock(&glob->lru_lock);
|
||||||
|
spin_lock(&bo->lock);
|
||||||
|
if (remove_all)
|
||||||
|
goto retry;
|
||||||
|
else
|
||||||
|
goto requeue;
|
||||||
|
}
|
||||||
|
|
||||||
|
put_count = ttm_bo_del_from_lru(bo);
|
||||||
|
|
||||||
if (!list_empty(&bo->ddestroy)) {
|
if (!list_empty(&bo->ddestroy)) {
|
||||||
list_del_init(&bo->ddestroy);
|
list_del_init(&bo->ddestroy);
|
||||||
++put_count;
|
++put_count;
|
||||||
}
|
}
|
||||||
if (bo->mem.mm_node) {
|
|
||||||
drm_mm_put_block(bo->mem.mm_node);
|
|
||||||
bo->mem.mm_node = NULL;
|
|
||||||
}
|
|
||||||
spin_unlock(&glob->lru_lock);
|
|
||||||
|
|
||||||
atomic_set(&bo->reserved, 0);
|
ttm_bo_cleanup_memtype_use(bo);
|
||||||
|
|
||||||
while (put_count--)
|
while (put_count--)
|
||||||
kref_put(&bo->list_kref, ttm_bo_ref_bug);
|
kref_put(&bo->list_kref, ttm_bo_ref_bug);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
requeue:
|
||||||
spin_lock(&glob->lru_lock);
|
spin_lock(&glob->lru_lock);
|
||||||
if (list_empty(&bo->ddestroy)) {
|
if (list_empty(&bo->ddestroy)) {
|
||||||
void *sync_obj = bo->sync_obj;
|
void *sync_obj = bo->sync_obj;
|
||||||
|
@ -677,6 +677,11 @@ static int __devinit cpm_i2c_probe(struct platform_device *ofdev,
|
|||||||
dev_dbg(&ofdev->dev, "hw routines for %s registered.\n",
|
dev_dbg(&ofdev->dev, "hw routines for %s registered.\n",
|
||||||
cpm->adap.name);
|
cpm->adap.name);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* register OF I2C devices
|
||||||
|
*/
|
||||||
|
of_i2c_register_devices(&cpm->adap);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
out_shut:
|
out_shut:
|
||||||
cpm_i2c_shutdown(cpm);
|
cpm_i2c_shutdown(cpm);
|
||||||
|
@ -761,6 +761,9 @@ static int __devinit iic_probe(struct platform_device *ofdev,
|
|||||||
dev_info(&ofdev->dev, "using %s mode\n",
|
dev_info(&ofdev->dev, "using %s mode\n",
|
||||||
dev->fast_mode ? "fast (400 kHz)" : "standard (100 kHz)");
|
dev->fast_mode ? "fast (400 kHz)" : "standard (100 kHz)");
|
||||||
|
|
||||||
|
/* Now register all the child nodes */
|
||||||
|
of_i2c_register_devices(adap);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error_cleanup:
|
error_cleanup:
|
||||||
|
@ -632,6 +632,7 @@ static int __devinit fsl_i2c_probe(struct platform_device *op,
|
|||||||
dev_err(i2c->dev, "failed to add adapter\n");
|
dev_err(i2c->dev, "failed to add adapter\n");
|
||||||
goto fail_add;
|
goto fail_add;
|
||||||
}
|
}
|
||||||
|
of_i2c_register_devices(&i2c->adap);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
|
@ -71,8 +71,8 @@ static int pca_isa_readbyte(void *pd, int reg)
|
|||||||
|
|
||||||
static int pca_isa_waitforcompletion(void *pd)
|
static int pca_isa_waitforcompletion(void *pd)
|
||||||
{
|
{
|
||||||
long ret = ~0;
|
|
||||||
unsigned long timeout;
|
unsigned long timeout;
|
||||||
|
long ret;
|
||||||
|
|
||||||
if (irq > -1) {
|
if (irq > -1) {
|
||||||
ret = wait_event_timeout(pca_wait,
|
ret = wait_event_timeout(pca_wait,
|
||||||
@ -81,11 +81,15 @@ static int pca_isa_waitforcompletion(void *pd)
|
|||||||
} else {
|
} else {
|
||||||
/* Do polling */
|
/* Do polling */
|
||||||
timeout = jiffies + pca_isa_ops.timeout;
|
timeout = jiffies + pca_isa_ops.timeout;
|
||||||
while (((pca_isa_readbyte(pd, I2C_PCA_CON)
|
do {
|
||||||
& I2C_PCA_CON_SI) == 0)
|
ret = time_before(jiffies, timeout);
|
||||||
&& (ret = time_before(jiffies, timeout)))
|
if (pca_isa_readbyte(pd, I2C_PCA_CON)
|
||||||
|
& I2C_PCA_CON_SI)
|
||||||
|
break;
|
||||||
udelay(100);
|
udelay(100);
|
||||||
|
} while (ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret > 0;
|
return ret > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,8 +80,8 @@ static void i2c_pca_pf_writebyte32(void *pd, int reg, int val)
|
|||||||
static int i2c_pca_pf_waitforcompletion(void *pd)
|
static int i2c_pca_pf_waitforcompletion(void *pd)
|
||||||
{
|
{
|
||||||
struct i2c_pca_pf_data *i2c = pd;
|
struct i2c_pca_pf_data *i2c = pd;
|
||||||
long ret = ~0;
|
|
||||||
unsigned long timeout;
|
unsigned long timeout;
|
||||||
|
long ret;
|
||||||
|
|
||||||
if (i2c->irq) {
|
if (i2c->irq) {
|
||||||
ret = wait_event_timeout(i2c->wait,
|
ret = wait_event_timeout(i2c->wait,
|
||||||
@ -90,10 +90,13 @@ static int i2c_pca_pf_waitforcompletion(void *pd)
|
|||||||
} else {
|
} else {
|
||||||
/* Do polling */
|
/* Do polling */
|
||||||
timeout = jiffies + i2c->adap.timeout;
|
timeout = jiffies + i2c->adap.timeout;
|
||||||
while (((i2c->algo_data.read_byte(i2c, I2C_PCA_CON)
|
do {
|
||||||
& I2C_PCA_CON_SI) == 0)
|
ret = time_before(jiffies, timeout);
|
||||||
&& (ret = time_before(jiffies, timeout)))
|
if (i2c->algo_data.read_byte(i2c, I2C_PCA_CON)
|
||||||
|
& I2C_PCA_CON_SI)
|
||||||
|
break;
|
||||||
udelay(100);
|
udelay(100);
|
||||||
|
} while (ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret > 0;
|
return ret > 0;
|
||||||
|
@ -32,7 +32,6 @@
|
|||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/idr.h>
|
#include <linux/idr.h>
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
#include <linux/of_i2c.h>
|
|
||||||
#include <linux/of_device.h>
|
#include <linux/of_device.h>
|
||||||
#include <linux/completion.h>
|
#include <linux/completion.h>
|
||||||
#include <linux/hardirq.h>
|
#include <linux/hardirq.h>
|
||||||
@ -197,11 +196,12 @@ static int i2c_device_pm_suspend(struct device *dev)
|
|||||||
{
|
{
|
||||||
const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
|
const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
|
||||||
|
|
||||||
|
if (pm) {
|
||||||
if (pm_runtime_suspended(dev))
|
if (pm_runtime_suspended(dev))
|
||||||
return 0;
|
return 0;
|
||||||
|
else
|
||||||
if (pm)
|
|
||||||
return pm->suspend ? pm->suspend(dev) : 0;
|
return pm->suspend ? pm->suspend(dev) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
return i2c_legacy_suspend(dev, PMSG_SUSPEND);
|
return i2c_legacy_suspend(dev, PMSG_SUSPEND);
|
||||||
}
|
}
|
||||||
@ -216,12 +216,6 @@ static int i2c_device_pm_resume(struct device *dev)
|
|||||||
else
|
else
|
||||||
ret = i2c_legacy_resume(dev);
|
ret = i2c_legacy_resume(dev);
|
||||||
|
|
||||||
if (!ret) {
|
|
||||||
pm_runtime_disable(dev);
|
|
||||||
pm_runtime_set_active(dev);
|
|
||||||
pm_runtime_enable(dev);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -229,11 +223,12 @@ static int i2c_device_pm_freeze(struct device *dev)
|
|||||||
{
|
{
|
||||||
const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
|
const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
|
||||||
|
|
||||||
|
if (pm) {
|
||||||
if (pm_runtime_suspended(dev))
|
if (pm_runtime_suspended(dev))
|
||||||
return 0;
|
return 0;
|
||||||
|
else
|
||||||
if (pm)
|
|
||||||
return pm->freeze ? pm->freeze(dev) : 0;
|
return pm->freeze ? pm->freeze(dev) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
return i2c_legacy_suspend(dev, PMSG_FREEZE);
|
return i2c_legacy_suspend(dev, PMSG_FREEZE);
|
||||||
}
|
}
|
||||||
@ -242,11 +237,12 @@ static int i2c_device_pm_thaw(struct device *dev)
|
|||||||
{
|
{
|
||||||
const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
|
const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
|
||||||
|
|
||||||
|
if (pm) {
|
||||||
if (pm_runtime_suspended(dev))
|
if (pm_runtime_suspended(dev))
|
||||||
return 0;
|
return 0;
|
||||||
|
else
|
||||||
if (pm)
|
|
||||||
return pm->thaw ? pm->thaw(dev) : 0;
|
return pm->thaw ? pm->thaw(dev) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
return i2c_legacy_resume(dev);
|
return i2c_legacy_resume(dev);
|
||||||
}
|
}
|
||||||
@ -255,11 +251,12 @@ static int i2c_device_pm_poweroff(struct device *dev)
|
|||||||
{
|
{
|
||||||
const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
|
const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
|
||||||
|
|
||||||
|
if (pm) {
|
||||||
if (pm_runtime_suspended(dev))
|
if (pm_runtime_suspended(dev))
|
||||||
return 0;
|
return 0;
|
||||||
|
else
|
||||||
if (pm)
|
|
||||||
return pm->poweroff ? pm->poweroff(dev) : 0;
|
return pm->poweroff ? pm->poweroff(dev) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
return i2c_legacy_suspend(dev, PMSG_HIBERNATE);
|
return i2c_legacy_suspend(dev, PMSG_HIBERNATE);
|
||||||
}
|
}
|
||||||
@ -876,9 +873,6 @@ static int i2c_register_adapter(struct i2c_adapter *adap)
|
|||||||
if (adap->nr < __i2c_first_dynamic_bus_num)
|
if (adap->nr < __i2c_first_dynamic_bus_num)
|
||||||
i2c_scan_static_board_info(adap);
|
i2c_scan_static_board_info(adap);
|
||||||
|
|
||||||
/* Register devices from the device tree */
|
|
||||||
of_i2c_register_devices(adap);
|
|
||||||
|
|
||||||
/* Notify drivers */
|
/* Notify drivers */
|
||||||
mutex_lock(&core_lock);
|
mutex_lock(&core_lock);
|
||||||
bus_for_each_drv(&i2c_bus_type, NULL, adap, __process_new_adapter);
|
bus_for_each_drv(&i2c_bus_type, NULL, adap, __process_new_adapter);
|
||||||
|
@ -157,13 +157,13 @@ static struct cpuidle_state atom_cstates[MWAIT_MAX_NUM_CSTATES] = {
|
|||||||
{ /* MWAIT C5 */ },
|
{ /* MWAIT C5 */ },
|
||||||
{ /* MWAIT C6 */
|
{ /* MWAIT C6 */
|
||||||
.name = "ATM-C6",
|
.name = "ATM-C6",
|
||||||
.desc = "MWAIT 0x40",
|
.desc = "MWAIT 0x52",
|
||||||
.driver_data = (void *) 0x40,
|
.driver_data = (void *) 0x52,
|
||||||
.flags = CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED,
|
.flags = CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED,
|
||||||
.exit_latency = 200,
|
.exit_latency = 140,
|
||||||
.power_usage = 150,
|
.power_usage = 150,
|
||||||
.target_residency = 800,
|
.target_residency = 560,
|
||||||
.enter = NULL }, /* disabled */
|
.enter = &intel_idle },
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -483,6 +483,9 @@ static int joydev_handle_JSIOCSAXMAP(struct joydev *joydev,
|
|||||||
|
|
||||||
memcpy(joydev->abspam, abspam, len);
|
memcpy(joydev->abspam, abspam, len);
|
||||||
|
|
||||||
|
for (i = 0; i < joydev->nabs; i++)
|
||||||
|
joydev->absmap[joydev->abspam[i]] = i;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
kfree(abspam);
|
kfree(abspam);
|
||||||
return retval;
|
return retval;
|
||||||
|
@ -404,6 +404,13 @@ static int uinput_setup_device(struct uinput_device *udev, const char __user *bu
|
|||||||
retval = uinput_validate_absbits(dev);
|
retval = uinput_validate_absbits(dev);
|
||||||
if (retval < 0)
|
if (retval < 0)
|
||||||
goto exit;
|
goto exit;
|
||||||
|
if (test_bit(ABS_MT_SLOT, dev->absbit)) {
|
||||||
|
int nslot = input_abs_get_max(dev, ABS_MT_SLOT) + 1;
|
||||||
|
input_mt_create_slots(dev, nslot);
|
||||||
|
input_set_events_per_packet(dev, 6 * nslot);
|
||||||
|
} else if (test_bit(ABS_MT_POSITION_X, dev->absbit)) {
|
||||||
|
input_set_events_per_packet(dev, 60);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
udev->state = UIST_SETUP_COMPLETE;
|
udev->state = UIST_SETUP_COMPLETE;
|
||||||
|
@ -103,27 +103,26 @@ static void wacom_sys_irq(struct urb *urb)
|
|||||||
static int wacom_open(struct input_dev *dev)
|
static int wacom_open(struct input_dev *dev)
|
||||||
{
|
{
|
||||||
struct wacom *wacom = input_get_drvdata(dev);
|
struct wacom *wacom = input_get_drvdata(dev);
|
||||||
|
int retval = 0;
|
||||||
|
|
||||||
|
if (usb_autopm_get_interface(wacom->intf) < 0)
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
mutex_lock(&wacom->lock);
|
mutex_lock(&wacom->lock);
|
||||||
|
|
||||||
wacom->irq->dev = wacom->usbdev;
|
|
||||||
|
|
||||||
if (usb_autopm_get_interface(wacom->intf) < 0) {
|
|
||||||
mutex_unlock(&wacom->lock);
|
|
||||||
return -EIO;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (usb_submit_urb(wacom->irq, GFP_KERNEL)) {
|
if (usb_submit_urb(wacom->irq, GFP_KERNEL)) {
|
||||||
usb_autopm_put_interface(wacom->intf);
|
retval = -EIO;
|
||||||
mutex_unlock(&wacom->lock);
|
goto out;
|
||||||
return -EIO;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
wacom->open = true;
|
wacom->open = true;
|
||||||
wacom->intf->needs_remote_wakeup = 1;
|
wacom->intf->needs_remote_wakeup = 1;
|
||||||
|
|
||||||
|
out:
|
||||||
mutex_unlock(&wacom->lock);
|
mutex_unlock(&wacom->lock);
|
||||||
return 0;
|
if (retval)
|
||||||
|
usb_autopm_put_interface(wacom->intf);
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wacom_close(struct input_dev *dev)
|
static void wacom_close(struct input_dev *dev)
|
||||||
@ -135,6 +134,8 @@ static void wacom_close(struct input_dev *dev)
|
|||||||
wacom->open = false;
|
wacom->open = false;
|
||||||
wacom->intf->needs_remote_wakeup = 0;
|
wacom->intf->needs_remote_wakeup = 0;
|
||||||
mutex_unlock(&wacom->lock);
|
mutex_unlock(&wacom->lock);
|
||||||
|
|
||||||
|
usb_autopm_put_interface(wacom->intf);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hid_desc,
|
static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hid_desc,
|
||||||
|
@ -442,8 +442,10 @@ static void wacom_intuos_general(struct wacom_wac *wacom)
|
|||||||
/* general pen packet */
|
/* general pen packet */
|
||||||
if ((data[1] & 0xb8) == 0xa0) {
|
if ((data[1] & 0xb8) == 0xa0) {
|
||||||
t = (data[6] << 2) | ((data[7] >> 6) & 3);
|
t = (data[6] << 2) | ((data[7] >> 6) & 3);
|
||||||
if (features->type >= INTUOS4S && features->type <= INTUOS4L)
|
if ((features->type >= INTUOS4S && features->type <= INTUOS4L) ||
|
||||||
|
features->type == WACOM_21UX2) {
|
||||||
t = (t << 1) | (data[1] & 1);
|
t = (t << 1) | (data[1] & 1);
|
||||||
|
}
|
||||||
input_report_abs(input, ABS_PRESSURE, t);
|
input_report_abs(input, ABS_PRESSURE, t);
|
||||||
input_report_abs(input, ABS_TILT_X,
|
input_report_abs(input, ABS_TILT_X,
|
||||||
((data[7] << 1) & 0x7e) | (data[8] >> 7));
|
((data[7] << 1) & 0x7e) | (data[8] >> 7));
|
||||||
|
@ -112,11 +112,19 @@ irqreturn_t interrupt_handler(int dummy, void *card_inst)
|
|||||||
}
|
}
|
||||||
else if(callid>=0x0000 && callid<=0x7FFF)
|
else if(callid>=0x0000 && callid<=0x7FFF)
|
||||||
{
|
{
|
||||||
|
int len;
|
||||||
|
|
||||||
pr_debug("%s: Got Incoming Call\n",
|
pr_debug("%s: Got Incoming Call\n",
|
||||||
sc_adapter[card]->devicename);
|
sc_adapter[card]->devicename);
|
||||||
strcpy(setup.phone,&(rcvmsg.msg_data.byte_array[4]));
|
len = strlcpy(setup.phone, &(rcvmsg.msg_data.byte_array[4]),
|
||||||
strcpy(setup.eazmsn,
|
sizeof(setup.phone));
|
||||||
sc_adapter[card]->channel[rcvmsg.phy_link_no-1].dn);
|
if (len >= sizeof(setup.phone))
|
||||||
|
continue;
|
||||||
|
len = strlcpy(setup.eazmsn,
|
||||||
|
sc_adapter[card]->channel[rcvmsg.phy_link_no - 1].dn,
|
||||||
|
sizeof(setup.eazmsn));
|
||||||
|
if (len >= sizeof(setup.eazmsn))
|
||||||
|
continue;
|
||||||
setup.si1 = 7;
|
setup.si1 = 7;
|
||||||
setup.si2 = 0;
|
setup.si2 = 0;
|
||||||
setup.plan = 0;
|
setup.plan = 0;
|
||||||
@ -176,7 +184,9 @@ irqreturn_t interrupt_handler(int dummy, void *card_inst)
|
|||||||
* Handle a GetMyNumber Rsp
|
* Handle a GetMyNumber Rsp
|
||||||
*/
|
*/
|
||||||
if (IS_CE_MESSAGE(rcvmsg,Call,0,GetMyNumber)){
|
if (IS_CE_MESSAGE(rcvmsg,Call,0,GetMyNumber)){
|
||||||
strcpy(sc_adapter[card]->channel[rcvmsg.phy_link_no-1].dn,rcvmsg.msg_data.byte_array);
|
strlcpy(sc_adapter[card]->channel[rcvmsg.phy_link_no - 1].dn,
|
||||||
|
rcvmsg.msg_data.byte_array,
|
||||||
|
sizeof(rcvmsg.msg_data.byte_array));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1000,7 +1000,8 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start)
|
|||||||
page = bitmap->sb_page;
|
page = bitmap->sb_page;
|
||||||
offset = sizeof(bitmap_super_t);
|
offset = sizeof(bitmap_super_t);
|
||||||
if (!file)
|
if (!file)
|
||||||
read_sb_page(bitmap->mddev,
|
page = read_sb_page(
|
||||||
|
bitmap->mddev,
|
||||||
bitmap->mddev->bitmap_info.offset,
|
bitmap->mddev->bitmap_info.offset,
|
||||||
page,
|
page,
|
||||||
index, count);
|
index, count);
|
||||||
|
@ -1839,7 +1839,9 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i
|
|||||||
|
|
||||||
/* take from bio_init */
|
/* take from bio_init */
|
||||||
bio->bi_next = NULL;
|
bio->bi_next = NULL;
|
||||||
|
bio->bi_flags &= ~(BIO_POOL_MASK-1);
|
||||||
bio->bi_flags |= 1 << BIO_UPTODATE;
|
bio->bi_flags |= 1 << BIO_UPTODATE;
|
||||||
|
bio->bi_comp_cpu = -1;
|
||||||
bio->bi_rw = READ;
|
bio->bi_rw = READ;
|
||||||
bio->bi_vcnt = 0;
|
bio->bi_vcnt = 0;
|
||||||
bio->bi_idx = 0;
|
bio->bi_idx = 0;
|
||||||
@ -1912,7 +1914,7 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i
|
|||||||
!test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery))
|
!test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery))
|
||||||
break;
|
break;
|
||||||
BUG_ON(sync_blocks < (PAGE_SIZE>>9));
|
BUG_ON(sync_blocks < (PAGE_SIZE>>9));
|
||||||
if (len > (sync_blocks<<9))
|
if ((len >> 9) > sync_blocks)
|
||||||
len = sync_blocks<<9;
|
len = sync_blocks<<9;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -319,7 +319,7 @@ static void ir_timer_keyup(unsigned long cookie)
|
|||||||
* a keyup event might follow immediately after the keydown.
|
* a keyup event might follow immediately after the keydown.
|
||||||
*/
|
*/
|
||||||
spin_lock_irqsave(&ir->keylock, flags);
|
spin_lock_irqsave(&ir->keylock, flags);
|
||||||
if (time_is_after_eq_jiffies(ir->keyup_jiffies))
|
if (time_is_before_eq_jiffies(ir->keyup_jiffies))
|
||||||
ir_keyup(ir);
|
ir_keyup(ir);
|
||||||
spin_unlock_irqrestore(&ir->keylock, flags);
|
spin_unlock_irqrestore(&ir->keylock, flags);
|
||||||
}
|
}
|
||||||
@ -510,6 +510,13 @@ int __ir_input_register(struct input_dev *input_dev,
|
|||||||
(ir_dev->props && ir_dev->props->driver_type == RC_DRIVER_IR_RAW) ?
|
(ir_dev->props && ir_dev->props->driver_type == RC_DRIVER_IR_RAW) ?
|
||||||
" in raw mode" : "");
|
" in raw mode" : "");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Default delay of 250ms is too short for some protocols, expecially
|
||||||
|
* since the timeout is currently set to 250ms. Increase it to 500ms,
|
||||||
|
* to avoid wrong repetition of the keycodes.
|
||||||
|
*/
|
||||||
|
input_dev->rep[REP_DELAY] = 500;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out_event:
|
out_event:
|
||||||
|
@ -267,7 +267,7 @@ static int ir_lirc_register(struct input_dev *input_dev)
|
|||||||
features |= LIRC_CAN_SET_SEND_CARRIER;
|
features |= LIRC_CAN_SET_SEND_CARRIER;
|
||||||
|
|
||||||
if (ir_dev->props->s_tx_duty_cycle)
|
if (ir_dev->props->s_tx_duty_cycle)
|
||||||
features |= LIRC_CAN_SET_REC_DUTY_CYCLE;
|
features |= LIRC_CAN_SET_SEND_DUTY_CYCLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ir_dev->props->s_rx_carrier_range)
|
if (ir_dev->props->s_rx_carrier_range)
|
||||||
|
@ -279,9 +279,11 @@ int ir_raw_event_register(struct input_dev *input_dev)
|
|||||||
"rc%u", (unsigned int)ir->devno);
|
"rc%u", (unsigned int)ir->devno);
|
||||||
|
|
||||||
if (IS_ERR(ir->raw->thread)) {
|
if (IS_ERR(ir->raw->thread)) {
|
||||||
|
int ret = PTR_ERR(ir->raw->thread);
|
||||||
|
|
||||||
kfree(ir->raw);
|
kfree(ir->raw);
|
||||||
ir->raw = NULL;
|
ir->raw = NULL;
|
||||||
return PTR_ERR(ir->raw->thread);
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_lock(&ir_raw_handler_lock);
|
mutex_lock(&ir_raw_handler_lock);
|
||||||
|
@ -67,13 +67,14 @@ static ssize_t show_protocols(struct device *d,
|
|||||||
char *tmp = buf;
|
char *tmp = buf;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (ir_dev->props->driver_type == RC_DRIVER_SCANCODE) {
|
if (ir_dev->props && ir_dev->props->driver_type == RC_DRIVER_SCANCODE) {
|
||||||
enabled = ir_dev->rc_tab.ir_type;
|
enabled = ir_dev->rc_tab.ir_type;
|
||||||
allowed = ir_dev->props->allowed_protos;
|
allowed = ir_dev->props->allowed_protos;
|
||||||
} else {
|
} else if (ir_dev->raw) {
|
||||||
enabled = ir_dev->raw->enabled_protocols;
|
enabled = ir_dev->raw->enabled_protocols;
|
||||||
allowed = ir_raw_get_allowed_protocols();
|
allowed = ir_raw_get_allowed_protocols();
|
||||||
}
|
} else
|
||||||
|
return sprintf(tmp, "[builtin]\n");
|
||||||
|
|
||||||
IR_dprintk(1, "allowed - 0x%llx, enabled - 0x%llx\n",
|
IR_dprintk(1, "allowed - 0x%llx, enabled - 0x%llx\n",
|
||||||
(long long)allowed,
|
(long long)allowed,
|
||||||
@ -121,10 +122,14 @@ static ssize_t store_protocols(struct device *d,
|
|||||||
int rc, i, count = 0;
|
int rc, i, count = 0;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
if (ir_dev->props->driver_type == RC_DRIVER_SCANCODE)
|
if (ir_dev->props && ir_dev->props->driver_type == RC_DRIVER_SCANCODE)
|
||||||
type = ir_dev->rc_tab.ir_type;
|
type = ir_dev->rc_tab.ir_type;
|
||||||
else
|
else if (ir_dev->raw)
|
||||||
type = ir_dev->raw->enabled_protocols;
|
type = ir_dev->raw->enabled_protocols;
|
||||||
|
else {
|
||||||
|
IR_dprintk(1, "Protocol switching not supported\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
while ((tmp = strsep((char **) &data, " \n")) != NULL) {
|
while ((tmp = strsep((char **) &data, " \n")) != NULL) {
|
||||||
if (!*tmp)
|
if (!*tmp)
|
||||||
@ -185,7 +190,7 @@ static ssize_t store_protocols(struct device *d,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ir_dev->props->driver_type == RC_DRIVER_SCANCODE) {
|
if (ir_dev->props && ir_dev->props->driver_type == RC_DRIVER_SCANCODE) {
|
||||||
spin_lock_irqsave(&ir_dev->rc_tab.lock, flags);
|
spin_lock_irqsave(&ir_dev->rc_tab.lock, flags);
|
||||||
ir_dev->rc_tab.ir_type = type;
|
ir_dev->rc_tab.ir_type = type;
|
||||||
spin_unlock_irqrestore(&ir_dev->rc_tab.lock, flags);
|
spin_unlock_irqrestore(&ir_dev->rc_tab.lock, flags);
|
||||||
|
@ -19,6 +19,7 @@ static struct ir_scancode rc6_mce[] = {
|
|||||||
|
|
||||||
{ 0x800f0416, KEY_PLAY },
|
{ 0x800f0416, KEY_PLAY },
|
||||||
{ 0x800f0418, KEY_PAUSE },
|
{ 0x800f0418, KEY_PAUSE },
|
||||||
|
{ 0x800f046e, KEY_PLAYPAUSE },
|
||||||
{ 0x800f0419, KEY_STOP },
|
{ 0x800f0419, KEY_STOP },
|
||||||
{ 0x800f0417, KEY_RECORD },
|
{ 0x800f0417, KEY_RECORD },
|
||||||
|
|
||||||
@ -37,6 +38,8 @@ static struct ir_scancode rc6_mce[] = {
|
|||||||
{ 0x800f0411, KEY_VOLUMEDOWN },
|
{ 0x800f0411, KEY_VOLUMEDOWN },
|
||||||
{ 0x800f0412, KEY_CHANNELUP },
|
{ 0x800f0412, KEY_CHANNELUP },
|
||||||
{ 0x800f0413, KEY_CHANNELDOWN },
|
{ 0x800f0413, KEY_CHANNELDOWN },
|
||||||
|
{ 0x800f043a, KEY_BRIGHTNESSUP },
|
||||||
|
{ 0x800f0480, KEY_BRIGHTNESSDOWN },
|
||||||
|
|
||||||
{ 0x800f0401, KEY_NUMERIC_1 },
|
{ 0x800f0401, KEY_NUMERIC_1 },
|
||||||
{ 0x800f0402, KEY_NUMERIC_2 },
|
{ 0x800f0402, KEY_NUMERIC_2 },
|
||||||
|
@ -120,6 +120,10 @@ static struct usb_device_id mceusb_dev_table[] = {
|
|||||||
{ USB_DEVICE(VENDOR_PHILIPS, 0x0613) },
|
{ USB_DEVICE(VENDOR_PHILIPS, 0x0613) },
|
||||||
/* Philips eHome Infrared Transceiver */
|
/* Philips eHome Infrared Transceiver */
|
||||||
{ USB_DEVICE(VENDOR_PHILIPS, 0x0815) },
|
{ USB_DEVICE(VENDOR_PHILIPS, 0x0815) },
|
||||||
|
/* Philips/Spinel plus IR transceiver for ASUS */
|
||||||
|
{ USB_DEVICE(VENDOR_PHILIPS, 0x206c) },
|
||||||
|
/* Philips/Spinel plus IR transceiver for ASUS */
|
||||||
|
{ USB_DEVICE(VENDOR_PHILIPS, 0x2088) },
|
||||||
/* Realtek MCE IR Receiver */
|
/* Realtek MCE IR Receiver */
|
||||||
{ USB_DEVICE(VENDOR_REALTEK, 0x0161) },
|
{ USB_DEVICE(VENDOR_REALTEK, 0x0161) },
|
||||||
/* SMK/Toshiba G83C0004D410 */
|
/* SMK/Toshiba G83C0004D410 */
|
||||||
|
@ -673,9 +673,6 @@ static int dib0700_probe(struct usb_interface *intf,
|
|||||||
else
|
else
|
||||||
dev->props.rc.core.bulk_mode = false;
|
dev->props.rc.core.bulk_mode = false;
|
||||||
|
|
||||||
/* Need a higher delay, to avoid wrong repeat */
|
|
||||||
dev->rc_input_dev->rep[REP_DELAY] = 500;
|
|
||||||
|
|
||||||
dib0700_rc_setup(dev);
|
dib0700_rc_setup(dev);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -940,6 +940,58 @@ static int stk7070p_frontend_attach(struct dvb_usb_adapter *adap)
|
|||||||
return adap->fe == NULL ? -ENODEV : 0;
|
return adap->fe == NULL ? -ENODEV : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* STK7770P */
|
||||||
|
static struct dib7000p_config dib7770p_dib7000p_config = {
|
||||||
|
.output_mpeg2_in_188_bytes = 1,
|
||||||
|
|
||||||
|
.agc_config_count = 1,
|
||||||
|
.agc = &dib7070_agc_config,
|
||||||
|
.bw = &dib7070_bw_config_12_mhz,
|
||||||
|
.tuner_is_baseband = 1,
|
||||||
|
.spur_protect = 1,
|
||||||
|
|
||||||
|
.gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
|
||||||
|
.gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
|
||||||
|
.gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
|
||||||
|
|
||||||
|
.hostbus_diversity = 1,
|
||||||
|
.enable_current_mirror = 1,
|
||||||
|
.disable_sample_and_hold = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int stk7770p_frontend_attach(struct dvb_usb_adapter *adap)
|
||||||
|
{
|
||||||
|
struct usb_device_descriptor *p = &adap->dev->udev->descriptor;
|
||||||
|
if (p->idVendor == cpu_to_le16(USB_VID_PINNACLE) &&
|
||||||
|
p->idProduct == cpu_to_le16(USB_PID_PINNACLE_PCTV72E))
|
||||||
|
dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0);
|
||||||
|
else
|
||||||
|
dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1);
|
||||||
|
msleep(10);
|
||||||
|
dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1);
|
||||||
|
dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1);
|
||||||
|
dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1);
|
||||||
|
dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0);
|
||||||
|
|
||||||
|
dib0700_ctrl_clock(adap->dev, 72, 1);
|
||||||
|
|
||||||
|
msleep(10);
|
||||||
|
dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1);
|
||||||
|
msleep(10);
|
||||||
|
dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
|
||||||
|
|
||||||
|
if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
|
||||||
|
&dib7770p_dib7000p_config) != 0) {
|
||||||
|
err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n",
|
||||||
|
__func__);
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80,
|
||||||
|
&dib7770p_dib7000p_config);
|
||||||
|
return adap->fe == NULL ? -ENODEV : 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* DIB807x generic */
|
/* DIB807x generic */
|
||||||
static struct dibx000_agc_config dib807x_agc_config[2] = {
|
static struct dibx000_agc_config dib807x_agc_config[2] = {
|
||||||
{
|
{
|
||||||
@ -1781,7 +1833,7 @@ struct usb_device_id dib0700_usb_id_table[] = {
|
|||||||
/* 60 */{ USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_XXS_2) },
|
/* 60 */{ USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_XXS_2) },
|
||||||
{ USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK807XPVR) },
|
{ USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK807XPVR) },
|
||||||
{ USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK807XP) },
|
{ USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK807XP) },
|
||||||
{ USB_DEVICE(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD) },
|
{ USB_DEVICE_VER(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD, 0x000, 0x3f00) },
|
||||||
{ USB_DEVICE(USB_VID_EVOLUTEPC, USB_PID_TVWAY_PLUS) },
|
{ USB_DEVICE(USB_VID_EVOLUTEPC, USB_PID_TVWAY_PLUS) },
|
||||||
/* 65 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73ESE) },
|
/* 65 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73ESE) },
|
||||||
{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV282E) },
|
{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV282E) },
|
||||||
@ -2406,7 +2458,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
|
|||||||
.pid_filter_count = 32,
|
.pid_filter_count = 32,
|
||||||
.pid_filter = stk70x0p_pid_filter,
|
.pid_filter = stk70x0p_pid_filter,
|
||||||
.pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
|
.pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
|
||||||
.frontend_attach = stk7070p_frontend_attach,
|
.frontend_attach = stk7770p_frontend_attach,
|
||||||
.tuner_attach = dib7770p_tuner_attach,
|
.tuner_attach = dib7770p_tuner_attach,
|
||||||
|
|
||||||
DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
|
DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
|
||||||
|
@ -483,9 +483,7 @@ static int opera1_xilinx_load_firmware(struct usb_device *dev,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
kfree(p);
|
kfree(p);
|
||||||
if (fw) {
|
|
||||||
release_firmware(fw);
|
release_firmware(fw);
|
||||||
}
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -260,6 +260,9 @@ static void dib7000p_set_adc_state(struct dib7000p_state *state, enum dibx000_ad
|
|||||||
|
|
||||||
// dprintk( "908: %x, 909: %x\n", reg_908, reg_909);
|
// dprintk( "908: %x, 909: %x\n", reg_908, reg_909);
|
||||||
|
|
||||||
|
reg_909 |= (state->cfg.disable_sample_and_hold & 1) << 4;
|
||||||
|
reg_908 |= (state->cfg.enable_current_mirror & 1) << 7;
|
||||||
|
|
||||||
dib7000p_write_word(state, 908, reg_908);
|
dib7000p_write_word(state, 908, reg_908);
|
||||||
dib7000p_write_word(state, 909, reg_909);
|
dib7000p_write_word(state, 909, reg_909);
|
||||||
}
|
}
|
||||||
@ -778,7 +781,10 @@ static void dib7000p_set_channel(struct dib7000p_state *state, struct dvb_fronte
|
|||||||
default:
|
default:
|
||||||
case GUARD_INTERVAL_1_32: value *= 1; break;
|
case GUARD_INTERVAL_1_32: value *= 1; break;
|
||||||
}
|
}
|
||||||
state->div_sync_wait = (value * 3) / 2 + 32; // add 50% SFN margin + compensate for one DVSY-fifo TODO
|
if (state->cfg.diversity_delay == 0)
|
||||||
|
state->div_sync_wait = (value * 3) / 2 + 48; // add 50% SFN margin + compensate for one DVSY-fifo
|
||||||
|
else
|
||||||
|
state->div_sync_wait = (value * 3) / 2 + state->cfg.diversity_delay; // add 50% SFN margin + compensate for one DVSY-fifo
|
||||||
|
|
||||||
/* deactive the possibility of diversity reception if extended interleaver */
|
/* deactive the possibility of diversity reception if extended interleaver */
|
||||||
state->div_force_off = !1 && ch->u.ofdm.transmission_mode != TRANSMISSION_MODE_8K;
|
state->div_force_off = !1 && ch->u.ofdm.transmission_mode != TRANSMISSION_MODE_8K;
|
||||||
|
@ -33,6 +33,11 @@ struct dib7000p_config {
|
|||||||
int (*agc_control) (struct dvb_frontend *, u8 before);
|
int (*agc_control) (struct dvb_frontend *, u8 before);
|
||||||
|
|
||||||
u8 output_mode;
|
u8 output_mode;
|
||||||
|
u8 disable_sample_and_hold : 1;
|
||||||
|
|
||||||
|
u8 enable_current_mirror : 1;
|
||||||
|
u8 diversity_delay;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DEFAULT_DIB7000P_I2C_ADDRESS 18
|
#define DEFAULT_DIB7000P_I2C_ADDRESS 18
|
||||||
|
@ -1098,33 +1098,26 @@ EXPORT_SYMBOL_GPL(smscore_onresponse);
|
|||||||
*
|
*
|
||||||
* @return pointer to descriptor on success, NULL on error.
|
* @return pointer to descriptor on success, NULL on error.
|
||||||
*/
|
*/
|
||||||
struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev)
|
|
||||||
|
struct smscore_buffer_t *get_entry(struct smscore_device_t *coredev)
|
||||||
{
|
{
|
||||||
struct smscore_buffer_t *cb = NULL;
|
struct smscore_buffer_t *cb = NULL;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
DEFINE_WAIT(wait);
|
|
||||||
|
|
||||||
spin_lock_irqsave(&coredev->bufferslock, flags);
|
spin_lock_irqsave(&coredev->bufferslock, flags);
|
||||||
|
if (!list_empty(&coredev->buffers)) {
|
||||||
/* This function must return a valid buffer, since the buffer list is
|
|
||||||
* finite, we check that there is an available buffer, if not, we wait
|
|
||||||
* until such buffer become available.
|
|
||||||
*/
|
|
||||||
|
|
||||||
prepare_to_wait(&coredev->buffer_mng_waitq, &wait, TASK_INTERRUPTIBLE);
|
|
||||||
if (list_empty(&coredev->buffers)) {
|
|
||||||
spin_unlock_irqrestore(&coredev->bufferslock, flags);
|
|
||||||
schedule();
|
|
||||||
spin_lock_irqsave(&coredev->bufferslock, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
finish_wait(&coredev->buffer_mng_waitq, &wait);
|
|
||||||
|
|
||||||
cb = (struct smscore_buffer_t *) coredev->buffers.next;
|
cb = (struct smscore_buffer_t *) coredev->buffers.next;
|
||||||
list_del(&cb->entry);
|
list_del(&cb->entry);
|
||||||
|
}
|
||||||
spin_unlock_irqrestore(&coredev->bufferslock, flags);
|
spin_unlock_irqrestore(&coredev->bufferslock, flags);
|
||||||
|
return cb;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev)
|
||||||
|
{
|
||||||
|
struct smscore_buffer_t *cb = NULL;
|
||||||
|
|
||||||
|
wait_event(coredev->buffer_mng_waitq, (cb = get_entry(coredev)));
|
||||||
|
|
||||||
return cb;
|
return cb;
|
||||||
}
|
}
|
||||||
|
@ -395,7 +395,7 @@ static int __devinit si470x_i2c_probe(struct i2c_client *client,
|
|||||||
radio->registers[POWERCFG] = POWERCFG_ENABLE;
|
radio->registers[POWERCFG] = POWERCFG_ENABLE;
|
||||||
if (si470x_set_register(radio, POWERCFG) < 0) {
|
if (si470x_set_register(radio, POWERCFG) < 0) {
|
||||||
retval = -EIO;
|
retval = -EIO;
|
||||||
goto err_all;
|
goto err_video;
|
||||||
}
|
}
|
||||||
msleep(110);
|
msleep(110);
|
||||||
|
|
||||||
|
@ -11,4 +11,5 @@ EXTRA_CFLAGS += -Idrivers/media/video
|
|||||||
EXTRA_CFLAGS += -Idrivers/media/common/tuners
|
EXTRA_CFLAGS += -Idrivers/media/common/tuners
|
||||||
EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core
|
EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core
|
||||||
EXTRA_CFLAGS += -Idrivers/media/dvb/frontends
|
EXTRA_CFLAGS += -Idrivers/media/dvb/frontends
|
||||||
|
EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-usb
|
||||||
|
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
#include <media/v4l2-chip-ident.h>
|
#include <media/v4l2-chip-ident.h>
|
||||||
|
|
||||||
#include <media/cx25840.h>
|
#include <media/cx25840.h>
|
||||||
|
#include "dvb-usb-ids.h"
|
||||||
#include "xc5000.h"
|
#include "xc5000.h"
|
||||||
|
|
||||||
#include "cx231xx.h"
|
#include "cx231xx.h"
|
||||||
@ -175,6 +176,8 @@ struct usb_device_id cx231xx_id_table[] = {
|
|||||||
.driver_info = CX231XX_BOARD_CNXT_RDE_250},
|
.driver_info = CX231XX_BOARD_CNXT_RDE_250},
|
||||||
{USB_DEVICE(0x0572, 0x58A1),
|
{USB_DEVICE(0x0572, 0x58A1),
|
||||||
.driver_info = CX231XX_BOARD_CNXT_RDU_250},
|
.driver_info = CX231XX_BOARD_CNXT_RDU_250},
|
||||||
|
{USB_DEVICE_VER(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD, 0x4000,0x4fff),
|
||||||
|
.driver_info = CX231XX_BOARD_UNKNOWN},
|
||||||
{},
|
{},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -226,6 +229,7 @@ void cx231xx_pre_card_setup(struct cx231xx *dev)
|
|||||||
dev->board.name, dev->model);
|
dev->board.name, dev->model);
|
||||||
|
|
||||||
/* set the direction for GPIO pins */
|
/* set the direction for GPIO pins */
|
||||||
|
if (dev->board.tuner_gpio) {
|
||||||
cx231xx_set_gpio_direction(dev, dev->board.tuner_gpio->bit, 1);
|
cx231xx_set_gpio_direction(dev, dev->board.tuner_gpio->bit, 1);
|
||||||
cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit, 1);
|
cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit, 1);
|
||||||
cx231xx_set_gpio_direction(dev, dev->board.tuner_sif_gpio, 1);
|
cx231xx_set_gpio_direction(dev, dev->board.tuner_sif_gpio, 1);
|
||||||
@ -234,6 +238,7 @@ void cx231xx_pre_card_setup(struct cx231xx *dev)
|
|||||||
|
|
||||||
/* reset the Tuner */
|
/* reset the Tuner */
|
||||||
cx231xx_gpio_set(dev, dev->board.tuner_gpio);
|
cx231xx_gpio_set(dev, dev->board.tuner_gpio);
|
||||||
|
}
|
||||||
|
|
||||||
/* set the mode to Analog mode initially */
|
/* set the mode to Analog mode initially */
|
||||||
cx231xx_set_mode(dev, CX231XX_ANALOG_MODE);
|
cx231xx_set_mode(dev, CX231XX_ANALOG_MODE);
|
||||||
|
@ -1996,7 +1996,7 @@ static int cx25840_probe(struct i2c_client *client,
|
|||||||
|
|
||||||
state->volume = v4l2_ctrl_new_std(&state->hdl,
|
state->volume = v4l2_ctrl_new_std(&state->hdl,
|
||||||
&cx25840_audio_ctrl_ops, V4L2_CID_AUDIO_VOLUME,
|
&cx25840_audio_ctrl_ops, V4L2_CID_AUDIO_VOLUME,
|
||||||
0, 65335, 65535 / 100, default_volume);
|
0, 65535, 65535 / 100, default_volume);
|
||||||
state->mute = v4l2_ctrl_new_std(&state->hdl,
|
state->mute = v4l2_ctrl_new_std(&state->hdl,
|
||||||
&cx25840_audio_ctrl_ops, V4L2_CID_AUDIO_MUTE,
|
&cx25840_audio_ctrl_ops, V4L2_CID_AUDIO_MUTE,
|
||||||
0, 1, 1, 0);
|
0, 1, 1, 0);
|
||||||
|
@ -17,7 +17,7 @@ config VIDEO_CX88
|
|||||||
|
|
||||||
config VIDEO_CX88_ALSA
|
config VIDEO_CX88_ALSA
|
||||||
tristate "Conexant 2388x DMA audio support"
|
tristate "Conexant 2388x DMA audio support"
|
||||||
depends on VIDEO_CX88 && SND && EXPERIMENTAL
|
depends on VIDEO_CX88 && SND
|
||||||
select SND_PCM
|
select SND_PCM
|
||||||
---help---
|
---help---
|
||||||
This is a video4linux driver for direct (DMA) audio on
|
This is a video4linux driver for direct (DMA) audio on
|
||||||
|
@ -223,6 +223,7 @@ static int alloc_and_submit_int_urb(struct gspca_dev *gspca_dev,
|
|||||||
usb_rcvintpipe(dev, ep->bEndpointAddress),
|
usb_rcvintpipe(dev, ep->bEndpointAddress),
|
||||||
buffer, buffer_len,
|
buffer, buffer_len,
|
||||||
int_irq, (void *)gspca_dev, interval);
|
int_irq, (void *)gspca_dev, interval);
|
||||||
|
urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
||||||
gspca_dev->int_urb = urb;
|
gspca_dev->int_urb = urb;
|
||||||
ret = usb_submit_urb(urb, GFP_KERNEL);
|
ret = usb_submit_urb(urb, GFP_KERNEL);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
@ -2357,8 +2357,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
|
|||||||
(data[33] << 10);
|
(data[33] << 10);
|
||||||
avg_lum >>= 9;
|
avg_lum >>= 9;
|
||||||
atomic_set(&sd->avg_lum, avg_lum);
|
atomic_set(&sd->avg_lum, avg_lum);
|
||||||
gspca_frame_add(gspca_dev, LAST_PACKET,
|
gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
|
||||||
data, len);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (gspca_dev->last_packet_type == LAST_PACKET) {
|
if (gspca_dev->last_packet_type == LAST_PACKET) {
|
||||||
|
@ -466,6 +466,8 @@ static int ivtvfb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long ar
|
|||||||
struct fb_vblank vblank;
|
struct fb_vblank vblank;
|
||||||
u32 trace;
|
u32 trace;
|
||||||
|
|
||||||
|
memset(&vblank, 0, sizeof(struct fb_vblank));
|
||||||
|
|
||||||
vblank.flags = FB_VBLANK_HAVE_COUNT |FB_VBLANK_HAVE_VCOUNT |
|
vblank.flags = FB_VBLANK_HAVE_COUNT |FB_VBLANK_HAVE_VCOUNT |
|
||||||
FB_VBLANK_HAVE_VSYNC;
|
FB_VBLANK_HAVE_VSYNC;
|
||||||
trace = read_reg(IVTV_REG_DEC_LINE_FIELD) >> 16;
|
trace = read_reg(IVTV_REG_DEC_LINE_FIELD) >> 16;
|
||||||
|
@ -239,7 +239,7 @@ static int device_process(struct m2mtest_ctx *ctx,
|
|||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (in_buf->vb.size < out_buf->vb.size) {
|
if (in_buf->vb.size > out_buf->vb.size) {
|
||||||
v4l2_err(&dev->v4l2_dev, "Output buffer is too small\n");
|
v4l2_err(&dev->v4l2_dev, "Output buffer is too small\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
@ -1014,6 +1014,7 @@ static int m2mtest_remove(struct platform_device *pdev)
|
|||||||
v4l2_m2m_release(dev->m2m_dev);
|
v4l2_m2m_release(dev->m2m_dev);
|
||||||
del_timer_sync(&dev->timer);
|
del_timer_sync(&dev->timer);
|
||||||
video_unregister_device(dev->vfd);
|
video_unregister_device(dev->vfd);
|
||||||
|
video_device_release(dev->vfd);
|
||||||
v4l2_device_unregister(&dev->v4l2_dev);
|
v4l2_device_unregister(&dev->v4l2_dev);
|
||||||
kfree(dev);
|
kfree(dev);
|
||||||
|
|
||||||
|
@ -447,6 +447,9 @@ static int mt9m111_s_crop(struct v4l2_subdev *sd, struct v4l2_crop *a)
|
|||||||
dev_dbg(&client->dev, "%s left=%d, top=%d, width=%d, height=%d\n",
|
dev_dbg(&client->dev, "%s left=%d, top=%d, width=%d, height=%d\n",
|
||||||
__func__, rect.left, rect.top, rect.width, rect.height);
|
__func__, rect.left, rect.top, rect.width, rect.height);
|
||||||
|
|
||||||
|
if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
ret = mt9m111_make_rect(client, &rect);
|
ret = mt9m111_make_rect(client, &rect);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
mt9m111->rect = rect;
|
mt9m111->rect = rect;
|
||||||
@ -466,12 +469,14 @@ static int mt9m111_g_crop(struct v4l2_subdev *sd, struct v4l2_crop *a)
|
|||||||
|
|
||||||
static int mt9m111_cropcap(struct v4l2_subdev *sd, struct v4l2_cropcap *a)
|
static int mt9m111_cropcap(struct v4l2_subdev *sd, struct v4l2_cropcap *a)
|
||||||
{
|
{
|
||||||
|
if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
a->bounds.left = MT9M111_MIN_DARK_COLS;
|
a->bounds.left = MT9M111_MIN_DARK_COLS;
|
||||||
a->bounds.top = MT9M111_MIN_DARK_ROWS;
|
a->bounds.top = MT9M111_MIN_DARK_ROWS;
|
||||||
a->bounds.width = MT9M111_MAX_WIDTH;
|
a->bounds.width = MT9M111_MAX_WIDTH;
|
||||||
a->bounds.height = MT9M111_MAX_HEIGHT;
|
a->bounds.height = MT9M111_MAX_HEIGHT;
|
||||||
a->defrect = a->bounds;
|
a->defrect = a->bounds;
|
||||||
a->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
|
||||||
a->pixelaspect.numerator = 1;
|
a->pixelaspect.numerator = 1;
|
||||||
a->pixelaspect.denominator = 1;
|
a->pixelaspect.denominator = 1;
|
||||||
|
|
||||||
@ -487,6 +492,7 @@ static int mt9m111_g_fmt(struct v4l2_subdev *sd,
|
|||||||
mf->width = mt9m111->rect.width;
|
mf->width = mt9m111->rect.width;
|
||||||
mf->height = mt9m111->rect.height;
|
mf->height = mt9m111->rect.height;
|
||||||
mf->code = mt9m111->fmt->code;
|
mf->code = mt9m111->fmt->code;
|
||||||
|
mf->colorspace = mt9m111->fmt->colorspace;
|
||||||
mf->field = V4L2_FIELD_NONE;
|
mf->field = V4L2_FIELD_NONE;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -402,9 +402,6 @@ static int mt9v022_s_fmt(struct v4l2_subdev *sd,
|
|||||||
if (mt9v022->model != V4L2_IDENT_MT9V022IX7ATC)
|
if (mt9v022->model != V4L2_IDENT_MT9V022IX7ATC)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
break;
|
break;
|
||||||
case 0:
|
|
||||||
/* No format change, only geometry */
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
@ -378,6 +378,9 @@ static void mx25_camera_frame_done(struct mx2_camera_dev *pcdev, int fb,
|
|||||||
|
|
||||||
spin_lock_irqsave(&pcdev->lock, flags);
|
spin_lock_irqsave(&pcdev->lock, flags);
|
||||||
|
|
||||||
|
if (*fb_active == NULL)
|
||||||
|
goto out;
|
||||||
|
|
||||||
vb = &(*fb_active)->vb;
|
vb = &(*fb_active)->vb;
|
||||||
dev_dbg(pcdev->dev, "%s (vb=0x%p) 0x%08lx %d\n", __func__,
|
dev_dbg(pcdev->dev, "%s (vb=0x%p) 0x%08lx %d\n", __func__,
|
||||||
vb, vb->baddr, vb->bsize);
|
vb, vb->baddr, vb->bsize);
|
||||||
@ -402,6 +405,7 @@ static void mx25_camera_frame_done(struct mx2_camera_dev *pcdev, int fb,
|
|||||||
|
|
||||||
*fb_active = buf;
|
*fb_active = buf;
|
||||||
|
|
||||||
|
out:
|
||||||
spin_unlock_irqrestore(&pcdev->lock, flags);
|
spin_unlock_irqrestore(&pcdev->lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -513,7 +513,7 @@ int pvr2_ctrl_sym_to_value(struct pvr2_ctrl *cptr,
|
|||||||
if (ret >= 0) {
|
if (ret >= 0) {
|
||||||
ret = pvr2_ctrl_range_check(cptr,*valptr);
|
ret = pvr2_ctrl_range_check(cptr,*valptr);
|
||||||
}
|
}
|
||||||
if (maskptr) *maskptr = ~0;
|
*maskptr = ~0;
|
||||||
} else if (cptr->info->type == pvr2_ctl_bool) {
|
} else if (cptr->info->type == pvr2_ctl_bool) {
|
||||||
ret = parse_token(ptr,len,valptr,boolNames,
|
ret = parse_token(ptr,len,valptr,boolNames,
|
||||||
ARRAY_SIZE(boolNames));
|
ARRAY_SIZE(boolNames));
|
||||||
@ -522,7 +522,7 @@ int pvr2_ctrl_sym_to_value(struct pvr2_ctrl *cptr,
|
|||||||
} else if (ret == 0) {
|
} else if (ret == 0) {
|
||||||
*valptr = (*valptr & 1) ? !0 : 0;
|
*valptr = (*valptr & 1) ? !0 : 0;
|
||||||
}
|
}
|
||||||
if (maskptr) *maskptr = 1;
|
*maskptr = 1;
|
||||||
} else if (cptr->info->type == pvr2_ctl_enum) {
|
} else if (cptr->info->type == pvr2_ctl_enum) {
|
||||||
ret = parse_token(
|
ret = parse_token(
|
||||||
ptr,len,valptr,
|
ptr,len,valptr,
|
||||||
@ -531,7 +531,7 @@ int pvr2_ctrl_sym_to_value(struct pvr2_ctrl *cptr,
|
|||||||
if (ret >= 0) {
|
if (ret >= 0) {
|
||||||
ret = pvr2_ctrl_range_check(cptr,*valptr);
|
ret = pvr2_ctrl_range_check(cptr,*valptr);
|
||||||
}
|
}
|
||||||
if (maskptr) *maskptr = ~0;
|
*maskptr = ~0;
|
||||||
} else if (cptr->info->type == pvr2_ctl_bitmask) {
|
} else if (cptr->info->type == pvr2_ctl_bitmask) {
|
||||||
ret = parse_tlist(
|
ret = parse_tlist(
|
||||||
ptr,len,maskptr,valptr,
|
ptr,len,maskptr,valptr,
|
||||||
|
@ -393,6 +393,37 @@ static void fimc_set_yuv_order(struct fimc_ctx *ctx)
|
|||||||
dbg("ctx->out_order_1p= %d", ctx->out_order_1p);
|
dbg("ctx->out_order_1p= %d", ctx->out_order_1p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void fimc_prepare_dma_offset(struct fimc_ctx *ctx, struct fimc_frame *f)
|
||||||
|
{
|
||||||
|
struct samsung_fimc_variant *variant = ctx->fimc_dev->variant;
|
||||||
|
|
||||||
|
f->dma_offset.y_h = f->offs_h;
|
||||||
|
if (!variant->pix_hoff)
|
||||||
|
f->dma_offset.y_h *= (f->fmt->depth >> 3);
|
||||||
|
|
||||||
|
f->dma_offset.y_v = f->offs_v;
|
||||||
|
|
||||||
|
f->dma_offset.cb_h = f->offs_h;
|
||||||
|
f->dma_offset.cb_v = f->offs_v;
|
||||||
|
|
||||||
|
f->dma_offset.cr_h = f->offs_h;
|
||||||
|
f->dma_offset.cr_v = f->offs_v;
|
||||||
|
|
||||||
|
if (!variant->pix_hoff) {
|
||||||
|
if (f->fmt->planes_cnt == 3) {
|
||||||
|
f->dma_offset.cb_h >>= 1;
|
||||||
|
f->dma_offset.cr_h >>= 1;
|
||||||
|
}
|
||||||
|
if (f->fmt->color == S5P_FIMC_YCBCR420) {
|
||||||
|
f->dma_offset.cb_v >>= 1;
|
||||||
|
f->dma_offset.cr_v >>= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dbg("in_offset: color= %d, y_h= %d, y_v= %d",
|
||||||
|
f->fmt->color, f->dma_offset.y_h, f->dma_offset.y_v);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fimc_prepare_config - check dimensions, operation and color mode
|
* fimc_prepare_config - check dimensions, operation and color mode
|
||||||
* and pre-calculate offset and the scaling coefficients.
|
* and pre-calculate offset and the scaling coefficients.
|
||||||
@ -406,7 +437,6 @@ static int fimc_prepare_config(struct fimc_ctx *ctx, u32 flags)
|
|||||||
{
|
{
|
||||||
struct fimc_frame *s_frame, *d_frame;
|
struct fimc_frame *s_frame, *d_frame;
|
||||||
struct fimc_vid_buffer *buf = NULL;
|
struct fimc_vid_buffer *buf = NULL;
|
||||||
struct samsung_fimc_variant *variant = ctx->fimc_dev->variant;
|
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
s_frame = &ctx->s_frame;
|
s_frame = &ctx->s_frame;
|
||||||
@ -419,61 +449,16 @@ static int fimc_prepare_config(struct fimc_ctx *ctx, u32 flags)
|
|||||||
swap(d_frame->width, d_frame->height);
|
swap(d_frame->width, d_frame->height);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Prepare the output offset ratios for scaler. */
|
/* Prepare the DMA offset ratios for scaler. */
|
||||||
d_frame->dma_offset.y_h = d_frame->offs_h;
|
fimc_prepare_dma_offset(ctx, &ctx->s_frame);
|
||||||
if (!variant->pix_hoff)
|
fimc_prepare_dma_offset(ctx, &ctx->d_frame);
|
||||||
d_frame->dma_offset.y_h *= (d_frame->fmt->depth >> 3);
|
|
||||||
|
|
||||||
d_frame->dma_offset.y_v = d_frame->offs_v;
|
|
||||||
|
|
||||||
d_frame->dma_offset.cb_h = d_frame->offs_h;
|
|
||||||
d_frame->dma_offset.cb_v = d_frame->offs_v;
|
|
||||||
|
|
||||||
d_frame->dma_offset.cr_h = d_frame->offs_h;
|
|
||||||
d_frame->dma_offset.cr_v = d_frame->offs_v;
|
|
||||||
|
|
||||||
if (!variant->pix_hoff && d_frame->fmt->planes_cnt == 3) {
|
|
||||||
d_frame->dma_offset.cb_h >>= 1;
|
|
||||||
d_frame->dma_offset.cb_v >>= 1;
|
|
||||||
d_frame->dma_offset.cr_h >>= 1;
|
|
||||||
d_frame->dma_offset.cr_v >>= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
dbg("out offset: color= %d, y_h= %d, y_v= %d",
|
|
||||||
d_frame->fmt->color,
|
|
||||||
d_frame->dma_offset.y_h, d_frame->dma_offset.y_v);
|
|
||||||
|
|
||||||
/* Prepare the input offset ratios for scaler. */
|
|
||||||
s_frame->dma_offset.y_h = s_frame->offs_h;
|
|
||||||
if (!variant->pix_hoff)
|
|
||||||
s_frame->dma_offset.y_h *= (s_frame->fmt->depth >> 3);
|
|
||||||
s_frame->dma_offset.y_v = s_frame->offs_v;
|
|
||||||
|
|
||||||
s_frame->dma_offset.cb_h = s_frame->offs_h;
|
|
||||||
s_frame->dma_offset.cb_v = s_frame->offs_v;
|
|
||||||
|
|
||||||
s_frame->dma_offset.cr_h = s_frame->offs_h;
|
|
||||||
s_frame->dma_offset.cr_v = s_frame->offs_v;
|
|
||||||
|
|
||||||
if (!variant->pix_hoff && s_frame->fmt->planes_cnt == 3) {
|
|
||||||
s_frame->dma_offset.cb_h >>= 1;
|
|
||||||
s_frame->dma_offset.cb_v >>= 1;
|
|
||||||
s_frame->dma_offset.cr_h >>= 1;
|
|
||||||
s_frame->dma_offset.cr_v >>= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
dbg("in offset: color= %d, y_h= %d, y_v= %d",
|
|
||||||
s_frame->fmt->color, s_frame->dma_offset.y_h,
|
|
||||||
s_frame->dma_offset.y_v);
|
|
||||||
|
|
||||||
fimc_set_yuv_order(ctx);
|
|
||||||
|
|
||||||
/* Check against the scaler ratio. */
|
|
||||||
if (s_frame->height > (SCALER_MAX_VRATIO * d_frame->height) ||
|
if (s_frame->height > (SCALER_MAX_VRATIO * d_frame->height) ||
|
||||||
s_frame->width > (SCALER_MAX_HRATIO * d_frame->width)) {
|
s_frame->width > (SCALER_MAX_HRATIO * d_frame->width)) {
|
||||||
err("out of scaler range");
|
err("out of scaler range");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
fimc_set_yuv_order(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Input DMA mode is not allowed when the scaler is disabled. */
|
/* Input DMA mode is not allowed when the scaler is disabled. */
|
||||||
@ -822,7 +807,8 @@ static int fimc_m2m_s_fmt(struct file *file, void *priv, struct v4l2_format *f)
|
|||||||
} else {
|
} else {
|
||||||
v4l2_err(&ctx->fimc_dev->m2m.v4l2_dev,
|
v4l2_err(&ctx->fimc_dev->m2m.v4l2_dev,
|
||||||
"Wrong buffer/video queue type (%d)\n", f->type);
|
"Wrong buffer/video queue type (%d)\n", f->type);
|
||||||
return -EINVAL;
|
ret = -EINVAL;
|
||||||
|
goto s_fmt_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
pix = &f->fmt.pix;
|
pix = &f->fmt.pix;
|
||||||
@ -1414,8 +1400,10 @@ static int fimc_probe(struct platform_device *pdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
fimc->work_queue = create_workqueue(dev_name(&fimc->pdev->dev));
|
fimc->work_queue = create_workqueue(dev_name(&fimc->pdev->dev));
|
||||||
if (!fimc->work_queue)
|
if (!fimc->work_queue) {
|
||||||
|
ret = -ENOMEM;
|
||||||
goto err_irq;
|
goto err_irq;
|
||||||
|
}
|
||||||
|
|
||||||
ret = fimc_register_m2m_device(fimc);
|
ret = fimc_register_m2m_device(fimc);
|
||||||
if (ret)
|
if (ret)
|
||||||
@ -1492,6 +1480,7 @@ static struct samsung_fimc_variant fimc2_variant_s5p = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct samsung_fimc_variant fimc01_variant_s5pv210 = {
|
static struct samsung_fimc_variant fimc01_variant_s5pv210 = {
|
||||||
|
.pix_hoff = 1,
|
||||||
.has_inp_rot = 1,
|
.has_inp_rot = 1,
|
||||||
.has_out_rot = 1,
|
.has_out_rot = 1,
|
||||||
.min_inp_pixsize = 16,
|
.min_inp_pixsize = 16,
|
||||||
@ -1506,6 +1495,7 @@ static struct samsung_fimc_variant fimc01_variant_s5pv210 = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct samsung_fimc_variant fimc2_variant_s5pv210 = {
|
static struct samsung_fimc_variant fimc2_variant_s5pv210 = {
|
||||||
|
.pix_hoff = 1,
|
||||||
.min_inp_pixsize = 16,
|
.min_inp_pixsize = 16,
|
||||||
.min_out_pixsize = 32,
|
.min_out_pixsize = 32,
|
||||||
|
|
||||||
|
@ -4324,12 +4324,12 @@ struct saa7134_board saa7134_boards[] = {
|
|||||||
[SAA7134_BOARD_BEHOLD_COLUMBUS_TVFM] = {
|
[SAA7134_BOARD_BEHOLD_COLUMBUS_TVFM] = {
|
||||||
/* Beholder Intl. Ltd. 2008 */
|
/* Beholder Intl. Ltd. 2008 */
|
||||||
/* Dmitry Belimov <d.belimov@gmail.com> */
|
/* Dmitry Belimov <d.belimov@gmail.com> */
|
||||||
.name = "Beholder BeholdTV Columbus TVFM",
|
.name = "Beholder BeholdTV Columbus TV/FM",
|
||||||
.audio_clock = 0x00187de7,
|
.audio_clock = 0x00187de7,
|
||||||
.tuner_type = TUNER_ALPS_TSBE5_PAL,
|
.tuner_type = TUNER_ALPS_TSBE5_PAL,
|
||||||
.radio_type = UNSET,
|
.radio_type = TUNER_TEA5767,
|
||||||
.tuner_addr = ADDR_UNSET,
|
.tuner_addr = 0xc2 >> 1,
|
||||||
.radio_addr = ADDR_UNSET,
|
.radio_addr = 0xc0 >> 1,
|
||||||
.tda9887_conf = TDA9887_PRESENT,
|
.tda9887_conf = TDA9887_PRESENT,
|
||||||
.gpiomask = 0x000A8004,
|
.gpiomask = 0x000A8004,
|
||||||
.inputs = {{
|
.inputs = {{
|
||||||
|
@ -136,10 +136,11 @@ ret:
|
|||||||
int saa7164_buffer_dealloc(struct saa7164_tsport *port,
|
int saa7164_buffer_dealloc(struct saa7164_tsport *port,
|
||||||
struct saa7164_buffer *buf)
|
struct saa7164_buffer *buf)
|
||||||
{
|
{
|
||||||
struct saa7164_dev *dev = port->dev;
|
struct saa7164_dev *dev;
|
||||||
|
|
||||||
if ((buf == 0) || (port == 0))
|
if (!buf || !port)
|
||||||
return SAA_ERR_BAD_PARAMETER;
|
return SAA_ERR_BAD_PARAMETER;
|
||||||
|
dev = port->dev;
|
||||||
|
|
||||||
dprintk(DBGLVL_BUF, "%s() deallocating buffer @ 0x%p\n", __func__, buf);
|
dprintk(DBGLVL_BUF, "%s() deallocating buffer @ 0x%p\n", __func__, buf);
|
||||||
|
|
||||||
|
@ -486,6 +486,12 @@ static int uvc_parse_format(struct uvc_device *dev,
|
|||||||
max(frame->dwFrameInterval[0],
|
max(frame->dwFrameInterval[0],
|
||||||
frame->dwDefaultFrameInterval));
|
frame->dwDefaultFrameInterval));
|
||||||
|
|
||||||
|
if (dev->quirks & UVC_QUIRK_RESTRICT_FRAME_RATE) {
|
||||||
|
frame->bFrameIntervalType = 1;
|
||||||
|
frame->dwFrameInterval[0] =
|
||||||
|
frame->dwDefaultFrameInterval;
|
||||||
|
}
|
||||||
|
|
||||||
uvc_trace(UVC_TRACE_DESCR, "- %ux%u (%u.%u fps)\n",
|
uvc_trace(UVC_TRACE_DESCR, "- %ux%u (%u.%u fps)\n",
|
||||||
frame->wWidth, frame->wHeight,
|
frame->wWidth, frame->wHeight,
|
||||||
10000000/frame->dwDefaultFrameInterval,
|
10000000/frame->dwDefaultFrameInterval,
|
||||||
@ -2026,6 +2032,15 @@ static struct usb_device_id uvc_ids[] = {
|
|||||||
.bInterfaceClass = USB_CLASS_VENDOR_SPEC,
|
.bInterfaceClass = USB_CLASS_VENDOR_SPEC,
|
||||||
.bInterfaceSubClass = 1,
|
.bInterfaceSubClass = 1,
|
||||||
.bInterfaceProtocol = 0 },
|
.bInterfaceProtocol = 0 },
|
||||||
|
/* Chicony CNF7129 (Asus EEE 100HE) */
|
||||||
|
{ .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
||||||
|
| USB_DEVICE_ID_MATCH_INT_INFO,
|
||||||
|
.idVendor = 0x04f2,
|
||||||
|
.idProduct = 0xb071,
|
||||||
|
.bInterfaceClass = USB_CLASS_VIDEO,
|
||||||
|
.bInterfaceSubClass = 1,
|
||||||
|
.bInterfaceProtocol = 0,
|
||||||
|
.driver_info = UVC_QUIRK_RESTRICT_FRAME_RATE },
|
||||||
/* Alcor Micro AU3820 (Future Boy PC USB Webcam) */
|
/* Alcor Micro AU3820 (Future Boy PC USB Webcam) */
|
||||||
{ .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
{ .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
||||||
| USB_DEVICE_ID_MATCH_INT_INFO,
|
| USB_DEVICE_ID_MATCH_INT_INFO,
|
||||||
@ -2091,6 +2106,15 @@ static struct usb_device_id uvc_ids[] = {
|
|||||||
.bInterfaceProtocol = 0,
|
.bInterfaceProtocol = 0,
|
||||||
.driver_info = UVC_QUIRK_PROBE_MINMAX
|
.driver_info = UVC_QUIRK_PROBE_MINMAX
|
||||||
| UVC_QUIRK_PROBE_DEF },
|
| UVC_QUIRK_PROBE_DEF },
|
||||||
|
/* IMC Networks (Medion Akoya) */
|
||||||
|
{ .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
||||||
|
| USB_DEVICE_ID_MATCH_INT_INFO,
|
||||||
|
.idVendor = 0x13d3,
|
||||||
|
.idProduct = 0x5103,
|
||||||
|
.bInterfaceClass = USB_CLASS_VIDEO,
|
||||||
|
.bInterfaceSubClass = 1,
|
||||||
|
.bInterfaceProtocol = 0,
|
||||||
|
.driver_info = UVC_QUIRK_STREAM_NO_FID },
|
||||||
/* Syntek (HP Spartan) */
|
/* Syntek (HP Spartan) */
|
||||||
{ .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
{ .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
||||||
| USB_DEVICE_ID_MATCH_INT_INFO,
|
| USB_DEVICE_ID_MATCH_INT_INFO,
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user