lkml.org 
[lkml]   [2013]   [Dec]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: Linux 3.12.5

    diff --git a/Makefile b/Makefile
    index 3b7165eb4734..986f3cdbad56 100644
    --- a/Makefile
    +++ b/Makefile
    @@ -1,6 +1,6 @@
    VERSION = 3
    PATCHLEVEL = 12
    -SUBLEVEL = 4
    +SUBLEVEL = 5
    EXTRAVERSION =
    NAME = One Giant Leap for Frogkind

    diff --git a/arch/arm/boot/dts/armada-370-db.dts b/arch/arm/boot/dts/armada-370-db.dts
    index 90ce29dbe119..08a56bcfc724 100644
    --- a/arch/arm/boot/dts/armada-370-db.dts
    +++ b/arch/arm/boot/dts/armada-370-db.dts
    @@ -99,22 +99,22 @@
    spi-max-frequency = <50000000>;
    };
    };
    + };

    - pcie-controller {
    + pcie-controller {
    + status = "okay";
    + /*
    + * The two PCIe units are accessible through
    + * both standard PCIe slots and mini-PCIe
    + * slots on the board.
    + */
    + pcie@1,0 {
    + /* Port 0, Lane 0 */
    + status = "okay";
    + };
    + pcie@2,0 {
    + /* Port 1, Lane 0 */
    status = "okay";
    - /*
    - * The two PCIe units are accessible through
    - * both standard PCIe slots and mini-PCIe
    - * slots on the board.
    - */
    - pcie@1,0 {
    - /* Port 0, Lane 0 */
    - status = "okay";
    - };
    - pcie@2,0 {
    - /* Port 1, Lane 0 */
    - status = "okay";
    - };
    };
    };
    };
    diff --git a/arch/arm/boot/dts/armada-370-xp.dtsi b/arch/arm/boot/dts/armada-370-xp.dtsi
    index 1de2dae0fdae..b97ab017d4a2 100644
    --- a/arch/arm/boot/dts/armada-370-xp.dtsi
    +++ b/arch/arm/boot/dts/armada-370-xp.dtsi
    @@ -117,7 +117,7 @@

    coherency-fabric@20200 {
    compatible = "marvell,coherency-fabric";
    - reg = <0x20200 0xb0>, <0x21810 0x1c>;
    + reg = <0x20200 0xb0>, <0x21010 0x1c>;
    };

    serial@12000 {
    diff --git a/arch/arm/boot/dts/armada-xp-mv78230.dtsi b/arch/arm/boot/dts/armada-xp-mv78230.dtsi
    index 0358a33cba48..9dc7381d57c2 100644
    --- a/arch/arm/boot/dts/armada-xp-mv78230.dtsi
    +++ b/arch/arm/boot/dts/armada-xp-mv78230.dtsi
    @@ -47,7 +47,7 @@
    /*
    * MV78230 has 2 PCIe units Gen2.0: One unit can be
    * configured as x4 or quad x1 lanes. One unit is
    - * x4/x1.
    + * x1 only.
    */
    pcie-controller {
    compatible = "marvell,armada-xp-pcie";
    @@ -61,10 +61,10 @@

    ranges =
    <0x82000000 0 0x40000 MBUS_ID(0xf0, 0x01) 0x40000 0 0x00002000 /* Port 0.0 registers */
    - 0x82000000 0 0x42000 MBUS_ID(0xf0, 0x01) 0x42000 0 0x00002000 /* Port 2.0 registers */
    0x82000000 0 0x44000 MBUS_ID(0xf0, 0x01) 0x44000 0 0x00002000 /* Port 0.1 registers */
    0x82000000 0 0x48000 MBUS_ID(0xf0, 0x01) 0x48000 0 0x00002000 /* Port 0.2 registers */
    0x82000000 0 0x4c000 MBUS_ID(0xf0, 0x01) 0x4c000 0 0x00002000 /* Port 0.3 registers */
    + 0x82000000 0 0x80000 MBUS_ID(0xf0, 0x01) 0x80000 0 0x00002000 /* Port 1.0 registers */
    0x82000000 0x1 0 MBUS_ID(0x04, 0xe8) 0 1 0 /* Port 0.0 MEM */
    0x81000000 0x1 0 MBUS_ID(0x04, 0xe0) 0 1 0 /* Port 0.0 IO */
    0x82000000 0x2 0 MBUS_ID(0x04, 0xd8) 0 1 0 /* Port 0.1 MEM */
    @@ -73,8 +73,8 @@
    0x81000000 0x3 0 MBUS_ID(0x04, 0xb0) 0 1 0 /* Port 0.2 IO */
    0x82000000 0x4 0 MBUS_ID(0x04, 0x78) 0 1 0 /* Port 0.3 MEM */
    0x81000000 0x4 0 MBUS_ID(0x04, 0x70) 0 1 0 /* Port 0.3 IO */
    - 0x82000000 0x9 0 MBUS_ID(0x04, 0xf8) 0 1 0 /* Port 2.0 MEM */
    - 0x81000000 0x9 0 MBUS_ID(0x04, 0xf0) 0 1 0 /* Port 2.0 IO */>;
    + 0x82000000 0x5 0 MBUS_ID(0x08, 0xe8) 0 1 0 /* Port 1.0 MEM */
    + 0x81000000 0x5 0 MBUS_ID(0x08, 0xe0) 0 1 0 /* Port 1.0 IO */>;

    pcie@1,0 {
    device_type = "pci";
    @@ -144,20 +144,20 @@
    status = "disabled";
    };

    - pcie@9,0 {
    + pcie@5,0 {
    device_type = "pci";
    - assigned-addresses = <0x82000800 0 0x42000 0 0x2000>;
    - reg = <0x4800 0 0 0 0>;
    + assigned-addresses = <0x82000800 0 0x80000 0 0x2000>;
    + reg = <0x2800 0 0 0 0>;
    #address-cells = <3>;
    #size-cells = <2>;
    #interrupt-cells = <1>;
    - ranges = <0x82000000 0 0 0x82000000 0x9 0 1 0
    - 0x81000000 0 0 0x81000000 0x9 0 1 0>;
    + ranges = <0x82000000 0 0 0x82000000 0x5 0 1 0
    + 0x81000000 0 0 0x81000000 0x5 0 1 0>;
    interrupt-map-mask = <0 0 0 0>;
    - interrupt-map = <0 0 0 0 &mpic 99>;
    - marvell,pcie-port = <2>;
    + interrupt-map = <0 0 0 0 &mpic 62>;
    + marvell,pcie-port = <1>;
    marvell,pcie-lane = <0>;
    - clocks = <&gateclk 26>;
    + clocks = <&gateclk 9>;
    status = "disabled";
    };
    };
    diff --git a/arch/arm/boot/dts/armada-xp-mv78260.dtsi b/arch/arm/boot/dts/armada-xp-mv78260.dtsi
    index 0e82c5062243..a598ce9035f5 100644
    --- a/arch/arm/boot/dts/armada-xp-mv78260.dtsi
    +++ b/arch/arm/boot/dts/armada-xp-mv78260.dtsi
    @@ -48,7 +48,7 @@
    /*
    * MV78260 has 3 PCIe units Gen2.0: Two units can be
    * configured as x4 or quad x1 lanes. One unit is
    - * x4/x1.
    + * x4 only.
    */
    pcie-controller {
    compatible = "marvell,armada-xp-pcie";
    @@ -67,7 +67,9 @@
    0x82000000 0 0x48000 MBUS_ID(0xf0, 0x01) 0x48000 0 0x00002000 /* Port 0.2 registers */
    0x82000000 0 0x4c000 MBUS_ID(0xf0, 0x01) 0x4c000 0 0x00002000 /* Port 0.3 registers */
    0x82000000 0 0x80000 MBUS_ID(0xf0, 0x01) 0x80000 0 0x00002000 /* Port 1.0 registers */
    - 0x82000000 0 0x82000 MBUS_ID(0xf0, 0x01) 0x82000 0 0x00002000 /* Port 3.0 registers */
    + 0x82000000 0 0x84000 MBUS_ID(0xf0, 0x01) 0x84000 0 0x00002000 /* Port 1.1 registers */
    + 0x82000000 0 0x88000 MBUS_ID(0xf0, 0x01) 0x88000 0 0x00002000 /* Port 1.2 registers */
    + 0x82000000 0 0x8c000 MBUS_ID(0xf0, 0x01) 0x8c000 0 0x00002000 /* Port 1.3 registers */
    0x82000000 0x1 0 MBUS_ID(0x04, 0xe8) 0 1 0 /* Port 0.0 MEM */
    0x81000000 0x1 0 MBUS_ID(0x04, 0xe0) 0 1 0 /* Port 0.0 IO */
    0x82000000 0x2 0 MBUS_ID(0x04, 0xd8) 0 1 0 /* Port 0.1 MEM */
    @@ -76,10 +78,18 @@
    0x81000000 0x3 0 MBUS_ID(0x04, 0xb0) 0 1 0 /* Port 0.2 IO */
    0x82000000 0x4 0 MBUS_ID(0x04, 0x78) 0 1 0 /* Port 0.3 MEM */
    0x81000000 0x4 0 MBUS_ID(0x04, 0x70) 0 1 0 /* Port 0.3 IO */
    - 0x82000000 0x9 0 MBUS_ID(0x08, 0xe8) 0 1 0 /* Port 1.0 MEM */
    - 0x81000000 0x9 0 MBUS_ID(0x08, 0xe0) 0 1 0 /* Port 1.0 IO */
    - 0x82000000 0xa 0 MBUS_ID(0x08, 0xf8) 0 1 0 /* Port 3.0 MEM */
    - 0x81000000 0xa 0 MBUS_ID(0x08, 0xf0) 0 1 0 /* Port 3.0 IO */>;
    +
    + 0x82000000 0x5 0 MBUS_ID(0x08, 0xe8) 0 1 0 /* Port 1.0 MEM */
    + 0x81000000 0x5 0 MBUS_ID(0x08, 0xe0) 0 1 0 /* Port 1.0 IO */
    + 0x82000000 0x6 0 MBUS_ID(0x08, 0xd8) 0 1 0 /* Port 1.1 MEM */
    + 0x81000000 0x6 0 MBUS_ID(0x08, 0xd0) 0 1 0 /* Port 1.1 IO */
    + 0x82000000 0x7 0 MBUS_ID(0x08, 0xb8) 0 1 0 /* Port 1.2 MEM */
    + 0x81000000 0x7 0 MBUS_ID(0x08, 0xb0) 0 1 0 /* Port 1.2 IO */
    + 0x82000000 0x8 0 MBUS_ID(0x08, 0x78) 0 1 0 /* Port 1.3 MEM */
    + 0x81000000 0x8 0 MBUS_ID(0x08, 0x70) 0 1 0 /* Port 1.3 IO */
    +
    + 0x82000000 0x9 0 MBUS_ID(0x04, 0xf8) 0 1 0 /* Port 2.0 MEM */
    + 0x81000000 0x9 0 MBUS_ID(0x04, 0xf0) 0 1 0 /* Port 2.0 IO */>;

    pcie@1,0 {
    device_type = "pci";
    @@ -105,8 +115,8 @@
    #address-cells = <3>;
    #size-cells = <2>;
    #interrupt-cells = <1>;
    - ranges = <0x82000000 0 0 0x82000000 0x2 0 1 0
    - 0x81000000 0 0 0x81000000 0x2 0 1 0>;
    + ranges = <0x82000000 0 0 0x82000000 0x2 0 1 0
    + 0x81000000 0 0 0x81000000 0x2 0 1 0>;
    interrupt-map-mask = <0 0 0 0>;
    interrupt-map = <0 0 0 0 &mpic 59>;
    marvell,pcie-port = <0>;
    @@ -149,37 +159,88 @@
    status = "disabled";
    };

    - pcie@9,0 {
    + pcie@5,0 {
    device_type = "pci";
    - assigned-addresses = <0x82000800 0 0x42000 0 0x2000>;
    - reg = <0x4800 0 0 0 0>;
    + assigned-addresses = <0x82000800 0 0x80000 0 0x2000>;
    + reg = <0x2800 0 0 0 0>;
    #address-cells = <3>;
    #size-cells = <2>;
    #interrupt-cells = <1>;
    - ranges = <0x82000000 0 0 0x82000000 0x9 0 1 0
    - 0x81000000 0 0 0x81000000 0x9 0 1 0>;
    + ranges = <0x82000000 0 0 0x82000000 0x5 0 1 0
    + 0x81000000 0 0 0x81000000 0x5 0 1 0>;
    interrupt-map-mask = <0 0 0 0>;
    - interrupt-map = <0 0 0 0 &mpic 99>;
    - marvell,pcie-port = <2>;
    + interrupt-map = <0 0 0 0 &mpic 62>;
    + marvell,pcie-port = <1>;
    marvell,pcie-lane = <0>;
    - clocks = <&gateclk 26>;
    + clocks = <&gateclk 9>;
    status = "disabled";
    };

    - pcie@10,0 {
    + pcie@6,0 {
    device_type = "pci";
    - assigned-addresses = <0x82000800 0 0x82000 0 0x2000>;
    - reg = <0x5000 0 0 0 0>;
    + assigned-addresses = <0x82000800 0 0x84000 0 0x2000>;
    + reg = <0x3000 0 0 0 0>;
    #address-cells = <3>;
    #size-cells = <2>;
    #interrupt-cells = <1>;
    - ranges = <0x82000000 0 0 0x82000000 0xa 0 1 0
    - 0x81000000 0 0 0x81000000 0xa 0 1 0>;
    + ranges = <0x82000000 0 0 0x82000000 0x6 0 1 0
    + 0x81000000 0 0 0x81000000 0x6 0 1 0>;
    interrupt-map-mask = <0 0 0 0>;
    - interrupt-map = <0 0 0 0 &mpic 103>;
    - marvell,pcie-port = <3>;
    + interrupt-map = <0 0 0 0 &mpic 63>;
    + marvell,pcie-port = <1>;
    + marvell,pcie-lane = <1>;
    + clocks = <&gateclk 10>;
    + status = "disabled";
    + };
    +
    + pcie@7,0 {
    + device_type = "pci";
    + assigned-addresses = <0x82000800 0 0x88000 0 0x2000>;
    + reg = <0x3800 0 0 0 0>;
    + #address-cells = <3>;
    + #size-cells = <2>;
    + #interrupt-cells = <1>;
    + ranges = <0x82000000 0 0 0x82000000 0x7 0 1 0
    + 0x81000000 0 0 0x81000000 0x7 0 1 0>;
    + interrupt-map-mask = <0 0 0 0>;
    + interrupt-map = <0 0 0 0 &mpic 64>;
    + marvell,pcie-port = <1>;
    + marvell,pcie-lane = <2>;
    + clocks = <&gateclk 11>;
    + status = "disabled";
    + };
    +
    + pcie@8,0 {
    + device_type = "pci";
    + assigned-addresses = <0x82000800 0 0x8c000 0 0x2000>;
    + reg = <0x4000 0 0 0 0>;
    + #address-cells = <3>;
    + #size-cells = <2>;
    + #interrupt-cells = <1>;
    + ranges = <0x82000000 0 0 0x82000000 0x8 0 1 0
    + 0x81000000 0 0 0x81000000 0x8 0 1 0>;
    + interrupt-map-mask = <0 0 0 0>;
    + interrupt-map = <0 0 0 0 &mpic 65>;
    + marvell,pcie-port = <1>;
    + marvell,pcie-lane = <3>;
    + clocks = <&gateclk 12>;
    + status = "disabled";
    + };
    +
    + pcie@9,0 {
    + device_type = "pci";
    + assigned-addresses = <0x82000800 0 0x42000 0 0x2000>;
    + reg = <0x4800 0 0 0 0>;
    + #address-cells = <3>;
    + #size-cells = <2>;
    + #interrupt-cells = <1>;
    + ranges = <0x82000000 0 0 0x82000000 0x9 0 1 0
    + 0x81000000 0 0 0x81000000 0x9 0 1 0>;
    + interrupt-map-mask = <0 0 0 0>;
    + interrupt-map = <0 0 0 0 &mpic 99>;
    + marvell,pcie-port = <2>;
    marvell,pcie-lane = <0>;
    - clocks = <&gateclk 27>;
    + clocks = <&gateclk 26>;
    status = "disabled";
    };
    };
    diff --git a/arch/arm/boot/dts/omap4-panda-common.dtsi b/arch/arm/boot/dts/omap4-panda-common.dtsi
    index 814ab67c8c29..b74879b42515 100644
    --- a/arch/arm/boot/dts/omap4-panda-common.dtsi
    +++ b/arch/arm/boot/dts/omap4-panda-common.dtsi
    @@ -239,15 +239,6 @@
    0xf0 (PIN_INPUT_PULLUP | MUX_MODE0) /* i2c4_sda */
    >;
    };
    -};
    -
    -&omap4_pmx_wkup {
    - led_wkgpio_pins: pinmux_leds_wkpins {
    - pinctrl-single,pins = <
    - 0x1a (PIN_OUTPUT | MUX_MODE3) /* gpio_wk7 */
    - 0x1c (PIN_OUTPUT | MUX_MODE3) /* gpio_wk8 */
    - >;
    - };

    /*
    * wl12xx GPIO outputs for WLAN_EN, BT_EN, FM_EN, BT_WAKEUP
    @@ -267,7 +258,7 @@
    pinctrl-single,pins = <
    0x38 (PIN_INPUT | MUX_MODE3) /* gpmc_ncs2.gpio_52 */
    0x3a (PIN_INPUT | MUX_MODE3) /* gpmc_ncs3.gpio_53 */
    - 0x108 (PIN_OUTPUT | MUX_MODE0) /* sdmmc5_clk.sdmmc5_clk */
    + 0x108 (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc5_clk.sdmmc5_clk */
    0x10a (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc5_cmd.sdmmc5_cmd */
    0x10c (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc5_dat0.sdmmc5_dat0 */
    0x10e (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc5_dat1.sdmmc5_dat1 */
    @@ -277,6 +268,15 @@
    };
    };

    +&omap4_pmx_wkup {
    + led_wkgpio_pins: pinmux_leds_wkpins {
    + pinctrl-single,pins = <
    + 0x1a (PIN_OUTPUT | MUX_MODE3) /* gpio_wk7 */
    + 0x1c (PIN_OUTPUT | MUX_MODE3) /* gpio_wk8 */
    + >;
    + };
    +};
    +
    &i2c1 {
    pinctrl-names = "default";
    pinctrl-0 = <&i2c1_pins>;
    diff --git a/arch/arm/configs/multi_v7_defconfig b/arch/arm/configs/multi_v7_defconfig
    index 119fc378fc52..fe88105a0421 100644
    --- a/arch/arm/configs/multi_v7_defconfig
    +++ b/arch/arm/configs/multi_v7_defconfig
    @@ -132,12 +132,14 @@ CONFIG_USB_GPIO_VBUS=y
    CONFIG_USB_ISP1301=y
    CONFIG_USB_MXS_PHY=y
    CONFIG_MMC=y
    +CONFIG_MMC_BLOCK_MINORS=16
    CONFIG_MMC_ARMMMCI=y
    CONFIG_MMC_SDHCI=y
    CONFIG_MMC_SDHCI_PLTFM=y
    CONFIG_MMC_SDHCI_ESDHC_IMX=y
    CONFIG_MMC_SDHCI_TEGRA=y
    CONFIG_MMC_SDHCI_SPEAR=y
    +CONFIG_MMC_SDHCI_BCM_KONA=y
    CONFIG_MMC_OMAP=y
    CONFIG_MMC_OMAP_HS=y
    CONFIG_EDAC=y
    diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h
    index be956dbf6bae..1571d126e9dd 100644
    --- a/arch/arm/include/asm/pgtable.h
    +++ b/arch/arm/include/asm/pgtable.h
    @@ -61,7 +61,7 @@ extern void __pgd_error(const char *file, int line, pgd_t);
    * mapping to be mapped at. This is particularly important for
    * non-high vector CPUs.
    */
    -#define FIRST_USER_ADDRESS PAGE_SIZE
    +#define FIRST_USER_ADDRESS (PAGE_SIZE * 2)

    /*
    * Use TASK_SIZE as the ceiling argument for free_pgtables() and
    diff --git a/arch/arm/mach-at91/sama5d3.c b/arch/arm/mach-at91/sama5d3.c
    index 3ea86428ee09..a28873fe3049 100644
    --- a/arch/arm/mach-at91/sama5d3.c
    +++ b/arch/arm/mach-at91/sama5d3.c
    @@ -95,19 +95,19 @@ static struct clk twi0_clk = {
    .name = "twi0_clk",
    .pid = SAMA5D3_ID_TWI0,
    .type = CLK_TYPE_PERIPHERAL,
    - .div = AT91_PMC_PCR_DIV2,
    + .div = AT91_PMC_PCR_DIV8,
    };
    static struct clk twi1_clk = {
    .name = "twi1_clk",
    .pid = SAMA5D3_ID_TWI1,
    .type = CLK_TYPE_PERIPHERAL,
    - .div = AT91_PMC_PCR_DIV2,
    + .div = AT91_PMC_PCR_DIV8,
    };
    static struct clk twi2_clk = {
    .name = "twi2_clk",
    .pid = SAMA5D3_ID_TWI2,
    .type = CLK_TYPE_PERIPHERAL,
    - .div = AT91_PMC_PCR_DIV2,
    + .div = AT91_PMC_PCR_DIV8,
    };
    static struct clk mmc0_clk = {
    .name = "mci0_clk",
    diff --git a/arch/arm/mach-footbridge/common.c b/arch/arm/mach-footbridge/common.c
    index 2739ca2c1334..e0091685fd48 100644
    --- a/arch/arm/mach-footbridge/common.c
    +++ b/arch/arm/mach-footbridge/common.c
    @@ -15,6 +15,7 @@
    #include <linux/init.h>
    #include <linux/io.h>
    #include <linux/spinlock.h>
    +#include <video/vga.h>

    #include <asm/pgtable.h>
    #include <asm/page.h>
    @@ -196,6 +197,8 @@ void __init footbridge_map_io(void)
    iotable_init(ebsa285_host_io_desc, ARRAY_SIZE(ebsa285_host_io_desc));
    pci_map_io_early(__phys_to_pfn(DC21285_PCI_IO));
    }
    +
    + vga_base = PCIMEM_BASE;
    }

    void footbridge_restart(enum reboot_mode mode, const char *cmd)
    diff --git a/arch/arm/mach-footbridge/dc21285.c b/arch/arm/mach-footbridge/dc21285.c
    index 3490a24f969e..7c2fdae9a38b 100644
    --- a/arch/arm/mach-footbridge/dc21285.c
    +++ b/arch/arm/mach-footbridge/dc21285.c
    @@ -18,7 +18,6 @@
    #include <linux/irq.h>
    #include <linux/io.h>
    #include <linux/spinlock.h>
    -#include <video/vga.h>

    #include <asm/irq.h>
    #include <asm/mach/pci.h>
    @@ -291,7 +290,6 @@ void __init dc21285_preinit(void)
    int cfn_mode;

    pcibios_min_mem = 0x81000000;
    - vga_base = PCIMEM_BASE;

    mem_size = (unsigned int)high_memory - PAGE_OFFSET;
    for (mem_mask = 0x00100000; mem_mask < 0x10000000; mem_mask <<= 1)
    diff --git a/arch/arm/mach-footbridge/ebsa285.c b/arch/arm/mach-footbridge/ebsa285.c
    index b08243500e2e..1a7235fb52ac 100644
    --- a/arch/arm/mach-footbridge/ebsa285.c
    +++ b/arch/arm/mach-footbridge/ebsa285.c
    @@ -30,21 +30,24 @@ static const struct {
    const char *name;
    const char *trigger;
    } ebsa285_leds[] = {
    - { "ebsa285:amber", "heartbeat", },
    - { "ebsa285:green", "cpu0", },
    + { "ebsa285:amber", "cpu0", },
    + { "ebsa285:green", "heartbeat", },
    { "ebsa285:red",},
    };

    +static unsigned char hw_led_state;
    +
    static void ebsa285_led_set(struct led_classdev *cdev,
    enum led_brightness b)
    {
    struct ebsa285_led *led = container_of(cdev,
    struct ebsa285_led, cdev);

    - if (b != LED_OFF)
    - *XBUS_LEDS |= led->mask;
    + if (b == LED_OFF)
    + hw_led_state |= led->mask;
    else
    - *XBUS_LEDS &= ~led->mask;
    + hw_led_state &= ~led->mask;
    + *XBUS_LEDS = hw_led_state;
    }

    static enum led_brightness ebsa285_led_get(struct led_classdev *cdev)
    @@ -52,18 +55,19 @@ static enum led_brightness ebsa285_led_get(struct led_classdev *cdev)
    struct ebsa285_led *led = container_of(cdev,
    struct ebsa285_led, cdev);

    - return (*XBUS_LEDS & led->mask) ? LED_FULL : LED_OFF;
    + return hw_led_state & led->mask ? LED_OFF : LED_FULL;
    }

    static int __init ebsa285_leds_init(void)
    {
    int i;

    - if (machine_is_ebsa285())
    + if (!machine_is_ebsa285())
    return -ENODEV;

    - /* 3 LEDS All ON */
    - *XBUS_LEDS |= XBUS_LED_AMBER | XBUS_LED_GREEN | XBUS_LED_RED;
    + /* 3 LEDS all off */
    + hw_led_state = XBUS_LED_AMBER | XBUS_LED_GREEN | XBUS_LED_RED;
    + *XBUS_LEDS = hw_led_state;

    for (i = 0; i < ARRAY_SIZE(ebsa285_leds); i++) {
    struct ebsa285_led *led;
    diff --git a/arch/arm/mm/mmap.c b/arch/arm/mm/mmap.c
    index 0c6356255fe3..304661d21369 100644
    --- a/arch/arm/mm/mmap.c
    +++ b/arch/arm/mm/mmap.c
    @@ -146,7 +146,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,

    info.flags = VM_UNMAPPED_AREA_TOPDOWN;
    info.length = len;
    - info.low_limit = PAGE_SIZE;
    + info.low_limit = FIRST_USER_ADDRESS;
    info.high_limit = mm->mmap_base;
    info.align_mask = do_align ? (PAGE_MASK & (SHMLBA - 1)) : 0;
    info.align_offset = pgoff << PAGE_SHIFT;
    diff --git a/arch/arm/mm/pgd.c b/arch/arm/mm/pgd.c
    index 0acb089d0f70..1046b373d1ae 100644
    --- a/arch/arm/mm/pgd.c
    +++ b/arch/arm/mm/pgd.c
    @@ -87,7 +87,8 @@ pgd_t *pgd_alloc(struct mm_struct *mm)
    init_pud = pud_offset(init_pgd, 0);
    init_pmd = pmd_offset(init_pud, 0);
    init_pte = pte_offset_map(init_pmd, 0);
    - set_pte_ext(new_pte, *init_pte, 0);
    + set_pte_ext(new_pte + 0, init_pte[0], 0);
    + set_pte_ext(new_pte + 1, init_pte[1], 0);
    pte_unmap(init_pte);
    pte_unmap(new_pte);
    }
    diff --git a/arch/parisc/kernel/sys_parisc.c b/arch/parisc/kernel/sys_parisc.c
    index 5dfd248e3f1a..0d3a9d4927b5 100644
    --- a/arch/parisc/kernel/sys_parisc.c
    +++ b/arch/parisc/kernel/sys_parisc.c
    @@ -61,8 +61,15 @@ static int get_offset(struct address_space *mapping)
    return (unsigned long) mapping >> 8;
    }

    -static unsigned long get_shared_area(struct address_space *mapping,
    - unsigned long addr, unsigned long len, unsigned long pgoff)
    +static unsigned long shared_align_offset(struct file *filp, unsigned long pgoff)
    +{
    + struct address_space *mapping = filp ? filp->f_mapping : NULL;
    +
    + return (get_offset(mapping) + pgoff) << PAGE_SHIFT;
    +}
    +
    +static unsigned long get_shared_area(struct file *filp, unsigned long addr,
    + unsigned long len, unsigned long pgoff)
    {
    struct vm_unmapped_area_info info;

    @@ -71,7 +78,7 @@ static unsigned long get_shared_area(struct address_space *mapping,
    info.low_limit = PAGE_ALIGN(addr);
    info.high_limit = TASK_SIZE;
    info.align_mask = PAGE_MASK & (SHMLBA - 1);
    - info.align_offset = (get_offset(mapping) + pgoff) << PAGE_SHIFT;
    + info.align_offset = shared_align_offset(filp, pgoff);
    return vm_unmapped_area(&info);
    }

    @@ -82,20 +89,18 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,
    return -ENOMEM;
    if (flags & MAP_FIXED) {
    if ((flags & MAP_SHARED) &&
    - (addr - (pgoff << PAGE_SHIFT)) & (SHMLBA - 1))
    + (addr - shared_align_offset(filp, pgoff)) & (SHMLBA - 1))
    return -EINVAL;
    return addr;
    }
    if (!addr)
    addr = TASK_UNMAPPED_BASE;

    - if (filp) {
    - addr = get_shared_area(filp->f_mapping, addr, len, pgoff);
    - } else if(flags & MAP_SHARED) {
    - addr = get_shared_area(NULL, addr, len, pgoff);
    - } else {
    + if (filp || (flags & MAP_SHARED))
    + addr = get_shared_area(filp, addr, len, pgoff);
    + else
    addr = get_unshared_area(addr, len);
    - }
    +
    return addr;
    }

    diff --git a/arch/s390/crypto/aes_s390.c b/arch/s390/crypto/aes_s390.c
    index 2e4b5be31a1b..94e20dd2729f 100644
    --- a/arch/s390/crypto/aes_s390.c
    +++ b/arch/s390/crypto/aes_s390.c
    @@ -55,8 +55,7 @@ struct pcc_param {

    struct s390_xts_ctx {
    u8 key[32];
    - u8 xts_param[16];
    - struct pcc_param pcc;
    + u8 pcc_key[32];
    long enc;
    long dec;
    int key_len;
    @@ -591,7 +590,7 @@ static int xts_aes_set_key(struct crypto_tfm *tfm, const u8 *in_key,
    xts_ctx->enc = KM_XTS_128_ENCRYPT;
    xts_ctx->dec = KM_XTS_128_DECRYPT;
    memcpy(xts_ctx->key + 16, in_key, 16);
    - memcpy(xts_ctx->pcc.key + 16, in_key + 16, 16);
    + memcpy(xts_ctx->pcc_key + 16, in_key + 16, 16);
    break;
    case 48:
    xts_ctx->enc = 0;
    @@ -602,7 +601,7 @@ static int xts_aes_set_key(struct crypto_tfm *tfm, const u8 *in_key,
    xts_ctx->enc = KM_XTS_256_ENCRYPT;
    xts_ctx->dec = KM_XTS_256_DECRYPT;
    memcpy(xts_ctx->key, in_key, 32);
    - memcpy(xts_ctx->pcc.key, in_key + 32, 32);
    + memcpy(xts_ctx->pcc_key, in_key + 32, 32);
    break;
    default:
    *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
    @@ -621,29 +620,33 @@ static int xts_aes_crypt(struct blkcipher_desc *desc, long func,
    unsigned int nbytes = walk->nbytes;
    unsigned int n;
    u8 *in, *out;
    - void *param;
    + struct pcc_param pcc_param;
    + struct {
    + u8 key[32];
    + u8 init[16];
    + } xts_param;

    if (!nbytes)
    goto out;

    - memset(xts_ctx->pcc.block, 0, sizeof(xts_ctx->pcc.block));
    - memset(xts_ctx->pcc.bit, 0, sizeof(xts_ctx->pcc.bit));
    - memset(xts_ctx->pcc.xts, 0, sizeof(xts_ctx->pcc.xts));
    - memcpy(xts_ctx->pcc.tweak, walk->iv, sizeof(xts_ctx->pcc.tweak));
    - param = xts_ctx->pcc.key + offset;
    - ret = crypt_s390_pcc(func, param);
    + memset(pcc_param.block, 0, sizeof(pcc_param.block));
    + memset(pcc_param.bit, 0, sizeof(pcc_param.bit));
    + memset(pcc_param.xts, 0, sizeof(pcc_param.xts));
    + memcpy(pcc_param.tweak, walk->iv, sizeof(pcc_param.tweak));
    + memcpy(pcc_param.key, xts_ctx->pcc_key, 32);
    + ret = crypt_s390_pcc(func, &pcc_param.key[offset]);
    if (ret < 0)
    return -EIO;

    - memcpy(xts_ctx->xts_param, xts_ctx->pcc.xts, 16);
    - param = xts_ctx->key + offset;
    + memcpy(xts_param.key, xts_ctx->key, 32);
    + memcpy(xts_param.init, pcc_param.xts, 16);
    do {
    /* only use complete blocks */
    n = nbytes & ~(AES_BLOCK_SIZE - 1);
    out = walk->dst.virt.addr;
    in = walk->src.virt.addr;

    - ret = crypt_s390_km(func, param, out, in, n);
    + ret = crypt_s390_km(func, &xts_param.key[offset], out, in, n);
    if (ret < 0 || ret != n)
    return -EIO;

    diff --git a/arch/x86/Makefile b/arch/x86/Makefile
    index 41250fb33985..eda00f9be0cf 100644
    --- a/arch/x86/Makefile
    +++ b/arch/x86/Makefile
    @@ -31,6 +31,9 @@ ifeq ($(CONFIG_X86_32),y)

    KBUILD_CFLAGS += -msoft-float -mregparm=3 -freg-struct-return

    + # Don't autogenerate SSE instructions
    + KBUILD_CFLAGS += -mno-sse
    +
    # Never want PIC in a 32-bit kernel, prevent breakage with GCC built
    # with nonstandard options
    KBUILD_CFLAGS += -fno-pic
    @@ -57,8 +60,11 @@ else
    KBUILD_AFLAGS += -m64
    KBUILD_CFLAGS += -m64

    + # Don't autogenerate SSE instructions
    + KBUILD_CFLAGS += -mno-sse
    +
    # Use -mpreferred-stack-boundary=3 if supported.
    - KBUILD_CFLAGS += $(call cc-option,-mno-sse -mpreferred-stack-boundary=3)
    + KBUILD_CFLAGS += $(call cc-option,-mpreferred-stack-boundary=3)

    # FIXME - should be integrated in Makefile.cpu (Makefile_32.cpu)
    cflags-$(CONFIG_MK8) += $(call cc-option,-march=k8)
    diff --git a/block/blk-cgroup.h b/block/blk-cgroup.h
    index ae6969a7ffd4..2e34c386d760 100644
    --- a/block/blk-cgroup.h
    +++ b/block/blk-cgroup.h
    @@ -430,9 +430,9 @@ static inline uint64_t blkg_stat_read(struct blkg_stat *stat)
    uint64_t v;

    do {
    - start = u64_stats_fetch_begin(&stat->syncp);
    + start = u64_stats_fetch_begin_bh(&stat->syncp);
    v = stat->cnt;
    - } while (u64_stats_fetch_retry(&stat->syncp, start));
    + } while (u64_stats_fetch_retry_bh(&stat->syncp, start));

    return v;
    }
    @@ -498,9 +498,9 @@ static inline struct blkg_rwstat blkg_rwstat_read(struct blkg_rwstat *rwstat)
    struct blkg_rwstat tmp;

    do {
    - start = u64_stats_fetch_begin(&rwstat->syncp);
    + start = u64_stats_fetch_begin_bh(&rwstat->syncp);
    tmp = *rwstat;
    - } while (u64_stats_fetch_retry(&rwstat->syncp, start));
    + } while (u64_stats_fetch_retry_bh(&rwstat->syncp, start));

    return tmp;
    }
    diff --git a/crypto/algif_hash.c b/crypto/algif_hash.c
    index 850246206b12..585c3b279feb 100644
    --- a/crypto/algif_hash.c
    +++ b/crypto/algif_hash.c
    @@ -117,6 +117,9 @@ static ssize_t hash_sendpage(struct socket *sock, struct page *page,
    if (flags & MSG_SENDPAGE_NOTLAST)
    flags |= MSG_MORE;

    + if (flags & MSG_SENDPAGE_NOTLAST)
    + flags |= MSG_MORE;
    +
    lock_sock(sk);
    sg_init_table(ctx->sgl.sg, 1);
    sg_set_page(ctx->sgl.sg, page, size, offset);
    diff --git a/crypto/algif_skcipher.c b/crypto/algif_skcipher.c
    index a19c027b29bd..918a3b4148b8 100644
    --- a/crypto/algif_skcipher.c
    +++ b/crypto/algif_skcipher.c
    @@ -381,6 +381,9 @@ static ssize_t skcipher_sendpage(struct socket *sock, struct page *page,
    if (flags & MSG_SENDPAGE_NOTLAST)
    flags |= MSG_MORE;

    + if (flags & MSG_SENDPAGE_NOTLAST)
    + flags |= MSG_MORE;
    +
    lock_sock(sk);
    if (!ctx->more && ctx->used)
    goto unlock;
    diff --git a/crypto/authenc.c b/crypto/authenc.c
    index ffce19de05cf..528b00bc4769 100644
    --- a/crypto/authenc.c
    +++ b/crypto/authenc.c
    @@ -368,9 +368,10 @@ static void crypto_authenc_encrypt_done(struct crypto_async_request *req,
    if (!err) {
    struct crypto_aead *authenc = crypto_aead_reqtfm(areq);
    struct crypto_authenc_ctx *ctx = crypto_aead_ctx(authenc);
    - struct ablkcipher_request *abreq = aead_request_ctx(areq);
    - u8 *iv = (u8 *)(abreq + 1) +
    - crypto_ablkcipher_reqsize(ctx->enc);
    + struct authenc_request_ctx *areq_ctx = aead_request_ctx(areq);
    + struct ablkcipher_request *abreq = (void *)(areq_ctx->tail
    + + ctx->reqoff);
    + u8 *iv = (u8 *)abreq - crypto_ablkcipher_ivsize(ctx->enc);

    err = crypto_authenc_genicv(areq, iv, 0);
    }
    diff --git a/crypto/ccm.c b/crypto/ccm.c
    index 499c91717d93..ed009b77e67d 100644
    --- a/crypto/ccm.c
    +++ b/crypto/ccm.c
    @@ -271,7 +271,8 @@ static int crypto_ccm_auth(struct aead_request *req, struct scatterlist *plain,
    }

    /* compute plaintext into mac */
    - get_data_to_compute(cipher, pctx, plain, cryptlen);
    + if (cryptlen)
    + get_data_to_compute(cipher, pctx, plain, cryptlen);

    out:
    return err;
    diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
    index db6dfcfa3e2e..ab58556d347c 100644
    --- a/drivers/ata/libata-scsi.c
    +++ b/drivers/ata/libata-scsi.c
    @@ -3625,6 +3625,7 @@ int ata_scsi_add_hosts(struct ata_host *host, struct scsi_host_template *sht)
    shost->max_lun = 1;
    shost->max_channel = 1;
    shost->max_cmd_len = 16;
    + shost->no_write_same = 1;

    /* Schedule policy is determined by ->qc_defer()
    * callback and it needs to see every deferred qc.
    diff --git a/drivers/char/i8k.c b/drivers/char/i8k.c
    index 40cc0cf2ded6..e6939e13e338 100644
    --- a/drivers/char/i8k.c
    +++ b/drivers/char/i8k.c
    @@ -664,6 +664,13 @@ static struct dmi_system_id __initdata i8k_dmi_table[] = {
    DMI_MATCH(DMI_PRODUCT_NAME, "Vostro"),
    },
    },
    + {
    + .ident = "Dell XPS421",
    + .matches = {
    + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
    + DMI_MATCH(DMI_PRODUCT_NAME, "XPS L421X"),
    + },
    + },
    { }
    };

    diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c
    index d75040ddd2b3..22c07fb6ab78 100644
    --- a/drivers/cpuidle/cpuidle.c
    +++ b/drivers/cpuidle/cpuidle.c
    @@ -448,7 +448,7 @@ EXPORT_SYMBOL_GPL(cpuidle_register_device);
    */
    void cpuidle_unregister_device(struct cpuidle_device *dev)
    {
    - if (dev->registered == 0)
    + if (!dev || dev->registered == 0)
    return;

    cpuidle_pause_and_lock();
    diff --git a/drivers/firewire/sbp2.c b/drivers/firewire/sbp2.c
    index 281029daf98c..b0bb056458a3 100644
    --- a/drivers/firewire/sbp2.c
    +++ b/drivers/firewire/sbp2.c
    @@ -1623,6 +1623,7 @@ static struct scsi_host_template scsi_driver_template = {
    .cmd_per_lun = 1,
    .can_queue = 1,
    .sdev_attrs = sbp2_scsi_sysfs_attrs,
    + .no_write_same = 1,
    };

    MODULE_AUTHOR("Kristian Hoegsberg <krh@bitplanet.net>");
    diff --git a/drivers/firmware/efi/efi-pstore.c b/drivers/firmware/efi/efi-pstore.c
    index 5002d50e3781..743fd426f21b 100644
    --- a/drivers/firmware/efi/efi-pstore.c
    +++ b/drivers/firmware/efi/efi-pstore.c
    @@ -18,14 +18,12 @@ module_param_named(pstore_disable, efivars_pstore_disable, bool, 0644);

    static int efi_pstore_open(struct pstore_info *psi)
    {
    - efivar_entry_iter_begin();
    psi->data = NULL;
    return 0;
    }

    static int efi_pstore_close(struct pstore_info *psi)
    {
    - efivar_entry_iter_end();
    psi->data = NULL;
    return 0;
    }
    @@ -39,6 +37,12 @@ struct pstore_read_data {
    char **buf;
    };

    +static inline u64 generic_id(unsigned long timestamp,
    + unsigned int part, int count)
    +{
    + return (timestamp * 100 + part) * 1000 + count;
    +}
    +
    static int efi_pstore_read_func(struct efivar_entry *entry, void *data)
    {
    efi_guid_t vendor = LINUX_EFI_CRASH_GUID;
    @@ -57,7 +61,7 @@ static int efi_pstore_read_func(struct efivar_entry *entry, void *data)

    if (sscanf(name, "dump-type%u-%u-%d-%lu-%c",
    cb_data->type, &part, &cnt, &time, &data_type) == 5) {
    - *cb_data->id = part;
    + *cb_data->id = generic_id(time, part, cnt);
    *cb_data->count = cnt;
    cb_data->timespec->tv_sec = time;
    cb_data->timespec->tv_nsec = 0;
    @@ -67,7 +71,7 @@ static int efi_pstore_read_func(struct efivar_entry *entry, void *data)
    *cb_data->compressed = false;
    } else if (sscanf(name, "dump-type%u-%u-%d-%lu",
    cb_data->type, &part, &cnt, &time) == 4) {
    - *cb_data->id = part;
    + *cb_data->id = generic_id(time, part, cnt);
    *cb_data->count = cnt;
    cb_data->timespec->tv_sec = time;
    cb_data->timespec->tv_nsec = 0;
    @@ -79,7 +83,7 @@ static int efi_pstore_read_func(struct efivar_entry *entry, void *data)
    * which doesn't support holding
    * multiple logs, remains.
    */
    - *cb_data->id = part;
    + *cb_data->id = generic_id(time, part, 0);
    *cb_data->count = 0;
    cb_data->timespec->tv_sec = time;
    cb_data->timespec->tv_nsec = 0;
    @@ -91,19 +95,125 @@ static int efi_pstore_read_func(struct efivar_entry *entry, void *data)
    __efivar_entry_get(entry, &entry->var.Attributes,
    &entry->var.DataSize, entry->var.Data);
    size = entry->var.DataSize;
    + memcpy(*cb_data->buf, entry->var.Data,
    + (size_t)min_t(unsigned long, EFIVARS_DATA_SIZE_MAX, size));

    - *cb_data->buf = kmemdup(entry->var.Data, size, GFP_KERNEL);
    - if (*cb_data->buf == NULL)
    - return -ENOMEM;
    return size;
    }

    +/**
    + * efi_pstore_scan_sysfs_enter
    + * @entry: scanning entry
    + * @next: next entry
    + * @head: list head
    + */
    +static void efi_pstore_scan_sysfs_enter(struct efivar_entry *pos,
    + struct efivar_entry *next,
    + struct list_head *head)
    +{
    + pos->scanning = true;
    + if (&next->list != head)
    + next->scanning = true;
    +}
    +
    +/**
    + * __efi_pstore_scan_sysfs_exit
    + * @entry: deleting entry
    + * @turn_off_scanning: Check if a scanning flag should be turned off
    + */
    +static inline void __efi_pstore_scan_sysfs_exit(struct efivar_entry *entry,
    + bool turn_off_scanning)
    +{
    + if (entry->deleting) {
    + list_del(&entry->list);
    + efivar_entry_iter_end();
    + efivar_unregister(entry);
    + efivar_entry_iter_begin();
    + } else if (turn_off_scanning)
    + entry->scanning = false;
    +}
    +
    +/**
    + * efi_pstore_scan_sysfs_exit
    + * @pos: scanning entry
    + * @next: next entry
    + * @head: list head
    + * @stop: a flag checking if scanning will stop
    + */
    +static void efi_pstore_scan_sysfs_exit(struct efivar_entry *pos,
    + struct efivar_entry *next,
    + struct list_head *head, bool stop)
    +{
    + __efi_pstore_scan_sysfs_exit(pos, true);
    + if (stop)
    + __efi_pstore_scan_sysfs_exit(next, &next->list != head);
    +}
    +
    +/**
    + * efi_pstore_sysfs_entry_iter
    + *
    + * @data: function-specific data to pass to callback
    + * @pos: entry to begin iterating from
    + *
    + * You MUST call efivar_enter_iter_begin() before this function, and
    + * efivar_entry_iter_end() afterwards.
    + *
    + * It is possible to begin iteration from an arbitrary entry within
    + * the list by passing @pos. @pos is updated on return to point to
    + * the next entry of the last one passed to efi_pstore_read_func().
    + * To begin iterating from the beginning of the list @pos must be %NULL.
    + */
    +static int efi_pstore_sysfs_entry_iter(void *data, struct efivar_entry **pos)
    +{
    + struct efivar_entry *entry, *n;
    + struct list_head *head = &efivar_sysfs_list;
    + int size = 0;
    +
    + if (!*pos) {
    + list_for_each_entry_safe(entry, n, head, list) {
    + efi_pstore_scan_sysfs_enter(entry, n, head);
    +
    + size = efi_pstore_read_func(entry, data);
    + efi_pstore_scan_sysfs_exit(entry, n, head, size < 0);
    + if (size)
    + break;
    + }
    + *pos = n;
    + return size;
    + }
    +
    + list_for_each_entry_safe_from((*pos), n, head, list) {
    + efi_pstore_scan_sysfs_enter((*pos), n, head);
    +
    + size = efi_pstore_read_func((*pos), data);
    + efi_pstore_scan_sysfs_exit((*pos), n, head, size < 0);
    + if (size)
    + break;
    + }
    + *pos = n;
    + return size;
    +}
    +
    +/**
    + * efi_pstore_read
    + *
    + * This function returns a size of NVRAM entry logged via efi_pstore_write().
    + * The meaning and behavior of efi_pstore/pstore are as below.
    + *
    + * size > 0: Got data of an entry logged via efi_pstore_write() successfully,
    + * and pstore filesystem will continue reading subsequent entries.
    + * size == 0: Entry was not logged via efi_pstore_write(),
    + * and efi_pstore driver will continue reading subsequent entries.
    + * size < 0: Failed to get data of entry logging via efi_pstore_write(),
    + * and pstore will stop reading entry.
    + */
    static ssize_t efi_pstore_read(u64 *id, enum pstore_type_id *type,
    int *count, struct timespec *timespec,
    char **buf, bool *compressed,
    struct pstore_info *psi)
    {
    struct pstore_read_data data;
    + ssize_t size;

    data.id = id;
    data.type = type;
    @@ -112,8 +222,17 @@ static ssize_t efi_pstore_read(u64 *id, enum pstore_type_id *type,
    data.compressed = compressed;
    data.buf = buf;

    - return __efivar_entry_iter(efi_pstore_read_func, &efivar_sysfs_list, &data,
    - (struct efivar_entry **)&psi->data);
    + *data.buf = kzalloc(EFIVARS_DATA_SIZE_MAX, GFP_KERNEL);
    + if (!*data.buf)
    + return -ENOMEM;
    +
    + efivar_entry_iter_begin();
    + size = efi_pstore_sysfs_entry_iter(&data,
    + (struct efivar_entry **)&psi->data);
    + efivar_entry_iter_end();
    + if (size <= 0)
    + kfree(*data.buf);
    + return size;
    }

    static int efi_pstore_write(enum pstore_type_id type,
    @@ -184,9 +303,17 @@ static int efi_pstore_erase_func(struct efivar_entry *entry, void *data)
    return 0;
    }

    + if (entry->scanning) {
    + /*
    + * Skip deletion because this entry will be deleted
    + * after scanning is completed.
    + */
    + entry->deleting = true;
    + } else
    + list_del(&entry->list);
    +
    /* found */
    __efivar_entry_delete(entry);
    - list_del(&entry->list);

    return 1;
    }
    @@ -199,14 +326,16 @@ static int efi_pstore_erase(enum pstore_type_id type, u64 id, int count,
    char name[DUMP_NAME_LEN];
    efi_char16_t efi_name[DUMP_NAME_LEN];
    int found, i;
    + unsigned int part;

    - sprintf(name, "dump-type%u-%u-%d-%lu", type, (unsigned int)id, count,
    - time.tv_sec);
    + do_div(id, 1000);
    + part = do_div(id, 100);
    + sprintf(name, "dump-type%u-%u-%d-%lu", type, part, count, time.tv_sec);

    for (i = 0; i < DUMP_NAME_LEN; i++)
    efi_name[i] = name[i];

    - edata.id = id;
    + edata.id = part;
    edata.type = type;
    edata.count = count;
    edata.time = time;
    @@ -214,10 +343,12 @@ static int efi_pstore_erase(enum pstore_type_id type, u64 id, int count,

    efivar_entry_iter_begin();
    found = __efivar_entry_iter(efi_pstore_erase_func, &efivar_sysfs_list, &edata, &entry);
    - efivar_entry_iter_end();

    - if (found)
    + if (found && !entry->scanning) {
    + efivar_entry_iter_end();
    efivar_unregister(entry);
    + } else
    + efivar_entry_iter_end();

    return 0;
    }
    diff --git a/drivers/firmware/efi/efivars.c b/drivers/firmware/efi/efivars.c
    index 8a7432a4b413..8c5a61ae03ea 100644
    --- a/drivers/firmware/efi/efivars.c
    +++ b/drivers/firmware/efi/efivars.c
    @@ -383,12 +383,16 @@ static ssize_t efivar_delete(struct file *filp, struct kobject *kobj,
    else if (__efivar_entry_delete(entry))
    err = -EIO;

    - efivar_entry_iter_end();
    -
    - if (err)
    + if (err) {
    + efivar_entry_iter_end();
    return err;
    + }

    - efivar_unregister(entry);
    + if (!entry->scanning) {
    + efivar_entry_iter_end();
    + efivar_unregister(entry);
    + } else
    + efivar_entry_iter_end();

    /* It's dead Jim.... */
    return count;
    diff --git a/drivers/firmware/efi/vars.c b/drivers/firmware/efi/vars.c
    index 391c67b182d9..b22659cccca4 100644
    --- a/drivers/firmware/efi/vars.c
    +++ b/drivers/firmware/efi/vars.c
    @@ -683,8 +683,16 @@ struct efivar_entry *efivar_entry_find(efi_char16_t *name, efi_guid_t guid,
    if (!found)
    return NULL;

    - if (remove)
    - list_del(&entry->list);
    + if (remove) {
    + if (entry->scanning) {
    + /*
    + * The entry will be deleted
    + * after scanning is completed.
    + */
    + entry->deleting = true;
    + } else
    + list_del(&entry->list);
    + }

    return entry;
    }
    diff --git a/drivers/gpio/gpio-mpc8xxx.c b/drivers/gpio/gpio-mpc8xxx.c
    index a0b33a216d4a..2aa3ca215bd6 100644
    --- a/drivers/gpio/gpio-mpc8xxx.c
    +++ b/drivers/gpio/gpio-mpc8xxx.c
    @@ -69,10 +69,14 @@ static int mpc8572_gpio_get(struct gpio_chip *gc, unsigned int gpio)
    u32 val;
    struct of_mm_gpio_chip *mm = to_of_mm_gpio_chip(gc);
    struct mpc8xxx_gpio_chip *mpc8xxx_gc = to_mpc8xxx_gpio_chip(mm);
    + u32 out_mask, out_shadow;

    - val = in_be32(mm->regs + GPIO_DAT) & ~in_be32(mm->regs + GPIO_DIR);
    + out_mask = in_be32(mm->regs + GPIO_DIR);

    - return (val | mpc8xxx_gc->data) & mpc8xxx_gpio2mask(gpio);
    + val = in_be32(mm->regs + GPIO_DAT) & ~out_mask;
    + out_shadow = mpc8xxx_gc->data & out_mask;
    +
    + return (val | out_shadow) & mpc8xxx_gpio2mask(gpio);
    }

    static int mpc8xxx_gpio_get(struct gpio_chip *gc, unsigned int gpio)
    diff --git a/drivers/input/Kconfig b/drivers/input/Kconfig
    index 38b523a1ece0..a11ff74a5127 100644
    --- a/drivers/input/Kconfig
    +++ b/drivers/input/Kconfig
    @@ -80,7 +80,7 @@ config INPUT_MATRIXKMAP
    comment "Userland interfaces"

    config INPUT_MOUSEDEV
    - tristate "Mouse interface" if EXPERT
    + tristate "Mouse interface"
    default y
    help
    Say Y here if you want your mouse to be accessible as char devices
    diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig
    index c1edd39bc5ba..1fa37e6d004e 100644
    --- a/drivers/input/keyboard/Kconfig
    +++ b/drivers/input/keyboard/Kconfig
    @@ -2,7 +2,7 @@
    # Input core configuration
    #
    menuconfig INPUT_KEYBOARD
    - bool "Keyboards" if EXPERT || !X86
    + bool "Keyboards"
    default y
    help
    Say Y here, and a list of supported keyboards will be displayed.
    @@ -67,7 +67,7 @@ config KEYBOARD_ATARI
    module will be called atakbd.

    config KEYBOARD_ATKBD
    - tristate "AT keyboard" if EXPERT || !X86
    + tristate "AT keyboard"
    default y
    select SERIO
    select SERIO_LIBPS2
    diff --git a/drivers/input/serio/Kconfig b/drivers/input/serio/Kconfig
    index 33b3e88fe4a2..f6578647e550 100644
    --- a/drivers/input/serio/Kconfig
    +++ b/drivers/input/serio/Kconfig
    @@ -2,7 +2,7 @@
    # Input core configuration
    #
    config SERIO
    - tristate "Serial I/O support" if EXPERT || !X86
    + tristate "Serial I/O support"
    default y
    help
    Say Yes here if you have any input device that uses serial I/O to
    @@ -19,7 +19,7 @@ config SERIO
    if SERIO

    config SERIO_I8042
    - tristate "i8042 PC Keyboard controller" if EXPERT || !X86
    + tristate "i8042 PC Keyboard controller"
    default y
    depends on !PARISC && (!ARM || ARCH_SHARK || FOOTBRIDGE_HOST) && \
    (!SUPERH || SH_CAYMAN) && !M68K && !BLACKFIN && !S390 && \
    @@ -170,7 +170,7 @@ config SERIO_MACEPS2
    module will be called maceps2.

    config SERIO_LIBPS2
    - tristate "PS/2 driver library" if EXPERT
    + tristate "PS/2 driver library"
    depends on SERIO_I8042 || SERIO_I8042=n
    help
    Say Y here if you are using a driver for device connected
    diff --git a/drivers/misc/enclosure.c b/drivers/misc/enclosure.c
    index 0e8df41aaf14..2cf2bbc0b927 100644
    --- a/drivers/misc/enclosure.c
    +++ b/drivers/misc/enclosure.c
    @@ -198,6 +198,13 @@ static void enclosure_remove_links(struct enclosure_component *cdev)
    {
    char name[ENCLOSURE_NAME_SIZE];

    + /*
    + * In odd circumstances, like multipath devices, something else may
    + * already have removed the links, so check for this condition first.
    + */
    + if (!cdev->dev->kobj.sd)
    + return;
    +
    enclosure_link_name(cdev, name);
    sysfs_remove_link(&cdev->dev->kobj, name);
    sysfs_remove_link(&cdev->cdev.kobj, "device");
    diff --git a/drivers/misc/mei/hw-me-regs.h b/drivers/misc/mei/hw-me-regs.h
    index 6a203b6e8346..66f411a6e8ea 100644
    --- a/drivers/misc/mei/hw-me-regs.h
    +++ b/drivers/misc/mei/hw-me-regs.h
    @@ -109,8 +109,12 @@
    #define MEI_DEV_ID_PPT_2 0x1CBA /* Panther Point */
    #define MEI_DEV_ID_PPT_3 0x1DBA /* Panther Point */

    -#define MEI_DEV_ID_LPT 0x8C3A /* Lynx Point */
    +#define MEI_DEV_ID_LPT_H 0x8C3A /* Lynx Point H */
    +#define MEI_DEV_ID_LPT_W 0x8D3A /* Lynx Point - Wellsburg */
    #define MEI_DEV_ID_LPT_LP 0x9C3A /* Lynx Point LP */
    +#define MEI_DEV_ID_LPT_HR 0x8CBA /* Lynx Point H Refresh */
    +
    +#define MEI_DEV_ID_WPT_LP 0x9CBA /* Wildcat Point LP */
    /*
    * MEI HW Section
    */
    diff --git a/drivers/misc/mei/pci-me.c b/drivers/misc/mei/pci-me.c
    index 1b3844e82379..e637318b79ba 100644
    --- a/drivers/misc/mei/pci-me.c
    +++ b/drivers/misc/mei/pci-me.c
    @@ -76,8 +76,11 @@ static DEFINE_PCI_DEVICE_TABLE(mei_me_pci_tbl) = {
    {PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_PPT_1)},
    {PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_PPT_2)},
    {PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_PPT_3)},
    - {PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_LPT)},
    + {PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_LPT_H)},
    + {PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_LPT_W)},
    {PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_LPT_LP)},
    + {PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_LPT_HR)},
    + {PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_WPT_LP)},

    /* required last entry */
    {0, }
    diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c
    index e3fc07cf2f62..e59c42b446a9 100644
    --- a/drivers/net/can/c_can/c_can.c
    +++ b/drivers/net/can/c_can/c_can.c
    @@ -712,22 +712,31 @@ static int c_can_set_mode(struct net_device *dev, enum can_mode mode)
    return 0;
    }

    -static int c_can_get_berr_counter(const struct net_device *dev,
    - struct can_berr_counter *bec)
    +static int __c_can_get_berr_counter(const struct net_device *dev,
    + struct can_berr_counter *bec)
    {
    unsigned int reg_err_counter;
    struct c_can_priv *priv = netdev_priv(dev);

    - c_can_pm_runtime_get_sync(priv);
    -
    reg_err_counter = priv->read_reg(priv, C_CAN_ERR_CNT_REG);
    bec->rxerr = (reg_err_counter & ERR_CNT_REC_MASK) >>
    ERR_CNT_REC_SHIFT;
    bec->txerr = reg_err_counter & ERR_CNT_TEC_MASK;

    + return 0;
    +}
    +
    +static int c_can_get_berr_counter(const struct net_device *dev,
    + struct can_berr_counter *bec)
    +{
    + struct c_can_priv *priv = netdev_priv(dev);
    + int err;
    +
    + c_can_pm_runtime_get_sync(priv);
    + err = __c_can_get_berr_counter(dev, bec);
    c_can_pm_runtime_put_sync(priv);

    - return 0;
    + return err;
    }

    /*
    @@ -872,7 +881,7 @@ static int c_can_handle_state_change(struct net_device *dev,
    if (unlikely(!skb))
    return 0;

    - c_can_get_berr_counter(dev, &bec);
    + __c_can_get_berr_counter(dev, &bec);
    reg_err_counter = priv->read_reg(priv, C_CAN_ERR_CNT_REG);
    rx_err_passive = (reg_err_counter & ERR_CNT_RP_MASK) >>
    ERR_CNT_RP_SHIFT;
    diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c
    index 8f5ce747feb5..c1c3b132fed5 100644
    --- a/drivers/net/can/flexcan.c
    +++ b/drivers/net/can/flexcan.c
    @@ -1020,13 +1020,13 @@ static int flexcan_probe(struct platform_device *pdev)
    dev_err(&pdev->dev, "no ipg clock defined\n");
    return PTR_ERR(clk_ipg);
    }
    - clock_freq = clk_get_rate(clk_ipg);

    clk_per = devm_clk_get(&pdev->dev, "per");
    if (IS_ERR(clk_per)) {
    dev_err(&pdev->dev, "no per clock defined\n");
    return PTR_ERR(clk_per);
    }
    + clock_freq = clk_get_rate(clk_per);
    }

    mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    diff --git a/drivers/net/can/sja1000/sja1000.c b/drivers/net/can/sja1000/sja1000.c
    index 7164a999f50f..f17c3018b7c7 100644
    --- a/drivers/net/can/sja1000/sja1000.c
    +++ b/drivers/net/can/sja1000/sja1000.c
    @@ -494,20 +494,20 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id)
    uint8_t isrc, status;
    int n = 0;

    - /* Shared interrupts and IRQ off? */
    - if (priv->read_reg(priv, SJA1000_IER) == IRQ_OFF)
    - return IRQ_NONE;
    -
    if (priv->pre_irq)
    priv->pre_irq(priv);

    + /* Shared interrupts and IRQ off? */
    + if (priv->read_reg(priv, SJA1000_IER) == IRQ_OFF)
    + goto out;
    +
    while ((isrc = priv->read_reg(priv, SJA1000_IR)) &&
    (n < SJA1000_MAX_IRQ)) {
    - n++;
    +
    status = priv->read_reg(priv, SJA1000_SR);
    /* check for absent controller due to hw unplug */
    if (status == 0xFF && sja1000_is_absent(priv))
    - return IRQ_NONE;
    + goto out;

    if (isrc & IRQ_WUI)
    netdev_warn(dev, "wakeup interrupt\n");
    @@ -535,7 +535,7 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id)
    status = priv->read_reg(priv, SJA1000_SR);
    /* check for absent controller */
    if (status == 0xFF && sja1000_is_absent(priv))
    - return IRQ_NONE;
    + goto out;
    }
    }
    if (isrc & (IRQ_DOI | IRQ_EI | IRQ_BEI | IRQ_EPI | IRQ_ALI)) {
    @@ -543,8 +543,9 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id)
    if (sja1000_err(dev, isrc, status))
    break;
    }
    + n++;
    }
    -
    +out:
    if (priv->post_irq)
    priv->post_irq(priv);

    diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
    index 12d961c4ebca..cd76d2a6e014 100644
    --- a/drivers/net/ethernet/broadcom/tg3.c
    +++ b/drivers/net/ethernet/broadcom/tg3.c
    @@ -6848,12 +6848,6 @@ static int tg3_rx(struct tg3_napi *tnapi, int budget)
    pci_unmap_single(tp->pdev, dma_addr, skb_size,
    PCI_DMA_FROMDEVICE);

    - skb = build_skb(data, frag_size);
    - if (!skb) {
    - tg3_frag_free(frag_size != 0, data);
    - goto drop_it_no_recycle;
    - }
    - skb_reserve(skb, TG3_RX_OFFSET(tp));
    /* Ensure that the update to the data happens
    * after the usage of the old DMA mapping.
    */
    @@ -6861,6 +6855,12 @@ static int tg3_rx(struct tg3_napi *tnapi, int budget)

    ri->data = NULL;

    + skb = build_skb(data, frag_size);
    + if (!skb) {
    + tg3_frag_free(frag_size != 0, data);
    + goto drop_it_no_recycle;
    + }
    + skb_reserve(skb, TG3_RX_OFFSET(tp));
    } else {
    tg3_recycle_rx(tnapi, tpr, opaque_key,
    desc_idx, *post_ptr);
    diff --git a/drivers/net/wireless/iwlwifi/dvm/tx.c b/drivers/net/wireless/iwlwifi/dvm/tx.c
    index da442b81370a..1fef5240e6ad 100644
    --- a/drivers/net/wireless/iwlwifi/dvm/tx.c
    +++ b/drivers/net/wireless/iwlwifi/dvm/tx.c
    @@ -433,27 +433,19 @@ int iwlagn_tx_skb(struct iwl_priv *priv,
    /* Copy MAC header from skb into command buffer */
    memcpy(tx_cmd->hdr, hdr, hdr_len);

    + txq_id = info->hw_queue;
    +
    if (is_agg)
    txq_id = priv->tid_data[sta_id][tid].agg.txq_id;
    else if (info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM) {
    /*
    - * Send this frame after DTIM -- there's a special queue
    - * reserved for this for contexts that support AP mode.
    - */
    - txq_id = ctx->mcast_queue;
    -
    - /*
    * The microcode will clear the more data
    * bit in the last frame it transmits.
    */
    hdr->frame_control |=
    cpu_to_le16(IEEE80211_FCTL_MOREDATA);
    - } else if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN)
    - txq_id = IWL_AUX_QUEUE;
    - else
    - txq_id = ctx->ac_to_queue[skb_get_queue_mapping(skb)];
    + }

    - WARN_ON_ONCE(!is_agg && txq_id != info->hw_queue);
    WARN_ON_ONCE(is_agg &&
    priv->queue_to_mac80211[txq_id] != info->hw_queue);

    diff --git a/drivers/pnp/driver.c b/drivers/pnp/driver.c
    index a39ee38a9414..2bd5c5f7db08 100644
    --- a/drivers/pnp/driver.c
    +++ b/drivers/pnp/driver.c
    @@ -197,6 +197,11 @@ static int pnp_bus_freeze(struct device *dev)
    return __pnp_bus_suspend(dev, PMSG_FREEZE);
    }

    +static int pnp_bus_poweroff(struct device *dev)
    +{
    + return __pnp_bus_suspend(dev, PMSG_HIBERNATE);
    +}
    +
    static int pnp_bus_resume(struct device *dev)
    {
    struct pnp_dev *pnp_dev = to_pnp_dev(dev);
    @@ -234,9 +239,14 @@ static int pnp_bus_resume(struct device *dev)
    }

    static const struct dev_pm_ops pnp_bus_dev_pm_ops = {
    + /* Suspend callbacks */
    .suspend = pnp_bus_suspend,
    - .freeze = pnp_bus_freeze,
    .resume = pnp_bus_resume,
    + /* Hibernate callbacks */
    + .freeze = pnp_bus_freeze,
    + .thaw = pnp_bus_resume,
    + .poweroff = pnp_bus_poweroff,
    + .restore = pnp_bus_resume,
    };

    struct bus_type pnp_bus_type = {
    diff --git a/drivers/scsi/3w-9xxx.c b/drivers/scsi/3w-9xxx.c
    index 5e1e12c0cf42..0a7325361d29 100644
    --- a/drivers/scsi/3w-9xxx.c
    +++ b/drivers/scsi/3w-9xxx.c
    @@ -2025,7 +2025,8 @@ static struct scsi_host_template driver_template = {
    .cmd_per_lun = TW_MAX_CMDS_PER_LUN,
    .use_clustering = ENABLE_CLUSTERING,
    .shost_attrs = twa_host_attrs,
    - .emulated = 1
    + .emulated = 1,
    + .no_write_same = 1,
    };

    /* This function will probe and initialize a card */
    diff --git a/drivers/scsi/3w-sas.c b/drivers/scsi/3w-sas.c
    index c845bdbeb6c0..4de346017e9f 100644
    --- a/drivers/scsi/3w-sas.c
    +++ b/drivers/scsi/3w-sas.c
    @@ -1600,7 +1600,8 @@ static struct scsi_host_template driver_template = {
    .cmd_per_lun = TW_MAX_CMDS_PER_LUN,
    .use_clustering = ENABLE_CLUSTERING,
    .shost_attrs = twl_host_attrs,
    - .emulated = 1
    + .emulated = 1,
    + .no_write_same = 1,
    };

    /* This function will probe and initialize a card */
    diff --git a/drivers/scsi/3w-xxxx.c b/drivers/scsi/3w-xxxx.c
    index b9276d10b25c..752624e6bc00 100644
    --- a/drivers/scsi/3w-xxxx.c
    +++ b/drivers/scsi/3w-xxxx.c
    @@ -2279,7 +2279,8 @@ static struct scsi_host_template driver_template = {
    .cmd_per_lun = TW_MAX_CMDS_PER_LUN,
    .use_clustering = ENABLE_CLUSTERING,
    .shost_attrs = tw_host_attrs,
    - .emulated = 1
    + .emulated = 1,
    + .no_write_same = 1,
    };

    /* This function will probe and initialize a card */
    diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
    index f0d432c139d0..4921ed19a027 100644
    --- a/drivers/scsi/aacraid/linit.c
    +++ b/drivers/scsi/aacraid/linit.c
    @@ -1081,6 +1081,7 @@ static struct scsi_host_template aac_driver_template = {
    #endif
    .use_clustering = ENABLE_CLUSTERING,
    .emulated = 1,
    + .no_write_same = 1,
    };

    static void __aac_shutdown(struct aac_dev * aac)
    diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
    index 33c52bc2c7b4..278c9fa62067 100644
    --- a/drivers/scsi/arcmsr/arcmsr_hba.c
    +++ b/drivers/scsi/arcmsr/arcmsr_hba.c
    @@ -137,6 +137,7 @@ static struct scsi_host_template arcmsr_scsi_host_template = {
    .cmd_per_lun = ARCMSR_MAX_CMD_PERLUN,
    .use_clustering = ENABLE_CLUSTERING,
    .shost_attrs = arcmsr_host_attrs,
    + .no_write_same = 1,
    };
    static struct pci_device_id arcmsr_device_id_table[] = {
    {PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1110)},
    diff --git a/drivers/scsi/bfa/bfa_fcs.h b/drivers/scsi/bfa/bfa_fcs.h
    index 94d5d0102f7d..42bcb970445a 100644
    --- a/drivers/scsi/bfa/bfa_fcs.h
    +++ b/drivers/scsi/bfa/bfa_fcs.h
    @@ -296,6 +296,7 @@ wwn_t bfa_fcs_lport_get_rport(struct bfa_fcs_lport_s *port, wwn_t wwn,
    struct bfa_fcs_lport_s *bfa_fcs_lookup_port(struct bfa_fcs_s *fcs,
    u16 vf_id, wwn_t lpwwn);

    +void bfa_fcs_lport_set_symname(struct bfa_fcs_lport_s *port, char *symname);
    void bfa_fcs_lport_get_info(struct bfa_fcs_lport_s *port,
    struct bfa_lport_info_s *port_info);
    void bfa_fcs_lport_get_attr(struct bfa_fcs_lport_s *port,
    diff --git a/drivers/scsi/bfa/bfa_fcs_lport.c b/drivers/scsi/bfa/bfa_fcs_lport.c
    index 2f61a5af3658..f5e4e61a0fd7 100644
    --- a/drivers/scsi/bfa/bfa_fcs_lport.c
    +++ b/drivers/scsi/bfa/bfa_fcs_lport.c
    @@ -1097,6 +1097,17 @@ bfa_fcs_lport_init(struct bfa_fcs_lport_s *lport,
    bfa_sm_send_event(lport, BFA_FCS_PORT_SM_CREATE);
    }

    +void
    +bfa_fcs_lport_set_symname(struct bfa_fcs_lport_s *port,
    + char *symname)
    +{
    + strcpy(port->port_cfg.sym_name.symname, symname);
    +
    + if (bfa_sm_cmp_state(port, bfa_fcs_lport_sm_online))
    + bfa_fcs_lport_ns_util_send_rspn_id(
    + BFA_FCS_GET_NS_FROM_PORT(port), NULL);
    +}
    +
    /*
    * fcs_lport_api
    */
    @@ -5140,9 +5151,6 @@ bfa_fcs_lport_ns_util_send_rspn_id(void *cbarg, struct bfa_fcxp_s *fcxp_alloced)
    u8 *psymbl = &symbl[0];
    int len;

    - if (!bfa_sm_cmp_state(port, bfa_fcs_lport_sm_online))
    - return;
    -
    /* Avoid sending RSPN in the following states. */
    if (bfa_sm_cmp_state(ns, bfa_fcs_lport_ns_sm_offline) ||
    bfa_sm_cmp_state(ns, bfa_fcs_lport_ns_sm_plogi_sending) ||
    diff --git a/drivers/scsi/bfa/bfad_attr.c b/drivers/scsi/bfa/bfad_attr.c
    index e9a681d31223..40be670a1cbc 100644
    --- a/drivers/scsi/bfa/bfad_attr.c
    +++ b/drivers/scsi/bfa/bfad_attr.c
    @@ -593,11 +593,8 @@ bfad_im_vport_set_symbolic_name(struct fc_vport *fc_vport)
    return;

    spin_lock_irqsave(&bfad->bfad_lock, flags);
    - if (strlen(sym_name) > 0) {
    - strcpy(fcs_vport->lport.port_cfg.sym_name.symname, sym_name);
    - bfa_fcs_lport_ns_util_send_rspn_id(
    - BFA_FCS_GET_NS_FROM_PORT((&fcs_vport->lport)), NULL);
    - }
    + if (strlen(sym_name) > 0)
    + bfa_fcs_lport_set_symname(&fcs_vport->lport, sym_name);
    spin_unlock_irqrestore(&bfad->bfad_lock, flags);
    }

    diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c
    index 6d55b4e7e792..aec3d4da276f 100644
    --- a/drivers/scsi/gdth.c
    +++ b/drivers/scsi/gdth.c
    @@ -4686,6 +4686,7 @@ static struct scsi_host_template gdth_template = {
    .cmd_per_lun = GDTH_MAXC_P_L,
    .unchecked_isa_dma = 1,
    .use_clustering = ENABLE_CLUSTERING,
    + .no_write_same = 1,
    };

    #ifdef CONFIG_ISA
    diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
    index df0c3c71ea43..3cafe0d784b8 100644
    --- a/drivers/scsi/hosts.c
    +++ b/drivers/scsi/hosts.c
    @@ -388,6 +388,7 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize)
    shost->unchecked_isa_dma = sht->unchecked_isa_dma;
    shost->use_clustering = sht->use_clustering;
    shost->ordered_tag = sht->ordered_tag;
    + shost->no_write_same = sht->no_write_same;

    if (sht->supported_mode == MODE_UNKNOWN)
    /* means we didn't set it ... default to INITIATOR */
    diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
    index 891c86b66253..0eb09403680c 100644
    --- a/drivers/scsi/hpsa.c
    +++ b/drivers/scsi/hpsa.c
    @@ -562,6 +562,7 @@ static struct scsi_host_template hpsa_driver_template = {
    .sdev_attrs = hpsa_sdev_attrs,
    .shost_attrs = hpsa_shost_attrs,
    .max_sectors = 8192,
    + .no_write_same = 1,
    };


    @@ -1289,7 +1290,7 @@ static void complete_scsi_command(struct CommandList *cp)
    "has check condition: aborted command: "
    "ASC: 0x%x, ASCQ: 0x%x\n",
    cp, asc, ascq);
    - cmd->result = DID_SOFT_ERROR << 16;
    + cmd->result |= DID_SOFT_ERROR << 16;
    break;
    }
    /* Must be some other type of check condition */
    @@ -4926,7 +4927,7 @@ reinit_after_soft_reset:
    hpsa_hba_inquiry(h);
    hpsa_register_scsi(h); /* hook ourselves into SCSI subsystem */
    start_controller_lockup_detector(h);
    - return 1;
    + return 0;

    clean4:
    hpsa_free_sg_chain_blocks(h);
    diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c
    index 36ac1c34ce97..573f4128b6b6 100644
    --- a/drivers/scsi/ipr.c
    +++ b/drivers/scsi/ipr.c
    @@ -6305,7 +6305,8 @@ static struct scsi_host_template driver_template = {
    .use_clustering = ENABLE_CLUSTERING,
    .shost_attrs = ipr_ioa_attrs,
    .sdev_attrs = ipr_dev_attrs,
    - .proc_name = IPR_NAME
    + .proc_name = IPR_NAME,
    + .no_write_same = 1,
    };

    /**
    diff --git a/drivers/scsi/ips.c b/drivers/scsi/ips.c
    index 8d5ea8a1e5a6..52a216f21ae5 100644
    --- a/drivers/scsi/ips.c
    +++ b/drivers/scsi/ips.c
    @@ -374,6 +374,7 @@ static struct scsi_host_template ips_driver_template = {
    .sg_tablesize = IPS_MAX_SG,
    .cmd_per_lun = 3,
    .use_clustering = ENABLE_CLUSTERING,
    + .no_write_same = 1,
    };


    diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c
    index 161c98efade9..d2895836f9fa 100644
    --- a/drivers/scsi/libsas/sas_ata.c
    +++ b/drivers/scsi/libsas/sas_ata.c
    @@ -211,7 +211,7 @@ static unsigned int sas_ata_qc_issue(struct ata_queued_cmd *qc)
    qc->tf.nsect = 0;
    }

    - ata_tf_to_fis(&qc->tf, 1, 0, (u8*)&task->ata_task.fis);
    + ata_tf_to_fis(&qc->tf, qc->dev->link->pmp, 1, (u8 *)&task->ata_task.fis);
    task->uldd_task = qc;
    if (ata_is_atapi(qc->tf.protocol)) {
    memcpy(task->ata_task.atapi_packet, qc->cdb, qc->dev->cdb_len);
    diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c
    index 90c95a3385d1..816db12ef5d5 100644
    --- a/drivers/scsi/megaraid.c
    +++ b/drivers/scsi/megaraid.c
    @@ -4244,6 +4244,7 @@ static struct scsi_host_template megaraid_template = {
    .eh_device_reset_handler = megaraid_reset,
    .eh_bus_reset_handler = megaraid_reset,
    .eh_host_reset_handler = megaraid_reset,
    + .no_write_same = 1,
    };

    static int
    diff --git a/drivers/scsi/megaraid/megaraid_mbox.c b/drivers/scsi/megaraid/megaraid_mbox.c
    index 515c9629e9fe..8844d5c179af 100644
    --- a/drivers/scsi/megaraid/megaraid_mbox.c
    +++ b/drivers/scsi/megaraid/megaraid_mbox.c
    @@ -367,6 +367,7 @@ static struct scsi_host_template megaraid_template_g = {
    .eh_host_reset_handler = megaraid_reset_handler,
    .change_queue_depth = megaraid_change_queue_depth,
    .use_clustering = ENABLE_CLUSTERING,
    + .no_write_same = 1,
    .sdev_attrs = megaraid_sdev_attrs,
    .shost_attrs = megaraid_shost_attrs,
    };
    diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c
    index 3020921a4746..a59a5526a318 100644
    --- a/drivers/scsi/megaraid/megaraid_sas_base.c
    +++ b/drivers/scsi/megaraid/megaraid_sas_base.c
    @@ -2148,6 +2148,7 @@ static struct scsi_host_template megasas_template = {
    .bios_param = megasas_bios_param,
    .use_clustering = ENABLE_CLUSTERING,
    .change_queue_depth = megasas_change_queue_depth,
    + .no_write_same = 1,
    };

    /**
    diff --git a/drivers/scsi/pmcraid.c b/drivers/scsi/pmcraid.c
    index 1eb7b0280a45..a38f71bbe7b6 100644
    --- a/drivers/scsi/pmcraid.c
    +++ b/drivers/scsi/pmcraid.c
    @@ -4314,6 +4314,7 @@ static struct scsi_host_template pmcraid_host_template = {
    .this_id = -1,
    .sg_tablesize = PMCRAID_MAX_IOADLS,
    .max_sectors = PMCRAID_IOA_MAX_SECTORS,
    + .no_write_same = 1,
    .cmd_per_lun = PMCRAID_MAX_CMD_PER_LUN,
    .use_clustering = ENABLE_CLUSTERING,
    .shost_attrs = pmcraid_host_attrs,
    diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
    index 5693f6d7eddb..2634d691ec17 100644
    --- a/drivers/scsi/sd.c
    +++ b/drivers/scsi/sd.c
    @@ -2638,6 +2638,12 @@ static void sd_read_write_same(struct scsi_disk *sdkp, unsigned char *buffer)
    {
    struct scsi_device *sdev = sdkp->device;

    + if (sdev->host->no_write_same) {
    + sdev->no_write_same = 1;
    +
    + return;
    + }
    +
    if (scsi_report_opcode(sdev, buffer, SD_BUF_SIZE, INQUIRY) < 0) {
    sdev->no_report_opcodes = 1;

    diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c
    index 1a28f5632797..17d740427240 100644
    --- a/drivers/scsi/storvsc_drv.c
    +++ b/drivers/scsi/storvsc_drv.c
    @@ -1697,6 +1697,7 @@ static struct scsi_host_template scsi_driver = {
    .use_clustering = DISABLE_CLUSTERING,
    /* Make sure we dont get a sg segment crosses a page boundary */
    .dma_boundary = PAGE_SIZE-1,
    + .no_write_same = 1,
    };

    enum {
    diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c
    index c1a50674c1e3..28361f7783cd 100644
    --- a/drivers/spi/spi-pxa2xx.c
    +++ b/drivers/spi/spi-pxa2xx.c
    @@ -1077,6 +1077,8 @@ pxa2xx_spi_acpi_get_pdata(struct platform_device *pdev)
    static struct acpi_device_id pxa2xx_spi_acpi_match[] = {
    { "INT33C0", 0 },
    { "INT33C1", 0 },
    + { "INT3430", 0 },
    + { "INT3431", 0 },
    { "80860F0E", 0 },
    { },
    };
    diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c
    index ff582933e94c..4d6f430087d0 100644
    --- a/drivers/tty/n_tty.c
    +++ b/drivers/tty/n_tty.c
    @@ -810,7 +810,8 @@ static void process_echoes(struct tty_struct *tty)
    struct n_tty_data *ldata = tty->disc_data;
    size_t echoed;

    - if (!L_ECHO(tty) || ldata->echo_commit == ldata->echo_tail)
    + if ((!L_ECHO(tty) && !L_ECHONL(tty)) ||
    + ldata->echo_commit == ldata->echo_tail)
    return;

    mutex_lock(&ldata->output_lock);
    @@ -825,7 +826,8 @@ static void flush_echoes(struct tty_struct *tty)
    {
    struct n_tty_data *ldata = tty->disc_data;

    - if (!L_ECHO(tty) || ldata->echo_commit == ldata->echo_head)
    + if ((!L_ECHO(tty) && !L_ECHONL(tty)) ||
    + ldata->echo_commit == ldata->echo_head)
    return;

    mutex_lock(&ldata->output_lock);
    diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
    index 3e7560f004f8..e8404319ca68 100644
    --- a/drivers/usb/class/cdc-acm.c
    +++ b/drivers/usb/class/cdc-acm.c
    @@ -1515,6 +1515,8 @@ static int acm_reset_resume(struct usb_interface *intf)

    static const struct usb_device_id acm_ids[] = {
    /* quirky and broken devices */
    + { USB_DEVICE(0x17ef, 0x7000), /* Lenovo USB modem */
    + .driver_info = NO_UNION_NORMAL, },/* has no union descriptor */
    { USB_DEVICE(0x0870, 0x0001), /* Metricom GS Modem */
    .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
    },
    diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
    index b21d553c245b..dccb4db98ea1 100644
    --- a/drivers/usb/serial/ftdi_sio.c
    +++ b/drivers/usb/serial/ftdi_sio.c
    @@ -2115,6 +2115,20 @@ static void ftdi_set_termios(struct tty_struct *tty,
    termios->c_cflag |= CRTSCTS;
    }

    + /*
    + * All FTDI UART chips are limited to CS7/8. We won't pretend to
    + * support CS5/6 and revert the CSIZE setting instead.
    + */
    + if ((C_CSIZE(tty) != CS8) && (C_CSIZE(tty) != CS7)) {
    + dev_warn(ddev, "requested CSIZE setting not supported\n");
    +
    + termios->c_cflag &= ~CSIZE;
    + if (old_termios)
    + termios->c_cflag |= old_termios->c_cflag & CSIZE;
    + else
    + termios->c_cflag |= CS8;
    + }
    +
    cflag = termios->c_cflag;

    if (!old_termios)
    @@ -2151,19 +2165,16 @@ no_skip:
    } else {
    urb_value |= FTDI_SIO_SET_DATA_PARITY_NONE;
    }
    - if (cflag & CSIZE) {
    - switch (cflag & CSIZE) {
    - case CS7:
    - urb_value |= 7;
    - dev_dbg(ddev, "Setting CS7\n");
    - break;
    - case CS8:
    - urb_value |= 8;
    - dev_dbg(ddev, "Setting CS8\n");
    - break;
    - default:
    - dev_err(ddev, "CSIZE was set but not CS7-CS8\n");
    - }
    + switch (cflag & CSIZE) {
    + case CS7:
    + urb_value |= 7;
    + dev_dbg(ddev, "Setting CS7\n");
    + break;
    + default:
    + case CS8:
    + urb_value |= 8;
    + dev_dbg(ddev, "Setting CS8\n");
    + break;
    }

    /* This is needed by the break command since it uses the same command
    diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c
    index e5bdd987b9e8..a69da83604c0 100644
    --- a/drivers/usb/serial/mos7840.c
    +++ b/drivers/usb/serial/mos7840.c
    @@ -1813,25 +1813,25 @@ static void mos7840_change_port_settings(struct tty_struct *tty,
    iflag = tty->termios.c_iflag;

    /* Change the number of bits */
    - if (cflag & CSIZE) {
    - switch (cflag & CSIZE) {
    - case CS5:
    - lData = LCR_BITS_5;
    - break;
    + switch (cflag & CSIZE) {
    + case CS5:
    + lData = LCR_BITS_5;
    + break;

    - case CS6:
    - lData = LCR_BITS_6;
    - break;
    + case CS6:
    + lData = LCR_BITS_6;
    + break;

    - case CS7:
    - lData = LCR_BITS_7;
    - break;
    - default:
    - case CS8:
    - lData = LCR_BITS_8;
    - break;
    - }
    + case CS7:
    + lData = LCR_BITS_7;
    + break;
    +
    + default:
    + case CS8:
    + lData = LCR_BITS_8;
    + break;
    }
    +
    /* Change the Parity bit */
    if (cflag & PARENB) {
    if (cflag & PARODD) {
    diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c
    index 1e6de4cd079d..1e3318dfa1cb 100644
    --- a/drivers/usb/serial/pl2303.c
    +++ b/drivers/usb/serial/pl2303.c
    @@ -361,23 +361,21 @@ static void pl2303_set_termios(struct tty_struct *tty,
    0, 0, buf, 7, 100);
    dev_dbg(&port->dev, "0xa1:0x21:0:0 %d - %7ph\n", i, buf);

    - if (C_CSIZE(tty)) {
    - switch (C_CSIZE(tty)) {
    - case CS5:
    - buf[6] = 5;
    - break;
    - case CS6:
    - buf[6] = 6;
    - break;
    - case CS7:
    - buf[6] = 7;
    - break;
    - default:
    - case CS8:
    - buf[6] = 8;
    - }
    - dev_dbg(&port->dev, "data bits = %d\n", buf[6]);
    + switch (C_CSIZE(tty)) {
    + case CS5:
    + buf[6] = 5;
    + break;
    + case CS6:
    + buf[6] = 6;
    + break;
    + case CS7:
    + buf[6] = 7;
    + break;
    + default:
    + case CS8:
    + buf[6] = 8;
    }
    + dev_dbg(&port->dev, "data bits = %d\n", buf[6]);

    /* For reference buf[0]:buf[3] baud rate value */
    pl2303_encode_baudrate(tty, port, &buf[0]);
    diff --git a/drivers/usb/serial/spcp8x5.c b/drivers/usb/serial/spcp8x5.c
    index 4abac28b5992..5b793c352267 100644
    --- a/drivers/usb/serial/spcp8x5.c
    +++ b/drivers/usb/serial/spcp8x5.c
    @@ -348,22 +348,20 @@ static void spcp8x5_set_termios(struct tty_struct *tty,
    }

    /* Set Data Length : 00:5bit, 01:6bit, 10:7bit, 11:8bit */
    - if (cflag & CSIZE) {
    - switch (cflag & CSIZE) {
    - case CS5:
    - buf[1] |= SET_UART_FORMAT_SIZE_5;
    - break;
    - case CS6:
    - buf[1] |= SET_UART_FORMAT_SIZE_6;
    - break;
    - case CS7:
    - buf[1] |= SET_UART_FORMAT_SIZE_7;
    - break;
    - default:
    - case CS8:
    - buf[1] |= SET_UART_FORMAT_SIZE_8;
    - break;
    - }
    + switch (cflag & CSIZE) {
    + case CS5:
    + buf[1] |= SET_UART_FORMAT_SIZE_5;
    + break;
    + case CS6:
    + buf[1] |= SET_UART_FORMAT_SIZE_6;
    + break;
    + case CS7:
    + buf[1] |= SET_UART_FORMAT_SIZE_7;
    + break;
    + default:
    + case CS8:
    + buf[1] |= SET_UART_FORMAT_SIZE_8;
    + break;
    }

    /* Set Stop bit2 : 0:1bit 1:2bit */
    diff --git a/drivers/video/omap2/displays-new/panel-sony-acx565akm.c b/drivers/video/omap2/displays-new/panel-sony-acx565akm.c
    index e6d56f714ae4..d94f35dbd536 100644
    --- a/drivers/video/omap2/displays-new/panel-sony-acx565akm.c
    +++ b/drivers/video/omap2/displays-new/panel-sony-acx565akm.c
    @@ -526,6 +526,8 @@ static int acx565akm_panel_power_on(struct omap_dss_device *dssdev)
    struct omap_dss_device *in = ddata->in;
    int r;

    + mutex_lock(&ddata->mutex);
    +
    dev_dbg(&ddata->spi->dev, "%s\n", __func__);

    in->ops.sdi->set_timings(in, &ddata->videomode);
    @@ -614,10 +616,7 @@ static int acx565akm_enable(struct omap_dss_device *dssdev)
    if (omapdss_device_is_enabled(dssdev))
    return 0;

    - mutex_lock(&ddata->mutex);
    r = acx565akm_panel_power_on(dssdev);
    - mutex_unlock(&ddata->mutex);
    -
    if (r)
    return r;

    diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
    index c4d2298893b1..255e8287d99a 100644
    --- a/drivers/xen/grant-table.c
    +++ b/drivers/xen/grant-table.c
    @@ -921,9 +921,10 @@ int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops,
    ret = m2p_add_override(mfn, pages[i], kmap_ops ?
    &kmap_ops[i] : NULL);
    if (ret)
    - return ret;
    + goto out;
    }

    + out:
    if (lazy)
    arch_leave_lazy_mmu_mode();

    @@ -954,9 +955,10 @@ int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops,
    ret = m2p_remove_override(pages[i], kmap_ops ?
    &kmap_ops[i] : NULL);
    if (ret)
    - return ret;
    + goto out;
    }

    + out:
    if (lazy)
    arch_leave_lazy_mmu_mode();

    diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
    index 3b115653d422..9be8021c70d8 100644
    --- a/fs/nfs/nfs4proc.c
    +++ b/fs/nfs/nfs4proc.c
    @@ -4938,11 +4938,17 @@ static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata)

    trace_nfs4_delegreturn_exit(&data->args, &data->res, task->tk_status);
    switch (task->tk_status) {
    - case -NFS4ERR_STALE_STATEID:
    - case -NFS4ERR_EXPIRED:
    case 0:
    renew_lease(data->res.server, data->timestamp);
    break;
    + case -NFS4ERR_ADMIN_REVOKED:
    + case -NFS4ERR_DELEG_REVOKED:
    + case -NFS4ERR_BAD_STATEID:
    + case -NFS4ERR_OLD_STATEID:
    + case -NFS4ERR_STALE_STATEID:
    + case -NFS4ERR_EXPIRED:
    + task->tk_status = 0;
    + break;
    default:
    if (nfs4_async_handle_error(task, data->res.server, NULL) ==
    -EAGAIN) {
    diff --git a/fs/pipe.c b/fs/pipe.c
    index d2c45e14e6d8..0e0752ef2715 100644
    --- a/fs/pipe.c
    +++ b/fs/pipe.c
    @@ -726,11 +726,25 @@ pipe_poll(struct file *filp, poll_table *wait)
    return mask;
    }

    +static void put_pipe_info(struct inode *inode, struct pipe_inode_info *pipe)
    +{
    + int kill = 0;
    +
    + spin_lock(&inode->i_lock);
    + if (!--pipe->files) {
    + inode->i_pipe = NULL;
    + kill = 1;
    + }
    + spin_unlock(&inode->i_lock);
    +
    + if (kill)
    + free_pipe_info(pipe);
    +}
    +
    static int
    pipe_release(struct inode *inode, struct file *file)
    {
    - struct pipe_inode_info *pipe = inode->i_pipe;
    - int kill = 0;
    + struct pipe_inode_info *pipe = file->private_data;

    __pipe_lock(pipe);
    if (file->f_mode & FMODE_READ)
    @@ -743,17 +757,9 @@ pipe_release(struct inode *inode, struct file *file)
    kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
    kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
    }
    - spin_lock(&inode->i_lock);
    - if (!--pipe->files) {
    - inode->i_pipe = NULL;
    - kill = 1;
    - }
    - spin_unlock(&inode->i_lock);
    __pipe_unlock(pipe);

    - if (kill)
    - free_pipe_info(pipe);
    -
    + put_pipe_info(inode, pipe);
    return 0;
    }

    @@ -1014,7 +1020,6 @@ static int fifo_open(struct inode *inode, struct file *filp)
    {
    struct pipe_inode_info *pipe;
    bool is_pipe = inode->i_sb->s_magic == PIPEFS_MAGIC;
    - int kill = 0;
    int ret;

    filp->f_version = 0;
    @@ -1130,15 +1135,9 @@ err_wr:
    goto err;

    err:
    - spin_lock(&inode->i_lock);
    - if (!--pipe->files) {
    - inode->i_pipe = NULL;
    - kill = 1;
    - }
    - spin_unlock(&inode->i_lock);
    __pipe_unlock(pipe);
    - if (kill)
    - free_pipe_info(pipe);
    +
    + put_pipe_info(inode, pipe);
    return ret;
    }

    diff --git a/include/crypto/scatterwalk.h b/include/crypto/scatterwalk.h
    index 13621cc8cf4c..6a626a507b8c 100644
    --- a/include/crypto/scatterwalk.h
    +++ b/include/crypto/scatterwalk.h
    @@ -36,6 +36,7 @@ static inline void scatterwalk_sg_chain(struct scatterlist *sg1, int num,
    {
    sg_set_page(&sg1[num - 1], (void *)sg2, 0, 0);
    sg1[num - 1].page_link &= ~0x02;
    + sg1[num - 1].page_link |= 0x01;
    }

    static inline struct scatterlist *scatterwalk_sg_next(struct scatterlist *sg)
    @@ -43,7 +44,7 @@ static inline struct scatterlist *scatterwalk_sg_next(struct scatterlist *sg)
    if (sg_is_last(sg))
    return NULL;

    - return (++sg)->length ? sg : (void *)sg_page(sg);
    + return (++sg)->length ? sg : sg_chain_ptr(sg);
    }

    static inline void scatterwalk_crypto_chain(struct scatterlist *head,
    diff --git a/include/linux/efi.h b/include/linux/efi.h
    index 5f8f176154f7..094ddd0f5d1c 100644
    --- a/include/linux/efi.h
    +++ b/include/linux/efi.h
    @@ -782,6 +782,8 @@ struct efivar_entry {
    struct efi_variable var;
    struct list_head list;
    struct kobject kobj;
    + bool scanning;
    + bool deleting;
    };

    extern struct list_head efivar_sysfs_list;
    @@ -840,6 +842,8 @@ void efivar_run_worker(void);
    #if defined(CONFIG_EFI_VARS) || defined(CONFIG_EFI_VARS_MODULE)
    int efivars_sysfs_init(void);

    +#define EFIVARS_DATA_SIZE_MAX 1024
    +
    #endif /* CONFIG_EFI_VARS */

    #endif /* _LINUX_EFI_H */
    diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h
    index 755243572219..50769a72166b 100644
    --- a/include/scsi/scsi_host.h
    +++ b/include/scsi/scsi_host.h
    @@ -475,6 +475,9 @@ struct scsi_host_template {
    */
    unsigned ordered_tag:1;

    + /* True if the controller does not support WRITE SAME */
    + unsigned no_write_same:1;
    +
    /*
    * Countdown for host blocking with no commands outstanding.
    */
    @@ -674,6 +677,9 @@ struct Scsi_Host {
    /* Don't resume host in EH */
    unsigned eh_noresume:1;

    + /* The controller does not support WRITE SAME */
    + unsigned no_write_same:1;
    +
    /*
    * Optional work queue to be utilized by the transport
    */
    diff --git a/include/sound/soc-dapm.h b/include/sound/soc-dapm.h
    index 27a72d5d4b00..9e600b418467 100644
    --- a/include/sound/soc-dapm.h
    +++ b/include/sound/soc-dapm.h
    @@ -104,7 +104,8 @@ struct device;
    SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
    .kcontrol_news = wcontrols, .num_kcontrols = 1}
    #define SND_SOC_DAPM_MUX(wname, wreg, wshift, winvert, wcontrols) \
    -{ .id = snd_soc_dapm_mux, .name = wname, .reg = wreg, \
    +{ .id = snd_soc_dapm_mux, .name = wname, \
    + SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
    .kcontrol_news = wcontrols, .num_kcontrols = 1}
    #define SND_SOC_DAPM_VIRT_MUX(wname, wreg, wshift, winvert, wcontrols) \
    { .id = snd_soc_dapm_virt_mux, .name = wname, \
    diff --git a/kernel/irq/pm.c b/kernel/irq/pm.c
    index cb228bf21760..abcd6ca86cb7 100644
    --- a/kernel/irq/pm.c
    +++ b/kernel/irq/pm.c
    @@ -50,7 +50,7 @@ static void resume_irqs(bool want_early)
    bool is_early = desc->action &&
    desc->action->flags & IRQF_EARLY_RESUME;

    - if (is_early != want_early)
    + if (!is_early && want_early)
    continue;

    raw_spin_lock_irqsave(&desc->lock, flags);
    diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
    index 947ba25a95a0..5cf6c7097a71 100644
    --- a/kernel/time/timekeeping.c
    +++ b/kernel/time/timekeeping.c
    @@ -1347,7 +1347,7 @@ static inline void old_vsyscall_fixup(struct timekeeper *tk)
    tk->xtime_nsec -= remainder;
    tk->xtime_nsec += 1ULL << tk->shift;
    tk->ntp_error += remainder << tk->ntp_error_shift;
    -
    + tk->ntp_error -= (1ULL << tk->shift) << tk->ntp_error_shift;
    }
    #else
    #define old_vsyscall_fixup(tk)
    diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
    index 5e2c2f1a075d..f60b1eec3f87 100644
    --- a/net/ipv4/udp.c
    +++ b/net/ipv4/udp.c
    @@ -1075,6 +1075,9 @@ int udp_sendpage(struct sock *sk, struct page *page, int offset,
    if (flags & MSG_SENDPAGE_NOTLAST)
    flags |= MSG_MORE;

    + if (flags & MSG_SENDPAGE_NOTLAST)
    + flags |= MSG_MORE;
    +
    if (!up->pending) {
    struct msghdr msg = { .msg_flags = flags|MSG_MORE };

    diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c
    index a52d2a1a5e83..f684a4f8c797 100644
    --- a/sound/pci/hda/patch_analog.c
    +++ b/sound/pci/hda/patch_analog.c
    @@ -345,6 +345,9 @@ static int patch_ad1986a(struct hda_codec *codec)
    */
    spec->gen.multiout.no_share_stream = 1;

    + /* AD1986A can't manage the dynamic pin on/off smoothly */
    + spec->gen.auto_mute_via_amp = 1;
    +
    snd_hda_pick_fixup(codec, ad1986a_fixup_models, ad1986a_fixup_tbl,
    ad1986a_fixups);
    snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
    @@ -961,6 +964,7 @@ static void ad1884_fixup_hp_eapd(struct hda_codec *codec,
    switch (action) {
    case HDA_FIXUP_ACT_PRE_PROBE:
    spec->gen.vmaster_mute.hook = ad1884_vmaster_hp_gpio_hook;
    + spec->gen.own_eapd_ctl = 1;
    snd_hda_sequence_write_cache(codec, gpio_init_verbs);
    break;
    case HDA_FIXUP_ACT_PROBE:
    diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
    index f0f54829ecee..21b948af6ed0 100644
    --- a/sound/pci/hda/patch_realtek.c
    +++ b/sound/pci/hda/patch_realtek.c
    @@ -1769,6 +1769,7 @@ enum {
    ALC889_FIXUP_DAC_ROUTE,
    ALC889_FIXUP_MBP_VREF,
    ALC889_FIXUP_IMAC91_VREF,
    + ALC889_FIXUP_MBA21_VREF,
    ALC882_FIXUP_INV_DMIC,
    ALC882_FIXUP_NO_PRIMARY_HP,
    ALC887_FIXUP_ASUS_BASS,
    @@ -1872,17 +1873,13 @@ static void alc889_fixup_mbp_vref(struct hda_codec *codec,
    }
    }

    -/* Set VREF on speaker pins on imac91 */
    -static void alc889_fixup_imac91_vref(struct hda_codec *codec,
    - const struct hda_fixup *fix, int action)
    +static void alc889_fixup_mac_pins(struct hda_codec *codec,
    + const hda_nid_t *nids, int num_nids)
    {
    struct alc_spec *spec = codec->spec;
    - static hda_nid_t nids[2] = { 0x18, 0x1a };
    int i;

    - if (action != HDA_FIXUP_ACT_INIT)
    - return;
    - for (i = 0; i < ARRAY_SIZE(nids); i++) {
    + for (i = 0; i < num_nids; i++) {
    unsigned int val;
    val = snd_hda_codec_get_pin_target(codec, nids[i]);
    val |= AC_PINCTL_VREF_50;
    @@ -1891,6 +1888,26 @@ static void alc889_fixup_imac91_vref(struct hda_codec *codec,
    spec->gen.keep_vref_in_automute = 1;
    }

    +/* Set VREF on speaker pins on imac91 */
    +static void alc889_fixup_imac91_vref(struct hda_codec *codec,
    + const struct hda_fixup *fix, int action)
    +{
    + static hda_nid_t nids[2] = { 0x18, 0x1a };
    +
    + if (action == HDA_FIXUP_ACT_INIT)
    + alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
    +}
    +
    +/* Set VREF on speaker pins on mba21 */
    +static void alc889_fixup_mba21_vref(struct hda_codec *codec,
    + const struct hda_fixup *fix, int action)
    +{
    + static hda_nid_t nids[2] = { 0x18, 0x19 };
    +
    + if (action == HDA_FIXUP_ACT_INIT)
    + alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
    +}
    +
    /* Don't take HP output as primary
    * Strangely, the speaker output doesn't work on Vaio Z and some Vaio
    * all-in-one desktop PCs (for example VGC-LN51JGB) through DAC 0x05
    @@ -2087,6 +2104,12 @@ static const struct hda_fixup alc882_fixups[] = {
    .chained = true,
    .chain_id = ALC882_FIXUP_GPIO1,
    },
    + [ALC889_FIXUP_MBA21_VREF] = {
    + .type = HDA_FIXUP_FUNC,
    + .v.func = alc889_fixup_mba21_vref,
    + .chained = true,
    + .chain_id = ALC889_FIXUP_MBP_VREF,
    + },
    [ALC882_FIXUP_INV_DMIC] = {
    .type = HDA_FIXUP_FUNC,
    .v.func = alc_fixup_inv_dmic_0x12,
    @@ -2151,7 +2174,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
    SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889_FIXUP_MBP_VREF),
    SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD),
    SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC889_FIXUP_MBP_VREF),
    - SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC889_FIXUP_MBP_VREF),
    + SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC889_FIXUP_MBA21_VREF),
    SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889_FIXUP_MBP_VREF),
    SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
    SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO),
    @@ -3231,6 +3254,7 @@ static void alc_headset_mode_ctia(struct hda_codec *codec)
    alc_write_coef_idx(codec, 0x18, 0x7388);
    break;
    case 0x10ec0668:
    + alc_write_coef_idx(codec, 0x11, 0x0001);
    alc_write_coef_idx(codec, 0x15, 0x0d60);
    alc_write_coef_idx(codec, 0xc3, 0x0000);
    break;
    @@ -3253,6 +3277,7 @@ static void alc_headset_mode_omtp(struct hda_codec *codec)
    alc_write_coef_idx(codec, 0x18, 0x7388);
    break;
    case 0x10ec0668:
    + alc_write_coef_idx(codec, 0x11, 0x0001);
    alc_write_coef_idx(codec, 0x15, 0x0d50);
    alc_write_coef_idx(codec, 0xc3, 0x0000);
    break;
    @@ -3982,6 +4007,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
    SND_PCI_QUIRK(0x1028, 0x0613, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
    SND_PCI_QUIRK(0x1028, 0x0614, "Dell Inspiron 3135", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
    SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_MONO_SPEAKERS),
    + SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS),
    SND_PCI_QUIRK(0x1028, 0x15cc, "Dell X5 Precision", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE),
    SND_PCI_QUIRK(0x1028, 0x15cd, "Dell X5 Precision", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE),
    SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
    @@ -4266,6 +4292,7 @@ enum {
    ALC861_FIXUP_AMP_VREF_0F,
    ALC861_FIXUP_NO_JACK_DETECT,
    ALC861_FIXUP_ASUS_A6RP,
    + ALC660_FIXUP_ASUS_W7J,
    };

    /* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */
    @@ -4315,10 +4342,22 @@ static const struct hda_fixup alc861_fixups[] = {
    .v.func = alc861_fixup_asus_amp_vref_0f,
    .chained = true,
    .chain_id = ALC861_FIXUP_NO_JACK_DETECT,
    + },
    + [ALC660_FIXUP_ASUS_W7J] = {
    + .type = HDA_FIXUP_VERBS,
    + .v.verbs = (const struct hda_verb[]) {
    + /* ASUS W7J needs a magic pin setup on unused NID 0x10
    + * for enabling outputs
    + */
    + {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
    + { }
    + },
    }
    };

    static const struct snd_pci_quirk alc861_fixup_tbl[] = {
    + SND_PCI_QUIRK(0x1043, 0x1253, "ASUS W7J", ALC660_FIXUP_ASUS_W7J),
    + SND_PCI_QUIRK(0x1043, 0x1263, "ASUS Z35HL", ALC660_FIXUP_ASUS_W7J),
    SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", ALC861_FIXUP_ASUS_A6RP),
    SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", ALC861_FIXUP_AMP_VREF_0F),
    SND_PCI_QUIRK(0x1462, 0x7254, "HP DX2200", ALC861_FIXUP_NO_JACK_DETECT),
    diff --git a/sound/soc/codecs/wm8731.c b/sound/soc/codecs/wm8731.c
    index 456bb8c6d759..bc7472c968e3 100644
    --- a/sound/soc/codecs/wm8731.c
    +++ b/sound/soc/codecs/wm8731.c
    @@ -447,10 +447,10 @@ static int wm8731_set_dai_fmt(struct snd_soc_dai *codec_dai,
    iface |= 0x0001;
    break;
    case SND_SOC_DAIFMT_DSP_A:
    - iface |= 0x0003;
    + iface |= 0x0013;
    break;
    case SND_SOC_DAIFMT_DSP_B:
    - iface |= 0x0013;
    + iface |= 0x0003;
    break;
    default:
    return -EINVAL;
    diff --git a/sound/soc/codecs/wm8990.c b/sound/soc/codecs/wm8990.c
    index 253c88bb7a4c..4f05fb88bddf 100644
    --- a/sound/soc/codecs/wm8990.c
    +++ b/sound/soc/codecs/wm8990.c
    @@ -1259,6 +1259,8 @@ static int wm8990_set_bias_level(struct snd_soc_codec *codec,

    /* disable POBCTRL, SOFT_ST and BUFDCOPEN */
    snd_soc_write(codec, WM8990_ANTIPOP2, 0x0);
    +
    + codec->cache_sync = 1;
    break;
    }


    \
     
     \ /
      Last update: 2013-12-12 09:21    [W:2.723 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site