Merge git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 2 Apr 2008 19:34:33 +0000 (12:34 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 2 Apr 2008 19:34:33 +0000 (12:34 -0700)
* git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6:
  ide: use ->ata_input_data in ide_driveid_update()
  ide-h8300: 32-bit I/O is unsupported
  ide/legacy/q40ide.c: add MODULE_LICENSE
  ide/legacy/macide: add MODULE_LICENSE
  ide/legacy/falconide.c: add MODULE_LICENSE
  ide/legacy/buddha.c: add MODULE_LICENSE
  ide/legacy/gayle.c: add MODULE_LICENSE
  ide/h8300/ide-h8300.c: add MODULE_LICENSE
  ide/cris/ide-cris.c: add MODULE_LICENSE
  ide/arm/ide_arm.c: add MODULE_LICENSE
  ide/ppc/pmac.c: add MODULE_LICENSE
  ide/ppc/mpc8xx.c: add MODULE_LICENSE
  ide/pci/cmd640.c: add MODULE_LICENSE
  ide-pnp.c: add MODULE_LICENSE

134 files changed:
Documentation/kernel-parameters.txt
Documentation/networking/00-INDEX
Documentation/networking/sk98lin.txt [deleted file]
Makefile
arch/arm/common/it8152.c
arch/arm/kernel/calls.S
arch/arm/kernel/sys_oabi-compat.c
arch/mips/Makefile
arch/mips/au1000/common/cputable.c
arch/mips/au1000/common/setup.c
arch/mips/au1000/common/time.c
arch/mips/au1000/xxs1500/board_setup.c
arch/mips/au1000/xxs1500/irqmap.c
arch/mips/configs/bigsur_defconfig
arch/mips/kernel/i8253.c
arch/mips/kernel/time.c
arch/mips/kernel/vpe.c
arch/mips/mm/tlbex.c
arch/mips/pci/pci-bcm1480.c
arch/mips/pci/pci-bcm1480ht.c
arch/sh/Kconfig
arch/sh/boot/Makefile
arch/sh/kernel/cpu/sh2a/fpu.c
arch/sh/kernel/cpu/sh4/fpu.c
arch/sh/kernel/cpu/sh5/fpu.c
arch/sh/kernel/dump_task.c
arch/sh/kernel/process_32.c
arch/sh/kernel/signal_32.c
arch/sparc64/kernel/iommu.c
arch/sparc64/kernel/iommu_common.h
arch/sparc64/kernel/pci_sun4v.c
arch/sparc64/mm/tlb.c
block/blk-settings.c
block/cfq-iosched.c
crypto/xcbc.c
drivers/acpi/sleep/main.c
drivers/atm/firestream.c
drivers/atm/he.c
drivers/atm/idt77252.c
drivers/atm/iphase.c
drivers/firewire/fw-ohci.c
drivers/hwmon/w83781d.c
drivers/input/apm-power.c
drivers/input/evdev.c
drivers/input/joydev.c
drivers/input/keyboard/pxa27x_keypad.c
drivers/input/mousedev.c
drivers/leds/leds-gpio.c
drivers/media/radio/radio-cadet.c
drivers/media/video/bt8xx/bttv-driver.c
drivers/media/video/cx23885/cx23885-cards.c
drivers/media/video/cx23885/cx23885-core.c
drivers/media/video/v4l2-int-device.c
drivers/net/Kconfig
drivers/net/bfin_mac.c
drivers/net/bonding/bond_sysfs.c
drivers/net/forcedeth.c
drivers/net/ibm_newemac/core.c
drivers/net/plip.c
drivers/net/s2io.c
drivers/net/sky2.c
drivers/net/tulip/eeprom.c
drivers/net/tulip/tulip_core.c
drivers/net/usb/Kconfig
drivers/net/usb/dm9601.c
drivers/net/usb/pegasus.c
drivers/net/wan/lapbether.c
drivers/net/wireless/b43/dma.c
drivers/net/wireless/b43/pcmcia.c
drivers/net/wireless/iwlwifi/iwl-4965.c
drivers/net/wireless/libertas/if_cs.c
drivers/net/wireless/rt2x00/rt2x00dev.c
drivers/scsi/hosts.c
drivers/scsi/libsas/sas_discover.c
drivers/scsi/mvsas.c
drivers/scsi/scsi_sysfs.c
drivers/watchdog/it8712f_wdt.c
fs/afs/cell.c
include/asm-mips/mach-au1x00/au1000.h
include/asm-sh/floppy.h [deleted file]
include/asm-sh/fpu.h
include/asm-sh/processor.h
include/asm-sh/processor_32.h
include/asm-sh/processor_64.h
include/linux/input.h
include/linux/iocontext.h
include/linux/netdevice.h
include/net/llc.h
include/net/llc_pdu.h
include/net/llc_sap.h
mm/slub.c
net/8021q/vlan.c
net/8021q/vlan.h
net/8021q/vlanproc.c
net/bluetooth/af_bluetooth.c
net/bluetooth/hci_sock.c
net/bluetooth/l2cap.c
net/bluetooth/rfcomm/core.c
net/bluetooth/rfcomm/sock.c
net/bluetooth/rfcomm/tty.c
net/bluetooth/sco.c
net/ipv4/esp4.c
net/ipv4/inet_fragment.c
net/ipv4/ip_forward.c
net/ipv4/netfilter/ip_queue.c
net/ipv4/netfilter/ipt_CLUSTERIP.c
net/ipv4/netfilter/ipt_recent.c
net/ipv4/netfilter/nf_conntrack_l3proto_ipv4_compat.c
net/ipv4/udp.c
net/ipv6/addrconf.c
net/ipv6/esp6.c
net/ipv6/icmp.c
net/ipv6/ip6_input.c
net/ipv6/netfilter/ip6_queue.c
net/ipv6/netfilter/nf_conntrack_reasm.c
net/llc/af_llc.c
net/llc/llc_c_ac.c
net/llc/llc_core.c
net/llc/llc_input.c
net/llc/llc_pdu.c
net/llc/llc_s_ac.c
net/llc/llc_sap.c
net/llc/llc_station.c
net/mac80211/ieee80211.c
net/mac80211/ieee80211_sta.c
net/netfilter/nf_conntrack_standalone.c
net/netfilter/nf_log.c
net/netfilter/nf_queue.c
net/netfilter/nfnetlink_log.c
net/netfilter/nfnetlink_queue.c
net/netfilter/xt_hashlimit.c
net/rose/af_rose.c
net/sched/sch_generic.c
security/selinux/hooks.c

index 508e2a2c98644ad6c4ee70e59a33191af9af541e..4cd1a5da80a4d4f11a17214ed8c344ccf9bd06c4 100644 (file)
@@ -170,11 +170,6 @@ and is between 256 and 4096 characters. It is defined in the file
        acpi_irq_isa=   [HW,ACPI] If irq_balance, mark listed IRQs used by ISA
                        Format: <irq>,<irq>...
 
-       acpi_new_pts_ordering [HW,ACPI]
-                       Enforce the ACPI 2.0 ordering of the _PTS control
-                       method wrt putting devices into low power states
-                       default: pre ACPI 2.0 ordering of _PTS
-
        acpi_no_auto_ssdt       [HW,ACPI] Disable automatic loading of SSDT
 
        acpi_os_name=   [HW,ACPI] Tell ACPI BIOS the name of the OS
index 02e56d447a8fcde92eabdecd955ccd99af99dbcf..c485ee028bd9dd00b9a4cf327471f87a8295f615 100644 (file)
@@ -84,9 +84,6 @@ policy-routing.txt
        - IP policy-based routing
 ray_cs.txt
        - Raylink Wireless LAN card driver info.
-sk98lin.txt
-       - Marvell Yukon Chipset / SysKonnect SK-98xx compliant Gigabit
-         Ethernet Adapter family driver info
 skfp.txt
        - SysKonnect FDDI (SK-5xxx, Compaq Netelligent) driver info.
 smc9.txt
diff --git a/Documentation/networking/sk98lin.txt b/Documentation/networking/sk98lin.txt
deleted file mode 100644 (file)
index 8590a95..0000000
+++ /dev/null
@@ -1,568 +0,0 @@
-(C)Copyright 1999-2004 Marvell(R).
-All rights reserved
-===========================================================================
-
-sk98lin.txt created 13-Feb-2004
-
-Readme File for sk98lin v6.23
-Marvell Yukon/SysKonnect SK-98xx Gigabit Ethernet Adapter family driver for LINUX
-
-This file contains
- 1  Overview
- 2  Required Files
- 3  Installation
-    3.1  Driver Installation
-    3.2  Inclusion of adapter at system start
- 4  Driver Parameters
-    4.1  Per-Port Parameters
-    4.2  Adapter Parameters
- 5  Large Frame Support
- 6  VLAN and Link Aggregation Support (IEEE 802.1, 802.1q, 802.3ad)
- 7  Troubleshooting
-
-===========================================================================
-
-
-1  Overview
-===========
-
-The sk98lin driver supports the Marvell Yukon and SysKonnect 
-SK-98xx/SK-95xx compliant Gigabit Ethernet Adapter on Linux. It has 
-been tested with Linux on Intel/x86 machines.
-***
-
-
-2  Required Files
-=================
-
-The linux kernel source.
-No additional files required.
-***
-
-
-3  Installation
-===============
-
-It is recommended to download the latest version of the driver from the 
-SysKonnect web site www.syskonnect.com. If you have downloaded the latest
-driver, the Linux kernel has to be patched before the driver can be 
-installed. For details on how to patch a Linux kernel, refer to the 
-patch.txt file.
-
-3.1  Driver Installation
-------------------------
-
-The following steps describe the actions that are required to install
-the driver and to start it manually. These steps should be carried
-out for the initial driver setup. Once confirmed to be ok, they can
-be included in the system start.
-
-NOTE 1: To perform the following tasks you need 'root' access.
-
-NOTE 2: In case of problems, please read the section "Troubleshooting" 
-        below.
-
-The driver can either be integrated into the kernel or it can be compiled 
-as a module. Select the appropriate option during the kernel 
-configuration.
-
-Compile/use the driver as a module
-----------------------------------
-To compile the driver, go to the directory /usr/src/linux and
-execute the command "make menuconfig" or "make xconfig" and proceed as 
-follows:
-
-To integrate the driver permanently into the kernel, proceed as follows:
-
-1. Select the menu "Network device support" and then "Ethernet(1000Mbit)"
-2. Mark "Marvell Yukon Chipset / SysKonnect SK-98xx family support" 
-   with (*) 
-3. Build a new kernel when the configuration of the above options is 
-   finished.
-4. Install the new kernel.
-5. Reboot your system.
-
-To use the driver as a module, proceed as follows:
-
-1. Enable 'loadable module support' in the kernel.
-2. For automatic driver start, enable the 'Kernel module loader'.
-3. Select the menu "Network device support" and then "Ethernet(1000Mbit)"
-4. Mark "Marvell Yukon Chipset / SysKonnect SK-98xx family support" 
-   with (M)
-5. Execute the command "make modules".
-6. Execute the command "make modules_install".
-   The appropriate modules will be installed.
-7. Reboot your system.
-
-
-Load the module manually
-------------------------
-To load the module manually, proceed as follows:
-
-1. Enter "modprobe sk98lin".
-2. If a Marvell Yukon or SysKonnect SK-98xx adapter is installed in 
-   your computer and you have a /proc file system, execute the command:
-   "ls /proc/net/sk98lin/" 
-   This should produce an output containing a line with the following 
-   format:
-   eth0   eth1  ...
-   which indicates that your adapter has been found and initialized.
-   
-   NOTE 1: If you have more than one Marvell Yukon or SysKonnect SK-98xx 
-           adapter installed, the adapters will be listed as 'eth0', 
-                   'eth1', 'eth2', etc.
-                   For each adapter, repeat steps 3 and 4 below.
-
-   NOTE 2: If you have other Ethernet adapters installed, your Marvell
-           Yukon or SysKonnect SK-98xx adapter will be mapped to the 
-                   next available number, e.g. 'eth1'. The mapping is executed 
-                   automatically.
-           The module installation message (displayed either in a system
-           log file or on the console) prints a line for each adapter 
-           found containing the corresponding 'ethX'.
-
-3. Select an IP address and assign it to the respective adapter by 
-   entering:
-   ifconfig eth0 <ip-address>
-   With this command, the adapter is connected to the Ethernet. 
-   
-   SK-98xx Gigabit Ethernet Server Adapters: The yellow LED on the adapter 
-   is now active, the link status LED of the primary port is active and 
-   the link status LED of the secondary port (on dual port adapters) is 
-   blinking (if the ports are connected to a switch or hub).
-   SK-98xx V2.0 Gigabit Ethernet Adapters: The link status LED is active.
-   In addition, you will receive a status message on the console stating
-   "ethX: network connection up using port Y" and showing the selected 
-   connection parameters (x stands for the ethernet device number 
-   (0,1,2, etc), y stands for the port name (A or B)).
-
-   NOTE: If you are in doubt about IP addresses, ask your network
-         administrator for assistance.
-  
-4. Your adapter should now be fully operational.
-   Use 'ping <otherstation>' to verify the connection to other computers 
-   on your network.
-5. To check the adapter configuration view /proc/net/sk98lin/[devicename].
-   For example by executing:    
-   "cat /proc/net/sk98lin/eth0" 
-
-Unload the module
------------------
-To stop and unload the driver modules, proceed as follows:
-
-1. Execute the command "ifconfig eth0 down".
-2. Execute the command "rmmod sk98lin".
-
-3.2  Inclusion of adapter at system start
------------------------------------------
-
-Since a large number of different Linux distributions are 
-available, we are unable to describe a general installation procedure
-for the driver module.
-Because the driver is now integrated in the kernel, installation should
-be easy, using the standard mechanism of your distribution.
-Refer to the distribution's manual for installation of ethernet adapters.
-
-***
-
-4  Driver Parameters
-====================
-
-Parameters can be set at the command line after the module has been 
-loaded with the command 'modprobe'.
-In some distributions, the configuration tools are able to pass parameters
-to the driver module.
-
-If you use the kernel module loader, you can set driver parameters
-in the file /etc/modprobe.conf (or /etc/modules.conf in 2.4 or earlier).
-To set the driver parameters in this file, proceed as follows:
-
-1. Insert a line of the form :
-   options sk98lin ...
-   For "...", the same syntax is required as described for the command
-   line parameters of modprobe below.
-2. To activate the new parameters, either reboot your computer
-   or 
-   unload and reload the driver.
-   The syntax of the driver parameters is:
-
-        modprobe sk98lin parameter=value1[,value2[,value3...]]
-
-   where value1 refers to the first adapter, value2 to the second etc.
-
-NOTE: All parameters are case sensitive. Write them exactly as shown 
-      below.
-
-Example:
-Suppose you have two adapters. You want to set auto-negotiation
-on the first adapter to ON and on the second adapter to OFF.
-You also want to set DuplexCapabilities on the first adapter
-to FULL, and on the second adapter to HALF.
-Then, you must enter:
-
-        modprobe sk98lin AutoNeg_A=On,Off DupCap_A=Full,Half
-
-NOTE: The number of adapters that can be configured this way is
-      limited in the driver (file skge.c, constant SK_MAX_CARD_PARAM).
-      The current limit is 16. If you happen to install
-      more adapters, adjust this and recompile.
-
-
-4.1  Per-Port Parameters
-------------------------
-
-These settings are available for each port on the adapter.
-In the following description, '?' stands for the port for
-which you set the parameter (A or B).
-
-Speed
------
-Parameter:    Speed_?
-Values:       10, 100, 1000, Auto
-Default:      Auto
-
-This parameter is used to set the speed capabilities. It is only valid 
-for the SK-98xx V2.0 copper adapters.
-Usually, the speed is negotiated between the two ports during link 
-establishment. If this fails, a port can be forced to a specific setting
-with this parameter.
-
-Auto-Negotiation
-----------------
-Parameter:    AutoNeg_?
-Values:       On, Off, Sense
-Default:      On
-  
-The "Sense"-mode automatically detects whether the link partner supports
-auto-negotiation or not.
-
-Duplex Capabilities
--------------------
-Parameter:    DupCap_?
-Values:       Half, Full, Both
-Default:      Both
-
-This parameters is only relevant if auto-negotiation for this port is 
-not set to "Sense". If auto-negotiation is set to "On", all three values
-are possible. If it is set to "Off", only "Full" and "Half" are allowed.
-This parameter is useful if your link partner does not support all
-possible combinations.
-
-Flow Control
-------------
-Parameter:    FlowCtrl_?
-Values:       Sym, SymOrRem, LocSend, None
-Default:      SymOrRem
-
-This parameter can be used to set the flow control capabilities the 
-port reports during auto-negotiation. It can be set for each port 
-individually.
-Possible modes:
-   -- Sym      = Symmetric: both link partners are allowed to send 
-                  PAUSE frames
-   -- SymOrRem = SymmetricOrRemote: both or only remote partner 
-                  are allowed to send PAUSE frames
-   -- LocSend  = LocalSend: only local link partner is allowed 
-                  to send PAUSE frames
-   -- None     = no link partner is allowed to send PAUSE frames
-  
-NOTE: This parameter is ignored if auto-negotiation is set to "Off".
-
-Role in Master-Slave-Negotiation (1000Base-T only)
---------------------------------------------------
-Parameter:    Role_?
-Values:       Auto, Master, Slave
-Default:      Auto
-
-This parameter is only valid for the SK-9821 and SK-9822 adapters.
-For two 1000Base-T ports to communicate, one must take the role of the
-master (providing timing information), while the other must be the 
-slave. Usually, this is negotiated between the two ports during link 
-establishment. If this fails, a port can be forced to a specific setting
-with this parameter.
-
-
-4.2  Adapter Parameters
------------------------
-
-Connection Type (SK-98xx V2.0 copper adapters only)
----------------
-Parameter:    ConType
-Values:       Auto, 100FD, 100HD, 10FD, 10HD
-Default:      Auto
-
-The parameter 'ConType' is a combination of all five per-port parameters
-within one single parameter. This simplifies the configuration of both ports
-of an adapter card! The different values of this variable reflect the most 
-meaningful combinations of port parameters.
-
-The following table shows the values of 'ConType' and the corresponding
-combinations of the per-port parameters:
-
-    ConType   |  DupCap   AutoNeg   FlowCtrl   Role             Speed
-    ----------+------------------------------------------------------
-    Auto      |  Both     On        SymOrRem   Auto             Auto
-    100FD     |  Full     Off       None       Auto (ignored)   100
-    100HD     |  Half     Off       None       Auto (ignored)   100
-    10FD      |  Full     Off       None       Auto (ignored)   10
-    10HD      |  Half     Off       None       Auto (ignored)   10
-
-Stating any other port parameter together with this 'ConType' variable
-will result in a merged configuration of those settings. This due to 
-the fact, that the per-port parameters (e.g. Speed_? ) have a higher
-priority than the combined variable 'ConType'.
-
-NOTE: This parameter is always used on both ports of the adapter card.
-
-Interrupt Moderation
---------------------
-Parameter:    Moderation
-Values:       None, Static, Dynamic
-Default:      None
-
-Interrupt moderation is employed to limit the maximum number of interrupts
-the driver has to serve. That is, one or more interrupts (which indicate any
-transmit or receive packet to be processed) are queued until the driver 
-processes them. When queued interrupts are to be served, is determined by the
-'IntsPerSec' parameter, which is explained later below.
-
-Possible modes:
-
-   -- None - No interrupt moderation is applied on the adapter card. 
-      Therefore, each transmit or receive interrupt is served immediately
-      as soon as it appears on the interrupt line of the adapter card.
-
-   -- Static - Interrupt moderation is applied on the adapter card. 
-      All transmit and receive interrupts are queued until a complete
-      moderation interval ends. If such a moderation interval ends, all
-      queued interrupts are processed in one big bunch without any delay.
-      The term 'static' reflects the fact, that interrupt moderation is
-      always enabled, regardless how much network load is currently 
-      passing via a particular interface. In addition, the duration of
-      the moderation interval has a fixed length that never changes while
-      the driver is operational.
-
-   -- Dynamic - Interrupt moderation might be applied on the adapter card,
-      depending on the load of the system. If the driver detects that the
-      system load is too high, the driver tries to shield the system against 
-      too much network load by enabling interrupt moderation. If - at a later
-      time - the CPU utilization decreases again (or if the network load is 
-      negligible) the interrupt moderation will automatically be disabled.
-
-Interrupt moderation should be used when the driver has to handle one or more
-interfaces with a high network load, which - as a consequence - leads also to a
-high CPU utilization. When moderation is applied in such high network load 
-situations, CPU load might be reduced by 20-30%.
-
-NOTE: The drawback of using interrupt moderation is an increase of the round-
-trip-time (RTT), due to the queueing and serving of interrupts at dedicated
-moderation times.
-
-Interrupts per second
----------------------
-Parameter:    IntsPerSec
-Values:       30...40000 (interrupts per second)
-Default:      2000
-
-This parameter is only used if either static or dynamic interrupt moderation
-is used on a network adapter card. Using this parameter if no moderation is
-applied will lead to no action performed.
-
-This parameter determines the length of any interrupt moderation interval. 
-Assuming that static interrupt moderation is to be used, an 'IntsPerSec' 
-parameter value of 2000 will lead to an interrupt moderation interval of
-500 microseconds. 
-
-NOTE: The duration of the moderation interval is to be chosen with care.
-At first glance, selecting a very long duration (e.g. only 100 interrupts per 
-second) seems to be meaningful, but the increase of packet-processing delay 
-is tremendous. On the other hand, selecting a very short moderation time might
-compensate the use of any moderation being applied.
-
-
-Preferred Port
---------------
-Parameter:    PrefPort
-Values:       A, B
-Default:      A
-
-This is used to force the preferred port to A or B (on dual-port network 
-adapters). The preferred port is the one that is used if both are detected
-as fully functional.
-
-RLMT Mode (Redundant Link Management Technology)
-------------------------------------------------
-Parameter:    RlmtMode
-Values:       CheckLinkState,CheckLocalPort, CheckSeg, DualNet
-Default:      CheckLinkState
-
-RLMT monitors the status of the port. If the link of the active port 
-fails, RLMT switches immediately to the standby link. The virtual link is 
-maintained as long as at least one 'physical' link is up. 
-
-Possible modes:
-
-   -- CheckLinkState - Check link state only: RLMT uses the link state
-      reported by the adapter hardware for each individual port to 
-      determine whether a port can be used for all network traffic or 
-      not.
-
-   -- CheckLocalPort - In this mode, RLMT monitors the network path 
-      between the two ports of an adapter by regularly exchanging packets
-      between them. This mode requires a network configuration in which 
-      the two ports are able to "see" each other (i.e. there must not be 
-      any router between the ports).
-
-   -- CheckSeg - Check local port and segmentation: This mode supports the
-      same functions as the CheckLocalPort mode and additionally checks 
-      network segmentation between the ports. Therefore, this mode is only
-      to be used if Gigabit Ethernet switches are installed on the network
-      that have been configured to use the Spanning Tree protocol. 
-
-   -- DualNet - In this mode, ports A and B are used as separate devices. 
-      If you have a dual port adapter, port A will be configured as eth0 
-      and port B as eth1. Both ports can be used independently with 
-      distinct IP addresses. The preferred port setting is not used. 
-      RLMT is turned off.
-   
-NOTE: RLMT modes CLP and CLPSS are designed to operate in configurations 
-      where a network path between the ports on one adapter exists. 
-      Moreover, they are not designed to work where adapters are connected
-      back-to-back.
-***
-
-
-5  Large Frame Support
-======================
-
-The driver supports large frames (also called jumbo frames). Using large 
-frames can result in an improved throughput if transferring large amounts 
-of data.
-To enable large frames, set the MTU (maximum transfer unit) of the 
-interface to the desired value (up to 9000), execute the following 
-command:
-      ifconfig eth0 mtu 9000
-This will only work if you have two adapters connected back-to-back
-or if you use a switch that supports large frames. When using a switch, 
-it should be configured to allow large frames and auto-negotiation should  
-be set to OFF. The setting must be configured on all adapters that can be 
-reached by the large frames. If one adapter is not set to receive large 
-frames, it will simply drop them.
-
-You can switch back to the standard ethernet frame size by executing the 
-following command:
-      ifconfig eth0 mtu 1500
-
-To permanently configure this setting, add a script with the 'ifconfig' 
-line to the system startup sequence (named something like "S99sk98lin" 
-in /etc/rc.d/rc2.d).
-***
-
-
-6  VLAN and Link Aggregation Support (IEEE 802.1, 802.1q, 802.3ad)
-==================================================================
-
-The Marvell Yukon/SysKonnect Linux drivers are able to support VLAN and 
-Link Aggregation according to IEEE standards 802.1, 802.1q, and 802.3ad. 
-These features are only available after installation of open source 
-modules available on the Internet:
-For VLAN go to: http://www.candelatech.com/~greear/vlan.html
-For Link Aggregation go to: http://www.st.rim.or.jp/~yumo
-
-NOTE: SysKonnect GmbH does not offer any support for these open source 
-      modules and does not take the responsibility for any kind of 
-      failures or problems arising in connection with these modules.
-
-NOTE: Configuring Link Aggregation on a SysKonnect dual link adapter may 
-      cause problems when unloading the driver.
-
-
-7  Troubleshooting
-==================
-
-If any problems occur during the installation process, check the 
-following list:
-
-
-Problem:  The SK-98xx adapter cannot be found by the driver.
-Solution: In /proc/pci search for the following entry:
-             'Ethernet controller: SysKonnect SK-98xx ...'
-          If this entry exists, the SK-98xx or SK-98xx V2.0 adapter has 
-          been found by the system and should be operational.
-          If this entry does not exist or if the file '/proc/pci' is not 
-          found, there may be a hardware problem or the PCI support may 
-          not be enabled in your kernel.
-          The adapter can be checked using the diagnostics program which 
-          is available on the SysKonnect web site:
-          www.syskonnect.com
-          
-          Some COMPAQ machines have problems dealing with PCI under Linux.
-          This problem is described in the 'PCI howto' document
-          (included in some distributions or available from the
-          web, e.g. at 'www.linux.org'). 
-
-
-Problem:  Programs such as 'ifconfig' or 'route' cannot be found or the 
-          error message 'Operation not permitted' is displayed.
-Reason:   You are not logged in as user 'root'.
-Solution: Logout and login as 'root' or change to 'root' via 'su'.
-
-
-Problem:  Upon use of the command 'ping <address>' the message
-          "ping: sendto: Network is unreachable" is displayed.
-Reason:   Your route is not set correctly.
-Solution: If you are using RedHat, you probably forgot to set up the 
-          route in the 'network configuration'.
-          Check the existing routes with the 'route' command and check 
-          if an entry for 'eth0' exists, and if so, if it is set correctly.
-
-
-Problem:  The driver can be started, the adapter is connected to the 
-          network, but you cannot receive or transmit any packets; 
-          e.g. 'ping' does not work.
-Reason:   There is an incorrect route in your routing table.
-Solution: Check the routing table with the command 'route' and read the 
-          manual help pages dealing with routes (enter 'man route').
-
-NOTE: Although the 2.2.x kernel versions generate the routing entry 
-      automatically, problems of this kind may occur here as well. We've 
-      come across a situation in which the driver started correctly at 
-      system start, but after the driver has been removed and reloaded,
-      the route of the adapter's network pointed to the 'dummy0'device 
-      and had to be corrected manually.
-
-
-Problem:  Your computer should act as a router between multiple 
-          IP subnetworks (using multiple adapters), but computers in 
-          other subnetworks cannot be reached.
-Reason:   Either the router's kernel is not configured for IP forwarding 
-          or the routing table and gateway configuration of at least one 
-          computer is not working.
-
-Problem:  Upon driver start, the following error message is displayed:
-          "eth0: -- ERROR --
-          Class: internal Software error
-          Nr:    0xcc
-          Msg:   SkGeInitPort() cannot init running ports"
-Reason:   You are using a driver compiled for single processor machines 
-          on a multiprocessor machine with SMP (Symmetric MultiProcessor) 
-          kernel.
-Solution: Configure your kernel appropriately and recompile the kernel or
-          the modules.
-
-
-
-If your problem is not listed here, please contact SysKonnect's technical
-support for help (linux@syskonnect.de).
-When contacting our technical support, please ensure that the following 
-information is available:
-- System Manufacturer and HW Informations (CPU, Memory... )
-- PCI-Boards in your system
-- Distribution
-- Kernel version
-- Driver version
-***
-
-
-
-***End of Readme File***
index b08a259e21dc2e32c027c36a033f216f73a50ef9..fec2a12710eb37ba72f65a394d7e8aa9284485d9 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 6
 SUBLEVEL = 25
-EXTRAVERSION = -rc7
+EXTRAVERSION = -rc8
 NAME = Funky Weasel is Jiggy wit it
 
 # *DOCUMENTATION*
index 538262241483202545dad88ac247b427b9e6c3b6..5fe9588db077be52b1cebc1c11484e843e11a6d7 100644 (file)
@@ -120,6 +120,7 @@ void it8152_irq_demux(unsigned int irq, struct irq_desc *desc)
                          time, when they all three were 0. */
                       bits_pd = __raw_readl(IT8152_INTC_PDCNIRR);
                       bits_lp = __raw_readl(IT8152_INTC_LPCNIRR);
+                      bits_ld = __raw_readl(IT8152_INTC_LDCNIRR);
                       if (!(bits_ld | bits_lp | bits_pd))
                               return;
               }
@@ -133,14 +134,14 @@ void it8152_irq_demux(unsigned int irq, struct irq_desc *desc)
 
               bits_lp &= ((1 << IT8152_LP_IRQ_COUNT) - 1);
               while (bits_lp) {
-                      i = __ffs(bits_pd);
+                      i = __ffs(bits_lp);
                       it8152_irq(IT8152_LP_IRQ(i));
                       bits_lp &= ~(1 << i);
               }
 
               bits_ld &= ((1 << IT8152_LD_IRQ_COUNT) - 1);
               while (bits_ld) {
-                      i = __ffs(bits_pd);
+                      i = __ffs(bits_ld);
                       it8152_irq(IT8152_LD_IRQ(i));
                       bits_ld &= ~(1 << i);
               }
index 283e14fff993dde1881b005aa6dbb1598e359780..7e97b7376563d2b6afbce8803b2ab796d29e87d9 100644 (file)
                CALL(sys_mknodat)
 /* 325 */      CALL(sys_fchownat)
                CALL(sys_futimesat)
-               CALL(sys_fstatat64)
+               CALL(ABI(sys_fstatat64,  sys_oabi_fstatat64))
                CALL(sys_unlinkat)
                CALL(sys_renameat)
 /* 330 */      CALL(sys_linkat)
index e8b98046895b9b3907e9f02b2dc4d7393cdfc424..96ab5f52949c99d145aea4be30f077e5ea34ef9f 100644 (file)
@@ -25,6 +25,7 @@
  * sys_stat64:
  * sys_lstat64:
  * sys_fstat64:
+ * sys_fstatat64:
  *
  *   struct stat64 has different sizes and some members are shifted
  *   Compatibility wrappers are needed for them and provided below.
@@ -169,6 +170,29 @@ asmlinkage long sys_oabi_fstat64(unsigned long fd,
        return error;
 }
 
