mirror of
https://github.com/Fishwaldo/build.git
synced 2025-03-27 09:11:49 +00:00
743 lines
24 KiB
Diff
743 lines
24 KiB
Diff
diff --git a/Makefile b/Makefile
|
|
index 2fe1f6d..7f4df0c 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,6 +1,6 @@
|
|
VERSION = 3
|
|
PATCHLEVEL = 4
|
|
-SUBLEVEL = 56
|
|
+SUBLEVEL = 57
|
|
EXTRAVERSION =
|
|
NAME = Saber-toothed Squirrel
|
|
|
|
diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c
|
|
index 2d6e649..6610e81 100644
|
|
--- a/arch/x86/kernel/i387.c
|
|
+++ b/arch/x86/kernel/i387.c
|
|
@@ -132,7 +132,7 @@ static void __cpuinit mxcsr_feature_mask_init(void)
|
|
clts();
|
|
if (cpu_has_fxsr) {
|
|
memset(&fx_scratch, 0, sizeof(struct i387_fxsave_struct));
|
|
- asm volatile("fxsave %0" : : "m" (fx_scratch));
|
|
+ asm volatile("fxsave %0" : "+m" (fx_scratch));
|
|
mask = fx_scratch.mxcsr_mask;
|
|
if (mask == 0)
|
|
mask = 0x0000ffbf;
|
|
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
|
|
index 6ea287e2..9bdfcf5 100644
|
|
--- a/drivers/acpi/battery.c
|
|
+++ b/drivers/acpi/battery.c
|
|
@@ -117,6 +117,7 @@ struct acpi_battery {
|
|
struct acpi_device *device;
|
|
struct notifier_block pm_nb;
|
|
unsigned long update_time;
|
|
+ int revision;
|
|
int rate_now;
|
|
int capacity_now;
|
|
int voltage_now;
|
|
@@ -350,6 +351,7 @@ static struct acpi_offsets info_offsets[] = {
|
|
};
|
|
|
|
static struct acpi_offsets extended_info_offsets[] = {
|
|
+ {offsetof(struct acpi_battery, revision), 0},
|
|
{offsetof(struct acpi_battery, power_unit), 0},
|
|
{offsetof(struct acpi_battery, design_capacity), 0},
|
|
{offsetof(struct acpi_battery, full_charge_capacity), 0},
|
|
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
|
|
index 45c5cf8..232119a 100644
|
|
--- a/drivers/gpu/drm/i915/i915_drv.h
|
|
+++ b/drivers/gpu/drm/i915/i915_drv.h
|
|
@@ -296,6 +296,7 @@ enum intel_pch {
|
|
|
|
#define QUIRK_PIPEA_FORCE (1<<0)
|
|
#define QUIRK_LVDS_SSC_DISABLE (1<<1)
|
|
+#define QUIRK_NO_PCH_PWM_ENABLE (1<<2)
|
|
|
|
struct intel_fbdev;
|
|
struct intel_fbc_work;
|
|
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
|
|
index 84867a8..0e35922 100644
|
|
--- a/drivers/gpu/drm/i915/intel_display.c
|
|
+++ b/drivers/gpu/drm/i915/intel_display.c
|
|
@@ -9160,6 +9160,17 @@ static void quirk_ssc_force_disable(struct drm_device *dev)
|
|
dev_priv->quirks |= QUIRK_LVDS_SSC_DISABLE;
|
|
}
|
|
|
|
+/*
|
|
+ * Some machines (Dell XPS13) suffer broken backlight controls if
|
|
+ * BLM_PCH_PWM_ENABLE is set.
|
|
+ */
|
|
+static void quirk_no_pcm_pwm_enable(struct drm_device *dev)
|
|
+{
|
|
+ struct drm_i915_private *dev_priv = dev->dev_private;
|
|
+ dev_priv->quirks |= QUIRK_NO_PCH_PWM_ENABLE;
|
|
+ DRM_INFO("applying no-PCH_PWM_ENABLE quirk\n");
|
|
+}
|
|
+
|
|
struct intel_quirk {
|
|
int device;
|
|
int subsystem_vendor;
|
|
@@ -9192,6 +9203,11 @@ struct intel_quirk intel_quirks[] = {
|
|
|
|
/* Sony Vaio Y cannot use SSC on LVDS */
|
|
{ 0x0046, 0x104d, 0x9076, quirk_ssc_force_disable },
|
|
+
|
|
+ /* Dell XPS13 HD Sandy Bridge */
|
|
+ { 0x0116, 0x1028, 0x052e, quirk_no_pcm_pwm_enable },
|
|
+ /* Dell XPS13 HD and XPS13 FHD Ivy Bridge */
|
|
+ { 0x0166, 0x1028, 0x058b, quirk_no_pcm_pwm_enable },
|
|
};
|
|
|
|
static void intel_init_quirks(struct drm_device *dev)
|
|
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
|
|
index 207180d..ab4d990 100644
|
|
--- a/drivers/gpu/drm/i915/intel_lvds.c
|
|
+++ b/drivers/gpu/drm/i915/intel_lvds.c
|
|
@@ -1097,7 +1097,8 @@ bool intel_lvds_init(struct drm_device *dev)
|
|
goto failed;
|
|
|
|
out:
|
|
- if (HAS_PCH_SPLIT(dev)) {
|
|
+ if (HAS_PCH_SPLIT(dev) &&
|
|
+ !(dev_priv->quirks & QUIRK_NO_PCH_PWM_ENABLE)) {
|
|
u32 pwm;
|
|
|
|
pipe = (I915_READ(PCH_LVDS) & LVDS_PIPEB_SELECT) ? 1 : 0;
|
|
diff --git a/drivers/net/arcnet/arcnet.c b/drivers/net/arcnet/arcnet.c
|
|
index a746ba2..a956053 100644
|
|
--- a/drivers/net/arcnet/arcnet.c
|
|
+++ b/drivers/net/arcnet/arcnet.c
|
|
@@ -1007,7 +1007,7 @@ static void arcnet_rx(struct net_device *dev, int bufnum)
|
|
|
|
soft = &pkt.soft.rfc1201;
|
|
|
|
- lp->hw.copy_from_card(dev, bufnum, 0, &pkt, sizeof(ARC_HDR_SIZE));
|
|
+ lp->hw.copy_from_card(dev, bufnum, 0, &pkt, ARC_HDR_SIZE);
|
|
if (pkt.hard.offset[0]) {
|
|
ofs = pkt.hard.offset[0];
|
|
length = 256 - ofs;
|
|
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_82598.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_82598.c
|
|
index d3695ed..a061e37 100644
|
|
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_82598.c
|
|
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_82598.c
|
|
@@ -108,9 +108,8 @@ s32 ixgbe_dcb_config_tx_desc_arbiter_82598(struct ixgbe_hw *hw,
|
|
|
|
/* Enable arbiter */
|
|
reg &= ~IXGBE_DPMCS_ARBDIS;
|
|
- /* Enable DFP and Recycle mode */
|
|
- reg |= (IXGBE_DPMCS_TDPAC | IXGBE_DPMCS_TRM);
|
|
reg |= IXGBE_DPMCS_TSOEF;
|
|
+
|
|
/* Configure Max TSO packet size 34KB including payload and headers */
|
|
reg |= (0x4 << IXGBE_DPMCS_MTSOS_SHIFT);
|
|
|
|
diff --git a/drivers/net/ethernet/realtek/8139cp.c b/drivers/net/ethernet/realtek/8139cp.c
|
|
index 4ce981c..2205db7 100644
|
|
--- a/drivers/net/ethernet/realtek/8139cp.c
|
|
+++ b/drivers/net/ethernet/realtek/8139cp.c
|
|
@@ -478,7 +478,7 @@ rx_status_loop:
|
|
|
|
while (1) {
|
|
u32 status, len;
|
|
- dma_addr_t mapping;
|
|
+ dma_addr_t mapping, new_mapping;
|
|
struct sk_buff *skb, *new_skb;
|
|
struct cp_desc *desc;
|
|
const unsigned buflen = cp->rx_buf_sz;
|
|
@@ -520,6 +520,13 @@ rx_status_loop:
|
|
goto rx_next;
|
|
}
|
|
|
|
+ new_mapping = dma_map_single(&cp->pdev->dev, new_skb->data, buflen,
|
|
+ PCI_DMA_FROMDEVICE);
|
|
+ if (dma_mapping_error(&cp->pdev->dev, new_mapping)) {
|
|
+ dev->stats.rx_dropped++;
|
|
+ goto rx_next;
|
|
+ }
|
|
+
|
|
dma_unmap_single(&cp->pdev->dev, mapping,
|
|
buflen, PCI_DMA_FROMDEVICE);
|
|
|
|
@@ -531,12 +538,11 @@ rx_status_loop:
|
|
|
|
skb_put(skb, len);
|
|
|
|
- mapping = dma_map_single(&cp->pdev->dev, new_skb->data, buflen,
|
|
- PCI_DMA_FROMDEVICE);
|
|
cp->rx_skb[rx_tail] = new_skb;
|
|
|
|
cp_rx_skb(cp, skb, desc);
|
|
rx++;
|
|
+ mapping = new_mapping;
|
|
|
|
rx_next:
|
|
cp->rx_ring[rx_tail].opts2 = 0;
|
|
@@ -704,6 +710,22 @@ static inline u32 cp_tx_vlan_tag(struct sk_buff *skb)
|
|
TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00;
|
|
}
|
|
|
|
+static void unwind_tx_frag_mapping(struct cp_private *cp, struct sk_buff *skb,
|
|
+ int first, int entry_last)
|
|
+{
|
|
+ int frag, index;
|
|
+ struct cp_desc *txd;
|
|
+ skb_frag_t *this_frag;
|
|
+ for (frag = 0; frag+first < entry_last; frag++) {
|
|
+ index = first+frag;
|
|
+ cp->tx_skb[index] = NULL;
|
|
+ txd = &cp->tx_ring[index];
|
|
+ this_frag = &skb_shinfo(skb)->frags[frag];
|
|
+ dma_unmap_single(&cp->pdev->dev, le64_to_cpu(txd->addr),
|
|
+ skb_frag_size(this_frag), PCI_DMA_TODEVICE);
|
|
+ }
|
|
+}
|
|
+
|
|
static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
|
|
struct net_device *dev)
|
|
{
|
|
@@ -737,6 +759,9 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
|
|
|
|
len = skb->len;
|
|
mapping = dma_map_single(&cp->pdev->dev, skb->data, len, PCI_DMA_TODEVICE);
|
|
+ if (dma_mapping_error(&cp->pdev->dev, mapping))
|
|
+ goto out_dma_error;
|
|
+
|
|
txd->opts2 = opts2;
|
|
txd->addr = cpu_to_le64(mapping);
|
|
wmb();
|
|
@@ -774,6 +799,9 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
|
|
first_len = skb_headlen(skb);
|
|
first_mapping = dma_map_single(&cp->pdev->dev, skb->data,
|
|
first_len, PCI_DMA_TODEVICE);
|
|
+ if (dma_mapping_error(&cp->pdev->dev, first_mapping))
|
|
+ goto out_dma_error;
|
|
+
|
|
cp->tx_skb[entry] = skb;
|
|
entry = NEXT_TX(entry);
|
|
|
|
@@ -787,6 +815,11 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
|
|
mapping = dma_map_single(&cp->pdev->dev,
|
|
skb_frag_address(this_frag),
|
|
len, PCI_DMA_TODEVICE);
|
|
+ if (dma_mapping_error(&cp->pdev->dev, mapping)) {
|
|
+ unwind_tx_frag_mapping(cp, skb, first_entry, entry);
|
|
+ goto out_dma_error;
|
|
+ }
|
|
+
|
|
eor = (entry == (CP_TX_RING_SIZE - 1)) ? RingEnd : 0;
|
|
|
|
ctrl = eor | len | DescOwn;
|
|
@@ -845,11 +878,16 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
|
|
if (TX_BUFFS_AVAIL(cp) <= (MAX_SKB_FRAGS + 1))
|
|
netif_stop_queue(dev);
|
|
|
|
+out_unlock:
|
|
spin_unlock_irqrestore(&cp->lock, intr_flags);
|
|
|
|
cpw8(TxPoll, NormalTxPoll);
|
|
|
|
return NETDEV_TX_OK;
|
|
+out_dma_error:
|
|
+ kfree_skb(skb);
|
|
+ cp->dev->stats.tx_dropped++;
|
|
+ goto out_unlock;
|
|
}
|
|
|
|
/* Set or clear the multicast filter for this adaptor.
|
|
@@ -1020,6 +1058,10 @@ static int cp_refill_rx(struct cp_private *cp)
|
|
|
|
mapping = dma_map_single(&cp->pdev->dev, skb->data,
|
|
cp->rx_buf_sz, PCI_DMA_FROMDEVICE);
|
|
+ if (dma_mapping_error(&cp->pdev->dev, mapping)) {
|
|
+ kfree_skb(skb);
|
|
+ goto err_out;
|
|
+ }
|
|
cp->rx_skb[i] = skb;
|
|
|
|
cp->rx_ring[i].opts2 = 0;
|
|
diff --git a/drivers/net/usb/smsc75xx.c b/drivers/net/usb/smsc75xx.c
|
|
index 5caba55..d89747a 100644
|
|
--- a/drivers/net/usb/smsc75xx.c
|
|
+++ b/drivers/net/usb/smsc75xx.c
|
|
@@ -43,7 +43,6 @@
|
|
#define EEPROM_MAC_OFFSET (0x01)
|
|
#define DEFAULT_TX_CSUM_ENABLE (true)
|
|
#define DEFAULT_RX_CSUM_ENABLE (true)
|
|
-#define DEFAULT_TSO_ENABLE (true)
|
|
#define SMSC75XX_INTERNAL_PHY_ID (1)
|
|
#define SMSC75XX_TX_OVERHEAD (8)
|
|
#define MAX_RX_FIFO_SIZE (20 * 1024)
|
|
@@ -1049,17 +1048,14 @@ static int smsc75xx_bind(struct usbnet *dev, struct usb_interface *intf)
|
|
|
|
INIT_WORK(&pdata->set_multicast, smsc75xx_deferred_multicast_write);
|
|
|
|
- if (DEFAULT_TX_CSUM_ENABLE) {
|
|
+ if (DEFAULT_TX_CSUM_ENABLE)
|
|
dev->net->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
|
|
- if (DEFAULT_TSO_ENABLE)
|
|
- dev->net->features |= NETIF_F_SG |
|
|
- NETIF_F_TSO | NETIF_F_TSO6;
|
|
- }
|
|
+
|
|
if (DEFAULT_RX_CSUM_ENABLE)
|
|
dev->net->features |= NETIF_F_RXCSUM;
|
|
|
|
dev->net->hw_features = NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
|
|
- NETIF_F_SG | NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_RXCSUM;
|
|
+ NETIF_F_RXCSUM;
|
|
|
|
/* Init all registers */
|
|
ret = smsc75xx_reset(dev);
|
|
@@ -1184,8 +1180,6 @@ static struct sk_buff *smsc75xx_tx_fixup(struct usbnet *dev,
|
|
{
|
|
u32 tx_cmd_a, tx_cmd_b;
|
|
|
|
- skb_linearize(skb);
|
|
-
|
|
if (skb_headroom(skb) < SMSC75XX_TX_OVERHEAD) {
|
|
struct sk_buff *skb2 =
|
|
skb_copy_expand(skb, SMSC75XX_TX_OVERHEAD, 0, flags);
|
|
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_init.c b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
|
|
index 41c5237..2b8406a 100644
|
|
--- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c
|
|
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
|
|
@@ -821,6 +821,7 @@ static int ath9k_init_device(struct ath9k_htc_priv *priv,
|
|
if (error != 0)
|
|
goto err_rx;
|
|
|
|
+ ath9k_hw_disable(priv->ah);
|
|
#ifdef CONFIG_MAC80211_LEDS
|
|
/* must be initialized before ieee80211_register_hw */
|
|
priv->led_cdev.default_trigger = ieee80211_create_tpt_led_trigger(priv->hw,
|
|
diff --git a/drivers/net/wireless/mwifiex/sdio.c b/drivers/net/wireless/mwifiex/sdio.c
|
|
index 7d00a87..4be8ccc 100644
|
|
--- a/drivers/net/wireless/mwifiex/sdio.c
|
|
+++ b/drivers/net/wireless/mwifiex/sdio.c
|
|
@@ -1449,8 +1449,8 @@ static int mwifiex_sdio_host_to_card(struct mwifiex_adapter *adapter,
|
|
/* Allocate buffer and copy payload */
|
|
blk_size = MWIFIEX_SDIO_BLOCK_SIZE;
|
|
buf_block_len = (pkt_len + blk_size - 1) / blk_size;
|
|
- *(u16 *) &payload[0] = (u16) pkt_len;
|
|
- *(u16 *) &payload[2] = type;
|
|
+ *(__le16 *)&payload[0] = cpu_to_le16((u16)pkt_len);
|
|
+ *(__le16 *)&payload[2] = cpu_to_le16(type);
|
|
|
|
/*
|
|
* This is SDIO specific header
|
|
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c
|
|
index 50f92d5..4d792a2 100644
|
|
--- a/drivers/net/wireless/rt2x00/rt2x00queue.c
|
|
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
|
|
@@ -856,13 +856,8 @@ void rt2x00queue_index_inc(struct queue_entry *entry, enum queue_index index)
|
|
spin_unlock_irqrestore(&queue->index_lock, irqflags);
|
|
}
|
|
|
|
-void rt2x00queue_pause_queue(struct data_queue *queue)
|
|
+void rt2x00queue_pause_queue_nocheck(struct data_queue *queue)
|
|
{
|
|
- if (!test_bit(DEVICE_STATE_PRESENT, &queue->rt2x00dev->flags) ||
|
|
- !test_bit(QUEUE_STARTED, &queue->flags) ||
|
|
- test_and_set_bit(QUEUE_PAUSED, &queue->flags))
|
|
- return;
|
|
-
|
|
switch (queue->qid) {
|
|
case QID_AC_VO:
|
|
case QID_AC_VI:
|
|
@@ -878,6 +873,15 @@ void rt2x00queue_pause_queue(struct data_queue *queue)
|
|
break;
|
|
}
|
|
}
|
|
+void rt2x00queue_pause_queue(struct data_queue *queue)
|
|
+{
|
|
+ if (!test_bit(DEVICE_STATE_PRESENT, &queue->rt2x00dev->flags) ||
|
|
+ !test_bit(QUEUE_STARTED, &queue->flags) ||
|
|
+ test_and_set_bit(QUEUE_PAUSED, &queue->flags))
|
|
+ return;
|
|
+
|
|
+ rt2x00queue_pause_queue_nocheck(queue);
|
|
+}
|
|
EXPORT_SYMBOL_GPL(rt2x00queue_pause_queue);
|
|
|
|
void rt2x00queue_unpause_queue(struct data_queue *queue)
|
|
@@ -939,7 +943,7 @@ void rt2x00queue_stop_queue(struct data_queue *queue)
|
|
return;
|
|
}
|
|
|
|
- rt2x00queue_pause_queue(queue);
|
|
+ rt2x00queue_pause_queue_nocheck(queue);
|
|
|
|
queue->rt2x00dev->ops->lib->stop_queue(queue);
|
|
|
|
diff --git a/drivers/tty/serial/mxs-auart.c b/drivers/tty/serial/mxs-auart.c
|
|
index 039c054..c75b27b 100644
|
|
--- a/drivers/tty/serial/mxs-auart.c
|
|
+++ b/drivers/tty/serial/mxs-auart.c
|
|
@@ -375,11 +375,18 @@ static void mxs_auart_settermios(struct uart_port *u,
|
|
|
|
static irqreturn_t mxs_auart_irq_handle(int irq, void *context)
|
|
{
|
|
- u32 istatus, istat;
|
|
+ u32 istat;
|
|
struct mxs_auart_port *s = context;
|
|
u32 stat = readl(s->port.membase + AUART_STAT);
|
|
|
|
- istatus = istat = readl(s->port.membase + AUART_INTR);
|
|
+ istat = readl(s->port.membase + AUART_INTR);
|
|
+
|
|
+ /* ack irq */
|
|
+ writel(istat & (AUART_INTR_RTIS
|
|
+ | AUART_INTR_TXIS
|
|
+ | AUART_INTR_RXIS
|
|
+ | AUART_INTR_CTSMIS),
|
|
+ s->port.membase + AUART_INTR_CLR);
|
|
|
|
if (istat & AUART_INTR_CTSMIS) {
|
|
uart_handle_cts_change(&s->port, stat & AUART_STAT_CTS);
|
|
@@ -398,12 +405,6 @@ static irqreturn_t mxs_auart_irq_handle(int irq, void *context)
|
|
istat &= ~AUART_INTR_TXIS;
|
|
}
|
|
|
|
- writel(istatus & (AUART_INTR_RTIS
|
|
- | AUART_INTR_TXIS
|
|
- | AUART_INTR_RXIS
|
|
- | AUART_INTR_CTSMIS),
|
|
- s->port.membase + AUART_INTR_CLR);
|
|
-
|
|
return IRQ_HANDLED;
|
|
}
|
|
|
|
@@ -543,7 +544,7 @@ auart_console_write(struct console *co, const char *str, unsigned int count)
|
|
struct mxs_auart_port *s;
|
|
struct uart_port *port;
|
|
unsigned int old_ctrl0, old_ctrl2;
|
|
- unsigned int to = 1000;
|
|
+ unsigned int to = 20000;
|
|
|
|
if (co->index > MXS_AUART_PORTS || co->index < 0)
|
|
return;
|
|
@@ -564,18 +565,23 @@ auart_console_write(struct console *co, const char *str, unsigned int count)
|
|
|
|
uart_console_write(port, str, count, mxs_auart_console_putchar);
|
|
|
|
- /*
|
|
- * Finally, wait for transmitter to become empty
|
|
- * and restore the TCR
|
|
- */
|
|
+ /* Finally, wait for transmitter to become empty ... */
|
|
while (readl(port->membase + AUART_STAT) & AUART_STAT_BUSY) {
|
|
+ udelay(1);
|
|
if (!to--)
|
|
break;
|
|
- udelay(1);
|
|
}
|
|
|
|
- writel(old_ctrl0, port->membase + AUART_CTRL0);
|
|
- writel(old_ctrl2, port->membase + AUART_CTRL2);
|
|
+ /*
|
|
+ * ... and restore the TCR if we waited long enough for the transmitter
|
|
+ * to be idle. This might keep the transmitter enabled although it is
|
|
+ * unused, but that is better than to disable it while it is still
|
|
+ * transmitting.
|
|
+ */
|
|
+ if (!(readl(port->membase + AUART_STAT) & AUART_STAT_BUSY)) {
|
|
+ writel(old_ctrl0, port->membase + AUART_CTRL0);
|
|
+ writel(old_ctrl2, port->membase + AUART_CTRL2);
|
|
+ }
|
|
|
|
clk_disable(s->clk);
|
|
}
|
|
diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c
|
|
index 3568c8a..48bc91d 100644
|
|
--- a/fs/notify/fanotify/fanotify_user.c
|
|
+++ b/fs/notify/fanotify/fanotify_user.c
|
|
@@ -120,6 +120,7 @@ static int fill_event_metadata(struct fsnotify_group *group,
|
|
metadata->event_len = FAN_EVENT_METADATA_LEN;
|
|
metadata->metadata_len = FAN_EVENT_METADATA_LEN;
|
|
metadata->vers = FANOTIFY_METADATA_VERSION;
|
|
+ metadata->reserved = 0;
|
|
metadata->mask = event->mask & FAN_ALL_OUTGOING_EVENTS;
|
|
metadata->pid = pid_vnr(event->tgid);
|
|
if (unlikely(event->mask & FAN_Q_OVERFLOW))
|
|
diff --git a/kernel/events/core.c b/kernel/events/core.c
|
|
index d074cf0..8e810ba 100644
|
|
--- a/kernel/events/core.c
|
|
+++ b/kernel/events/core.c
|
|
@@ -250,9 +250,9 @@ perf_cgroup_match(struct perf_event *event)
|
|
return !event->cgrp || event->cgrp == cpuctx->cgrp;
|
|
}
|
|
|
|
-static inline void perf_get_cgroup(struct perf_event *event)
|
|
+static inline bool perf_tryget_cgroup(struct perf_event *event)
|
|
{
|
|
- css_get(&event->cgrp->css);
|
|
+ return css_tryget(&event->cgrp->css);
|
|
}
|
|
|
|
static inline void perf_put_cgroup(struct perf_event *event)
|
|
@@ -481,7 +481,11 @@ static inline int perf_cgroup_connect(int fd, struct perf_event *event,
|
|
event->cgrp = cgrp;
|
|
|
|
/* must be done before we fput() the file */
|
|
- perf_get_cgroup(event);
|
|
+ if (!perf_tryget_cgroup(event)) {
|
|
+ event->cgrp = NULL;
|
|
+ ret = -ENOENT;
|
|
+ goto out;
|
|
+ }
|
|
|
|
/*
|
|
* all events in a group must monitor
|
|
@@ -911,6 +915,15 @@ list_add_event(struct perf_event *event, struct perf_event_context *ctx)
|
|
}
|
|
|
|
/*
|
|
+ * Initialize event state based on the perf_event_attr::disabled.
|
|
+ */
|
|
+static inline void perf_event__state_init(struct perf_event *event)
|
|
+{
|
|
+ event->state = event->attr.disabled ? PERF_EVENT_STATE_OFF :
|
|
+ PERF_EVENT_STATE_INACTIVE;
|
|
+}
|
|
+
|
|
+/*
|
|
* Called at perf_event creation and when events are attached/detached from a
|
|
* group.
|
|
*/
|
|
@@ -6058,8 +6071,7 @@ perf_event_alloc(struct perf_event_attr *attr, int cpu,
|
|
event->overflow_handler = overflow_handler;
|
|
event->overflow_handler_context = context;
|
|
|
|
- if (attr->disabled)
|
|
- event->state = PERF_EVENT_STATE_OFF;
|
|
+ perf_event__state_init(event);
|
|
|
|
pmu = NULL;
|
|
|
|
@@ -6481,9 +6493,17 @@ SYSCALL_DEFINE5(perf_event_open,
|
|
|
|
mutex_lock(&gctx->mutex);
|
|
perf_remove_from_context(group_leader);
|
|
+
|
|
+ /*
|
|
+ * Removing from the context ends up with disabled
|
|
+ * event. What we want here is event in the initial
|
|
+ * startup state, ready to be add into new context.
|
|
+ */
|
|
+ perf_event__state_init(group_leader);
|
|
list_for_each_entry(sibling, &group_leader->sibling_list,
|
|
group_entry) {
|
|
perf_remove_from_context(sibling);
|
|
+ perf_event__state_init(sibling);
|
|
put_ctx(gctx);
|
|
}
|
|
mutex_unlock(&gctx->mutex);
|
|
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
|
|
index e955364..da4512f 100644
|
|
--- a/kernel/sched/fair.c
|
|
+++ b/kernel/sched/fair.c
|
|
@@ -5511,7 +5511,7 @@ static unsigned int get_rr_interval_fair(struct rq *rq, struct task_struct *task
|
|
* idle runqueue:
|
|
*/
|
|
if (rq->cfs.load.weight)
|
|
- rr_interval = NS_TO_JIFFIES(sched_slice(&rq->cfs, se));
|
|
+ rr_interval = NS_TO_JIFFIES(sched_slice(cfs_rq_of(se), se));
|
|
|
|
return rr_interval;
|
|
}
|
|
diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c
|
|
index bf7a604..086c973 100644
|
|
--- a/net/ipv4/sysctl_net_ipv4.c
|
|
+++ b/net/ipv4/sysctl_net_ipv4.c
|
|
@@ -34,6 +34,8 @@ static int tcp_adv_win_scale_min = -31;
|
|
static int tcp_adv_win_scale_max = 31;
|
|
static int ip_ttl_min = 1;
|
|
static int ip_ttl_max = 255;
|
|
+static int tcp_syn_retries_min = 1;
|
|
+static int tcp_syn_retries_max = MAX_TCP_SYNCNT;
|
|
static int ip_ping_group_range_min[] = { 0, 0 };
|
|
static int ip_ping_group_range_max[] = { GID_T_MAX, GID_T_MAX };
|
|
|
|
@@ -276,7 +278,9 @@ static struct ctl_table ipv4_table[] = {
|
|
.data = &sysctl_tcp_syn_retries,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
- .proc_handler = proc_dointvec
|
|
+ .proc_handler = proc_dointvec_minmax,
|
|
+ .extra1 = &tcp_syn_retries_min,
|
|
+ .extra2 = &tcp_syn_retries_max
|
|
},
|
|
{
|
|
.procname = "tcp_synack_retries",
|
|
diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c
|
|
index 8110362..d5e4615 100644
|
|
--- a/net/ipv6/ip6mr.c
|
|
+++ b/net/ipv6/ip6mr.c
|
|
@@ -256,10 +256,12 @@ static void __net_exit ip6mr_rules_exit(struct net *net)
|
|
{
|
|
struct mr6_table *mrt, *next;
|
|
|
|
+ rtnl_lock();
|
|
list_for_each_entry_safe(mrt, next, &net->ipv6.mr6_tables, list) {
|
|
list_del(&mrt->list);
|
|
ip6mr_free_table(mrt);
|
|
}
|
|
+ rtnl_unlock();
|
|
fib_rules_unregister(net->ipv6.mr6_rules_ops);
|
|
}
|
|
#else
|
|
@@ -286,7 +288,10 @@ static int __net_init ip6mr_rules_init(struct net *net)
|
|
|
|
static void __net_exit ip6mr_rules_exit(struct net *net)
|
|
{
|
|
+ rtnl_lock();
|
|
ip6mr_free_table(net->ipv6.mrt6);
|
|
+ net->ipv6.mrt6 = NULL;
|
|
+ rtnl_unlock();
|
|
}
|
|
#endif
|
|
|
|
diff --git a/net/key/af_key.c b/net/key/af_key.c
|
|
index 5bbab6a..60109f4 100644
|
|
--- a/net/key/af_key.c
|
|
+++ b/net/key/af_key.c
|
|
@@ -2073,6 +2073,7 @@ static int pfkey_xfrm_policy2msg(struct sk_buff *skb, const struct xfrm_policy *
|
|
pol->sadb_x_policy_type = IPSEC_POLICY_NONE;
|
|
}
|
|
pol->sadb_x_policy_dir = dir+1;
|
|
+ pol->sadb_x_policy_reserved = 0;
|
|
pol->sadb_x_policy_id = xp->index;
|
|
pol->sadb_x_policy_priority = xp->priority;
|
|
|
|
@@ -3108,7 +3109,9 @@ static int pfkey_send_acquire(struct xfrm_state *x, struct xfrm_tmpl *t, struct
|
|
pol->sadb_x_policy_exttype = SADB_X_EXT_POLICY;
|
|
pol->sadb_x_policy_type = IPSEC_POLICY_IPSEC;
|
|
pol->sadb_x_policy_dir = dir+1;
|
|
+ pol->sadb_x_policy_reserved = 0;
|
|
pol->sadb_x_policy_id = xp->index;
|
|
+ pol->sadb_x_policy_priority = xp->priority;
|
|
|
|
/* Set sadb_comb's. */
|
|
if (x->id.proto == IPPROTO_AH)
|
|
@@ -3496,6 +3499,7 @@ static int pfkey_send_migrate(const struct xfrm_selector *sel, u8 dir, u8 type,
|
|
pol->sadb_x_policy_exttype = SADB_X_EXT_POLICY;
|
|
pol->sadb_x_policy_type = IPSEC_POLICY_IPSEC;
|
|
pol->sadb_x_policy_dir = dir + 1;
|
|
+ pol->sadb_x_policy_reserved = 0;
|
|
pol->sadb_x_policy_id = 0;
|
|
pol->sadb_x_policy_priority = 0;
|
|
|
|
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
|
|
index 8ce9feb..067aa2a 100644
|
|
--- a/net/mac80211/rx.c
|
|
+++ b/net/mac80211/rx.c
|
|
@@ -831,8 +831,14 @@ ieee80211_rx_h_check(struct ieee80211_rx_data *rx)
|
|
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
|
|
struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);
|
|
|
|
- /* Drop duplicate 802.11 retransmissions (IEEE 802.11 Chap. 9.2.9) */
|
|
- if (rx->sta && !is_multicast_ether_addr(hdr->addr1)) {
|
|
+ /*
|
|
+ * Drop duplicate 802.11 retransmissions
|
|
+ * (IEEE 802.11-2012: 9.3.2.10 "Duplicate detection and recovery")
|
|
+ */
|
|
+ if (rx->skb->len >= 24 && rx->sta &&
|
|
+ !ieee80211_is_ctl(hdr->frame_control) &&
|
|
+ !ieee80211_is_qos_nullfunc(hdr->frame_control) &&
|
|
+ !is_multicast_ether_addr(hdr->addr1)) {
|
|
if (unlikely(ieee80211_has_retry(hdr->frame_control) &&
|
|
rx->sta->last_seq_ctrl[rx->seqno_idx] ==
|
|
hdr->seq_ctrl)) {
|
|
diff --git a/net/sched/sch_atm.c b/net/sched/sch_atm.c
|
|
index e25e490..6e38ef0 100644
|
|
--- a/net/sched/sch_atm.c
|
|
+++ b/net/sched/sch_atm.c
|
|
@@ -606,6 +606,7 @@ static int atm_tc_dump_class(struct Qdisc *sch, unsigned long cl,
|
|
struct sockaddr_atmpvc pvc;
|
|
int state;
|
|
|
|
+ memset(&pvc, 0, sizeof(pvc));
|
|
pvc.sap_family = AF_ATMPVC;
|
|
pvc.sap_addr.itf = flow->vcc->dev ? flow->vcc->dev->number : -1;
|
|
pvc.sap_addr.vpi = flow->vcc->vpi;
|
|
diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c
|
|
index b7cddb9..7f59944 100644
|
|
--- a/net/sched/sch_cbq.c
|
|
+++ b/net/sched/sch_cbq.c
|
|
@@ -1467,6 +1467,7 @@ static int cbq_dump_wrr(struct sk_buff *skb, struct cbq_class *cl)
|
|
unsigned char *b = skb_tail_pointer(skb);
|
|
struct tc_cbq_wrropt opt;
|
|
|
|
+ memset(&opt, 0, sizeof(opt));
|
|
opt.flags = 0;
|
|
opt.allot = cl->allot;
|
|
opt.priority = cl->priority + 1;
|
|
diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c
|
|
index 96eb168..3dd7207 100644
|
|
--- a/net/sctp/outqueue.c
|
|
+++ b/net/sctp/outqueue.c
|
|
@@ -205,6 +205,8 @@ static inline int sctp_cacc_skip(struct sctp_transport *primary,
|
|
*/
|
|
void sctp_outq_init(struct sctp_association *asoc, struct sctp_outq *q)
|
|
{
|
|
+ memset(q, 0, sizeof(struct sctp_outq));
|
|
+
|
|
q->asoc = asoc;
|
|
INIT_LIST_HEAD(&q->out_chunk_list);
|
|
INIT_LIST_HEAD(&q->control_chunk_list);
|
|
@@ -212,13 +214,7 @@ void sctp_outq_init(struct sctp_association *asoc, struct sctp_outq *q)
|
|
INIT_LIST_HEAD(&q->sacked);
|
|
INIT_LIST_HEAD(&q->abandoned);
|
|
|
|
- q->fast_rtx = 0;
|
|
- q->outstanding_bytes = 0;
|
|
q->empty = 1;
|
|
- q->cork = 0;
|
|
-
|
|
- q->malloced = 0;
|
|
- q->out_qlen = 0;
|
|
}
|
|
|
|
/* Free the outqueue structure and any related pending chunks.
|
|
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
|
|
index f432c57..add9f94 100644
|
|
--- a/net/wireless/nl80211.c
|
|
+++ b/net/wireless/nl80211.c
|
|
@@ -5081,12 +5081,14 @@ EXPORT_SYMBOL(cfg80211_testmode_alloc_event_skb);
|
|
|
|
void cfg80211_testmode_event(struct sk_buff *skb, gfp_t gfp)
|
|
{
|
|
+ struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
|
|
void *hdr = ((void **)skb->cb)[1];
|
|
struct nlattr *data = ((void **)skb->cb)[2];
|
|
|
|
nla_nest_end(skb, data);
|
|
genlmsg_end(skb, hdr);
|
|
- genlmsg_multicast(skb, 0, nl80211_testmode_mcgrp.id, gfp);
|
|
+ genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), skb, 0,
|
|
+ nl80211_testmode_mcgrp.id, gfp);
|
|
}
|
|
EXPORT_SYMBOL(cfg80211_testmode_event);
|
|
#endif
|
|
@@ -7768,7 +7770,8 @@ void nl80211_send_mgmt_tx_status(struct cfg80211_registered_device *rdev,
|
|
|
|
genlmsg_end(msg, hdr);
|
|
|
|
- genlmsg_multicast(msg, 0, nl80211_mlme_mcgrp.id, gfp);
|
|
+ genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
|
|
+ nl80211_mlme_mcgrp.id, gfp);
|
|
return;
|
|
|
|
nla_put_failure:
|
|
diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c
|
|
index a58cf35..84717ce 100644
|
|
--- a/sound/core/compress_offload.c
|
|
+++ b/sound/core/compress_offload.c
|
|
@@ -582,7 +582,7 @@ static long snd_compr_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
|
|
mutex_lock(&stream->device->lock);
|
|
switch (_IOC_NR(cmd)) {
|
|
case _IOC_NR(SNDRV_COMPRESS_IOCTL_VERSION):
|
|
- put_user(SNDRV_COMPRESS_VERSION,
|
|
+ retval = put_user(SNDRV_COMPRESS_VERSION,
|
|
(int __user *)arg) ? -EFAULT : 0;
|
|
break;
|
|
case _IOC_NR(SNDRV_COMPRESS_GET_CAPS):
|