diff options
Diffstat (limited to 'drivers')
98 files changed, 628 insertions, 435 deletions
diff --git a/drivers/acpi/apei/erst.c b/drivers/acpi/apei/erst.c index 26311f23c824..cb1d557fc22c 100644 --- a/drivers/acpi/apei/erst.c +++ b/drivers/acpi/apei/erst.c | |||
| @@ -942,6 +942,7 @@ static int erst_clearer(enum pstore_type_id type, u64 id, int count, | |||
| 942 | static struct pstore_info erst_info = { | 942 | static struct pstore_info erst_info = { |
| 943 | .owner = THIS_MODULE, | 943 | .owner = THIS_MODULE, |
| 944 | .name = "erst", | 944 | .name = "erst", |
| 945 | .flags = PSTORE_FLAGS_FRAGILE, | ||
| 945 | .open = erst_open_pstore, | 946 | .open = erst_open_pstore, |
| 946 | .close = erst_close_pstore, | 947 | .close = erst_close_pstore, |
| 947 | .read = erst_reader, | 948 | .read = erst_reader, |
diff --git a/drivers/clk/clk-s2mps11.c b/drivers/clk/clk-s2mps11.c index 7be41e676a64..00a3abe103a5 100644 --- a/drivers/clk/clk-s2mps11.c +++ b/drivers/clk/clk-s2mps11.c | |||
| @@ -60,7 +60,7 @@ static int s2mps11_clk_prepare(struct clk_hw *hw) | |||
| 60 | struct s2mps11_clk *s2mps11 = to_s2mps11_clk(hw); | 60 | struct s2mps11_clk *s2mps11 = to_s2mps11_clk(hw); |
| 61 | int ret; | 61 | int ret; |
| 62 | 62 | ||
| 63 | ret = regmap_update_bits(s2mps11->iodev->regmap, | 63 | ret = regmap_update_bits(s2mps11->iodev->regmap_pmic, |
| 64 | S2MPS11_REG_RTC_CTRL, | 64 | S2MPS11_REG_RTC_CTRL, |
| 65 | s2mps11->mask, s2mps11->mask); | 65 | s2mps11->mask, s2mps11->mask); |
| 66 | if (!ret) | 66 | if (!ret) |
| @@ -74,7 +74,7 @@ static void s2mps11_clk_unprepare(struct clk_hw *hw) | |||
| 74 | struct s2mps11_clk *s2mps11 = to_s2mps11_clk(hw); | 74 | struct s2mps11_clk *s2mps11 = to_s2mps11_clk(hw); |
| 75 | int ret; | 75 | int ret; |
| 76 | 76 | ||
| 77 | ret = regmap_update_bits(s2mps11->iodev->regmap, S2MPS11_REG_RTC_CTRL, | 77 | ret = regmap_update_bits(s2mps11->iodev->regmap_pmic, S2MPS11_REG_RTC_CTRL, |
| 78 | s2mps11->mask, ~s2mps11->mask); | 78 | s2mps11->mask, ~s2mps11->mask); |
| 79 | 79 | ||
| 80 | if (!ret) | 80 | if (!ret) |
| @@ -174,7 +174,7 @@ static int s2mps11_clk_probe(struct platform_device *pdev) | |||
| 174 | s2mps11_clk->hw.init = &s2mps11_clks_init[i]; | 174 | s2mps11_clk->hw.init = &s2mps11_clks_init[i]; |
| 175 | s2mps11_clk->mask = 1 << i; | 175 | s2mps11_clk->mask = 1 << i; |
| 176 | 176 | ||
| 177 | ret = regmap_read(s2mps11_clk->iodev->regmap, | 177 | ret = regmap_read(s2mps11_clk->iodev->regmap_pmic, |
| 178 | S2MPS11_REG_RTC_CTRL, &val); | 178 | S2MPS11_REG_RTC_CTRL, &val); |
| 179 | if (ret < 0) | 179 | if (ret < 0) |
| 180 | goto err_reg; | 180 | goto err_reg; |
diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig index 5c07a56962db..634c4d6dd45a 100644 --- a/drivers/clocksource/Kconfig +++ b/drivers/clocksource/Kconfig | |||
| @@ -75,6 +75,7 @@ config CLKSRC_DBX500_PRCMU_SCHED_CLOCK | |||
| 75 | config CLKSRC_EFM32 | 75 | config CLKSRC_EFM32 |
| 76 | bool "Clocksource for Energy Micro's EFM32 SoCs" if !ARCH_EFM32 | 76 | bool "Clocksource for Energy Micro's EFM32 SoCs" if !ARCH_EFM32 |
| 77 | depends on OF && ARM && (ARCH_EFM32 || COMPILE_TEST) | 77 | depends on OF && ARM && (ARCH_EFM32 || COMPILE_TEST) |
| 78 | select CLKSRC_MMIO | ||
| 78 | default ARCH_EFM32 | 79 | default ARCH_EFM32 |
| 79 | help | 80 | help |
| 80 | Support to use the timers of EFM32 SoCs as clock source and clock | 81 | Support to use the timers of EFM32 SoCs as clock source and clock |
diff --git a/drivers/clocksource/clksrc-of.c b/drivers/clocksource/clksrc-of.c index 35639cf4e5a2..b9ddd9e3a2f5 100644 --- a/drivers/clocksource/clksrc-of.c +++ b/drivers/clocksource/clksrc-of.c | |||
| @@ -35,6 +35,5 @@ void __init clocksource_of_init(void) | |||
| 35 | 35 | ||
| 36 | init_func = match->data; | 36 | init_func = match->data; |
| 37 | init_func(np); | 37 | init_func(np); |
| 38 | of_node_put(np); | ||
| 39 | } | 38 | } |
| 40 | } | 39 | } |
diff --git a/drivers/clocksource/dw_apb_timer_of.c b/drivers/clocksource/dw_apb_timer_of.c index 45ba8aecc729..2a2ea2717f3a 100644 --- a/drivers/clocksource/dw_apb_timer_of.c +++ b/drivers/clocksource/dw_apb_timer_of.c | |||
| @@ -108,12 +108,11 @@ static void __init add_clocksource(struct device_node *source_timer) | |||
| 108 | 108 | ||
| 109 | static u64 read_sched_clock(void) | 109 | static u64 read_sched_clock(void) |
| 110 | { | 110 | { |
| 111 | return __raw_readl(sched_io_base); | 111 | return ~__raw_readl(sched_io_base); |
| 112 | } | 112 | } |
| 113 | 113 | ||
| 114 | static const struct of_device_id sptimer_ids[] __initconst = { | 114 | static const struct of_device_id sptimer_ids[] __initconst = { |
| 115 | { .compatible = "picochip,pc3x2-rtc" }, | 115 | { .compatible = "picochip,pc3x2-rtc" }, |
| 116 | { .compatible = "snps,dw-apb-timer-sp" }, | ||
| 117 | { /* Sentinel */ }, | 116 | { /* Sentinel */ }, |
| 118 | }; | 117 | }; |
| 119 | 118 | ||
| @@ -151,4 +150,6 @@ static void __init dw_apb_timer_init(struct device_node *timer) | |||
| 151 | num_called++; | 150 | num_called++; |
| 152 | } | 151 | } |
| 153 | CLOCKSOURCE_OF_DECLARE(pc3x2_timer, "picochip,pc3x2-timer", dw_apb_timer_init); | 152 | CLOCKSOURCE_OF_DECLARE(pc3x2_timer, "picochip,pc3x2-timer", dw_apb_timer_init); |
| 154 | CLOCKSOURCE_OF_DECLARE(apb_timer, "snps,dw-apb-timer-osc", dw_apb_timer_init); | 153 | CLOCKSOURCE_OF_DECLARE(apb_timer_osc, "snps,dw-apb-timer-osc", dw_apb_timer_init); |
| 154 | CLOCKSOURCE_OF_DECLARE(apb_timer_sp, "snps,dw-apb-timer-sp", dw_apb_timer_init); | ||
| 155 | CLOCKSOURCE_OF_DECLARE(apb_timer, "snps,dw-apb-timer", dw_apb_timer_init); | ||
diff --git a/drivers/clocksource/sun4i_timer.c b/drivers/clocksource/sun4i_timer.c index 2fb4695a28d8..a4f6119aafd8 100644 --- a/drivers/clocksource/sun4i_timer.c +++ b/drivers/clocksource/sun4i_timer.c | |||
| @@ -179,6 +179,9 @@ static void __init sun4i_timer_init(struct device_node *node) | |||
| 179 | writel(TIMER_CTL_CLK_SRC(TIMER_CTL_CLK_SRC_OSC24M), | 179 | writel(TIMER_CTL_CLK_SRC(TIMER_CTL_CLK_SRC_OSC24M), |
| 180 | timer_base + TIMER_CTL_REG(0)); | 180 | timer_base + TIMER_CTL_REG(0)); |
| 181 | 181 | ||
| 182 | /* Make sure timer is stopped before playing with interrupts */ | ||
| 183 | sun4i_clkevt_time_stop(0); | ||
| 184 | |||
| 182 | ret = setup_irq(irq, &sun4i_timer_irq); | 185 | ret = setup_irq(irq, &sun4i_timer_irq); |
| 183 | if (ret) | 186 | if (ret) |
| 184 | pr_warn("failed to setup irq %d\n", irq); | 187 | pr_warn("failed to setup irq %d\n", irq); |
diff --git a/drivers/clocksource/time-armada-370-xp.c b/drivers/clocksource/time-armada-370-xp.c index d8e47e502785..4e7f6802e840 100644 --- a/drivers/clocksource/time-armada-370-xp.c +++ b/drivers/clocksource/time-armada-370-xp.c | |||
| @@ -256,11 +256,6 @@ static void __init armada_370_xp_timer_common_init(struct device_node *np) | |||
| 256 | ticks_per_jiffy = (timer_clk + HZ / 2) / HZ; | 256 | ticks_per_jiffy = (timer_clk + HZ / 2) / HZ; |
| 257 | 257 | ||
| 258 | /* | 258 | /* |
| 259 | * Set scale and timer for sched_clock. | ||
| 260 | */ | ||
| 261 | sched_clock_register(armada_370_xp_read_sched_clock, 32, timer_clk); | ||
| 262 | |||
| 263 | /* | ||
| 264 | * Setup free-running clocksource timer (interrupts | 259 | * Setup free-running clocksource timer (interrupts |
| 265 | * disabled). | 260 | * disabled). |
| 266 | */ | 261 | */ |
| @@ -270,6 +265,11 @@ static void __init armada_370_xp_timer_common_init(struct device_node *np) | |||
| 270 | timer_ctrl_clrset(0, TIMER0_EN | TIMER0_RELOAD_EN | | 265 | timer_ctrl_clrset(0, TIMER0_EN | TIMER0_RELOAD_EN | |
| 271 | TIMER0_DIV(TIMER_DIVIDER_SHIFT)); | 266 | TIMER0_DIV(TIMER_DIVIDER_SHIFT)); |
| 272 | 267 | ||
| 268 | /* | ||
| 269 | * Set scale and timer for sched_clock. | ||
| 270 | */ | ||
| 271 | sched_clock_register(armada_370_xp_read_sched_clock, 32, timer_clk); | ||
| 272 | |||
| 273 | clocksource_mmio_init(timer_base + TIMER0_VAL_OFF, | 273 | clocksource_mmio_init(timer_base + TIMER0_VAL_OFF, |
| 274 | "armada_370_xp_clocksource", | 274 | "armada_370_xp_clocksource", |
| 275 | timer_clk, 300, 32, clocksource_mmio_readl_down); | 275 | timer_clk, 300, 32, clocksource_mmio_readl_down); |
diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig index 446687cc2334..c823daaf9043 100644 --- a/drivers/dma/Kconfig +++ b/drivers/dma/Kconfig | |||
| @@ -62,6 +62,7 @@ config INTEL_IOATDMA | |||
| 62 | tristate "Intel I/OAT DMA support" | 62 | tristate "Intel I/OAT DMA support" |
| 63 | depends on PCI && X86 | 63 | depends on PCI && X86 |
| 64 | select DMA_ENGINE | 64 | select DMA_ENGINE |
| 65 | select DMA_ENGINE_RAID | ||
| 65 | select DCA | 66 | select DCA |
| 66 | help | 67 | help |
| 67 | Enable support for the Intel(R) I/OAT DMA engine present | 68 | Enable support for the Intel(R) I/OAT DMA engine present |
| @@ -112,6 +113,7 @@ config MV_XOR | |||
| 112 | bool "Marvell XOR engine support" | 113 | bool "Marvell XOR engine support" |
| 113 | depends on PLAT_ORION | 114 | depends on PLAT_ORION |
| 114 | select DMA_ENGINE | 115 | select DMA_ENGINE |
| 116 | select DMA_ENGINE_RAID | ||
| 115 | select ASYNC_TX_ENABLE_CHANNEL_SWITCH | 117 | select ASYNC_TX_ENABLE_CHANNEL_SWITCH |
| 116 | ---help--- | 118 | ---help--- |
| 117 | Enable support for the Marvell XOR engine. | 119 | Enable support for the Marvell XOR engine. |
| @@ -187,6 +189,7 @@ config AMCC_PPC440SPE_ADMA | |||
| 187 | tristate "AMCC PPC440SPe ADMA support" | 189 | tristate "AMCC PPC440SPe ADMA support" |
| 188 | depends on 440SPe || 440SP | 190 | depends on 440SPe || 440SP |
| 189 | select DMA_ENGINE | 191 | select DMA_ENGINE |
| 192 | select DMA_ENGINE_RAID | ||
| 190 | select ARCH_HAS_ASYNC_TX_FIND_CHANNEL | 193 | select ARCH_HAS_ASYNC_TX_FIND_CHANNEL |
| 191 | select ASYNC_TX_ENABLE_CHANNEL_SWITCH | 194 | select ASYNC_TX_ENABLE_CHANNEL_SWITCH |
| 192 | help | 195 | help |
| @@ -352,6 +355,7 @@ config NET_DMA | |||
| 352 | bool "Network: TCP receive copy offload" | 355 | bool "Network: TCP receive copy offload" |
| 353 | depends on DMA_ENGINE && NET | 356 | depends on DMA_ENGINE && NET |
| 354 | default (INTEL_IOATDMA || FSL_DMA) | 357 | default (INTEL_IOATDMA || FSL_DMA) |
| 358 | depends on BROKEN | ||
| 355 | help | 359 | help |
| 356 | This enables the use of DMA engines in the network stack to | 360 | This enables the use of DMA engines in the network stack to |
| 357 | offload receive copy-to-user operations, freeing CPU cycles. | 361 | offload receive copy-to-user operations, freeing CPU cycles. |
| @@ -377,4 +381,7 @@ config DMATEST | |||
| 377 | Simple DMA test client. Say N unless you're debugging a | 381 | Simple DMA test client. Say N unless you're debugging a |
| 378 | DMA Device driver. | 382 | DMA Device driver. |
| 379 | 383 | ||
| 384 | config DMA_ENGINE_RAID | ||
| 385 | bool | ||
| 386 | |||
| 380 | endif | 387 | endif |
diff --git a/drivers/dma/at_hdmac_regs.h b/drivers/dma/at_hdmac_regs.h index f31d647acdfa..2787aba60c6b 100644 --- a/drivers/dma/at_hdmac_regs.h +++ b/drivers/dma/at_hdmac_regs.h | |||
| @@ -347,10 +347,6 @@ static struct device *chan2dev(struct dma_chan *chan) | |||
| 347 | { | 347 | { |
| 348 | return &chan->dev->device; | 348 | return &chan->dev->device; |
| 349 | } | 349 | } |
| 350 | static struct device *chan2parent(struct dma_chan *chan) | ||
| 351 | { | ||
| 352 | return chan->dev->device.parent; | ||
| 353 | } | ||
| 354 | 350 | ||
| 355 | #if defined(VERBOSE_DEBUG) | 351 | #if defined(VERBOSE_DEBUG) |
| 356 | static void vdbg_dump_regs(struct at_dma_chan *atchan) | 352 | static void vdbg_dump_regs(struct at_dma_chan *atchan) |
diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c index ea806bdc12ef..ef63b9058f3c 100644 --- a/drivers/dma/dmaengine.c +++ b/drivers/dma/dmaengine.c | |||
| @@ -912,7 +912,7 @@ struct dmaengine_unmap_pool { | |||
| 912 | #define __UNMAP_POOL(x) { .size = x, .name = "dmaengine-unmap-" __stringify(x) } | 912 | #define __UNMAP_POOL(x) { .size = x, .name = "dmaengine-unmap-" __stringify(x) } |
| 913 | static struct dmaengine_unmap_pool unmap_pool[] = { | 913 | static struct dmaengine_unmap_pool unmap_pool[] = { |
| 914 | __UNMAP_POOL(2), | 914 | __UNMAP_POOL(2), |
| 915 | #if IS_ENABLED(CONFIG_ASYNC_TX_DMA) | 915 | #if IS_ENABLED(CONFIG_DMA_ENGINE_RAID) |
| 916 | __UNMAP_POOL(16), | 916 | __UNMAP_POOL(16), |
| 917 | __UNMAP_POOL(128), | 917 | __UNMAP_POOL(128), |
| 918 | __UNMAP_POOL(256), | 918 | __UNMAP_POOL(256), |
| @@ -1054,7 +1054,7 @@ dma_async_memcpy_pg_to_pg(struct dma_chan *chan, struct page *dest_pg, | |||
| 1054 | dma_cookie_t cookie; | 1054 | dma_cookie_t cookie; |
| 1055 | unsigned long flags; | 1055 | unsigned long flags; |
| 1056 | 1056 | ||
| 1057 | unmap = dmaengine_get_unmap_data(dev->dev, 2, GFP_NOIO); | 1057 | unmap = dmaengine_get_unmap_data(dev->dev, 2, GFP_NOWAIT); |
| 1058 | if (!unmap) | 1058 | if (!unmap) |
| 1059 | return -ENOMEM; | 1059 | return -ENOMEM; |
| 1060 | 1060 | ||
diff --git a/drivers/dma/dmatest.c b/drivers/dma/dmatest.c index 20f9a3aaf926..9dfcaf5c1288 100644 --- a/drivers/dma/dmatest.c +++ b/drivers/dma/dmatest.c | |||
| @@ -539,9 +539,9 @@ static int dmatest_func(void *data) | |||
| 539 | 539 | ||
| 540 | um->len = params->buf_size; | 540 | um->len = params->buf_size; |
| 541 | for (i = 0; i < src_cnt; i++) { | 541 | for (i = 0; i < src_cnt; i++) { |
| 542 | unsigned long buf = (unsigned long) thread->srcs[i]; | 542 | void *buf = thread->srcs[i]; |
| 543 | struct page *pg = virt_to_page(buf); | 543 | struct page *pg = virt_to_page(buf); |
| 544 | unsigned pg_off = buf & ~PAGE_MASK; | 544 | unsigned pg_off = (unsigned long) buf & ~PAGE_MASK; |
| 545 | 545 | ||
| 546 | um->addr[i] = dma_map_page(dev->dev, pg, pg_off, | 546 | um->addr[i] = dma_map_page(dev->dev, pg, pg_off, |
| 547 | um->len, DMA_TO_DEVICE); | 547 | um->len, DMA_TO_DEVICE); |
| @@ -559,9 +559,9 @@ static int dmatest_func(void *data) | |||
| 559 | /* map with DMA_BIDIRECTIONAL to force writeback/invalidate */ | 559 | /* map with DMA_BIDIRECTIONAL to force writeback/invalidate */ |
| 560 | dsts = &um->addr[src_cnt]; | 560 | dsts = &um->addr[src_cnt]; |
| 561 | for (i = 0; i < dst_cnt; i++) { | 561 | for (i = 0; i < dst_cnt; i++) { |
| 562 | unsigned long buf = (unsigned long) thread->dsts[i]; | 562 | void *buf = thread->dsts[i]; |
| 563 | struct page *pg = virt_to_page(buf); | 563 | struct page *pg = virt_to_page(buf); |
| 564 | unsigned pg_off = buf & ~PAGE_MASK; | 564 | unsigned pg_off = (unsigned long) buf & ~PAGE_MASK; |
| 565 | 565 | ||
| 566 | dsts[i] = dma_map_page(dev->dev, pg, pg_off, um->len, | 566 | dsts[i] = dma_map_page(dev->dev, pg, pg_off, um->len, |
| 567 | DMA_BIDIRECTIONAL); | 567 | DMA_BIDIRECTIONAL); |
diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c index 7086a16a55f2..f157c6f76b32 100644 --- a/drivers/dma/fsldma.c +++ b/drivers/dma/fsldma.c | |||
| @@ -86,11 +86,6 @@ static void set_desc_cnt(struct fsldma_chan *chan, | |||
| 86 | hw->count = CPU_TO_DMA(chan, count, 32); | 86 | hw->count = CPU_TO_DMA(chan, count, 32); |
| 87 | } | 87 | } |
| 88 | 88 | ||
| 89 | static u32 get_desc_cnt(struct fsldma_chan *chan, struct fsl_desc_sw *desc) | ||
| 90 | { | ||
| 91 | return DMA_TO_CPU(chan, desc->hw.count, 32); | ||
| 92 | } | ||
| 93 | |||
| 94 | static void set_desc_src(struct fsldma_chan *chan, | 89 | static void set_desc_src(struct fsldma_chan *chan, |
| 95 | struct fsl_dma_ld_hw *hw, dma_addr_t src) | 90 | struct fsl_dma_ld_hw *hw, dma_addr_t src) |
| 96 | { | 91 | { |
| @@ -101,16 +96,6 @@ static void set_desc_src(struct fsldma_chan *chan, | |||
| 101 | hw->src_addr = CPU_TO_DMA(chan, snoop_bits | src, 64); | 96 | hw->src_addr = CPU_TO_DMA(chan, snoop_bits | src, 64); |
| 102 | } | 97 | } |
| 103 | 98 | ||
| 104 | static dma_addr_t get_desc_src(struct fsldma_chan *chan, | ||
| 105 | struct fsl_desc_sw *desc) | ||
| 106 | { | ||
| 107 | u64 snoop_bits; | ||
| 108 | |||
| 109 | snoop_bits = ((chan->feature & FSL_DMA_IP_MASK) == FSL_DMA_IP_85XX) | ||
| 110 | ? ((u64)FSL_DMA_SATR_SREADTYPE_SNOOP_READ << 32) : 0; | ||
| 111 | return DMA_TO_CPU(chan, desc->hw.src_addr, 64) & ~snoop_bits; | ||
| 112 | } | ||
| 113 | |||
| 114 | static void set_desc_dst(struct fsldma_chan *chan, | 99 | static void set_desc_dst(struct fsldma_chan *chan, |
| 115 | struct fsl_dma_ld_hw *hw, dma_addr_t dst) | 100 | struct fsl_dma_ld_hw *hw, dma_addr_t dst) |
| 116 | { | 101 | { |
| @@ -121,16 +106,6 @@ static void set_desc_dst(struct fsldma_chan *chan, | |||
| 121 | hw->dst_addr = CPU_TO_DMA(chan, snoop_bits | dst, 64); | 106 | hw->dst_addr = CPU_TO_DMA(chan, snoop_bits | dst, 64); |
| 122 | } | 107 | } |
| 123 | 108 | ||
| 124 | static dma_addr_t get_desc_dst(struct fsldma_chan *chan, | ||
| 125 | struct fsl_desc_sw *desc) | ||
| 126 | { | ||
| 127 | u64 snoop_bits; | ||
| 128 | |||
| 129 | snoop_bits = ((chan->feature & FSL_DMA_IP_MASK) == FSL_DMA_IP_85XX) | ||
| 130 | ? ((u64)FSL_DMA_DATR_DWRITETYPE_SNOOP_WRITE << 32) : 0; | ||
| 131 | return DMA_TO_CPU(chan, desc->hw.dst_addr, 64) & ~snoop_bits; | ||
| 132 | } | ||
| 133 | |||
| 134 | static void set_desc_next(struct fsldma_chan *chan, | 109 | static void set_desc_next(struct fsldma_chan *chan, |
| 135 | struct fsl_dma_ld_hw *hw, dma_addr_t next) | 110 | struct fsl_dma_ld_hw *hw, dma_addr_t next) |
| 136 | { | 111 | { |
| @@ -408,7 +383,7 @@ static dma_cookie_t fsl_dma_tx_submit(struct dma_async_tx_descriptor *tx) | |||
| 408 | struct fsl_desc_sw *desc = tx_to_fsl_desc(tx); | 383 | struct fsl_desc_sw *desc = tx_to_fsl_desc(tx); |
| 409 | struct fsl_desc_sw *child; | 384 | struct fsl_desc_sw *child; |
| 410 | unsigned long flags; | 385 | unsigned long flags; |
| 411 | dma_cookie_t cookie; | 386 | dma_cookie_t cookie = -EINVAL; |
| 412 | 387 | ||
| 413 | spin_lock_irqsave(&chan->desc_lock, flags); | 388 | spin_lock_irqsave(&chan->desc_lock, flags); |
| 414 | 389 | ||
| @@ -854,10 +829,6 @@ static void fsldma_cleanup_descriptor(struct fsldma_chan *chan, | |||
| 854 | struct fsl_desc_sw *desc) | 829 | struct fsl_desc_sw *desc) |
| 855 | { | 830 | { |
| 856 | struct dma_async_tx_descriptor *txd = &desc->async_tx; | 831 | struct dma_async_tx_descriptor *txd = &desc->async_tx; |
| 857 | struct device *dev = chan->common.device->dev; | ||
| 858 | dma_addr_t src = get_desc_src(chan, desc); | ||
| 859 | dma_addr_t dst = get_desc_dst(chan, desc); | ||
| 860 | u32 len = get_desc_cnt(chan, desc); | ||
| 861 | 832 | ||
| 862 | /* Run the link descriptor callback function */ | 833 | /* Run the link descriptor callback function */ |
| 863 | if (txd->callback) { | 834 | if (txd->callback) { |
diff --git a/drivers/dma/mv_xor.c b/drivers/dma/mv_xor.c index 7807f0ef4e20..53fb0c8365b0 100644 --- a/drivers/dma/mv_xor.c +++ b/drivers/dma/mv_xor.c | |||
| @@ -54,12 +54,6 @@ static void mv_desc_init(struct mv_xor_desc_slot *desc, unsigned long flags) | |||
| 54 | hw_desc->desc_command = (1 << 31); | 54 | hw_desc->desc_command = (1 << 31); |
| 55 | } | 55 | } |
| 56 | 56 | ||
| 57 | static u32 mv_desc_get_dest_addr(struct mv_xor_desc_slot *desc) | ||
| 58 | { | ||
| 59 | struct mv_xor_desc *hw_desc = desc->hw_desc; | ||
| 60 | return hw_desc->phy_dest_addr; | ||
| 61 | } | ||
| 62 | |||
| 63 | static void mv_desc_set_byte_count(struct mv_xor_desc_slot *desc, | 57 | static void mv_desc_set_byte_count(struct mv_xor_desc_slot *desc, |
| 64 | u32 byte_count) | 58 | u32 byte_count) |
| 65 | { | 59 | { |
| @@ -787,7 +781,6 @@ static void mv_xor_issue_pending(struct dma_chan *chan) | |||
| 787 | /* | 781 | /* |
| 788 | * Perform a transaction to verify the HW works. | 782 | * Perform a transaction to verify the HW works. |
| 789 | */ | 783 | */ |
| 790 | #define MV_XOR_TEST_SIZE 2000 | ||
| 791 | 784 | ||
| 792 | static int mv_xor_memcpy_self_test(struct mv_xor_chan *mv_chan) | 785 | static int mv_xor_memcpy_self_test(struct mv_xor_chan *mv_chan) |
| 793 | { | 786 | { |
| @@ -797,20 +790,21 @@ static int mv_xor_memcpy_self_test(struct mv_xor_chan *mv_chan) | |||
| 797 | struct dma_chan *dma_chan; | 790 | struct dma_chan *dma_chan; |
| 798 | dma_cookie_t cookie; | 791 | dma_cookie_t cookie; |
| 799 | struct dma_async_tx_descriptor *tx; | 792 | struct dma_async_tx_descriptor *tx; |
| 793 | struct dmaengine_unmap_data *unmap; | ||
| 800 | int err = 0; | 794 | int err = 0; |
| 801 | 795 | ||
| 802 | src = kmalloc(sizeof(u8) * MV_XOR_TEST_SIZE, GFP_KERNEL); | 796 | src = kmalloc(sizeof(u8) * PAGE_SIZE, GFP_KERNEL); |
| 803 | if (!src) | 797 | if (!src) |
| 804 | return -ENOMEM; | 798 | return -ENOMEM; |
| 805 | 799 | ||
| 806 | dest = kzalloc(sizeof(u8) * MV_XOR_TEST_SIZE, GFP_KERNEL); | 800 | dest = kzalloc(sizeof(u8) * PAGE_SIZE, GFP_KERNEL); |
| 807 | if (!dest) { | 801 | if (!dest) { |
| 808 | kfree(src); | 802 | kfree(src); |
| 809 | return -ENOMEM; | 803 | return -ENOMEM; |
| 810 | } | 804 | } |
| 811 | 805 | ||
| 812 | /* Fill in src buffer */ | 806 | /* Fill in src buffer */ |
| 813 | for (i = 0; i < MV_XOR_TEST_SIZE; i++) | 807 | for (i = 0; i < PAGE_SIZE; i++) |
| 814 | ((u8 *) src)[i] = (u8)i; | 808 | ((u8 *) src)[i] = (u8)i; |
| 815 | 809 | ||
| 816 | dma_chan = &mv_chan->dmachan; | 810 | dma_chan = &mv_chan->dmachan; |
| @@ -819,14 +813,26 @@ static int mv_xor_memcpy_self_test(struct mv_xor_chan *mv_chan) | |||
| 819 | goto out; | 813 | goto out; |
| 820 | } | 814 | } |
| 821 | 815 | ||
| 822 | dest_dma = dma_map_single(dma_chan->device->dev, dest, | 816 | unmap = dmaengine_get_unmap_data(dma_chan->device->dev, 2, GFP_KERNEL); |
| 823 | MV_XOR_TEST_SIZE, DMA_FROM_DEVICE); | 817 | if (!unmap) { |
| 818 | err = -ENOMEM; | ||
| 819 | goto free_resources; | ||
| 820 | } | ||
| 821 | |||
| 822 | src_dma = dma_map_page(dma_chan->device->dev, virt_to_page(src), 0, | ||
| 823 | PAGE_SIZE, DMA_TO_DEVICE); | ||
| 824 | unmap->to_cnt = 1; | ||
| 825 | unmap->addr[0] = src_dma; | ||
| 824 | 826 | ||
| 825 | src_dma = dma_map_single(dma_chan->device->dev, src, | 827 | dest_dma = dma_map_page(dma_chan->device->dev, virt_to_page(dest), 0, |
| 826 | MV_XOR_TEST_SIZE, DMA_TO_DEVICE); | 828 | PAGE_SIZE, DMA_FROM_DEVICE); |
| 829 | unmap->from_cnt = 1; | ||
| 830 | unmap->addr[1] = dest_dma; | ||
| 831 | |||
| 832 | unmap->len = PAGE_SIZE; | ||
| 827 | 833 | ||
| 828 | tx = mv_xor_prep_dma_memcpy(dma_chan, dest_dma, src_dma, | 834 | tx = mv_xor_prep_dma_memcpy(dma_chan, dest_dma, src_dma, |
| 829 | MV_XOR_TEST_SIZE, 0); | 835 | PAGE_SIZE, 0); |
| 830 | cookie = mv_xor_tx_submit(tx); | 836 | cookie = mv_xor_tx_submit(tx); |
| 831 | mv_xor_issue_pending(dma_chan); | 837 | mv_xor_issue_pending(dma_chan); |
| 832 | async_tx_ack(tx); | 838 | async_tx_ack(tx); |
| @@ -841,8 +847,8 @@ static int mv_xor_memcpy_self_test(struct mv_xor_chan *mv_chan) | |||
| 841 | } | 847 | } |
| 842 | 848 | ||
| 843 | dma_sync_single_for_cpu(dma_chan->device->dev, dest_dma, | 849 | dma_sync_single_for_cpu(dma_chan->device->dev, dest_dma, |
| 844 | MV_XOR_TEST_SIZE, DMA_FROM_DEVICE); | 850 | PAGE_SIZE, DMA_FROM_DEVICE); |
| 845 | if (memcmp(src, dest, MV_XOR_TEST_SIZE)) { | 851 | if (memcmp(src, dest, PAGE_SIZE)) { |
| 846 | dev_err(dma_chan->device->dev, | 852 | dev_err(dma_chan->device->dev, |
| 847 | "Self-test copy failed compare, disabling\n"); | 853 | "Self-test copy failed compare, disabling\n"); |
| 848 | err = -ENODEV; | 854 | err = -ENODEV; |
| @@ -850,6 +856,7 @@ static int mv_xor_memcpy_self_test(struct mv_xor_chan *mv_chan) | |||
| 850 | } | 856 | } |
| 851 | 857 | ||
| 852 | free_resources: | 858 | free_resources: |
| 859 | dmaengine_unmap_put(unmap); | ||
| 853 | mv_xor_free_chan_resources(dma_chan); | 860 | mv_xor_free_chan_resources(dma_chan); |
| 854 | out: | 861 | out: |
| 855 | kfree(src); | 862 | kfree(src); |
| @@ -867,13 +874,15 @@ mv_xor_xor_self_test(struct mv_xor_chan *mv_chan) | |||
| 867 | dma_addr_t dma_srcs[MV_XOR_NUM_SRC_TEST]; | 874 | dma_addr_t dma_srcs[MV_XOR_NUM_SRC_TEST]; |
| 868 | dma_addr_t dest_dma; | 875 | dma_addr_t dest_dma; |
| 869 | struct dma_async_tx_descriptor *tx; | 876 | struct dma_async_tx_descriptor *tx; |
| 877 | struct dmaengine_unmap_data *unmap; | ||
| 870 | struct dma_chan *dma_chan; | 878 | struct dma_chan *dma_chan; |
| 871 | dma_cookie_t cookie; | 879 | dma_cookie_t cookie; |
| 872 | u8 cmp_byte = 0; | 880 | u8 cmp_byte = 0; |
| 873 | u32 cmp_word; | 881 | u32 cmp_word; |
| 874 | int err = 0; | 882 | int err = 0; |
| 883 | int src_count = MV_XOR_NUM_SRC_TEST; | ||
| 875 | 884 | ||
| 876 | for (src_idx = 0; src_idx < MV_XOR_NUM_SRC_TEST; src_idx++) { | 885 | for (src_idx = 0; src_idx < src_count; src_idx++) { |
| 877 | xor_srcs[src_idx] = alloc_page(GFP_KERNEL); | 886 | xor_srcs[src_idx] = alloc_page(GFP_KERNEL); |
| 878 | if (!xor_srcs[src_idx]) { | 887 | if (!xor_srcs[src_idx]) { |
| 879 | while (src_idx--) | 888 | while (src_idx--) |
| @@ -890,13 +899,13 @@ mv_xor_xor_self_test(struct mv_xor_chan *mv_chan) | |||
| 890 | } | 899 | } |
| 891 | 900 | ||
| 892 | /* Fill in src buffers */ | 901 | /* Fill in src buffers */ |
| 893 | for (src_idx = 0; src_idx < MV_XOR_NUM_SRC_TEST; src_idx++) { | 902 | for (src_idx = 0; src_idx < src_count; src_idx++) { |
| 894 | u8 *ptr = page_address(xor_srcs[src_idx]); | 903 | u8 *ptr = page_address(xor_srcs[src_idx]); |
| 895 | for (i = 0; i < PAGE_SIZE; i++) | 904 | for (i = 0; i < PAGE_SIZE; i++) |
| 896 | ptr[i] = (1 << src_idx); | 905 | ptr[i] = (1 << src_idx); |
| 897 | } | 906 | } |
| 898 | 907 | ||
| 899 | for (src_idx = 0; src_idx < MV_XOR_NUM_SRC_TEST; src_idx++) | 908 | for (src_idx = 0; src_idx < src_count; src_idx++) |
| 900 | cmp_byte ^= (u8) (1 << src_idx); | 909 | cmp_byte ^= (u8) (1 << src_idx); |
| 901 | 910 | ||
| 902 | cmp_word = (cmp_byte << 24) | (cmp_byte << 16) | | 911 | cmp_word = (cmp_byte << 24) | (cmp_byte << 16) | |
| @@ -910,16 +919,29 @@ mv_xor_xor_self_test(struct mv_xor_chan *mv_chan) | |||
| 910 | goto out; | 919 | goto out; |
| 911 | } | 920 | } |
| 912 | 921 | ||
| 922 | unmap = dmaengine_get_unmap_data(dma_chan->device->dev, src_count + 1, | ||
| 923 | GFP_KERNEL); | ||
| 924 | if (!unmap) { | ||
| 925 | err = -ENOMEM; | ||
| 926 | goto free_resources; | ||
| 927 | } | ||
| 928 | |||
| 913 | /* test xor */ | 929 | /* test xor */ |
| 914 | dest_dma = dma_map_page(dma_chan->device->dev, dest, 0, PAGE_SIZE, | 930 | for (i = 0; i < src_count; i++) { |
| 915 | DMA_FROM_DEVICE); | 931 | unmap->addr[i] = dma_map_page(dma_chan->device->dev, xor_srcs[i], |
| 932 | 0, PAGE_SIZE, DMA_TO_DEVICE); | ||
| 933 | dma_srcs[i] = unmap->addr[i]; | ||
| 934 | unmap->to_cnt++; | ||
| 935 | } | ||
| 916 | 936 | ||
| 917 | for (i = 0; i < MV_XOR_NUM_SRC_TEST; i++) | 937 | unmap->addr[src_count] = dma_map_page(dma_chan->device->dev, dest, 0, PAGE_SIZE, |
| 918 | dma_srcs[i] = dma_map_page(dma_chan->device->dev, xor_srcs[i], | 938 | DMA_FROM_DEVICE); |
| 919 | 0, PAGE_SIZE, DMA_TO_DEVICE); | 939 | dest_dma = unmap->addr[src_count]; |
| 940 | unmap->from_cnt = 1; | ||
| 941 | unmap->len = PAGE_SIZE; | ||
| 920 | 942 | ||
| 921 | tx = mv_xor_prep_dma_xor(dma_chan, dest_dma, dma_srcs, | 943 | tx = mv_xor_prep_dma_xor(dma_chan, dest_dma, dma_srcs, |
| 922 | MV_XOR_NUM_SRC_TEST, PAGE_SIZE, 0); | 944 | src_count, PAGE_SIZE, 0); |
| 923 | 945 | ||
| 924 | cookie = mv_xor_tx_submit(tx); | 946 | cookie = mv_xor_tx_submit(tx); |
| 925 | mv_xor_issue_pending(dma_chan); | 947 | mv_xor_issue_pending(dma_chan); |
| @@ -948,9 +970,10 @@ mv_xor_xor_self_test(struct mv_xor_chan *mv_chan) | |||
| 948 | } | 970 | } |
| 949 | 971 | ||
| 950 | free_resources: | 972 | free_resources: |
| 973 | dmaengine_unmap_put(unmap); | ||
| 951 | mv_xor_free_chan_resources(dma_chan); | 974 | mv_xor_free_chan_resources(dma_chan); |
| 952 | out: | 975 | out: |
| 953 | src_idx = MV_XOR_NUM_SRC_TEST; | 976 | src_idx = src_count; |
| 954 | while (src_idx--) | 977 | while (src_idx--) |
| 955 | __free_page(xor_srcs[src_idx]); | 978 | __free_page(xor_srcs[src_idx]); |
| 956 | __free_page(dest); | 979 | __free_page(dest); |
| @@ -1176,6 +1199,7 @@ static int mv_xor_probe(struct platform_device *pdev) | |||
| 1176 | int i = 0; | 1199 | int i = 0; |
| 1177 | 1200 | ||
| 1178 | for_each_child_of_node(pdev->dev.of_node, np) { | 1201 | for_each_child_of_node(pdev->dev.of_node, np) { |
| 1202 | struct mv_xor_chan *chan; | ||
| 1179 | dma_cap_mask_t cap_mask; | 1203 | dma_cap_mask_t cap_mask; |
| 1180 | int irq; | 1204 | int irq; |
| 1181 | 1205 | ||
| @@ -1193,21 +1217,21 @@ static int mv_xor_probe(struct platform_device *pdev) | |||
| 1193 | goto err_channel_add; | 1217 | goto err_channel_add; |
| 1194 | } | 1218 | } |
| 1195 | 1219 | ||
| 1196 | xordev->channels[i] = | 1220 | chan = mv_xor_channel_add(xordev, pdev, i, |
| 1197 | mv_xor_channel_add(xordev, pdev, i, | 1221 | cap_mask, irq); |
| 1198 | cap_mask, irq); | 1222 | if (IS_ERR(chan)) { |
| 1199 | if (IS_ERR(xordev->channels[i])) { | 1223 | ret = PTR_ERR(chan); |
| 1200 | ret = PTR_ERR(xordev->channels[i]); | ||
| 1201 | xordev->channels[i] = NULL; | ||
| 1202 | irq_dispose_mapping(irq); | 1224 | irq_dispose_mapping(irq); |
| 1203 | goto err_channel_add; | 1225 | goto err_channel_add; |
| 1204 | } | 1226 | } |
| 1205 | 1227 | ||
| 1228 | xordev->channels[i] = chan; | ||
| 1206 | i++; | 1229 | i++; |
| 1207 | } | 1230 | } |
| 1208 | } else if (pdata && pdata->channels) { | 1231 | } else if (pdata && pdata->channels) { |
| 1209 | for (i = 0; i < MV_XOR_MAX_CHANNELS; i++) { | 1232 | for (i = 0; i < MV_XOR_MAX_CHANNELS; i++) { |
| 1210 | struct mv_xor_channel_data *cd; | 1233 | struct mv_xor_channel_data *cd; |
| 1234 | struct mv_xor_chan *chan; | ||
| 1211 | int irq; | 1235 | int irq; |
| 1212 | 1236 | ||
| 1213 | cd = &pdata->channels[i]; | 1237 | cd = &pdata->channels[i]; |
| @@ -1222,13 +1246,14 @@ static int mv_xor_probe(struct platform_device *pdev) | |||
| 1222 | goto err_channel_add; | 1246 | goto err_channel_add; |
| 1223 | } | 1247 | } |
| 1224 | 1248 | ||
| 1225 | xordev->channels[i] = | 1249 | chan = mv_xor_channel_add(xordev, pdev, i, |
| 1226 | mv_xor_channel_add(xordev, pdev, i, | 1250 | cd->cap_mask, irq); |
| 1227 | cd->cap_mask, irq); | 1251 | if (IS_ERR(chan)) { |
| 1228 | if (IS_ERR(xordev->channels[i])) { | 1252 | ret = PTR_ERR(chan); |
| 1229 | ret = PTR_ERR(xordev->channels[i]); | ||
| 1230 | goto err_channel_add; | 1253 | goto err_channel_add; |
| 1231 | } | 1254 | } |
| 1255 | |||
| 1256 | xordev->channels[i] = chan; | ||
| 1232 | } | 1257 | } |
| 1233 | } | 1258 | } |
| 1234 | 1259 | ||
diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c index cdf0483b8f2d..536632f6479c 100644 --- a/drivers/dma/pl330.c +++ b/drivers/dma/pl330.c | |||
| @@ -2492,12 +2492,9 @@ static dma_cookie_t pl330_tx_submit(struct dma_async_tx_descriptor *tx) | |||
| 2492 | 2492 | ||
| 2493 | static inline void _init_desc(struct dma_pl330_desc *desc) | 2493 | static inline void _init_desc(struct dma_pl330_desc *desc) |
| 2494 | { | 2494 | { |
| 2495 | desc->pchan = NULL; | ||
| 2496 | desc->req.x = &desc->px; | 2495 | desc->req.x = &desc->px; |
| 2497 | desc->req.token = desc; | 2496 | desc->req.token = desc; |
| 2498 | desc->rqcfg.swap = SWAP_NO; | 2497 | desc->rqcfg.swap = SWAP_NO; |
| 2499 | desc->rqcfg.privileged = 0; | ||
| 2500 | desc->rqcfg.insnaccess = 0; | ||
| 2501 | desc->rqcfg.scctl = SCCTRL0; | 2498 | desc->rqcfg.scctl = SCCTRL0; |
| 2502 | desc->rqcfg.dcctl = DCCTRL0; | 2499 | desc->rqcfg.dcctl = DCCTRL0; |
| 2503 | desc->req.cfg = &desc->rqcfg; | 2500 | desc->req.cfg = &desc->rqcfg; |
| @@ -2517,7 +2514,7 @@ static int add_desc(struct dma_pl330_dmac *pdmac, gfp_t flg, int count) | |||
| 2517 | if (!pdmac) | 2514 | if (!pdmac) |
| 2518 | return 0; | 2515 | return 0; |
| 2519 | 2516 | ||
| 2520 | desc = kmalloc(count * sizeof(*desc), flg); | 2517 | desc = kcalloc(count, sizeof(*desc), flg); |
| 2521 | if (!desc) | 2518 | if (!desc) |
| 2522 | return 0; | 2519 | return 0; |
| 2523 | 2520 | ||
diff --git a/drivers/dma/ppc4xx/adma.c b/drivers/dma/ppc4xx/adma.c index 8da48c6b2a38..8bba298535b0 100644 --- a/drivers/dma/ppc4xx/adma.c +++ b/drivers/dma/ppc4xx/adma.c | |||
| @@ -533,29 +533,6 @@ static void ppc440spe_desc_init_memcpy(struct ppc440spe_adma_desc_slot *desc, | |||
| 533 | } | 533 | } |
| 534 | 534 | ||
| 535 | /** | 535 | /** |
| 536 | * ppc440spe_desc_init_memset - initialize the descriptor for MEMSET operation | ||
| 537 | */ | ||
| 538 | static void ppc440spe_desc_init_memset(struct ppc440spe_adma_desc_slot *desc, | ||
| 539 | int value, unsigned long flags) | ||
| 540 | { | ||
| 541 | struct dma_cdb *hw_desc = desc->hw_desc; | ||
| 542 | |||
| 543 | memset(desc->hw_desc, 0, sizeof(struct dma_cdb)); | ||
| 544 | desc->hw_next = NULL; | ||
| 545 | desc->src_cnt = 1; | ||
| 546 | desc->dst_cnt = 1; | ||
| 547 | |||
| 548 | if (flags & DMA_PREP_INTERRUPT) | ||
| 549 | set_bit(PPC440SPE_DESC_INT, &desc->flags); | ||
| 550 | else | ||
| 551 | clear_bit(PPC440SPE_DESC_INT, &desc->flags); | ||
| 552 | |||
| 553 | hw_desc->sg1u = hw_desc->sg1l = cpu_to_le32((u32)value); | ||
| 554 | hw_desc->sg3u = hw_desc->sg3l = cpu_to_le32((u32)value); | ||
| 555 | hw_desc->opc = DMA_CDB_OPC_DFILL128; | ||
| 556 | } | ||
| 557 | |||
| 558 | /** | ||
| 559 | * ppc440spe_desc_set_src_addr - set source address into the descriptor | 536 | * ppc440spe_desc_set_src_addr - set source address into the descriptor |
| 560 | */ | 537 | */ |
| 561 | static void ppc440spe_desc_set_src_addr(struct ppc440spe_adma_desc_slot *desc, | 538 | static void ppc440spe_desc_set_src_addr(struct ppc440spe_adma_desc_slot *desc, |
| @@ -1504,8 +1481,6 @@ static dma_cookie_t ppc440spe_adma_run_tx_complete_actions( | |||
| 1504 | struct ppc440spe_adma_chan *chan, | 1481 | struct ppc440spe_adma_chan *chan, |
| 1505 | dma_cookie_t cookie) | 1482 | dma_cookie_t cookie) |
| 1506 | { | 1483 | { |
| 1507 | int i; | ||
| 1508 | |||
| 1509 | BUG_ON(desc->async_tx.cookie < 0); | 1484 | BUG_ON(desc->async_tx.cookie < 0); |
| 1510 | if (desc->async_tx.cookie > 0) { | 1485 | if (desc->async_tx.cookie > 0) { |
| 1511 | cookie = desc->async_tx.cookie; | 1486 | cookie = desc->async_tx.cookie; |
| @@ -3898,7 +3873,7 @@ static void ppc440spe_adma_init_capabilities(struct ppc440spe_adma_device *adev) | |||
| 3898 | ppc440spe_adma_prep_dma_interrupt; | 3873 | ppc440spe_adma_prep_dma_interrupt; |
| 3899 | } | 3874 | } |
| 3900 | pr_info("%s: AMCC(R) PPC440SP(E) ADMA Engine: " | 3875 | pr_info("%s: AMCC(R) PPC440SP(E) ADMA Engine: " |
| 3901 | "( %s%s%s%s%s%s%s)\n", | 3876 | "( %s%s%s%s%s%s)\n", |
| 3902 | dev_name(adev->dev), | 3877 | dev_name(adev->dev), |
| 3903 | dma_has_cap(DMA_PQ, adev->common.cap_mask) ? "pq " : "", | 3878 | dma_has_cap(DMA_PQ, adev->common.cap_mask) ? "pq " : "", |
| 3904 | dma_has_cap(DMA_PQ_VAL, adev->common.cap_mask) ? "pq_val " : "", | 3879 | dma_has_cap(DMA_PQ_VAL, adev->common.cap_mask) ? "pq_val " : "", |
diff --git a/drivers/dma/txx9dmac.c b/drivers/dma/txx9dmac.c index bae6c29f5502..17686caf64d5 100644 --- a/drivers/dma/txx9dmac.c +++ b/drivers/dma/txx9dmac.c | |||
| @@ -406,7 +406,6 @@ txx9dmac_descriptor_complete(struct txx9dmac_chan *dc, | |||
| 406 | dma_async_tx_callback callback; | 406 | dma_async_tx_callback callback; |
| 407 | void *param; | 407 | void *param; |
| 408 | struct dma_async_tx_descriptor *txd = &desc->txd; | 408 | struct dma_async_tx_descriptor *txd = &desc->txd; |
| 409 | struct txx9dmac_slave *ds = dc->chan.private; | ||
| 410 | 409 | ||
| 411 | dev_vdbg(chan2dev(&dc->chan), "descriptor %u %p complete\n", | 410 | dev_vdbg(chan2dev(&dc->chan), "descriptor %u %p complete\n", |
| 412 | txd->cookie, desc); | 411 | txd->cookie, desc); |
diff --git a/drivers/firewire/sbp2.c b/drivers/firewire/sbp2.c index b0bb056458a3..281029daf98c 100644 --- a/drivers/firewire/sbp2.c +++ b/drivers/firewire/sbp2.c | |||
| @@ -1623,7 +1623,6 @@ static struct scsi_host_template scsi_driver_template = { | |||
| 1623 | .cmd_per_lun = 1, | 1623 | .cmd_per_lun = 1, |
| 1624 | .can_queue = 1, | 1624 | .can_queue = 1, |
| 1625 | .sdev_attrs = sbp2_scsi_sysfs_attrs, | 1625 | .sdev_attrs = sbp2_scsi_sysfs_attrs, |
| 1626 | .no_write_same = 1, | ||
| 1627 | }; | 1626 | }; |
| 1628 | 1627 | ||
| 1629 | MODULE_AUTHOR("Kristian Hoegsberg <krh@bitplanet.net>"); | 1628 | MODULE_AUTHOR("Kristian Hoegsberg <krh@bitplanet.net>"); |
diff --git a/drivers/firmware/efi/efi-pstore.c b/drivers/firmware/efi/efi-pstore.c index 743fd426f21b..4b9dc836dcf9 100644 --- a/drivers/firmware/efi/efi-pstore.c +++ b/drivers/firmware/efi/efi-pstore.c | |||
| @@ -356,6 +356,7 @@ static int efi_pstore_erase(enum pstore_type_id type, u64 id, int count, | |||
| 356 | static struct pstore_info efi_pstore_info = { | 356 | static struct pstore_info efi_pstore_info = { |
| 357 | .owner = THIS_MODULE, | 357 | .owner = THIS_MODULE, |
| 358 | .name = "efi", | 358 | .name = "efi", |
| 359 | .flags = PSTORE_FLAGS_FRAGILE, | ||
| 359 | .open = efi_pstore_open, | 360 | .open = efi_pstore_open, |
| 360 | .close = efi_pstore_close, | 361 | .close = efi_pstore_close, |
| 361 | .read = efi_pstore_read, | 362 | .read = efi_pstore_read, |
diff --git a/drivers/gpio/gpio-msm-v2.c b/drivers/gpio/gpio-msm-v2.c index 7b37300973db..2baf0ddf7e02 100644 --- a/drivers/gpio/gpio-msm-v2.c +++ b/drivers/gpio/gpio-msm-v2.c | |||
| @@ -252,7 +252,7 @@ static void msm_gpio_irq_mask(struct irq_data *d) | |||
| 252 | 252 | ||
| 253 | spin_lock_irqsave(&tlmm_lock, irq_flags); | 253 | spin_lock_irqsave(&tlmm_lock, irq_flags); |
| 254 | writel(TARGET_PROC_NONE, GPIO_INTR_CFG_SU(gpio)); | 254 | writel(TARGET_PROC_NONE, GPIO_INTR_CFG_SU(gpio)); |
| 255 | clear_gpio_bits(INTR_RAW_STATUS_EN | INTR_ENABLE, GPIO_INTR_CFG(gpio)); | 255 | clear_gpio_bits(BIT(INTR_RAW_STATUS_EN) | BIT(INTR_ENABLE), GPIO_INTR_CFG(gpio)); |
| 256 | __clear_bit(gpio, msm_gpio.enabled_irqs); | 256 | __clear_bit(gpio, msm_gpio.enabled_irqs); |
| 257 | spin_unlock_irqrestore(&tlmm_lock, irq_flags); | 257 | spin_unlock_irqrestore(&tlmm_lock, irq_flags); |
| 258 | } | 258 | } |
| @@ -264,7 +264,7 @@ static void msm_gpio_irq_unmask(struct irq_data *d) | |||
| 264 | 264 | ||
| 265 | spin_lock_irqsave(&tlmm_lock, irq_flags); | 265 | spin_lock_irqsave(&tlmm_lock, irq_flags); |
| 266 | __set_bit(gpio, msm_gpio.enabled_irqs); | 266 | __set_bit(gpio, msm_gpio.enabled_irqs); |
| 267 | set_gpio_bits(INTR_RAW_STATUS_EN | INTR_ENABLE, GPIO_INTR_CFG(gpio)); | 267 | set_gpio_bits(BIT(INTR_RAW_STATUS_EN) | BIT(INTR_ENABLE), GPIO_INTR_CFG(gpio)); |
| 268 | writel(TARGET_PROC_SCORPION, GPIO_INTR_CFG_SU(gpio)); | 268 | writel(TARGET_PROC_SCORPION, GPIO_INTR_CFG_SU(gpio)); |
| 269 | spin_unlock_irqrestore(&tlmm_lock, irq_flags); | 269 | spin_unlock_irqrestore(&tlmm_lock, irq_flags); |
| 270 | } | 270 | } |
diff --git a/drivers/gpio/gpio-rcar.c b/drivers/gpio/gpio-rcar.c index fe088a30567a..8b7e719a68c3 100644 --- a/drivers/gpio/gpio-rcar.c +++ b/drivers/gpio/gpio-rcar.c | |||
| @@ -169,7 +169,8 @@ static irqreturn_t gpio_rcar_irq_handler(int irq, void *dev_id) | |||
| 169 | u32 pending; | 169 | u32 pending; |
| 170 | unsigned int offset, irqs_handled = 0; | 170 | unsigned int offset, irqs_handled = 0; |
| 171 | 171 | ||
| 172 | while ((pending = gpio_rcar_read(p, INTDT))) { | 172 | while ((pending = gpio_rcar_read(p, INTDT) & |
| 173 | gpio_rcar_read(p, INTMSK))) { | ||
| 173 | offset = __ffs(pending); | 174 | offset = __ffs(pending); |
| 174 | gpio_rcar_write(p, INTCLR, BIT(offset)); | 175 | gpio_rcar_write(p, INTCLR, BIT(offset)); |
| 175 | generic_handle_irq(irq_find_mapping(p->irq_domain, offset)); | 176 | generic_handle_irq(irq_find_mapping(p->irq_domain, offset)); |
diff --git a/drivers/gpio/gpio-twl4030.c b/drivers/gpio/gpio-twl4030.c index b97d6a6577b9..f9996899c1f2 100644 --- a/drivers/gpio/gpio-twl4030.c +++ b/drivers/gpio/gpio-twl4030.c | |||
| @@ -300,7 +300,7 @@ static int twl_direction_in(struct gpio_chip *chip, unsigned offset) | |||
| 300 | if (offset < TWL4030_GPIO_MAX) | 300 | if (offset < TWL4030_GPIO_MAX) |
| 301 | ret = twl4030_set_gpio_direction(offset, 1); | 301 | ret = twl4030_set_gpio_direction(offset, 1); |
| 302 | else | 302 | else |
| 303 | ret = -EINVAL; | 303 | ret = -EINVAL; /* LED outputs can't be set as input */ |
| 304 | 304 | ||
| 305 | if (!ret) | 305 | if (!ret) |
| 306 | priv->direction &= ~BIT(offset); | 306 | priv->direction &= ~BIT(offset); |
| @@ -354,11 +354,20 @@ static void twl_set(struct gpio_chip *chip, unsigned offset, int value) | |||
| 354 | static int twl_direction_out(struct gpio_chip *chip, unsigned offset, int value) | 354 | static int twl_direction_out(struct gpio_chip *chip, unsigned offset, int value) |
| 355 | { | 355 | { |
| 356 | struct gpio_twl4030_priv *priv = to_gpio_twl4030(chip); | 356 | struct gpio_twl4030_priv *priv = to_gpio_twl4030(chip); |
| 357 | int ret = -EINVAL; | 357 | int ret = 0; |
| 358 | 358 | ||
| 359 | mutex_lock(&priv->mutex); | 359 | mutex_lock(&priv->mutex); |
| 360 | if (offset < TWL4030_GPIO_MAX) | 360 | if (offset < TWL4030_GPIO_MAX) { |
| 361 | ret = twl4030_set_gpio_direction(offset, 0); | 361 | ret = twl4030_set_gpio_direction(offset, 0); |
| 362 | if (ret) { | ||
| 363 | mutex_unlock(&priv->mutex); | ||
| 364 | return ret; | ||
| 365 | } | ||
| 366 | } | ||
| 367 | |||
| 368 | /* | ||
| 369 | * LED gpios i.e. offset >= TWL4030_GPIO_MAX are always output | ||
| 370 | */ | ||
| 362 | 371 | ||
| 363 | priv->direction |= BIT(offset); | 372 | priv->direction |= BIT(offset); |
| 364 | mutex_unlock(&priv->mutex); | 373 | mutex_unlock(&priv->mutex); |
diff --git a/drivers/gpu/drm/armada/armada_drm.h b/drivers/gpu/drm/armada/armada_drm.h index eef09ec9a5ff..a72cae03b99b 100644 --- a/drivers/gpu/drm/armada/armada_drm.h +++ b/drivers/gpu/drm/armada/armada_drm.h | |||
| @@ -103,6 +103,7 @@ void armada_drm_queue_unref_work(struct drm_device *, | |||
| 103 | extern const struct drm_mode_config_funcs armada_drm_mode_config_funcs; | 103 | extern const struct drm_mode_config_funcs armada_drm_mode_config_funcs; |
| 104 | 104 | ||
| 105 | int armada_fbdev_init(struct drm_device *); | 105 | int armada_fbdev_init(struct drm_device *); |
| 106 | void armada_fbdev_lastclose(struct drm_device *); | ||
| 106 | void armada_fbdev_fini(struct drm_device *); | 107 | void armada_fbdev_fini(struct drm_device *); |
| 107 | 108 | ||
| 108 | int armada_overlay_plane_create(struct drm_device *, unsigned long); | 109 | int armada_overlay_plane_create(struct drm_device *, unsigned long); |
diff --git a/drivers/gpu/drm/armada/armada_drv.c b/drivers/gpu/drm/armada/armada_drv.c index 4f2b28354915..62d0ff3efddf 100644 --- a/drivers/gpu/drm/armada/armada_drv.c +++ b/drivers/gpu/drm/armada/armada_drv.c | |||
| @@ -321,6 +321,11 @@ static struct drm_ioctl_desc armada_ioctls[] = { | |||
| 321 | DRM_UNLOCKED), | 321 | DRM_UNLOCKED), |
| 322 | }; | 322 | }; |
| 323 | 323 | ||
| 324 | static void armada_drm_lastclose(struct drm_device *dev) | ||
| 325 | { | ||
| 326 | armada_fbdev_lastclose(dev); | ||
| 327 | } | ||
| 328 | |||
| 324 | static const struct file_operations armada_drm_fops = { | 329 | static const struct file_operations armada_drm_fops = { |
| 325 | .owner = THIS_MODULE, | 330 | .owner = THIS_MODULE, |
| 326 | .llseek = no_llseek, | 331 | .llseek = no_llseek, |
| @@ -337,7 +342,7 @@ static struct drm_driver armada_drm_driver = { | |||
| 337 | .open = NULL, | 342 | .open = NULL, |
| 338 | .preclose = NULL, | 343 | .preclose = NULL, |
| 339 | .postclose = NULL, | 344 | .postclose = NULL, |
| 340 | .lastclose = NULL, | 345 | .lastclose = armada_drm_lastclose, |
| 341 | .unload = armada_drm_unload, | 346 | .unload = armada_drm_unload, |
| 342 | .get_vblank_counter = drm_vblank_count, | 347 | .get_vblank_counter = drm_vblank_count, |
| 343 | .enable_vblank = armada_drm_enable_vblank, | 348 | .enable_vblank = armada_drm_enable_vblank, |
diff --git a/drivers/gpu/drm/armada/armada_fbdev.c b/drivers/gpu/drm/armada/armada_fbdev.c index dd5ea77dac96..948cb14c561e 100644 --- a/drivers/gpu/drm/armada/armada_fbdev.c +++ b/drivers/gpu/drm/armada/armada_fbdev.c | |||
| @@ -105,9 +105,9 @@ static int armada_fb_create(struct drm_fb_helper *fbh, | |||
| 105 | drm_fb_helper_fill_fix(info, dfb->fb.pitches[0], dfb->fb.depth); | 105 | drm_fb_helper_fill_fix(info, dfb->fb.pitches[0], dfb->fb.depth); |
| 106 | drm_fb_helper_fill_var(info, fbh, sizes->fb_width, sizes->fb_height); | 106 | drm_fb_helper_fill_var(info, fbh, sizes->fb_width, sizes->fb_height); |
| 107 | 107 | ||
| 108 | DRM_DEBUG_KMS("allocated %dx%d %dbpp fb: 0x%08x\n", | 108 | DRM_DEBUG_KMS("allocated %dx%d %dbpp fb: 0x%08llx\n", |
| 109 | dfb->fb.width, dfb->fb.height, | 109 | dfb->fb.width, dfb->fb.height, dfb->fb.bits_per_pixel, |
| 110 | dfb->fb.bits_per_pixel, obj->phys_addr); | 110 | (unsigned long long)obj->phys_addr); |
| 111 | 111 | ||
| 112 | return 0; | 112 | return 0; |
| 113 | 113 | ||
| @@ -177,6 +177,16 @@ int armada_fbdev_init(struct drm_device *dev) | |||
| 177 | return ret; | 177 | return ret; |
| 178 | } | 178 | } |
| 179 | 179 | ||
| 180 | void armada_fbdev_lastclose(struct drm_device *dev) | ||
| 181 | { | ||
| 182 | struct armada_private *priv = dev->dev_private; | ||
| 183 | |||
| 184 | drm_modeset_lock_all(dev); | ||
| 185 | if (priv->fbdev) | ||
| 186 | drm_fb_helper_restore_fbdev_mode(priv->fbdev); | ||
| 187 | drm_modeset_unlock_all(dev); | ||
| 188 | } | ||
| 189 | |||
| 180 | void armada_fbdev_fini(struct drm_device *dev) | 190 | void armada_fbdev_fini(struct drm_device *dev) |
| 181 | { | 191 | { |
| 182 | struct armada_private *priv = dev->dev_private; | 192 | struct armada_private *priv = dev->dev_private; |
| @@ -192,11 +202,11 @@ void armada_fbdev_fini(struct drm_device *dev) | |||
| 192 | framebuffer_release(info); | 202 | framebuffer_release(info); |
| 193 | } | 203 | } |
| 194 | 204 | ||
| 205 | drm_fb_helper_fini(fbh); | ||
| 206 | |||
| 195 | if (fbh->fb) | 207 | if (fbh->fb) |
| 196 | fbh->fb->funcs->destroy(fbh->fb); | 208 | fbh->fb->funcs->destroy(fbh->fb); |
| 197 | 209 | ||
| 198 | drm_fb_helper_fini(fbh); | ||
| 199 | |||
| 200 | priv->fbdev = NULL; | 210 | priv->fbdev = NULL; |
| 201 | } | 211 | } |
| 202 | } | 212 | } |
diff --git a/drivers/gpu/drm/armada/armada_gem.c b/drivers/gpu/drm/armada/armada_gem.c index 9f2356bae7fd..887816f43476 100644 --- a/drivers/gpu/drm/armada/armada_gem.c +++ b/drivers/gpu/drm/armada/armada_gem.c | |||
| @@ -172,8 +172,9 @@ armada_gem_linear_back(struct drm_device *dev, struct armada_gem_object *obj) | |||
| 172 | obj->dev_addr = obj->linear->start; | 172 | obj->dev_addr = obj->linear->start; |
| 173 | } | 173 | } |
| 174 | 174 | ||
| 175 | DRM_DEBUG_DRIVER("obj %p phys %#x dev %#x\n", | 175 | DRM_DEBUG_DRIVER("obj %p phys %#llx dev %#llx\n", obj, |
| 176 | obj, obj->phys_addr, obj->dev_addr); | 176 | (unsigned long long)obj->phys_addr, |
| 177 | (unsigned long long)obj->dev_addr); | ||
| 177 | 178 | ||
| 178 | return 0; | 179 | return 0; |
| 179 | } | 180 | } |
| @@ -557,7 +558,6 @@ armada_gem_prime_import(struct drm_device *dev, struct dma_buf *buf) | |||
| 557 | * refcount on the gem object itself. | 558 | * refcount on the gem object itself. |
| 558 | */ | 559 | */ |
| 559 | drm_gem_object_reference(obj); | 560 | drm_gem_object_reference(obj); |
| 560 | dma_buf_put(buf); | ||
| 561 | return obj; | 561 | return obj; |
| 562 | } | 562 | } |
| 563 | } | 563 | } |
| @@ -573,6 +573,7 @@ armada_gem_prime_import(struct drm_device *dev, struct dma_buf *buf) | |||
| 573 | } | 573 | } |
| 574 | 574 | ||
| 575 | dobj->obj.import_attach = attach; | 575 | dobj->obj.import_attach = attach; |
| 576 | get_dma_buf(buf); | ||
| 576 | 577 | ||
| 577 | /* | 578 | /* |
| 578 | * Don't call dma_buf_map_attachment() here - it maps the | 579 | * Don't call dma_buf_map_attachment() here - it maps the |
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 0a1e4a5f4234..8835dcddfac3 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c | |||
| @@ -68,6 +68,8 @@ | |||
| 68 | #define EDID_QUIRK_DETAILED_SYNC_PP (1 << 6) | 68 | #define EDID_QUIRK_DETAILED_SYNC_PP (1 << 6) |
| 69 | /* Force reduced-blanking timings for detailed modes */ | 69 | /* Force reduced-blanking timings for detailed modes */ |
| 70 | #define EDID_QUIRK_FORCE_REDUCED_BLANKING (1 << 7) | 70 | #define EDID_QUIRK_FORCE_REDUCED_BLANKING (1 << 7) |
| 71 | /* Force 8bpc */ | ||
| 72 | #define EDID_QUIRK_FORCE_8BPC (1 << 8) | ||
| 71 | 73 | ||
| 72 | struct detailed_mode_closure { | 74 | struct detailed_mode_closure { |
| 73 | struct drm_connector *connector; | 75 | struct drm_connector *connector; |
| @@ -128,6 +130,9 @@ static struct edid_quirk { | |||
| 128 | 130 | ||
| 129 | /* Medion MD 30217 PG */ | 131 | /* Medion MD 30217 PG */ |
| 130 | { "MED", 0x7b8, EDID_QUIRK_PREFER_LARGE_75 }, | 132 | { "MED", 0x7b8, EDID_QUIRK_PREFER_LARGE_75 }, |
| 133 | |||
| 134 | /* Panel in Samsung NP700G7A-S01PL notebook reports 6bpc */ | ||
| 135 | { "SEC", 0xd033, EDID_QUIRK_FORCE_8BPC }, | ||
| 131 | }; | 136 | }; |
| 132 | 137 | ||
| 133 | /* | 138 | /* |
| @@ -3435,6 +3440,9 @@ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid) | |||
| 3435 | 3440 | ||
| 3436 | drm_add_display_info(edid, &connector->display_info); | 3441 | drm_add_display_info(edid, &connector->display_info); |
| 3437 | 3442 | ||
| 3443 | if (quirks & EDID_QUIRK_FORCE_8BPC) | ||
| 3444 | connector->display_info.bpc = 8; | ||
| 3445 | |||
| 3438 | return num_modes; | 3446 | return num_modes; |
| 3439 | } | 3447 | } |
| 3440 | EXPORT_SYMBOL(drm_add_edid_modes); | 3448 | EXPORT_SYMBOL(drm_add_edid_modes); |
diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c index f53d5246979c..66dd3a001cf1 100644 --- a/drivers/gpu/drm/drm_stub.c +++ b/drivers/gpu/drm/drm_stub.c | |||
| @@ -566,11 +566,11 @@ err_unload: | |||
| 566 | if (dev->driver->unload) | 566 | if (dev->driver->unload) |
| 567 | dev->driver->unload(dev); | 567 | dev->driver->unload(dev); |
| 568 | err_primary_node: | 568 | err_primary_node: |
| 569 | drm_put_minor(dev->primary); | 569 | drm_unplug_minor(dev->primary); |
| 570 | err_render_node: | 570 | err_render_node: |
| 571 | drm_put_minor(dev->render); | 571 | drm_unplug_minor(dev->render); |
| 572 | err_control_node: | 572 | err_control_node: |
| 573 | drm_put_minor(dev->control); | 573 | drm_unplug_minor(dev->control); |
| 574 | err_agp: | 574 | err_agp: |
| 575 | if (dev->driver->bus->agp_destroy) | 575 | if (dev->driver->bus->agp_destroy) |
| 576 | dev->driver->bus->agp_destroy(dev); | 576 | dev->driver->bus->agp_destroy(dev); |
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 0cab2d045135..5c648425c1e0 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
| @@ -83,6 +83,14 @@ void i915_update_dri1_breadcrumb(struct drm_device *dev) | |||
| 83 | drm_i915_private_t *dev_priv = dev->dev_private; | 83 | drm_i915_private_t *dev_priv = dev->dev_private; |
| 84 | struct drm_i915_master_private *master_priv; | 84 | struct drm_i915_master_private *master_priv; |
| 85 | 85 | ||
| 86 | /* | ||
| 87 | * The dri breadcrumb update races against the drm master disappearing. | ||
| 88 | * Instead of trying to fix this (this is by far not the only ums issue) | ||
| 89 | * just don't do the update in kms mode. | ||
| 90 | */ | ||
| 91 | if (drm_core_check_feature(dev, DRIVER_MODESET)) | ||
| 92 | return; | ||
| 93 | |||
| 86 | if (dev->primary->master) { | 94 | if (dev->primary->master) { |
| 87 | master_priv = dev->primary->master->driver_priv; | 95 | master_priv = dev->primary->master->driver_priv; |
| 88 | if (master_priv->sarea_priv) | 96 | if (master_priv->sarea_priv) |
| @@ -1490,16 +1498,9 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
| 1490 | spin_lock_init(&dev_priv->uncore.lock); | 1498 | spin_lock_init(&dev_priv->uncore.lock); |
| 1491 | spin_lock_init(&dev_priv->mm.object_stat_lock); | 1499 | spin_lock_init(&dev_priv->mm.object_stat_lock); |
| 1492 | mutex_init(&dev_priv->dpio_lock); | 1500 | mutex_init(&dev_priv->dpio_lock); |
| 1493 | mutex_init(&dev_priv->rps.hw_lock); | ||
| 1494 | mutex_init(&dev_priv->modeset_restore_lock); | 1501 | mutex_init(&dev_priv->modeset_restore_lock); |
| 1495 | 1502 | ||
| 1496 | mutex_init(&dev_priv->pc8.lock); | 1503 | intel_pm_setup(dev); |
| 1497 | dev_priv->pc8.requirements_met = false; | ||
| 1498 | dev_priv->pc8.gpu_idle = false; | ||
| 1499 | dev_priv->pc8.irqs_disabled = false; | ||
| 1500 | dev_priv->pc8.enabled = false; | ||
| 1501 | dev_priv->pc8.disable_count = 2; /* requirements_met + gpu_idle */ | ||
| 1502 | INIT_DELAYED_WORK(&dev_priv->pc8.enable_work, hsw_enable_pc8_work); | ||
| 1503 | 1504 | ||
| 1504 | intel_display_crc_init(dev); | 1505 | intel_display_crc_init(dev); |
| 1505 | 1506 | ||
| @@ -1603,7 +1604,6 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
| 1603 | } | 1604 | } |
| 1604 | 1605 | ||
| 1605 | intel_irq_init(dev); | 1606 | intel_irq_init(dev); |
| 1606 | intel_pm_init(dev); | ||
| 1607 | intel_uncore_sanitize(dev); | 1607 | intel_uncore_sanitize(dev); |
| 1608 | 1608 | ||
| 1609 | /* Try to make sure MCHBAR is enabled before poking at it */ | 1609 | /* Try to make sure MCHBAR is enabled before poking at it */ |
| @@ -1848,8 +1848,10 @@ void i915_driver_lastclose(struct drm_device * dev) | |||
| 1848 | 1848 | ||
| 1849 | void i915_driver_preclose(struct drm_device * dev, struct drm_file *file_priv) | 1849 | void i915_driver_preclose(struct drm_device * dev, struct drm_file *file_priv) |
| 1850 | { | 1850 | { |
| 1851 | mutex_lock(&dev->struct_mutex); | ||
| 1851 | i915_gem_context_close(dev, file_priv); | 1852 | i915_gem_context_close(dev, file_priv); |
| 1852 | i915_gem_release(dev, file_priv); | 1853 | i915_gem_release(dev, file_priv); |
| 1854 | mutex_unlock(&dev->struct_mutex); | ||
| 1853 | } | 1855 | } |
| 1854 | 1856 | ||
| 1855 | void i915_driver_postclose(struct drm_device *dev, struct drm_file *file) | 1857 | void i915_driver_postclose(struct drm_device *dev, struct drm_file *file) |
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 2e367a1c6a64..5b7b7e06cb3a 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
| @@ -651,6 +651,7 @@ static int __i915_drm_thaw(struct drm_device *dev, bool restore_gtt_mappings) | |||
| 651 | intel_modeset_init_hw(dev); | 651 | intel_modeset_init_hw(dev); |
| 652 | 652 | ||
| 653 | drm_modeset_lock_all(dev); | 653 | drm_modeset_lock_all(dev); |
| 654 | drm_mode_config_reset(dev); | ||
| 654 | intel_modeset_setup_hw_state(dev, true); | 655 | intel_modeset_setup_hw_state(dev, true); |
| 655 | drm_modeset_unlock_all(dev); | 656 | drm_modeset_unlock_all(dev); |
| 656 | 657 | ||
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index ccdbecca070d..90fcccba17b0 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -1755,8 +1755,13 @@ struct drm_i915_file_private { | |||
| 1755 | #define IS_MOBILE(dev) (INTEL_INFO(dev)->is_mobile) | 1755 | #define IS_MOBILE(dev) (INTEL_INFO(dev)->is_mobile) |
| 1756 | #define IS_HSW_EARLY_SDV(dev) (IS_HASWELL(dev) && \ | 1756 | #define IS_HSW_EARLY_SDV(dev) (IS_HASWELL(dev) && \ |
| 1757 | ((dev)->pdev->device & 0xFF00) == 0x0C00) | 1757 | ((dev)->pdev->device & 0xFF00) == 0x0C00) |
| 1758 | #define IS_ULT(dev) (IS_HASWELL(dev) && \ | 1758 | #define IS_BDW_ULT(dev) (IS_BROADWELL(dev) && \ |
| 1759 | (((dev)->pdev->device & 0xf) == 0x2 || \ | ||
| 1760 | ((dev)->pdev->device & 0xf) == 0x6 || \ | ||
| 1761 | ((dev)->pdev->device & 0xf) == 0xe)) | ||
| 1762 | #define IS_HSW_ULT(dev) (IS_HASWELL(dev) && \ | ||
| 1759 | ((dev)->pdev->device & 0xFF00) == 0x0A00) | 1763 | ((dev)->pdev->device & 0xFF00) == 0x0A00) |
| 1764 | #define IS_ULT(dev) (IS_HSW_ULT(dev) || IS_BDW_ULT(dev)) | ||
| 1760 | #define IS_HSW_GT3(dev) (IS_HASWELL(dev) && \ | 1765 | #define IS_HSW_GT3(dev) (IS_HASWELL(dev) && \ |
| 1761 | ((dev)->pdev->device & 0x00F0) == 0x0020) | 1766 | ((dev)->pdev->device & 0x00F0) == 0x0020) |
| 1762 | #define IS_PRELIMINARY_HW(intel_info) ((intel_info)->is_preliminary) | 1767 | #define IS_PRELIMINARY_HW(intel_info) ((intel_info)->is_preliminary) |
| @@ -1901,9 +1906,7 @@ void i915_queue_hangcheck(struct drm_device *dev); | |||
| 1901 | void i915_handle_error(struct drm_device *dev, bool wedged); | 1906 | void i915_handle_error(struct drm_device *dev, bool wedged); |
| 1902 | 1907 | ||
| 1903 | extern void intel_irq_init(struct drm_device *dev); | 1908 | extern void intel_irq_init(struct drm_device *dev); |
| 1904 | extern void intel_pm_init(struct drm_device *dev); | ||
| 1905 | extern void intel_hpd_init(struct drm_device *dev); | 1909 | extern void intel_hpd_init(struct drm_device *dev); |
| 1906 | extern void intel_pm_init(struct drm_device *dev); | ||
| 1907 | 1910 | ||
| 1908 | extern void intel_uncore_sanitize(struct drm_device *dev); | 1911 | extern void intel_uncore_sanitize(struct drm_device *dev); |
| 1909 | extern void intel_uncore_early_sanitize(struct drm_device *dev); | 1912 | extern void intel_uncore_early_sanitize(struct drm_device *dev); |
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c index 72a3df32292f..b0f42b9ca037 100644 --- a/drivers/gpu/drm/i915/i915_gem_context.c +++ b/drivers/gpu/drm/i915/i915_gem_context.c | |||
| @@ -347,10 +347,8 @@ void i915_gem_context_close(struct drm_device *dev, struct drm_file *file) | |||
| 347 | { | 347 | { |
| 348 | struct drm_i915_file_private *file_priv = file->driver_priv; | 348 | struct drm_i915_file_private *file_priv = file->driver_priv; |
| 349 | 349 | ||
| 350 | mutex_lock(&dev->struct_mutex); | ||
| 351 | idr_for_each(&file_priv->context_idr, context_idr_cleanup, NULL); | 350 | idr_for_each(&file_priv->context_idr, context_idr_cleanup, NULL); |
| 352 | idr_destroy(&file_priv->context_idr); | 351 | idr_destroy(&file_priv->context_idr); |
| 353 | mutex_unlock(&dev->struct_mutex); | ||
| 354 | } | 352 | } |
| 355 | 353 | ||
| 356 | static struct i915_hw_context * | 354 | static struct i915_hw_context * |
| @@ -423,11 +421,21 @@ static int do_switch(struct i915_hw_context *to) | |||
| 423 | if (ret) | 421 | if (ret) |
| 424 | return ret; | 422 | return ret; |
| 425 | 423 | ||
| 426 | /* Clear this page out of any CPU caches for coherent swap-in/out. Note | 424 | /* |
| 425 | * Pin can switch back to the default context if we end up calling into | ||
| 426 | * evict_everything - as a last ditch gtt defrag effort that also | ||
| 427 | * switches to the default context. Hence we need to reload from here. | ||
| 428 | */ | ||
| 429 | from = ring->last_context; | ||
| 430 | |||
| 431 | /* | ||
| 432 | * Clear this page out of any CPU caches for coherent swap-in/out. Note | ||
| 427 | * that thanks to write = false in this call and us not setting any gpu | 433 | * that thanks to write = false in this call and us not setting any gpu |
| 428 | * write domains when putting a context object onto the active list | 434 | * write domains when putting a context object onto the active list |
| 429 | * (when switching away from it), this won't block. | 435 | * (when switching away from it), this won't block. |
| 430 | * XXX: We need a real interface to do this instead of trickery. */ | 436 | * |
| 437 | * XXX: We need a real interface to do this instead of trickery. | ||
| 438 | */ | ||
| 431 | ret = i915_gem_object_set_to_gtt_domain(to->obj, false); | 439 | ret = i915_gem_object_set_to_gtt_domain(to->obj, false); |
| 432 | if (ret) { | 440 | if (ret) { |
| 433 | i915_gem_object_unpin(to->obj); | 441 | i915_gem_object_unpin(to->obj); |
diff --git a/drivers/gpu/drm/i915/i915_gem_evict.c b/drivers/gpu/drm/i915/i915_gem_evict.c index b7376533633d..8f3adc7d0dc8 100644 --- a/drivers/gpu/drm/i915/i915_gem_evict.c +++ b/drivers/gpu/drm/i915/i915_gem_evict.c | |||
| @@ -88,6 +88,7 @@ i915_gem_evict_something(struct drm_device *dev, struct i915_address_space *vm, | |||
| 88 | } else | 88 | } else |
| 89 | drm_mm_init_scan(&vm->mm, min_size, alignment, cache_level); | 89 | drm_mm_init_scan(&vm->mm, min_size, alignment, cache_level); |
| 90 | 90 | ||
| 91 | search_again: | ||
| 91 | /* First see if there is a large enough contiguous idle region... */ | 92 | /* First see if there is a large enough contiguous idle region... */ |
| 92 | list_for_each_entry(vma, &vm->inactive_list, mm_list) { | 93 | list_for_each_entry(vma, &vm->inactive_list, mm_list) { |
| 93 | if (mark_free(vma, &unwind_list)) | 94 | if (mark_free(vma, &unwind_list)) |
| @@ -115,10 +116,17 @@ none: | |||
| 115 | list_del_init(&vma->exec_list); | 116 | list_del_init(&vma->exec_list); |
| 116 | } | 117 | } |
| 117 | 118 | ||
| 118 | /* We expect the caller to unpin, evict all and try again, or give up. | 119 | /* Can we unpin some objects such as idle hw contents, |
| 119 | * So calling i915_gem_evict_vm() is unnecessary. | 120 | * or pending flips? |
| 120 | */ | 121 | */ |
| 121 | return -ENOSPC; | 122 | ret = nonblocking ? -ENOSPC : i915_gpu_idle(dev); |
| 123 | if (ret) | ||
| 124 | return ret; | ||
| 125 | |||
| 126 | /* Only idle the GPU and repeat the search once */ | ||
| 127 | i915_gem_retire_requests(dev); | ||
| 128 | nonblocking = true; | ||
| 129 | goto search_again; | ||
| 122 | 130 | ||
| 123 | found: | 131 | found: |
| 124 | /* drm_mm doesn't allow any other other operations while | 132 | /* drm_mm doesn't allow any other other operations while |
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index 38cb8d44a013..c79dd2b1f70e 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c | |||
| @@ -337,8 +337,8 @@ static void gen8_ppgtt_cleanup(struct i915_address_space *vm) | |||
| 337 | kfree(ppgtt->gen8_pt_dma_addr[i]); | 337 | kfree(ppgtt->gen8_pt_dma_addr[i]); |
| 338 | } | 338 | } |
| 339 | 339 | ||
| 340 | __free_pages(ppgtt->gen8_pt_pages, ppgtt->num_pt_pages << PAGE_SHIFT); | 340 | __free_pages(ppgtt->gen8_pt_pages, get_order(ppgtt->num_pt_pages << PAGE_SHIFT)); |
| 341 | __free_pages(ppgtt->pd_pages, ppgtt->num_pd_pages << PAGE_SHIFT); | 341 | __free_pages(ppgtt->pd_pages, get_order(ppgtt->num_pd_pages << PAGE_SHIFT)); |
| 342 | } | 342 | } |
| 343 | 343 | ||
| 344 | /** | 344 | /** |
| @@ -1241,6 +1241,11 @@ static inline unsigned int gen8_get_total_gtt_size(u16 bdw_gmch_ctl) | |||
| 1241 | bdw_gmch_ctl &= BDW_GMCH_GGMS_MASK; | 1241 | bdw_gmch_ctl &= BDW_GMCH_GGMS_MASK; |
| 1242 | if (bdw_gmch_ctl) | 1242 | if (bdw_gmch_ctl) |
| 1243 | bdw_gmch_ctl = 1 << bdw_gmch_ctl; | 1243 | bdw_gmch_ctl = 1 << bdw_gmch_ctl; |
| 1244 | if (bdw_gmch_ctl > 4) { | ||
| 1245 | WARN_ON(!i915_preliminary_hw_support); | ||
| 1246 | return 4<<20; | ||
| 1247 | } | ||
| 1248 | |||
| 1244 | return bdw_gmch_ctl << 20; | 1249 | return bdw_gmch_ctl << 20; |
| 1245 | } | 1250 | } |
| 1246 | 1251 | ||
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 080f6fd4e839..8b8bde7dce53 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -9135,7 +9135,7 @@ intel_pipe_config_compare(struct drm_device *dev, | |||
| 9135 | if (IS_G4X(dev) || INTEL_INFO(dev)->gen >= 5) | 9135 | if (IS_G4X(dev) || INTEL_INFO(dev)->gen >= 5) |
| 9136 | PIPE_CONF_CHECK_I(pipe_bpp); | 9136 | PIPE_CONF_CHECK_I(pipe_bpp); |
| 9137 | 9137 | ||
| 9138 | if (!IS_HASWELL(dev)) { | 9138 | if (!HAS_DDI(dev)) { |
| 9139 | PIPE_CONF_CHECK_CLOCK_FUZZY(adjusted_mode.crtc_clock); | 9139 | PIPE_CONF_CHECK_CLOCK_FUZZY(adjusted_mode.crtc_clock); |
| 9140 | PIPE_CONF_CHECK_CLOCK_FUZZY(port_clock); | 9140 | PIPE_CONF_CHECK_CLOCK_FUZZY(port_clock); |
| 9141 | } | 9141 | } |
| @@ -11036,8 +11036,6 @@ void intel_modeset_setup_hw_state(struct drm_device *dev, | |||
| 11036 | } | 11036 | } |
| 11037 | 11037 | ||
| 11038 | intel_modeset_check_state(dev); | 11038 | intel_modeset_check_state(dev); |
| 11039 | |||
| 11040 | drm_mode_config_reset(dev); | ||
| 11041 | } | 11039 | } |
| 11042 | 11040 | ||
| 11043 | void intel_modeset_gem_init(struct drm_device *dev) | 11041 | void intel_modeset_gem_init(struct drm_device *dev) |
| @@ -11046,7 +11044,10 @@ void intel_modeset_gem_init(struct drm_device *dev) | |||
| 11046 | 11044 | ||
| 11047 | intel_setup_overlay(dev); | 11045 | intel_setup_overlay(dev); |
| 11048 | 11046 | ||
| 11047 | drm_modeset_lock_all(dev); | ||
| 11048 | drm_mode_config_reset(dev); | ||
| 11049 | intel_modeset_setup_hw_state(dev, false); | 11049 | intel_modeset_setup_hw_state(dev, false); |
| 11050 | drm_modeset_unlock_all(dev); | ||
| 11050 | } | 11051 | } |
| 11051 | 11052 | ||
| 11052 | void intel_modeset_cleanup(struct drm_device *dev) | 11053 | void intel_modeset_cleanup(struct drm_device *dev) |
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index a18e88b3e425..79f91f26e288 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
| @@ -821,6 +821,7 @@ void intel_update_sprite_watermarks(struct drm_plane *plane, | |||
| 821 | uint32_t sprite_width, int pixel_size, | 821 | uint32_t sprite_width, int pixel_size, |
| 822 | bool enabled, bool scaled); | 822 | bool enabled, bool scaled); |
| 823 | void intel_init_pm(struct drm_device *dev); | 823 | void intel_init_pm(struct drm_device *dev); |
| 824 | void intel_pm_setup(struct drm_device *dev); | ||
| 824 | bool intel_fbc_enabled(struct drm_device *dev); | 825 | bool intel_fbc_enabled(struct drm_device *dev); |
| 825 | void intel_update_fbc(struct drm_device *dev); | 826 | void intel_update_fbc(struct drm_device *dev); |
| 826 | void intel_gpu_ips_init(struct drm_i915_private *dev_priv); | 827 | void intel_gpu_ips_init(struct drm_i915_private *dev_priv); |
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c index f161ac02c4f6..e6f782d1c669 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c | |||
| @@ -451,7 +451,9 @@ static u32 intel_panel_get_backlight(struct drm_device *dev, | |||
| 451 | 451 | ||
| 452 | spin_lock_irqsave(&dev_priv->backlight.lock, flags); | 452 | spin_lock_irqsave(&dev_priv->backlight.lock, flags); |
| 453 | 453 | ||
| 454 | if (HAS_PCH_SPLIT(dev)) { | 454 | if (IS_BROADWELL(dev)) { |
| 455 | val = I915_READ(BLC_PWM_PCH_CTL2) & BACKLIGHT_DUTY_CYCLE_MASK; | ||
| 456 | } else if (HAS_PCH_SPLIT(dev)) { | ||
| 455 | val = I915_READ(BLC_PWM_CPU_CTL) & BACKLIGHT_DUTY_CYCLE_MASK; | 457 | val = I915_READ(BLC_PWM_CPU_CTL) & BACKLIGHT_DUTY_CYCLE_MASK; |
| 456 | } else { | 458 | } else { |
| 457 | if (IS_VALLEYVIEW(dev)) | 459 | if (IS_VALLEYVIEW(dev)) |
| @@ -479,6 +481,13 @@ static u32 intel_panel_get_backlight(struct drm_device *dev, | |||
| 479 | return val; | 481 | return val; |
| 480 | } | 482 | } |
| 481 | 483 | ||
| 484 | static void intel_bdw_panel_set_backlight(struct drm_device *dev, u32 level) | ||
| 485 | { | ||
| 486 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 487 | u32 val = I915_READ(BLC_PWM_PCH_CTL2) & ~BACKLIGHT_DUTY_CYCLE_MASK; | ||
| 488 | I915_WRITE(BLC_PWM_PCH_CTL2, val | level); | ||
| 489 | } | ||
| 490 | |||
| 482 | static void intel_pch_panel_set_backlight(struct drm_device *dev, u32 level) | 491 | static void intel_pch_panel_set_backlight(struct drm_device *dev, u32 level) |
| 483 | { | 492 | { |
| 484 | struct drm_i915_private *dev_priv = dev->dev_private; | 493 | struct drm_i915_private *dev_priv = dev->dev_private; |
| @@ -496,7 +505,9 @@ static void intel_panel_actually_set_backlight(struct drm_device *dev, | |||
| 496 | DRM_DEBUG_DRIVER("set backlight PWM = %d\n", level); | 505 | DRM_DEBUG_DRIVER("set backlight PWM = %d\n", level); |
| 497 | level = intel_panel_compute_brightness(dev, pipe, level); | 506 | level = intel_panel_compute_brightness(dev, pipe, level); |
| 498 | 507 | ||
| 499 | if (HAS_PCH_SPLIT(dev)) | 508 | if (IS_BROADWELL(dev)) |
| 509 | return intel_bdw_panel_set_backlight(dev, level); | ||
| 510 | else if (HAS_PCH_SPLIT(dev)) | ||
| 500 | return intel_pch_panel_set_backlight(dev, level); | 511 | return intel_pch_panel_set_backlight(dev, level); |
| 501 | 512 | ||
| 502 | if (is_backlight_combination_mode(dev)) { | 513 | if (is_backlight_combination_mode(dev)) { |
| @@ -666,7 +677,16 @@ void intel_panel_enable_backlight(struct intel_connector *connector) | |||
| 666 | POSTING_READ(reg); | 677 | POSTING_READ(reg); |
| 667 | I915_WRITE(reg, tmp | BLM_PWM_ENABLE); | 678 | I915_WRITE(reg, tmp | BLM_PWM_ENABLE); |
| 668 | 679 | ||
| 669 | if (HAS_PCH_SPLIT(dev) && | 680 | if (IS_BROADWELL(dev)) { |
| 681 | /* | ||
| 682 | * Broadwell requires PCH override to drive the PCH | ||
| 683 | * backlight pin. The above will configure the CPU | ||
| 684 | * backlight pin, which we don't plan to use. | ||
| 685 | */ | ||
| 686 | tmp = I915_READ(BLC_PWM_PCH_CTL1); | ||
| 687 | tmp |= BLM_PCH_OVERRIDE_ENABLE | BLM_PCH_PWM_ENABLE; | ||
| 688 | I915_WRITE(BLC_PWM_PCH_CTL1, tmp); | ||
| 689 | } else if (HAS_PCH_SPLIT(dev) && | ||
| 670 | !(dev_priv->quirks & QUIRK_NO_PCH_PWM_ENABLE)) { | 690 | !(dev_priv->quirks & QUIRK_NO_PCH_PWM_ENABLE)) { |
| 671 | tmp = I915_READ(BLC_PWM_PCH_CTL1); | 691 | tmp = I915_READ(BLC_PWM_PCH_CTL1); |
| 672 | tmp |= BLM_PCH_PWM_ENABLE; | 692 | tmp |= BLM_PCH_PWM_ENABLE; |
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 6e0d5e075b15..3657ab43c8fd 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
| @@ -5685,6 +5685,7 @@ static void __intel_set_power_well(struct drm_device *dev, bool enable) | |||
| 5685 | { | 5685 | { |
| 5686 | struct drm_i915_private *dev_priv = dev->dev_private; | 5686 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 5687 | bool is_enabled, enable_requested; | 5687 | bool is_enabled, enable_requested; |
| 5688 | unsigned long irqflags; | ||
| 5688 | uint32_t tmp; | 5689 | uint32_t tmp; |
| 5689 | 5690 | ||
| 5690 | tmp = I915_READ(HSW_PWR_WELL_DRIVER); | 5691 | tmp = I915_READ(HSW_PWR_WELL_DRIVER); |
| @@ -5702,9 +5703,24 @@ static void __intel_set_power_well(struct drm_device *dev, bool enable) | |||
| 5702 | HSW_PWR_WELL_STATE_ENABLED), 20)) | 5703 | HSW_PWR_WELL_STATE_ENABLED), 20)) |
| 5703 | DRM_ERROR("Timeout enabling power well\n"); | 5704 | DRM_ERROR("Timeout enabling power well\n"); |
| 5704 | } | 5705 | } |
| 5706 | |||
| 5707 | if (IS_BROADWELL(dev)) { | ||
| 5708 | spin_lock_irqsave(&dev_priv->irq_lock, irqflags); | ||
| 5709 | I915_WRITE(GEN8_DE_PIPE_IMR(PIPE_B), | ||
| 5710 | dev_priv->de_irq_mask[PIPE_B]); | ||
| 5711 | I915_WRITE(GEN8_DE_PIPE_IER(PIPE_B), | ||
| 5712 | ~dev_priv->de_irq_mask[PIPE_B] | | ||
| 5713 | GEN8_PIPE_VBLANK); | ||
| 5714 | I915_WRITE(GEN8_DE_PIPE_IMR(PIPE_C), | ||
| 5715 | dev_priv->de_irq_mask[PIPE_C]); | ||
| 5716 | I915_WRITE(GEN8_DE_PIPE_IER(PIPE_C), | ||
| 5717 | ~dev_priv->de_irq_mask[PIPE_C] | | ||
| 5718 | GEN8_PIPE_VBLANK); | ||
| 5719 | POSTING_READ(GEN8_DE_PIPE_IER(PIPE_C)); | ||
| 5720 | spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); | ||
| 5721 | } | ||
| 5705 | } else { | 5722 | } else { |
| 5706 | if (enable_requested) { | 5723 | if (enable_requested) { |
| 5707 | unsigned long irqflags; | ||
| 5708 | enum pipe p; | 5724 | enum pipe p; |
| 5709 | 5725 | ||
| 5710 | I915_WRITE(HSW_PWR_WELL_DRIVER, 0); | 5726 | I915_WRITE(HSW_PWR_WELL_DRIVER, 0); |
| @@ -6130,10 +6146,19 @@ int vlv_freq_opcode(int ddr_freq, int val) | |||
| 6130 | return val; | 6146 | return val; |
| 6131 | } | 6147 | } |
| 6132 | 6148 | ||
| 6133 | void intel_pm_init(struct drm_device *dev) | 6149 | void intel_pm_setup(struct drm_device *dev) |
| 6134 | { | 6150 | { |
| 6135 | struct drm_i915_private *dev_priv = dev->dev_private; | 6151 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 6136 | 6152 | ||
| 6153 | mutex_init(&dev_priv->rps.hw_lock); | ||
| 6154 | |||
| 6155 | mutex_init(&dev_priv->pc8.lock); | ||
| 6156 | dev_priv->pc8.requirements_met = false; | ||
| 6157 | dev_priv->pc8.gpu_idle = false; | ||
| 6158 | dev_priv->pc8.irqs_disabled = false; | ||
| 6159 | dev_priv->pc8.enabled = false; | ||
| 6160 | dev_priv->pc8.disable_count = 2; /* requirements_met + gpu_idle */ | ||
| 6161 | INIT_DELAYED_WORK(&dev_priv->pc8.enable_work, hsw_enable_pc8_work); | ||
| 6137 | INIT_DELAYED_WORK(&dev_priv->rps.delayed_resume_work, | 6162 | INIT_DELAYED_WORK(&dev_priv->rps.delayed_resume_work, |
| 6138 | intel_gen6_powersave_work); | 6163 | intel_gen6_powersave_work); |
| 6139 | } | 6164 | } |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index b620337e6d67..c2f09d456300 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
| @@ -965,6 +965,7 @@ void intel_ring_setup_status_page(struct intel_ring_buffer *ring) | |||
| 965 | } else if (IS_GEN6(ring->dev)) { | 965 | } else if (IS_GEN6(ring->dev)) { |
| 966 | mmio = RING_HWS_PGA_GEN6(ring->mmio_base); | 966 | mmio = RING_HWS_PGA_GEN6(ring->mmio_base); |
| 967 | } else { | 967 | } else { |
| 968 | /* XXX: gen8 returns to sanity */ | ||
| 968 | mmio = RING_HWS_PGA(ring->mmio_base); | 969 | mmio = RING_HWS_PGA(ring->mmio_base); |
| 969 | } | 970 | } |
| 970 | 971 | ||
diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c index 0b02078a0b84..25cbe073c388 100644 --- a/drivers/gpu/drm/i915/intel_uncore.c +++ b/drivers/gpu/drm/i915/intel_uncore.c | |||
| @@ -784,6 +784,7 @@ static int gen6_do_reset(struct drm_device *dev) | |||
| 784 | int intel_gpu_reset(struct drm_device *dev) | 784 | int intel_gpu_reset(struct drm_device *dev) |
| 785 | { | 785 | { |
| 786 | switch (INTEL_INFO(dev)->gen) { | 786 | switch (INTEL_INFO(dev)->gen) { |
| 787 | case 8: | ||
| 787 | case 7: | 788 | case 7: |
| 788 | case 6: return gen6_do_reset(dev); | 789 | case 6: return gen6_do_reset(dev); |
| 789 | case 5: return ironlake_do_reset(dev); | 790 | case 5: return ironlake_do_reset(dev); |
diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c index 7a3759f1c41a..98a22e6e27a1 100644 --- a/drivers/gpu/drm/nouveau/nouveau_drm.c +++ b/drivers/gpu/drm/nouveau/nouveau_drm.c | |||
| @@ -858,6 +858,12 @@ static int nouveau_pmops_runtime_suspend(struct device *dev) | |||
| 858 | if (nouveau_runtime_pm == 0) | 858 | if (nouveau_runtime_pm == 0) |
| 859 | return -EINVAL; | 859 | return -EINVAL; |
| 860 | 860 | ||
| 861 | /* are we optimus enabled? */ | ||
| 862 | if (nouveau_runtime_pm == -1 && !nouveau_is_optimus() && !nouveau_is_v1_dsm()) { | ||
| 863 | DRM_DEBUG_DRIVER("failing to power off - not optimus\n"); | ||
| 864 | return -EINVAL; | ||
| 865 | } | ||
| 866 | |||
| 861 | nv_debug_level(SILENT); | 867 | nv_debug_level(SILENT); |
| 862 | drm_kms_helper_poll_disable(drm_dev); | 868 | drm_kms_helper_poll_disable(drm_dev); |
| 863 | vga_switcheroo_set_dynamic_switch(pdev, VGA_SWITCHEROO_OFF); | 869 | vga_switcheroo_set_dynamic_switch(pdev, VGA_SWITCHEROO_OFF); |
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index 80a20120e625..b1970596a782 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
| @@ -1196,7 +1196,9 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc, | |||
| 1196 | } else if ((rdev->family == CHIP_TAHITI) || | 1196 | } else if ((rdev->family == CHIP_TAHITI) || |
| 1197 | (rdev->family == CHIP_PITCAIRN)) | 1197 | (rdev->family == CHIP_PITCAIRN)) |
| 1198 | fb_format |= SI_GRPH_PIPE_CONFIG(SI_ADDR_SURF_P8_32x32_8x16); | 1198 | fb_format |= SI_GRPH_PIPE_CONFIG(SI_ADDR_SURF_P8_32x32_8x16); |
| 1199 | else if (rdev->family == CHIP_VERDE) | 1199 | else if ((rdev->family == CHIP_VERDE) || |
| 1200 | (rdev->family == CHIP_OLAND) || | ||
| 1201 | (rdev->family == CHIP_HAINAN)) /* for completeness. HAINAN has no display hw */ | ||
| 1200 | fb_format |= SI_GRPH_PIPE_CONFIG(SI_ADDR_SURF_P4_8x16); | 1202 | fb_format |= SI_GRPH_PIPE_CONFIG(SI_ADDR_SURF_P4_8x16); |
| 1201 | 1203 | ||
| 1202 | switch (radeon_crtc->crtc_id) { | 1204 | switch (radeon_crtc->crtc_id) { |
diff --git a/drivers/gpu/drm/radeon/cik_sdma.c b/drivers/gpu/drm/radeon/cik_sdma.c index 0300727a4f70..d08b83c6267b 100644 --- a/drivers/gpu/drm/radeon/cik_sdma.c +++ b/drivers/gpu/drm/radeon/cik_sdma.c | |||
| @@ -458,7 +458,7 @@ int cik_copy_dma(struct radeon_device *rdev, | |||
| 458 | radeon_ring_write(ring, 0); /* src/dst endian swap */ | 458 | radeon_ring_write(ring, 0); /* src/dst endian swap */ |
| 459 | radeon_ring_write(ring, src_offset & 0xffffffff); | 459 | radeon_ring_write(ring, src_offset & 0xffffffff); |
| 460 | radeon_ring_write(ring, upper_32_bits(src_offset) & 0xffffffff); | 460 | radeon_ring_write(ring, upper_32_bits(src_offset) & 0xffffffff); |
| 461 | radeon_ring_write(ring, dst_offset & 0xfffffffc); | 461 | radeon_ring_write(ring, dst_offset & 0xffffffff); |
| 462 | radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xffffffff); | 462 | radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xffffffff); |
| 463 | src_offset += cur_size_in_bytes; | 463 | src_offset += cur_size_in_bytes; |
| 464 | dst_offset += cur_size_in_bytes; | 464 | dst_offset += cur_size_in_bytes; |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c index e354ce94cdd1..c0425bb6223a 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.c +++ b/drivers/gpu/drm/radeon/radeon_asic.c | |||
| @@ -2021,7 +2021,7 @@ static struct radeon_asic ci_asic = { | |||
| 2021 | .hdmi_setmode = &evergreen_hdmi_setmode, | 2021 | .hdmi_setmode = &evergreen_hdmi_setmode, |
| 2022 | }, | 2022 | }, |
| 2023 | .copy = { | 2023 | .copy = { |
| 2024 | .blit = NULL, | 2024 | .blit = &cik_copy_cpdma, |
| 2025 | .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, | 2025 | .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, |
| 2026 | .dma = &cik_copy_dma, | 2026 | .dma = &cik_copy_dma, |
| 2027 | .dma_ring_index = R600_RING_TYPE_DMA_INDEX, | 2027 | .dma_ring_index = R600_RING_TYPE_DMA_INDEX, |
| @@ -2122,7 +2122,7 @@ static struct radeon_asic kv_asic = { | |||
| 2122 | .hdmi_setmode = &evergreen_hdmi_setmode, | 2122 | .hdmi_setmode = &evergreen_hdmi_setmode, |
| 2123 | }, | 2123 | }, |
| 2124 | .copy = { | 2124 | .copy = { |
| 2125 | .blit = NULL, | 2125 | .blit = &cik_copy_cpdma, |
| 2126 | .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, | 2126 | .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, |
| 2127 | .dma = &cik_copy_dma, | 2127 | .dma = &cik_copy_dma, |
| 2128 | .dma_ring_index = R600_RING_TYPE_DMA_INDEX, | 2128 | .dma_ring_index = R600_RING_TYPE_DMA_INDEX, |
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c index 9f5ff28864f6..1958b36ad0e5 100644 --- a/drivers/gpu/drm/radeon/radeon_drv.c +++ b/drivers/gpu/drm/radeon/radeon_drv.c | |||
| @@ -508,15 +508,6 @@ static const struct file_operations radeon_driver_kms_fops = { | |||
| 508 | #endif | 508 | #endif |
| 509 | }; | 509 | }; |
| 510 | 510 | ||
| 511 | |||
| 512 | static void | ||
| 513 | radeon_pci_shutdown(struct pci_dev *pdev) | ||
| 514 | { | ||
| 515 | struct drm_device *dev = pci_get_drvdata(pdev); | ||
| 516 | |||
| 517 | radeon_driver_unload_kms(dev); | ||
| 518 | } | ||
| 519 | |||
| 520 | static struct drm_driver kms_driver = { | 511 | static struct drm_driver kms_driver = { |
| 521 | .driver_features = | 512 | .driver_features = |
| 522 | DRIVER_USE_AGP | | 513 | DRIVER_USE_AGP | |
| @@ -586,7 +577,6 @@ static struct pci_driver radeon_kms_pci_driver = { | |||
| 586 | .probe = radeon_pci_probe, | 577 | .probe = radeon_pci_probe, |
| 587 | .remove = radeon_pci_remove, | 578 | .remove = radeon_pci_remove, |
| 588 | .driver.pm = &radeon_pm_ops, | 579 | .driver.pm = &radeon_pm_ops, |
| 589 | .shutdown = radeon_pci_shutdown, | ||
| 590 | }; | 580 | }; |
| 591 | 581 | ||
| 592 | static int __init radeon_init(void) | 582 | static int __init radeon_init(void) |
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c index 1c560629575a..e7dab069cccf 100644 --- a/drivers/gpu/drm/radeon/rs690.c +++ b/drivers/gpu/drm/radeon/rs690.c | |||
| @@ -162,6 +162,16 @@ static void rs690_mc_init(struct radeon_device *rdev) | |||
| 162 | base = RREG32_MC(R_000100_MCCFG_FB_LOCATION); | 162 | base = RREG32_MC(R_000100_MCCFG_FB_LOCATION); |
| 163 | base = G_000100_MC_FB_START(base) << 16; | 163 | base = G_000100_MC_FB_START(base) << 16; |
| 164 | rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); | 164 | rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); |
| 165 | /* Some boards seem to be configured for 128MB of sideport memory, | ||
| 166 | * but really only have 64MB. Just skip the sideport and use | ||
| 167 | * UMA memory. | ||
| 168 | */ | ||
| 169 | if (rdev->mc.igp_sideport_enabled && | ||
| 170 | (rdev->mc.real_vram_size == (384 * 1024 * 1024))) { | ||
| 171 | base += 128 * 1024 * 1024; | ||
| 172 | rdev->mc.real_vram_size -= 128 * 1024 * 1024; | ||
| 173 | rdev->mc.mc_vram_size = rdev->mc.real_vram_size; | ||
| 174 | } | ||
| 165 | 175 | ||
| 166 | /* Use K8 direct mapping for fast fb access. */ | 176 | /* Use K8 direct mapping for fast fb access. */ |
| 167 | rdev->fastfb_working = false; | 177 | rdev->fastfb_working = false; |
diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c index b249ab9b1eb2..6440eeac22d2 100644 --- a/drivers/gpu/drm/ttm/ttm_bo_vm.c +++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c | |||
| @@ -169,9 +169,9 @@ static int ttm_bo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
| 169 | } | 169 | } |
| 170 | 170 | ||
| 171 | page_offset = ((address - vma->vm_start) >> PAGE_SHIFT) + | 171 | page_offset = ((address - vma->vm_start) >> PAGE_SHIFT) + |
| 172 | drm_vma_node_start(&bo->vma_node) - vma->vm_pgoff; | 172 | vma->vm_pgoff - drm_vma_node_start(&bo->vma_node); |
| 173 | page_last = vma_pages(vma) + | 173 | page_last = vma_pages(vma) + vma->vm_pgoff - |
| 174 | drm_vma_node_start(&bo->vma_node) - vma->vm_pgoff; | 174 | drm_vma_node_start(&bo->vma_node); |
| 175 | 175 | ||
| 176 | if (unlikely(page_offset >= bo->num_pages)) { | 176 | if (unlikely(page_offset >= bo->num_pages)) { |
| 177 | retval = VM_FAULT_SIGBUS; | 177 | retval = VM_FAULT_SIGBUS; |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c index a51f48e3e917..45d5b5ab6ca9 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c | |||
| @@ -68,6 +68,9 @@ int vmw_getparam_ioctl(struct drm_device *dev, void *data, | |||
| 68 | SVGA_FIFO_3D_HWVERSION)); | 68 | SVGA_FIFO_3D_HWVERSION)); |
| 69 | break; | 69 | break; |
| 70 | } | 70 | } |
| 71 | case DRM_VMW_PARAM_MAX_SURF_MEMORY: | ||
| 72 | param->value = dev_priv->memory_size; | ||
| 73 | break; | ||
| 71 | default: | 74 | default: |
| 72 | DRM_ERROR("Illegal vmwgfx get param request: %d\n", | 75 | DRM_ERROR("Illegal vmwgfx get param request: %d\n", |
| 73 | param->param); | 76 | param->param); |
diff --git a/drivers/iio/adc/ad7887.c b/drivers/iio/adc/ad7887.c index acb7f90359a3..749a6cadab8b 100644 --- a/drivers/iio/adc/ad7887.c +++ b/drivers/iio/adc/ad7887.c | |||
| @@ -200,7 +200,13 @@ static const struct ad7887_chip_info ad7887_chip_info_tbl[] = { | |||
| 200 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), | 200 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), |
| 201 | .address = 1, | 201 | .address = 1, |
| 202 | .scan_index = 1, | 202 | .scan_index = 1, |
| 203 | .scan_type = IIO_ST('u', 12, 16, 0), | 203 | .scan_type = { |
| 204 | .sign = 'u', | ||
| 205 | .realbits = 12, | ||
| 206 | .storagebits = 16, | ||
| 207 | .shift = 0, | ||
| 208 | .endianness = IIO_BE, | ||
| 209 | }, | ||
| 204 | }, | 210 | }, |
| 205 | .channel[1] = { | 211 | .channel[1] = { |
| 206 | .type = IIO_VOLTAGE, | 212 | .type = IIO_VOLTAGE, |
| @@ -210,7 +216,13 @@ static const struct ad7887_chip_info ad7887_chip_info_tbl[] = { | |||
| 210 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), | 216 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), |
| 211 | .address = 0, | 217 | .address = 0, |
| 212 | .scan_index = 0, | 218 | .scan_index = 0, |
| 213 | .scan_type = IIO_ST('u', 12, 16, 0), | 219 | .scan_type = { |
| 220 | .sign = 'u', | ||
| 221 | .realbits = 12, | ||
| 222 | .storagebits = 16, | ||
| 223 | .shift = 0, | ||
| 224 | .endianness = IIO_BE, | ||
| 225 | }, | ||
| 214 | }, | 226 | }, |
| 215 | .channel[2] = IIO_CHAN_SOFT_TIMESTAMP(2), | 227 | .channel[2] = IIO_CHAN_SOFT_TIMESTAMP(2), |
| 216 | .int_vref_mv = 2500, | 228 | .int_vref_mv = 2500, |
diff --git a/drivers/iio/imu/adis16400_core.c b/drivers/iio/imu/adis16400_core.c index 3fb7757a1028..368660dfe135 100644 --- a/drivers/iio/imu/adis16400_core.c +++ b/drivers/iio/imu/adis16400_core.c | |||
| @@ -651,7 +651,12 @@ static const struct iio_chan_spec adis16448_channels[] = { | |||
| 651 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), | 651 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), |
| 652 | .address = ADIS16448_BARO_OUT, | 652 | .address = ADIS16448_BARO_OUT, |
| 653 | .scan_index = ADIS16400_SCAN_BARO, | 653 | .scan_index = ADIS16400_SCAN_BARO, |
| 654 | .scan_type = IIO_ST('s', 16, 16, 0), | 654 | .scan_type = { |
| 655 | .sign = 's', | ||
| 656 | .realbits = 16, | ||
| 657 | .storagebits = 16, | ||
| 658 | .endianness = IIO_BE, | ||
| 659 | }, | ||
| 655 | }, | 660 | }, |
| 656 | ADIS16400_TEMP_CHAN(ADIS16448_TEMP_OUT, 12), | 661 | ADIS16400_TEMP_CHAN(ADIS16448_TEMP_OUT, 12), |
| 657 | IIO_CHAN_SOFT_TIMESTAMP(11) | 662 | IIO_CHAN_SOFT_TIMESTAMP(11) |
diff --git a/drivers/iio/light/cm36651.c b/drivers/iio/light/cm36651.c index 21df57130018..0922e39b0ea9 100644 --- a/drivers/iio/light/cm36651.c +++ b/drivers/iio/light/cm36651.c | |||
| @@ -387,7 +387,7 @@ static int cm36651_read_int_time(struct cm36651_data *cm36651, | |||
| 387 | return -EINVAL; | 387 | return -EINVAL; |
| 388 | } | 388 | } |
| 389 | 389 | ||
| 390 | return IIO_VAL_INT_PLUS_MICRO; | 390 | return IIO_VAL_INT; |
| 391 | } | 391 | } |
| 392 | 392 | ||
| 393 | static int cm36651_write_int_time(struct cm36651_data *cm36651, | 393 | static int cm36651_write_int_time(struct cm36651_data *cm36651, |
diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c index 6be57c38638d..9804fca6bf06 100644 --- a/drivers/infiniband/ulp/isert/ib_isert.c +++ b/drivers/infiniband/ulp/isert/ib_isert.c | |||
| @@ -207,7 +207,9 @@ isert_free_rx_descriptors(struct isert_conn *isert_conn) | |||
| 207 | isert_conn->conn_rx_descs = NULL; | 207 | isert_conn->conn_rx_descs = NULL; |
| 208 | } | 208 | } |
| 209 | 209 | ||
| 210 | static void isert_cq_tx_work(struct work_struct *); | ||
| 210 | static void isert_cq_tx_callback(struct ib_cq *, void *); | 211 | static void isert_cq_tx_callback(struct ib_cq *, void *); |
| 212 | static void isert_cq_rx_work(struct work_struct *); | ||
| 211 | static void isert_cq_rx_callback(struct ib_cq *, void *); | 213 | static void isert_cq_rx_callback(struct ib_cq *, void *); |
| 212 | 214 | ||
| 213 | static int | 215 | static int |
| @@ -259,26 +261,36 @@ isert_create_device_ib_res(struct isert_device *device) | |||
| 259 | cq_desc[i].device = device; | 261 | cq_desc[i].device = device; |
| 260 | cq_desc[i].cq_index = i; | 262 | cq_desc[i].cq_index = i; |
| 261 | 263 | ||
| 264 | INIT_WORK(&cq_desc[i].cq_rx_work, isert_cq_rx_work); | ||
| 262 | device->dev_rx_cq[i] = ib_create_cq(device->ib_device, | 265 | device->dev_rx_cq[i] = ib_create_cq(device->ib_device, |
| 263 | isert_cq_rx_callback, | 266 | isert_cq_rx_callback, |
| 264 | isert_cq_event_callback, | 267 | isert_cq_event_callback, |
| 265 | (void *)&cq_desc[i], | 268 | (void *)&cq_desc[i], |
| 266 | ISER_MAX_RX_CQ_LEN, i); | 269 | ISER_MAX_RX_CQ_LEN, i); |
| 267 | if (IS_ERR(device->dev_rx_cq[i])) | 270 | if (IS_ERR(device->dev_rx_cq[i])) { |
| 271 | ret = PTR_ERR(device->dev_rx_cq[i]); | ||
| 272 | device->dev_rx_cq[i] = NULL; | ||
| 268 | goto out_cq; | 273 | goto out_cq; |
| 274 | } | ||
| 269 | 275 | ||
| 276 | INIT_WORK(&cq_desc[i].cq_tx_work, isert_cq_tx_work); | ||
| 270 | device->dev_tx_cq[i] = ib_create_cq(device->ib_device, | 277 | device->dev_tx_cq[i] = ib_create_cq(device->ib_device, |
| 271 | isert_cq_tx_callback, | 278 | isert_cq_tx_callback, |
| 272 | isert_cq_event_callback, | 279 | isert_cq_event_callback, |
| 273 | (void *)&cq_desc[i], | 280 | (void *)&cq_desc[i], |
| 274 | ISER_MAX_TX_CQ_LEN, i); | 281 | ISER_MAX_TX_CQ_LEN, i); |
| 275 | if (IS_ERR(device->dev_tx_cq[i])) | 282 | if (IS_ERR(device->dev_tx_cq[i])) { |
| 283 | ret = PTR_ERR(device->dev_tx_cq[i]); | ||
| 284 | device->dev_tx_cq[i] = NULL; | ||
| 276 | goto out_cq; | 285 | goto out_cq; |
| 286 | } | ||
| 277 | 287 | ||
| 278 | if (ib_req_notify_cq(device->dev_rx_cq[i], IB_CQ_NEXT_COMP)) | 288 | ret = ib_req_notify_cq(device->dev_rx_cq[i], IB_CQ_NEXT_COMP); |
| 289 | if (ret) | ||
| 279 | goto out_cq; | 290 | goto out_cq; |
| 280 | 291 | ||
| 281 | if (ib_req_notify_cq(device->dev_tx_cq[i], IB_CQ_NEXT_COMP)) | 292 | ret = ib_req_notify_cq(device->dev_tx_cq[i], IB_CQ_NEXT_COMP); |
| 293 | if (ret) | ||
| 282 | goto out_cq; | 294 | goto out_cq; |
| 283 | } | 295 | } |
| 284 | 296 | ||
| @@ -1724,7 +1736,6 @@ isert_cq_tx_callback(struct ib_cq *cq, void *context) | |||
| 1724 | { | 1736 | { |
| 1725 | struct isert_cq_desc *cq_desc = (struct isert_cq_desc *)context; | 1737 | struct isert_cq_desc *cq_desc = (struct isert_cq_desc *)context; |
| 1726 | 1738 | ||
| 1727 | INIT_WORK(&cq_desc->cq_tx_work, isert_cq_tx_work); | ||
| 1728 | queue_work(isert_comp_wq, &cq_desc->cq_tx_work); | 1739 | queue_work(isert_comp_wq, &cq_desc->cq_tx_work); |
| 1729 | } | 1740 | } |
| 1730 | 1741 | ||
| @@ -1768,7 +1779,6 @@ isert_cq_rx_callback(struct ib_cq *cq, void *context) | |||
| 1768 | { | 1779 | { |
| 1769 | struct isert_cq_desc *cq_desc = (struct isert_cq_desc *)context; | 1780 | struct isert_cq_desc *cq_desc = (struct isert_cq_desc *)context; |
| 1770 | 1781 | ||
| 1771 | INIT_WORK(&cq_desc->cq_rx_work, isert_cq_rx_work); | ||
| 1772 | queue_work(isert_rx_wq, &cq_desc->cq_rx_work); | 1782 | queue_work(isert_rx_wq, &cq_desc->cq_rx_work); |
| 1773 | } | 1783 | } |
| 1774 | 1784 | ||
diff --git a/drivers/net/can/usb/ems_usb.c b/drivers/net/can/usb/ems_usb.c index 5f9a7ad9b964..8aeec0b4601a 100644 --- a/drivers/net/can/usb/ems_usb.c +++ b/drivers/net/can/usb/ems_usb.c | |||
| @@ -625,6 +625,7 @@ static int ems_usb_start(struct ems_usb *dev) | |||
| 625 | usb_unanchor_urb(urb); | 625 | usb_unanchor_urb(urb); |
| 626 | usb_free_coherent(dev->udev, RX_BUFFER_SIZE, buf, | 626 | usb_free_coherent(dev->udev, RX_BUFFER_SIZE, buf, |
| 627 | urb->transfer_dma); | 627 | urb->transfer_dma); |
| 628 | usb_free_urb(urb); | ||
| 628 | break; | 629 | break; |
| 629 | } | 630 | } |
| 630 | 631 | ||
| @@ -798,8 +799,8 @@ static netdev_tx_t ems_usb_start_xmit(struct sk_buff *skb, struct net_device *ne | |||
| 798 | * allowed (MAX_TX_URBS). | 799 | * allowed (MAX_TX_URBS). |
| 799 | */ | 800 | */ |
| 800 | if (!context) { | 801 | if (!context) { |
| 801 | usb_unanchor_urb(urb); | ||
| 802 | usb_free_coherent(dev->udev, size, buf, urb->transfer_dma); | 802 | usb_free_coherent(dev->udev, size, buf, urb->transfer_dma); |
| 803 | usb_free_urb(urb); | ||
| 803 | 804 | ||
| 804 | netdev_warn(netdev, "couldn't find free context\n"); | 805 | netdev_warn(netdev, "couldn't find free context\n"); |
| 805 | 806 | ||
diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_pro.c b/drivers/net/can/usb/peak_usb/pcan_usb_pro.c index 8ee9d1556e6e..263dd921edc4 100644 --- a/drivers/net/can/usb/peak_usb/pcan_usb_pro.c +++ b/drivers/net/can/usb/peak_usb/pcan_usb_pro.c | |||
| @@ -927,6 +927,9 @@ static int pcan_usb_pro_init(struct peak_usb_device *dev) | |||
| 927 | /* set LED in default state (end of init phase) */ | 927 | /* set LED in default state (end of init phase) */ |
| 928 | pcan_usb_pro_set_led(dev, 0, 1); | 928 | pcan_usb_pro_set_led(dev, 0, 1); |
| 929 | 929 | ||
| 930 | kfree(bi); | ||
| 931 | kfree(fi); | ||
| 932 | |||
| 930 | return 0; | 933 | return 0; |
| 931 | 934 | ||
| 932 | err_out: | 935 | err_out: |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c index b1cb0ffb15c7..6055d397a29e 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | |||
| @@ -447,8 +447,9 @@ irqreturn_t qlcnic_83xx_intr(int irq, void *data) | |||
| 447 | 447 | ||
| 448 | qlcnic_83xx_poll_process_aen(adapter); | 448 | qlcnic_83xx_poll_process_aen(adapter); |
| 449 | 449 | ||
| 450 | if (ahw->diag_test == QLCNIC_INTERRUPT_TEST) { | 450 | if (ahw->diag_test) { |
| 451 | ahw->diag_cnt++; | 451 | if (ahw->diag_test == QLCNIC_INTERRUPT_TEST) |
| 452 | ahw->diag_cnt++; | ||
| 452 | qlcnic_83xx_enable_legacy_msix_mbx_intr(adapter); | 453 | qlcnic_83xx_enable_legacy_msix_mbx_intr(adapter); |
| 453 | return IRQ_HANDLED; | 454 | return IRQ_HANDLED; |
| 454 | } | 455 | } |
| @@ -1345,11 +1346,6 @@ static int qlcnic_83xx_diag_alloc_res(struct net_device *netdev, int test, | |||
| 1345 | } | 1346 | } |
| 1346 | 1347 | ||
| 1347 | if (adapter->ahw->diag_test == QLCNIC_LOOPBACK_TEST) { | 1348 | if (adapter->ahw->diag_test == QLCNIC_LOOPBACK_TEST) { |
| 1348 | /* disable and free mailbox interrupt */ | ||
| 1349 | if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) { | ||
| 1350 | qlcnic_83xx_enable_mbx_poll(adapter); | ||
| 1351 | qlcnic_83xx_free_mbx_intr(adapter); | ||
| 1352 | } | ||
| 1353 | adapter->ahw->loopback_state = 0; | 1349 | adapter->ahw->loopback_state = 0; |
| 1354 | adapter->ahw->hw_ops->setup_link_event(adapter, 1); | 1350 | adapter->ahw->hw_ops->setup_link_event(adapter, 1); |
| 1355 | } | 1351 | } |
| @@ -1363,33 +1359,20 @@ static void qlcnic_83xx_diag_free_res(struct net_device *netdev, | |||
| 1363 | { | 1359 | { |
| 1364 | struct qlcnic_adapter *adapter = netdev_priv(netdev); | 1360 | struct qlcnic_adapter *adapter = netdev_priv(netdev); |
| 1365 | struct qlcnic_host_sds_ring *sds_ring; | 1361 | struct qlcnic_host_sds_ring *sds_ring; |
| 1366 | int ring, err; | 1362 | int ring; |
| 1367 | 1363 | ||
| 1368 | clear_bit(__QLCNIC_DEV_UP, &adapter->state); | 1364 | clear_bit(__QLCNIC_DEV_UP, &adapter->state); |
| 1369 | if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) { | 1365 | if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) { |
| 1370 | for (ring = 0; ring < adapter->drv_sds_rings; ring++) { | 1366 | for (ring = 0; ring < adapter->drv_sds_rings; ring++) { |
| 1371 | sds_ring = &adapter->recv_ctx->sds_rings[ring]; | 1367 | sds_ring = &adapter->recv_ctx->sds_rings[ring]; |
| 1372 | qlcnic_83xx_disable_intr(adapter, sds_ring); | 1368 | if (adapter->flags & QLCNIC_MSIX_ENABLED) |
| 1373 | if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) | 1369 | qlcnic_83xx_disable_intr(adapter, sds_ring); |
| 1374 | qlcnic_83xx_enable_mbx_poll(adapter); | ||
| 1375 | } | 1370 | } |
| 1376 | } | 1371 | } |
| 1377 | 1372 | ||
| 1378 | qlcnic_fw_destroy_ctx(adapter); | 1373 | qlcnic_fw_destroy_ctx(adapter); |
| 1379 | qlcnic_detach(adapter); | 1374 | qlcnic_detach(adapter); |
| 1380 | 1375 | ||
| 1381 | if (adapter->ahw->diag_test == QLCNIC_LOOPBACK_TEST) { | ||
| 1382 | if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) { | ||
| 1383 | err = qlcnic_83xx_setup_mbx_intr(adapter); | ||
| 1384 | qlcnic_83xx_disable_mbx_poll(adapter); | ||
| 1385 | if (err) { | ||
| 1386 | dev_err(&adapter->pdev->dev, | ||
| 1387 | "%s: failed to setup mbx interrupt\n", | ||
| 1388 | __func__); | ||
| 1389 | goto out; | ||
| 1390 | } | ||
| 1391 | } | ||
| 1392 | } | ||
| 1393 | adapter->ahw->diag_test = 0; | 1376 | adapter->ahw->diag_test = 0; |
| 1394 | adapter->drv_sds_rings = drv_sds_rings; | 1377 | adapter->drv_sds_rings = drv_sds_rings; |
| 1395 | 1378 | ||
| @@ -1399,9 +1382,6 @@ static void qlcnic_83xx_diag_free_res(struct net_device *netdev, | |||
| 1399 | if (netif_running(netdev)) | 1382 | if (netif_running(netdev)) |
| 1400 | __qlcnic_up(adapter, netdev); | 1383 | __qlcnic_up(adapter, netdev); |
| 1401 | 1384 | ||
| 1402 | if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST && | ||
| 1403 | !(adapter->flags & QLCNIC_MSIX_ENABLED)) | ||
| 1404 | qlcnic_83xx_disable_mbx_poll(adapter); | ||
| 1405 | out: | 1385 | out: |
| 1406 | netif_device_attach(netdev); | 1386 | netif_device_attach(netdev); |
| 1407 | } | 1387 | } |
| @@ -3754,6 +3734,19 @@ static void qlcnic_83xx_decode_mbx_rsp(struct qlcnic_adapter *adapter, | |||
| 3754 | return; | 3734 | return; |
| 3755 | } | 3735 | } |
| 3756 | 3736 | ||
| 3737 | static inline void qlcnic_dump_mailbox_registers(struct qlcnic_adapter *adapter) | ||
| 3738 | { | ||
| 3739 | struct qlcnic_hardware_context *ahw = adapter->ahw; | ||
| 3740 | u32 offset; | ||
| 3741 | |||
| 3742 | offset = QLCRDX(ahw, QLCNIC_DEF_INT_MASK); | ||
| 3743 | dev_info(&adapter->pdev->dev, "Mbx interrupt mask=0x%x, Mbx interrupt enable=0x%x, Host mbx control=0x%x, Fw mbx control=0x%x", | ||
| 3744 | readl(ahw->pci_base0 + offset), | ||
| 3745 | QLCRDX(ahw, QLCNIC_MBX_INTR_ENBL), | ||
| 3746 | QLCRDX(ahw, QLCNIC_HOST_MBX_CTRL), | ||
| 3747 | QLCRDX(ahw, QLCNIC_FW_MBX_CTRL)); | ||
| 3748 | } | ||
| 3749 | |||
| 3757 | static void qlcnic_83xx_mailbox_worker(struct work_struct *work) | 3750 | static void qlcnic_83xx_mailbox_worker(struct work_struct *work) |
| 3758 | { | 3751 | { |
| 3759 | struct qlcnic_mailbox *mbx = container_of(work, struct qlcnic_mailbox, | 3752 | struct qlcnic_mailbox *mbx = container_of(work, struct qlcnic_mailbox, |
| @@ -3798,6 +3791,8 @@ static void qlcnic_83xx_mailbox_worker(struct work_struct *work) | |||
| 3798 | __func__, cmd->cmd_op, cmd->type, ahw->pci_func, | 3791 | __func__, cmd->cmd_op, cmd->type, ahw->pci_func, |
| 3799 | ahw->op_mode); | 3792 | ahw->op_mode); |
| 3800 | clear_bit(QLC_83XX_MBX_READY, &mbx->status); | 3793 | clear_bit(QLC_83XX_MBX_READY, &mbx->status); |
| 3794 | qlcnic_dump_mailbox_registers(adapter); | ||
| 3795 | qlcnic_83xx_get_mbx_data(adapter, cmd); | ||
| 3801 | qlcnic_dump_mbx(adapter, cmd); | 3796 | qlcnic_dump_mbx(adapter, cmd); |
| 3802 | qlcnic_83xx_idc_request_reset(adapter, | 3797 | qlcnic_83xx_idc_request_reset(adapter, |
| 3803 | QLCNIC_FORCE_FW_DUMP_KEY); | 3798 | QLCNIC_FORCE_FW_DUMP_KEY); |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h index 4cae6caa6bfa..a6a33508e401 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h | |||
| @@ -662,4 +662,5 @@ pci_ers_result_t qlcnic_83xx_io_error_detected(struct pci_dev *, | |||
| 662 | pci_channel_state_t); | 662 | pci_channel_state_t); |
| 663 | pci_ers_result_t qlcnic_83xx_io_slot_reset(struct pci_dev *); | 663 | pci_ers_result_t qlcnic_83xx_io_slot_reset(struct pci_dev *); |
| 664 | void qlcnic_83xx_io_resume(struct pci_dev *); | 664 | void qlcnic_83xx_io_resume(struct pci_dev *); |
| 665 | void qlcnic_83xx_stop_hw(struct qlcnic_adapter *); | ||
| 665 | #endif | 666 | #endif |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c index 89208e5b25d6..918e18ddf038 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c | |||
| @@ -740,6 +740,7 @@ static int qlcnic_83xx_idc_unknown_state(struct qlcnic_adapter *adapter) | |||
| 740 | adapter->ahw->idc.err_code = -EIO; | 740 | adapter->ahw->idc.err_code = -EIO; |
| 741 | dev_err(&adapter->pdev->dev, | 741 | dev_err(&adapter->pdev->dev, |
| 742 | "%s: Device in unknown state\n", __func__); | 742 | "%s: Device in unknown state\n", __func__); |
| 743 | clear_bit(__QLCNIC_RESETTING, &adapter->state); | ||
| 743 | return 0; | 744 | return 0; |
| 744 | } | 745 | } |
| 745 | 746 | ||
| @@ -818,7 +819,6 @@ static int qlcnic_83xx_idc_ready_state(struct qlcnic_adapter *adapter) | |||
| 818 | struct qlcnic_hardware_context *ahw = adapter->ahw; | 819 | struct qlcnic_hardware_context *ahw = adapter->ahw; |
| 819 | struct qlcnic_mailbox *mbx = ahw->mailbox; | 820 | struct qlcnic_mailbox *mbx = ahw->mailbox; |
| 820 | int ret = 0; | 821 | int ret = 0; |
| 821 | u32 owner; | ||
| 822 | u32 val; | 822 | u32 val; |
| 823 | 823 | ||
| 824 | /* Perform NIC configuration based ready state entry actions */ | 824 | /* Perform NIC configuration based ready state entry actions */ |
| @@ -848,9 +848,9 @@ static int qlcnic_83xx_idc_ready_state(struct qlcnic_adapter *adapter) | |||
| 848 | set_bit(__QLCNIC_RESETTING, &adapter->state); | 848 | set_bit(__QLCNIC_RESETTING, &adapter->state); |
| 849 | qlcnic_83xx_idc_enter_need_reset_state(adapter, 1); | 849 | qlcnic_83xx_idc_enter_need_reset_state(adapter, 1); |
| 850 | } else { | 850 | } else { |
| 851 | owner = qlcnic_83xx_idc_find_reset_owner_id(adapter); | 851 | netdev_info(adapter->netdev, "%s: Auto firmware recovery is disabled\n", |
| 852 | if (ahw->pci_func == owner) | 852 | __func__); |
| 853 | qlcnic_dump_fw(adapter); | 853 | qlcnic_83xx_idc_enter_failed_state(adapter, 1); |
| 854 | } | 854 | } |
| 855 | return -EIO; | 855 | return -EIO; |
| 856 | } | 856 | } |
| @@ -948,13 +948,26 @@ static int qlcnic_83xx_idc_need_quiesce_state(struct qlcnic_adapter *adapter) | |||
| 948 | return 0; | 948 | return 0; |
| 949 | } | 949 | } |
| 950 | 950 | ||
| 951 | static int qlcnic_83xx_idc_failed_state(struct qlcnic_adapter *adapter) | 951 | static void qlcnic_83xx_idc_failed_state(struct qlcnic_adapter *adapter) |
| 952 | { | 952 | { |
| 953 | dev_err(&adapter->pdev->dev, "%s: please restart!!\n", __func__); | 953 | struct qlcnic_hardware_context *ahw = adapter->ahw; |
| 954 | u32 val, owner; | ||
| 955 | |||
| 956 | val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL); | ||
| 957 | if (val & QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY) { | ||
| 958 | owner = qlcnic_83xx_idc_find_reset_owner_id(adapter); | ||
| 959 | if (ahw->pci_func == owner) { | ||
| 960 | qlcnic_83xx_stop_hw(adapter); | ||
| 961 | qlcnic_dump_fw(adapter); | ||
| 962 | } | ||
| 963 | } | ||
| 964 | |||
| 965 | netdev_warn(adapter->netdev, "%s: Reboot will be required to recover the adapter!!\n", | ||
| 966 | __func__); | ||
| 954 | clear_bit(__QLCNIC_RESETTING, &adapter->state); | 967 | clear_bit(__QLCNIC_RESETTING, &adapter->state); |
| 955 | adapter->ahw->idc.err_code = -EIO; | 968 | ahw->idc.err_code = -EIO; |
| 956 | 969 | ||
| 957 | return 0; | 970 | return; |
| 958 | } | 971 | } |
| 959 | 972 | ||
| 960 | static int qlcnic_83xx_idc_quiesce_state(struct qlcnic_adapter *adapter) | 973 | static int qlcnic_83xx_idc_quiesce_state(struct qlcnic_adapter *adapter) |
| @@ -1063,12 +1076,6 @@ void qlcnic_83xx_idc_poll_dev_state(struct work_struct *work) | |||
| 1063 | adapter->ahw->idc.prev_state = adapter->ahw->idc.curr_state; | 1076 | adapter->ahw->idc.prev_state = adapter->ahw->idc.curr_state; |
| 1064 | qlcnic_83xx_periodic_tasks(adapter); | 1077 | qlcnic_83xx_periodic_tasks(adapter); |
| 1065 | 1078 | ||
| 1066 | /* Do not reschedule if firmaware is in hanged state and auto | ||
| 1067 | * recovery is disabled | ||
| 1068 | */ | ||
| 1069 | if ((adapter->flags & QLCNIC_FW_HANG) && !qlcnic_auto_fw_reset) | ||
| 1070 | return; | ||
| 1071 | |||
| 1072 | /* Re-schedule the function */ | 1079 | /* Re-schedule the function */ |
| 1073 | if (test_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status)) | 1080 | if (test_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status)) |
| 1074 | qlcnic_schedule_work(adapter, qlcnic_83xx_idc_poll_dev_state, | 1081 | qlcnic_schedule_work(adapter, qlcnic_83xx_idc_poll_dev_state, |
| @@ -1219,10 +1226,10 @@ void qlcnic_83xx_idc_request_reset(struct qlcnic_adapter *adapter, u32 key) | |||
| 1219 | } | 1226 | } |
| 1220 | 1227 | ||
| 1221 | val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL); | 1228 | val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL); |
| 1222 | if ((val & QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY) || | 1229 | if (val & QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY) { |
| 1223 | !qlcnic_auto_fw_reset) { | 1230 | netdev_info(adapter->netdev, "%s: Auto firmware recovery is disabled\n", |
| 1224 | dev_err(&adapter->pdev->dev, | 1231 | __func__); |
| 1225 | "%s:failed, device in non reset mode\n", __func__); | 1232 | qlcnic_83xx_idc_enter_failed_state(adapter, 0); |
| 1226 | qlcnic_83xx_unlock_driver(adapter); | 1233 | qlcnic_83xx_unlock_driver(adapter); |
| 1227 | return; | 1234 | return; |
| 1228 | } | 1235 | } |
| @@ -1254,24 +1261,24 @@ static int qlcnic_83xx_copy_bootloader(struct qlcnic_adapter *adapter) | |||
| 1254 | if (size & 0xF) | 1261 | if (size & 0xF) |
| 1255 | size = (size + 16) & ~0xF; | 1262 | size = (size + 16) & ~0xF; |
| 1256 | 1263 | ||
| 1257 | p_cache = kzalloc(size, GFP_KERNEL); | 1264 | p_cache = vzalloc(size); |
| 1258 | if (p_cache == NULL) | 1265 | if (p_cache == NULL) |
| 1259 | return -ENOMEM; | 1266 | return -ENOMEM; |
| 1260 | 1267 | ||
| 1261 | ret = qlcnic_83xx_lockless_flash_read32(adapter, src, p_cache, | 1268 | ret = qlcnic_83xx_lockless_flash_read32(adapter, src, p_cache, |
| 1262 | size / sizeof(u32)); | 1269 | size / sizeof(u32)); |
| 1263 | if (ret) { | 1270 | if (ret) { |
| 1264 | kfree(p_cache); | 1271 | vfree(p_cache); |
| 1265 | return ret; | 1272 | return ret; |
| 1266 | } | 1273 | } |
| 1267 | /* 16 byte write to MS memory */ | 1274 | /* 16 byte write to MS memory */ |
| 1268 | ret = qlcnic_83xx_ms_mem_write128(adapter, dest, (u32 *)p_cache, | 1275 | ret = qlcnic_83xx_ms_mem_write128(adapter, dest, (u32 *)p_cache, |
| 1269 | size / 16); | 1276 | size / 16); |
| 1270 | if (ret) { | 1277 | if (ret) { |
| 1271 | kfree(p_cache); | 1278 | vfree(p_cache); |
| 1272 | return ret; | 1279 | return ret; |
| 1273 | } | 1280 | } |
| 1274 | kfree(p_cache); | 1281 | vfree(p_cache); |
| 1275 | 1282 | ||
| 1276 | return ret; | 1283 | return ret; |
| 1277 | } | 1284 | } |
| @@ -1939,7 +1946,7 @@ static void qlcnic_83xx_exec_template_cmd(struct qlcnic_adapter *p_dev, | |||
| 1939 | p_dev->ahw->reset.seq_index = index; | 1946 | p_dev->ahw->reset.seq_index = index; |
| 1940 | } | 1947 | } |
| 1941 | 1948 | ||
| 1942 | static void qlcnic_83xx_stop_hw(struct qlcnic_adapter *p_dev) | 1949 | void qlcnic_83xx_stop_hw(struct qlcnic_adapter *p_dev) |
| 1943 | { | 1950 | { |
| 1944 | p_dev->ahw->reset.seq_index = 0; | 1951 | p_dev->ahw->reset.seq_index = 0; |
| 1945 | 1952 | ||
| @@ -1994,6 +2001,14 @@ static int qlcnic_83xx_restart_hw(struct qlcnic_adapter *adapter) | |||
| 1994 | val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL); | 2001 | val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL); |
| 1995 | if (!(val & QLC_83XX_IDC_GRACEFULL_RESET)) | 2002 | if (!(val & QLC_83XX_IDC_GRACEFULL_RESET)) |
| 1996 | qlcnic_dump_fw(adapter); | 2003 | qlcnic_dump_fw(adapter); |
| 2004 | |||
| 2005 | if (val & QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY) { | ||
| 2006 | netdev_info(adapter->netdev, "%s: Auto firmware recovery is disabled\n", | ||
| 2007 | __func__); | ||
| 2008 | qlcnic_83xx_idc_enter_failed_state(adapter, 1); | ||
| 2009 | return err; | ||
| 2010 | } | ||
| 2011 | |||
| 1997 | qlcnic_83xx_init_hw(adapter); | 2012 | qlcnic_83xx_init_hw(adapter); |
| 1998 | 2013 | ||
| 1999 | if (qlcnic_83xx_copy_bootloader(adapter)) | 2014 | if (qlcnic_83xx_copy_bootloader(adapter)) |
| @@ -2073,8 +2088,8 @@ int qlcnic_83xx_configure_opmode(struct qlcnic_adapter *adapter) | |||
| 2073 | ahw->nic_mode = QLCNIC_DEFAULT_MODE; | 2088 | ahw->nic_mode = QLCNIC_DEFAULT_MODE; |
| 2074 | adapter->nic_ops->init_driver = qlcnic_83xx_init_default_driver; | 2089 | adapter->nic_ops->init_driver = qlcnic_83xx_init_default_driver; |
| 2075 | ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry; | 2090 | ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry; |
| 2076 | adapter->max_sds_rings = ahw->max_rx_ques; | 2091 | adapter->max_sds_rings = QLCNIC_MAX_SDS_RINGS; |
| 2077 | adapter->max_tx_rings = ahw->max_tx_ques; | 2092 | adapter->max_tx_rings = QLCNIC_MAX_TX_RINGS; |
| 2078 | } else { | 2093 | } else { |
| 2079 | return -EIO; | 2094 | return -EIO; |
| 2080 | } | 2095 | } |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c index b36c02fafcfd..e3be2760665c 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c | |||
| @@ -667,30 +667,25 @@ qlcnic_set_ringparam(struct net_device *dev, | |||
| 667 | static int qlcnic_validate_ring_count(struct qlcnic_adapter *adapter, | 667 | static int qlcnic_validate_ring_count(struct qlcnic_adapter *adapter, |
| 668 | u8 rx_ring, u8 tx_ring) | 668 | u8 rx_ring, u8 tx_ring) |
| 669 | { | 669 | { |
| 670 | if (rx_ring == 0 || tx_ring == 0) | ||
| 671 | return -EINVAL; | ||
| 672 | |||
| 670 | if (rx_ring != 0) { | 673 | if (rx_ring != 0) { |
| 671 | if (rx_ring > adapter->max_sds_rings) { | 674 | if (rx_ring > adapter->max_sds_rings) { |
| 672 | netdev_err(adapter->netdev, "Invalid ring count, SDS ring count %d should not be greater than max %d driver sds rings.\n", | 675 | netdev_err(adapter->netdev, |
| 676 | "Invalid ring count, SDS ring count %d should not be greater than max %d driver sds rings.\n", | ||
| 673 | rx_ring, adapter->max_sds_rings); | 677 | rx_ring, adapter->max_sds_rings); |
| 674 | return -EINVAL; | 678 | return -EINVAL; |
| 675 | } | 679 | } |
| 676 | } | 680 | } |
| 677 | 681 | ||
| 678 | if (tx_ring != 0) { | 682 | if (tx_ring != 0) { |
| 679 | if (qlcnic_82xx_check(adapter) && | 683 | if (tx_ring > adapter->max_tx_rings) { |
| 680 | (tx_ring > adapter->max_tx_rings)) { | ||
| 681 | netdev_err(adapter->netdev, | 684 | netdev_err(adapter->netdev, |
| 682 | "Invalid ring count, Tx ring count %d should not be greater than max %d driver Tx rings.\n", | 685 | "Invalid ring count, Tx ring count %d should not be greater than max %d driver Tx rings.\n", |
| 683 | tx_ring, adapter->max_tx_rings); | 686 | tx_ring, adapter->max_tx_rings); |
| 684 | return -EINVAL; | 687 | return -EINVAL; |
| 685 | } | 688 | } |
| 686 | |||
| 687 | if (qlcnic_83xx_check(adapter) && | ||
| 688 | (tx_ring > QLCNIC_SINGLE_RING)) { | ||
| 689 | netdev_err(adapter->netdev, | ||
| 690 | "Invalid ring count, Tx ring count %d should not be greater than %d driver Tx rings.\n", | ||
| 691 | tx_ring, QLCNIC_SINGLE_RING); | ||
| 692 | return -EINVAL; | ||
| 693 | } | ||
| 694 | } | 689 | } |
| 695 | 690 | ||
| 696 | return 0; | 691 | return 0; |
| @@ -948,6 +943,7 @@ static int qlcnic_irq_test(struct net_device *netdev) | |||
| 948 | struct qlcnic_hardware_context *ahw = adapter->ahw; | 943 | struct qlcnic_hardware_context *ahw = adapter->ahw; |
| 949 | struct qlcnic_cmd_args cmd; | 944 | struct qlcnic_cmd_args cmd; |
| 950 | int ret, drv_sds_rings = adapter->drv_sds_rings; | 945 | int ret, drv_sds_rings = adapter->drv_sds_rings; |
| 946 | int drv_tx_rings = adapter->drv_tx_rings; | ||
| 951 | 947 | ||
| 952 | if (qlcnic_83xx_check(adapter)) | 948 | if (qlcnic_83xx_check(adapter)) |
| 953 | return qlcnic_83xx_interrupt_test(netdev); | 949 | return qlcnic_83xx_interrupt_test(netdev); |
| @@ -980,6 +976,7 @@ free_diag_res: | |||
| 980 | 976 | ||
| 981 | clear_diag_irq: | 977 | clear_diag_irq: |
| 982 | adapter->drv_sds_rings = drv_sds_rings; | 978 | adapter->drv_sds_rings = drv_sds_rings; |
| 979 | adapter->drv_tx_rings = drv_tx_rings; | ||
| 983 | clear_bit(__QLCNIC_RESETTING, &adapter->state); | 980 | clear_bit(__QLCNIC_RESETTING, &adapter->state); |
| 984 | 981 | ||
| 985 | return ret; | 982 | return ret; |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c index 0149c9495347..eda6c691d897 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c | |||
| @@ -687,17 +687,11 @@ void qlcnic_advert_link_change(struct qlcnic_adapter *adapter, int linkup) | |||
| 687 | if (adapter->ahw->linkup && !linkup) { | 687 | if (adapter->ahw->linkup && !linkup) { |
| 688 | netdev_info(netdev, "NIC Link is down\n"); | 688 | netdev_info(netdev, "NIC Link is down\n"); |
| 689 | adapter->ahw->linkup = 0; | 689 | adapter->ahw->linkup = 0; |
| 690 | if (netif_running(netdev)) { | 690 | netif_carrier_off(netdev); |
| 691 | netif_carrier_off(netdev); | ||
| 692 | netif_tx_stop_all_queues(netdev); | ||
| 693 | } | ||
| 694 | } else if (!adapter->ahw->linkup && linkup) { | 691 | } else if (!adapter->ahw->linkup && linkup) { |
| 695 | netdev_info(netdev, "NIC Link is up\n"); | 692 | netdev_info(netdev, "NIC Link is up\n"); |
| 696 | adapter->ahw->linkup = 1; | 693 | adapter->ahw->linkup = 1; |
| 697 | if (netif_running(netdev)) { | 694 | netif_carrier_on(netdev); |
| 698 | netif_carrier_on(netdev); | ||
| 699 | netif_wake_queue(netdev); | ||
| 700 | } | ||
| 701 | } | 695 | } |
| 702 | } | 696 | } |
| 703 | 697 | ||
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c index 05c1eef8df13..2c8cac0c6a55 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | |||
| @@ -1178,6 +1178,7 @@ qlcnic_initialize_nic(struct qlcnic_adapter *adapter) | |||
| 1178 | } else { | 1178 | } else { |
| 1179 | adapter->ahw->nic_mode = QLCNIC_DEFAULT_MODE; | 1179 | adapter->ahw->nic_mode = QLCNIC_DEFAULT_MODE; |
| 1180 | adapter->max_tx_rings = QLCNIC_MAX_HW_TX_RINGS; | 1180 | adapter->max_tx_rings = QLCNIC_MAX_HW_TX_RINGS; |
| 1181 | adapter->max_sds_rings = QLCNIC_MAX_SDS_RINGS; | ||
| 1181 | adapter->flags &= ~QLCNIC_ESWITCH_ENABLED; | 1182 | adapter->flags &= ~QLCNIC_ESWITCH_ENABLED; |
| 1182 | } | 1183 | } |
| 1183 | 1184 | ||
| @@ -1940,7 +1941,6 @@ int qlcnic_diag_alloc_res(struct net_device *netdev, int test) | |||
| 1940 | qlcnic_detach(adapter); | 1941 | qlcnic_detach(adapter); |
| 1941 | 1942 | ||
| 1942 | adapter->drv_sds_rings = QLCNIC_SINGLE_RING; | 1943 | adapter->drv_sds_rings = QLCNIC_SINGLE_RING; |
| 1943 | adapter->drv_tx_rings = QLCNIC_SINGLE_RING; | ||
| 1944 | adapter->ahw->diag_test = test; | 1944 | adapter->ahw->diag_test = test; |
| 1945 | adapter->ahw->linkup = 0; | 1945 | adapter->ahw->linkup = 0; |
| 1946 | 1946 | ||
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c index 524f713f6017..f8135725bcf6 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c | |||
| @@ -327,7 +327,6 @@ static int netvsc_change_mtu(struct net_device *ndev, int mtu) | |||
| 327 | return -EINVAL; | 327 | return -EINVAL; |
| 328 | 328 | ||
| 329 | nvdev->start_remove = true; | 329 | nvdev->start_remove = true; |
| 330 | cancel_delayed_work_sync(&ndevctx->dwork); | ||
| 331 | cancel_work_sync(&ndevctx->work); | 330 | cancel_work_sync(&ndevctx->work); |
| 332 | netif_tx_disable(ndev); | 331 | netif_tx_disable(ndev); |
| 333 | rndis_filter_device_remove(hdev); | 332 | rndis_filter_device_remove(hdev); |
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index e884ee1fe7ed..27bbe58dcbe7 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c | |||
| @@ -1197,6 +1197,9 @@ static int checksum_setup_ip(struct xenvif *vif, struct sk_buff *skb, | |||
| 1197 | 1197 | ||
| 1198 | err = -EPROTO; | 1198 | err = -EPROTO; |
| 1199 | 1199 | ||
| 1200 | if (fragment) | ||
| 1201 | goto out; | ||
| 1202 | |||
| 1200 | switch (ip_hdr(skb)->protocol) { | 1203 | switch (ip_hdr(skb)->protocol) { |
| 1201 | case IPPROTO_TCP: | 1204 | case IPPROTO_TCP: |
| 1202 | err = maybe_pull_tail(skb, | 1205 | err = maybe_pull_tail(skb, |
diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig index a344f3d52361..330ef2d06567 100644 --- a/drivers/phy/Kconfig +++ b/drivers/phy/Kconfig | |||
| @@ -24,8 +24,8 @@ config PHY_EXYNOS_MIPI_VIDEO | |||
| 24 | config OMAP_USB2 | 24 | config OMAP_USB2 |
| 25 | tristate "OMAP USB2 PHY Driver" | 25 | tristate "OMAP USB2 PHY Driver" |
| 26 | depends on ARCH_OMAP2PLUS | 26 | depends on ARCH_OMAP2PLUS |
| 27 | depends on USB_PHY | ||
| 27 | select GENERIC_PHY | 28 | select GENERIC_PHY |
| 28 | select USB_PHY | ||
| 29 | select OMAP_CONTROL_USB | 29 | select OMAP_CONTROL_USB |
| 30 | help | 30 | help |
| 31 | Enable this to support the transceiver that is part of SOC. This | 31 | Enable this to support the transceiver that is part of SOC. This |
| @@ -36,8 +36,8 @@ config OMAP_USB2 | |||
| 36 | config TWL4030_USB | 36 | config TWL4030_USB |
| 37 | tristate "TWL4030 USB Transceiver Driver" | 37 | tristate "TWL4030 USB Transceiver Driver" |
| 38 | depends on TWL4030_CORE && REGULATOR_TWL4030 && USB_MUSB_OMAP2PLUS | 38 | depends on TWL4030_CORE && REGULATOR_TWL4030 && USB_MUSB_OMAP2PLUS |
| 39 | depends on USB_PHY | ||
| 39 | select GENERIC_PHY | 40 | select GENERIC_PHY |
| 40 | select USB_PHY | ||
| 41 | help | 41 | help |
| 42 | Enable this to support the USB OTG transceiver on TWL4030 | 42 | Enable this to support the USB OTG transceiver on TWL4030 |
| 43 | family chips (including the TWL5030 and TPS659x0 devices). | 43 | family chips (including the TWL5030 and TPS659x0 devices). |
diff --git a/drivers/phy/phy-core.c b/drivers/phy/phy-core.c index 03cf8fb81554..58e0e9739028 100644 --- a/drivers/phy/phy-core.c +++ b/drivers/phy/phy-core.c | |||
| @@ -437,23 +437,18 @@ struct phy *phy_create(struct device *dev, const struct phy_ops *ops, | |||
| 437 | int id; | 437 | int id; |
| 438 | struct phy *phy; | 438 | struct phy *phy; |
| 439 | 439 | ||
| 440 | if (!dev) { | 440 | if (WARN_ON(!dev)) |
| 441 | dev_WARN(dev, "no device provided for PHY\n"); | 441 | return ERR_PTR(-EINVAL); |
| 442 | ret = -EINVAL; | ||
| 443 | goto err0; | ||
| 444 | } | ||
| 445 | 442 | ||
| 446 | phy = kzalloc(sizeof(*phy), GFP_KERNEL); | 443 | phy = kzalloc(sizeof(*phy), GFP_KERNEL); |
| 447 | if (!phy) { | 444 | if (!phy) |
| 448 | ret = -ENOMEM; | 445 | return ERR_PTR(-ENOMEM); |
| 449 | goto err0; | ||
| 450 | } | ||
| 451 | 446 | ||
| 452 | id = ida_simple_get(&phy_ida, 0, 0, GFP_KERNEL); | 447 | id = ida_simple_get(&phy_ida, 0, 0, GFP_KERNEL); |
| 453 | if (id < 0) { | 448 | if (id < 0) { |
| 454 | dev_err(dev, "unable to get id\n"); | 449 | dev_err(dev, "unable to get id\n"); |
| 455 | ret = id; | 450 | ret = id; |
| 456 | goto err0; | 451 | goto free_phy; |
| 457 | } | 452 | } |
| 458 | 453 | ||
| 459 | device_initialize(&phy->dev); | 454 | device_initialize(&phy->dev); |
| @@ -468,11 +463,11 @@ struct phy *phy_create(struct device *dev, const struct phy_ops *ops, | |||
| 468 | 463 | ||
| 469 | ret = dev_set_name(&phy->dev, "phy-%s.%d", dev_name(dev), id); | 464 | ret = dev_set_name(&phy->dev, "phy-%s.%d", dev_name(dev), id); |
| 470 | if (ret) | 465 | if (ret) |
| 471 | goto err1; | 466 | goto put_dev; |
| 472 | 467 | ||
| 473 | ret = device_add(&phy->dev); | 468 | ret = device_add(&phy->dev); |
| 474 | if (ret) | 469 | if (ret) |
| 475 | goto err1; | 470 | goto put_dev; |
| 476 | 471 | ||
| 477 | if (pm_runtime_enabled(dev)) { | 472 | if (pm_runtime_enabled(dev)) { |
| 478 | pm_runtime_enable(&phy->dev); | 473 | pm_runtime_enable(&phy->dev); |
| @@ -481,12 +476,11 @@ struct phy *phy_create(struct device *dev, const struct phy_ops *ops, | |||
| 481 | 476 | ||
| 482 | return phy; | 477 | return phy; |
| 483 | 478 | ||
| 484 | err1: | 479 | put_dev: |
| 485 | ida_remove(&phy_ida, phy->id); | ||
| 486 | put_device(&phy->dev); | 480 | put_device(&phy->dev); |
| 481 | ida_remove(&phy_ida, phy->id); | ||
| 482 | free_phy: | ||
| 487 | kfree(phy); | 483 | kfree(phy); |
| 488 | |||
| 489 | err0: | ||
| 490 | return ERR_PTR(ret); | 484 | return ERR_PTR(ret); |
| 491 | } | 485 | } |
| 492 | EXPORT_SYMBOL_GPL(phy_create); | 486 | EXPORT_SYMBOL_GPL(phy_create); |
diff --git a/drivers/pinctrl/sh-pfc/sh_pfc.h b/drivers/pinctrl/sh-pfc/sh_pfc.h index 11bd0d970a52..e2142956a8e5 100644 --- a/drivers/pinctrl/sh-pfc/sh_pfc.h +++ b/drivers/pinctrl/sh-pfc/sh_pfc.h | |||
| @@ -254,7 +254,7 @@ struct sh_pfc_soc_info { | |||
| 254 | #define PINMUX_GPIO(_pin) \ | 254 | #define PINMUX_GPIO(_pin) \ |
| 255 | [GPIO_##_pin] = { \ | 255 | [GPIO_##_pin] = { \ |
| 256 | .pin = (u16)-1, \ | 256 | .pin = (u16)-1, \ |
| 257 | .name = __stringify(name), \ | 257 | .name = __stringify(GPIO_##_pin), \ |
| 258 | .enum_id = _pin##_DATA, \ | 258 | .enum_id = _pin##_DATA, \ |
| 259 | } | 259 | } |
| 260 | 260 | ||
diff --git a/drivers/regulator/s2mps11.c b/drivers/regulator/s2mps11.c index 333677d68d0e..9e61922d8230 100644 --- a/drivers/regulator/s2mps11.c +++ b/drivers/regulator/s2mps11.c | |||
| @@ -438,7 +438,7 @@ common_reg: | |||
| 438 | platform_set_drvdata(pdev, s2mps11); | 438 | platform_set_drvdata(pdev, s2mps11); |
| 439 | 439 | ||
| 440 | config.dev = &pdev->dev; | 440 | config.dev = &pdev->dev; |
| 441 | config.regmap = iodev->regmap; | 441 | config.regmap = iodev->regmap_pmic; |
| 442 | config.driver_data = s2mps11; | 442 | config.driver_data = s2mps11; |
| 443 | for (i = 0; i < S2MPS11_REGULATOR_MAX; i++) { | 443 | for (i = 0; i < S2MPS11_REGULATOR_MAX; i++) { |
| 444 | if (!reg_np) { | 444 | if (!reg_np) { |
diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c index 596480022b0a..38a1257e76e1 100644 --- a/drivers/scsi/qla2xxx/qla_target.c +++ b/drivers/scsi/qla2xxx/qla_target.c | |||
| @@ -471,7 +471,7 @@ static void qlt_schedule_sess_for_deletion(struct qla_tgt_sess *sess, | |||
| 471 | schedule_delayed_work(&tgt->sess_del_work, 0); | 471 | schedule_delayed_work(&tgt->sess_del_work, 0); |
| 472 | else | 472 | else |
| 473 | schedule_delayed_work(&tgt->sess_del_work, | 473 | schedule_delayed_work(&tgt->sess_del_work, |
| 474 | jiffies - sess->expires); | 474 | sess->expires - jiffies); |
| 475 | } | 475 | } |
| 476 | 476 | ||
| 477 | /* ha->hardware_lock supposed to be held on entry */ | 477 | /* ha->hardware_lock supposed to be held on entry */ |
| @@ -550,13 +550,14 @@ static void qlt_del_sess_work_fn(struct delayed_work *work) | |||
| 550 | struct scsi_qla_host *vha = tgt->vha; | 550 | struct scsi_qla_host *vha = tgt->vha; |
| 551 | struct qla_hw_data *ha = vha->hw; | 551 | struct qla_hw_data *ha = vha->hw; |
| 552 | struct qla_tgt_sess *sess; | 552 | struct qla_tgt_sess *sess; |
| 553 | unsigned long flags; | 553 | unsigned long flags, elapsed; |
| 554 | 554 | ||
| 555 | spin_lock_irqsave(&ha->hardware_lock, flags); | 555 | spin_lock_irqsave(&ha->hardware_lock, flags); |
| 556 | while (!list_empty(&tgt->del_sess_list)) { | 556 | while (!list_empty(&tgt->del_sess_list)) { |
| 557 | sess = list_entry(tgt->del_sess_list.next, typeof(*sess), | 557 | sess = list_entry(tgt->del_sess_list.next, typeof(*sess), |
| 558 | del_list_entry); | 558 | del_list_entry); |
| 559 | if (time_after_eq(jiffies, sess->expires)) { | 559 | elapsed = jiffies; |
| 560 | if (time_after_eq(elapsed, sess->expires)) { | ||
| 560 | qlt_undelete_sess(sess); | 561 | qlt_undelete_sess(sess); |
| 561 | 562 | ||
| 562 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf004, | 563 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf004, |
| @@ -566,7 +567,7 @@ static void qlt_del_sess_work_fn(struct delayed_work *work) | |||
| 566 | ha->tgt.tgt_ops->put_sess(sess); | 567 | ha->tgt.tgt_ops->put_sess(sess); |
| 567 | } else { | 568 | } else { |
| 568 | schedule_delayed_work(&tgt->sess_del_work, | 569 | schedule_delayed_work(&tgt->sess_del_work, |
| 569 | jiffies - sess->expires); | 570 | sess->expires - elapsed); |
| 570 | break; | 571 | break; |
| 571 | } | 572 | } |
| 572 | } | 573 | } |
| @@ -4290,6 +4291,7 @@ int qlt_lport_register(struct qla_tgt_func_tmpl *qla_tgt_ops, u64 wwpn, | |||
| 4290 | if (rc != 0) { | 4291 | if (rc != 0) { |
| 4291 | ha->tgt.tgt_ops = NULL; | 4292 | ha->tgt.tgt_ops = NULL; |
| 4292 | ha->tgt.target_lport_ptr = NULL; | 4293 | ha->tgt.target_lport_ptr = NULL; |
| 4294 | scsi_host_put(host); | ||
| 4293 | } | 4295 | } |
| 4294 | mutex_unlock(&qla_tgt_mutex); | 4296 | mutex_unlock(&qla_tgt_mutex); |
| 4295 | return rc; | 4297 | return rc; |
diff --git a/drivers/staging/comedi/drivers.c b/drivers/staging/comedi/drivers.c index 8f02bf66e20b..4964d2a2fc7d 100644 --- a/drivers/staging/comedi/drivers.c +++ b/drivers/staging/comedi/drivers.c | |||
| @@ -446,7 +446,7 @@ int comedi_load_firmware(struct comedi_device *dev, | |||
| 446 | release_firmware(fw); | 446 | release_firmware(fw); |
| 447 | } | 447 | } |
| 448 | 448 | ||
| 449 | return ret; | 449 | return ret < 0 ? ret : 0; |
| 450 | } | 450 | } |
| 451 | EXPORT_SYMBOL_GPL(comedi_load_firmware); | 451 | EXPORT_SYMBOL_GPL(comedi_load_firmware); |
| 452 | 452 | ||
diff --git a/drivers/staging/comedi/drivers/8255_pci.c b/drivers/staging/comedi/drivers/8255_pci.c index 432e3f9c3301..c55f234b29e6 100644 --- a/drivers/staging/comedi/drivers/8255_pci.c +++ b/drivers/staging/comedi/drivers/8255_pci.c | |||
| @@ -63,7 +63,8 @@ enum pci_8255_boardid { | |||
| 63 | BOARD_ADLINK_PCI7296, | 63 | BOARD_ADLINK_PCI7296, |
| 64 | BOARD_CB_PCIDIO24, | 64 | BOARD_CB_PCIDIO24, |
| 65 | BOARD_CB_PCIDIO24H, | 65 | BOARD_CB_PCIDIO24H, |
| 66 | BOARD_CB_PCIDIO48H, | 66 | BOARD_CB_PCIDIO48H_OLD, |
| 67 | BOARD_CB_PCIDIO48H_NEW, | ||
| 67 | BOARD_CB_PCIDIO96H, | 68 | BOARD_CB_PCIDIO96H, |
| 68 | BOARD_NI_PCIDIO96, | 69 | BOARD_NI_PCIDIO96, |
| 69 | BOARD_NI_PCIDIO96B, | 70 | BOARD_NI_PCIDIO96B, |
| @@ -106,11 +107,16 @@ static const struct pci_8255_boardinfo pci_8255_boards[] = { | |||
| 106 | .dio_badr = 2, | 107 | .dio_badr = 2, |
| 107 | .n_8255 = 1, | 108 | .n_8255 = 1, |
| 108 | }, | 109 | }, |
| 109 | [BOARD_CB_PCIDIO48H] = { | 110 | [BOARD_CB_PCIDIO48H_OLD] = { |
| 110 | .name = "cb_pci-dio48h", | 111 | .name = "cb_pci-dio48h", |
| 111 | .dio_badr = 1, | 112 | .dio_badr = 1, |
| 112 | .n_8255 = 2, | 113 | .n_8255 = 2, |
| 113 | }, | 114 | }, |
| 115 | [BOARD_CB_PCIDIO48H_NEW] = { | ||
| 116 | .name = "cb_pci-dio48h", | ||
| 117 | .dio_badr = 2, | ||
| 118 | .n_8255 = 2, | ||
| 119 | }, | ||
| 114 | [BOARD_CB_PCIDIO96H] = { | 120 | [BOARD_CB_PCIDIO96H] = { |
| 115 | .name = "cb_pci-dio96h", | 121 | .name = "cb_pci-dio96h", |
| 116 | .dio_badr = 2, | 122 | .dio_badr = 2, |
| @@ -263,7 +269,10 @@ static DEFINE_PCI_DEVICE_TABLE(pci_8255_pci_table) = { | |||
| 263 | { PCI_VDEVICE(ADLINK, 0x7296), BOARD_ADLINK_PCI7296 }, | 269 | { PCI_VDEVICE(ADLINK, 0x7296), BOARD_ADLINK_PCI7296 }, |
| 264 | { PCI_VDEVICE(CB, 0x0028), BOARD_CB_PCIDIO24 }, | 270 | { PCI_VDEVICE(CB, 0x0028), BOARD_CB_PCIDIO24 }, |
| 265 | { PCI_VDEVICE(CB, 0x0014), BOARD_CB_PCIDIO24H }, | 271 | { PCI_VDEVICE(CB, 0x0014), BOARD_CB_PCIDIO24H }, |
| 266 | { PCI_VDEVICE(CB, 0x000b), BOARD_CB_PCIDIO48H }, | 272 | { PCI_DEVICE_SUB(PCI_VENDOR_ID_CB, 0x000b, 0x0000, 0x0000), |
| 273 | .driver_data = BOARD_CB_PCIDIO48H_OLD }, | ||
| 274 | { PCI_DEVICE_SUB(PCI_VENDOR_ID_CB, 0x000b, PCI_VENDOR_ID_CB, 0x000b), | ||
| 275 | .driver_data = BOARD_CB_PCIDIO48H_NEW }, | ||
| 267 | { PCI_VDEVICE(CB, 0x0017), BOARD_CB_PCIDIO96H }, | 276 | { PCI_VDEVICE(CB, 0x0017), BOARD_CB_PCIDIO96H }, |
| 268 | { PCI_VDEVICE(NI, 0x0160), BOARD_NI_PCIDIO96 }, | 277 | { PCI_VDEVICE(NI, 0x0160), BOARD_NI_PCIDIO96 }, |
| 269 | { PCI_VDEVICE(NI, 0x1630), BOARD_NI_PCIDIO96B }, | 278 | { PCI_VDEVICE(NI, 0x1630), BOARD_NI_PCIDIO96B }, |
diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c index 99421f90d189..0485d7f39867 100644 --- a/drivers/staging/iio/magnetometer/hmc5843.c +++ b/drivers/staging/iio/magnetometer/hmc5843.c | |||
| @@ -451,7 +451,12 @@ done: | |||
| 451 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ | 451 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ |
| 452 | BIT(IIO_CHAN_INFO_SAMP_FREQ), \ | 452 | BIT(IIO_CHAN_INFO_SAMP_FREQ), \ |
| 453 | .scan_index = idx, \ | 453 | .scan_index = idx, \ |
| 454 | .scan_type = IIO_ST('s', 16, 16, IIO_BE), \ | 454 | .scan_type = { \ |
| 455 | .sign = 's', \ | ||
| 456 | .realbits = 16, \ | ||
| 457 | .storagebits = 16, \ | ||
| 458 | .endianness = IIO_BE, \ | ||
| 459 | }, \ | ||
| 455 | } | 460 | } |
| 456 | 461 | ||
| 457 | static const struct iio_chan_spec hmc5843_channels[] = { | 462 | static const struct iio_chan_spec hmc5843_channels[] = { |
diff --git a/drivers/staging/imx-drm/imx-drm-core.c b/drivers/staging/imx-drm/imx-drm-core.c index 6bd015ac9d68..96e4eee344ef 100644 --- a/drivers/staging/imx-drm/imx-drm-core.c +++ b/drivers/staging/imx-drm/imx-drm-core.c | |||
| @@ -88,8 +88,9 @@ static int imx_drm_driver_unload(struct drm_device *drm) | |||
| 88 | 88 | ||
| 89 | imx_drm_device_put(); | 89 | imx_drm_device_put(); |
| 90 | 90 | ||
| 91 | drm_mode_config_cleanup(imxdrm->drm); | 91 | drm_vblank_cleanup(imxdrm->drm); |
| 92 | drm_kms_helper_poll_fini(imxdrm->drm); | 92 | drm_kms_helper_poll_fini(imxdrm->drm); |
| 93 | drm_mode_config_cleanup(imxdrm->drm); | ||
| 93 | 94 | ||
| 94 | return 0; | 95 | return 0; |
| 95 | } | 96 | } |
| @@ -199,8 +200,8 @@ static void imx_drm_driver_preclose(struct drm_device *drm, | |||
| 199 | if (!file->is_master) | 200 | if (!file->is_master) |
| 200 | return; | 201 | return; |
| 201 | 202 | ||
| 202 | for (i = 0; i < 4; i++) | 203 | for (i = 0; i < MAX_CRTC; i++) |
| 203 | imx_drm_disable_vblank(drm , i); | 204 | imx_drm_disable_vblank(drm, i); |
| 204 | } | 205 | } |
| 205 | 206 | ||
| 206 | static const struct file_operations imx_drm_driver_fops = { | 207 | static const struct file_operations imx_drm_driver_fops = { |
| @@ -376,8 +377,6 @@ static int imx_drm_crtc_register(struct imx_drm_crtc *imx_drm_crtc) | |||
| 376 | struct imx_drm_device *imxdrm = __imx_drm_device(); | 377 | struct imx_drm_device *imxdrm = __imx_drm_device(); |
| 377 | int ret; | 378 | int ret; |
| 378 | 379 | ||
| 379 | drm_crtc_init(imxdrm->drm, imx_drm_crtc->crtc, | ||
| 380 | imx_drm_crtc->imx_drm_helper_funcs.crtc_funcs); | ||
| 381 | ret = drm_mode_crtc_set_gamma_size(imx_drm_crtc->crtc, 256); | 380 | ret = drm_mode_crtc_set_gamma_size(imx_drm_crtc->crtc, 256); |
| 382 | if (ret) | 381 | if (ret) |
| 383 | return ret; | 382 | return ret; |
| @@ -385,6 +384,9 @@ static int imx_drm_crtc_register(struct imx_drm_crtc *imx_drm_crtc) | |||
| 385 | drm_crtc_helper_add(imx_drm_crtc->crtc, | 384 | drm_crtc_helper_add(imx_drm_crtc->crtc, |
| 386 | imx_drm_crtc->imx_drm_helper_funcs.crtc_helper_funcs); | 385 | imx_drm_crtc->imx_drm_helper_funcs.crtc_helper_funcs); |
| 387 | 386 | ||
| 387 | drm_crtc_init(imxdrm->drm, imx_drm_crtc->crtc, | ||
| 388 | imx_drm_crtc->imx_drm_helper_funcs.crtc_funcs); | ||
| 389 | |||
| 388 | drm_mode_group_reinit(imxdrm->drm); | 390 | drm_mode_group_reinit(imxdrm->drm); |
| 389 | 391 | ||
| 390 | return 0; | 392 | return 0; |
| @@ -428,11 +430,11 @@ static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags) | |||
| 428 | ret = drm_mode_group_init_legacy_group(imxdrm->drm, | 430 | ret = drm_mode_group_init_legacy_group(imxdrm->drm, |
| 429 | &imxdrm->drm->primary->mode_group); | 431 | &imxdrm->drm->primary->mode_group); |
| 430 | if (ret) | 432 | if (ret) |
| 431 | goto err_init; | 433 | goto err_kms; |
| 432 | 434 | ||
| 433 | ret = drm_vblank_init(imxdrm->drm, MAX_CRTC); | 435 | ret = drm_vblank_init(imxdrm->drm, MAX_CRTC); |
| 434 | if (ret) | 436 | if (ret) |
| 435 | goto err_init; | 437 | goto err_kms; |
| 436 | 438 | ||
| 437 | /* | 439 | /* |
| 438 | * with vblank_disable_allowed = true, vblank interrupt will be disabled | 440 | * with vblank_disable_allowed = true, vblank interrupt will be disabled |
| @@ -441,12 +443,19 @@ static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags) | |||
| 441 | */ | 443 | */ |
| 442 | imxdrm->drm->vblank_disable_allowed = true; | 444 | imxdrm->drm->vblank_disable_allowed = true; |
| 443 | 445 | ||
| 444 | if (!imx_drm_device_get()) | 446 | if (!imx_drm_device_get()) { |
| 445 | ret = -EINVAL; | 447 | ret = -EINVAL; |
| 448 | goto err_vblank; | ||
| 449 | } | ||
| 446 | 450 | ||
| 447 | ret = 0; | 451 | mutex_unlock(&imxdrm->mutex); |
| 452 | return 0; | ||
| 448 | 453 | ||
| 449 | err_init: | 454 | err_vblank: |
| 455 | drm_vblank_cleanup(drm); | ||
| 456 | err_kms: | ||
| 457 | drm_kms_helper_poll_fini(drm); | ||
| 458 | drm_mode_config_cleanup(drm); | ||
| 450 | mutex_unlock(&imxdrm->mutex); | 459 | mutex_unlock(&imxdrm->mutex); |
| 451 | 460 | ||
| 452 | return ret; | 461 | return ret; |
| @@ -492,6 +501,15 @@ int imx_drm_add_crtc(struct drm_crtc *crtc, | |||
| 492 | 501 | ||
| 493 | mutex_lock(&imxdrm->mutex); | 502 | mutex_lock(&imxdrm->mutex); |
| 494 | 503 | ||
| 504 | /* | ||
| 505 | * The vblank arrays are dimensioned by MAX_CRTC - we can't | ||
| 506 | * pass IDs greater than this to those functions. | ||
| 507 | */ | ||
| 508 | if (imxdrm->pipes >= MAX_CRTC) { | ||
| 509 | ret = -EINVAL; | ||
| 510 | goto err_busy; | ||
| 511 | } | ||
| 512 | |||
| 495 | if (imxdrm->drm->open_count) { | 513 | if (imxdrm->drm->open_count) { |
| 496 | ret = -EBUSY; | 514 | ret = -EBUSY; |
| 497 | goto err_busy; | 515 | goto err_busy; |
| @@ -528,6 +546,7 @@ int imx_drm_add_crtc(struct drm_crtc *crtc, | |||
| 528 | return 0; | 546 | return 0; |
| 529 | 547 | ||
| 530 | err_register: | 548 | err_register: |
| 549 | list_del(&imx_drm_crtc->list); | ||
| 531 | kfree(imx_drm_crtc); | 550 | kfree(imx_drm_crtc); |
| 532 | err_alloc: | 551 | err_alloc: |
| 533 | err_busy: | 552 | err_busy: |
diff --git a/drivers/staging/imx-drm/imx-tve.c b/drivers/staging/imx-drm/imx-tve.c index 680f4c8fa081..2c44fef8d58b 100644 --- a/drivers/staging/imx-drm/imx-tve.c +++ b/drivers/staging/imx-drm/imx-tve.c | |||
| @@ -114,7 +114,6 @@ struct imx_tve { | |||
| 114 | struct drm_encoder encoder; | 114 | struct drm_encoder encoder; |
| 115 | struct imx_drm_encoder *imx_drm_encoder; | 115 | struct imx_drm_encoder *imx_drm_encoder; |
| 116 | struct device *dev; | 116 | struct device *dev; |
| 117 | spinlock_t enable_lock; /* serializes tve_enable/disable */ | ||
| 118 | spinlock_t lock; /* register lock */ | 117 | spinlock_t lock; /* register lock */ |
| 119 | bool enabled; | 118 | bool enabled; |
| 120 | int mode; | 119 | int mode; |
| @@ -146,10 +145,8 @@ __releases(&tve->lock) | |||
| 146 | 145 | ||
| 147 | static void tve_enable(struct imx_tve *tve) | 146 | static void tve_enable(struct imx_tve *tve) |
| 148 | { | 147 | { |
| 149 | unsigned long flags; | ||
| 150 | int ret; | 148 | int ret; |
| 151 | 149 | ||
| 152 | spin_lock_irqsave(&tve->enable_lock, flags); | ||
| 153 | if (!tve->enabled) { | 150 | if (!tve->enabled) { |
| 154 | tve->enabled = true; | 151 | tve->enabled = true; |
| 155 | clk_prepare_enable(tve->clk); | 152 | clk_prepare_enable(tve->clk); |
| @@ -169,23 +166,18 @@ static void tve_enable(struct imx_tve *tve) | |||
| 169 | TVE_CD_SM_IEN | | 166 | TVE_CD_SM_IEN | |
| 170 | TVE_CD_LM_IEN | | 167 | TVE_CD_LM_IEN | |
| 171 | TVE_CD_MON_END_IEN); | 168 | TVE_CD_MON_END_IEN); |
| 172 | |||
| 173 | spin_unlock_irqrestore(&tve->enable_lock, flags); | ||
| 174 | } | 169 | } |
| 175 | 170 | ||
| 176 | static void tve_disable(struct imx_tve *tve) | 171 | static void tve_disable(struct imx_tve *tve) |
| 177 | { | 172 | { |
| 178 | unsigned long flags; | ||
| 179 | int ret; | 173 | int ret; |
| 180 | 174 | ||
| 181 | spin_lock_irqsave(&tve->enable_lock, flags); | ||
| 182 | if (tve->enabled) { | 175 | if (tve->enabled) { |
| 183 | tve->enabled = false; | 176 | tve->enabled = false; |
| 184 | ret = regmap_update_bits(tve->regmap, TVE_COM_CONF_REG, | 177 | ret = regmap_update_bits(tve->regmap, TVE_COM_CONF_REG, |
| 185 | TVE_IPU_CLK_EN | TVE_EN, 0); | 178 | TVE_IPU_CLK_EN | TVE_EN, 0); |
| 186 | clk_disable_unprepare(tve->clk); | 179 | clk_disable_unprepare(tve->clk); |
| 187 | } | 180 | } |
| 188 | spin_unlock_irqrestore(&tve->enable_lock, flags); | ||
| 189 | } | 181 | } |
| 190 | 182 | ||
| 191 | static int tve_setup_tvout(struct imx_tve *tve) | 183 | static int tve_setup_tvout(struct imx_tve *tve) |
| @@ -601,7 +593,6 @@ static int imx_tve_probe(struct platform_device *pdev) | |||
| 601 | 593 | ||
| 602 | tve->dev = &pdev->dev; | 594 | tve->dev = &pdev->dev; |
| 603 | spin_lock_init(&tve->lock); | 595 | spin_lock_init(&tve->lock); |
| 604 | spin_lock_init(&tve->enable_lock); | ||
| 605 | 596 | ||
| 606 | ddc_node = of_parse_phandle(np, "ddc", 0); | 597 | ddc_node = of_parse_phandle(np, "ddc", 0); |
| 607 | if (ddc_node) { | 598 | if (ddc_node) { |
diff --git a/drivers/staging/imx-drm/ipu-v3/ipu-common.c b/drivers/staging/imx-drm/ipu-v3/ipu-common.c index 7a22ce619ed2..97ca6924dbb3 100644 --- a/drivers/staging/imx-drm/ipu-v3/ipu-common.c +++ b/drivers/staging/imx-drm/ipu-v3/ipu-common.c | |||
| @@ -996,35 +996,35 @@ static const struct ipu_platform_reg client_reg[] = { | |||
| 996 | }, | 996 | }, |
| 997 | }; | 997 | }; |
| 998 | 998 | ||
| 999 | static DEFINE_MUTEX(ipu_client_id_mutex); | ||
| 999 | static int ipu_client_id; | 1000 | static int ipu_client_id; |
| 1000 | 1001 | ||
| 1001 | static int ipu_add_subdevice_pdata(struct device *dev, | ||
| 1002 | const struct ipu_platform_reg *reg) | ||
| 1003 | { | ||
| 1004 | struct platform_device *pdev; | ||
| 1005 | |||
| 1006 | pdev = platform_device_register_data(dev, reg->name, ipu_client_id++, | ||
| 1007 | ®->pdata, sizeof(struct ipu_platform_reg)); | ||
| 1008 | |||
| 1009 | return PTR_ERR_OR_ZERO(pdev); | ||
| 1010 | } | ||
| 1011 | |||
| 1012 | static int ipu_add_client_devices(struct ipu_soc *ipu) | 1002 | static int ipu_add_client_devices(struct ipu_soc *ipu) |
| 1013 | { | 1003 | { |
| 1014 | int ret; | 1004 | struct device *dev = ipu->dev; |
| 1015 | int i; | 1005 | unsigned i; |
| 1006 | int id, ret; | ||
| 1007 | |||
| 1008 | mutex_lock(&ipu_client_id_mutex); | ||
| 1009 | id = ipu_client_id; | ||
| 1010 | ipu_client_id += ARRAY_SIZE(client_reg); | ||
| 1011 | mutex_unlock(&ipu_client_id_mutex); | ||
| 1016 | 1012 | ||
| 1017 | for (i = 0; i < ARRAY_SIZE(client_reg); i++) { | 1013 | for (i = 0; i < ARRAY_SIZE(client_reg); i++) { |
| 1018 | const struct ipu_platform_reg *reg = &client_reg[i]; | 1014 | const struct ipu_platform_reg *reg = &client_reg[i]; |
| 1019 | ret = ipu_add_subdevice_pdata(ipu->dev, reg); | 1015 | struct platform_device *pdev; |
| 1020 | if (ret) | 1016 | |
| 1017 | pdev = platform_device_register_data(dev, reg->name, | ||
| 1018 | id++, ®->pdata, sizeof(reg->pdata)); | ||
| 1019 | |||
| 1020 | if (IS_ERR(pdev)) | ||
| 1021 | goto err_register; | 1021 | goto err_register; |
| 1022 | } | 1022 | } |
| 1023 | 1023 | ||
| 1024 | return 0; | 1024 | return 0; |
| 1025 | 1025 | ||
| 1026 | err_register: | 1026 | err_register: |
| 1027 | platform_device_unregister_children(to_platform_device(ipu->dev)); | 1027 | platform_device_unregister_children(to_platform_device(dev)); |
| 1028 | 1028 | ||
| 1029 | return ret; | 1029 | return ret; |
| 1030 | } | 1030 | } |
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c index d70e9119e906..00867190413c 100644 --- a/drivers/target/iscsi/iscsi_target.c +++ b/drivers/target/iscsi/iscsi_target.c | |||
| @@ -465,6 +465,7 @@ int iscsit_del_np(struct iscsi_np *np) | |||
| 465 | */ | 465 | */ |
| 466 | send_sig(SIGINT, np->np_thread, 1); | 466 | send_sig(SIGINT, np->np_thread, 1); |
| 467 | kthread_stop(np->np_thread); | 467 | kthread_stop(np->np_thread); |
| 468 | np->np_thread = NULL; | ||
| 468 | } | 469 | } |
| 469 | 470 | ||
| 470 | np->np_transport->iscsit_free_np(np); | 471 | np->np_transport->iscsit_free_np(np); |
| @@ -823,24 +824,22 @@ int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, | |||
| 823 | if (((hdr->flags & ISCSI_FLAG_CMD_READ) || | 824 | if (((hdr->flags & ISCSI_FLAG_CMD_READ) || |
| 824 | (hdr->flags & ISCSI_FLAG_CMD_WRITE)) && !hdr->data_length) { | 825 | (hdr->flags & ISCSI_FLAG_CMD_WRITE)) && !hdr->data_length) { |
| 825 | /* | 826 | /* |
| 826 | * Vmware ESX v3.0 uses a modified Cisco Initiator (v3.4.2) | 827 | * From RFC-3720 Section 10.3.1: |
| 827 | * that adds support for RESERVE/RELEASE. There is a bug | 828 | * |
| 828 | * add with this new functionality that sets R/W bits when | 829 | * "Either or both of R and W MAY be 1 when either the |
| 829 | * neither CDB carries any READ or WRITE datapayloads. | 830 | * Expected Data Transfer Length and/or Bidirectional Read |
| 831 | * Expected Data Transfer Length are 0" | ||
| 832 | * | ||
| 833 | * For this case, go ahead and clear the unnecssary bits | ||
| 834 | * to avoid any confusion with ->data_direction. | ||
| 830 | */ | 835 | */ |
| 831 | if ((hdr->cdb[0] == 0x16) || (hdr->cdb[0] == 0x17)) { | 836 | hdr->flags &= ~ISCSI_FLAG_CMD_READ; |
| 832 | hdr->flags &= ~ISCSI_FLAG_CMD_READ; | 837 | hdr->flags &= ~ISCSI_FLAG_CMD_WRITE; |
| 833 | hdr->flags &= ~ISCSI_FLAG_CMD_WRITE; | ||
| 834 | goto done; | ||
| 835 | } | ||
| 836 | 838 | ||
| 837 | pr_err("ISCSI_FLAG_CMD_READ or ISCSI_FLAG_CMD_WRITE" | 839 | pr_warn("ISCSI_FLAG_CMD_READ or ISCSI_FLAG_CMD_WRITE" |
| 838 | " set when Expected Data Transfer Length is 0 for" | 840 | " set when Expected Data Transfer Length is 0 for" |
| 839 | " CDB: 0x%02x. Bad iSCSI Initiator.\n", hdr->cdb[0]); | 841 | " CDB: 0x%02x, Fixing up flags\n", hdr->cdb[0]); |
| 840 | return iscsit_add_reject_cmd(cmd, | ||
| 841 | ISCSI_REASON_BOOKMARK_INVALID, buf); | ||
| 842 | } | 842 | } |
| 843 | done: | ||
| 844 | 843 | ||
| 845 | if (!(hdr->flags & ISCSI_FLAG_CMD_READ) && | 844 | if (!(hdr->flags & ISCSI_FLAG_CMD_READ) && |
| 846 | !(hdr->flags & ISCSI_FLAG_CMD_WRITE) && (hdr->data_length != 0)) { | 845 | !(hdr->flags & ISCSI_FLAG_CMD_WRITE) && (hdr->data_length != 0)) { |
diff --git a/drivers/target/iscsi/iscsi_target_configfs.c b/drivers/target/iscsi/iscsi_target_configfs.c index e3318edb233d..1c0088fe9e99 100644 --- a/drivers/target/iscsi/iscsi_target_configfs.c +++ b/drivers/target/iscsi/iscsi_target_configfs.c | |||
| @@ -474,7 +474,8 @@ static ssize_t __iscsi_##prefix##_store_##name( \ | |||
| 474 | \ | 474 | \ |
| 475 | if (!capable(CAP_SYS_ADMIN)) \ | 475 | if (!capable(CAP_SYS_ADMIN)) \ |
| 476 | return -EPERM; \ | 476 | return -EPERM; \ |
| 477 | \ | 477 | if (count >= sizeof(auth->name)) \ |
| 478 | return -EINVAL; \ | ||
| 478 | snprintf(auth->name, sizeof(auth->name), "%s", page); \ | 479 | snprintf(auth->name, sizeof(auth->name), "%s", page); \ |
| 479 | if (!strncmp("NULL", auth->name, 4)) \ | 480 | if (!strncmp("NULL", auth->name, 4)) \ |
| 480 | auth->naf_flags &= ~flags; \ | 481 | auth->naf_flags &= ~flags; \ |
diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c index 4eb93b2b6473..e29279e6b577 100644 --- a/drivers/target/iscsi/iscsi_target_login.c +++ b/drivers/target/iscsi/iscsi_target_login.c | |||
| @@ -1403,11 +1403,6 @@ old_sess_out: | |||
| 1403 | 1403 | ||
| 1404 | out: | 1404 | out: |
| 1405 | stop = kthread_should_stop(); | 1405 | stop = kthread_should_stop(); |
| 1406 | if (!stop && signal_pending(current)) { | ||
| 1407 | spin_lock_bh(&np->np_thread_lock); | ||
| 1408 | stop = (np->np_thread_state == ISCSI_NP_THREAD_SHUTDOWN); | ||
| 1409 | spin_unlock_bh(&np->np_thread_lock); | ||
| 1410 | } | ||
| 1411 | /* Wait for another socket.. */ | 1406 | /* Wait for another socket.. */ |
| 1412 | if (!stop) | 1407 | if (!stop) |
| 1413 | return 1; | 1408 | return 1; |
| @@ -1415,7 +1410,6 @@ exit: | |||
| 1415 | iscsi_stop_login_thread_timer(np); | 1410 | iscsi_stop_login_thread_timer(np); |
| 1416 | spin_lock_bh(&np->np_thread_lock); | 1411 | spin_lock_bh(&np->np_thread_lock); |
| 1417 | np->np_thread_state = ISCSI_NP_THREAD_EXIT; | 1412 | np->np_thread_state = ISCSI_NP_THREAD_EXIT; |
| 1418 | np->np_thread = NULL; | ||
| 1419 | spin_unlock_bh(&np->np_thread_lock); | 1413 | spin_unlock_bh(&np->np_thread_lock); |
| 1420 | 1414 | ||
| 1421 | return 0; | 1415 | return 0; |
diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c index 207b340498a3..d06de84b069b 100644 --- a/drivers/target/target_core_device.c +++ b/drivers/target/target_core_device.c | |||
| @@ -1106,6 +1106,11 @@ int se_dev_set_block_size(struct se_device *dev, u32 block_size) | |||
| 1106 | dev->dev_attrib.block_size = block_size; | 1106 | dev->dev_attrib.block_size = block_size; |
| 1107 | pr_debug("dev[%p]: SE Device block_size changed to %u\n", | 1107 | pr_debug("dev[%p]: SE Device block_size changed to %u\n", |
| 1108 | dev, block_size); | 1108 | dev, block_size); |
| 1109 | |||
| 1110 | if (dev->dev_attrib.max_bytes_per_io) | ||
| 1111 | dev->dev_attrib.hw_max_sectors = | ||
| 1112 | dev->dev_attrib.max_bytes_per_io / block_size; | ||
| 1113 | |||
| 1109 | return 0; | 1114 | return 0; |
| 1110 | } | 1115 | } |
| 1111 | 1116 | ||
diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c index 0e34cda3271e..78241a53b555 100644 --- a/drivers/target/target_core_file.c +++ b/drivers/target/target_core_file.c | |||
| @@ -66,9 +66,8 @@ static int fd_attach_hba(struct se_hba *hba, u32 host_id) | |||
| 66 | pr_debug("CORE_HBA[%d] - TCM FILEIO HBA Driver %s on Generic" | 66 | pr_debug("CORE_HBA[%d] - TCM FILEIO HBA Driver %s on Generic" |
| 67 | " Target Core Stack %s\n", hba->hba_id, FD_VERSION, | 67 | " Target Core Stack %s\n", hba->hba_id, FD_VERSION, |
| 68 | TARGET_CORE_MOD_VERSION); | 68 | TARGET_CORE_MOD_VERSION); |
| 69 | pr_debug("CORE_HBA[%d] - Attached FILEIO HBA: %u to Generic" | 69 | pr_debug("CORE_HBA[%d] - Attached FILEIO HBA: %u to Generic\n", |
| 70 | " MaxSectors: %u\n", | 70 | hba->hba_id, fd_host->fd_host_id); |
| 71 | hba->hba_id, fd_host->fd_host_id, FD_MAX_SECTORS); | ||
| 72 | 71 | ||
| 73 | return 0; | 72 | return 0; |
| 74 | } | 73 | } |
| @@ -220,7 +219,8 @@ static int fd_configure_device(struct se_device *dev) | |||
| 220 | } | 219 | } |
| 221 | 220 | ||
| 222 | dev->dev_attrib.hw_block_size = fd_dev->fd_block_size; | 221 | dev->dev_attrib.hw_block_size = fd_dev->fd_block_size; |
| 223 | dev->dev_attrib.hw_max_sectors = FD_MAX_SECTORS; | 222 | dev->dev_attrib.max_bytes_per_io = FD_MAX_BYTES; |
| 223 | dev->dev_attrib.hw_max_sectors = FD_MAX_BYTES / fd_dev->fd_block_size; | ||
| 224 | dev->dev_attrib.hw_queue_depth = FD_MAX_DEVICE_QUEUE_DEPTH; | 224 | dev->dev_attrib.hw_queue_depth = FD_MAX_DEVICE_QUEUE_DEPTH; |
| 225 | 225 | ||
| 226 | if (fd_dev->fbd_flags & FDBD_HAS_BUFFERED_IO_WCE) { | 226 | if (fd_dev->fbd_flags & FDBD_HAS_BUFFERED_IO_WCE) { |
diff --git a/drivers/target/target_core_file.h b/drivers/target/target_core_file.h index 37ffc5bd2399..d7772c167685 100644 --- a/drivers/target/target_core_file.h +++ b/drivers/target/target_core_file.h | |||
| @@ -7,7 +7,10 @@ | |||
| 7 | #define FD_DEVICE_QUEUE_DEPTH 32 | 7 | #define FD_DEVICE_QUEUE_DEPTH 32 |
| 8 | #define FD_MAX_DEVICE_QUEUE_DEPTH 128 | 8 | #define FD_MAX_DEVICE_QUEUE_DEPTH 128 |
| 9 | #define FD_BLOCKSIZE 512 | 9 | #define FD_BLOCKSIZE 512 |
| 10 | #define FD_MAX_SECTORS 2048 | 10 | /* |
| 11 | * Limited by the number of iovecs (2048) per vfs_[writev,readv] call | ||
| 12 | */ | ||
| 13 | #define FD_MAX_BYTES 8388608 | ||
| 11 | 14 | ||
| 12 | #define RRF_EMULATE_CDB 0x01 | 15 | #define RRF_EMULATE_CDB 0x01 |
| 13 | #define RRF_GOT_LBA 0x02 | 16 | #define RRF_GOT_LBA 0x02 |
diff --git a/drivers/target/target_core_tpg.c b/drivers/target/target_core_tpg.c index f697f8baec54..2a573de19a9f 100644 --- a/drivers/target/target_core_tpg.c +++ b/drivers/target/target_core_tpg.c | |||
| @@ -278,7 +278,6 @@ struct se_node_acl *core_tpg_check_initiator_node_acl( | |||
| 278 | snprintf(acl->initiatorname, TRANSPORT_IQN_LEN, "%s", initiatorname); | 278 | snprintf(acl->initiatorname, TRANSPORT_IQN_LEN, "%s", initiatorname); |
| 279 | acl->se_tpg = tpg; | 279 | acl->se_tpg = tpg; |
| 280 | acl->acl_index = scsi_get_new_index(SCSI_AUTH_INTR_INDEX); | 280 | acl->acl_index = scsi_get_new_index(SCSI_AUTH_INTR_INDEX); |
| 281 | spin_lock_init(&acl->stats_lock); | ||
| 282 | acl->dynamic_node_acl = 1; | 281 | acl->dynamic_node_acl = 1; |
| 283 | 282 | ||
| 284 | tpg->se_tpg_tfo->set_default_node_attributes(acl); | 283 | tpg->se_tpg_tfo->set_default_node_attributes(acl); |
| @@ -406,7 +405,6 @@ struct se_node_acl *core_tpg_add_initiator_node_acl( | |||
| 406 | snprintf(acl->initiatorname, TRANSPORT_IQN_LEN, "%s", initiatorname); | 405 | snprintf(acl->initiatorname, TRANSPORT_IQN_LEN, "%s", initiatorname); |
| 407 | acl->se_tpg = tpg; | 406 | acl->se_tpg = tpg; |
| 408 | acl->acl_index = scsi_get_new_index(SCSI_AUTH_INTR_INDEX); | 407 | acl->acl_index = scsi_get_new_index(SCSI_AUTH_INTR_INDEX); |
| 409 | spin_lock_init(&acl->stats_lock); | ||
| 410 | 408 | ||
| 411 | tpg->se_tpg_tfo->set_default_node_attributes(acl); | 409 | tpg->se_tpg_tfo->set_default_node_attributes(acl); |
| 412 | 410 | ||
| @@ -658,15 +656,9 @@ static int core_tpg_setup_virtual_lun0(struct se_portal_group *se_tpg) | |||
| 658 | spin_lock_init(&lun->lun_sep_lock); | 656 | spin_lock_init(&lun->lun_sep_lock); |
| 659 | init_completion(&lun->lun_ref_comp); | 657 | init_completion(&lun->lun_ref_comp); |
| 660 | 658 | ||
| 661 | ret = percpu_ref_init(&lun->lun_ref, core_tpg_lun_ref_release); | ||
| 662 | if (ret < 0) | ||
| 663 | return ret; | ||
| 664 | |||
| 665 | ret = core_tpg_post_addlun(se_tpg, lun, lun_access, dev); | 659 | ret = core_tpg_post_addlun(se_tpg, lun, lun_access, dev); |
| 666 | if (ret < 0) { | 660 | if (ret < 0) |
| 667 | percpu_ref_cancel_init(&lun->lun_ref); | ||
| 668 | return ret; | 661 | return ret; |
| 669 | } | ||
| 670 | 662 | ||
| 671 | return 0; | 663 | return 0; |
| 672 | } | 664 | } |
diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c index 268b62768f2b..34aacaaae14a 100644 --- a/drivers/tty/n_tty.c +++ b/drivers/tty/n_tty.c | |||
| @@ -93,6 +93,7 @@ struct n_tty_data { | |||
| 93 | size_t canon_head; | 93 | size_t canon_head; |
| 94 | size_t echo_head; | 94 | size_t echo_head; |
| 95 | size_t echo_commit; | 95 | size_t echo_commit; |
| 96 | size_t echo_mark; | ||
| 96 | DECLARE_BITMAP(char_map, 256); | 97 | DECLARE_BITMAP(char_map, 256); |
| 97 | 98 | ||
| 98 | /* private to n_tty_receive_overrun (single-threaded) */ | 99 | /* private to n_tty_receive_overrun (single-threaded) */ |
| @@ -336,6 +337,7 @@ static void reset_buffer_flags(struct n_tty_data *ldata) | |||
| 336 | { | 337 | { |
| 337 | ldata->read_head = ldata->canon_head = ldata->read_tail = 0; | 338 | ldata->read_head = ldata->canon_head = ldata->read_tail = 0; |
| 338 | ldata->echo_head = ldata->echo_tail = ldata->echo_commit = 0; | 339 | ldata->echo_head = ldata->echo_tail = ldata->echo_commit = 0; |
| 340 | ldata->echo_mark = 0; | ||
| 339 | ldata->line_start = 0; | 341 | ldata->line_start = 0; |
| 340 | 342 | ||
| 341 | ldata->erasing = 0; | 343 | ldata->erasing = 0; |
| @@ -787,6 +789,7 @@ static void commit_echoes(struct tty_struct *tty) | |||
| 787 | size_t head; | 789 | size_t head; |
| 788 | 790 | ||
| 789 | head = ldata->echo_head; | 791 | head = ldata->echo_head; |
| 792 | ldata->echo_mark = head; | ||
| 790 | old = ldata->echo_commit - ldata->echo_tail; | 793 | old = ldata->echo_commit - ldata->echo_tail; |
| 791 | 794 | ||
| 792 | /* Process committed echoes if the accumulated # of bytes | 795 | /* Process committed echoes if the accumulated # of bytes |
| @@ -811,10 +814,11 @@ static void process_echoes(struct tty_struct *tty) | |||
| 811 | size_t echoed; | 814 | size_t echoed; |
| 812 | 815 | ||
| 813 | if ((!L_ECHO(tty) && !L_ECHONL(tty)) || | 816 | if ((!L_ECHO(tty) && !L_ECHONL(tty)) || |
| 814 | ldata->echo_commit == ldata->echo_tail) | 817 | ldata->echo_mark == ldata->echo_tail) |
| 815 | return; | 818 | return; |
| 816 | 819 | ||
| 817 | mutex_lock(&ldata->output_lock); | 820 | mutex_lock(&ldata->output_lock); |
| 821 | ldata->echo_commit = ldata->echo_mark; | ||
| 818 | echoed = __process_echoes(tty); | 822 | echoed = __process_echoes(tty); |
| 819 | mutex_unlock(&ldata->output_lock); | 823 | mutex_unlock(&ldata->output_lock); |
| 820 | 824 | ||
| @@ -822,6 +826,7 @@ static void process_echoes(struct tty_struct *tty) | |||
| 822 | tty->ops->flush_chars(tty); | 826 | tty->ops->flush_chars(tty); |
| 823 | } | 827 | } |
| 824 | 828 | ||
| 829 | /* NB: echo_mark and echo_head should be equivalent here */ | ||
| 825 | static void flush_echoes(struct tty_struct *tty) | 830 | static void flush_echoes(struct tty_struct *tty) |
| 826 | { | 831 | { |
| 827 | struct n_tty_data *ldata = tty->disc_data; | 832 | struct n_tty_data *ldata = tty->disc_data; |
diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c index 4658e3e0ec42..06525f10e364 100644 --- a/drivers/tty/serial/8250/8250_dw.c +++ b/drivers/tty/serial/8250/8250_dw.c | |||
| @@ -96,7 +96,8 @@ static void dw8250_serial_out(struct uart_port *p, int offset, int value) | |||
| 96 | if (offset == UART_LCR) { | 96 | if (offset == UART_LCR) { |
| 97 | int tries = 1000; | 97 | int tries = 1000; |
| 98 | while (tries--) { | 98 | while (tries--) { |
| 99 | if (value == p->serial_in(p, UART_LCR)) | 99 | unsigned int lcr = p->serial_in(p, UART_LCR); |
| 100 | if ((value & ~UART_LCR_SPAR) == (lcr & ~UART_LCR_SPAR)) | ||
| 100 | return; | 101 | return; |
| 101 | dw8250_force_idle(p); | 102 | dw8250_force_idle(p); |
| 102 | writeb(value, p->membase + (UART_LCR << p->regshift)); | 103 | writeb(value, p->membase + (UART_LCR << p->regshift)); |
| @@ -132,7 +133,8 @@ static void dw8250_serial_out32(struct uart_port *p, int offset, int value) | |||
| 132 | if (offset == UART_LCR) { | 133 | if (offset == UART_LCR) { |
| 133 | int tries = 1000; | 134 | int tries = 1000; |
| 134 | while (tries--) { | 135 | while (tries--) { |
| 135 | if (value == p->serial_in(p, UART_LCR)) | 136 | unsigned int lcr = p->serial_in(p, UART_LCR); |
| 137 | if ((value & ~UART_LCR_SPAR) == (lcr & ~UART_LCR_SPAR)) | ||
| 136 | return; | 138 | return; |
| 137 | dw8250_force_idle(p); | 139 | dw8250_force_idle(p); |
| 138 | writel(value, p->membase + (UART_LCR << p->regshift)); | 140 | writel(value, p->membase + (UART_LCR << p->regshift)); |
| @@ -455,6 +457,8 @@ MODULE_DEVICE_TABLE(of, dw8250_of_match); | |||
| 455 | static const struct acpi_device_id dw8250_acpi_match[] = { | 457 | static const struct acpi_device_id dw8250_acpi_match[] = { |
| 456 | { "INT33C4", 0 }, | 458 | { "INT33C4", 0 }, |
| 457 | { "INT33C5", 0 }, | 459 | { "INT33C5", 0 }, |
| 460 | { "INT3434", 0 }, | ||
| 461 | { "INT3435", 0 }, | ||
| 458 | { "80860F0A", 0 }, | 462 | { "80860F0A", 0 }, |
| 459 | { }, | 463 | { }, |
| 460 | }; | 464 | }; |
diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c index e46e9f3f19b9..f619ad5b5eae 100644 --- a/drivers/tty/serial/xilinx_uartps.c +++ b/drivers/tty/serial/xilinx_uartps.c | |||
| @@ -240,6 +240,7 @@ static irqreturn_t xuartps_isr(int irq, void *dev_id) | |||
| 240 | continue; | 240 | continue; |
| 241 | } | 241 | } |
| 242 | 242 | ||
| 243 | #ifdef SUPPORT_SYSRQ | ||
| 243 | /* | 244 | /* |
| 244 | * uart_handle_sysrq_char() doesn't work if | 245 | * uart_handle_sysrq_char() doesn't work if |
| 245 | * spinlocked, for some reason | 246 | * spinlocked, for some reason |
| @@ -253,6 +254,7 @@ static irqreturn_t xuartps_isr(int irq, void *dev_id) | |||
| 253 | } | 254 | } |
| 254 | spin_lock(&port->lock); | 255 | spin_lock(&port->lock); |
| 255 | } | 256 | } |
| 257 | #endif | ||
| 256 | 258 | ||
| 257 | port->icount.rx++; | 259 | port->icount.rx++; |
| 258 | 260 | ||
diff --git a/drivers/tty/tty_ldsem.c b/drivers/tty/tty_ldsem.c index 22fad8ad5ac2..d8a55e87877f 100644 --- a/drivers/tty/tty_ldsem.c +++ b/drivers/tty/tty_ldsem.c | |||
| @@ -86,11 +86,21 @@ static inline long ldsem_atomic_update(long delta, struct ld_semaphore *sem) | |||
| 86 | return atomic_long_add_return(delta, (atomic_long_t *)&sem->count); | 86 | return atomic_long_add_return(delta, (atomic_long_t *)&sem->count); |
| 87 | } | 87 | } |
| 88 | 88 | ||
| 89 | /* | ||
| 90 | * ldsem_cmpxchg() updates @*old with the last-known sem->count value. | ||
| 91 | * Returns 1 if count was successfully changed; @*old will have @new value. | ||
| 92 | * Returns 0 if count was not changed; @*old will have most recent sem->count | ||
| 93 | */ | ||
| 89 | static inline int ldsem_cmpxchg(long *old, long new, struct ld_semaphore *sem) | 94 | static inline int ldsem_cmpxchg(long *old, long new, struct ld_semaphore *sem) |
| 90 | { | 95 | { |
| 91 | long tmp = *old; | 96 | long tmp = atomic_long_cmpxchg(&sem->count, *old, new); |
| 92 | *old = atomic_long_cmpxchg(&sem->count, *old, new); | 97 | if (tmp == *old) { |
| 93 | return *old == tmp; | 98 | *old = new; |
| 99 | return 1; | ||
| 100 | } else { | ||
| 101 | *old = tmp; | ||
| 102 | return 0; | ||
| 103 | } | ||
| 94 | } | 104 | } |
| 95 | 105 | ||
| 96 | /* | 106 | /* |
diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c index 5d8981c5235e..6e73f8cd60e5 100644 --- a/drivers/usb/chipidea/core.c +++ b/drivers/usb/chipidea/core.c | |||
| @@ -642,6 +642,10 @@ static int ci_hdrc_probe(struct platform_device *pdev) | |||
| 642 | : CI_ROLE_GADGET; | 642 | : CI_ROLE_GADGET; |
| 643 | } | 643 | } |
| 644 | 644 | ||
| 645 | /* only update vbus status for peripheral */ | ||
| 646 | if (ci->role == CI_ROLE_GADGET) | ||
| 647 | ci_handle_vbus_change(ci); | ||
| 648 | |||
| 645 | ret = ci_role_start(ci, ci->role); | 649 | ret = ci_role_start(ci, ci->role); |
| 646 | if (ret) { | 650 | if (ret) { |
| 647 | dev_err(dev, "can't start %s role\n", ci_role(ci)->name); | 651 | dev_err(dev, "can't start %s role\n", ci_role(ci)->name); |
diff --git a/drivers/usb/chipidea/host.c b/drivers/usb/chipidea/host.c index 59e6020ea753..526cd77563d8 100644 --- a/drivers/usb/chipidea/host.c +++ b/drivers/usb/chipidea/host.c | |||
| @@ -88,7 +88,8 @@ static int host_start(struct ci_hdrc *ci) | |||
| 88 | return ret; | 88 | return ret; |
| 89 | 89 | ||
| 90 | disable_reg: | 90 | disable_reg: |
| 91 | regulator_disable(ci->platdata->reg_vbus); | 91 | if (ci->platdata->reg_vbus) |
| 92 | regulator_disable(ci->platdata->reg_vbus); | ||
| 92 | 93 | ||
| 93 | put_hcd: | 94 | put_hcd: |
| 94 | usb_put_hcd(hcd); | 95 | usb_put_hcd(hcd); |
diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c index b34c81969cba..69d20fbb38a2 100644 --- a/drivers/usb/chipidea/udc.c +++ b/drivers/usb/chipidea/udc.c | |||
| @@ -1795,9 +1795,6 @@ static int udc_start(struct ci_hdrc *ci) | |||
| 1795 | pm_runtime_no_callbacks(&ci->gadget.dev); | 1795 | pm_runtime_no_callbacks(&ci->gadget.dev); |
| 1796 | pm_runtime_enable(&ci->gadget.dev); | 1796 | pm_runtime_enable(&ci->gadget.dev); |
| 1797 | 1797 | ||
| 1798 | /* Update ci->vbus_active */ | ||
| 1799 | ci_handle_vbus_change(ci); | ||
| 1800 | |||
| 1801 | return retval; | 1798 | return retval; |
| 1802 | 1799 | ||
| 1803 | destroy_eps: | 1800 | destroy_eps: |
diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c index 4d387596f3f0..0b23a8639311 100644 --- a/drivers/usb/class/cdc-wdm.c +++ b/drivers/usb/class/cdc-wdm.c | |||
| @@ -854,13 +854,11 @@ static int wdm_manage_power(struct usb_interface *intf, int on) | |||
| 854 | { | 854 | { |
| 855 | /* need autopm_get/put here to ensure the usbcore sees the new value */ | 855 | /* need autopm_get/put here to ensure the usbcore sees the new value */ |
| 856 | int rv = usb_autopm_get_interface(intf); | 856 | int rv = usb_autopm_get_interface(intf); |
| 857 | if (rv < 0) | ||
| 858 | goto err; | ||
| 859 | 857 | ||
| 860 | intf->needs_remote_wakeup = on; | 858 | intf->needs_remote_wakeup = on; |
| 861 | usb_autopm_put_interface(intf); | 859 | if (!rv) |
| 862 | err: | 860 | usb_autopm_put_interface(intf); |
| 863 | return rv; | 861 | return 0; |
| 864 | } | 862 | } |
| 865 | 863 | ||
| 866 | static int wdm_probe(struct usb_interface *intf, const struct usb_device_id *id) | 864 | static int wdm_probe(struct usb_interface *intf, const struct usb_device_id *id) |
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 74f9cf02da07..a49217ae3533 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c | |||
| @@ -455,9 +455,6 @@ static int dwc3_probe(struct platform_device *pdev) | |||
| 455 | if (IS_ERR(regs)) | 455 | if (IS_ERR(regs)) |
| 456 | return PTR_ERR(regs); | 456 | return PTR_ERR(regs); |
| 457 | 457 | ||
| 458 | usb_phy_set_suspend(dwc->usb2_phy, 0); | ||
| 459 | usb_phy_set_suspend(dwc->usb3_phy, 0); | ||
| 460 | |||
| 461 | spin_lock_init(&dwc->lock); | 458 | spin_lock_init(&dwc->lock); |
| 462 | platform_set_drvdata(pdev, dwc); | 459 | platform_set_drvdata(pdev, dwc); |
| 463 | 460 | ||
| @@ -488,6 +485,9 @@ static int dwc3_probe(struct platform_device *pdev) | |||
| 488 | goto err0; | 485 | goto err0; |
| 489 | } | 486 | } |
| 490 | 487 | ||
| 488 | usb_phy_set_suspend(dwc->usb2_phy, 0); | ||
| 489 | usb_phy_set_suspend(dwc->usb3_phy, 0); | ||
| 490 | |||
| 491 | ret = dwc3_event_buffers_setup(dwc); | 491 | ret = dwc3_event_buffers_setup(dwc); |
| 492 | if (ret) { | 492 | if (ret) { |
| 493 | dev_err(dwc->dev, "failed to setup event buffers\n"); | 493 | dev_err(dwc->dev, "failed to setup event buffers\n"); |
| @@ -569,6 +569,8 @@ err2: | |||
| 569 | dwc3_event_buffers_cleanup(dwc); | 569 | dwc3_event_buffers_cleanup(dwc); |
| 570 | 570 | ||
| 571 | err1: | 571 | err1: |
| 572 | usb_phy_set_suspend(dwc->usb2_phy, 1); | ||
| 573 | usb_phy_set_suspend(dwc->usb3_phy, 1); | ||
| 572 | dwc3_core_exit(dwc); | 574 | dwc3_core_exit(dwc); |
| 573 | 575 | ||
| 574 | err0: | 576 | err0: |
diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c index 418444ebb1b8..8c356af79409 100644 --- a/drivers/usb/host/ohci-at91.c +++ b/drivers/usb/host/ohci-at91.c | |||
| @@ -136,23 +136,27 @@ static int usb_hcd_at91_probe(const struct hc_driver *driver, | |||
| 136 | struct ohci_hcd *ohci; | 136 | struct ohci_hcd *ohci; |
| 137 | int retval; | 137 | int retval; |
| 138 | struct usb_hcd *hcd = NULL; | 138 | struct usb_hcd *hcd = NULL; |
| 139 | 139 | struct device *dev = &pdev->dev; | |
| 140 | if (pdev->num_resources != 2) { | 140 | struct resource *res; |
| 141 | pr_debug("hcd probe: invalid num_resources"); | 141 | int irq; |
| 142 | return -ENODEV; | 142 | |
| 143 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 144 | if (!res) { | ||
| 145 | dev_dbg(dev, "hcd probe: missing memory resource\n"); | ||
| 146 | return -ENXIO; | ||
| 143 | } | 147 | } |
| 144 | 148 | ||
| 145 | if ((pdev->resource[0].flags != IORESOURCE_MEM) | 149 | irq = platform_get_irq(pdev, 0); |
| 146 | || (pdev->resource[1].flags != IORESOURCE_IRQ)) { | 150 | if (irq < 0) { |
| 147 | pr_debug("hcd probe: invalid resource type\n"); | 151 | dev_dbg(dev, "hcd probe: missing irq resource\n"); |
| 148 | return -ENODEV; | 152 | return irq; |
| 149 | } | 153 | } |
| 150 | 154 | ||
| 151 | hcd = usb_create_hcd(driver, &pdev->dev, "at91"); | 155 | hcd = usb_create_hcd(driver, &pdev->dev, "at91"); |
| 152 | if (!hcd) | 156 | if (!hcd) |
| 153 | return -ENOMEM; | 157 | return -ENOMEM; |
| 154 | hcd->rsrc_start = pdev->resource[0].start; | 158 | hcd->rsrc_start = res->start; |
| 155 | hcd->rsrc_len = resource_size(&pdev->resource[0]); | 159 | hcd->rsrc_len = resource_size(res); |
| 156 | 160 | ||
| 157 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { | 161 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { |
| 158 | pr_debug("request_mem_region failed\n"); | 162 | pr_debug("request_mem_region failed\n"); |
| @@ -199,7 +203,7 @@ static int usb_hcd_at91_probe(const struct hc_driver *driver, | |||
| 199 | ohci->num_ports = board->ports; | 203 | ohci->num_ports = board->ports; |
| 200 | at91_start_hc(pdev); | 204 | at91_start_hc(pdev); |
| 201 | 205 | ||
| 202 | retval = usb_add_hcd(hcd, pdev->resource[1].start, IRQF_SHARED); | 206 | retval = usb_add_hcd(hcd, irq, IRQF_SHARED); |
| 203 | if (retval == 0) | 207 | if (retval == 0) |
| 204 | return retval; | 208 | return retval; |
| 205 | 209 | ||
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index b8dffd59eb25..73f5208714a4 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c | |||
| @@ -128,7 +128,12 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) | |||
| 128 | * any other sleep) on Haswell machines with LPT and LPT-LP | 128 | * any other sleep) on Haswell machines with LPT and LPT-LP |
| 129 | * with the new Intel BIOS | 129 | * with the new Intel BIOS |
| 130 | */ | 130 | */ |
| 131 | xhci->quirks |= XHCI_SPURIOUS_WAKEUP; | 131 | /* Limit the quirk to only known vendors, as this triggers |
| 132 | * yet another BIOS bug on some other machines | ||
| 133 | * https://bugzilla.kernel.org/show_bug.cgi?id=66171 | ||
| 134 | */ | ||
| 135 | if (pdev->subsystem_vendor == PCI_VENDOR_ID_HP) | ||
| 136 | xhci->quirks |= XHCI_SPURIOUS_WAKEUP; | ||
| 132 | } | 137 | } |
| 133 | if (pdev->vendor == PCI_VENDOR_ID_ETRON && | 138 | if (pdev->vendor == PCI_VENDOR_ID_ETRON && |
| 134 | pdev->device == PCI_DEVICE_ID_ASROCK_P67) { | 139 | pdev->device == PCI_DEVICE_ID_ASROCK_P67) { |
diff --git a/drivers/usb/phy/Kconfig b/drivers/usb/phy/Kconfig index 08e2f39027ec..2b41c636a52a 100644 --- a/drivers/usb/phy/Kconfig +++ b/drivers/usb/phy/Kconfig | |||
| @@ -19,8 +19,9 @@ config AB8500_USB | |||
| 19 | in host mode, low speed. | 19 | in host mode, low speed. |
| 20 | 20 | ||
| 21 | config FSL_USB2_OTG | 21 | config FSL_USB2_OTG |
| 22 | bool "Freescale USB OTG Transceiver Driver" | 22 | tristate "Freescale USB OTG Transceiver Driver" |
| 23 | depends on USB_EHCI_FSL && USB_FSL_USB2 && PM_RUNTIME | 23 | depends on USB_EHCI_FSL && USB_FSL_USB2 && PM_RUNTIME |
| 24 | depends on USB | ||
| 24 | select USB_OTG | 25 | select USB_OTG |
| 25 | select USB_PHY | 26 | select USB_PHY |
| 26 | help | 27 | help |
| @@ -29,6 +30,7 @@ config FSL_USB2_OTG | |||
| 29 | config ISP1301_OMAP | 30 | config ISP1301_OMAP |
| 30 | tristate "Philips ISP1301 with OMAP OTG" | 31 | tristate "Philips ISP1301 with OMAP OTG" |
| 31 | depends on I2C && ARCH_OMAP_OTG | 32 | depends on I2C && ARCH_OMAP_OTG |
| 33 | depends on USB | ||
| 32 | select USB_PHY | 34 | select USB_PHY |
| 33 | help | 35 | help |
| 34 | If you say yes here you get support for the Philips ISP1301 | 36 | If you say yes here you get support for the Philips ISP1301 |
diff --git a/drivers/usb/phy/phy-tegra-usb.c b/drivers/usb/phy/phy-tegra-usb.c index 82232acf1ab6..bbe4f8e6e8d7 100644 --- a/drivers/usb/phy/phy-tegra-usb.c +++ b/drivers/usb/phy/phy-tegra-usb.c | |||
| @@ -876,7 +876,7 @@ static int utmi_phy_probe(struct tegra_usb_phy *tegra_phy, | |||
| 876 | 876 | ||
| 877 | tegra_phy->pad_regs = devm_ioremap(&pdev->dev, res->start, | 877 | tegra_phy->pad_regs = devm_ioremap(&pdev->dev, res->start, |
| 878 | resource_size(res)); | 878 | resource_size(res)); |
| 879 | if (!tegra_phy->regs) { | 879 | if (!tegra_phy->pad_regs) { |
| 880 | dev_err(&pdev->dev, "Failed to remap UTMI Pad regs\n"); | 880 | dev_err(&pdev->dev, "Failed to remap UTMI Pad regs\n"); |
| 881 | return -ENOMEM; | 881 | return -ENOMEM; |
| 882 | } | 882 | } |
diff --git a/drivers/usb/phy/phy-twl6030-usb.c b/drivers/usb/phy/phy-twl6030-usb.c index 30e8a61552d4..bad57ce77ba5 100644 --- a/drivers/usb/phy/phy-twl6030-usb.c +++ b/drivers/usb/phy/phy-twl6030-usb.c | |||
| @@ -127,7 +127,8 @@ static inline int twl6030_writeb(struct twl6030_usb *twl, u8 module, | |||
| 127 | 127 | ||
| 128 | static inline u8 twl6030_readb(struct twl6030_usb *twl, u8 module, u8 address) | 128 | static inline u8 twl6030_readb(struct twl6030_usb *twl, u8 module, u8 address) |
| 129 | { | 129 | { |
| 130 | u8 data, ret = 0; | 130 | u8 data; |
| 131 | int ret; | ||
| 131 | 132 | ||
| 132 | ret = twl_i2c_read_u8(module, &data, address); | 133 | ret = twl_i2c_read_u8(module, &data, address); |
| 133 | if (ret >= 0) | 134 | if (ret >= 0) |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 496b7e39d5be..cc7a24154490 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
| @@ -251,6 +251,7 @@ static void option_instat_callback(struct urb *urb); | |||
| 251 | #define ZTE_PRODUCT_MF628 0x0015 | 251 | #define ZTE_PRODUCT_MF628 0x0015 |
| 252 | #define ZTE_PRODUCT_MF626 0x0031 | 252 | #define ZTE_PRODUCT_MF626 0x0031 |
| 253 | #define ZTE_PRODUCT_MC2718 0xffe8 | 253 | #define ZTE_PRODUCT_MC2718 0xffe8 |
| 254 | #define ZTE_PRODUCT_AC2726 0xfff1 | ||
| 254 | 255 | ||
| 255 | #define BENQ_VENDOR_ID 0x04a5 | 256 | #define BENQ_VENDOR_ID 0x04a5 |
| 256 | #define BENQ_PRODUCT_H10 0x4068 | 257 | #define BENQ_PRODUCT_H10 0x4068 |
| @@ -1453,6 +1454,7 @@ static const struct usb_device_id option_ids[] = { | |||
| 1453 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x01) }, | 1454 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x01) }, |
| 1454 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x05) }, | 1455 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x05) }, |
| 1455 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x86, 0x10) }, | 1456 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x86, 0x10) }, |
| 1457 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2726, 0xff, 0xff, 0xff) }, | ||
| 1456 | 1458 | ||
| 1457 | { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) }, | 1459 | { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) }, |
| 1458 | { USB_DEVICE(DLINK_VENDOR_ID, DLINK_PRODUCT_DWM_652) }, | 1460 | { USB_DEVICE(DLINK_VENDOR_ID, DLINK_PRODUCT_DWM_652) }, |
diff --git a/drivers/usb/serial/zte_ev.c b/drivers/usb/serial/zte_ev.c index fca4c752a4ed..eae2c873b39f 100644 --- a/drivers/usb/serial/zte_ev.c +++ b/drivers/usb/serial/zte_ev.c | |||
| @@ -281,8 +281,7 @@ static const struct usb_device_id id_table[] = { | |||
| 281 | { USB_DEVICE(0x19d2, 0xfffd) }, | 281 | { USB_DEVICE(0x19d2, 0xfffd) }, |
| 282 | { USB_DEVICE(0x19d2, 0xfffc) }, | 282 | { USB_DEVICE(0x19d2, 0xfffc) }, |
| 283 | { USB_DEVICE(0x19d2, 0xfffb) }, | 283 | { USB_DEVICE(0x19d2, 0xfffb) }, |
| 284 | /* AC2726, AC8710_V3 */ | 284 | /* AC8710_V3 */ |
| 285 | { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xfff1, 0xff, 0xff, 0xff) }, | ||
| 286 | { USB_DEVICE(0x19d2, 0xfff6) }, | 285 | { USB_DEVICE(0x19d2, 0xfff6) }, |
| 287 | { USB_DEVICE(0x19d2, 0xfff7) }, | 286 | { USB_DEVICE(0x19d2, 0xfff7) }, |
| 288 | { USB_DEVICE(0x19d2, 0xfff8) }, | 287 | { USB_DEVICE(0x19d2, 0xfff8) }, |
diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c index 55ea73f7c70b..4c02e2b94103 100644 --- a/drivers/xen/balloon.c +++ b/drivers/xen/balloon.c | |||
| @@ -350,17 +350,19 @@ static enum bp_state increase_reservation(unsigned long nr_pages) | |||
| 350 | 350 | ||
| 351 | pfn = page_to_pfn(page); | 351 | pfn = page_to_pfn(page); |
| 352 | 352 | ||
| 353 | set_phys_to_machine(pfn, frame_list[i]); | ||
| 354 | |||
| 355 | #ifdef CONFIG_XEN_HAVE_PVMMU | 353 | #ifdef CONFIG_XEN_HAVE_PVMMU |
| 356 | /* Link back into the page tables if not highmem. */ | 354 | if (!xen_feature(XENFEAT_auto_translated_physmap)) { |
| 357 | if (xen_pv_domain() && !PageHighMem(page)) { | 355 | set_phys_to_machine(pfn, frame_list[i]); |
| 358 | int ret; | 356 | |
| 359 | ret = HYPERVISOR_update_va_mapping( | 357 | /* Link back into the page tables if not highmem. */ |
| 360 | (unsigned long)__va(pfn << PAGE_SHIFT), | 358 | if (!PageHighMem(page)) { |
| 361 | mfn_pte(frame_list[i], PAGE_KERNEL), | 359 | int ret; |
| 362 | 0); | 360 | ret = HYPERVISOR_update_va_mapping( |
| 363 | BUG_ON(ret); | 361 | (unsigned long)__va(pfn << PAGE_SHIFT), |
| 362 | mfn_pte(frame_list[i], PAGE_KERNEL), | ||
| 363 | 0); | ||
| 364 | BUG_ON(ret); | ||
| 365 | } | ||
| 364 | } | 366 | } |
| 365 | #endif | 367 | #endif |
| 366 | 368 | ||
| @@ -378,7 +380,6 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp) | |||
| 378 | enum bp_state state = BP_DONE; | 380 | enum bp_state state = BP_DONE; |
| 379 | unsigned long pfn, i; | 381 | unsigned long pfn, i; |
| 380 | struct page *page; | 382 | struct page *page; |
| 381 | struct page *scratch_page; | ||
| 382 | int ret; | 383 | int ret; |
| 383 | struct xen_memory_reservation reservation = { | 384 | struct xen_memory_reservation reservation = { |
| 384 | .address_bits = 0, | 385 | .address_bits = 0, |
| @@ -411,27 +412,29 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp) | |||
| 411 | 412 | ||
| 412 | scrub_page(page); | 413 | scrub_page(page); |
| 413 | 414 | ||
| 415 | #ifdef CONFIG_XEN_HAVE_PVMMU | ||
| 414 | /* | 416 | /* |
| 415 | * Ballooned out frames are effectively replaced with | 417 | * Ballooned out frames are effectively replaced with |
| 416 | * a scratch frame. Ensure direct mappings and the | 418 | * a scratch frame. Ensure direct mappings and the |
| 417 | * p2m are consistent. | 419 | * p2m are consistent. |
| 418 | */ | 420 | */ |
| 419 | scratch_page = get_balloon_scratch_page(); | ||
| 420 | #ifdef CONFIG_XEN_HAVE_PVMMU | ||
| 421 | if (xen_pv_domain() && !PageHighMem(page)) { | ||
| 422 | ret = HYPERVISOR_update_va_mapping( | ||
| 423 | (unsigned long)__va(pfn << PAGE_SHIFT), | ||
| 424 | pfn_pte(page_to_pfn(scratch_page), | ||
| 425 | PAGE_KERNEL_RO), 0); | ||
| 426 | BUG_ON(ret); | ||
| 427 | } | ||
| 428 | #endif | ||
| 429 | if (!xen_feature(XENFEAT_auto_translated_physmap)) { | 421 | if (!xen_feature(XENFEAT_auto_translated_physmap)) { |
| 430 | unsigned long p; | 422 | unsigned long p; |
| 423 | struct page *scratch_page = get_balloon_scratch_page(); | ||
| 424 | |||
| 425 | if (!PageHighMem(page)) { | ||
| 426 | ret = HYPERVISOR_update_va_mapping( | ||
| 427 | (unsigned long)__va(pfn << PAGE_SHIFT), | ||
| 428 | pfn_pte(page_to_pfn(scratch_page), | ||
| 429 | PAGE_KERNEL_RO), 0); | ||
| 430 | BUG_ON(ret); | ||
| 431 | } | ||
| 431 | p = page_to_pfn(scratch_page); | 432 | p = page_to_pfn(scratch_page); |
| 432 | __set_phys_to_machine(pfn, pfn_to_mfn(p)); | 433 | __set_phys_to_machine(pfn, pfn_to_mfn(p)); |
| 434 | |||
| 435 | put_balloon_scratch_page(); | ||
| 433 | } | 436 | } |
| 434 | put_balloon_scratch_page(); | 437 | #endif |
| 435 | 438 | ||
| 436 | balloon_append(pfn_to_page(pfn)); | 439 | balloon_append(pfn_to_page(pfn)); |
| 437 | } | 440 | } |
| @@ -627,15 +630,17 @@ static int __init balloon_init(void) | |||
| 627 | if (!xen_domain()) | 630 | if (!xen_domain()) |
| 628 | return -ENODEV; | 631 | return -ENODEV; |
| 629 | 632 | ||
| 630 | for_each_online_cpu(cpu) | 633 | if (!xen_feature(XENFEAT_auto_translated_physmap)) { |
| 631 | { | 634 | for_each_online_cpu(cpu) |
| 632 | per_cpu(balloon_scratch_page, cpu) = alloc_page(GFP_KERNEL); | 635 | { |
| 633 | if (per_cpu(balloon_scratch_page, cpu) == NULL) { | 636 | per_cpu(balloon_scratch_page, cpu) = alloc_page(GFP_KERNEL); |
| 634 | pr_warn("Failed to allocate balloon_scratch_page for cpu %d\n", cpu); | 637 | if (per_cpu(balloon_scratch_page, cpu) == NULL) { |
| 635 | return -ENOMEM; | 638 | pr_warn("Failed to allocate balloon_scratch_page for cpu %d\n", cpu); |
| 639 | return -ENOMEM; | ||
| 640 | } | ||
| 636 | } | 641 | } |
| 642 | register_cpu_notifier(&balloon_cpu_notifier); | ||
| 637 | } | 643 | } |
| 638 | register_cpu_notifier(&balloon_cpu_notifier); | ||
| 639 | 644 | ||
| 640 | pr_info("Initialising balloon driver\n"); | 645 | pr_info("Initialising balloon driver\n"); |
| 641 | 646 | ||
diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c index 028387192b60..aa846a48f400 100644 --- a/drivers/xen/grant-table.c +++ b/drivers/xen/grant-table.c | |||
| @@ -1176,7 +1176,8 @@ static int gnttab_setup(void) | |||
| 1176 | gnttab_shared.addr = xen_remap(xen_hvm_resume_frames, | 1176 | gnttab_shared.addr = xen_remap(xen_hvm_resume_frames, |
| 1177 | PAGE_SIZE * max_nr_gframes); | 1177 | PAGE_SIZE * max_nr_gframes); |
| 1178 | if (gnttab_shared.addr == NULL) { | 1178 | if (gnttab_shared.addr == NULL) { |
| 1179 | pr_warn("Failed to ioremap gnttab share frames!\n"); | 1179 | pr_warn("Failed to ioremap gnttab share frames (addr=0x%08lx)!\n", |
| 1180 | xen_hvm_resume_frames); | ||
| 1180 | return -ENOMEM; | 1181 | return -ENOMEM; |
| 1181 | } | 1182 | } |
| 1182 | } | 1183 | } |
diff --git a/drivers/xen/privcmd.c b/drivers/xen/privcmd.c index 8e74590fa1bb..569a13b9e856 100644 --- a/drivers/xen/privcmd.c +++ b/drivers/xen/privcmd.c | |||
| @@ -533,12 +533,17 @@ static void privcmd_close(struct vm_area_struct *vma) | |||
| 533 | { | 533 | { |
| 534 | struct page **pages = vma->vm_private_data; | 534 | struct page **pages = vma->vm_private_data; |
| 535 | int numpgs = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; | 535 | int numpgs = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; |
| 536 | int rc; | ||
| 536 | 537 | ||
| 537 | if (!xen_feature(XENFEAT_auto_translated_physmap) || !numpgs || !pages) | 538 | if (!xen_feature(XENFEAT_auto_translated_physmap) || !numpgs || !pages) |
| 538 | return; | 539 | return; |
| 539 | 540 | ||
| 540 | xen_unmap_domain_mfn_range(vma, numpgs, pages); | 541 | rc = xen_unmap_domain_mfn_range(vma, numpgs, pages); |
| 541 | free_xenballooned_pages(numpgs, pages); | 542 | if (rc == 0) |
| 543 | free_xenballooned_pages(numpgs, pages); | ||
| 544 | else | ||
| 545 | pr_crit("unable to unmap MFN range: leaking %d pages. rc=%d\n", | ||
| 546 | numpgs, rc); | ||
| 542 | kfree(pages); | 547 | kfree(pages); |
| 543 | } | 548 | } |
| 544 | 549 | ||