+asmlinkage long sys_oabi_fstatat64(int dfd,
+                                  char __user *filename,
+                                  struct oldabi_stat64  __user *statbuf,
+                                  int flag)
+{
+       struct kstat stat;
+       int error = -EINVAL;
+
+       if ((flag & ~AT_SYMLINK_NOFOLLOW) != 0)
+               goto out;
+
+       if (flag & AT_SYMLINK_NOFOLLOW)
+               error = vfs_lstat_fd(dfd, filename, &stat);
+       else
+               error = vfs_stat_fd(dfd, filename, &stat);
+
+       if (!error)
+       error = cp_oldabi_stat64(&stat, statbuf);
+
+out:
+       return error;
+}
+
 struct oabi_flock64 {
        short   l_type;
        short   l_whence;
index 72097dacabd3fe68dbae4296199aba7f21c2c6ec..1c62381f5c230c6b42bcb7ef95ff6148df553a4e 100644 (file)
@@ -482,10 +482,13 @@ endif
 # be 16kb aligned or the handling of the current variable will break.
 # Simplified: what IP22 does at 128MB+ in ksegN, IP28 does at 512MB+ in xkphys
 #
-#core-$(CONFIG_SGI_IP28)               += arch/mips/sgi-ip22/ arch/mips/arc/arc_con.o
+ifdef CONFIG_SGI_IP28
+  ifeq ($(call cc-option-yn,-mr10k-cache-barrier=1), n)
+      $(error gcc doesn't support needed option -mr10k-cache-barrier=1)
+  endif
+endif
 core-$(CONFIG_SGI_IP28)                += arch/mips/sgi-ip22/
 cflags-$(CONFIG_SGI_IP28)      += -mr10k-cache-barrier=1 -Iinclude/asm-mips/mach-ip28
-#cflags-$(CONFIG_SGI_IP28)     += -Iinclude/asm-mips/mach-ip28
 load-$(CONFIG_SGI_IP28)                += 0xa800000020004000
 
 #
index d8df5fdb045f756de236e5dcda99d8a91bcb966f..5c0d35d6e22a7758605a85c85f17af545459f766 100644 (file)
@@ -22,24 +22,24 @@ struct cpu_spec* cur_cpu_spec[NR_CPUS];
 /* With some thought, we can probably use the mask to reduce the
  * size of the table.
  */
-struct cpu_spec        cpu_specs[] = {
-    { 0xffffffff, 0x00030100, "Au1000 DA", 1, 0 },
-    { 0xffffffff, 0x00030201, "Au1000 HA", 1, 0 },
-    { 0xffffffff, 0x00030202, "Au1000 HB", 1, 0 },
-    { 0xffffffff, 0x00030203, "Au1000 HC", 1, 1 },
-    { 0xffffffff, 0x00030204, "Au1000 HD", 1, 1 },
-    { 0xffffffff, 0x01030200, "Au1500 AB", 1, 1 },
-    { 0xffffffff, 0x01030201, "Au1500 AC", 0, 1 },
-    { 0xffffffff, 0x01030202, "Au1500 AD", 0, 1 },
-    { 0xffffffff, 0x02030200, "Au1100 AB", 1, 1 },
-    { 0xffffffff, 0x02030201, "Au1100 BA", 1, 1 },
-    { 0xffffffff, 0x02030202, "Au1100 BC", 1, 1 },
-    { 0xffffffff, 0x02030203, "Au1100 BD", 0, 1 },
-    { 0xffffffff, 0x02030204, "Au1100 BE", 0, 1 },
-    { 0xffffffff, 0x03030200, "Au1550 AA", 0, 1 },
-    { 0xffffffff, 0x04030200, "Au1200 AB", 0, 0 },
-    { 0xffffffff, 0x04030201, "Au1200 AC", 1, 0 },
-    { 0x00000000, 0x00000000, "Unknown Au1xxx", 1, 0 },
+struct cpu_spec cpu_specs[] = {
+       { 0xffffffff, 0x00030100, "Au1000 DA", 1, 0, 1 },
+       { 0xffffffff, 0x00030201, "Au1000 HA", 1, 0, 1 },
+       { 0xffffffff, 0x00030202, "Au1000 HB", 1, 0, 1 },
+       { 0xffffffff, 0x00030203, "Au1000 HC", 1, 1, 0 },
+       { 0xffffffff, 0x00030204, "Au1000 HD", 1, 1, 0 },
+       { 0xffffffff, 0x01030200, "Au1500 AB", 1, 1, 0 },
+       { 0xffffffff, 0x01030201, "Au1500 AC", 0, 1, 0 },
+       { 0xffffffff, 0x01030202, "Au1500 AD", 0, 1, 0 },
+       { 0xffffffff, 0x02030200, "Au1100 AB", 1, 1, 0 },
+       { 0xffffffff, 0x02030201, "Au1100 BA", 1, 1, 0 },
+       { 0xffffffff, 0x02030202, "Au1100 BC", 1, 1, 0 },
+       { 0xffffffff, 0x02030203, "Au1100 BD", 0, 1, 0 },
+       { 0xffffffff, 0x02030204, "Au1100 BE", 0, 1, 0 },
+       { 0xffffffff, 0x03030200, "Au1550 AA", 0, 1, 0 },
+       { 0xffffffff, 0x04030200, "Au1200 AB", 0, 0, 0 },
+       { 0xffffffff, 0x04030201, "Au1200 AC", 1, 0, 0 },
+       { 0x00000000, 0x00000000, "Unknown Au1xxx", 1, 0, 0 }
 };
 
 void
index d885e3848ec6c0842057341e2322cf53fcd29438..9e4ab80caab6b46fb800acc0271a861e39ecc990 100644 (file)
@@ -57,7 +57,7 @@ void __init plat_mem_setup(void)
 {
        struct  cpu_spec *sp;
        char *argptr;
-       unsigned long prid, cpupll, bclk = 1;
+       unsigned long prid, cpufreq, bclk = 1;
 
        set_cpuspec();
        sp = cur_cpu_spec[0];
@@ -65,8 +65,15 @@ void __init plat_mem_setup(void)
        board_setup();  /* board specific setup */
 
        prid = read_c0_prid();
-       cpupll = (au_readl(0xB1900060) & 0x3F) * 12;
-       printk("(PRId %08lx) @ %ldMHZ\n", prid, cpupll);
+       if (sp->cpu_pll_wo)
+#ifdef CONFIG_SOC_AU1000_FREQUENCY
+               cpufreq = CONFIG_SOC_AU1000_FREQUENCY / 1000000;
+#else
+               cpufreq = 396;
+#endif
+       else
+               cpufreq = (au_readl(SYS_CPUPLL) & 0x3F) * 12;
+       printk(KERN_INFO "(PRID %08lx) @ %ld MHz\n", prid, cpufreq);
 
        bclk = sp->cpu_bclk;
        if (bclk)
index f113b512d7b166b81c9b32ece83516693cf72123..e122bbc6cd88ff640d957df1d164a472ea288137 100644 (file)
@@ -209,18 +209,22 @@ unsigned long cal_r4koff(void)
                while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_C1S);
                au_writel(0, SYS_TOYWRITE);
                while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_C1S);
+       } else
+               no_au1xxx_32khz = 1;
 
-               cpu_speed = (au_readl(SYS_CPUPLL) & 0x0000003f) *
-                       AU1000_SRC_CLK;
-       }
-       else {
-               /* The 32KHz oscillator isn't running, so assume there
-                * isn't one and grab the processor speed from the PLL.
-                * NOTE: some old silicon doesn't allow reading the PLL.
-                */
+       /*
+        * On early Au1000, sys_cpupll was write-only. Since these
+        * silicon versions of Au1000 are not sold by AMD, we don't bend
+        * over backwards trying to determine the frequency.
+        */
+       if (cur_cpu_spec[0]->cpu_pll_wo)
+#ifdef CONFIG_SOC_AU1000_FREQUENCY
+               cpu_speed = CONFIG_SOC_AU1000_FREQUENCY;
+#else
+               cpu_speed = 396000000;
+#endif
+       else
                cpu_speed = (au_readl(SYS_CPUPLL) & 0x0000003f) * AU1000_SRC_CLK;
-               no_au1xxx_32khz = 1;
-       }
        mips_hpt_frequency = cpu_speed;
        // Equation: Baudrate = CPU / (SD * 2 * CLKDIV * 16)
        set_au1x00_uart_baud_base(cpu_speed / (2 * ((int)(au_readl(SYS_POWERCTRL)&0x03) + 2) * 16));
index a9237f41933d7259707178ed5e97142ee0b251eb..b2e413e597a808dddf85178ef05ed7841a7689b7 100644 (file)
 #include <asm/cpu.h>
 #include <asm/bootinfo.h>
 #include <asm/irq.h>
-#include <asm/keyboard.h>
 #include <asm/mipsregs.h>
 #include <asm/reboot.h>
 #include <asm/pgtable.h>
-#include <asm/au1000.h>
+#include <asm/mach-au1x00/au1000.h>
 
 void board_reset(void)
 {
index 389349295d702b0eb8038985bb9d5303152bf2f5..a343da13433481a2120511a1f9ef606666d62245 100644 (file)
@@ -45,7 +45,7 @@
 #include <asm/io.h>
 #include <asm/mipsregs.h>
 #include <asm/system.h>
-#include <asm/au1000.h>
+#include <asm/mach-au1x00/au1000.h>
 
 struct au1xxx_irqmap __initdata au1xxx_irq_map[] = {
        { AU1500_GPIO_204, INTC_INT_HIGH_LEVEL, 0},
index abf70d74e9d7f0cb15868bc97c915b31d38b5f14..3b42cea2e4023e88637534752da0738281b8eb97 100644 (file)
@@ -1,58 +1,48 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.20
-# Tue Feb 20 21:47:22 2007
+# Linux kernel version: 2.6.25-rc7
+# Mon Mar 31 08:11:19 2008
 #
 CONFIG_MIPS=y
 
 #
 # Machine selection
 #
-CONFIG_ZONE_DMA=y
-# CONFIG_MIPS_MTX1 is not set
-# CONFIG_MIPS_BOSPORUS is not set
-# CONFIG_MIPS_PB1000 is not set
-# CONFIG_MIPS_PB1100 is not set
-# CONFIG_MIPS_PB1500 is not set
-# CONFIG_MIPS_PB1550 is not set
-# CONFIG_MIPS_PB1200 is not set
-# CONFIG_MIPS_DB1000 is not set
-# CONFIG_MIPS_DB1100 is not set
-# CONFIG_MIPS_DB1500 is not set
-# CONFIG_MIPS_DB1550 is not set
-# CONFIG_MIPS_DB1200 is not set
-# CONFIG_MIPS_MIRAGE is not set
+# CONFIG_MACH_ALCHEMY is not set
 # CONFIG_BASLER_EXCITE is not set
+# CONFIG_BCM47XX is not set
 # CONFIG_MIPS_COBALT is not set
 # CONFIG_MACH_DECSTATION is not set
 # CONFIG_MACH_JAZZ is not set
+# CONFIG_LASAT is not set
+# CONFIG_LEMOTE_FULONG is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
 # CONFIG_MIPS_SEAD is not set
-# CONFIG_WR_PPMC is not set
 # CONFIG_MIPS_SIM is not set
-# CONFIG_MOMENCO_JAGUAR_ATX is not set
-# CONFIG_MIPS_XXS1500 is not set
+# CONFIG_MARKEINS is not set
+# CONFIG_MACH_VR41XX is not set
 # CONFIG_PNX8550_JBS is not set
 # CONFIG_PNX8550_STB810 is not set
-# CONFIG_MACH_VR41XX is not set
+# CONFIG_PMC_MSP is not set
 # CONFIG_PMC_YOSEMITE is not set
-# CONFIG_MARKEINS is not set
 # CONFIG_SGI_IP22 is not set
 # CONFIG_SGI_IP27 is not set
+# CONFIG_SGI_IP28 is not set
 # CONFIG_SGI_IP32 is not set
-CONFIG_SIBYTE_BIGSUR=y
-# CONFIG_SIBYTE_SWARM is not set
-# CONFIG_SIBYTE_SENTOSA is not set
-# CONFIG_SIBYTE_RHONE is not set
-# CONFIG_SIBYTE_CARMEL is not set
-# CONFIG_SIBYTE_LITTLESUR is not set
 # CONFIG_SIBYTE_CRHINE is not set
+# CONFIG_SIBYTE_CARMEL is not set
 # CONFIG_SIBYTE_CRHONE is not set
+# CONFIG_SIBYTE_RHONE is not set
+# CONFIG_SIBYTE_SWARM is not set
+# CONFIG_SIBYTE_LITTLESUR is not set
+# CONFIG_SIBYTE_SENTOSA is not set
+CONFIG_SIBYTE_BIGSUR=y
 # CONFIG_SNI_RM is not set
 # CONFIG_TOSHIBA_JMR3927 is not set
 # CONFIG_TOSHIBA_RBTX4927 is not set
 # CONFIG_TOSHIBA_RBTX4938 is not set
+# CONFIG_WR_PPMC is not set
 CONFIG_SIBYTE_BCM1x80=y
 CONFIG_SIBYTE_SB1xxx_SOC=y
 # CONFIG_CPU_SB1_PASS_1 is not set
@@ -68,9 +58,11 @@ CONFIG_SIBYTE_CFE=y
 # CONFIG_SIBYTE_CFE_CONSOLE is not set
 # CONFIG_SIBYTE_BUS_WATCHER is not set
 # CONFIG_SIBYTE_TBPROF is not set
+CONFIG_SIBYTE_HAS_ZBUS_PROFILING=y
 CONFIG_RWSEM_GENERIC_SPINLOCK=y
 # CONFIG_ARCH_HAS_ILOG2_U32 is not set
 # CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_ARCH_SUPPORTS_OPROFILE=y
 CONFIG_GENERIC_FIND_NEXT_BIT=y
 CONFIG_GENERIC_HWEIGHT=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
@@ -81,11 +73,17 @@ CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
 # CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ is not set
 CONFIG_CEVT_BCM1480=y
 CONFIG_CSRC_BCM1480=y
+CONFIG_CFE=y
 CONFIG_DMA_COHERENT=y
+CONFIG_EARLY_PRINTK=y
+CONFIG_SYS_HAS_EARLY_PRINTK=y
+# CONFIG_HOTPLUG_CPU is not set
+# CONFIG_NO_IOPORT is not set
 CONFIG_CPU_BIG_ENDIAN=y
 # CONFIG_CPU_LITTLE_ENDIAN is not set
 CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y
 CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y
+CONFIG_IRQ_CPU=y
 CONFIG_SWAP_IO_SPACE=y
 CONFIG_BOOT_ELF32=y
 CONFIG_MIPS_L1_CACHE_SHIFT=5
@@ -93,10 +91,6 @@ CONFIG_MIPS_L1_CACHE_SHIFT=5
 #
 # CPU selection
 #
-CONFIG_TICK_ONESHOT=y
-CONFIG_NO_HZ=y
-CONFIG_HIGH_RES_TIMERS=y
-CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
 # CONFIG_CPU_LOONGSON2 is not set
 # CONFIG_CPU_MIPS32_R1 is not set
 # CONFIG_CPU_MIPS32_R2 is not set
@@ -137,14 +131,15 @@ CONFIG_PAGE_SIZE_4KB=y
 CONFIG_MIPS_MT_DISABLED=y
 # CONFIG_MIPS_MT_SMP is not set
 # CONFIG_MIPS_MT_SMTC is not set
-# CONFIG_MIPS_VPE_LOADER is not set
 CONFIG_CPU_HAS_LLSC=y
 CONFIG_CPU_HAS_SYNC=y
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_GENERIC_IRQ_PROBE=y
 CONFIG_IRQ_PER_CPU=y
 CONFIG_CPU_SUPPORTS_HIGHMEM=y
+CONFIG_SYS_SUPPORTS_HIGHMEM=y
 CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_POPULATES_NODE_MAP=y
 CONFIG_SELECT_MEMORY_MODEL=y
 CONFIG_FLATMEM_MANUAL=y
 # CONFIG_DISCONTIGMEM_MANUAL is not set
@@ -152,13 +147,19 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
 CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_RESOURCES_64BIT=y
-CONFIG_ZONE_DMA_FLAG=1
+CONFIG_ZONE_DMA_FLAG=0
+CONFIG_VIRT_TO_BUS=y
 CONFIG_SMP=y
 CONFIG_SYS_SUPPORTS_SMP=y
 CONFIG_NR_CPUS_DEFAULT_4=y
 CONFIG_NR_CPUS=4
+CONFIG_TICK_ONESHOT=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
 # CONFIG_HZ_48 is not set
 # CONFIG_HZ_100 is not set
 # CONFIG_HZ_128 is not set
@@ -171,38 +172,45 @@ CONFIG_HZ=1000
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
-# CONFIG_PREEMPT_BKL is not set
 # CONFIG_KEXEC is not set
+CONFIG_SECCOMP=y
 CONFIG_LOCKDEP_SUPPORT=y
 CONFIG_STACKTRACE_SUPPORT=y
 CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 
 #
-# Code maturity level options
+# General setup
 #
 CONFIG_EXPERIMENTAL=y
 CONFIG_LOCK_KERNEL=y
 CONFIG_INIT_ENV_ARG_LIMIT=32
-
-#
-# General setup
-#
 CONFIG_LOCALVERSION=""
 CONFIG_LOCALVERSION_AUTO=y
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
-# CONFIG_IPC_NS is not set
 CONFIG_SYSVIPC_SYSCTL=y
-# CONFIG_POSIX_MQUEUE is not set
-# CONFIG_BSD_PROCESS_ACCT is not set
-# CONFIG_TASKSTATS is not set
-# CONFIG_UTS_NS is not set
-# CONFIG_AUDIT is not set
+CONFIG_POSIX_MQUEUE=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_TASKSTATS=y
+CONFIG_TASK_DELAY_ACCT=y
+CONFIG_TASK_XACCT=y
+CONFIG_TASK_IO_ACCOUNTING=y
+CONFIG_AUDIT=y
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
-# CONFIG_CPUSETS is not set
+CONFIG_LOG_BUF_SHIFT=16
+# CONFIG_CGROUPS is not set
+CONFIG_GROUP_SCHED=y
+CONFIG_FAIR_GROUP_SCHED=y
+# CONFIG_RT_GROUP_SCHED is not set
+CONFIG_USER_SCHED=y
+# CONFIG_CGROUP_SCHED is not set
 CONFIG_SYSFS_DEPRECATED=y
-# CONFIG_RELAY is not set
+CONFIG_SYSFS_DEPRECATED_V2=y
+CONFIG_RELAY=y
+# CONFIG_NAMESPACES is not set
+CONFIG_BLK_DEV_INITRD=y
 CONFIG_INITRAMFS_SOURCE=""
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 CONFIG_SYSCTL=y
@@ -211,24 +219,33 @@ CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
-# CONFIG_HOTPLUG is not set
+CONFIG_HOTPLUG=y
 CONFIG_PRINTK=y
 CONFIG_BUG=y
 CONFIG_ELF_CORE=y
+CONFIG_COMPAT_BRK=y
 CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
+CONFIG_ANON_INODES=y
 CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
 CONFIG_SHMEM=y
-CONFIG_SLAB=y
 CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
+# CONFIG_PROFILING is not set
+# CONFIG_MARKERS is not set
+CONFIG_HAVE_OPROFILE=y
+# CONFIG_HAVE_KPROBES is not set
+# CONFIG_HAVE_KRETPROBES is not set
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_SLABINFO=y
 CONFIG_RT_MUTEXES=y
 # CONFIG_TINY_SHMEM is not set
 CONFIG_BASE_SMALL=0
-# CONFIG_SLOB is not set
-
-#
-# Loadable module support
-#
 CONFIG_MODULES=y
 CONFIG_MODULE_UNLOAD=y
 # CONFIG_MODULE_FORCE_UNLOAD is not set
@@ -236,12 +253,10 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_KMOD=y
 CONFIG_STOP_MACHINE=y
-
-#
-# Block layer
-#
 CONFIG_BLOCK=y
 # CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_BLK_DEV_BSG is not set
+CONFIG_BLOCK_COMPAT=y
 
 #
 # IO Schedulers
@@ -255,6 +270,7 @@ CONFIG_DEFAULT_AS=y
 # CONFIG_DEFAULT_CFQ is not set
 # CONFIG_DEFAULT_NOOP is not set
 CONFIG_DEFAULT_IOSCHED="anticipatory"
+CONFIG_CLASSIC_RCU=y
 
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
@@ -262,23 +278,19 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
 CONFIG_HW_HAS_PCI=y
 CONFIG_PCI=y
 CONFIG_PCI_DOMAINS=y
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+CONFIG_PCI_LEGACY=y
 CONFIG_PCI_DEBUG=y
 CONFIG_MMU=y
-
-#
-# PCCARD (PCMCIA/CardBus) support
-#
-
-#
-# PCI Hotplug Support
-#
+CONFIG_ZONE_DMA32=y
+# CONFIG_PCCARD is not set
+# CONFIG_HOTPLUG_PCI is not set
 
 #
 # Executable file formats
 #
 CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
-# CONFIG_BUILD_ELF64 is not set
 CONFIG_MIPS32_COMPAT=y
 CONFIG_COMPAT=y
 CONFIG_SYSVIPC_COMPAT=y
@@ -292,7 +304,6 @@ CONFIG_BINFMT_ELF32=y
 CONFIG_PM=y
 # CONFIG_PM_LEGACY is not set
 # CONFIG_PM_DEBUG is not set
-# CONFIG_PM_SYSFS_DEPRECATED is not set
 
 #
 # Networking
@@ -302,7 +313,6 @@ CONFIG_NET=y
 #
 # Networking options
 #
-# CONFIG_NETDEBUG is not set
 CONFIG_PACKET=y
 CONFIG_PACKET_MMAP=y
 CONFIG_UNIX=y
@@ -310,10 +320,11 @@ CONFIG_XFRM=y
 CONFIG_XFRM_USER=m
 # CONFIG_XFRM_SUB_POLICY is not set
 CONFIG_XFRM_MIGRATE=y
+# CONFIG_XFRM_STATISTICS is not set
 CONFIG_NET_KEY=y
 CONFIG_NET_KEY_MIGRATE=y
 CONFIG_INET=y
-# CONFIG_IP_MULTICAST is not set
+CONFIG_IP_MULTICAST=y
 # CONFIG_IP_ADVANCED_ROUTER is not set
 CONFIG_IP_FIB_HASH=y
 CONFIG_IP_PNP=y
@@ -322,41 +333,141 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_IP_PNP_RARP is not set
 # CONFIG_NET_IPIP is not set
 # CONFIG_NET_IPGRE is not set
+CONFIG_IP_MROUTE=y
+CONFIG_IP_PIMSM_V1=y
+CONFIG_IP_PIMSM_V2=y
 # CONFIG_ARPD is not set
 # CONFIG_SYN_COOKIES is not set
-# CONFIG_INET_AH is not set
-# CONFIG_INET_ESP is not set
-# CONFIG_INET_IPCOMP is not set
-# CONFIG_INET_XFRM_TUNNEL is not set
-# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_AH=m
+CONFIG_INET_ESP=m
+CONFIG_INET_IPCOMP=m
+CONFIG_INET_XFRM_TUNNEL=m
+CONFIG_INET_TUNNEL=m
 CONFIG_INET_XFRM_MODE_TRANSPORT=m
 CONFIG_INET_XFRM_MODE_TUNNEL=m
 CONFIG_INET_XFRM_MODE_BEET=y
+# CONFIG_INET_LRO is not set
 CONFIG_INET_DIAG=y
 CONFIG_INET_TCP_DIAG=y
 # CONFIG_TCP_CONG_ADVANCED is not set
 CONFIG_TCP_CONG_CUBIC=y
 CONFIG_DEFAULT_TCP_CONG="cubic"
 CONFIG_TCP_MD5SIG=y
-# CONFIG_IPV6 is not set
-# CONFIG_INET6_XFRM_TUNNEL is not set
-# CONFIG_INET6_TUNNEL is not set
+CONFIG_IP_VS=m
+# CONFIG_IP_VS_DEBUG is not set
+CONFIG_IP_VS_TAB_BITS=12
+
+#
+# IPVS transport protocol load balancing support
+#
+CONFIG_IP_VS_PROTO_TCP=y
+CONFIG_IP_VS_PROTO_UDP=y
+CONFIG_IP_VS_PROTO_ESP=y
+CONFIG_IP_VS_PROTO_AH=y
+
+#
+# IPVS scheduler
+#
+CONFIG_IP_VS_RR=m
+CONFIG_IP_VS_WRR=m
+CONFIG_IP_VS_LC=m
+CONFIG_IP_VS_WLC=m
+CONFIG_IP_VS_LBLC=m
+CONFIG_IP_VS_LBLCR=m
+CONFIG_IP_VS_DH=m
+CONFIG_IP_VS_SH=m
+CONFIG_IP_VS_SED=m
+CONFIG_IP_VS_NQ=m
+
+#
+# IPVS application helper
+#
+CONFIG_IP_VS_FTP=m
+CONFIG_IPV6=m
+CONFIG_IPV6_PRIVACY=y
+CONFIG_IPV6_ROUTER_PREF=y
+CONFIG_IPV6_ROUTE_INFO=y
+CONFIG_IPV6_OPTIMISTIC_DAD=y
+CONFIG_INET6_AH=m
+CONFIG_INET6_ESP=m
+CONFIG_INET6_IPCOMP=m
+CONFIG_IPV6_MIP6=m
+CONFIG_INET6_XFRM_TUNNEL=m
+CONFIG_INET6_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m
+CONFIG_IPV6_SIT=m
+CONFIG_IPV6_TUNNEL=m
+CONFIG_IPV6_MULTIPLE_TABLES=y
+CONFIG_IPV6_SUBTREES=y
 CONFIG_NETWORK_SECMARK=y
-# CONFIG_NETFILTER is not set
-
-#
-# DCCP Configuration (EXPERIMENTAL)
-#
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+# CONFIG_NETFILTER_ADVANCED is not set
+
+#
+# Core Netfilter Configuration
+#
+CONFIG_NETFILTER_NETLINK=m
+CONFIG_NETFILTER_NETLINK_LOG=m
+CONFIG_NF_CONNTRACK=m
+CONFIG_NF_CONNTRACK_SECMARK=y
+CONFIG_NF_CONNTRACK_FTP=m
+CONFIG_NF_CONNTRACK_IRC=m
+CONFIG_NF_CONNTRACK_SIP=m
+CONFIG_NF_CT_NETLINK=m
+CONFIG_NETFILTER_XTABLES=m
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+CONFIG_NETFILTER_XT_TARGET_NFLOG=m
+CONFIG_NETFILTER_XT_TARGET_SECMARK=m
+CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m
+CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
+CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+CONFIG_NETFILTER_XT_MATCH_POLICY=m
+CONFIG_NETFILTER_XT_MATCH_STATE=m
+
+#
+# IP: Netfilter Configuration
+#
+CONFIG_NF_CONNTRACK_IPV4=m
+CONFIG_NF_CONNTRACK_PROC_COMPAT=y
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_NF_NAT=m
+CONFIG_NF_NAT_NEEDED=y
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_NF_NAT_FTP=m
+CONFIG_NF_NAT_IRC=m
+# CONFIG_NF_NAT_TFTP is not set
+# CONFIG_NF_NAT_AMANDA is not set
+# CONFIG_NF_NAT_PPTP is not set
+# CONFIG_NF_NAT_H323 is not set
+CONFIG_NF_NAT_SIP=m
+CONFIG_IP_NF_MANGLE=m
+
+#
+# IPv6: Netfilter Configuration
+#
+CONFIG_NF_CONNTRACK_IPV6=m
+CONFIG_IP6_NF_IPTABLES=m
+CONFIG_IP6_NF_MATCH_IPV6HEADER=m
+CONFIG_IP6_NF_FILTER=m
+CONFIG_IP6_NF_TARGET_LOG=m
+CONFIG_IP6_NF_TARGET_REJECT=m
+CONFIG_IP6_NF_MANGLE=m
 # CONFIG_IP_DCCP is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP_SCTP is not set
-
-#
-# TIPC Configuration (EXPERIMENTAL)
-#
+CONFIG_IP_SCTP=m
+# CONFIG_SCTP_DBG_MSG is not set
+# CONFIG_SCTP_DBG_OBJCNT is not set
+# CONFIG_SCTP_HMAC_NONE is not set
+# CONFIG_SCTP_HMAC_SHA1 is not set
+CONFIG_SCTP_HMAC_MD5=y
 # CONFIG_TIPC is not set
 # CONFIG_ATM is not set
 # CONFIG_BRIDGE is not set
@@ -369,10 +480,6 @@ CONFIG_NETWORK_SECMARK=y
 # CONFIG_LAPB is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
-
-#
-# QoS and/or fair queueing
-#
 # CONFIG_NET_SCHED is not set
 
 #
@@ -380,9 +487,21 @@ CONFIG_NETWORK_SECMARK=y
 #
 # CONFIG_NET_PKTGEN is not set
 # CONFIG_HAMRADIO is not set
+# CONFIG_CAN is not set
 # CONFIG_IRDA is not set
 # CONFIG_BT is not set
+# CONFIG_AF_RXRPC is not set
+CONFIG_FIB_RULES=y
+
+#
+# Wireless
+#
+# CONFIG_CFG80211 is not set
+# CONFIG_WIRELESS_EXT is not set
+# CONFIG_MAC80211 is not set
 # CONFIG_IEEE80211 is not set
+# CONFIG_RFKILL is not set
+# CONFIG_NET_9P is not set
 
 #
 # Device Drivers
@@ -391,85 +510,70 @@ CONFIG_NETWORK_SECMARK=y
 #
 # Generic Driver Options
 #
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_STANDALONE=y
 CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=m
 # CONFIG_DEBUG_DRIVER is not set
 # CONFIG_DEBUG_DEVRES is not set
 # CONFIG_SYS_HYPERVISOR is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
 # CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
 # CONFIG_MTD is not set
-
-#
-# Parallel port support
-#
 # CONFIG_PARPORT is not set
-
-#
-# Plug and Play support
-#
-# CONFIG_PNPACPI is not set
-
-#
-# Block devices
-#
+CONFIG_BLK_DEV=y
 # CONFIG_BLK_CPQ_DA is not set
 # CONFIG_BLK_CPQ_CISS_DA is not set
 # CONFIG_BLK_DEV_DAC960 is not set
 # CONFIG_BLK_DEV_UMEM is not set
 # CONFIG_BLK_DEV_COW_COMMON is not set
 CONFIG_BLK_DEV_LOOP=m
-# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_CRYPTOLOOP=m
 CONFIG_BLK_DEV_NBD=m
 # CONFIG_BLK_DEV_SX8 is not set
 # CONFIG_BLK_DEV_RAM is not set
-CONFIG_BLK_DEV_INITRD=y
 # CONFIG_CDROM_PKTCDVD is not set
 # CONFIG_ATA_OVER_ETH is not set
-
-#
-# Misc devices
-#
+CONFIG_MISC_DEVICES=y
+# CONFIG_PHANTOM is not set
+# CONFIG_EEPROM_93CX6 is not set
 CONFIG_SGI_IOC4=m
 # CONFIG_TIFM_CORE is not set
-
-#
-# ATA/ATAPI/MFM/RLL support
-#
+# CONFIG_ENCLOSURE_SERVICES is not set
+CONFIG_HAVE_IDE=y
 CONFIG_IDE=y
 CONFIG_IDE_MAX_HWIFS=4
 CONFIG_BLK_DEV_IDE=y
 
 #
-# Please see Documentation/ide.txt for help/info on IDE drives
+# Please see Documentation/ide/ide.txt for help/info on IDE drives
 #
 # CONFIG_BLK_DEV_IDE_SATA is not set
 CONFIG_BLK_DEV_IDEDISK=y
 # CONFIG_IDEDISK_MULTI_MODE is not set
 CONFIG_BLK_DEV_IDECD=y
+CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS=y
 CONFIG_BLK_DEV_IDETAPE=y
 CONFIG_BLK_DEV_IDEFLOPPY=y
+# CONFIG_BLK_DEV_IDESCSI is not set
 # CONFIG_IDE_TASK_IOCTL is not set
+CONFIG_IDE_PROC_FS=y
 
 #
 # IDE chipset support/bugfixes
 #
 CONFIG_IDE_GENERIC=y
+# CONFIG_BLK_DEV_PLATFORM is not set
+CONFIG_BLK_DEV_IDEDMA_SFF=y
+
+#
+# PCI IDE chipsets support
+#
 CONFIG_BLK_DEV_IDEPCI=y
-# CONFIG_IDEPCI_SHARE_IRQ is not set
+CONFIG_IDEPCI_PCIBUS_ORDER=y
 # CONFIG_BLK_DEV_OFFBOARD is not set
 CONFIG_BLK_DEV_GENERIC=y
 # CONFIG_BLK_DEV_OPTI621 is not set
 CONFIG_BLK_DEV_IDEDMA_PCI=y
-# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
-# CONFIG_IDEDMA_PCI_AUTO is not set
 # CONFIG_BLK_DEV_AEC62XX is not set
 # CONFIG_BLK_DEV_ALI15X3 is not set
 # CONFIG_BLK_DEV_AMD74XX is not set
@@ -495,87 +599,196 @@ CONFIG_BLK_DEV_IT8213=m
 # CONFIG_BLK_DEV_VIA82CXXX is not set
 CONFIG_BLK_DEV_TC86C001=m
 # CONFIG_BLK_DEV_IDE_SWARM is not set
-# CONFIG_IDE_ARM is not set
 CONFIG_BLK_DEV_IDEDMA=y
-# CONFIG_IDEDMA_IVB is not set
-# CONFIG_IDEDMA_AUTO is not set
+CONFIG_IDE_ARCH_OBSOLETE_INIT=y
 # CONFIG_BLK_DEV_HD is not set
 
 #
 # SCSI device support
 #
 # CONFIG_RAID_ATTRS is not set
-# CONFIG_SCSI is not set
+CONFIG_SCSI=y
+CONFIG_SCSI_DMA=y
+# CONFIG_SCSI_TGT is not set
 # CONFIG_SCSI_NETLINK is not set
-
-#
-# Serial ATA (prod) and Parallel ATA (experimental) drivers
-#
-# CONFIG_ATA is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=y
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
+# CONFIG_BLK_DEV_SR is not set
+# CONFIG_CHR_DEV_SG is not set
+# CONFIG_CHR_DEV_SCH is not set
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+# CONFIG_SCSI_MULTI_LUN is not set
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+# CONFIG_SCSI_SCAN_ASYNC is not set
+CONFIG_SCSI_WAIT_SCAN=m
+
+#
+# SCSI Transports
+#
+# CONFIG_SCSI_SPI_ATTRS is not set
+# CONFIG_SCSI_FC_ATTRS is not set
+# CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+# CONFIG_SCSI_SRP_ATTRS is not set
+CONFIG_SCSI_LOWLEVEL=y
+# CONFIG_ISCSI_TCP is not set
+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+# CONFIG_SCSI_3W_9XXX is not set
+# CONFIG_SCSI_ACARD is not set
+# CONFIG_SCSI_AACRAID is not set
+# CONFIG_SCSI_AIC7XXX is not set
+# CONFIG_SCSI_AIC7XXX_OLD is not set
+# CONFIG_SCSI_AIC79XX is not set
+# CONFIG_SCSI_AIC94XX is not set
+# CONFIG_SCSI_ADVANSYS is not set
+# CONFIG_SCSI_ARCMSR is not set
+# CONFIG_MEGARAID_NEWGEN is not set
+# CONFIG_MEGARAID_LEGACY is not set
+# CONFIG_MEGARAID_SAS is not set
+# CONFIG_SCSI_HPTIOP is not set
+# CONFIG_SCSI_DMX3191D is not set
+# CONFIG_SCSI_FUTURE_DOMAIN is not set
+# CONFIG_SCSI_IPS is not set
+# CONFIG_SCSI_INITIO is not set
+# CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_MVSAS is not set
+# CONFIG_SCSI_STEX is not set
+# CONFIG_SCSI_SYM53C8XX_2 is not set
+# CONFIG_SCSI_IPR is not set
+# CONFIG_SCSI_QLOGIC_1280 is not set
+# CONFIG_SCSI_QLA_FC is not set
+# CONFIG_SCSI_QLA_ISCSI is not set
+# CONFIG_SCSI_LPFC is not set
+# CONFIG_SCSI_DC395x is not set
+# CONFIG_SCSI_DC390T is not set
+# CONFIG_SCSI_DEBUG is not set
+# CONFIG_SCSI_SRP is not set
+CONFIG_ATA=y
+# CONFIG_ATA_NONSTANDARD is not set
+# CONFIG_SATA_AHCI is not set
+# CONFIG_SATA_SVW is not set
+# CONFIG_ATA_PIIX is not set
+# CONFIG_SATA_MV is not set
+# CONFIG_SATA_NV is not set
+# CONFIG_PDC_ADMA is not set
+# CONFIG_SATA_QSTOR is not set
+# CONFIG_SATA_PROMISE is not set
+# CONFIG_SATA_SX4 is not set
+# CONFIG_SATA_SIL is not set
+CONFIG_SATA_SIL24=y
+# CONFIG_SATA_SIS is not set
+# CONFIG_SATA_ULI is not set
+# CONFIG_SATA_VIA is not set
+# CONFIG_SATA_VITESSE is not set
+# CONFIG_SATA_INIC162X is not set
+# CONFIG_PATA_ALI is not set
+# CONFIG_PATA_AMD is not set
+# CONFIG_PATA_ARTOP is not set
+# CONFIG_PATA_ATIIXP is not set
+# CONFIG_PATA_CMD640_PCI is not set
+# CONFIG_PATA_CMD64X is not set
+# CONFIG_PATA_CS5520 is not set
+# CONFIG_PATA_CS5530 is not set
+# CONFIG_PATA_CYPRESS is not set
+# CONFIG_PATA_EFAR is not set
+# CONFIG_ATA_GENERIC is not set
+# CONFIG_PATA_HPT366 is not set
+# CONFIG_PATA_HPT37X is not set
+# CONFIG_PATA_HPT3X2N is not set
+# CONFIG_PATA_HPT3X3 is not set
+# CONFIG_PATA_IT821X is not set
+# CONFIG_PATA_IT8213 is not set
+# CONFIG_PATA_JMICRON is not set
+# CONFIG_PATA_TRIFLEX is not set
+# CONFIG_PATA_MARVELL is not set
+# CONFIG_PATA_MPIIX is not set
+# CONFIG_PATA_OLDPIIX is not set
+# CONFIG_PATA_NETCELL is not set
+# CONFIG_PATA_NINJA32 is not set
+# CONFIG_PATA_NS87410 is not set
+# CONFIG_PATA_NS87415 is not set
+# CONFIG_PATA_OPTI is not set
+# CONFIG_PATA_OPTIDMA is not set
+# CONFIG_PATA_PDC_OLD is not set
+# CONFIG_PATA_RADISYS is not set
+# CONFIG_PATA_RZ1000 is not set
+# CONFIG_PATA_SC1200 is not set
+# CONFIG_PATA_SERVERWORKS is not set
+# CONFIG_PATA_PDC2027X is not set
+CONFIG_PATA_SIL680=y
+# CONFIG_PATA_SIS is not set
+# CONFIG_PATA_VIA is not set
+# CONFIG_PATA_WINBOND is not set
+# CONFIG_PATA_PLATFORM is not set
 # CONFIG_MD is not set
-
-#
-# Fusion MPT device support
-#
 # CONFIG_FUSION is not set
 
 #
 # IEEE 1394 (FireWire) support
 #
+# CONFIG_FIREWIRE is not set
 # CONFIG_IEEE1394 is not set
-
-#
-# I2O device support
-#
 # CONFIG_I2O is not set
-
-#
-# Network device support
-#
 CONFIG_NETDEVICES=y
+# CONFIG_NETDEVICES_MULTIQUEUE is not set
 # CONFIG_DUMMY is not set
 # CONFIG_BONDING is not set
+# CONFIG_MACVLAN is not set
 # CONFIG_EQUALIZER is not set
 # CONFIG_TUN is not set
-
-#
-# ARCnet devices
-#
+# CONFIG_VETH is not set
 # CONFIG_ARCNET is not set
-
-#
-# PHY device support
-#
-# CONFIG_PHYLIB is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
+CONFIG_PHYLIB=y
+
+#
+# MII PHY device drivers
+#
+# CONFIG_MARVELL_PHY is not set
+# CONFIG_DAVICOM_PHY is not set
+# CONFIG_QSEMI_PHY is not set
+# CONFIG_LXT_PHY is not set
+# CONFIG_CICADA_PHY is not set
+# CONFIG_VITESSE_PHY is not set
+# CONFIG_SMSC_PHY is not set
+# CONFIG_BROADCOM_PHY is not set
+# CONFIG_ICPLUS_PHY is not set
+# CONFIG_REALTEK_PHY is not set
+# CONFIG_FIXED_PHY is not set
+# CONFIG_MDIO_BITBANG is not set
 CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
+# CONFIG_AX88796 is not set
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
 # CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
 # CONFIG_DM9000 is not set
-
-#
-# Tulip family network device support
-#
 # CONFIG_NET_TULIP is not set
 # CONFIG_HP100 is not set
+# CONFIG_IBM_NEW_EMAC_ZMII is not set
+# CONFIG_IBM_NEW_EMAC_RGMII is not set
+# CONFIG_IBM_NEW_EMAC_TAH is not set
+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
 # CONFIG_NET_PCI is not set
-
-#
-# Ethernet (1000 Mbit)
-#
+# CONFIG_B44 is not set
+CONFIG_NETDEV_1000=y
 # CONFIG_ACENIC is not set
 # CONFIG_DL2K is not set
 # CONFIG_E1000 is not set
+# CONFIG_E1000E is not set
+# CONFIG_E1000E_ENABLED is not set
+# CONFIG_IP1000 is not set
+# CONFIG_IGB is not set
 # CONFIG_NS83820 is not set
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
@@ -585,52 +798,53 @@ CONFIG_SB1250_MAC=y
 # CONFIG_SKGE is not set
 # CONFIG_SKY2 is not set
 # CONFIG_SK98LIN is not set
+# CONFIG_VIA_VELOCITY is not set
 # CONFIG_TIGON3 is not set
 # CONFIG_BNX2 is not set
 # CONFIG_QLA3XXX is not set
 # CONFIG_ATL1 is not set
-
-#
-# Ethernet (10000 Mbit)
-#
+CONFIG_NETDEV_10000=y
 # CONFIG_CHELSIO_T1 is not set
 CONFIG_CHELSIO_T3=m
+# CONFIG_IXGBE is not set
 # CONFIG_IXGB is not set
 # CONFIG_S2IO is not set
 # CONFIG_MYRI10GE is not set
 CONFIG_NETXEN_NIC=m
-
-#
-# Token Ring devices
-#
+# CONFIG_NIU is not set
+# CONFIG_MLX4_CORE is not set
+# CONFIG_TEHUTI is not set
+# CONFIG_BNX2X is not set
 # CONFIG_TR is not set
 
 #
-# Wireless LAN (non-hamradio)
-#
-# CONFIG_NET_RADIO is not set
-
-#
-# Wan interfaces
+# Wireless LAN
 #
+# CONFIG_WLAN_PRE80211 is not set
+# CONFIG_WLAN_80211 is not set
 # CONFIG_WAN is not set
 # CONFIG_FDDI is not set
 # CONFIG_HIPPI is not set
-# CONFIG_PPP is not set
-# CONFIG_SLIP is not set
-# CONFIG_SHAPER is not set
+CONFIG_PPP=m
+CONFIG_PPP_MULTILINK=y
+CONFIG_PPP_FILTER=y
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_SYNC_TTY=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+CONFIG_PPPOE=m
+CONFIG_PPPOL2TP=m
+CONFIG_SLIP=m
+CONFIG_SLIP_COMPRESSED=y
+CONFIG_SLHC=m
+CONFIG_SLIP_SMART=y
+CONFIG_SLIP_MODE_SLIP6=y
+# CONFIG_NET_FC is not set
 # CONFIG_NETCONSOLE is not set
 # CONFIG_NETPOLL is not set
 # CONFIG_NET_POLL_CONTROLLER is not set
-
-#
-# ISDN subsystem
-#
 # CONFIG_ISDN is not set
-
-#
-# Telephony Support
-#
 # CONFIG_PHONE is not set
 
 #
@@ -660,17 +874,16 @@ CONFIG_SERIAL_NONSTANDARD=y
 # CONFIG_DIGIEPCA is not set
 # CONFIG_MOXA_INTELLIO is not set
 # CONFIG_MOXA_SMARTIO is not set
-CONFIG_MOXA_SMARTIO_NEW=m
 # CONFIG_ISI is not set
 # CONFIG_SYNCLINKMP is not set
 # CONFIG_SYNCLINK_GT is not set
 # CONFIG_N_HDLC is not set
+# CONFIG_RISCOM8 is not set
 # CONFIG_SPECIALIX is not set
 # CONFIG_SX is not set
 # CONFIG_RIO is not set
 # CONFIG_STALDRV is not set
-CONFIG_SERIAL_SB1250_DUART=y
-CONFIG_SERIAL_SB1250_DUART_CONSOLE=y
+# CONFIG_NOZOMI is not set
 
 #
 # Serial drivers
@@ -680,39 +893,24 @@ CONFIG_SERIAL_SB1250_DUART_CONSOLE=y
 #
 # Non-8250 serial port support
 #
+CONFIG_SERIAL_SB1250_DUART=y
+CONFIG_SERIAL_SB1250_DUART_CONSOLE=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
 # CONFIG_SERIAL_JSM is not set
 CONFIG_UNIX98_PTYS=y
 CONFIG_LEGACY_PTYS=y
 CONFIG_LEGACY_PTY_COUNT=256
-
-#
-# IPMI
-#
 # CONFIG_IPMI_HANDLER is not set
-
-#
-# Watchdog Cards
-#
-# CONFIG_WATCHDOG is not set
 # CONFIG_HW_RANDOM is not set
 # CONFIG_RTC is not set
-CONFIG_GEN_RTC=y
-# CONFIG_GEN_RTC_X is not set
-# CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 # CONFIG_APPLICOM is not set
-# CONFIG_DRM is not set
 # CONFIG_RAW_DRIVER is not set
-
-#
-# TPM devices
-#
 # CONFIG_TCG_TPM is not set
-
-#
-# I2C support
-#
+CONFIG_DEVPORT=y
 CONFIG_I2C=y
+CONFIG_I2C_BOARDINFO=y
 CONFIG_I2C_CHARDEV=y
 
 #
@@ -736,29 +934,30 @@ CONFIG_I2C_CHARDEV=y
 # CONFIG_I2C_NFORCE2 is not set
 # CONFIG_I2C_OCORES is not set
 # CONFIG_I2C_PARPORT_LIGHT is not set
-# CONFIG_I2C_PASEMI is not set
 # CONFIG_I2C_PROSAVAGE is not set
 # CONFIG_I2C_SAVAGE4 is not set
 CONFIG_I2C_SIBYTE=y
+# CONFIG_I2C_SIMTEC is not set
 # CONFIG_I2C_SIS5595 is not set
 # CONFIG_I2C_SIS630 is not set
 # CONFIG_I2C_SIS96X is not set
+# CONFIG_I2C_TAOS_EVM is not set
 # CONFIG_I2C_STUB is not set
 # CONFIG_I2C_VIA is not set
 # CONFIG_I2C_VIAPRO is not set
 # CONFIG_I2C_VOODOO3 is not set
-# CONFIG_I2C_PCA_ISA is not set
 
 #
 # Miscellaneous I2C Chip support
 #
-CONFIG_SENSORS_DS1337=y
-CONFIG_SENSORS_DS1374=y
+# CONFIG_DS1682 is not set
 CONFIG_SENSORS_EEPROM=y
 CONFIG_SENSORS_PCF8574=y
-CONFIG_SENSORS_PCA9539=y
+# CONFIG_PCF8575 is not set
 CONFIG_SENSORS_PCF8591=y
+# CONFIG_TPS65010 is not set
 CONFIG_SENSORS_MAX6875=y
+# CONFIG_SENSORS_TSL2550 is not set
 CONFIG_I2C_DEBUG_CORE=y
 CONFIG_I2C_DEBUG_ALGO=y
 CONFIG_I2C_DEBUG_BUS=y
@@ -769,43 +968,49 @@ CONFIG_I2C_DEBUG_CHIP=y
 #
 # CONFIG_SPI is not set
 # CONFIG_SPI_MASTER is not set
+# CONFIG_W1 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+# CONFIG_THERMAL is not set
+# CONFIG_WATCHDOG is not set
 
 #
-# Dallas's 1-wire bus
+# Sonics Silicon Backplane
 #
-# CONFIG_W1 is not set
+CONFIG_SSB_POSSIBLE=y
+# CONFIG_SSB is not set
 
 #
-# Hardware Monitoring support
+# Multifunction device drivers
 #
-# CONFIG_HWMON is not set
-# CONFIG_HWMON_VID is not set
+# CONFIG_MFD_SM501 is not set
 
 #
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
+# CONFIG_DVB_CORE is not set
+# CONFIG_DAB is not set
 
 #
 # Graphics support
 #
-# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_DRM is not set
+# CONFIG_VGASTATE is not set
+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
 # CONFIG_FB is not set
 # CONFIG_BACKLIGHT_LCD_SUPPORT is not set
 
 #
-# Sound
+# Display device support
 #
-# CONFIG_SOUND is not set
+# CONFIG_DISPLAY_SUPPORT is not set
 
 #
-# USB support
+# Sound
 #
+# CONFIG_SOUND is not set
+CONFIG_USB_SUPPORT=y
 CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 CONFIG_USB_ARCH_HAS_EHCI=y
@@ -814,104 +1019,73 @@ CONFIG_USB_ARCH_HAS_EHCI=y
 #
 # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
 #
-
-#
-# USB Gadget Support
-#
 # CONFIG_USB_GADGET is not set
-
-#
-# MMC/SD Card support
-#
 # CONFIG_MMC is not set
-
-#
-# LED devices
-#
+# CONFIG_MEMSTICK is not set
 # CONFIG_NEW_LEDS is not set
-
-#
-# LED drivers
-#
-
-#
-# LED Triggers
-#
-
-#
-# InfiniBand support
-#
 # CONFIG_INFINIBAND is not set
-
-#
-# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
-#
-
-#
-# Real Time Clock
-#
+CONFIG_RTC_LIB=y
 # CONFIG_RTC_CLASS is not set
 
 #
-# DMA Engine support
-#
-# CONFIG_DMA_ENGINE is not set
-
-#
-# DMA Clients
-#
-
-#
-# DMA Devices
-#
-
-#
-# Auxiliary Display support
-#
-
-#
-# Virtualization
+# Userspace I/O
 #
+# CONFIG_UIO is not set
 
 #
 # File systems
 #
-CONFIG_EXT2_FS=y
+CONFIG_EXT2_FS=m
 CONFIG_EXT2_FS_XATTR=y
-CONFIG_EXT2_FS_POSIX_ACL=y
-CONFIG_EXT2_FS_SECURITY=y
+# CONFIG_EXT2_FS_POSIX_ACL is not set
+# CONFIG_EXT2_FS_SECURITY is not set
 # CONFIG_EXT2_FS_XIP is not set
-# CONFIG_EXT3_FS is not set
+CONFIG_EXT3_FS=y
+CONFIG_EXT3_FS_XATTR=y
+# CONFIG_EXT3_FS_POSIX_ACL is not set
+# CONFIG_EXT3_FS_SECURITY is not set
 # CONFIG_EXT4DEV_FS is not set
+CONFIG_JBD=y
 CONFIG_FS_MBCACHE=y
 # CONFIG_REISERFS_FS is not set
 # CONFIG_JFS_FS is not set
-CONFIG_FS_POSIX_ACL=y
+# CONFIG_FS_POSIX_ACL is not set
 # CONFIG_XFS_FS is not set
 # CONFIG_GFS2_FS is not set
 # CONFIG_OCFS2_FS is not set
-# CONFIG_MINIX_FS is not set
-# CONFIG_ROMFS_FS is not set
+CONFIG_DNOTIFY=y
 CONFIG_INOTIFY=y
 CONFIG_INOTIFY_USER=y
-# CONFIG_QUOTA is not set
-CONFIG_DNOTIFY=y
-# CONFIG_AUTOFS_FS is not set
-# CONFIG_AUTOFS4_FS is not set
-# CONFIG_FUSE_FS is not set
+CONFIG_QUOTA=y
+CONFIG_QUOTA_NETLINK_INTERFACE=y
+# CONFIG_PRINT_QUOTA_WARNING is not set
+# CONFIG_QFMT_V1 is not set
+CONFIG_QFMT_V2=m
+CONFIG_QUOTACTL=y
+CONFIG_AUTOFS_FS=m
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
 
 #
 # CD-ROM/DVD Filesystems
 #
-# CONFIG_ISO9660_FS is not set
-# CONFIG_UDF_FS is not set
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+CONFIG_ZISOFS=y
+CONFIG_UDF_FS=m
+CONFIG_UDF_NLS=y
 
 #
 # DOS/FAT/NT Filesystems
 #
-# CONFIG_MSDOS_FS is not set
-# CONFIG_VFAT_FS is not set
-# CONFIG_NTFS_FS is not set
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+CONFIG_NTFS_FS=m
+# CONFIG_NTFS_DEBUG is not set
+CONFIG_NTFS_RW=y
 
 #
 # Pseudo filesystems
@@ -923,7 +1097,6 @@ CONFIG_SYSFS=y
 CONFIG_TMPFS=y
 # CONFIG_TMPFS_POSIX_ACL is not set
 # CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
 CONFIG_CONFIGFS_FS=m
 
 #
@@ -939,14 +1112,13 @@ CONFIG_CONFIGFS_FS=m
 # CONFIG_EFS_FS is not set
 # CONFIG_CRAMFS is not set
 # CONFIG_VXFS_FS is not set
+# CONFIG_MINIX_FS is not set
 # CONFIG_HPFS_FS is not set
 # CONFIG_QNX4FS_FS is not set
+# CONFIG_ROMFS_FS is not set
 # CONFIG_SYSV_FS is not set
 # CONFIG_UFS_FS is not set
-
-#
-# Network File Systems
-#
+CONFIG_NETWORK_FILESYSTEMS=y
 CONFIG_NFS_FS=y
 CONFIG_NFS_V3=y
 # CONFIG_NFS_V3_ACL is not set
@@ -958,6 +1130,7 @@ CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
 CONFIG_NFS_COMMON=y
 CONFIG_SUNRPC=y
+# CONFIG_SUNRPC_BIND34 is not set
 # CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_RPCSEC_GSS_SPKM3 is not set
 # CONFIG_SMB_FS is not set
@@ -965,37 +1138,61 @@ CONFIG_SUNRPC=y
 # CONFIG_NCP_FS is not set
 # CONFIG_CODA_FS is not set
 # CONFIG_AFS_FS is not set
-# CONFIG_9P_FS is not set
 
 #
 # Partition Types
 #
 # CONFIG_PARTITION_ADVANCED is not set
 CONFIG_MSDOS_PARTITION=y
-
-#
-# Native Language Support
-#
-# CONFIG_NLS is not set
-
-#
-# Distributed Lock Manager
-#
+CONFIG_NLS=m
+CONFIG_NLS_DEFAULT="iso8859-1"
+CONFIG_NLS_CODEPAGE_437=m
+CONFIG_NLS_CODEPAGE_737=m
+CONFIG_NLS_CODEPAGE_775=m
+CONFIG_NLS_CODEPAGE_850=m
+CONFIG_NLS_CODEPAGE_852=m
+CONFIG_NLS_CODEPAGE_855=m
+CONFIG_NLS_CODEPAGE_857=m
+CONFIG_NLS_CODEPAGE_860=m
+CONFIG_NLS_CODEPAGE_861=m
+CONFIG_NLS_CODEPAGE_862=m
+CONFIG_NLS_CODEPAGE_863=m
+CONFIG_NLS_CODEPAGE_864=m
+CONFIG_NLS_CODEPAGE_865=m
+CONFIG_NLS_CODEPAGE_866=m
+CONFIG_NLS_CODEPAGE_869=m
+CONFIG_NLS_CODEPAGE_936=m
+CONFIG_NLS_CODEPAGE_950=m
+CONFIG_NLS_CODEPAGE_932=m
+CONFIG_NLS_CODEPAGE_949=m
+CONFIG_NLS_CODEPAGE_874=m
+CONFIG_NLS_ISO8859_8=m
+CONFIG_NLS_CODEPAGE_1250=m
+CONFIG_NLS_CODEPAGE_1251=m
+CONFIG_NLS_ASCII=m
+CONFIG_NLS_ISO8859_1=m
+CONFIG_NLS_ISO8859_2=m
+CONFIG_NLS_ISO8859_3=m
+CONFIG_NLS_ISO8859_4=m
+CONFIG_NLS_ISO8859_5=m
+CONFIG_NLS_ISO8859_6=m
+CONFIG_NLS_ISO8859_7=m
+CONFIG_NLS_ISO8859_9=m
+CONFIG_NLS_ISO8859_13=m
+CONFIG_NLS_ISO8859_14=m
+CONFIG_NLS_ISO8859_15=m
+CONFIG_NLS_KOI8_R=m
+CONFIG_NLS_KOI8_U=m
+CONFIG_NLS_UTF8=m
 CONFIG_DLM=m
-CONFIG_DLM_TCP=y
-# CONFIG_DLM_SCTP is not set
 # CONFIG_DLM_DEBUG is not set
 
-#
-# Profiling support
-#
-# CONFIG_PROFILING is not set
-
 #
 # Kernel hacking
 #
 CONFIG_TRACE_IRQFLAGS_SUPPORT=y
 # CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_WARN_DEPRECATED=y
 CONFIG_ENABLE_MUST_CHECK=y
 CONFIG_MAGIC_SYSRQ=y
 # CONFIG_UNUSED_SYMBOLS is not set
@@ -1003,8 +1200,8 @@ CONFIG_MAGIC_SYSRQ=y
 # CONFIG_HEADERS_CHECK is not set
 CONFIG_DEBUG_KERNEL=y
 # CONFIG_DEBUG_SHIRQ is not set
-CONFIG_LOG_BUF_SHIFT=16
 CONFIG_DETECT_SOFTLOCKUP=y
+CONFIG_SCHED_DEBUG=y
 # CONFIG_SCHEDSTATS is not set
 # CONFIG_TIMER_STATS is not set
 # CONFIG_DEBUG_SLAB is not set
@@ -1014,15 +1211,19 @@ CONFIG_DETECT_SOFTLOCKUP=y
 CONFIG_DEBUG_MUTEXES=y
 # CONFIG_DEBUG_LOCK_ALLOC is not set
 # CONFIG_PROVE_LOCKING is not set
+# CONFIG_LOCK_STAT is not set
 # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
 # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
 # CONFIG_DEBUG_KOBJECT is not set
 # CONFIG_DEBUG_INFO is not set
 # CONFIG_DEBUG_VM is not set
 # CONFIG_DEBUG_LIST is not set
-CONFIG_FORCED_INLINING=y
+# CONFIG_DEBUG_SG is not set
+# CONFIG_BOOT_PRINTK_DELAY is not set
 # CONFIG_RCU_TORTURE_TEST is not set
-CONFIG_CROSSCOMPILE=y
+# CONFIG_BACKTRACE_SELF_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_SAMPLES is not set
 CONFIG_CMDLINE=""
 # CONFIG_DEBUG_STACK_USAGE is not set
 # CONFIG_SB1XXX_CORELIS is not set
@@ -1034,23 +1235,22 @@ CONFIG_CMDLINE=""
 CONFIG_KEYS=y
 CONFIG_KEYS_DEBUG_PROC_KEYS=y
 # CONFIG_SECURITY is not set
-
-#
-# Cryptographic options
-#
+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
 CONFIG_CRYPTO=y
 CONFIG_CRYPTO_ALGAPI=y
-CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_AEAD=m
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_SEQIV=m
 CONFIG_CRYPTO_HASH=y
 CONFIG_CRYPTO_MANAGER=y
 CONFIG_CRYPTO_HMAC=y
 CONFIG_CRYPTO_XCBC=m
 CONFIG_CRYPTO_NULL=y
-CONFIG_CRYPTO_MD4=y
+CONFIG_CRYPTO_MD4=m
 CONFIG_CRYPTO_MD5=y
-CONFIG_CRYPTO_SHA1=y
-CONFIG_CRYPTO_SHA256=y
-CONFIG_CRYPTO_SHA512=y
+CONFIG_CRYPTO_SHA1=m
+CONFIG_CRYPTO_SHA256=m
+CONFIG_CRYPTO_SHA512=m
 CONFIG_CRYPTO_WP512=m
 CONFIG_CRYPTO_TGR192=m
 CONFIG_CRYPTO_GF128MUL=m
@@ -1058,39 +1258,50 @@ CONFIG_CRYPTO_ECB=m
 CONFIG_CRYPTO_CBC=m
 CONFIG_CRYPTO_PCBC=m
 CONFIG_CRYPTO_LRW=m
-CONFIG_CRYPTO_DES=y
+CONFIG_CRYPTO_XTS=m
+CONFIG_CRYPTO_CTR=m
+CONFIG_CRYPTO_GCM=m
+CONFIG_CRYPTO_CCM=m
+# CONFIG_CRYPTO_CRYPTD is not set
+CONFIG_CRYPTO_DES=m
 CONFIG_CRYPTO_FCRYPT=m
-CONFIG_CRYPTO_BLOWFISH=y
-CONFIG_CRYPTO_TWOFISH=y
-CONFIG_CRYPTO_TWOFISH_COMMON=y
-CONFIG_CRYPTO_SERPENT=y
+CONFIG_CRYPTO_BLOWFISH=m
+CONFIG_CRYPTO_TWOFISH=m
+CONFIG_CRYPTO_TWOFISH_COMMON=m
+CONFIG_CRYPTO_SERPENT=m
 CONFIG_CRYPTO_AES=m
-# CONFIG_CRYPTO_CAST5 is not set
-# CONFIG_CRYPTO_CAST6 is not set
+CONFIG_CRYPTO_CAST5=m
+CONFIG_CRYPTO_CAST6=m
 CONFIG_CRYPTO_TEA=m
-# CONFIG_CRYPTO_ARC4 is not set
+CONFIG_CRYPTO_ARC4=m
 CONFIG_CRYPTO_KHAZAD=m
 CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=y
-CONFIG_CRYPTO_MICHAEL_MIC=y
+CONFIG_CRYPTO_SEED=m
+CONFIG_CRYPTO_SALSA20=m
+CONFIG_CRYPTO_DEFLATE=m
+CONFIG_CRYPTO_MICHAEL_MIC=m
 # CONFIG_CRYPTO_CRC32C is not set
 CONFIG_CRYPTO_CAMELLIA=m
 # CONFIG_CRYPTO_TEST is not set
-
-#
-# Hardware crypto devices
-#
+CONFIG_CRYPTO_AUTHENC=m
+# CONFIG_CRYPTO_LZO is not set
+CONFIG_CRYPTO_HW=y
+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
 
 #
 # Library routines
 #
 CONFIG_BITREVERSE=y
-# CONFIG_CRC_CCITT is not set
+CONFIG_CRC_CCITT=m
 # CONFIG_CRC16 is not set
+# CONFIG_CRC_ITU_T is not set
 CONFIG_CRC32=y
-# CONFIG_LIBCRC32C is not set
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
+# CONFIG_CRC7 is not set
+CONFIG_LIBCRC32C=m
+CONFIG_AUDIT_GENERIC=y
+CONFIG_ZLIB_INFLATE=m
+CONFIG_ZLIB_DEFLATE=m
 CONFIG_PLIST=y
 CONFIG_HAS_IOMEM=y
 CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
index fc4aa07b6d35f8aa9e7542345f3b2f81de55d817..38fa1a194bf4b429f4146ff427239cfa6b6aa0c4 100644 (file)
@@ -15,6 +15,7 @@
 #include <asm/time.h>
 
 DEFINE_SPINLOCK(i8253_lock);
+EXPORT_SYMBOL(i8253_lock);
 
 /*
  * Initialize the PIT timer.
index 9f85d4cecc5b01568fefe151db2309111cf6fc8a..b45a7093ca2d07b65eb57251147fda2d88678591 100644 (file)
@@ -157,6 +157,6 @@ void __init time_init(void)
 {
        plat_time_init();
 
-       if (mips_clockevent_init() || !cpu_has_mfc0_count_bug())
+       if (!mips_clockevent_init() || !cpu_has_mfc0_count_bug())
                init_mips_clocksource();
 }
index eed2dc4273e08a47af6472533ce9f77dea7b5e2d..39804c584eddbaf794a3eda5526bd8122f3bb817 100644 (file)
@@ -262,13 +262,21 @@ void dump_mtregs(void)
 /* Find some VPE program space  */
 static void *alloc_progmem(unsigned long len)
 {
+       void *addr;
+
 #ifdef CONFIG_MIPS_VPE_LOADER_TOM
-       /* this means you must tell linux to use less memory than you physically have */
-       return pfn_to_kaddr(max_pfn);
+       /*
+        * This means you must tell Linux to use less memory than you
+        * physically have, for example by passing a mem= boot argument.
+        */
+       addr = pfn_to_kaddr(max_pfn);
+       memset(addr, 0, len);
 #else
-       // simple grab some mem for now
-       return kmalloc(len, GFP_KERNEL);
+       /* simple grab some mem for now */
+       addr = kzalloc(len, GFP_KERNEL);
 #endif
+
+       return addr;
 }
 
 static void release_progmem(void *ptr)
@@ -884,9 +892,10 @@ static int vpe_elfload(struct vpe * v)
        }
 
        v->load_addr = alloc_progmem(mod.core_size);
-       memset(v->load_addr, 0, mod.core_size);
+       if (!v->load_addr)
+               return -ENOMEM;
 
-       printk("VPE loader: loading to %p\n", v->load_addr);
+       pr_info("VPE loader: loading to %p\n", v->load_addr);
 
        if (relocate) {
                for (i = 0; i < hdr->e_shnum; i++) {
index 3a93d4ce270320501acf029da9a5036e4d4d3d26..382738ca8a0b17d0247e63ceaf0300456f5fff6e 100644 (file)
@@ -307,6 +307,7 @@ static void __cpuinit build_tlb_write_entry(u32 **p, struct uasm_label **l,
        case CPU_R12000:
        case CPU_R14000:
        case CPU_4KC:
+       case CPU_4KEC:
        case CPU_SB1:
        case CPU_SB1A:
        case CPU_4KSC:
index ab68c4318a308554dd3a598cbee493d9096ac08c..87e2c8f54e2d683965854150681a7fa58c6c9941 100644 (file)
@@ -185,8 +185,8 @@ static struct resource bcm1480_mem_resource = {
 
 static struct resource bcm1480_io_resource = {
        .name   = "BCM1480 PCI I/O",
-       .start  = 0x2c000000UL,
-       .end    = 0x2dffffffUL,
+       .start  = A_BCM1480_PHYS_PCI_IO_MATCH_BYTES,
+       .end    = A_BCM1480_PHYS_PCI_IO_MATCH_BYTES + 0x1ffffffUL,
        .flags  = IORESOURCE_IO,
 };
 
@@ -194,6 +194,7 @@ struct pci_controller bcm1480_controller = {
        .pci_ops        = &bcm1480_pci_ops,
        .mem_resource   = &bcm1480_mem_resource,
        .io_resource    = &bcm1480_io_resource,
+       .io_offset      = A_BCM1480_PHYS_PCI_IO_MATCH_BYTES,
 };
 
 
@@ -251,6 +252,7 @@ static int __init bcm1480_pcibios_init(void)
 
        bcm1480_controller.io_map_base = (unsigned long)
                ioremap(A_BCM1480_PHYS_PCI_IO_MATCH_BYTES, 65536);
+       bcm1480_controller.io_map_base -= bcm1480_controller.io_offset;
        set_io_port_base(bcm1480_controller.io_map_base);
        isa_slot_offset = (unsigned long)
                ioremap(A_BCM1480_PHYS_PCI_MEM_MATCH_BYTES, 1024*1024);
index 005e7fecab08935934010ee7fde1d0e699643fe7..f54f45412b0baf9d1d9a5e0789b24f18ce28ee23 100644 (file)
@@ -180,8 +180,8 @@ static struct resource bcm1480ht_mem_resource = {
 
 static struct resource bcm1480ht_io_resource = {
        .name   = "BCM1480 HT I/O",
-       .start  = 0x00000000UL,
-       .end    = 0x01ffffffUL,
+       .start  = A_BCM1480_PHYS_HT_IO_MATCH_BYTES,
+       .end    = A_BCM1480_PHYS_HT_IO_MATCH_BYTES + 0x01ffffffUL,
        .flags  = IORESOURCE_IO,
 };
 
@@ -191,29 +191,22 @@ struct pci_controller bcm1480ht_controller = {
        .io_resource    = &bcm1480ht_io_resource,
        .index          = 1,
        .get_busno      = bcm1480ht_pcibios_get_busno,
+       .io_offset      = A_BCM1480_PHYS_HT_IO_MATCH_BYTES,
 };
 
 static int __init bcm1480ht_pcibios_init(void)
 {
-       uint32_t cmdreg;
-
        ht_cfg_space = ioremap(A_BCM1480_PHYS_HT_CFG_MATCH_BITS, 16*1024*1024);
 
-       /*
-        * See if the PCI bus has been configured by the firmware.
-        */
-       cmdreg = READCFG32(CFGOFFSET(0, PCI_DEVFN(PCI_BRIDGE_DEVICE, 0),
-                                    PCI_COMMAND));
-       if (!(cmdreg & PCI_COMMAND_MASTER)) {
-               printk("HT: Skipping HT probe. Bus is not initialized.\n");
-               iounmap(ht_cfg_space);
-               return 1; /* XXX */
-       }
+       /* CFE doesn't always init all HT paths, so we always scan */
        bcm1480ht_bus_status |= PCI_BUS_ENABLED;
 
        ht_eoi_space = (unsigned long)
                ioremap(A_BCM1480_PHYS_HT_SPECIAL_MATCH_BYTES,
                        4 * 1024 * 1024);
+       bcm1480ht_controller.io_map_base = (unsigned long)
+               ioremap(A_BCM1480_PHYS_HT_IO_MATCH_BYTES, 65536);
+       bcm1480ht_controller.io_map_base -= bcm1480ht_controller.io_offset;
 
        register_pci_controller(&bcm1480ht_controller);
 
index 12720489e458313d0c13ff17494d8a843f9a7724..8d2cd1de57265c947a340396613dd2b83ff1e5a7 100644 (file)
@@ -72,9 +72,6 @@ config SYS_SUPPORTS_NUMA
 config SYS_SUPPORTS_PCI
        bool
 
-config ARCH_MAY_HAVE_PC_FDC
-       bool
-
 config STACKTRACE_SUPPORT
        def_bool y
 
index 3dda24daa0a8ed66242cc9063a2364f88c90f2fe..89b408620dcbbfb68d2e3f02a534fc22e86f3a64 100644 (file)
@@ -44,7 +44,7 @@ KERNEL_ENTRY  := $(shell /bin/bash -c 'printf "0x%08x" \
 
 quiet_cmd_uimage = UIMAGE  $@
       cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A sh -O linux -T kernel \
-                  -C none -a $(KERNEL_LOAD) -e $(KERNEL_ENTRY) \
+                  -C gzip -a $(KERNEL_LOAD) -e $(KERNEL_ENTRY) \
                   -n 'Linux-$(KERNELRELEASE)' -d $< $@
 
 $(obj)/uImage: $(obj)/vmlinux.bin.gz FORCE
index ff99562456fbe50f80308f479c960d617fb662bb..5627c0b3ffa82e2c9496fec63eeeb2861eade897 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/signal.h>
 #include <asm/processor.h>
 #include <asm/io.h>
+#include <asm/fpu.h>
 
 /* The PR (precision) bit in the FP Status Register must be clear when
  * an frchg instruction is executed, otherwise the instruction is undefined.
index 817f9939cda69242bd88032ffb6e18dd8262d2eb..8020796139f17ef45a7f860cacea8ac24018f6da 100644 (file)
@@ -16,6 +16,7 @@
 #include <asm/cpu/fpu.h>
 #include <asm/processor.h>
 #include <asm/system.h>
+#include <asm/fpu.h>
 
 /* The PR (precision) bit in the FP Status Register must be clear when
  * an frchg instruction is executed, otherwise the instruction is undefined.
index 30b76a94abf2aedaf326fcc8ffd8d19746f227a9..dd4f51ffb50ea81f9af6f0931d27f050a55a1498 100644 (file)
@@ -17,6 +17,7 @@
 #include <asm/processor.h>
 #include <asm/user.h>
 #include <asm/io.h>
+#include <asm/fpu.h>
 
 /*
  * Initially load the FPU with signalling NANS.  This bit pattern
index 4a8a4083ff0b6a75ed166f454c5a1d3513819e09..1db7ce0f25d4a9c5089e6011984c3eba05356e16 100644 (file)
@@ -1,5 +1,6 @@
 #include <linux/elfcore.h>
 #include <linux/sched.h>
+#include <asm/fpu.h>
 
 /*
  * Capture the user space registers if the task is not running (in user space)
index 9ab1926b9d10c34e14fd24efb385f046990ee5aa..b98e37a1f54c05229c18eb4d865ff0e6e0e26437 100644 (file)
@@ -25,6 +25,7 @@
 #include <asm/pgalloc.h>
 #include <asm/system.h>
 #include <asm/ubc.h>
+#include <asm/fpu.h>
 
 static int hlt_counter;
 int ubc_usercnt = 0;
index f6b5fbfe75c459acde8d76f310462bd8282f141c..f311551d9a05b253fccd2b2d2ac0b8a78418bd6f 100644 (file)
@@ -29,6 +29,7 @@
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
 #include <asm/cacheflush.h>
+#include <asm/fpu.h>
 
 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
 
index b781d3d54fb8f7ac7c69c358d69abcedb6cab199..756fa24eeefa18ae72da4a4825e8ba7f143cf682 100644 (file)
@@ -516,9 +516,11 @@ static int dma_4u_map_sg(struct device *dev, struct scatterlist *sglist,
        unsigned long flags, handle, prot, ctx;
        dma_addr_t dma_next = 0, dma_addr;
        unsigned int max_seg_size;
+       unsigned long seg_boundary_size;
        int outcount, incount, i;
        struct strbuf *strbuf;
        struct iommu *iommu;
+       unsigned long base_shift;
 
        BUG_ON(direction == DMA_NONE);
 
@@ -549,8 +551,11 @@ static int dma_4u_map_sg(struct device *dev, struct scatterlist *sglist,
        outs->dma_length = 0;
 
        max_seg_size = dma_get_max_seg_size(dev);
+       seg_boundary_size = ALIGN(dma_get_seg_boundary(dev) + 1,
+                                 IO_PAGE_SIZE) >> IO_PAGE_SHIFT;
+       base_shift = iommu->page_table_map_base >> IO_PAGE_SHIFT;
        for_each_sg(sglist, s, nelems, i) {
-               unsigned long paddr, npages, entry, slen;
+               unsigned long paddr, npages, entry, out_entry = 0, slen;
                iopte_t *base;
 
                slen = s->length;
@@ -593,7 +598,9 @@ static int dma_4u_map_sg(struct device *dev, struct scatterlist *sglist,
                         * - allocated dma_addr isn't contiguous to previous allocation
                         */
                        if ((dma_addr != dma_next) ||
-                           (outs->dma_length + s->length > max_seg_size)) {
+                           (outs->dma_length + s->length > max_seg_size) ||
+                           (is_span_boundary(out_entry, base_shift,
+                                             seg_boundary_size, outs, s))) {
                                /* Can't merge: create a new segment */
                                segstart = s;
                                outcount++;
@@ -607,6 +614,7 @@ static int dma_4u_map_sg(struct device *dev, struct scatterlist *sglist,
                        /* This is a new segment, fill entries */
                        outs->dma_address = dma_addr;
                        outs->dma_length = slen;
+                       out_entry = entry;
                }
 
                /* Calculate next page pointer for contiguous check */
index 0713bd58499c1de49d2650877c60f59437b66fd3..f3575a614fa2e643dbcc5f93e3e2e03f26e77e2e 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/mm.h>
 #include <linux/scatterlist.h>
 #include <linux/device.h>
+#include <linux/iommu-helper.h>
 
 #include <asm/iommu.h>
 #include <asm/scatterlist.h>
@@ -45,17 +46,16 @@ static inline unsigned long iommu_num_pages(unsigned long vaddr,
        return npages;
 }
 
-static inline unsigned long calc_npages(struct scatterlist *sglist, int nelems)
+static inline int is_span_boundary(unsigned long entry,
+                                  unsigned long shift,
+                                  unsigned long boundary_size,
+                                  struct scatterlist *outs,
+                                  struct scatterlist *sg)
 {
-       unsigned long i, npages = 0;
-       struct scatterlist *sg;
+       unsigned long paddr = SG_ENT_PHYS_ADDRESS(outs);
+       int nr = iommu_num_pages(paddr, outs->dma_length + sg->length);
 
-       for_each_sg(sglist, sg, nelems, i) {
-               unsigned long paddr = SG_ENT_PHYS_ADDRESS(sg);
-               npages += iommu_num_pages(paddr, sg->length);
-       }
-
-       return npages;
+       return iommu_is_span_boundary(entry, nr, shift, boundary_size);
 }
 
 extern unsigned long iommu_range_alloc(struct device *dev,
index ddca6c6c0b492709193e1a3c8a86dcb30f884fbf..01839706bd520b17c73a548d5225e3b1cc238720 100644 (file)
@@ -335,8 +335,10 @@ static int dma_4v_map_sg(struct device *dev, struct scatterlist *sglist,
        unsigned long flags, handle, prot;
        dma_addr_t dma_next = 0, dma_addr;
        unsigned int max_seg_size;
+       unsigned long seg_boundary_size;
        int outcount, incount, i;
        struct iommu *iommu;
+       unsigned long base_shift;
        long err;
 
        BUG_ON(direction == DMA_NONE);
@@ -362,8 +364,11 @@ static int dma_4v_map_sg(struct device *dev, struct scatterlist *sglist,
        iommu_batch_start(dev, prot, ~0UL);
 
        max_seg_size = dma_get_max_seg_size(dev);
+       seg_boundary_size = ALIGN(dma_get_seg_boundary(dev) + 1,
+                                 IO_PAGE_SIZE) >> IO_PAGE_SHIFT;
+       base_shift = iommu->page_table_map_base >> IO_PAGE_SHIFT;
        for_each_sg(sglist, s, nelems, i) {
-               unsigned long paddr, npages, entry, slen;
+               unsigned long paddr, npages, entry, out_entry = 0, slen;
 
                slen = s->length;
                /* Sanity check */
@@ -406,7 +411,9 @@ static int dma_4v_map_sg(struct device *dev, struct scatterlist *sglist,
                         * - allocated dma_addr isn't contiguous to previous allocation
                         */
                        if ((dma_addr != dma_next) ||
-                           (outs->dma_length + s->length > max_seg_size)) {
+                           (outs->dma_length + s->length > max_seg_size) ||
+                           (is_span_boundary(out_entry, base_shift,
+                                             seg_boundary_size, outs, s))) {
                                /* Can't merge: create a new segment */
                                segstart = s;
                                outcount++;
@@ -420,6 +427,7 @@ static int dma_4v_map_sg(struct device *dev, struct scatterlist *sglist,
                        /* This is a new segment, fill entries */
                        outs->dma_address = dma_addr;
                        outs->dma_length = slen;
+                       out_entry = entry;
                }
 
                /* Calculate next page pointer for contiguous check */
index a0f000b293de6ab3c26f2267ee8d7d40c0fe1d6f..ae24919cba7cf8bef8a0ad4f8455f5c871e3920f 100644 (file)
@@ -23,11 +23,8 @@ DEFINE_PER_CPU(struct mmu_gather, mmu_gathers) = { 0, };
 
 void flush_tlb_pending(void)
 {
-       struct mmu_gather *mp;
+       struct mmu_gather *mp = &get_cpu_var(mmu_gathers);
 
-       preempt_disable();
-
-       mp = &__get_cpu_var(mmu_gathers);
        if (mp->tlb_nr) {
                flush_tsb_user(mp);
 
@@ -43,7 +40,7 @@ void flush_tlb_pending(void)
                mp->tlb_nr = 0;
        }
 
-       preempt_enable();
+       put_cpu_var(mmu_gathers);
 }
 
 void tlb_batch_add(struct mm_struct *mm, unsigned long vaddr, pte_t *ptep, pte_t orig)
index 1344a0ea5cc6c00a89ef9536cbbfda7183d2b28b..5713f7e5cbd266c6db06a8b5311b0ffa97d225b2 100644 (file)
@@ -140,7 +140,7 @@ void blk_queue_bounce_limit(struct request_queue *q, u64 dma_addr)
        /* Assume anything <= 4GB can be handled by IOMMU.
           Actually some IOMMUs can handle everything, but I don't
           know of a way to test this here. */
-       if (b_pfn <= (min_t(u64, 0xffffffff, BLK_BOUNCE_HIGH) >> PAGE_SHIFT))
+       if (b_pfn < (min_t(u64, 0x100000000UL, BLK_BOUNCE_HIGH) >> PAGE_SHIFT))
                dma = 1;
        q->bounce_pfn = max_low_pfn;
 #else
index 0f962ecae91fb68345fe1d916791a78e06a2f2e8..f26da2bfcc15714e0bbc10734aff7a91dae446ac 100644 (file)
@@ -1143,24 +1143,37 @@ static void cfq_put_queue(struct cfq_queue *cfqq)
 }
 
 /*
- * Call func for each cic attached to this ioc. Returns number of cic's seen.
+ * Call func for each cic attached to this ioc.
  */
-static unsigned int
+static void
 call_for_each_cic(struct io_context *ioc,
                  void (*func)(struct io_context *, struct cfq_io_context *))
 {
        struct cfq_io_context *cic;
        struct hlist_node *n;
-       int called = 0;
 
        rcu_read_lock();
-       hlist_for_each_entry_rcu(cic, n, &ioc->cic_list, cic_list) {
+       hlist_for_each_entry_rcu(cic, n, &ioc->cic_list, cic_list)
                func(ioc, cic);
-               called++;
-       }
        rcu_read_unlock();
+}
+
+static void cfq_cic_free_rcu(struct rcu_head *head)
+{
+       struct cfq_io_context *cic;
+
+       cic = container_of(head, struct cfq_io_context, rcu_head);
+
+       kmem_cache_free(cfq_ioc_pool, cic);
+       elv_ioc_count_dec(ioc_count);
+
+       if (ioc_gone && !elv_ioc_count_read(ioc_count))
+               complete(ioc_gone);
+}
 
-       return called;
+static void cfq_cic_free(struct cfq_io_context *cic)
+{
+       call_rcu(&cic->rcu_head, cfq_cic_free_rcu);
 }
 
 static void cic_free_func(struct io_context *ioc, struct cfq_io_context *cic)
@@ -1174,24 +1187,18 @@ static void cic_free_func(struct io_context *ioc, struct cfq_io_context *cic)
        hlist_del_rcu(&cic->cic_list);
        spin_unlock_irqrestore(&ioc->lock, flags);
 
-       kmem_cache_free(cfq_ioc_pool, cic);
+       cfq_cic_free(cic);
 }
 
 static void cfq_free_io_context(struct io_context *ioc)
 {
-       int freed;
-
        /*
-        * ioc->refcount is zero here, so no more cic's are allowed to be
-        * linked into this ioc. So it should be ok to iterate over the known
-        * list, we will see all cic's since no new ones are added.
+        * ioc->refcount is zero here, or we are called from elv_unregister(),
+        * so no more cic's are allowed to be linked into this ioc.  So it
+        * should be ok to iterate over the known list, we will see all cic's
+        * since no new ones are added.
         */
-       freed = call_for_each_cic(ioc, cic_free_func);
-
-       elv_ioc_count_mod(ioc_count, -freed);
-
-       if (ioc_gone && !elv_ioc_count_read(ioc_count))
-               complete(ioc_gone);
+       call_for_each_cic(ioc, cic_free_func);
 }
 
 static void cfq_exit_cfqq(struct cfq_data *cfqd, struct cfq_queue *cfqq)
@@ -1458,15 +1465,6 @@ cfq_get_queue(struct cfq_data *cfqd, int is_sync, struct io_context *ioc,
        return cfqq;
 }
 
-static void cfq_cic_free(struct cfq_io_context *cic)
-{
-       kmem_cache_free(cfq_ioc_pool, cic);
-       elv_ioc_count_dec(ioc_count);
-
-       if (ioc_gone && !elv_ioc_count_read(ioc_count))
-               complete(ioc_gone);
-}
-
 /*
  * We drop cfq io contexts lazily, so we may find a dead one.
  */
@@ -2138,7 +2136,7 @@ static int __init cfq_slab_setup(void)
        if (!cfq_pool)
                goto fail;
 
-       cfq_ioc_pool = KMEM_CACHE(cfq_io_context, SLAB_DESTROY_BY_RCU);
+       cfq_ioc_pool = KMEM_CACHE(cfq_io_context, 0);
        if (!cfq_ioc_pool)
                goto fail;
 
@@ -2286,7 +2284,6 @@ static void __exit cfq_exit(void)
        smp_wmb();
        if (elv_ioc_count_read(ioc_count))
                wait_for_completion(ioc_gone);
-       synchronize_rcu();
        cfq_slab_kill();
 }
 
index 2feb0f239c38179c579cbead01e7fe168d4ea0dd..b63b633e549ce7d42370c7747cdc1fbad1f8fcb8 100644 (file)
@@ -116,13 +116,11 @@ static int crypto_xcbc_digest_update2(struct hash_desc *pdesc,
        struct crypto_xcbc_ctx *ctx = crypto_hash_ctx_aligned(parent);
        struct crypto_cipher *tfm = ctx->child;
        int bs = crypto_hash_blocksize(parent);
-       unsigned int i = 0;
 
-       do {
-
-               struct page *pg = sg_page(&sg[i]);
-               unsigned int offset = sg[i].offset;
-               unsigned int slen = sg[i].length;
+       for (;;) {
+               struct page *pg = sg_page(sg);
+               unsigned int offset = sg->offset;
+               unsigned int slen = sg->length;
 
                if (unlikely(slen > nbytes))
                        slen = nbytes;
@@ -182,8 +180,11 @@ static int crypto_xcbc_digest_update2(struct hash_desc *pdesc,
                        offset = 0;
                        pg++;
                }
-               i++;
-       } while (nbytes>0);
+
+               if (!nbytes)
+                       break;
+               sg = scatterwalk_sg_next(sg);
+       }
 
        return 0;
 }
index d2f71a54726c5c988bdc680a892599966e0744df..71183eea7906fe05424a0500676d31107d119c4e 100644 (file)
@@ -26,21 +26,6 @@ u8 sleep_states[ACPI_S_STATE_COUNT];
 
 #ifdef CONFIG_PM_SLEEP
 static u32 acpi_target_sleep_state = ACPI_STATE_S0;
-static bool acpi_sleep_finish_wake_up;
-
-/*
- * ACPI 2.0 and later want us to execute _PTS after suspending devices, so we
- * allow the user to request that behavior by using the 'acpi_new_pts_ordering'
- * kernel command line option that causes the following variable to be set.
- */
-static bool new_pts_ordering;
-
-static int __init acpi_new_pts_ordering(char *str)
-{
-       new_pts_ordering = true;
-       return 1;
-}
-__setup("acpi_new_pts_ordering", acpi_new_pts_ordering);
 #endif
 
 static int acpi_sleep_prepare(u32 acpi_state)
@@ -91,14 +76,6 @@ static int acpi_pm_begin(suspend_state_t pm_state)
 
        if (sleep_states[acpi_state]) {
                acpi_target_sleep_state = acpi_state;
-               if (new_pts_ordering)
-                       return 0;
-
-               error = acpi_sleep_prepare(acpi_state);
-               if (error)
-                       acpi_target_sleep_state = ACPI_STATE_S0;
-               else
-                       acpi_sleep_finish_wake_up = true;
        } else {
                printk(KERN_ERR "ACPI does not support this state: %d\n",
                        pm_state);
@@ -116,14 +93,11 @@ static int acpi_pm_begin(suspend_state_t pm_state)
 
 static int acpi_pm_prepare(void)
 {
-       if (new_pts_ordering) {
-               int error = acpi_sleep_prepare(acpi_target_sleep_state);
+       int error = acpi_sleep_prepare(acpi_target_sleep_state);
 
-               if (error) {
-                       acpi_target_sleep_state = ACPI_STATE_S0;
-                       return error;
-               }
-               acpi_sleep_finish_wake_up = true;
+       if (error) {
+               acpi_target_sleep_state = ACPI_STATE_S0;
+               return error;
        }
 
        return ACPI_SUCCESS(acpi_hw_disable_all_gpes()) ? 0 : -EFAULT;
@@ -212,7 +186,6 @@ static void acpi_pm_finish(void)
        acpi_set_firmware_waking_vector((acpi_physical_address) 0);
 
        acpi_target_sleep_state = ACPI_STATE_S0;
-       acpi_sleep_finish_wake_up = false;
 
 #ifdef CONFIG_X86
        if (init_8259A_after_S1) {
@@ -229,11 +202,10 @@ static void acpi_pm_finish(void)
 static void acpi_pm_end(void)
 {
        /*
-        * This is necessary in case acpi_pm_finish() is not called directly
-        * during a failing transition to a sleep state.
+        * This is necessary in case acpi_pm_finish() is not called during a
+        * failing transition to a sleep state.
         */
-       if (acpi_sleep_finish_wake_up)
-               acpi_pm_finish();
+       acpi_target_sleep_state = ACPI_STATE_S0;
 }
 
 static int acpi_pm_state_valid(suspend_state_t pm_state)
@@ -285,31 +257,18 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
 #ifdef CONFIG_HIBERNATION
 static int acpi_hibernation_begin(void)
 {
-       int error;
-
        acpi_target_sleep_state = ACPI_STATE_S4;
-       if (new_pts_ordering)
-               return 0;
 
-       error = acpi_sleep_prepare(ACPI_STATE_S4);
-       if (error)
-               acpi_target_sleep_state = ACPI_STATE_S0;
-       else
-               acpi_sleep_finish_wake_up = true;
-
-       return error;
+       return 0;
 }
 
 static int acpi_hibernation_prepare(void)
 {
-       if (new_pts_ordering) {
-               int error = acpi_sleep_prepare(ACPI_STATE_S4);
+       int error = acpi_sleep_prepare(ACPI_STATE_S4);
 
-               if (error) {
-                       acpi_target_sleep_state = ACPI_STATE_S0;
-                       return error;
-               }
-               acpi_sleep_finish_wake_up = true;
+       if (error) {
+               acpi_target_sleep_state = ACPI_STATE_S0;
+               return error;
        }
 
        return ACPI_SUCCESS(acpi_hw_disable_all_gpes()) ? 0 : -EFAULT;
@@ -353,17 +312,15 @@ static void acpi_hibernation_finish(void)
        acpi_set_firmware_waking_vector((acpi_physical_address) 0);
 
        acpi_target_sleep_state = ACPI_STATE_S0;
-       acpi_sleep_finish_wake_up = false;
 }
 
 static void acpi_hibernation_end(void)
 {
        /*
         * This is necessary in case acpi_hibernation_finish() is not called
-        * directly during a failing transition to the sleep state.
+        * during a failing transition to the sleep state.
         */
-       if (acpi_sleep_finish_wake_up)
-               acpi_hibernation_finish();
+       acpi_target_sleep_state = ACPI_STATE_S0;
 }
 
 static int acpi_hibernation_pre_restore(void)
index 47c57a4294b7c8beccb38ee7e4ed62fc388ad4fc..98099f526d82663343bf85bae33781616fe5e651 100644 (file)
@@ -978,6 +978,7 @@ static int fs_open(struct atm_vcc *atm_vcc)
                /* Docs are vague about this atm_hdr field. By the way, the FS
                 * chip makes odd errors if lower bits are set.... -- REW */
                tc->atm_hdr =  (vpi << 20) | (vci << 4); 
+               tmc0 = 0;
                {
                        int pcr = atm_pcr_goal (txtp);
 
index 2e3395b7e8c1cd844488521ebc56e65d504980ad..ffc4a5a419465da6e749a084926b21c69fc2a50b 100644 (file)
@@ -3000,8 +3000,7 @@ he_proc_read(struct atm_dev *dev, loff_t *pos, char *page)
 
 /* eeprom routines  -- see 4.7 */
 
-u8
-read_prom_byte(struct he_dev *he_dev, int addr)
+static u8 read_prom_byte(struct he_dev *he_dev, int addr)
 {
        u32 val = 0, tmp_read = 0;
        int i, j = 0;
index b967919fb7e2e91a763ab8a6c53307f21cbfa443..28d77b5195de011dab09949b36d93b0d205e1008 100644 (file)
@@ -2016,8 +2016,7 @@ idt77252_send_skb(struct atm_vcc *vcc, struct sk_buff *skb, int oam)
        return 0;
 }
 
-int
-idt77252_send(struct atm_vcc *vcc, struct sk_buff *skb)
+static int idt77252_send(struct atm_vcc *vcc, struct sk_buff *skb)
 {
        return idt77252_send_skb(vcc, skb, 0);
 }
@@ -3072,8 +3071,7 @@ idt77252_dev_open(struct idt77252_dev *card)
        return 0;
 }
 
-void
-idt77252_dev_close(struct atm_dev *dev)
+static void idt77252_dev_close(struct atm_dev *dev)
 {
        struct idt77252_dev *card = dev->dev_data;
        u32 conf;
index ef52452640e0b7f9c89594e6a9195653a1eee1a9..670c093ed25f7ce93e0b03ed1d21f124f64d96fc 100644 (file)
@@ -958,6 +958,7 @@ static void ia_suni_pm7345_init (IADEV *iadev)
 
 /***************************** IA_LIB END *****************************/
     
+#ifdef CONFIG_ATM_IA_DEBUG
 static int tcnter = 0;
 static void xdump( u_char*  cp, int  length, char*  prefix )
 {
@@ -992,6 +993,7 @@ static void xdump( u_char*  cp, int  length, char*  prefix )
     }
 
 }  /* close xdump(... */
+#endif /* CONFIG_ATM_IA_DEBUG */
 
   
 static struct atm_dev *ia_boards = NULL;  
index 996d61f0d4602cf0cd942aea5daf54e08739c1cb..ca6d51efd8bb9277419406bff8a6e4835a726eba 100644 (file)
@@ -401,7 +401,8 @@ static void ar_context_tasklet(unsigned long data)
 
        if (d->res_count == 0) {
                size_t size, rest, offset;
-               dma_addr_t buffer_bus;
+               dma_addr_t start_bus;
+               void *start;
 
                /*
                 * This descriptor is finished and we may have a
@@ -410,9 +411,9 @@ static void ar_context_tasklet(unsigned long data)
                 */
 
                offset = offsetof(struct ar_buffer, data);
-               buffer_bus = le32_to_cpu(ab->descriptor.data_address) - offset;
+               start = buffer = ab;
+               start_bus = le32_to_cpu(ab->descriptor.data_address) - offset;
 
-               buffer = ab;
                ab = ab->next;
                d = &ab->descriptor;
                size = buffer + PAGE_SIZE - ctx->pointer;
@@ -427,7 +428,7 @@ static void ar_context_tasklet(unsigned long data)
                        buffer = handle_ar_packet(ctx, buffer);
 
                dma_free_coherent(ohci->card.device, PAGE_SIZE,
-                                 buffer, buffer_bus);
+                                 start, start_bus);
                ar_context_add_page(ctx);
        } else {
                buffer = ctx->pointer;
index 5c85670e2d1643cef897f1fc97c71fcf3380778c..f942ecdd47c873d68ad5cead56439ab8249d5a16 100644 (file)
@@ -1367,7 +1367,8 @@ w83781d_isa_probe(struct platform_device *pdev)
 
        /* Reserve the ISA region */
        res = platform_get_resource(pdev, IORESOURCE_IO, 0);
-       if (!request_region(res->start, W83781D_EXTENT, "w83781d")) {
+       if (!request_region(res->start + W83781D_ADDR_REG_OFFSET, 2,
+                           "w83781d")) {
                err = -EBUSY;
                goto exit;
        }
@@ -1415,7 +1416,7 @@ w83781d_isa_probe(struct platform_device *pdev)
        device_remove_file(&pdev->dev, &dev_attr_name);
        kfree(data);
  exit_release_region:
-       release_region(res->start, W83781D_EXTENT);
+       release_region(res->start + W83781D_ADDR_REG_OFFSET, 2);
  exit:
        return err;
 }
@@ -1429,7 +1430,7 @@ w83781d_isa_remove(struct platform_device *pdev)
        sysfs_remove_group(&pdev->dev.kobj, &w83781d_group);
        sysfs_remove_group(&pdev->dev.kobj, &w83781d_group_opt);
        device_remove_file(&pdev->dev, &dev_attr_name);
-       release_region(data->client.addr, W83781D_EXTENT);
+       release_region(data->client.addr + W83781D_ADDR_REG_OFFSET, 2);
        kfree(data);
 
        return 0;
@@ -1797,8 +1798,17 @@ w83781d_isa_found(unsigned short address)
 {
        int val, save, found = 0;
 
-       if (!request_region(address, W83781D_EXTENT, "w83781d"))
+       /* We have to request the region in two parts because some
+          boards declare base+4 to base+7 as a PNP device */
+       if (!request_region(address, 4, "w83781d")) {
+               pr_debug("w83781d: Failed to request low part of region\n");
                return 0;
+       }
+       if (!request_region(address + 4, 4, "w83781d")) {
+               pr_debug("w83781d: Failed to request high part of region\n");
+               release_region(address, 4);
+               return 0;
+       }
 
 #define REALLY_SLOW_IO
        /* We need the timeouts for at least some W83781D-like
@@ -1871,7 +1881,8 @@ w83781d_isa_found(unsigned short address)
                        val == 0x30 ? "W83782D" : "W83781D", (int)address);
 
  release:
-       release_region(address, W83781D_EXTENT);
+       release_region(address + 4, 4);
+       release_region(address, 4);
        return found;
 }
 
index c36d110b349af2d1a5ee8f591c79ccfe7cfbba31..7d61a9660806c5a3d30e062ec04dc7344dedc6aa 100644 (file)
@@ -63,8 +63,6 @@ static int apmpower_connect(struct input_handler *handler,
        handle->handler = handler;
        handle->name = "apm-power";
 
-       handler->private = handle;
-
        error = input_register_handle(handle);
        if (error) {
                printk(KERN_ERR
@@ -87,11 +85,10 @@ static int apmpower_connect(struct input_handler *handler,
        return 0;
 }
 
-static void apmpower_disconnect(struct input_handle *handler)
+static void apmpower_disconnect(struct input_handle *handle)
 {
-       struct input_handle *handle = handler->private;
-
        input_close_device(handle);
+       input_unregister_handle(handle);
        kfree(handle);
 }
 
index 99562cee827e7c6af548ec2f889b3fc769dd9213..b32984bc516ff271cacbe72b56a60350bef63868 100644 (file)
@@ -124,6 +124,7 @@ static void evdev_free(struct device *dev)
 {
        struct evdev *evdev = container_of(dev, struct evdev, dev);
 
+       input_put_device(evdev->handle.dev);
        kfree(evdev);
 }
 
@@ -853,9 +854,6 @@ static void evdev_cleanup(struct evdev *evdev)
        evdev_hangup(evdev);
        evdev_remove_chrdev(evdev);
 
-       if (evdev->grab)
-               evdev_ungrab(evdev, evdev->grab);
-
        /* evdev is marked dead so no one else accesses evdev->open */
        if (evdev->open) {
                input_flush_device(handle, NULL);
@@ -896,7 +894,7 @@ static int evdev_connect(struct input_handler *handler, struct input_dev *dev,
        evdev->exist = 1;
        evdev->minor = minor;
 
-       evdev->handle.dev = dev;
+       evdev->handle.dev = input_get_device(dev);
        evdev->handle.name = evdev->name;
        evdev->handle.handler = handler;
        evdev->handle.private = evdev;
index 22b2789ef58ad17e30299f5fcbc7f5587d11dba9..65d7077a75a19202288d4bc4484c19ca9b93c5c2 100644 (file)
@@ -171,6 +171,7 @@ static void joydev_free(struct device *dev)
 {
        struct joydev *joydev = container_of(dev, struct joydev, dev);
 
+       input_put_device(joydev->handle.dev);
        kfree(joydev);
 }
 
@@ -750,7 +751,7 @@ static int joydev_connect(struct input_handler *handler, struct input_dev *dev,
        joydev->minor = minor;
 
        joydev->exist = 1;
-       joydev->handle.dev = dev;
+       joydev->handle.dev = input_get_device(dev);
        joydev->handle.name = joydev->name;
        joydev->handle.handler = handler;
        joydev->handle.private = joydev;
index 6224c2fb3b65981aec7e6e8386b587d19ebfaf18..4e651c11c1dad71c64fe033381447cb31212f079 100644 (file)
@@ -50,9 +50,9 @@
 #define KPKDI           0x0048
 
 /* bit definitions */
-#define KPC_MKRN(n)    ((((n) & 0x7) - 1) << 26) /* matrix key row number */
-#define KPC_MKCN(n)    ((((n) & 0x7) - 1) << 23) /* matrix key column number */
-#define KPC_DKN(n)     ((((n) & 0x7) - 1) << 6)  /* direct key number */
+#define KPC_MKRN(n)    ((((n) - 1) & 0x7) << 26) /* matrix key row number */
+#define KPC_MKCN(n)    ((((n) - 1) & 0x7) << 23) /* matrix key column number */
+#define KPC_DKN(n)     ((((n) - 1) & 0x7) << 6)  /* direct key number */
 
 #define KPC_AS          (0x1 << 30)  /* Automatic Scan bit */
 #define KPC_ASACT       (0x1 << 29)  /* Automatic Scan on Activity */
index bbbe5e81adc1036d224925e4809ba05bd0fc22a5..b989748598ae2191cc58f806eb11a19290b847fe 100644 (file)
@@ -414,6 +414,7 @@ static void mousedev_free(struct device *dev)
 {
        struct mousedev *mousedev = container_of(dev, struct mousedev, dev);
 
+       input_put_device(mousedev->handle.dev);
        kfree(mousedev);
 }
 
@@ -865,7 +866,7 @@ static struct mousedev *mousedev_create(struct input_dev *dev,
 
        mousedev->minor = minor;
        mousedev->exist = 1;
-       mousedev->handle.dev = dev;
+       mousedev->handle.dev = input_get_device(dev);
        mousedev->handle.name = mousedev->name;
        mousedev->handle.handler = handler;
        mousedev->handle.private = mousedev;
index 6c0a9c4761ee13ffd2333db779c7b8f42091ea21..4c0b05852cb6f2b7c85ab80013c06af0a73ecba0 100644 (file)
@@ -49,13 +49,13 @@ static void gpio_led_set(struct led_classdev *led_cdev,
        if (led_dat->active_low)
                level = !level;
 
-       /* setting GPIOs with I2C/etc requires a preemptible task context */
+       /* Setting GPIOs with I2C/etc requires a task context, and we don't
+        * seem to have a reliable way to know if we're already in one; so
+        * let's just assume the worst.
+        */
        if (led_dat->can_sleep) {
-               if (preempt_count()) {
-                       led_dat->new_level = level;
-                       schedule_work(&led_dat->work);
-               } else
-                       gpio_set_value_cansleep(led_dat->gpio, level);
+               led_dat->new_level = level;
+               schedule_work(&led_dat->work);
        } else
                gpio_set_value(led_dat->gpio, level);
 }
@@ -79,6 +79,10 @@ static int gpio_led_probe(struct platform_device *pdev)
                cur_led = &pdata->leds[i];
                led_dat = &leds_data[i];
 
+               ret = gpio_request(cur_led->gpio, cur_led->name);
+               if (ret < 0)
+                       goto err;
+
                led_dat->cdev.name = cur_led->name;
                led_dat->cdev.default_trigger = cur_led->default_trigger;
                led_dat->gpio = cur_led->gpio;
@@ -87,10 +91,6 @@ static int gpio_led_probe(struct platform_device *pdev)
                led_dat->cdev.brightness_set = gpio_led_set;
                led_dat->cdev.brightness = LED_OFF;
 
-               ret = gpio_request(led_dat->gpio, led_dat->cdev.name);
-               if (ret < 0)
-                       goto err;
-
                gpio_direction_output(led_dat->gpio, led_dat->active_low);
 
                INIT_WORK(&led_dat->work, gpio_led_work);
index 34e317ced5a346243de25cf65e62577cbd6181bc..57b9e3adc8f0249c831bf93dcbf49658d859d608 100644 (file)
@@ -587,6 +587,8 @@ static struct video_device cadet_radio=
        .vidioc_s_input     = vidioc_s_input,
 };
 
+#ifdef CONFIG_PNP
+
 static struct pnp_device_id cadet_pnp_devices[] = {
        /* ADS Cadet AM/FM Radio Card */
        {.id = "MSM0c24", .driver_data = 0},
@@ -621,6 +623,10 @@ static struct pnp_driver cadet_pnp_driver = {
        .remove         = NULL,
 };
 
+#else
+static struct pnp_driver cadet_pnp_driver;
+#endif
+
 static int cadet_probe(void)
 {
        static int iovals[8]={0x330,0x332,0x334,0x336,0x338,0x33a,0x33c,0x33e};
index a080c149cc6c785737b0f74f30d436867a72204f..fcf8f2d208a843890df86252ee7579f52cfb385e 100644 (file)
@@ -1990,7 +1990,7 @@ static int bttv_g_frequency(struct file *file, void *priv,
        if (0 != err)
                return err;
 
-       f->type = V4L2_TUNER_ANALOG_TV;
+       f->type = btv->radio_user ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
        f->frequency = btv->freq;
 
        return 0;
@@ -2009,7 +2009,8 @@ static int bttv_s_frequency(struct file *file, void *priv,
 
        if (unlikely(f->tuner != 0))
                return -EINVAL;
-       if (unlikely(f->type != V4L2_TUNER_ANALOG_TV))
+       if (unlikely(f->type != (btv->radio_user
+               ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV)))
                return -EINVAL;
        mutex_lock(&btv->lock);
        btv->freq = f->frequency;
@@ -3415,6 +3416,7 @@ static int radio_open(struct inode *inode, struct file *file)
 {
        int minor = iminor(inode);
        struct bttv *btv = NULL;
+       struct bttv_fh *fh;
        unsigned int i;
 
        dprintk("bttv: open minor=%d\n",minor);
@@ -3429,12 +3431,19 @@ static int radio_open(struct inode *inode, struct file *file)
                return -ENODEV;
 
        dprintk("bttv%d: open called (radio)\n",btv->c.nr);
+
+       /* allocate per filehandle data */
+       fh = kmalloc(sizeof(*fh), GFP_KERNEL);
+       if (NULL == fh)
+               return -ENOMEM;
+       file->private_data = fh;
+       *fh = btv->init;
+       v4l2_prio_open(&btv->prio, &fh->prio);
+
        mutex_lock(&btv->lock);
 
        btv->radio_user++;
 
-       file->private_data = btv;
-
        bttv_call_i2c_clients(btv,AUDC_SET_RADIO,NULL);
        audio_input(btv,TVAUDIO_INPUT_RADIO);
 
@@ -3444,7 +3453,8 @@ static int radio_open(struct inode *inode, struct file *file)
 
 static int radio_release(struct inode *inode, struct file *file)
 {
-       struct bttv *btv = file->private_data;
+       struct bttv_fh *fh = file->private_data;
+       struct bttv *btv = fh->btv;
        struct rds_command cmd;
 
        btv->radio_user--;
@@ -3508,8 +3518,12 @@ static int radio_enum_input(struct file *file, void *priv,
 static int radio_g_audio(struct file *file, void *priv,
                                        struct v4l2_audio *a)
 {
+       if (a->index != 0)
+               return -EINVAL;
+
        memset(a, 0, sizeof(*a));
        strcpy(a->name, "Radio");
+
        return 0;
 }
 
@@ -3569,7 +3583,8 @@ static int radio_g_input(struct file *filp, void *priv, unsigned int *i)
 static ssize_t radio_read(struct file *file, char __user *data,
                         size_t count, loff_t *ppos)
 {
-       struct bttv    *btv = file->private_data;
+       struct bttv_fh *fh = file->private_data;
+       struct bttv *btv = fh->btv;
        struct rds_command cmd;
        cmd.block_count = count/3;
        cmd.buffer = data;
@@ -3583,7 +3598,8 @@ static ssize_t radio_read(struct file *file, char __user *data,
 
 static unsigned int radio_poll(struct file *file, poll_table *wait)
 {
-       struct bttv    *btv = file->private_data;
+       struct bttv_fh *fh = file->private_data;
+       struct bttv *btv = fh->btv;
        struct rds_command cmd;
        cmd.instance = file;
        cmd.event_list = wait;
@@ -3599,6 +3615,7 @@ static const struct file_operations radio_fops =
        .open     = radio_open,
        .read     = radio_read,
        .release  = radio_release,
+       .compat_ioctl   = v4l_compat_ioctl32,
        .ioctl    = video_ioctl2,
        .llseek   = no_llseek,
        .poll     = radio_poll,
index 2d414dad5c31ac2b9c184459d6d04a6b42746dce..dfa269838e012d8ceb9d6580d2e39f4e03676171 100644 (file)
@@ -232,6 +232,7 @@ static void hauppauge_eeprom(struct cx23885_dev *dev, u8 *eeprom_data)
        case 78631: /* WinTV-HVR1800 (PCIe, OEM, No IR, No FM, Dual channel ATSC and MPEG2 HW Encoder */
        case 79001: /* WinTV-HVR1250 (PCIe, Retail, IR, full height, ATSC and Basic analog */
        case 79101: /* WinTV-HVR1250 (PCIe, Retail, IR, half height, ATSC and Basic analog */
+       case 79561: /* WinTV-HVR1250 (PCIe, OEM, No IR, half height, ATSC and Basic analog */
        case 79571: /* WinTV-HVR1250 (PCIe, OEM, No IR, full height, ATSC and Basic analog */
        case 79671: /* WinTV-HVR1250 (PCIe, OEM, No IR, half height, ATSC and Basic analog */
                break;
@@ -347,10 +348,13 @@ void cx23885_card_setup(struct cx23885_dev *dev)
        case CX23885_BOARD_HAUPPAUGE_HVR1250:
        case CX23885_BOARD_HAUPPAUGE_HVR1500:
        case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
+               if (dev->i2c_bus[0].i2c_rc == 0)
+                       hauppauge_eeprom(dev, eeprom+0x80);
+               break;
        case CX23885_BOARD_HAUPPAUGE_HVR1800:
        case CX23885_BOARD_HAUPPAUGE_HVR1800lp:
                if (dev->i2c_bus[0].i2c_rc == 0)
-                       hauppauge_eeprom(dev, eeprom+0x80);
+                       hauppauge_eeprom(dev, eeprom+0xc0);
                break;
        }
 
index 8e40c7bcc06d08dbd7ed0363533cf26ab0ff01da..7f10b273598fd460101c995d8af958845f8958ac 100644 (file)
@@ -56,137 +56,6 @@ LIST_HEAD(cx23885_devlist);
 
 #define NO_SYNC_LINE (-1U)
 
-/*
- * CX23885 Assumptions
- * 1 line = 16 bytes of CDT
- * cmds size = 80
- * cdt size = 16 * linesize
- * iqsize = 64
- * maxlines = 6
- *
- * Address Space:
- * 0x00000000 0x00008fff FIFO clusters
- * 0x00010000 0x000104af Channel Management Data Structures
- * 0x000104b0 0x000104ff Free
- * 0x00010500 0x000108bf 15 channels * iqsize
- * 0x000108c0 0x000108ff Free
- * 0x00010900 0x00010e9f IQ's + Cluster Descriptor Tables
- *                       15 channels * (iqsize + (maxlines * linesize))
- * 0x00010ea0 0x00010xxx Free
- */
-
-static struct sram_channel cx23885_sram_channels[] = {
-       [SRAM_CH01] = {
-               .name           = "VID A",
-               .cmds_start     = 0x10000,
-               .ctrl_start     = 0x105b0,
-               .cdt            = 0x107b0,
-               .fifo_start     = 0x40,
-               .fifo_size      = 0x2800,
-               .ptr1_reg       = DMA1_PTR1,
-               .ptr2_reg       = DMA1_PTR2,
-               .cnt1_reg       = DMA1_CNT1,
-               .cnt2_reg       = DMA1_CNT2,
-               .jumponly       = 1,
-       },
-       [SRAM_CH02] = {
-               .name           = "ch2",
-               .cmds_start     = 0x0,
-               .ctrl_start     = 0x0,
-               .cdt            = 0x0,
-               .fifo_start     = 0x0,
-               .fifo_size      = 0x0,
-               .ptr1_reg       = DMA2_PTR1,
-               .ptr2_reg       = DMA2_PTR2,
-               .cnt1_reg       = DMA2_CNT1,
-               .cnt2_reg       = DMA2_CNT2,
-       },
-       [SRAM_CH03] = {
-               .name           = "TS1 B",
-               .cmds_start     = 0x100A0,
-               .ctrl_start     = 0x10630,
-               .cdt            = 0x10870,
-               .fifo_start     = 0x5000,
-               .fifo_size      = 0x1000,
-               .ptr1_reg       = DMA3_PTR1,
-               .ptr2_reg       = DMA3_PTR2,
-               .cnt1_reg       = DMA3_CNT1,
-               .cnt2_reg       = DMA3_CNT2,
-       },
-       [SRAM_CH04] = {
-               .name           = "ch4",
-               .cmds_start     = 0x0,
-               .ctrl_start     = 0x0,
-               .cdt            = 0x0,
-               .fifo_start     = 0x0,
-               .fifo_size      = 0x0,
-               .ptr1_reg       = DMA4_PTR1,
-               .ptr2_reg       = DMA4_PTR2,
-               .cnt1_reg       = DMA4_CNT1,
-               .cnt2_reg       = DMA4_CNT2,
-       },
-       [SRAM_CH05] = {
-               .name           = "ch5",
-               .cmds_start     = 0x0,
-               .ctrl_start     = 0x0,
-               .cdt            = 0x0,
-               .fifo_start     = 0x0,
-               .fifo_size      = 0x0,
-               .ptr1_reg       = DMA5_PTR1,
-               .ptr2_reg       = DMA5_PTR2,
-               .cnt1_reg       = DMA5_CNT1,
-               .cnt2_reg       = DMA5_CNT2,
-       },
-       [SRAM_CH06] = {
-               .name           = "TS2 C",
-               .cmds_start     = 0x10140,
-               .ctrl_start     = 0x10680,
-               .cdt            = 0x108d0,
-               .fifo_start     = 0x6000,
-               .fifo_size      = 0x1000,
-               .ptr1_reg       = DMA5_PTR1,
-               .ptr2_reg       = DMA5_PTR2,
-               .cnt1_reg       = DMA5_CNT1,
-               .cnt2_reg       = DMA5_CNT2,
-       },
-       [SRAM_CH07] = {
-               .name           = "ch7",
-               .cmds_start     = 0x0,
-               .ctrl_start     = 0x0,
-               .cdt            = 0x0,
-               .fifo_start     = 0x0,
-               .fifo_size      = 0x0,
-               .ptr1_reg       = DMA6_PTR1,
-               .ptr2_reg       = DMA6_PTR2,
-               .cnt1_reg       = DMA6_CNT1,
-               .cnt2_reg       = DMA6_CNT2,
-       },
-       [SRAM_CH08] = {
-               .name           = "ch8",
-               .cmds_start     = 0x0,
-               .ctrl_start     = 0x0,
-               .cdt            = 0x0,
-               .fifo_start     = 0x0,
-               .fifo_size      = 0x0,
-               .ptr1_reg       = DMA7_PTR1,
-               .ptr2_reg       = DMA7_PTR2,
-               .cnt1_reg       = DMA7_CNT1,
-               .cnt2_reg       = DMA7_CNT2,
-       },
-       [SRAM_CH09] = {
-               .name           = "ch9",
-               .cmds_start     = 0x0,
-               .ctrl_start     = 0x0,
-               .cdt            = 0x0,
-               .fifo_start     = 0x0,
-               .fifo_size      = 0x0,
-               .ptr1_reg       = DMA8_PTR1,
-               .ptr2_reg       = DMA8_PTR2,
-               .cnt1_reg       = DMA8_CNT1,
-               .cnt2_reg       = DMA8_CNT2,
-       },
-};
-
 /* FIXME, these allocations will change when
  * analog arrives. The be reviewed.
  * CX23887 Assumptions
@@ -754,6 +623,7 @@ static int cx23885_dev_setup(struct cx23885_dev *dev)
        atomic_inc(&dev->refcount);
 
        dev->nr = cx23885_devcount++;
+       dev->sram_channels = cx23887_sram_channels;
        sprintf(dev->name, "cx23885[%d]", dev->nr);
 
        mutex_lock(&devlist);
@@ -763,13 +633,11 @@ static int cx23885_dev_setup(struct cx23885_dev *dev)
        /* Configure the internal memory */
        if(dev->pci->device == 0x8880) {
                dev->bridge = CX23885_BRIDGE_887;
-               dev->sram_channels = cx23887_sram_channels;
                /* Apply a sensible clock frequency for the PCIe bridge */
                dev->clk_freq = 25000000;
        } else
        if(dev->pci->device == 0x8852) {
                dev->bridge = CX23885_BRIDGE_885;
-               dev->sram_channels = cx23885_sram_channels;
                /* Apply a sensible clock frequency for the PCIe bridge */
                dev->clk_freq = 28000000;
        } else
index a545dcaf857f72ee646405aeffff9ced4a3fedd8..0e4549922f26df0bce6ea8a1c3ec4361c97408f5 100644 (file)
@@ -156,3 +156,5 @@ int v4l2_int_ioctl_1(struct v4l2_int_device *d, int cmd, void *arg)
                find_ioctl(d->u.slave, cmd,
                           (v4l2_int_ioctl_func *)no_such_ioctl_1))(d, arg);
 }
+
+MODULE_LICENSE("GPL");
index fe7b5ec09708adac2efa77442066a095608a802a..3a0b20afec7b1b4b1c88a2ed4c9092975b5db6c5 100644 (file)
@@ -2635,7 +2635,7 @@ config NIU
 
 config PASEMI_MAC
        tristate "PA Semi 1/10Gbit MAC"
-       depends on PPC64 && PCI
+       depends on PPC_PASEMI && PCI
        select PHYLIB
        select INET_LRO
        help
index c993a32b3f50c1b0389a90ee193aa7bb24e94ba4..26b2dd5016cd4ecfcd9a94915dfa9cb4744f91f0 100644 (file)
@@ -575,7 +575,6 @@ adjust_head:
 static int bf537mac_hard_start_xmit(struct sk_buff *skb,
                                struct net_device *dev)
 {
-       struct bf537mac_local *lp = netdev_priv(dev);
        unsigned int data;
 
        current_tx_ptr->skb = skb;
@@ -634,7 +633,6 @@ out:
 static void bf537mac_rx(struct net_device *dev)
 {
        struct sk_buff *skb, *new_skb;
-       struct bf537mac_local *lp = netdev_priv(dev);
        unsigned short len;
 
        /* allocate a new skb for next time receive */
index 90a1f31e8e637bd104a09490b8d05db80b0b5acc..979c2d05ff9c91c19ab7dbee9964cfc608afc299 100644 (file)
@@ -341,6 +341,7 @@ static ssize_t bonding_store_slaves(struct device *d,
 
        if (command[0] == '-') {
                dev = NULL;
+               original_mtu = 0;
                bond_for_each_slave(bond, slave, i)
                        if (strnicmp(slave->dev->name, ifname, IFNAMSIZ) == 0) {
                                dev = slave->dev;
index 6f7e3fde9e7cdcbe9fa12c23eb88cad8a3dbee0e..980c2c229a71d5fa9a0b59c5921ad61aaf627f16 100644 (file)
@@ -1854,6 +1854,7 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev)
        struct ring_desc* start_tx;
        struct ring_desc* prev_tx;
        struct nv_skb_map* prev_tx_ctx;
+       unsigned long flags;
 
        /* add fragments to entries count */
        for (i = 0; i < fragments; i++) {
@@ -1863,10 +1864,10 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev)
 
        empty_slots = nv_get_empty_tx_slots(np);
        if (unlikely(empty_slots <= entries)) {
-               spin_lock_irq(&np->lock);
+               spin_lock_irqsave(&np->lock, flags);
                netif_stop_queue(dev);
                np->tx_stop = 1;
-               spin_unlock_irq(&np->lock);
+               spin_unlock_irqrestore(&np->lock, flags);
                return NETDEV_TX_BUSY;
        }
 
@@ -1929,13 +1930,13 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev)
                tx_flags_extra = skb->ip_summed == CHECKSUM_PARTIAL ?
                         NV_TX2_CHECKSUM_L3 | NV_TX2_CHECKSUM_L4 : 0;
 
-       spin_lock_irq(&np->lock);
+       spin_lock_irqsave(&np->lock, flags);
 
        /* set tx flags */
        start_tx->flaglen |= cpu_to_le32(tx_flags | tx_flags_extra);
        np->put_tx.orig = put_tx;
 
-       spin_unlock_irq(&np->lock);
+       spin_unlock_irqrestore(&np->lock, flags);
 
        dprintk(KERN_DEBUG "%s: nv_start_xmit: entries %d queued for transmission. tx_flags_extra: %x\n",
                dev->name, entries, tx_flags_extra);
@@ -1971,6 +1972,7 @@ static int nv_start_xmit_optimized(struct sk_buff *skb, struct net_device *dev)
        struct ring_desc_ex* prev_tx;
        struct nv_skb_map* prev_tx_ctx;
        struct nv_skb_map* start_tx_ctx;
+       unsigned long flags;
 
        /* add fragments to entries count */
        for (i = 0; i < fragments; i++) {
@@ -1980,10 +1982,10 @@ static int nv_start_xmit_optimized(struct sk_buff *skb, struct net_device *dev)
 
        empty_slots = nv_get_empty_tx_slots(np);
        if (unlikely(empty_slots <= entries)) {
-               spin_lock_irq(&np->lock);
+               spin_lock_irqsave(&np->lock, flags);
                netif_stop_queue(dev);
                np->tx_stop = 1;
-               spin_unlock_irq(&np->lock);
+               spin_unlock_irqrestore(&np->lock, flags);
                return NETDEV_TX_BUSY;
        }
 
@@ -2059,7 +2061,7 @@ static int nv_start_xmit_optimized(struct sk_buff *skb, struct net_device *dev)
                        start_tx->txvlan = 0;
        }
 
-       spin_lock_irq(&np->lock);
+       spin_lock_irqsave(&np->lock, flags);
 
        if (np->tx_limit) {
                /* Limit the number of outstanding tx. Setup all fragments, but
@@ -2085,7 +2087,7 @@ static int nv_start_xmit_optimized(struct sk_buff *skb, struct net_device *dev)
        start_tx->flaglen |= cpu_to_le32(tx_flags | tx_flags_extra);
        np->put_tx.ex = put_tx;
 
-       spin_unlock_irq(&np->lock);
+       spin_unlock_irqrestore(&np->lock, flags);
 
        dprintk(KERN_DEBUG "%s: nv_start_xmit_optimized: entries %d queued for transmission. tx_flags_extra: %x\n",
                dev->name, entries, tx_flags_extra);
index 0789802d59ed3314dd304feb8bfa6ba637790b9b..378a239634955163fdf6e991725179746ea651a1 100644 (file)
@@ -1242,8 +1242,8 @@ static int emac_close(struct net_device *ndev)
 static inline u16 emac_tx_csum(struct emac_instance *dev,
                               struct sk_buff *skb)
 {
-       if (emac_has_feature(dev, EMAC_FTR_HAS_TAH &&
-                            skb->ip_summed == CHECKSUM_PARTIAL)) {
+       if (emac_has_feature(dev, EMAC_FTR_HAS_TAH) &&
+               (skb->ip_summed == CHECKSUM_PARTIAL)) {
                ++dev->stats.tx_packets_csum;
                return EMAC_TX_CTRL_TAH_CSUM;
        }
index fee3d7b1febaa715e6ba9ab09893a154f9426601..1e965427b0e987faae6ae26bfe3d07e1aad8bfa7 100644 (file)
@@ -903,17 +903,18 @@ plip_interrupt(void *dev_id)
        struct net_local *nl;
        struct plip_local *rcv;
        unsigned char c0;
+       unsigned long flags;
 
        nl = netdev_priv(dev);
        rcv = &nl->rcv_data;
 
-       spin_lock_irq (&nl->lock);
+       spin_lock_irqsave (&nl->lock, flags);
 
        c0 = read_status(dev);
        if ((c0 & 0xf8) != 0xc0) {
                if ((dev->irq != -1) && (net_debug > 1))
                        printk(KERN_DEBUG "%s: spurious interrupt\n", dev->name);
-               spin_unlock_irq (&nl->lock);
+               spin_unlock_irqrestore (&nl->lock, flags);
                return;
        }
 
@@ -942,7 +943,7 @@ plip_interrupt(void *dev_id)
                break;
        }
 
-       spin_unlock_irq(&nl->lock);
+       spin_unlock_irqrestore(&nl->lock, flags);
 }
 
 static int
index 3c915b82e19982455b7b8dd0bdfd704c14ea9e98..c082cf0b1ac6dd3f48ec2ee3f37c1c10aaf9a986 100644 (file)
@@ -84,7 +84,7 @@
 #include "s2io.h"
 #include "s2io-regs.h"
 
-#define DRV_VERSION "2.0.26.15-2"
+#define DRV_VERSION "2.0.26.20"
 
 /* S2io Driver name & version. */
 static char s2io_driver_name[] = "Neterion";
index 54c662690f65482b613954918ce499121a84ea61..853bce0ac47827f5298d7d371fcf5d9bc8efd650 100644 (file)
@@ -4329,10 +4329,14 @@ static int sky2_suspend(struct pci_dev *pdev, pm_message_t state)
        if (!hw)
                return 0;
 
+       del_timer_sync(&hw->watchdog_timer);
+       cancel_work_sync(&hw->restart_work);
+
        for (i = 0; i < hw->ports; i++) {
                struct net_device *dev = hw->dev[i];
                struct sky2_port *sky2 = netdev_priv(dev);
 
+               netif_device_detach(dev);
                if (netif_running(dev))
                        sky2_down(dev);
 
@@ -4383,6 +4387,8 @@ static int sky2_resume(struct pci_dev *pdev)
 
        for (i = 0; i < hw->ports; i++) {
                struct net_device *dev = hw->dev[i];
+
+               netif_device_attach(dev);
                if (netif_running(dev)) {
                        err = sky2_up(dev);
                        if (err) {
index 206918bad539b46b12cdc184fcd3b69bb9d5a301..da2206f6021d9881f9bfc362c1d93890c735baf5 100644 (file)
@@ -343,6 +343,12 @@ int __devinit tulip_read_eeprom(struct net_device *dev, int location, int addr_l
        void __iomem *ee_addr = tp->base_addr + CSR9;
        int read_cmd = location | (EE_READ_CMD << addr_len);
 
+       /* If location is past the end of what we can address, don't
+        * read some other location (ie truncate). Just return zero.
+        */
+       if (location > (1 << addr_len) - 1)
+               return 0;
+
        iowrite32(EE_ENB & ~EE_CS, ee_addr);
        iowrite32(EE_ENB, ee_addr);
 
index ed600bf56e786d6186ad64a04ad16c57dcd16c31..82f404b76d81c53f184168154f3c614c7fa30d89 100644 (file)
@@ -1437,6 +1437,7 @@ static int __devinit tulip_init_one (struct pci_dev *pdev,
           EEPROM.
           */
        ee_data = tp->eeprom;
+       memset(ee_data, 0, sizeof(tp->eeprom));
        sum = 0;
        if (chip_idx == LC82C168) {
                for (i = 0; i < 3; i++) {
@@ -1458,8 +1459,12 @@ static int __devinit tulip_init_one (struct pci_dev *pdev,
                /* A serial EEPROM interface, we read now and sort it out later. */
                int sa_offset = 0;
                int ee_addr_size = tulip_read_eeprom(dev, 0xff, 8) & 0x40000 ? 8 : 6;
+               int ee_max_addr = ((1 << ee_addr_size) - 1) * sizeof(u16);
 
-               for (i = 0; i < sizeof(tp->eeprom); i+=2) {
+               if (ee_max_addr > sizeof(tp->eeprom))
+                       ee_max_addr = sizeof(tp->eeprom);
+
+               for (i = 0; i < ee_max_addr ; i += sizeof(u16)) {
                        u16 data = tulip_read_eeprom(dev, i/2, ee_addr_size);
                        ee_data[i] = data & 0xff;
                        ee_data[i + 1] = data >> 8;
index a12c9c41b217e582b43a4a36b11d747821b5f6fe..0604f3faf04338f04e1f0e43a9ba8bfba29fc254 100644 (file)
@@ -129,7 +129,7 @@ config USB_USBNET
 
 config USB_NET_AX8817X
        tristate "ASIX AX88xxx Based USB 2.0 Ethernet Adapters"
-       depends on USB_USBNET && NET_ETHERNET
+       depends on USB_USBNET
        select CRC32
        default y
        help
index 0343b00cf1fd153064a860770d182fcf67b5cabc..01660f68943a8b808d3a578e101a08cc55ba3411 100644 (file)
@@ -354,7 +354,7 @@ static void dm9601_set_multicast(struct net_device *net)
                struct dev_mc_list *mc_list = net->mc_list;
                int i;
 
-               for (i = 0; i < net->mc_count; i++) {
+               for (i = 0; i < net->mc_count; i++, mc_list = mc_list->next) {
                        u32 crc = ether_crc(ETH_ALEN, mc_list->dmi_addr) >> 26;
                        hashes[crc >> 3] |= 1 << (crc & 0x7);
                }
index d1ed68a11e70192ef320c1c15c52c060b952cd4b..b588c890ea70fb56665245fee0b6a32884976284 100644 (file)
@@ -1128,12 +1128,8 @@ pegasus_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
 {
        pegasus_t *pegasus;
 
-       if (in_atomic())
-               return 0;
-
        pegasus = netdev_priv(dev);
        mii_ethtool_gset(&pegasus->mii, ecmd);
-
        return 0;
 }
 
index fb37b809523150d2424710d7cdfdb5c1bff206e7..824df3b5ea4983a504b7eafedf2cfbea25ebda84 100644 (file)
@@ -58,7 +58,7 @@ struct lapbethdev {
        struct net_device_stats stats;          /* some statistics */
 };
 
-static struct list_head lapbeth_devices = LIST_HEAD_INIT(lapbeth_devices);
+static LIST_HEAD(lapbeth_devices);
 
 /* ------------------------------------------------------------------------ */
 
index cfbc1a26f6016d7a59510132254168351b3218c8..948eb1fe916bce053da79fa561b7a9f715c3985e 100644 (file)
@@ -619,6 +619,7 @@ static int setup_rx_descbuffer(struct b43_dmaring *ring,
        }
 
        if (b43_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize, 0)) {
+               b43err(ring->dev->wl, "RX DMA buffer allocation failed\n");
                dev_kfree_skb_any(skb);
                return -EIO;
        }
@@ -874,8 +875,12 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev,
                                                  DMA_TO_DEVICE);
 
                        if (b43_dma_mapping_error(ring, dma_test,
-                                                 b43_txhdr_size(dev), 1))
+                                                 b43_txhdr_size(dev), 1)) {
+
+                               b43err(dev->wl,
+                                      "TXHDR DMA allocation failed\n");
                                goto err_kfree_txhdr_cache;
+                       }
                }
 
                dma_unmap_single(dev->dev->dev,
index b79a6bd5396d8a050d3f69f4fe8a215e0376825c..371e4a11951190e17d2e18597cce5f9844ce23aa 100644 (file)
@@ -91,6 +91,8 @@ static int __devinit b43_pcmcia_probe(struct pcmcia_device *dev)
 
        dev->conf.ConfigBase = parse.config.base;
        dev->conf.Present = parse.config.rmask[0];
+       dev->conf.Attributes = CONF_ENABLE_IRQ;
+       dev->conf.IntType = INT_MEMORY_AND_IO;
 
        dev->io.BasePort2 = 0;
        dev->io.NumPorts2 = 0;
@@ -112,8 +114,8 @@ static int __devinit b43_pcmcia_probe(struct pcmcia_device *dev)
        if (res != CS_SUCCESS)
                goto err_disable;
 
-       dev->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING | IRQ_FIRST_SHARED;
-       dev->irq.IRQInfo1 = IRQ_LEVEL_ID | IRQ_SHARE_ID;
+       dev->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
+       dev->irq.IRQInfo1 = IRQ_LEVEL_ID;
        dev->irq.Handler = NULL; /* The handler is registered later. */
        dev->irq.Instance = NULL;
        res = pcmcia_request_irq(dev, &dev->irq);
index d727de8b96fef956d3020bdde0428336ebb9d7a1..65767570be68a4e9e7ee757eff9b9ed093d25a7a 100644 (file)
@@ -4589,7 +4589,7 @@ static u8 iwl4965_is_fat_tx_allowed(struct iwl4965_priv *priv,
 
        if (sta_ht_inf) {
                if ((!sta_ht_inf->ht_supported) ||
-                  (!sta_ht_inf->cap & IEEE80211_HT_CAP_SUP_WIDTH))
+                  (!(sta_ht_inf->cap & IEEE80211_HT_CAP_SUP_WIDTH)))
                        return 0;
        }
 
index 5a9cadb97503fbf6ab8b4ba68a18d7da4a5e2ed6..038c66a98f15c4609cc165be05788b926bdea329 100644 (file)
@@ -677,9 +677,7 @@ sbi_get_int_status_exit:
 
        /* Card has a command result for us */
        if (*ireg & IF_CS_C_S_CMD_UPLD_RDY) {
-               spin_lock(&priv->driver_lock);
                ret = if_cs_receive_cmdres(priv, priv->upld_buf, &priv->upld_len);
-               spin_unlock(&priv->driver_lock);
                if (ret < 0)
                        lbs_pr_err("could not receive cmd from card\n");
        }
index bd305f7f3efd64bab4ddaba0e3236f8cfb6e1e13..e873a39fcce350c0d6a47d72c306d7c9007c9eb7 100644 (file)
@@ -1393,11 +1393,20 @@ int rt2x00lib_suspend(struct rt2x00_dev *rt2x00dev, pm_message_t state)
 
 exit:
        /*
-        * Set device mode to sleep for power management.
+        * Set device mode to sleep for power management,
+        * on some hardware this call seems to consistently fail.
+        * From the specifications it is hard to tell why it fails,
+        * and if this is a "bad thing".
+        * Overall it is safe to just ignore the failure and
+        * continue suspending. The only downside is that the
+        * device will not be in optimal power save mode, but with
+        * the radio and the other components already disabled the
+        * device is as good as disabled.
         */
        retval = rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_SLEEP);
        if (retval)
-               return retval;
+               WARNING(rt2x00dev, "Device failed to enter sleep state, "
+                       "continue suspending.\n");
 
        return 0;
 }
index 880c78bff0e14a35e2ac6d6677b213946eca7ee8..ed7e0a1fc34de02d3de7ead9c4f3370928d9c530 100644 (file)
@@ -218,18 +218,24 @@ int scsi_add_host(struct Scsi_Host *shost, struct device *dev)
 
        get_device(&shost->shost_gendev);
 
-       if (shost->transportt->host_size &&
-           (shost->shost_data = kzalloc(shost->transportt->host_size,
-                                        GFP_KERNEL)) == NULL)
-               goto out_del_classdev;
+       if (shost->transportt->host_size) {
+               shost->shost_data = kzalloc(shost->transportt->host_size,
+                                        GFP_KERNEL);
+               if (shost->shost_data == NULL) {
+                       error = -ENOMEM;
+                       goto out_del_classdev;
+               }
+       }
 
        if (shost->transportt->create_work_queue) {
                snprintf(shost->work_q_name, KOBJ_NAME_LEN, "scsi_wq_%d",
                        shost->host_no);
                shost->work_q = create_singlethread_workqueue(
                                        shost->work_q_name);
-               if (!shost->work_q)
+               if (!shost->work_q) {
+                       error = -EINVAL;
                        goto out_free_shost_data;
+               }
        }
 
        error = scsi_sysfs_add_host(shost);
index 31b9af224243d2e73c54bf2b4c8d19944eee0c30..709a6f75ca9d5c09dc234b0031a2c25396560b0a 100644 (file)
@@ -295,11 +295,14 @@ static void sas_discover_domain(struct work_struct *work)
        case FANOUT_DEV:
                error = sas_discover_root_expander(dev);
                break;
-#ifdef CONFIG_SCSI_SAS_ATA
        case SATA_DEV:
        case SATA_PM:
+#ifdef CONFIG_SCSI_SAS_ATA
                error = sas_discover_sata(dev);
                break;
+#else
+               SAS_DPRINTK("ATA device seen but CONFIG_SCSI_SAS_ATA=N so cannot attach\n");
+               /* Fall through */
 #endif
        default:
                error = -ENXIO;
index 5ec0665b3a3dd875e9e555def0bd4d2977f4a782..e55b9037adb224286b4a2a0a1f0efd77a2b3b967 100644 (file)
 #include <linux/dma-mapping.h>
 #include <linux/ctype.h>
 #include <scsi/libsas.h>
+#include <scsi/scsi_tcq.h>
+#include <scsi/sas_ata.h>
 #include <asm/io.h>
 
 #define DRV_NAME       "mvsas"
-#define DRV_VERSION    "0.5.1"
-#define _MV_DUMP 0
+#define DRV_VERSION    "0.5.2"
+#define _MV_DUMP       0
 #define MVS_DISABLE_NVRAM
 #define MVS_DISABLE_MSI
 
@@ -52,7 +54,7 @@
        readl(regs + MVS_##reg);                \
        } while (0)
 
-#define MVS_ID_NOT_MAPPED      0xff
+#define MVS_ID_NOT_MAPPED      0x7f
 #define MVS_CHIP_SLOT_SZ       (1U << mvi->chip->slot_width)
 
 /* offset for D2H FIS in the Received FIS List Structure */
@@ -84,6 +86,7 @@ enum driver_configuration {
        MVS_RX_FIS_COUNT        = 17,   /* Optional rx'd FISs (max 17) */
 
        MVS_QUEUE_SIZE          = 30,   /* Support Queue depth */
+       MVS_CAN_QUEUE           = MVS_SLOTS - 1,        /* SCSI Queue depth */
 };
 
 /* unchangeable hardware details */
@@ -358,7 +361,20 @@ enum hw_register_bits {
 
        /* VSR */
        /* PHYMODE 6 (CDB) */
-       PHY_MODE6_DTL_SPEED     = (1U << 27),
+       PHY_MODE6_LATECLK       = (1U << 29),   /* Lock Clock */
+       PHY_MODE6_DTL_SPEED     = (1U << 27),   /* Digital Loop Speed */
+       PHY_MODE6_FC_ORDER      = (1U << 26),   /* Fibre Channel Mode Order*/
+       PHY_MODE6_MUCNT_EN      = (1U << 24),   /* u Count Enable */
+       PHY_MODE6_SEL_MUCNT_LEN = (1U << 22),   /* Training Length Select */
+       PHY_MODE6_SELMUPI       = (1U << 20),   /* Phase Multi Select (init) */
+       PHY_MODE6_SELMUPF       = (1U << 18),   /* Phase Multi Select (final) */
+       PHY_MODE6_SELMUFF       = (1U << 16),   /* Freq Loop Multi Sel(final) */
+       PHY_MODE6_SELMUFI       = (1U << 14),   /* Freq Loop Multi Sel(init) */
+       PHY_MODE6_FREEZE_LOOP   = (1U << 12),   /* Freeze Rx CDR Loop */
+       PHY_MODE6_INT_RXFOFFS   = (1U << 3),    /* Rx CDR Freq Loop Enable */
+       PHY_MODE6_FRC_RXFOFFS   = (1U << 2),    /* Initial Rx CDR Offset */
+       PHY_MODE6_STAU_0D8      = (1U << 1),    /* Rx CDR Freq Loop Saturate */
+       PHY_MODE6_RXSAT_DIS     = (1U << 0),    /* Saturate Ctl */
 };
 
 enum mvs_info_flags {
@@ -511,7 +527,43 @@ enum status_buffer {
 };
 
 enum error_info_rec {
-       CMD_ISS_STPD    =  (1U << 31),  /* Cmd Issue Stopped */
+       CMD_ISS_STPD    = (1U << 31),   /* Cmd Issue Stopped */
+       CMD_PI_ERR      = (1U << 30),   /* Protection info error.  see flags2 */
+       RSP_OVER        = (1U << 29),   /* rsp buffer overflow */
+       RETRY_LIM       = (1U << 28),   /* FIS/frame retry limit exceeded */
+       UNK_FIS         = (1U << 27),   /* unknown FIS */
+       DMA_TERM        = (1U << 26),   /* DMA terminate primitive rx'd */
+       SYNC_ERR        = (1U << 25),   /* SYNC rx'd during frame xmit */
+       TFILE_ERR       = (1U << 24),   /* SATA taskfile Error bit set */
+       R_ERR           = (1U << 23),   /* SATA returned R_ERR prim */
+       RD_OFS          = (1U << 20),   /* Read DATA frame invalid offset */
+       XFER_RDY_OFS    = (1U << 19),   /* XFER_RDY offset error */
+       UNEXP_XFER_RDY  = (1U << 18),   /* unexpected XFER_RDY error */
+       DATA_OVER_UNDER = (1U << 16),   /* data overflow/underflow */
+       INTERLOCK       = (1U << 15),   /* interlock error */
+       NAK             = (1U << 14),   /* NAK rx'd */
+       ACK_NAK_TO      = (1U << 13),   /* ACK/NAK timeout */
+       CXN_CLOSED      = (1U << 12),   /* cxn closed w/out ack/nak */
+       OPEN_TO         = (1U << 11),   /* I_T nexus lost, open cxn timeout */
+       PATH_BLOCKED    = (1U << 10),   /* I_T nexus lost, pathway blocked */
+       NO_DEST         = (1U << 9),    /* I_T nexus lost, no destination */
+       STP_RES_BSY     = (1U << 8),    /* STP resources busy */
+       BREAK           = (1U << 7),    /* break received */
+       BAD_DEST        = (1U << 6),    /* bad destination */
+       BAD_PROTO       = (1U << 5),    /* protocol not supported */
+       BAD_RATE        = (1U << 4),    /* cxn rate not supported */
+       WRONG_DEST      = (1U << 3),    /* wrong destination error */
+       CREDIT_TO       = (1U << 2),    /* credit timeout */
+       WDOG_TO         = (1U << 1),    /* watchdog timeout */
+       BUF_PAR         = (1U << 0),    /* buffer parity error */
+};
+
+enum error_info_rec_2 {
+       SLOT_BSY_ERR    = (1U << 31),   /* Slot Busy Error */
+       GRD_CHK_ERR     = (1U << 14),   /* Guard Check Error */
+       APP_CHK_ERR     = (1U << 13),   /* Application Check error */
+       REF_CHK_ERR     = (1U << 12),   /* Reference Check Error */
+       USR_BLK_NM      = (1U << 0),    /* User Block Number */
 };
 
 struct mvs_chip_info {
@@ -543,28 +595,12 @@ struct mvs_cmd_hdr {
        __le32                  reserved[4];
 };
 
-struct mvs_slot_info {
-       struct sas_task         *task;
-       u32                     n_elem;
-       u32                     tx;
-
-       /* DMA buffer for storing cmd tbl, open addr frame, status buffer,
-        * and PRD table
-        */
-       void                    *buf;
-       dma_addr_t              buf_dma;
-#if _MV_DUMP
-       u32                     cmd_size;
-#endif
-
-       void                    *response;
-};
-
 struct mvs_port {
        struct asd_sas_port     sas_port;
        u8                      port_attached;
        u8                      taskfileset;
        u8                      wide_port_phymap;
+       struct list_head        list;
 };
 
 struct mvs_phy {
@@ -582,6 +618,27 @@ struct mvs_phy {
        u32             frame_rcvd_size;
        u8              frame_rcvd[32];
        u8              phy_attached;
+       enum sas_linkrate       minimum_linkrate;
+       enum sas_linkrate       maximum_linkrate;
+};
+
+struct mvs_slot_info {
+       struct list_head        list;
+       struct sas_task         *task;
+       u32                     n_elem;
+       u32                     tx;
+
+       /* DMA buffer for storing cmd tbl, open addr frame, status buffer,
+        * and PRD table
+        */
+       void                    *buf;
+       dma_addr_t              buf_dma;
+#if _MV_DUMP
+       u32                     cmd_size;
+#endif
+
+       void                    *response;
+       struct mvs_port         *port;
 };
 
 struct mvs_info {
@@ -612,21 +669,14 @@ struct mvs_info {
 
        const struct mvs_chip_info *chip;
 
-       unsigned long           tags[MVS_SLOTS];
+       u8                      tags[MVS_SLOTS];
        struct mvs_slot_info    slot_info[MVS_SLOTS];
                                /* further per-slot information */
        struct mvs_phy          phy[MVS_MAX_PHYS];
        struct mvs_port         port[MVS_MAX_PHYS];
-
-       u32                     can_queue;      /* per adapter */
-       u32                     tag_out;        /*Get*/
-       u32                     tag_in;         /*Give*/
-};
-
-struct mvs_queue_task {
-       struct list_head list;
-
-       void   *uldd_task;
+#ifdef MVS_USE_TASKLET
+       struct tasklet_struct   tasklet;
+#endif
 };
 
 static int mvs_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func,
@@ -641,10 +691,11 @@ static u32 mvs_read_port_irq_mask(struct mvs_info *mvi, u32 port);
 static u32 mvs_is_phy_ready(struct mvs_info *mvi, int i);
 static void mvs_detect_porttype(struct mvs_info *mvi, int i);
 static void mvs_update_phyinfo(struct mvs_info *mvi, int i, int get_st);
+static void mvs_release_task(struct mvs_info *mvi, int phy_no);
 
 static int mvs_scan_finished(struct Scsi_Host *, unsigned long);
 static void mvs_scan_start(struct Scsi_Host *);
-static int mvs_sas_slave_alloc(struct scsi_device *scsi_dev);
+static int mvs_slave_configure(struct scsi_device *sdev);
 
 static struct scsi_transport_template *mvs_stt;
 
@@ -659,7 +710,7 @@ static struct scsi_host_template mvs_sht = {
        .name                   = DRV_NAME,
        .queuecommand           = sas_queuecommand,
        .target_alloc           = sas_target_alloc,
-       .slave_configure        = sas_slave_configure,
+       .slave_configure        = mvs_slave_configure,
        .slave_destroy          = sas_slave_destroy,
        .scan_finished          = mvs_scan_finished,
        .scan_start             = mvs_scan_start,
@@ -674,7 +725,7 @@ static struct scsi_host_template mvs_sht = {
        .use_clustering         = ENABLE_CLUSTERING,
        .eh_device_reset_handler        = sas_eh_device_reset_handler,
        .eh_bus_reset_handler   = sas_eh_bus_reset_handler,
-       .slave_alloc            = mvs_sas_slave_alloc,
+       .slave_alloc            = sas_slave_alloc,
        .target_destroy         = sas_target_destroy,
        .ioctl                  = sas_ioctl,
 };
@@ -709,10 +760,10 @@ static void mvs_hexdump(u32 size, u8 *data, u32 baseaddr)
        printk("\n");
 }
 
+#if _MV_DUMP
 static void mvs_hba_sb_dump(struct mvs_info *mvi, u32 tag,
                                   enum sas_protocol proto)
 {
-#if _MV_DUMP
        u32 offset;
        struct pci_dev *pdev = mvi->pdev;
        struct mvs_slot_info *slot = &mvi->slot_info[tag];
@@ -723,14 +774,14 @@ static void mvs_hba_sb_dump(struct mvs_info *mvi, u32 tag,
                        tag);
        mvs_hexdump(32, (u8 *) slot->response,
                    (u32) slot->buf_dma + offset);
-#endif
 }
+#endif
 
 static void mvs_hba_memory_dump(struct mvs_info *mvi, u32 tag,
                                enum sas_protocol proto)
 {
 #if _MV_DUMP
-       u32 sz, w_ptr, r_ptr;
+       u32 sz, w_ptr;
        u64 addr;
        void __iomem *regs = mvi->regs;
        struct pci_dev *pdev = mvi->pdev;
@@ -738,12 +789,10 @@ static void mvs_hba_memory_dump(struct mvs_info *mvi, u32 tag,
 
        /*Delivery Queue */
        sz = mr32(TX_CFG) & TX_RING_SZ_MASK;
-       w_ptr = mr32(TX_PROD_IDX) & TX_RING_SZ_MASK;
-       r_ptr = mr32(TX_CONS_IDX) & TX_RING_SZ_MASK;
+       w_ptr = slot->tx;
        addr = mr32(TX_HI) << 16 << 16 | mr32(TX_LO);
        dev_printk(KERN_DEBUG, &pdev->dev,
-               "Delivery Queue Size=%04d , WRT_PTR=%04X , RD_PTR=%04X\n",
-               sz, w_ptr, r_ptr);
+               "Delivery Queue Size=%04d , WRT_PTR=%04X\n", sz, w_ptr);
        dev_printk(KERN_DEBUG, &pdev->dev,
                "Delivery Queue Base Address=0x%llX (PA)"
                "(tx_dma=0x%llX), Entry=%04d\n",
@@ -751,11 +800,11 @@ static void mvs_hba_memory_dump(struct mvs_info *mvi, u32 tag,
        mvs_hexdump(sizeof(u32), (u8 *)(&mvi->tx[mvi->tx_prod]),
                        (u32) mvi->tx_dma + sizeof(u32) * w_ptr);
        /*Command List */
-       addr = mr32(CMD_LIST_HI) << 16 << 16 | mr32(CMD_LIST_LO);
+       addr = mvi->slot_dma;
        dev_printk(KERN_DEBUG, &pdev->dev,
                "Command List Base Address=0x%llX (PA)"
                "(slot_dma=0x%llX), Header=%03d\n",
-               addr, mvi->slot_dma, tag);
+               addr, slot->buf_dma, tag);
        dev_printk(KERN_DEBUG, &pdev->dev, "Command Header[%03d]:\n", tag);
        /*mvs_cmd_hdr */
        mvs_hexdump(sizeof(struct mvs_cmd_hdr), (u8 *)(&mvi->slot[tag]),
@@ -779,7 +828,7 @@ static void mvs_hba_memory_dump(struct mvs_info *mvi, u32 tag,
 
 static void mvs_hba_cq_dump(struct mvs_info *mvi)
 {
-#if _MV_DUMP
+#if (_MV_DUMP > 2)
        u64 addr;
        void __iomem *regs = mvi->regs;
        struct pci_dev *pdev = mvi->pdev;
@@ -788,8 +837,8 @@ static void mvs_hba_cq_dump(struct mvs_info *mvi)
 
        /*Completion Queue */
        addr = mr32(RX_HI) << 16 << 16 | mr32(RX_LO);
-       dev_printk(KERN_DEBUG, &pdev->dev, "Completion Task = 0x%08X\n",
-                  (u32) mvi->slot_info[rx_desc & RXQ_SLOT_MASK].task);
+       dev_printk(KERN_DEBUG, &pdev->dev, "Completion Task = 0x%p\n",
+                  mvi->slot_info[rx_desc & RXQ_SLOT_MASK].task);
        dev_printk(KERN_DEBUG, &pdev->dev,
                "Completion List Base Address=0x%llX (PA), "
                "CQ_Entry=%04d, CQ_WP=0x%08X\n",
@@ -854,34 +903,53 @@ static int pci_go_64(struct pci_dev *pdev)
        return rc;
 }
 
+static int mvs_find_tag(struct mvs_info *mvi, struct sas_task *task, u32 *tag)
+{
+       if (task->lldd_task) {
+               struct mvs_slot_info *slot;
+               slot = (struct mvs_slot_info *) task->lldd_task;
+               *tag = slot - mvi->slot_info;
+               return 1;
+       }
+       return 0;
+}
+
 static void mvs_tag_clear(struct mvs_info *mvi, u32 tag)
 {
-       mvi->tag_in = (mvi->tag_in + 1) & (MVS_SLOTS - 1);
-       mvi->tags[mvi->tag_in] = tag;
+       void *bitmap = (void *) &mvi->tags;
+       clear_bit(tag, bitmap);
 }
 
 static void mvs_tag_free(struct mvs_info *mvi, u32 tag)
 {
-       mvi->tag_out = (mvi->tag_out - 1) & (MVS_SLOTS - 1);
+       mvs_tag_clear(mvi, tag);
+}
+
+static void mvs_tag_set(struct mvs_info *mvi, unsigned int tag)
+{
+       void *bitmap = (void *) &mvi->tags;
+       set_bit(tag, bitmap);
 }
 
 static int mvs_tag_alloc(struct mvs_info *mvi, u32 *tag_out)
 {
-       if (mvi->tag_out != mvi->tag_in) {
-               *tag_out = mvi->tags[mvi->tag_out];
-               mvi->tag_out = (mvi->tag_out + 1) & (MVS_SLOTS - 1);
-               return 0;
-       }
-       return -EBUSY;
+       unsigned int index, tag;
+       void *bitmap = (void *) &mvi->tags;
+
+       index = find_first_zero_bit(bitmap, MVS_SLOTS);
+       tag = index;
+       if (tag >= MVS_SLOTS)
+               return -SAS_QUEUE_FULL;
+       mvs_tag_set(mvi, tag);
+       *tag_out = tag;
+       return 0;
 }
 
 static void mvs_tag_init(struct mvs_info *mvi)
 {
        int i;
        for (i = 0; i < MVS_SLOTS; ++i)
-               mvi->tags[i] = i;
-       mvi->tag_out = 0;
-       mvi->tag_in = MVS_SLOTS - 1;
+               mvs_tag_clear(mvi, i);
 }
 
 #ifndef MVS_DISABLE_NVRAM
@@ -1013,10 +1081,21 @@ err_out:
 static void mvs_bytes_dmaed(struct mvs_info *mvi, int i)
 {
        struct mvs_phy *phy = &mvi->phy[i];
+       struct asd_sas_phy *sas_phy = mvi->sas.sas_phy[i];
 
        if (!phy->phy_attached)
                return;
 
+       if (sas_phy->phy) {
+               struct sas_phy *sphy = sas_phy->phy;
+
+               sphy->negotiated_linkrate = sas_phy->linkrate;
+               sphy->minimum_linkrate = phy->minimum_linkrate;
+               sphy->minimum_linkrate_hw = SAS_LINK_RATE_1_5_GBPS;
+               sphy->maximum_linkrate = phy->maximum_linkrate;
+               sphy->maximum_linkrate_hw = SAS_LINK_RATE_3_0_GBPS;
+       }
+
        if (phy->phy_type & PORT_TYPE_SAS) {
                struct sas_identify_frame *id;
 
@@ -1053,80 +1132,149 @@ static void mvs_scan_start(struct Scsi_Host *shost)
        }
 }
 
-static int mvs_sas_slave_alloc(struct scsi_device *scsi_dev)
+static int mvs_slave_configure(struct scsi_device *sdev)
 {
-       int rc;
+       struct domain_device *dev = sdev_to_domain_dev(sdev);
+       int ret = sas_slave_configure(sdev);
 
-       rc = sas_slave_alloc(scsi_dev);
+       if (ret)
+               return ret;
 
-       return rc;
+       if (dev_is_sata(dev)) {
+               /* struct ata_port *ap = dev->sata_dev.ap; */
+               /* struct ata_device *adev = ap->link.device; */
+
+               /* clamp at no NCQ for the time being */
+               /* adev->flags |= ATA_DFLAG_NCQ_OFF; */
+               scsi_adjust_queue_depth(sdev, MSG_SIMPLE_TAG, 1);
+       }
+       return 0;
 }
 
-static void mvs_int_port(struct mvs_info *mvi, int port_no, u32 events)
+static void mvs_int_port(struct mvs_info *mvi, int phy_no, u32 events)
 {
        struct pci_dev *pdev = mvi->pdev;
        struct sas_ha_struct *sas_ha = &mvi->sas;
-       struct mvs_phy *phy = &mvi->phy[port_no];
+       struct mvs_phy *phy = &mvi->phy[phy_no];
        struct asd_sas_phy *sas_phy = &phy->sas_phy;
 
-       phy->irq_status = mvs_read_port_irq_stat(mvi, port_no);
+       phy->irq_status = mvs_read_port_irq_stat(mvi, phy_no);
        /*
        * events is port event now ,
        * we need check the interrupt status which belongs to per port.
        */
        dev_printk(KERN_DEBUG, &pdev->dev,
                "Port %d Event = %X\n",
-               port_no, phy->irq_status);
+               phy_no, phy->irq_status);
 
        if (phy->irq_status & (PHYEV_POOF | PHYEV_DEC_ERR)) {
-               if (!mvs_is_phy_ready(mvi, port_no)) {
+               mvs_release_task(mvi, phy_no);
+               if (!mvs_is_phy_ready(mvi, phy_no)) {
                        sas_phy_disconnected(sas_phy);
                        sas_ha->notify_phy_event(sas_phy, PHYE_LOSS_OF_SIGNAL);
+                       dev_printk(KERN_INFO, &pdev->dev,
+                               "Port %d Unplug Notice\n", phy_no);
+
                } else
                        mvs_phy_control(sas_phy, PHY_FUNC_LINK_RESET, NULL);
        }
        if (!(phy->irq_status & PHYEV_DEC_ERR)) {
                if (phy->irq_status & PHYEV_COMWAKE) {
-                       u32 tmp = mvs_read_port_irq_mask(mvi, port_no);
-                       mvs_write_port_irq_mask(mvi, port_no,
+                       u32 tmp = mvs_read_port_irq_mask(mvi, phy_no);
+                       mvs_write_port_irq_mask(mvi, phy_no,
                                                tmp | PHYEV_SIG_FIS);
                }
                if (phy->irq_status & (PHYEV_SIG_FIS | PHYEV_ID_DONE)) {
-                       phy->phy_status = mvs_is_phy_ready(mvi, port_no);
+                       phy->phy_status = mvs_is_phy_ready(mvi, phy_no);
                        if (phy->phy_status) {
-                               mvs_detect_porttype(mvi, port_no);
+                               mvs_detect_porttype(mvi, phy_no);
 
                                if (phy->phy_type & PORT_TYPE_SATA) {
                                        u32 tmp = mvs_read_port_irq_mask(mvi,
-                                                               port_no);
+                                                               phy_no);
                                        tmp &= ~PHYEV_SIG_FIS;
                                        mvs_write_port_irq_mask(mvi,
-                                                               port_no, tmp);
+                                                               phy_no, tmp);
                                }
 
-                               mvs_update_phyinfo(mvi, port_no, 0);
+                               mvs_update_phyinfo(mvi, phy_no, 0);
                                sas_ha->notify_phy_event(sas_phy,
                                                        PHYE_OOB_DONE);
-                               mvs_bytes_dmaed(mvi, port_no);
+                               mvs_bytes_dmaed(mvi, phy_no);
                        } else {
                                dev_printk(KERN_DEBUG, &pdev->dev,
                                        "plugin interrupt but phy is gone\n");
                                mvs_phy_control(sas_phy, PHY_FUNC_LINK_RESET,
                                                        NULL);
                        }
-               } else if (phy->irq_status & PHYEV_BROAD_CH)
+               } else if (phy->irq_status & PHYEV_BROAD_CH) {
+                       mvs_release_task(mvi, phy_no);
                        sas_ha->notify_port_event(sas_phy,
                                                PORTE_BROADCAST_RCVD);
+               }
        }
-       mvs_write_port_irq_stat(mvi, port_no, phy->irq_status);
+       mvs_write_port_irq_stat(mvi, phy_no, phy->irq_status);
 }
 
 static void mvs_int_sata(struct mvs_info *mvi)
 {
-       /* FIXME */
+       u32 tmp;
+       void __iomem *regs = mvi->regs;
+       tmp = mr32(INT_STAT_SRS);
+       mw32(INT_STAT_SRS, tmp & 0xFFFF);
+}
+
+static void mvs_slot_reset(struct mvs_info *mvi, struct sas_task *task,
+                               u32 slot_idx)
+{
+       void __iomem *regs = mvi->regs;
+       struct domain_device *dev = task->dev;
+       struct asd_sas_port *sas_port = dev->port;
+       struct mvs_port *port = mvi->slot_info[slot_idx].port;
+       u32 reg_set, phy_mask;
+
+       if (!sas_protocol_ata(task->task_proto)) {
+               reg_set = 0;
+               phy_mask = (port->wide_port_phymap) ? port->wide_port_phymap :
+                               sas_port->phy_mask;
+       } else {
+               reg_set = port->taskfileset;
+               phy_mask = sas_port->phy_mask;
+       }
+       mvi->tx[mvi->tx_prod] = cpu_to_le32(TXQ_MODE_I | slot_idx |
+                                       (TXQ_CMD_SLOT_RESET << TXQ_CMD_SHIFT) |
+                                       (phy_mask << TXQ_PHY_SHIFT) |
+                                       (reg_set << TXQ_SRS_SHIFT));
+
+       mw32(TX_PROD_IDX, mvi->tx_prod);
+       mvi->tx_prod = (mvi->tx_prod + 1) & (MVS_CHIP_SLOT_SZ - 1);
+}
+
+static int mvs_sata_done(struct mvs_info *mvi, struct sas_task *task,
+                       u32 slot_idx, int err)
+{
+       struct mvs_port *port = mvi->slot_info[slot_idx].port;
+       struct task_status_struct *tstat = &task->task_status;
+       struct ata_task_resp *resp = (struct ata_task_resp *)tstat->buf;
+       int stat = SAM_GOOD;
+
+       resp->frame_len = sizeof(struct dev_to_host_fis);
+       memcpy(&resp->ending_fis[0],
+              SATA_RECEIVED_D2H_FIS(port->taskfileset),
+              sizeof(struct dev_to_host_fis));
+       tstat->buf_valid_size = sizeof(*resp);
+       if (unlikely(err))
+               stat = SAS_PROTO_RESPONSE;
+       return stat;
 }
 
-static void mvs_slot_free(struct mvs_info *mvi, struct sas_task *task,
+static void mvs_slot_free(struct mvs_info *mvi, u32 rx_desc)
+{
+       u32 slot_idx = rx_desc & RXQ_SLOT_MASK;
+       mvs_tag_clear(mvi, slot_idx);
+}
+
+static void mvs_slot_task_free(struct mvs_info *mvi, struct sas_task *task,
                          struct mvs_slot_info *slot, u32 slot_idx)
 {
        if (!sas_protocol_ata(task->task_proto))
@@ -1149,38 +1297,58 @@ static void mvs_slot_free(struct mvs_info *mvi, struct sas_task *task,
                /* do nothing */
                break;
        }
-
+       list_del(&slot->list);
+       task->lldd_task = NULL;
        slot->task = NULL;
-       mvs_tag_clear(mvi, slot_idx);
+       slot->port = NULL;
 }
 
-static void mvs_slot_err(struct mvs_info *mvi, struct sas_task *task,
+static int mvs_slot_err(struct mvs_info *mvi, struct sas_task *task,
                         u32 slot_idx)
 {
        struct mvs_slot_info *slot = &mvi->slot_info[slot_idx];
-       u64 err_dw0 = *(u32 *) slot->response;
-       void __iomem *regs = mvi->regs;
-       u32 tmp;
+       u32 err_dw0 = le32_to_cpu(*(u32 *) (slot->response));
+       u32 err_dw1 = le32_to_cpu(*(u32 *) (slot->response + 4));
+       int stat = SAM_CHECK_COND;
 
-       if (err_dw0 & CMD_ISS_STPD)
-               if (sas_protocol_ata(task->task_proto)) {
-                       tmp = mr32(INT_STAT_SRS);
-                       mw32(INT_STAT_SRS, tmp & 0xFFFF);
-               }
+       if (err_dw1 & SLOT_BSY_ERR) {
+               stat = SAS_QUEUE_FULL;
+               mvs_slot_reset(mvi, task, slot_idx);
+       }
+       switch (task->task_proto) {
+       case SAS_PROTOCOL_SSP:
+               break;
+       case SAS_PROTOCOL_SMP:
+               break;
+       case SAS_PROTOCOL_SATA:
+       case SAS_PROTOCOL_STP:
+       case SAS_PROTOCOL_SATA | SAS_PROTOCOL_STP:
+               if (err_dw0 & TFILE_ERR)
+                       stat = mvs_sata_done(mvi, task, slot_idx, 1);
+               break;
+       default:
+               break;
+       }
 
-       mvs_hba_sb_dump(mvi, slot_idx, task->task_proto);
+       mvs_hexdump(16, (u8 *) slot->response, 0);
+       return stat;
 }
 
-static int mvs_slot_complete(struct mvs_info *mvi, u32 rx_desc)
+static int mvs_slot_complete(struct mvs_info *mvi, u32 rx_desc, u32 flags)
 {
        u32 slot_idx = rx_desc & RXQ_SLOT_MASK;
        struct mvs_slot_info *slot = &mvi->slot_info[slot_idx];
        struct sas_task *task = slot->task;
-       struct task_status_struct *tstat = &task->task_status;
-       struct mvs_port *port = &mvi->port[task->dev->port->id];
+       struct task_status_struct *tstat;
+       struct mvs_port *port;
        bool aborted;
        void *to;
 
+       if (unlikely(!task || !task->lldd_task))
+               return -1;
+
+       mvs_hba_cq_dump(mvi);
+
        spin_lock(&task->task_state_lock);
        aborted = task->task_state_flags & SAS_TASK_STATE_ABORTED;
        if (!aborted) {
@@ -1190,22 +1358,27 @@ static int mvs_slot_complete(struct mvs_info *mvi, u32 rx_desc)
        }
        spin_unlock(&task->task_state_lock);
 
-       if (aborted)
+       if (aborted) {
+               mvs_slot_task_free(mvi, task, slot, slot_idx);
+               mvs_slot_free(mvi, rx_desc);
                return -1;
+       }
 
+       port = slot->port;
+       tstat = &task->task_status;
        memset(tstat, 0, sizeof(*tstat));
        tstat->resp = SAS_TASK_COMPLETE;
 
-
-       if (unlikely(!port->port_attached)) {
-               tstat->stat = SAS_PHY_DOWN;
+       if (unlikely(!port->port_attached || flags)) {
+               mvs_slot_err(mvi, task, slot_idx);
+               if (!sas_protocol_ata(task->task_proto))
+                       tstat->stat = SAS_PHY_DOWN;
                goto out;
        }
 
        /* error info record present */
-       if ((rx_desc & RXQ_ERR) && (*(u64 *) slot->response)) {
-               tstat->stat = SAM_CHECK_COND;
-               mvs_slot_err(mvi, task, slot_idx);
+       if (unlikely((rx_desc & RXQ_ERR) && (*(u64 *) slot->response))) {
+               tstat->stat = mvs_slot_err(mvi, task, slot_idx);
                goto out;
        }
 
@@ -1242,21 +1415,7 @@ static int mvs_slot_complete(struct mvs_info *mvi, u32 rx_desc)
        case SAS_PROTOCOL_SATA:
        case SAS_PROTOCOL_STP:
        case SAS_PROTOCOL_SATA | SAS_PROTOCOL_STP: {
-                       struct ata_task_resp *resp =
-                           (struct ata_task_resp *)tstat->buf;
-
-                       if ((rx_desc & (RXQ_DONE | RXQ_ERR | RXQ_ATTN)) ==
-                           RXQ_DONE)
-                               tstat->stat = SAM_GOOD;
-                       else
-                               tstat->stat = SAM_CHECK_COND;
-
-                       resp->frame_len = sizeof(struct dev_to_host_fis);
-                       memcpy(&resp->ending_fis[0],
-                              SATA_RECEIVED_D2H_FIS(port->taskfileset),
-                              sizeof(struct dev_to_host_fis));
-                       if (resp->ending_fis[2] & ATA_ERR)
-                               mvs_hexdump(16, resp->ending_fis, 0);
+                       tstat->stat = mvs_sata_done(mvi, task, slot_idx, 0);
                        break;
                }
 
@@ -1266,11 +1425,34 @@ static int mvs_slot_complete(struct mvs_info *mvi, u32 rx_desc)
        }
 
 out:
-       mvs_slot_free(mvi, task, slot, slot_idx);
+       mvs_slot_task_free(mvi, task, slot, slot_idx);
+       if (unlikely(tstat->stat != SAS_QUEUE_FULL))
+               mvs_slot_free(mvi, rx_desc);
+
+       spin_unlock(&mvi->lock);
        task->task_done(task);
+       spin_lock(&mvi->lock);
        return tstat->stat;
 }
 
+static void mvs_release_task(struct mvs_info *mvi, int phy_no)
+{
+       struct list_head *pos, *n;
+       struct mvs_slot_info *slot;
+       struct mvs_phy *phy = &mvi->phy[phy_no];
+       struct mvs_port *port = phy->port;
+       u32 rx_desc;
+
+       if (!port)
+               return;
+
+       list_for_each_safe(pos, n, &port->list) {
+               slot = container_of(pos, struct mvs_slot_info, list);
+               rx_desc = (u32) (slot - mvi->slot_info);
+               mvs_slot_complete(mvi, rx_desc, 1);
+       }
+}
+
 static void mvs_int_full(struct mvs_info *mvi)
 {
        void __iomem *regs = mvi->regs;
@@ -1305,40 +1487,43 @@ static int mvs_int_rx(struct mvs_info *mvi, bool self_clear)
         * we don't have to stall the CPU reading that register.
         * The actual RX ring is offset by one dword, due to this.
         */
-       rx_prod_idx = mr32(RX_CONS_IDX) & RX_RING_SZ_MASK;
-       if (rx_prod_idx == 0xfff) {     /* h/w hasn't touched RX ring yet */
-               mvi->rx_cons = 0xfff;
+       rx_prod_idx = mvi->rx_cons;
+       mvi->rx_cons = le32_to_cpu(mvi->rx[0]);
+       if (mvi->rx_cons == 0xfff)      /* h/w hasn't touched RX ring yet */
                return 0;
-       }
 
        /* The CMPL_Q may come late, read from register and try again
        * note: if coalescing is enabled,
        * it will need to read from register every time for sure
        */
        if (mvi->rx_cons == rx_prod_idx)
-               return 0;
+               mvi->rx_cons = mr32(RX_CONS_IDX) & RX_RING_SZ_MASK;
 
-       if (mvi->rx_cons == 0xfff)
-               mvi->rx_cons = MVS_RX_RING_SZ - 1;
+       if (mvi->rx_cons == rx_prod_idx)
+               return 0;
 
        while (mvi->rx_cons != rx_prod_idx) {
 
                /* increment our internal RX consumer pointer */
-               mvi->rx_cons = (mvi->rx_cons + 1) & (MVS_RX_RING_SZ - 1);
+               rx_prod_idx = (rx_prod_idx + 1) & (MVS_RX_RING_SZ - 1);
 
-               rx_desc = le32_to_cpu(mvi->rx[mvi->rx_cons + 1]);
-
-               mvs_hba_cq_dump(mvi);
+               rx_desc = le32_to_cpu(mvi->rx[rx_prod_idx + 1]);
 
                if (likely(rx_desc & RXQ_DONE))
-                       mvs_slot_complete(mvi, rx_desc);
+                       mvs_slot_complete(mvi, rx_desc, 0);
                if (rx_desc & RXQ_ATTN) {
                        attn = true;
                        dev_printk(KERN_DEBUG, &pdev->dev, "ATTN %X\n",
                                rx_desc);
                } else if (rx_desc & RXQ_ERR) {
+                       if (!(rx_desc & RXQ_DONE))
+                               mvs_slot_complete(mvi, rx_desc, 0);
                        dev_printk(KERN_DEBUG, &pdev->dev, "RXQ_ERR %X\n",
                                rx_desc);
+               } else if (rx_desc & RXQ_SLOT_RESET) {
+                       dev_printk(KERN_DEBUG, &pdev->dev, "Slot reset[%X]\n",
+                               rx_desc);
+                       mvs_slot_free(mvi, rx_desc);
                }
        }
 
@@ -1348,6 +1533,23 @@ static int mvs_int_rx(struct mvs_info *mvi, bool self_clear)
        return 0;
 }
 
+#ifdef MVS_USE_TASKLET
+static void mvs_tasklet(unsigned long data)
+{
+       struct mvs_info *mvi = (struct mvs_info *) data;
+       unsigned long flags;
+
+       spin_lock_irqsave(&mvi->lock, flags);
+
+#ifdef MVS_DISABLE_MSI
+       mvs_int_full(mvi);
+#else
+       mvs_int_rx(mvi, true);
+#endif
+       spin_unlock_irqrestore(&mvi->lock, flags);
+}
+#endif
+
 static irqreturn_t mvs_interrupt(int irq, void *opaque)
 {
        struct mvs_info *mvi = opaque;
@@ -1356,18 +1558,21 @@ static irqreturn_t mvs_interrupt(int irq, void *opaque)
 
        stat = mr32(GBL_INT_STAT);
 
-       /* clear CMD_CMPLT ASAP */
-       mw32_f(INT_STAT, CINT_DONE);
-
        if (stat == 0 || stat == 0xffffffff)
                return IRQ_NONE;
 
+       /* clear CMD_CMPLT ASAP */
+       mw32_f(INT_STAT, CINT_DONE);
+
+#ifndef MVS_USE_TASKLET
        spin_lock(&mvi->lock);
 
        mvs_int_full(mvi);
 
        spin_unlock(&mvi->lock);
-
+#else
+       tasklet_schedule(&mvi->tasklet);
+#endif
        return IRQ_HANDLED;
 }
 
@@ -1376,12 +1581,15 @@ static irqreturn_t mvs_msi_interrupt(int irq, void *opaque)
 {
        struct mvs_info *mvi = opaque;
 
+#ifndef MVS_USE_TASKLET
        spin_lock(&mvi->lock);
 
        mvs_int_rx(mvi, true);
 
        spin_unlock(&mvi->lock);
-
+#else
+       tasklet_schedule(&mvi->tasklet);
+#endif
        return IRQ_HANDLED;
 }
 #endif
@@ -1576,15 +1784,19 @@ static u8 mvs_assign_reg_set(struct mvs_info *mvi, struct mvs_port *port)
        return MVS_ID_NOT_MAPPED;
 }
 
-static u32 mvs_get_ncq_tag(struct sas_task *task)
+static u32 mvs_get_ncq_tag(struct sas_task *task, u32 *tag)
 {
-       u32 tag = 0;
        struct ata_queued_cmd *qc = task->uldd_task;
 
-       if (qc)
-               tag = qc->tag;
+       if (qc) {
+               if (qc->tf.command == ATA_CMD_FPDMA_WRITE ||
+                       qc->tf.command == ATA_CMD_FPDMA_READ) {
+                       *tag = qc->tag;
+                       return 1;
+               }
+       }
 
-       return tag;
+       return 0;
 }
 
 static int mvs_task_prep_ata(struct mvs_info *mvi,
@@ -1628,11 +1840,9 @@ static int mvs_task_prep_ata(struct mvs_info *mvi,
        hdr->flags = cpu_to_le32(flags);
 
        /* FIXME: the low order order 5 bits for the TAG if enable NCQ */
-       if (task->ata_task.use_ncq) {
-               hdr->tags = cpu_to_le32(mvs_get_ncq_tag(task));
-               /*Fill in task file */
-               task->ata_task.fis.sector_count = hdr->tags << 3;
-       } else
+       if (task->ata_task.use_ncq && mvs_get_ncq_tag(task, &hdr->tags))
+               task->ata_task.fis.sector_count |= hdr->tags << 3;
+       else
                hdr->tags = cpu_to_le32(tag);
        hdr->data_len = cpu_to_le32(task->total_xfer_len);
 
@@ -1725,13 +1935,16 @@ static int mvs_task_prep_ssp(struct mvs_info *mvi,
        u32 flags;
        u32 resp_len, req_len, i, tag = tei->tag;
        const u32 max_resp_len = SB_RFB_MAX;
+       u8 phy_mask;
 
        slot = &mvi->slot_info[tag];
 
+       phy_mask = (port->wide_port_phymap) ? port->wide_port_phymap :
+               task->dev->port->phy_mask;
        slot->tx = mvi->tx_prod;
        mvi->tx[mvi->tx_prod] = cpu_to_le32(TXQ_MODE_I | tag |
                                (TXQ_CMD_SSP << TXQ_CMD_SHIFT) |
-                               (port->wide_port_phymap << TXQ_PHY_SHIFT));
+                               (phy_mask << TXQ_PHY_SHIFT));
 
        flags = MCH_RETRY;
        if (task->ssp_task.enable_first_burst) {
@@ -1832,22 +2045,32 @@ static int mvs_task_exec(struct sas_task *task, const int num, gfp_t gfp_flags)
        void __iomem *regs = mvi->regs;
        struct mvs_task_exec_info tei;
        struct sas_task *t = task;
+       struct mvs_slot_info *slot;
        u32 tag = 0xdeadbeef, rc, n_elem = 0;
        unsigned long flags;
        u32 n = num, pass = 0;
 
        spin_lock_irqsave(&mvi->lock, flags);
-
        do {
+               dev = t->dev;
                tei.port = &mvi->port[dev->port->id];
 
                if (!tei.port->port_attached) {
-                       struct task_status_struct *ts = &t->task_status;
-                       ts->stat = SAS_PHY_DOWN;
-                       t->task_done(t);
-                       rc = 0;
-                       goto exec_exit;
+                       if (sas_protocol_ata(t->task_proto)) {
+                               rc = SAS_PHY_DOWN;
+                               goto out_done;
+                       } else {
+                               struct task_status_struct *ts = &t->task_status;
+                               ts->resp = SAS_TASK_UNDELIVERED;
+                               ts->stat = SAS_PHY_DOWN;
+                               t->task_done(t);
+                               if (n > 1)
+                                       t = list_entry(t->list.next,
+                                                       struct sas_task, list);
+                               continue;
+                       }
                }
+
                if (!sas_protocol_ata(t->task_proto)) {
                        if (t->num_scatter) {
                                n_elem = pci_map_sg(mvi->pdev, t->scatter,
@@ -1866,9 +2089,10 @@ static int mvs_task_exec(struct sas_task *task, const int num, gfp_t gfp_flags)
                if (rc)
                        goto err_out;
 
-               mvi->slot_info[tag].task = t;
-               mvi->slot_info[tag].n_elem = n_elem;
-               memset(mvi->slot_info[tag].buf, 0, MVS_SLOT_BUF_SZ);
+               slot = &mvi->slot_info[tag];
+               t->lldd_task = NULL;
+               slot->n_elem = n_elem;
+               memset(slot->buf, 0, MVS_SLOT_BUF_SZ);
                tei.task = t;
                tei.hdr = &mvi->slot[tag];
                tei.tag = tag;
@@ -1897,28 +2121,26 @@ static int mvs_task_exec(struct sas_task *task, const int num, gfp_t gfp_flags)
                if (rc)
                        goto err_out_tag;
 
+               slot->task = t;
+               slot->port = tei.port;
+               t->lldd_task = (void *) slot;
+               list_add_tail(&slot->list, &slot->port->list);
                /* TODO: select normal or high priority */
 
                spin_lock(&t->task_state_lock);
                t->task_state_flags |= SAS_TASK_AT_INITIATOR;
                spin_unlock(&t->task_state_lock);
 
-               if (n == 1) {
-                       spin_unlock_irqrestore(&mvi->lock, flags);
-                       mw32(TX_PROD_IDX, mvi->tx_prod);
-               }
                mvs_hba_memory_dump(mvi, tag, t->task_proto);
 
                ++pass;
                mvi->tx_prod = (mvi->tx_prod + 1) & (MVS_CHIP_SLOT_SZ - 1);
-
-               if (n == 1)
-                       break;
-
-               t = list_entry(t->list.next, struct sas_task, list);
+               if (n > 1)
+                       t = list_entry(t->list.next, struct sas_task, list);
        } while (--n);
 
-       return 0;
+       rc = 0;
+       goto out_done;
 
 err_out_tag:
        mvs_tag_free(mvi, tag);
@@ -1928,7 +2150,7 @@ err_out:
                if (n_elem)
                        pci_unmap_sg(mvi->pdev, t->scatter, n_elem,
                                     t->data_dir);
-exec_exit:
+out_done:
        if (pass)
                mw32(TX_PROD_IDX, (mvi->tx_prod - 1) & (MVS_CHIP_SLOT_SZ - 1));
        spin_unlock_irqrestore(&mvi->lock, flags);
@@ -1937,42 +2159,59 @@ exec_exit:
 
 static int mvs_task_abort(struct sas_task *task)
 {
-       int rc = 1;
+       int rc;
        unsigned long flags;
        struct mvs_info *mvi = task->dev->port->ha->lldd_ha;
        struct pci_dev *pdev = mvi->pdev;
+       int tag;
 
        spin_lock_irqsave(&task->task_state_lock, flags);
        if (task->task_state_flags & SAS_TASK_STATE_DONE) {
                rc = TMF_RESP_FUNC_COMPLETE;
+               spin_unlock_irqrestore(&task->task_state_lock, flags);
                goto out_done;
        }
        spin_unlock_irqrestore(&task->task_state_lock, flags);
 
-       /*FIXME*/
-       rc = TMF_RESP_FUNC_COMPLETE;
-
        switch (task->task_proto) {
        case SAS_PROTOCOL_SMP:
-               dev_printk(KERN_DEBUG, &pdev->dev, "SMP Abort! ");
+               dev_printk(KERN_DEBUG, &pdev->dev, "SMP Abort! \n");
                break;
        case SAS_PROTOCOL_SSP:
-               dev_printk(KERN_DEBUG, &pdev->dev, "SSP Abort! ");
+               dev_printk(KERN_DEBUG, &pdev->dev, "SSP Abort! \n");
                break;
        case SAS_PROTOCOL_SATA:
        case SAS_PROTOCOL_STP:
        case SAS_PROTOCOL_SATA | SAS_PROTOCOL_STP:{
-               dev_printk(KERN_DEBUG, &pdev->dev, "STP Abort! "
-                       "Dump D2H FIS: \n");
+               dev_printk(KERN_DEBUG, &pdev->dev, "STP Abort! \n");
+#if _MV_DUMP
+               dev_printk(KERN_DEBUG, &pdev->dev, "Dump D2H FIS: \n");
                mvs_hexdump(sizeof(struct host_to_dev_fis),
                                (void *)&task->ata_task.fis, 0);
                dev_printk(KERN_DEBUG, &pdev->dev, "Dump ATAPI Cmd : \n");
                mvs_hexdump(16, task->ata_task.atapi_packet, 0);
+#endif
+               spin_lock_irqsave(&task->task_state_lock, flags);
+               if (task->task_state_flags & SAS_TASK_NEED_DEV_RESET) {
+                       /* TODO */
+                       ;
+               }
+               spin_unlock_irqrestore(&task->task_state_lock, flags);
                break;
        }
        default:
                break;
        }
+
+       if (mvs_find_tag(mvi, task, &tag)) {
+               spin_lock_irqsave(&mvi->lock, flags);
+               mvs_slot_task_free(mvi, task, &mvi->slot_info[tag], tag);
+               spin_unlock_irqrestore(&mvi->lock, flags);
+       }
+       if (!mvs_task_exec(task, 1, GFP_ATOMIC))
+               rc = TMF_RESP_FUNC_COMPLETE;
+       else
+               rc = TMF_RESP_FUNC_FAILED;
 out_done:
        return rc;
 }
@@ -2001,7 +2240,7 @@ static void mvs_free(struct mvs_info *mvi)
                                  mvi->rx_fis, mvi->rx_fis_dma);
        if (mvi->rx)
                dma_free_coherent(&mvi->pdev->dev,
-                                 sizeof(*mvi->rx) * MVS_RX_RING_SZ,
+                                 sizeof(*mvi->rx) * (MVS_RX_RING_SZ + 1),
                                  mvi->rx, mvi->rx_dma);
        if (mvi->slot)
                dma_free_coherent(&mvi->pdev->dev,
@@ -2109,6 +2348,9 @@ static struct mvs_info *__devinit mvs_alloc(struct pci_dev *pdev,
                return NULL;
 
        spin_lock_init(&mvi->lock);
+#ifdef MVS_USE_TASKLET
+       tasklet_init(&mvi->tasklet, mvs_tasklet, (unsigned long)mvi);
+#endif
        mvi->pdev = pdev;
        mvi->chip = chip;
 
@@ -2132,6 +2374,10 @@ static struct mvs_info *__devinit mvs_alloc(struct pci_dev *pdev,
                mvs_phy_init(mvi, i);
                arr_phy[i] = &mvi->phy[i].sas_phy;
                arr_port[i] = &mvi->port[i].sas_port;
+               mvi->port[i].taskfileset = MVS_ID_NOT_MAPPED;
+               mvi->port[i].wide_port_phymap = 0;
+               mvi->port[i].port_attached = 0;
+               INIT_LIST_HEAD(&mvi->port[i].list);
        }
 
        SHOST_TO_SAS_HA(mvi->shost) = &mvi->sas;
@@ -2148,9 +2394,10 @@ static struct mvs_info *__devinit mvs_alloc(struct pci_dev *pdev,
        mvi->sas.sas_phy = arr_phy;
        mvi->sas.sas_port = arr_port;
        mvi->sas.num_phys = chip->n_phy;
-       mvi->sas.lldd_max_execute_num = MVS_CHIP_SLOT_SZ - 1;
+       mvi->sas.lldd_max_execute_num = 1;
        mvi->sas.lldd_queue_size = MVS_QUEUE_SIZE;
-       mvi->can_queue = (MVS_CHIP_SLOT_SZ >> 1) - 1;
+       mvi->shost->can_queue = MVS_CAN_QUEUE;
+       mvi->shost->cmd_per_lun = MVS_SLOTS / mvi->sas.num_phys;
        mvi->sas.lldd_ha = mvi;
        mvi->sas.core.shost = mvi->shost;
 
@@ -2203,11 +2450,11 @@ static struct mvs_info *__devinit mvs_alloc(struct pci_dev *pdev,
        memset(mvi->rx_fis, 0, MVS_RX_FISL_SZ);
 
        mvi->rx = dma_alloc_coherent(&pdev->dev,
-                                    sizeof(*mvi->rx) * MVS_RX_RING_SZ,
+                                    sizeof(*mvi->rx) * (MVS_RX_RING_SZ + 1),
                                     &mvi->rx_dma, GFP_KERNEL);
        if (!mvi->rx)
                goto err_out;
-       memset(mvi->rx, 0, sizeof(*mvi->rx) * MVS_RX_RING_SZ);
+       memset(mvi->rx, 0, sizeof(*mvi->rx) * (MVS_RX_RING_SZ + 1));
 
        mvi->rx[0] = cpu_to_le32(0xfff);
        mvi->rx_cons = 0xfff;
@@ -2357,7 +2604,7 @@ static void __devinit mvs_phy_hacks(struct mvs_info *mvi)
        mvs_cw32(regs, CMD_SAS_CTL0, tmp);
 
        /* workaround for WDTIMEOUT , set to 550 ms */
-       mvs_cw32(regs, CMD_WD_TIMER, 0xffffff);
+       mvs_cw32(regs, CMD_WD_TIMER, 0x86470);
 
        /* not to halt for different port op during wideport link change */
        mvs_cw32(regs, CMD_APP_ERR_CONFIG, 0xffefbf7d);
@@ -2465,17 +2712,16 @@ static u32 mvs_is_phy_ready(struct mvs_info *mvi, int i)
 {
        u32 tmp;
        struct mvs_phy *phy = &mvi->phy[i];
-       struct mvs_port *port;
+       struct mvs_port *port = phy->port;;
 
        tmp = mvs_read_phy_ctl(mvi, i);
 
        if ((tmp & PHY_READY_MASK) && !(phy->irq_status & PHYEV_POOF)) {
-               if (!phy->port)
+               if (!port)
                        phy->phy_attached = 1;
                return tmp;
        }
 
-       port = phy->port;
        if (port) {
                if (phy->phy_type & PORT_TYPE_SAS) {
                        port->wide_port_phymap &= ~(1U << i);
@@ -2497,7 +2743,7 @@ static void mvs_update_phyinfo(struct mvs_info *mvi, int i,
 {
        struct mvs_phy *phy = &mvi->phy[i];
        struct pci_dev *pdev = mvi->pdev;
-       u32 tmp, j;
+       u32 tmp;
        u64 tmp64;
 
        mvs_write_port_cfg_addr(mvi, i, PHYR_IDENTIFY);
@@ -2524,46 +2770,20 @@ static void mvs_update_phyinfo(struct mvs_info *mvi, int i,
                sas_phy->linkrate =
                        (phy->phy_status & PHY_NEG_SPP_PHYS_LINK_RATE_MASK) >>
                                PHY_NEG_SPP_PHYS_LINK_RATE_MASK_OFFSET;
-
-               /* Updated attached_sas_addr */
-               mvs_write_port_cfg_addr(mvi, i, PHYR_ATT_ADDR_HI);
-               phy->att_dev_sas_addr =
-                               (u64) mvs_read_port_cfg_data(mvi, i) << 32;
-
-               mvs_write_port_cfg_addr(mvi, i, PHYR_ATT_ADDR_LO);
-               phy->att_dev_sas_addr |= mvs_read_port_cfg_data(mvi, i);
-
-               dev_printk(KERN_DEBUG, &pdev->dev,
-                       "phy[%d] Get Attached Address 0x%llX ,"
-                       " SAS Address 0x%llX\n",
-                       i, phy->att_dev_sas_addr, phy->dev_sas_addr);
-               dev_printk(KERN_DEBUG, &pdev->dev,
-                       "Rate = %x , type = %d\n",
-                       sas_phy->linkrate, phy->phy_type);
-
-#if 1
-               /*
-               * If the device is capable of supporting a wide port
-               * on its phys, it may configure the phys as a wide port.
-               */
-               if (phy->phy_type & PORT_TYPE_SAS)
-                       for (j = 0; j < mvi->chip->n_phy && j != i; ++j) {
-                               if ((mvi->phy[j].phy_attached) &&
-                                       (mvi->phy[j].phy_type & PORT_TYPE_SAS))
-                                       if (phy->att_dev_sas_addr ==
-                                       mvi->phy[j].att_dev_sas_addr - 1) {
-                                               phy->att_dev_sas_addr =
-                                               mvi->phy[j].att_dev_sas_addr;
-                                               break;
-                                       }
-                       }
-
-#endif
-
-               tmp64 = cpu_to_be64(phy->att_dev_sas_addr);
-               memcpy(sas_phy->attached_sas_addr, &tmp64, SAS_ADDR_SIZE);
+               phy->minimum_linkrate =
+                       (phy->phy_status &
+                               PHY_MIN_SPP_PHYS_LINK_RATE_MASK) >> 8;
+               phy->maximum_linkrate =
+                       (phy->phy_status &
+                               PHY_MAX_SPP_PHYS_LINK_RATE_MASK) >> 12;
 
                if (phy->phy_type & PORT_TYPE_SAS) {
+                       /* Updated attached_sas_addr */
+                       mvs_write_port_cfg_addr(mvi, i, PHYR_ATT_ADDR_HI);
+                       phy->att_dev_sas_addr =
+                               (u64) mvs_read_port_cfg_data(mvi, i) << 32;
+                       mvs_write_port_cfg_addr(mvi, i, PHYR_ATT_ADDR_LO);
+                       phy->att_dev_sas_addr |= mvs_read_port_cfg_data(mvi, i);
                        mvs_write_port_cfg_addr(mvi, i, PHYR_ATT_DEV_INFO);
                        phy->att_dev_info = mvs_read_port_cfg_data(mvi, i);
                        phy->identify.device_type =
@@ -2582,6 +2802,7 @@ static void mvs_update_phyinfo(struct mvs_info *mvi, int i,
                } else if (phy->phy_type & PORT_TYPE_SATA) {
                        phy->identify.target_port_protocols = SAS_PROTOCOL_STP;
                        if (mvs_is_sig_fis_received(phy->irq_status)) {
+                               phy->att_dev_sas_addr = i;      /* temp */
                                if (phy_st & PHY_OOB_DTCTD)
                                        sas_phy->oob_mode = SATA_OOB_MODE;
                                phy->frame_rcvd_size =
@@ -2591,20 +2812,34 @@ static void mvs_update_phyinfo(struct mvs_info *mvi, int i,
                        } else {
                                dev_printk(KERN_DEBUG, &pdev->dev,
                                        "No sig fis\n");
+                               phy->phy_type &= ~(PORT_TYPE_SATA);
+                               goto out_done;
                        }
                }
+               tmp64 = cpu_to_be64(phy->att_dev_sas_addr);
+               memcpy(sas_phy->attached_sas_addr, &tmp64, SAS_ADDR_SIZE);
+
+               dev_printk(KERN_DEBUG, &pdev->dev,
+                       "phy[%d] Get Attached Address 0x%llX ,"
+                       " SAS Address 0x%llX\n",
+                       i, phy->att_dev_sas_addr, phy->dev_sas_addr);
+               dev_printk(KERN_DEBUG, &pdev->dev,
+                       "Rate = %x , type = %d\n",
+                       sas_phy->linkrate, phy->phy_type);
+
                /* workaround for HW phy decoding error on 1.5g disk drive */
                mvs_write_port_vsr_addr(mvi, i, VSR_PHY_MODE6);
                tmp = mvs_read_port_vsr_data(mvi, i);
                if (((phy->phy_status & PHY_NEG_SPP_PHYS_LINK_RATE_MASK) >>
                     PHY_NEG_SPP_PHYS_LINK_RATE_MASK_OFFSET) ==
                        SAS_LINK_RATE_1_5_GBPS)
-                       tmp &= ~PHY_MODE6_DTL_SPEED;
+                       tmp &= ~PHY_MODE6_LATECLK;
                else
-                       tmp |= PHY_MODE6_DTL_SPEED;
+                       tmp |= PHY_MODE6_LATECLK;
                mvs_write_port_vsr_data(mvi, i, tmp);
 
        }
+out_done:
        if (get_st)
                mvs_write_port_irq_stat(mvi, i, phy->irq_status);
 }
@@ -2629,6 +2864,11 @@ static void mvs_port_formed(struct asd_sas_phy *sas_phy)
        spin_unlock_irqrestore(&mvi->lock, flags);
 }
 
+static int mvs_I_T_nexus_reset(struct domain_device *dev)
+{
+       return TMF_RESP_FUNC_FAILED;
+}
+
 static int __devinit mvs_hw_init(struct mvs_info *mvi)
 {
        void __iomem *regs = mvi->regs;
@@ -2790,13 +3030,12 @@ static int __devinit mvs_hw_init(struct mvs_info *mvi)
        /* enable CMD/CMPL_Q/RESP mode */
        mw32(PCS, PCS_SATA_RETRY | PCS_FIS_RX_EN | PCS_CMD_EN);
 
-       /* re-enable interrupts globally */
-       mvs_hba_interrupt_enable(mvi);
-
        /* enable completion queue interrupt */
-       tmp = (CINT_PORT_MASK | CINT_DONE | CINT_MEM);
+       tmp = (CINT_PORT_MASK | CINT_DONE | CINT_MEM | CINT_SRS);
        mw32(INT_MASK, tmp);
 
+       /* Enable SRS interrupt */
+       mw32(INT_MASK_SRS, 0xFF);
        return 0;
 }
 
@@ -2870,6 +3109,8 @@ static int __devinit mvs_pci_init(struct pci_dev *pdev,
 
        mvs_print_info(mvi);
 
+       mvs_hba_interrupt_enable(mvi);
+
        scsi_scan_host(mvi->shost);
 
        return 0;
@@ -2915,12 +3156,22 @@ static struct sas_domain_function_template mvs_transport_ops = {
        .lldd_execute_task      = mvs_task_exec,
        .lldd_control_phy       = mvs_phy_control,
        .lldd_abort_task        = mvs_task_abort,
-       .lldd_port_formed       = mvs_port_formed
+       .lldd_port_formed       = mvs_port_formed,
+       .lldd_I_T_nexus_reset   = mvs_I_T_nexus_reset,
 };
 
 static struct pci_device_id __devinitdata mvs_pci_table[] = {
        { PCI_VDEVICE(MARVELL, 0x6320), chip_6320 },
        { PCI_VDEVICE(MARVELL, 0x6340), chip_6440 },
+       {
+               .vendor         = PCI_VENDOR_ID_MARVELL,
+               .device         = 0x6440,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = 0x6480,
+               .class          = 0,
+               .class_mask     = 0,
+               .driver_data    = chip_6480,
+       },
        { PCI_VDEVICE(MARVELL, 0x6440), chip_6440 },
        { PCI_VDEVICE(MARVELL, 0x6480), chip_6480 },
 
index b9b09a70458435dcc34544555e759cb6b8a0e300..ed83cdb6e67dfbdb5c829238c91ed861b124a426 100644 (file)
@@ -294,7 +294,6 @@ static void scsi_device_dev_release_usercontext(struct work_struct *work)
        }
 
        if (sdev->request_queue) {
-               bsg_unregister_queue(sdev->request_queue);
                sdev->request_queue->queuedata = NULL;
                /* user context needed to free queue */
                scsi_free_queue(sdev->request_queue);
@@ -858,6 +857,7 @@ void __scsi_remove_device(struct scsi_device *sdev)
        if (scsi_device_set_state(sdev, SDEV_CANCEL) != 0)
                return;
 
+       bsg_unregister_queue(sdev->request_queue);
        class_device_unregister(&sdev->sdev_classdev);
        transport_remove_device(dev);
        device_del(dev);
index 1efcad3b6fcaf91d3fc677d1641e885d7ecc0402..ca90c5192596f8c4f47628ced8d2aabdcdd82b37 100644 (file)
@@ -111,15 +111,6 @@ superio_inw(int reg)
        return val;
 }
 
-static void
-superio_outw(int val, int reg)
-{
-       outb(reg++, REG);
-       outb((val >> 8) & 0xff, VAL);
-       outb(reg, REG);
-       outb(val & 0xff, VAL);
-}
-
 static inline void
 superio_select(int ldn)
 {
@@ -170,9 +161,8 @@ it8712f_wdt_update_margin(void)
        superio_outb(config, WDT_CONFIG);
 
        if (revision >= 0x08)
-               superio_outw(units, WDT_TIMEOUT);
-       else
-               superio_outb(units, WDT_TIMEOUT);
+               superio_outb(units >> 8, WDT_TIMEOUT + 1);
+       superio_outb(units, WDT_TIMEOUT);
 }
 
 static int
index 788865df1bc92689debaf1545c59fe6ab48d2ea8..584bb0f9c36a35cdd5ed4234a83ba927e0d04e5e 100644 (file)
@@ -138,6 +138,7 @@ struct afs_cell *afs_cell_create(const char *name, char *vllist)
        cell = afs_cell_alloc(name, vllist);
        if (IS_ERR(cell)) {
                _leave(" = %ld", PTR_ERR(cell));
+               up_write(&afs_cells_sem);
                return cell;
        }
 
index cb18af98964573a8dbfd7441e45e7bea2ca27403..5bb57bf2b9d7f357b72696848af734aa9b49ab30 100644 (file)
@@ -1786,6 +1786,7 @@ struct cpu_spec {
        char            *cpu_name;
        unsigned char   cpu_od;         /* Set Config[OD] */
        unsigned char   cpu_bclk;       /* Enable BCLK switching */
+       unsigned char   cpu_pll_wo;     /* sys_cpupll reg. write-only */
 };
 
 extern struct cpu_spec         cpu_specs[];
diff --git a/include/asm-sh/floppy.h b/include/asm-sh/floppy.h
deleted file mode 100644 (file)
index 59fbfdc..0000000
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Architecture specific parts of the Floppy driver
- *   include/asm-i386/floppy.h
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * Copyright (C) 1995
- */
-#ifndef __ASM_SH_FLOPPY_H
-#define __ASM_SH_FLOPPY_H
-
-#include <linux/vmalloc.h>
-
-
-/*
- * The DMA channel used by the floppy controller cannot access data at
- * addresses >= 16MB
- *
- * Went back to the 1MB limit, as some people had problems with the floppy
- * driver otherwise. It doesn't matter much for performance anyway, as most
- * floppy accesses go through the track buffer.
- */
-#define _CROSS_64KB(a,s,vdma) \
-(!vdma && ((unsigned long)(a)/K_64 != ((unsigned long)(a) + (s) - 1) / K_64))
-
-#define CROSS_64KB(a,s) _CROSS_64KB(a,s,use_virtual_dma & 1)
-
-
-#define SW fd_routine[use_virtual_dma&1]
-#define CSW fd_routine[can_use_virtual_dma & 1]
-
-
-#define fd_inb(port)                   inb_p(port)
-#define fd_outb(value,port)            outb_p(value,port)
-
-#define fd_request_dma()        CSW._request_dma(FLOPPY_DMA,"floppy")
-#define fd_free_dma()           CSW._free_dma(FLOPPY_DMA)
-#define fd_enable_irq()         enable_irq(FLOPPY_IRQ)
-#define fd_disable_irq()        disable_irq(FLOPPY_IRQ)
-#define fd_free_irq()          free_irq(FLOPPY_IRQ, NULL)
-#define fd_get_dma_residue()    SW._get_dma_residue(FLOPPY_DMA)
-#define fd_dma_mem_alloc(size) SW._dma_mem_alloc(size)
-#define fd_dma_setup(addr, size, mode, io) SW._dma_setup(addr, size, mode, io)
-
-#define FLOPPY_CAN_FALLBACK_ON_NODMA
-
-static int virtual_dma_count;
-static int virtual_dma_residue;
-static char *virtual_dma_addr;
-static int virtual_dma_mode;
-static int doing_pdma;
-
-static void floppy_hardint(int irq, void *dev_id, struct pt_regs * regs)
-{
-       register unsigned char st;
-
-#undef TRACE_FLPY_INT
-
-#ifdef TRACE_FLPY_INT
-       static int calls=0;
-       static int bytes=0;
-       static int dma_wait=0;
-#endif
-       if(!doing_pdma) {
-               floppy_interrupt(irq, dev_id, regs);
-               return;
-       }
-
-#ifdef TRACE_FLPY_INT
-       if(!calls)
-               bytes = virtual_dma_count;
-#endif
-
-       {
-               register int lcount;
-               register char *lptr;
-
-               st = 1;
-               for(lcount=virtual_dma_count, lptr=virtual_dma_addr; 
-                   lcount; lcount--, lptr++) {
-                       st=inb(virtual_dma_port+4) & 0xa0 ;
-                       if(st != 0xa0) 
-                               break;
-                       if(virtual_dma_mode)
-                               outb_p(*lptr, virtual_dma_port+5);
-                       else
-                               *lptr = inb_p(virtual_dma_port+5);
-               }
-               virtual_dma_count = lcount;
-               virtual_dma_addr = lptr;
-               st = inb(virtual_dma_port+4);
-       }
-
-#ifdef TRACE_FLPY_INT
-       calls++;
-#endif
-       if(st == 0x20)
-               return;
-       if(!(st & 0x20)) {
-               virtual_dma_residue += virtual_dma_count;
-               virtual_dma_count=0;
-#ifdef TRACE_FLPY_INT
-               printk("count=%x, residue=%x calls=%d bytes=%d dma_wait=%d\n", 
-                      virtual_dma_count, virtual_dma_residue, calls, bytes,
-                      dma_wait);
-               calls = 0;
-               dma_wait=0;
-#endif
-               doing_pdma = 0;
-               floppy_interrupt(irq, dev_id, regs);
-               return;
-       }
-#ifdef TRACE_FLPY_INT
-       if(!virtual_dma_count)
-               dma_wait++;
-#endif
-}
-
-static void fd_disable_dma(void)
-{
-       if(! (can_use_virtual_dma & 1))
-               disable_dma(FLOPPY_DMA);
-       doing_pdma = 0;
-       virtual_dma_residue += virtual_dma_count;
-       virtual_dma_count=0;
-}
-
-static int vdma_request_dma(unsigned int dmanr, const char * device_id)
-{
-       return 0;
-}
-
-static void vdma_nop(unsigned int dummy)
-{
-}
-
-
-static int vdma_get_dma_residue(unsigned int dummy)
-{
-       return virtual_dma_count + virtual_dma_residue;
-}
-
-
-static int fd_request_irq(void)
-{
-       if(can_use_virtual_dma)
-               return request_irq(FLOPPY_IRQ, floppy_hardint,
-                                  IRQF_DISABLED, "floppy", NULL);
-       else
-               return request_irq(FLOPPY_IRQ, floppy_interrupt,
-                                  IRQF_DISABLED, "floppy", NULL);
-}
-
-static unsigned long dma_mem_alloc(unsigned long size)
-{
-       return __get_dma_pages(GFP_KERNEL,get_order(size));
-}
-
-
-static unsigned long vdma_mem_alloc(unsigned long size)
-{
-       return (unsigned long) vmalloc(size);
-
-}
-
-#define nodma_mem_alloc(size) vdma_mem_alloc(size)
-
-static void _fd_dma_mem_free(unsigned long addr, unsigned long size)
-{
-       if((unsigned int) addr >= (unsigned int) high_memory)
-               return vfree((void *)addr);
-       else
-               free_pages(addr, get_order(size));              
-}
-
-#define fd_dma_mem_free(addr, size)  _fd_dma_mem_free(addr, size) 
-
-static void _fd_chose_dma_mode(char *addr, unsigned long size)
-{
-       if(can_use_virtual_dma == 2) {
-               if((unsigned int) addr >= (unsigned int) high_memory ||
-                  virt_to_phys(addr) >= 0x10000000)
-                       use_virtual_dma = 1;
-               else
-                       use_virtual_dma = 0;
-       } else {
-               use_virtual_dma = can_use_virtual_dma & 1;
-       }
-}
-
-#define fd_chose_dma_mode(addr, size) _fd_chose_dma_mode(addr, size)
-
-
-static int vdma_dma_setup(char *addr, unsigned long size, int mode, int io)
-{
-       doing_pdma = 1;
-       virtual_dma_port = io;
-       virtual_dma_mode = (mode  == DMA_MODE_WRITE);
-       virtual_dma_addr = addr;
-       virtual_dma_count = size;
-       virtual_dma_residue = 0;
-       return 0;
-}
-
-static int hard_dma_setup(char *addr, unsigned long size, int mode, int io)
-{
-#ifdef FLOPPY_SANITY_CHECK
-       if (CROSS_64KB(addr, size)) {
-               printk("DMA crossing 64-K boundary %p-%p\n", addr, addr+size);
-               return -1;
-       }
-#endif
-
-       __flush_purge_region(addr, size);
-
-       /* actual, physical DMA */
-       doing_pdma = 0;
-       clear_dma_ff(FLOPPY_DMA);
-       set_dma_mode(FLOPPY_DMA,mode);
-       set_dma_addr(FLOPPY_DMA,virt_to_phys(addr));
-       set_dma_count(FLOPPY_DMA,size);
-       enable_dma(FLOPPY_DMA);
-       return 0;
-}
-
-static struct fd_routine_l {
-       int (*_request_dma)(unsigned int dmanr, const char * device_id);
-       void (*_free_dma)(unsigned int dmanr);
-       int (*_get_dma_residue)(unsigned int dummy);
-       unsigned long (*_dma_mem_alloc) (unsigned long size);
-       int (*_dma_setup)(char *addr, unsigned long size, int mode, int io);
-} fd_routine[] = {
-       {
-               request_dma,
-               free_dma,
-               get_dma_residue,
-               dma_mem_alloc,
-               hard_dma_setup
-       },
-       {
-               vdma_request_dma,
-               vdma_nop,
-               vdma_get_dma_residue,
-               vdma_mem_alloc,
-               vdma_dma_setup
-       }
-};
-
-
-static int FDC1 = 0x3f0;
-static int FDC2 = -1;
-
-/*
- * Floppy types are stored in the rtc's CMOS RAM and so rtc_lock
- * is needed to prevent corrupted CMOS RAM in case "insmod floppy"
- * coincides with another rtc CMOS user.               Paul G.
- */
-#define FLOPPY0_TYPE   (4)
-#define FLOPPY1_TYPE   (0)
-
-#define N_FDC 2
-#define N_DRIVE 8
-
-#define EXTRA_FLOPPY_PARAMS
-
-#endif /* __ASM_SH_FLOPPY_H */
index f8429880a27011cab16851b2f83fad36fe3623f3..91462fea1507c69af30d42a8e2315e8730ced5b0 100644 (file)
@@ -1,9 +1,8 @@
 #ifndef __ASM_SH_FPU_H
 #define __ASM_SH_FPU_H
 
-#define SR_FD    0x00008000
-
 #ifndef __ASSEMBLY__
+#include <linux/preempt.h>
 #include <asm/ptrace.h>
 
 #ifdef CONFIG_SH_FPU
@@ -21,25 +20,35 @@ struct task_struct;
 
 extern void save_fpu(struct task_struct *__tsk, struct pt_regs *regs);
 #else
+
 #define release_fpu(regs)      do { } while (0)
 #define grab_fpu(regs)         do { } while (0)
-#define save_fpu(tsk, regs)    do { } while (0)
+
+static inline void save_fpu(struct task_struct *tsk, struct pt_regs *regs)
+{
+       clear_tsk_thread_flag(tsk, TIF_USEDFPU);
+}
 #endif
 
 extern int do_fpu_inst(unsigned short, struct pt_regs *);
 
-#define unlazy_fpu(tsk, regs) do {                     \
-       if (test_tsk_thread_flag(tsk, TIF_USEDFPU)) {   \
-               save_fpu(tsk, regs);                    \
-       }                                               \
-} while (0)
-
-#define clear_fpu(tsk, regs) do {                              \
-       if (test_tsk_thread_flag(tsk, TIF_USEDFPU)) {           \
-               clear_tsk_thread_flag(tsk, TIF_USEDFPU);        \
-               release_fpu(regs);                              \
-       }                                                       \
-} while (0)
+static inline void unlazy_fpu(struct task_struct *tsk, struct pt_regs *regs)
+{
+       preempt_disable();
+       if (test_tsk_thread_flag(tsk, TIF_USEDFPU))
+               save_fpu(tsk, regs);
+       preempt_enable();
+}
+
+static inline void clear_fpu(struct task_struct *tsk, struct pt_regs *regs)
+{
+       preempt_disable();
+       if (test_tsk_thread_flag(tsk, TIF_USEDFPU)) {
+               clear_tsk_thread_flag(tsk, TIF_USEDFPU);
+               release_fpu(regs);
+       }
+       preempt_enable();
+}
 
 #endif /* __ASSEMBLY__ */
 
index 19fe47c1ca172adebdc1b2de45e3902f6352649a..ec707b98e5b91a88e9e21a6aa076490ae1ba6987 100644 (file)
@@ -2,7 +2,6 @@
 #define __ASM_SH_PROCESSOR_H
 
 #include <asm/cpu-features.h>
-#include <asm/fpu.h>
 
 #ifndef __ASSEMBLY__
 /*
index df2d5b039ef41ad5bfdf5bd0e99436461a49bb28..c09305d6a9d94b2ceabbcf5f8984ceb0fc06af93 100644 (file)
@@ -70,6 +70,7 @@ extern struct sh_cpuinfo cpu_data[];
  */
 #define SR_DSP         0x00001000
 #define SR_IMASK       0x000000f0
+#define SR_FD          0x00008000
 
 /*
  * FPU structure and data
index eda4bef448e9f867f70c23a31b9eaa2d5be2a8e4..88a2edf8fa5d000e1070443b736b0accfb3e77b7 100644 (file)
@@ -112,6 +112,7 @@ extern struct sh_cpuinfo cpu_data[];
 #endif
 
 #define SR_IMASK 0x000000f0
+#define SR_FD    0x00008000
 #define SR_SSTEP 0x08000000
 
 #ifndef __ASSEMBLY__
index 1bdc39a8c76c6a0916af7b6698fdcd219a26c1fb..cae2c35d1206593bc6a3154e44ae47ef1db6fb75 100644 (file)
@@ -1227,12 +1227,13 @@ void input_free_device(struct input_dev *dev);
 
 static inline struct input_dev *input_get_device(struct input_dev *dev)
 {
-       return to_input_dev(get_device(&dev->dev));
+       return dev ? to_input_dev(get_device(&dev->dev)) : NULL;
 }
 
 static inline void input_put_device(struct input_dev *dev)
 {
-       put_device(&dev->dev);
+       if (dev)
+               put_device(&dev->dev);
 }
 
 static inline void *input_get_drvdata(struct input_dev *dev)
index 1b4ccf25b4d22ac109edd6e73ac06ed580141726..cac4b364cd40a18c83daa5ee47c1758e68b7e9ad 100644 (file)
@@ -2,6 +2,7 @@
 #define IOCONTEXT_H
 
 #include <linux/radix-tree.h>
+#include <linux/rcupdate.h>
 
 /*
  * This is the per-process anticipatory I/O scheduler state.
@@ -54,6 +55,8 @@ struct cfq_io_context {
 
        void (*dtor)(struct io_context *); /* destructor */
        void (*exit)(struct io_context *); /* called on task exit */
+
+       struct rcu_head rcu_head;
 };
 
 /*
index a2f003239c8570dd31e869eaa6aa7c0a985f9352..ee81906b5164deccb24ed396f95697b4a79638b2 100644 (file)
@@ -383,9 +383,11 @@ static inline void __napi_complete(struct napi_struct *n)
 
 static inline void napi_complete(struct napi_struct *n)
 {
-       local_irq_disable();
+       unsigned long flags;
+
+       local_irq_save(flags);
        __napi_complete(n);
-       local_irq_enable();
+       local_irq_restore(flags);
 }
 
 /**
@@ -1072,12 +1074,14 @@ static inline int netif_is_multiqueue(const struct net_device *dev)
 }
 
 /* Use this variant when it is known for sure that it
- * is executing from interrupt context.
+ * is executing from hardware interrupt context or with hardware interrupts
+ * disabled.
  */
 extern void dev_kfree_skb_irq(struct sk_buff *skb);
 
 /* Use this variant in places where it could be invoked
- * either from interrupt or non-interrupt context.
+ * from either hardware interrupt or other context, with hardware interrupts
+ * either disabled or enabled.
  */
 extern void dev_kfree_skb_any(struct sk_buff *skb);
 
index f5024583fc8b53311358204f2874173f78eabf28..7940da1606e7514697d45bf8be3f93bede4ddb0b 100644 (file)
@@ -65,7 +65,6 @@ struct llc_sap {
 
 extern struct list_head llc_sap_list;
 extern rwlock_t llc_sap_list_lock;
-extern unsigned char llc_station_mac_sa[ETH_ALEN];
 
 extern int llc_rcv(struct sk_buff *skb, struct net_device *dev,
                   struct packet_type *pt, struct net_device *orig_dev);
index 4a8f58b17e43a1659e171c768678310c44264dee..75b8e2968c9b1ef5e5cafadae67ab07934964043 100644 (file)
@@ -381,7 +381,7 @@ static inline void llc_pdu_init_as_xid_cmd(struct sk_buff *skb,
        xid_info->fmt_id = LLC_XID_FMT_ID;      /* 0x81 */
        xid_info->type   = svcs_supported;
        xid_info->rw     = rx_window << 1;      /* size of receive window */
-       skb_put(skb, 3);
+       skb_put(skb, sizeof(struct llc_xid_info));
 }
 
 /**
@@ -406,7 +406,7 @@ static inline void llc_pdu_init_as_xid_rsp(struct sk_buff *skb,
        xid_info->fmt_id = LLC_XID_FMT_ID;
        xid_info->type   = svcs_supported;
        xid_info->rw     = rx_window << 1;
-       skb_put(skb, 3);
+       skb_put(skb, sizeof(struct llc_xid_info));
 }
 
 /* LLC Type 2 FRMR response information field format */
index 2c56dbece7291ba1398dc5c5ce02ec3504e8f075..ed25bec2f6483aa7f2b6bda6a6324eb2206ee383 100644 (file)
@@ -1,5 +1,8 @@
 #ifndef LLC_SAP_H
 #define LLC_SAP_H
+
+#include <asm/types.h>
+
 /*
  * Copyright (c) 1997 by Procom Technology,Inc.
  *              2001-2003 by Arnaldo Carvalho de Melo <acme@conectiva.com.br>
@@ -19,8 +22,8 @@ struct sock;
 extern void llc_sap_rtn_pdu(struct llc_sap *sap, struct sk_buff *skb);
 extern void llc_save_primitive(struct sock *sk, struct sk_buff* skb,
                               unsigned char prim);
-extern struct sk_buff *llc_alloc_frame(struct sock *sk,
-                                      struct net_device *dev);
+extern struct sk_buff *llc_alloc_frame(struct sock *sk, struct net_device *dev,
+                                      u8 type, u32 data_size);
 
 extern void llc_build_and_send_test_pkt(struct llc_sap *sap,
                                        struct sk_buff *skb,
index 84ed734b96b3ee83861b7499edd55d7aa479e61a..acc975fcc8cc9f96a9d3ce7d37a1e1e9b7bbf2ca 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -2688,7 +2688,7 @@ void kfree(const void *x)
 }
 EXPORT_SYMBOL(kfree);
 
-#if defined(SLUB_DEBUG) || defined(CONFIG_SLABINFO)
+#if defined(CONFIG_SLUB_DEBUG) || defined(CONFIG_SLABINFO)
 static unsigned long count_partial(struct kmem_cache_node *n)
 {
        unsigned long flags;
index dbc81b96509666595a7e02265446be3c8076e45b..b33410abfd6bfc25edd90a96bf05cde8014e96a3 100644 (file)
@@ -374,17 +374,35 @@ static void vlan_sync_address(struct net_device *dev,
        memcpy(vlan->real_dev_addr, dev->dev_addr, ETH_ALEN);
 }
 
+static void __vlan_device_event(struct net_device *dev, unsigned long event)
+{
+       switch (event) {
+       case NETDEV_CHANGENAME:
+               vlan_proc_rem_dev(dev);
+               if (vlan_proc_add_dev(dev) < 0)
+                       pr_warning("8021q: failed to change proc name for %s\n",
+                                       dev->name);
+               break;
+       }
+}
+
 static int vlan_device_event(struct notifier_block *unused, unsigned long event,
                             void *ptr)
 {
        struct net_device *dev = ptr;
-       struct vlan_group *grp = __vlan_find_group(dev->ifindex);
+       struct vlan_group *grp;
        int i, flgs;
        struct net_device *vlandev;
 
        if (dev->nd_net != &init_net)
                return NOTIFY_DONE;
 
+       if (is_vlan_dev(dev)) {
+               __vlan_device_event(dev, event);
+               goto out;
+       }
+
+       grp = __vlan_find_group(dev->ifindex);
        if (!grp)
                goto out;
 
index 73efcc715ccb3dba46bb8e975bffadb554fec01d..51271aea402be83dfc7e7e048dd2285b5f11bf96 100644 (file)
@@ -45,4 +45,9 @@ void vlan_netlink_fini(void);
 
 extern struct rtnl_link_ops vlan_link_ops;
 
+static inline int is_vlan_dev(struct net_device *dev)
+{
+       return dev->priv_flags & IFF_802_1Q_VLAN;
+}
+
 #endif /* !(__BEN_VLAN_802_1Q_INC__) */
index 146cfb0e98829eac8dc16263ac5912b0f6eedab4..9671aa51af2c79acd1d64d6ed514e8404161310e 100644 (file)
@@ -210,11 +210,6 @@ int vlan_proc_rem_dev(struct net_device *vlandev)
  * The following few functions build the content of /proc/net/vlan/config
  */
 
-static inline int is_vlan_dev(struct net_device *dev)
-{
-       return dev->priv_flags & IFF_802_1Q_VLAN;
-}
-
 /* start read of /proc/net/vlan/config */
 static void *vlan_seq_start(struct seq_file *seq, loff_t *pos)
        __acquires(dev_base_lock)
index 1220d8a41eb5ff52d6726250238c975f4cef4e8a..d366423c8392473e43c8cf2248e33a626bee3eaa 100644 (file)
 /* Bluetooth sockets */
 #define BT_MAX_PROTO   8
 static struct net_proto_family *bt_proto[BT_MAX_PROTO];
+
+static struct lock_class_key bt_slock_key[BT_MAX_PROTO];
+static struct lock_class_key bt_lock_key[BT_MAX_PROTO];
+static const char *bt_key_strings[BT_MAX_PROTO] = {
+       "sk_lock-AF_BLUETOOTH-BTPROTO_L2CAP",
+       "sk_lock-AF_BLUETOOTH-BTPROTO_HCI",
+       "sk_lock-AF_BLUETOOTH-BTPROTO_SCO",
+       "sk_lock-AF_BLUETOOTH-BTPROTO_RFCOMM",
+       "sk_lock-AF_BLUETOOTH-BTPROTO_BNEP",
+       "sk_lock-AF_BLUETOOTH-BTPROTO_CMTP",
+       "sk_lock-AF_BLUETOOTH-BTPROTO_HIDP",
+       "sk_lock-AF_BLUETOOTH-BTPROTO_AVDTP",
+};
+
+static const char *bt_slock_key_strings[BT_MAX_PROTO] = {
+       "slock-AF_BLUETOOTH-BTPROTO_L2CAP",
+       "slock-AF_BLUETOOTH-BTPROTO_HCI",
+       "slock-AF_BLUETOOTH-BTPROTO_SCO",
+       "slock-AF_BLUETOOTH-BTPROTO_RFCOMM",
+       "slock-AF_BLUETOOTH-BTPROTO_BNEP",
+       "slock-AF_BLUETOOTH-BTPROTO_CMTP",
+       "slock-AF_BLUETOOTH-BTPROTO_HIDP",
+       "slock-AF_BLUETOOTH-BTPROTO_AVDTP",
+};
 static DEFINE_RWLOCK(bt_proto_lock);
 
 int bt_sock_register(int proto, struct net_proto_family *ops)
@@ -95,6 +119,21 @@ int bt_sock_unregister(int proto)
 }
 EXPORT_SYMBOL(bt_sock_unregister);
 
+static void bt_reclassify_sock_lock(struct socket *sock, int proto)
+{
+       struct sock *sk = sock->sk;
+
+       if (!sk)
+               return;
+       BUG_ON(sock_owned_by_user(sk));
+
+       sock_lock_init_class_and_name(sk,
+                       bt_slock_key_strings[proto],
+                       &bt_slock_key[proto],
+                       bt_key_strings[proto],
+                       &bt_lock_key[proto]);
+}
+
 static int bt_sock_create(struct net *net, struct socket *sock, int proto)
 {
        int err;
@@ -117,6 +156,7 @@ static int bt_sock_create(struct net *net, struct socket *sock, int proto)
 
        if (bt_proto[proto] && try_module_get(bt_proto[proto]->owner)) {
                err = bt_proto[proto]->create(net, sock, proto);
+               bt_reclassify_sock_lock(sock, proto);
                module_put(bt_proto[proto]->owner);
        }
 
index b5d4019d3572c59eefe328a22085645d6132b136..1d36c093523b988af1c93f0ce5b39d225c7d2b0c 100644 (file)
@@ -84,7 +84,7 @@ static struct hci_sec_filter hci_sec_filter = {
 };
 
 static struct bt_sock_list hci_sk_list = {
-       .lock = RW_LOCK_UNLOCKED
+       .lock = __RW_LOCK_UNLOCKED(hci_sk_list.lock)
 };
 
 /* Send frame to RAW socket */
index 34f8bf98bc0529b4d69f7c60ff6f739ed63077a3..2957df4b6c0b01fd1db0d9e1b45081d41f786739 100644 (file)
@@ -62,7 +62,7 @@ static u32 l2cap_feat_mask = 0x0000;
 static const struct proto_ops l2cap_sock_ops;
 
 static struct bt_sock_list l2cap_sk_list = {
-       .lock = RW_LOCK_UNLOCKED
+       .lock = __RW_LOCK_UNLOCKED(l2cap_sk_list.lock)
 };
 
 static void __l2cap_sock_close(struct sock *sk, int reason);
index 0c2c93735e935417314e30eddbadc017222612ba..eb62558e9b092593269878c23379906cd6985873 100644 (file)
@@ -423,8 +423,8 @@ static int __rfcomm_dlc_close(struct rfcomm_dlc *d, int err)
 
                rfcomm_dlc_lock(d);
                d->state = BT_CLOSED;
-               d->state_change(d, err);
                rfcomm_dlc_unlock(d);
+               d->state_change(d, err);
 
                skb_queue_purge(&d->tx_queue);
                rfcomm_dlc_unlink(d);
index c46d51035e77fa9e1f4db6e95fadb3f2e17f3e60..af4e3934ee841d216970bd5ece7fe4b989c04421 100644 (file)
@@ -60,7 +60,7 @@
 static const struct proto_ops rfcomm_sock_ops;
 
 static struct bt_sock_list rfcomm_sk_list = {
-       .lock = RW_LOCK_UNLOCKED
+       .lock = __RW_LOCK_UNLOCKED(rfcomm_sk_list.lock)
 };
 
 static void rfcomm_sock_close(struct sock *sk);
index e4c779bb8d76e6cf9dfab3b82a3ae33f7276dc68..c3f749abb2d07a1f99274fc71873d86e02f7e9b4 100644 (file)
@@ -570,12 +570,7 @@ static void rfcomm_dev_state_change(struct rfcomm_dlc *dlc, int err)
                                        return;
 
                                rfcomm_dev_del(dev);
-                               /* We have to drop DLC lock here, otherwise
-                                  rfcomm_dev_put() will dead lock if it's
-                                  the last reference. */
-                               rfcomm_dlc_unlock(dlc);
                                rfcomm_dev_put(dev);
-                               rfcomm_dlc_lock(dlc);
                        }
                } else
                        tty_hangup(dev->tty);
index b91d3c81a73c58981ab105dd952bcafc65df35c6..cd887cdca426b68d7af1c58ea9e8e69cd74913e2 100644 (file)
@@ -58,7 +58,7 @@
 static const struct proto_ops sco_sock_ops;
 
 static struct bt_sock_list sco_sk_list = {
-       .lock = RW_LOCK_UNLOCKED
+       .lock = __RW_LOCK_UNLOCKED(sco_sk_list.lock)
 };
 
 static void __sco_chan_add(struct sco_conn *conn, struct sock *sk, struct sock *parent);
index f3ceca31aa45c15e361f3d8557d4a5c13f726905..4e73e5708e700d276ddb3be80a9452931621a15b 100644 (file)
@@ -336,7 +336,7 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb)
        struct scatterlist *asg;
        int err = -EINVAL;
 
-       if (!pskb_may_pull(skb, sizeof(*esph)))
+       if (!pskb_may_pull(skb, sizeof(*esph) + crypto_aead_ivsize(aead)))
                goto out;
 
        if (elen <= 0)
index 724d69aed031974234501ff024852b7a55ea1810..a0a3c78cb5e0dc7ff600bb9897d85d7619153612 100644 (file)
@@ -86,7 +86,10 @@ EXPORT_SYMBOL(inet_frags_fini);
 void inet_frags_exit_net(struct netns_frags *nf, struct inet_frags *f)
 {
        nf->low_thresh = 0;
+
+       local_bh_disable();
        inet_frag_evictor(nf, f);
+       local_bh_enable();
 }
 EXPORT_SYMBOL(inet_frags_exit_net);
 
index 0b3b328d82db608519ce2fbb57050b1f944da959..a4506c8cfef0a9b7788909375f31effa8a505c89 100644 (file)
@@ -85,7 +85,7 @@ int ip_forward(struct sk_buff *skb)
        if (opt->is_strictroute && rt->rt_dst != rt->rt_gateway)
                goto sr_failed;
 
-       if (unlikely(skb->len > dst_mtu(&rt->u.dst) &&
+       if (unlikely(skb->len > dst_mtu(&rt->u.dst) && !skb_is_gso(skb) &&
                     (ip_hdr(skb)->frag_off & htons(IP_DF))) && !skb->local_df) {
                IP_INC_STATS(IPSTATS_MIB_FRAGFAILS);
                icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED,
index fe05da41d6ba6b74947eaaace92eb79d2de408ab..4dc162894cb23261e661235a55bb9aebb60c87b1 100644 (file)
@@ -588,11 +588,9 @@ static int __init ip_queue_init(void)
        }
 
 #ifdef CONFIG_PROC_FS
-       proc = create_proc_entry(IPQ_PROC_FS_NAME, 0, init_net.proc_net);
-       if (proc) {
-               proc->owner = THIS_MODULE;
-               proc->proc_fops = &ip_queue_proc_fops;
-       } else {
+       proc = proc_create(IPQ_PROC_FS_NAME, 0, init_net.proc_net,
+                          &ip_queue_proc_fops);
+       if (!proc) {
                printk(KERN_ERR "ip_queue: failed to create proc entry\n");
                goto cleanup_ipqnl;
        }
index c6cf84c776116a6db394da69947547d20e324b17..52926c8e3cc17266f29269cce5ed061c339d7115 100644 (file)
@@ -167,14 +167,13 @@ clusterip_config_init(struct ipt_clusterip_tgt_info *i, __be32 ip,
 
                /* create proc dir entry */
                sprintf(buffer, "%u.%u.%u.%u", NIPQUAD(ip));
-               c->pde = create_proc_entry(buffer, S_IWUSR|S_IRUSR,
-                                          clusterip_procdir);
+               c->pde = proc_create(buffer, S_IWUSR|S_IRUSR,
+                                    clusterip_procdir, &clusterip_proc_fops);
                if (!c->pde) {
                        kfree(c);
                        return NULL;
                }
        }
-       c->pde->proc_fops = &clusterip_proc_fops;
        c->pde->data = c;
 #endif
 
index 8e8f0425a8ede2b22c02763d4b5282b4bdcf6b40..50e06690eb5b8fa6bceff977ea09127adb18bfb9 100644 (file)
@@ -276,12 +276,11 @@ recent_mt_check(const char *tablename, const void *ip,
        for (i = 0; i < ip_list_hash_size; i++)
                INIT_LIST_HEAD(&t->iphash[i]);
 #ifdef CONFIG_PROC_FS
-       t->proc = create_proc_entry(t->name, ip_list_perms, proc_dir);
+       t->proc = proc_create(t->name, ip_list_perms, proc_dir, &recent_fops);
        if (t->proc == NULL) {
                kfree(t);
                goto out;
        }
-       t->proc->proc_fops = &recent_fops;
        t->proc->uid       = ip_list_uid;
        t->proc->gid       = ip_list_gid;
        t->proc->data      = t;
index 089252e82c01fb93b55efa15c0e7a7f74d36398d..f500b0fdaef422c6ae40cc9ed548a3fecaaf6b0f 100644 (file)
@@ -395,13 +395,10 @@ int __init nf_conntrack_ipv4_compat_init(void)
        if (!proc_exp)
                goto err2;
 
-       proc_stat = create_proc_entry("ip_conntrack", S_IRUGO, init_net.proc_net_stat);
+       proc_stat = proc_create("ip_conntrack", S_IRUGO,
+                               init_net.proc_net_stat, &ct_cpu_seq_fops);
        if (!proc_stat)
                goto err3;
-
-       proc_stat->proc_fops = &ct_cpu_seq_fops;
-       proc_stat->owner = THIS_MODULE;
-
        return 0;
 
 err3:
index 7ea1b67b6de1cccbbc5d4332ef45df04578b8aae..1704c1474ea1c622e4c9c4375beea692b12f8072 100644 (file)
@@ -1556,14 +1556,14 @@ static void *udp_seq_start(struct seq_file *seq, loff_t *pos)
        __acquires(udp_hash_lock)
 {
        read_lock(&udp_hash_lock);
-       return *pos ? udp_get_idx(seq, *pos-1) : (void *)1;
+       return *pos ? udp_get_idx(seq, *pos-1) : SEQ_START_TOKEN;
 }
 
 static void *udp_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 {
        struct sock *sk;
 
-       if (v == (void *)1)
+       if (v == SEQ_START_TOKEN)
                sk = udp_get_idx(seq, 0);
        else
                sk = udp_get_next(seq, v);
index 101e0e70ba276966a281b99601c17cfaf648f0c5..e7a1882db048289c710b957fa5e9c6b99941f4f5 100644 (file)
@@ -776,6 +776,7 @@ static int ipv6_create_tempaddr(struct inet6_ifaddr *ifp, struct inet6_ifaddr *i
        struct inet6_dev *idev = ifp->idev;
        struct in6_addr addr, *tmpaddr;
        unsigned long tmp_prefered_lft, tmp_valid_lft, tmp_cstamp, tmp_tstamp;
+       unsigned long regen_advance;
        int tmp_plen;
        int ret = 0;
        int max_addresses;
@@ -836,8 +837,23 @@ retry:
        tmp_tstamp = ifp->tstamp;
        spin_unlock_bh(&ifp->lock);
 
+       regen_advance = idev->cnf.regen_max_retry *
+                       idev->cnf.dad_transmits *
+                       idev->nd_parms->retrans_time / HZ;
        write_unlock(&idev->lock);
 
+       /* A temporary address is created only if this calculated Preferred
+        * Lifetime is greater than REGEN_ADVANCE time units.  In particular,
+        * an implementation must not create a temporary address with a zero
+        * Preferred Lifetime.
+        */
+       if (tmp_prefered_lft <= regen_advance) {
+               in6_ifa_put(ifp);
+               in6_dev_put(idev);
+               ret = -1;
+               goto out;
+       }
+
        addr_flags = IFA_F_TEMPORARY;
        /* set in addrconf_prefix_rcv() */
        if (ifp->flags & IFA_F_OPTIMISTIC)
@@ -1831,6 +1847,9 @@ ok:
                                 * lifetimes of an existing temporary address
                                 * when processing a Prefix Information Option.
                                 */
+                               if (ifp != ift->ifpub)
+                                       continue;
+
                                spin_lock(&ift->lock);
                                flags = ift->flags;
                                if (ift->valid_lft > valid_lft &&
index 0ec1402320ea63898bd9761b6bb243cab14dad12..c6bb4c6d24b38352b4430e7892b59068714a9b3e 100644 (file)
@@ -282,7 +282,7 @@ static int esp6_input(struct xfrm_state *x, struct sk_buff *skb)
        struct scatterlist *sg;
        struct scatterlist *asg;
 
-       if (!pskb_may_pull(skb, sizeof(*esph))) {
+       if (!pskb_may_pull(skb, sizeof(*esph) + crypto_aead_ivsize(aead))) {
                ret = -EINVAL;
                goto out;
        }
index 121d517bf91c9d16467c5aa85df47efdd0b6c58e..f204a7275a0d0e1e740d64f713d7d3d28cda9b78 100644 (file)
@@ -436,10 +436,10 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
        }
 
        if (xfrm_decode_session_reverse(skb, &fl2, AF_INET6))
-               goto out;
+               goto out_dst_release;
 
        if (ip6_dst_lookup(sk, &dst2, &fl))
-               goto out;
+               goto out_dst_release;
 
        err = xfrm_lookup(&dst2, &fl, sk, XFRM_LOOKUP_ICMP);
        if (err == -ENOENT) {
index 178aebc0427a1d05051598b9ab2f6b233abfbb66..98ab4f459905dce22f29a46450157a7ba8623f32 100644 (file)
@@ -239,8 +239,7 @@ int ip6_mc_input(struct sk_buff *skb)
        IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), IPSTATS_MIB_INMCASTPKTS);
 
        hdr = ipv6_hdr(skb);
-       deliver = unlikely(skb->dev->flags & (IFF_PROMISC|IFF_ALLMULTI)) ||
-           ipv6_chk_mcast_addr(skb->dev, &hdr->daddr, NULL);
+       deliver = ipv6_chk_mcast_addr(skb->dev, &hdr->daddr, NULL);
 
        /*
         *      IPv6 multicast router mode isnt currently supported.
index cc2f9afcf8087516215f52f8719d7dfa1593a316..8d366f7f2a9a5b3818bfdfddeddff079e7470880 100644 (file)
@@ -591,11 +591,9 @@ static int __init ip6_queue_init(void)
        }
 
 #ifdef CONFIG_PROC_FS
-       proc = create_proc_entry(IPQ_PROC_FS_NAME, 0, init_net.proc_net);
-       if (proc) {
-               proc->owner = THIS_MODULE;
-               proc->proc_fops = &ip6_queue_proc_fops;
-       } else {
+       proc = proc_create(IPQ_PROC_FS_NAME, 0, init_net.proc_net,
+                          &ip6_queue_proc_fops);
+       if (!proc) {
                printk(KERN_ERR "ip6_queue: failed to create proc entry\n");
                goto cleanup_ipqnl;
        }
index 2a0d698b24d5b3404305c1ebacb7306080bd0a52..24c0d03095bf8620894d4d2748b9953bc66f90a7 100644 (file)
@@ -171,7 +171,9 @@ static __inline__ void fq_kill(struct nf_ct_frag6_queue *fq)
 
 static void nf_ct_frag6_evictor(void)
 {
+       local_bh_disable();
        inet_frag_evictor(&nf_init_frags, &nf_frags);
+       local_bh_enable();
 }
 
 static void nf_ct_frag6_expire(unsigned long data)
index 46cf962f7f8889f049a3b0406f9f5f3b6c31034c..8c50eb430c19514f1aa811ef77bc6a12c5f7a399 100644 (file)
@@ -155,6 +155,9 @@ static int llc_ui_create(struct net *net, struct socket *sock, int protocol)
        struct sock *sk;
        int rc = -ESOCKTNOSUPPORT;
 
+       if (!capable(CAP_NET_RAW))
+               return -EPERM;
+
        if (net != &init_net)
                return -EAFNOSUPPORT;
 
index 860140caa6e0ea9aa0a2b61114456e6d74a0db6b..71a00225bdb3de0a33c26c6be603c5354d2c530a 100644 (file)
@@ -198,7 +198,7 @@ int llc_conn_ac_send_disc_cmd_p_set_x(struct sock *sk, struct sk_buff *skb)
 {
        int rc = -ENOBUFS;
        struct llc_sock *llc = llc_sk(sk);
-       struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev);
+       struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_U, 0);
 
        if (nskb) {
                struct llc_sap *sap = llc->sap;
@@ -223,7 +223,7 @@ int llc_conn_ac_send_dm_rsp_f_set_p(struct sock *sk, struct sk_buff *skb)
 {
        int rc = -ENOBUFS;
        struct llc_sock *llc = llc_sk(sk);
-       struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev);
+       struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_U, 0);
 
        if (nskb) {
                struct llc_sap *sap = llc->sap;
@@ -249,7 +249,7 @@ int llc_conn_ac_send_dm_rsp_f_set_1(struct sock *sk, struct sk_buff *skb)
 {
        int rc = -ENOBUFS;
        struct llc_sock *llc = llc_sk(sk);
-       struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev);
+       struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_U, 0);
 
        if (nskb) {
                struct llc_sap *sap = llc->sap;
@@ -282,7 +282,8 @@ int llc_conn_ac_send_frmr_rsp_f_set_x(struct sock *sk, struct sk_buff *skb)
                llc_pdu_decode_pf_bit(skb, &f_bit);
        else
                f_bit = 0;
-       nskb = llc_alloc_frame(sk, llc->dev);
+       nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_U,
+                              sizeof(struct llc_frmr_info));
        if (nskb) {
                struct llc_sap *sap = llc->sap;
 
@@ -306,7 +307,8 @@ int llc_conn_ac_resend_frmr_rsp_f_set_0(struct sock *sk, struct sk_buff *skb)
 {
        int rc = -ENOBUFS;
        struct llc_sock *llc = llc_sk(sk);
-       struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev);
+       struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_U,
+                                              sizeof(struct llc_frmr_info));
 
        if (nskb) {
                struct llc_sap *sap = llc->sap;
@@ -336,7 +338,8 @@ int llc_conn_ac_resend_frmr_rsp_f_set_p(struct sock *sk, struct sk_buff *skb)
        struct llc_sock *llc = llc_sk(sk);
 
        llc_pdu_decode_pf_bit(skb, &f_bit);
-       nskb = llc_alloc_frame(sk, llc->dev);
+       nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_U,
+                              sizeof(struct llc_frmr_info));
        if (nskb) {
                struct llc_sap *sap = llc->sap;
                struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
@@ -424,7 +427,7 @@ int llc_conn_ac_resend_i_xxx_x_set_0_or_send_rr(struct sock *sk,
        struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
        int rc = -ENOBUFS;
        struct llc_sock *llc = llc_sk(sk);
-       struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev);
+       struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_U, 0);
 
        if (nskb) {
                struct llc_sap *sap = llc->sap;
@@ -459,7 +462,7 @@ int llc_conn_ac_send_rej_cmd_p_set_1(struct sock *sk, struct sk_buff *skb)
 {
        int rc = -ENOBUFS;
        struct llc_sock *llc = llc_sk(sk);
-       struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev);
+       struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0);
 
        if (nskb) {
                struct llc_sap *sap = llc->sap;
@@ -483,7 +486,7 @@ int llc_conn_ac_send_rej_rsp_f_set_1(struct sock *sk, struct sk_buff *skb)
 {
        int rc = -ENOBUFS;
        struct llc_sock *llc = llc_sk(sk);
-       struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev);
+       struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0);
 
        if (nskb) {
                struct llc_sap *sap = llc->sap;
@@ -507,7 +510,7 @@ int llc_conn_ac_send_rej_xxx_x_set_0(struct sock *sk, struct sk_buff *skb)
 {
        int rc = -ENOBUFS;
        struct llc_sock *llc = llc_sk(sk);
-       struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev);
+       struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0);
 
        if (nskb) {
                struct llc_sap *sap = llc->sap;
@@ -531,7 +534,7 @@ int llc_conn_ac_send_rnr_cmd_p_set_1(struct sock *sk, struct sk_buff *skb)
 {
        int rc = -ENOBUFS;
        struct llc_sock *llc = llc_sk(sk);
-       struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev);
+       struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0);
 
        if (nskb) {
                struct llc_sap *sap = llc->sap;
@@ -555,7 +558,7 @@ int llc_conn_ac_send_rnr_rsp_f_set_1(struct sock *sk, struct sk_buff *skb)
 {
        int rc = -ENOBUFS;
        struct llc_sock *llc = llc_sk(sk);
-       struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev);
+       struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0);
 
        if (nskb) {
                struct llc_sap *sap = llc->sap;
@@