Merge android-4.4.120 (d63fdf6
) into msm-4.4
* refs/heads/tmp-d63fdf6 Linux 4.4.120 MIPS: Implement __multi3 for GCC7 MIPS64r6 builds net: gianfar_ptp: move set_fipers() to spinlock protecting area sctp: make use of pre-calculated len xen/gntdev: Fix partial gntdev_mmap() cleanup xen/gntdev: Fix off-by-one error when unmapping with holes SolutionEngine771x: fix Ether platform data mdio-sun4i: Fix a memory leak xen-netfront: enable device after manual module load bnxt_en: Fix the 'Invalid VF' id check in bnxt_vf_ndo_prep routine. can: flex_can: Correct the checking for frame length in flexcan_start_xmit() mac80211: mesh: drop frames appearing to be from us drm/ttm: check the return value of kzalloc e1000: fix disabling already-disabled warning xfs: quota: check result of register_shrinker() xfs: quota: fix missed destroy of qi_tree_lock IB/ipoib: Fix race condition in neigh creation IB/mlx4: Fix mlx4_ib_alloc_mr error flow s390/dasd: fix wrongly assigned configuration data led: core: Fix brightness setting when setting delay_off=0 bnx2x: Improve reliability in case of nested PCI errors tg3: Enable PHY reset in MTU change path for 5720 tg3: Add workaround to restrict 5762 MRRS to 2048 lib/mpi: Fix umul_ppmm() for MIPS64r6 ARM: dts: ls1021a: fix incorrect clock references scsi: storvsc: Fix scsi_cmd error assignments in storvsc_handle_error net: arc_emac: fix arc_emac_rx() error paths spi: atmel: fixed spin_lock usage inside atmel_spi_remove drm/nouveau/pci: do a msi rearm on init sget(): handle failures of register_shrinker() ARM: 8731/1: Fix csum_partial_copy_from_user() stack mismatch ipv6: icmp6: Allow icmp messages to be looped back mtd: nand: gpmi: Fix failure when a erased page has a bitflip at BBM f2fs: fix a bug caused by NULL extent tree hrtimer: Ensure POSIX compliance (relative CLOCK_REALTIME hrtimers) ANDROID: keychord: Check for write data size Revert "binder: add missing binder_unlock()" Linux 4.4.119 binder: add missing binder_unlock() drm/amdgpu: Avoid leaking PM domain on driver unbind (v2) usb: renesas_usbhs: missed the "running" flag in usb_dmac with rx path usb: gadget: f_fs: Process all descriptors during bind usb: ldusb: add PIDs for new CASSY devices supported by this driver usb: dwc3: gadget: Set maxpacket size for ep0 IN drm/edid: Add 6 bpc quirk for CPT panel in Asus UX303LA Add delay-init quirk for Corsair K70 RGB keyboards arm64: Disable unhandled signal log messages by default usb: ohci: Proper handling of ed_rm_list to handle race condition between usb_kill_urb() and finish_unlinks() irqchip/gic-v3: Use wmb() instead of smb_wmb() in gic_raise_softirq() x86/oprofile: Fix bogus GCC-8 warning in nmi_setup() iio: adis_lib: Initialize trigger before requesting interrupt iio: buffer: check if a buffer has been set up when poll is called cfg80211: fix cfg80211_beacon_dup scsi: ibmvfc: fix misdefined reserved field in ibmvfc_fcp_rsp_info ip_tunnel: fix preempt warning in ip tunnel creation/updating ip_tunnel: replace dst_cache with generic implementation PCI: keystone: Fix interrupt-controller-node lookup powerpc/64s: Fix RFI flush dependency on HARDLOCKUP_DETECTOR netfilter: drop outermost socket lock in getsockopt() ANDROID: sdcardfs: Set num in extension_details during make_item Conflicts: drivers/usb/gadget/function/f_fs.c Change-Id: I594b9686fd64d4b62ebef4452d4f1ccca4f5a77b Signed-off-by: Srinivasarao P <spathi@codeaurora.org>
This commit is contained in:
commit
22397c476f
65 changed files with 391 additions and 206 deletions
2
Makefile
2
Makefile
|
@ -1,6 +1,6 @@
|
|||
VERSION = 4
|
||||
PATCHLEVEL = 4
|
||||
SUBLEVEL = 118
|
||||
SUBLEVEL = 120
|
||||
EXTRAVERSION =
|
||||
NAME = Blurry Fish Butt
|
||||
|
||||
|
|
|
@ -215,7 +215,7 @@
|
|||
reg = <0x2a>;
|
||||
VDDA-supply = <®_3p3v>;
|
||||
VDDIO-supply = <®_3p3v>;
|
||||
clocks = <&sys_mclk 1>;
|
||||
clocks = <&sys_mclk>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -167,7 +167,7 @@
|
|||
reg = <0x0a>;
|
||||
VDDA-supply = <®_3p3v>;
|
||||
VDDIO-supply = <®_3p3v>;
|
||||
clocks = <&sys_mclk 1>;
|
||||
clocks = <&sys_mclk>;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -85,7 +85,11 @@
|
|||
.pushsection .text.fixup,"ax"
|
||||
.align 4
|
||||
9001: mov r4, #-EFAULT
|
||||
#ifdef CONFIG_CPU_SW_DOMAIN_PAN
|
||||
ldr r5, [sp, #9*4] @ *err_ptr
|
||||
#else
|
||||
ldr r5, [sp, #8*4] @ *err_ptr
|
||||
#endif
|
||||
str r4, [r5]
|
||||
ldmia sp, {r1, r2} @ retrieve dst, len
|
||||
add r2, r2, r1
|
||||
|
|
|
@ -55,7 +55,7 @@ static const char *handler[]= {
|
|||
"Error"
|
||||
};
|
||||
|
||||
int show_unhandled_signals = 1;
|
||||
int show_unhandled_signals = 0;
|
||||
|
||||
/*
|
||||
* Dump out the contents of some memory nicely...
|
||||
|
|
|
@ -15,4 +15,5 @@ obj-$(CONFIG_CPU_R3000) += r3k_dump_tlb.o
|
|||
obj-$(CONFIG_CPU_TX39XX) += r3k_dump_tlb.o
|
||||
|
||||
# libgcc-style stuff needed in the kernel
|
||||
obj-y += ashldi3.o ashrdi3.o bswapsi.o bswapdi.o cmpdi2.o lshrdi3.o ucmpdi2.o
|
||||
obj-y += ashldi3.o ashrdi3.o bswapsi.o bswapdi.o cmpdi2.o lshrdi3.o multi3.o \
|
||||
ucmpdi2.o
|
||||
|
|
|
@ -9,10 +9,18 @@ typedef int word_type __attribute__ ((mode (__word__)));
|
|||
struct DWstruct {
|
||||
int high, low;
|
||||
};
|
||||
|
||||
struct TWstruct {
|
||||
long long high, low;
|
||||
};
|
||||
#elif defined(__LITTLE_ENDIAN)
|
||||
struct DWstruct {
|
||||
int low, high;
|
||||
};
|
||||
|
||||
struct TWstruct {
|
||||
long long low, high;
|
||||
};
|
||||
#else
|
||||
#error I feel sick.
|
||||
#endif
|
||||
|
@ -22,4 +30,13 @@ typedef union {
|
|||
long long ll;
|
||||
} DWunion;
|
||||
|
||||
#if defined(CONFIG_64BIT) && defined(CONFIG_CPU_MIPSR6)
|
||||
typedef int ti_type __attribute__((mode(TI)));
|
||||
|
||||
typedef union {
|
||||
struct TWstruct s;
|
||||
ti_type ti;
|
||||
} TWunion;
|
||||
#endif
|
||||
|
||||
#endif /* __ASM_LIBGCC_H */
|
||||
|
|
54
arch/mips/lib/multi3.c
Normal file
54
arch/mips/lib/multi3.c
Normal file
|
@ -0,0 +1,54 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <linux/export.h>
|
||||
|
||||
#include "libgcc.h"
|
||||
|
||||
/*
|
||||
* GCC 7 suboptimally generates __multi3 calls for mips64r6, so for that
|
||||
* specific case only we'll implement it here.
|
||||
*
|
||||
* See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82981
|
||||
*/
|
||||
#if defined(CONFIG_64BIT) && defined(CONFIG_CPU_MIPSR6) && (__GNUC__ == 7)
|
||||
|
||||
/* multiply 64-bit values, low 64-bits returned */
|
||||
static inline long long notrace dmulu(long long a, long long b)
|
||||
{
|
||||
long long res;
|
||||
|
||||
asm ("dmulu %0,%1,%2" : "=r" (res) : "r" (a), "r" (b));
|
||||
return res;
|
||||
}
|
||||
|
||||
/* multiply 64-bit unsigned values, high 64-bits of 128-bit result returned */
|
||||
static inline long long notrace dmuhu(long long a, long long b)
|
||||
{
|
||||
long long res;
|
||||
|
||||
asm ("dmuhu %0,%1,%2" : "=r" (res) : "r" (a), "r" (b));
|
||||
return res;
|
||||
}
|
||||
|
||||
/* multiply 128-bit values, low 128-bits returned */
|
||||
ti_type notrace __multi3(ti_type a, ti_type b)
|
||||
{
|
||||
TWunion res, aa, bb;
|
||||
|
||||
aa.ti = a;
|
||||
bb.ti = b;
|
||||
|
||||
/*
|
||||
* a * b = (a.lo * b.lo)
|
||||
* + 2^64 * (a.hi * b.lo + a.lo * b.hi)
|
||||
* [+ 2^128 * (a.hi * b.hi)]
|
||||
*/
|
||||
res.s.low = dmulu(aa.s.low, bb.s.low);
|
||||
res.s.high = dmuhu(aa.s.low, bb.s.low);
|
||||
res.s.high += dmulu(aa.s.high, bb.s.low);
|
||||
res.s.high += dmulu(aa.s.low, bb.s.high);
|
||||
|
||||
return res.ti;
|
||||
}
|
||||
EXPORT_SYMBOL(__multi3);
|
||||
|
||||
#endif /* 64BIT && CPU_MIPSR6 && GCC7 */
|
|
@ -835,6 +835,7 @@ static int __init disable_hardlockup_detector(void)
|
|||
return 0;
|
||||
}
|
||||
early_initcall(disable_hardlockup_detector);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC_BOOK3S_64
|
||||
static enum l1d_flush_type enabled_flush_types;
|
||||
|
@ -973,4 +974,3 @@ ssize_t cpu_show_meltdown(struct device *dev, struct device_attribute *attr, cha
|
|||
return sprintf(buf, "Vulnerable\n");
|
||||
}
|
||||
#endif /* CONFIG_PPC_BOOK3S_64 */
|
||||
#endif
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/sh_eth.h>
|
||||
#include <mach-se/mach/se.h>
|
||||
#include <mach-se/mach/mrshpc.h>
|
||||
#include <asm/machvec.h>
|
||||
|
@ -114,6 +115,11 @@ static struct platform_device heartbeat_device = {
|
|||
#if defined(CONFIG_CPU_SUBTYPE_SH7710) ||\
|
||||
defined(CONFIG_CPU_SUBTYPE_SH7712)
|
||||
/* SH771X Ethernet driver */
|
||||
static struct sh_eth_plat_data sh_eth_plat = {
|
||||
.phy = PHY_ID,
|
||||
.phy_interface = PHY_INTERFACE_MODE_MII,
|
||||
};
|
||||
|
||||
static struct resource sh_eth0_resources[] = {
|
||||
[0] = {
|
||||
.start = SH_ETH0_BASE,
|
||||
|
@ -131,7 +137,7 @@ static struct platform_device sh_eth0_device = {
|
|||
.name = "sh771x-ether",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = PHY_ID,
|
||||
.platform_data = &sh_eth_plat,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(sh_eth0_resources),
|
||||
.resource = sh_eth0_resources,
|
||||
|
@ -154,7 +160,7 @@ static struct platform_device sh_eth1_device = {
|
|||
.name = "sh771x-ether",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = PHY_ID,
|
||||
.platform_data = &sh_eth_plat,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(sh_eth1_resources),
|
||||
.resource = sh_eth1_resources,
|
||||
|
|
|
@ -471,7 +471,7 @@ static int nmi_setup(void)
|
|||
goto fail;
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
if (!cpu)
|
||||
if (!IS_ENABLED(CONFIG_SMP) || !cpu)
|
||||
continue;
|
||||
|
||||
memcpy(per_cpu(cpu_msrs, cpu).counters,
|
||||
|
|
|
@ -1467,8 +1467,6 @@ int amdgpu_device_init(struct amdgpu_device *adev,
|
|||
* ignore it */
|
||||
vga_client_register(adev->pdev, adev, NULL, amdgpu_vga_set_decode);
|
||||
|
||||
if (amdgpu_runtime_pm == 1)
|
||||
runtime = true;
|
||||
if (amdgpu_device_is_px(ddev))
|
||||
runtime = true;
|
||||
vga_switcheroo_register_client(adev->pdev, &amdgpu_switcheroo_ops, runtime);
|
||||
|
|
|
@ -114,6 +114,9 @@ static struct edid_quirk {
|
|||
/* AEO model 0 reports 8 bpc, but is a 6 bpc panel */
|
||||
{ "AEO", 0, EDID_QUIRK_FORCE_6BPC },
|
||||
|
||||
/* CPT panel of Asus UX303LA reports 8 bpc, but is a 6 bpc panel */
|
||||
{ "CPT", 0x17df, EDID_QUIRK_FORCE_6BPC },
|
||||
|
||||
/* Belinea 10 15 55 */
|
||||
{ "MAX", 1516, EDID_QUIRK_PREFER_LARGE_60 },
|
||||
{ "MAX", 0x77e, EDID_QUIRK_PREFER_LARGE_60 },
|
||||
|
|
|
@ -127,6 +127,13 @@ nvkm_pci_init(struct nvkm_subdev *subdev)
|
|||
return ret;
|
||||
|
||||
pci->irq = pdev->irq;
|
||||
|
||||
/* Ensure MSI interrupts are armed, for the case where there are
|
||||
* already interrupts pending (for whatever reason) at load time.
|
||||
*/
|
||||
if (pci->msi)
|
||||
pci->func->msi_rearm(pci);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -818,6 +818,8 @@ int ttm_page_alloc_init(struct ttm_mem_global *glob, unsigned max_pages)
|
|||
pr_info("Initializing pool allocator\n");
|
||||
|
||||
_manager = kzalloc(sizeof(*_manager), GFP_KERNEL);
|
||||
if (!_manager)
|
||||
return -ENOMEM;
|
||||
|
||||
ttm_page_pool_init_locked(&_manager->wc_pool, GFP_HIGHUSER, "wc");
|
||||
|
||||
|
|
|
@ -2387,6 +2387,9 @@ static const struct hid_device_id hid_ignore_list[] = {
|
|||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTIME) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYPH) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POWERANALYSERCASSY) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CONVERTERCONTROLLERCASSY) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MACHINETESTCASSY) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_JWM) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_DMMP) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIP) },
|
||||
|
|
|
@ -570,6 +570,9 @@
|
|||
#define USB_DEVICE_ID_LD_MICROCASSYTIME 0x1033
|
||||
#define USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE 0x1035
|
||||
#define USB_DEVICE_ID_LD_MICROCASSYPH 0x1038
|
||||
#define USB_DEVICE_ID_LD_POWERANALYSERCASSY 0x1040
|
||||
#define USB_DEVICE_ID_LD_CONVERTERCONTROLLERCASSY 0x1042
|
||||
#define USB_DEVICE_ID_LD_MACHINETESTCASSY 0x1043
|
||||
#define USB_DEVICE_ID_LD_JWM 0x1080
|
||||
#define USB_DEVICE_ID_LD_DMMP 0x1081
|
||||
#define USB_DEVICE_ID_LD_UMIP 0x1090
|
||||
|
|
|
@ -47,6 +47,10 @@ int adis_probe_trigger(struct adis *adis, struct iio_dev *indio_dev)
|
|||
if (adis->trig == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
adis->trig->dev.parent = &adis->spi->dev;
|
||||
adis->trig->ops = &adis_trigger_ops;
|
||||
iio_trigger_set_drvdata(adis->trig, adis);
|
||||
|
||||
ret = request_irq(adis->spi->irq,
|
||||
&iio_trigger_generic_data_rdy_poll,
|
||||
IRQF_TRIGGER_RISING,
|
||||
|
@ -55,9 +59,6 @@ int adis_probe_trigger(struct adis *adis, struct iio_dev *indio_dev)
|
|||
if (ret)
|
||||
goto error_free_trig;
|
||||
|
||||
adis->trig->dev.parent = &adis->spi->dev;
|
||||
adis->trig->ops = &adis_trigger_ops;
|
||||
iio_trigger_set_drvdata(adis->trig, adis);
|
||||
ret = iio_trigger_register(adis->trig);
|
||||
|
||||
indio_dev->trig = iio_trigger_get(adis->trig);
|
||||
|
|
|
@ -174,7 +174,7 @@ unsigned int iio_buffer_poll(struct file *filp,
|
|||
struct iio_dev *indio_dev = filp->private_data;
|
||||
struct iio_buffer *rb = indio_dev->buffer;
|
||||
|
||||
if (!indio_dev->info)
|
||||
if (!indio_dev->info || rb == NULL)
|
||||
return 0;
|
||||
|
||||
poll_wait(filp, &rb->pollq, wait);
|
||||
|
|
|
@ -424,7 +424,6 @@ struct ib_mr *mlx4_ib_alloc_mr(struct ib_pd *pd,
|
|||
goto err_free_mr;
|
||||
|
||||
mr->max_pages = max_num_sg;
|
||||
|
||||
err = mlx4_mr_enable(dev->dev, &mr->mmr);
|
||||
if (err)
|
||||
goto err_free_pl;
|
||||
|
@ -435,6 +434,7 @@ struct ib_mr *mlx4_ib_alloc_mr(struct ib_pd *pd,
|
|||
return &mr->ibmr;
|
||||
|
||||
err_free_pl:
|
||||
mr->ibmr.device = pd->device;
|
||||
mlx4_free_priv_pages(mr);
|
||||
err_free_mr:
|
||||
(void) mlx4_mr_free(dev->dev, &mr->mmr);
|
||||
|
|
|
@ -844,8 +844,8 @@ static int path_rec_start(struct net_device *dev,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void neigh_add_path(struct sk_buff *skb, u8 *daddr,
|
||||
struct net_device *dev)
|
||||
static struct ipoib_neigh *neigh_add_path(struct sk_buff *skb, u8 *daddr,
|
||||
struct net_device *dev)
|
||||
{
|
||||
struct ipoib_dev_priv *priv = netdev_priv(dev);
|
||||
struct ipoib_path *path;
|
||||
|
@ -858,7 +858,15 @@ static void neigh_add_path(struct sk_buff *skb, u8 *daddr,
|
|||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
++dev->stats.tx_dropped;
|
||||
dev_kfree_skb_any(skb);
|
||||
return;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* To avoid race condition, make sure that the
|
||||
* neigh will be added only once.
|
||||
*/
|
||||
if (unlikely(!list_empty(&neigh->list))) {
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
return neigh;
|
||||
}
|
||||
|
||||
path = __path_find(dev, daddr + 4);
|
||||
|
@ -896,7 +904,7 @@ static void neigh_add_path(struct sk_buff *skb, u8 *daddr,
|
|||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
ipoib_send(dev, skb, path->ah, IPOIB_QPN(daddr));
|
||||
ipoib_neigh_put(neigh);
|
||||
return;
|
||||
return NULL;
|
||||
}
|
||||
} else {
|
||||
neigh->ah = NULL;
|
||||
|
@ -913,7 +921,7 @@ static void neigh_add_path(struct sk_buff *skb, u8 *daddr,
|
|||
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
ipoib_neigh_put(neigh);
|
||||
return;
|
||||
return NULL;
|
||||
|
||||
err_path:
|
||||
ipoib_neigh_free(neigh);
|
||||
|
@ -923,6 +931,8 @@ err_drop:
|
|||
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
ipoib_neigh_put(neigh);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void unicast_arp_send(struct sk_buff *skb, struct net_device *dev,
|
||||
|
@ -1028,8 +1038,9 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
case htons(ETH_P_TIPC):
|
||||
neigh = ipoib_neigh_get(dev, phdr->hwaddr);
|
||||
if (unlikely(!neigh)) {
|
||||
neigh_add_path(skb, phdr->hwaddr, dev);
|
||||
return NETDEV_TX_OK;
|
||||
neigh = neigh_add_path(skb, phdr->hwaddr, dev);
|
||||
if (likely(!neigh))
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
break;
|
||||
case htons(ETH_P_ARP):
|
||||
|
|
|
@ -775,7 +775,10 @@ void ipoib_mcast_send(struct net_device *dev, u8 *daddr, struct sk_buff *skb)
|
|||
spin_lock_irqsave(&priv->lock, flags);
|
||||
if (!neigh) {
|
||||
neigh = ipoib_neigh_alloc(daddr, dev);
|
||||
if (neigh) {
|
||||
/* Make sure that the neigh will be added only
|
||||
* once to mcast list.
|
||||
*/
|
||||
if (neigh && list_empty(&neigh->list)) {
|
||||
kref_get(&mcast->ah->ref);
|
||||
neigh->ah = mcast->ah;
|
||||
list_add_tail(&neigh->list, &mcast->neigh_list);
|
||||
|
|
|
@ -276,7 +276,7 @@ static ssize_t keychord_write(struct file *file, const char __user *buffer,
|
|||
size_t resid = count;
|
||||
size_t key_bytes;
|
||||
|
||||
if (count < sizeof(struct input_keychord))
|
||||
if (count < sizeof(struct input_keychord) || count > PAGE_SIZE)
|
||||
return -EINVAL;
|
||||
keychords = kzalloc(count, GFP_KERNEL);
|
||||
if (!keychords)
|
||||
|
|
|
@ -765,7 +765,7 @@ static void gic_raise_softirq(const struct cpumask *mask, unsigned int irq)
|
|||
* Ensure that stores to Normal memory are visible to the
|
||||
* other CPUs before issuing the IPI.
|
||||
*/
|
||||
smp_wmb();
|
||||
wmb();
|
||||
|
||||
for_each_cpu(cpu, mask) {
|
||||
unsigned long cluster_id = cpu_logical_map(cpu) & ~0xffUL;
|
||||
|
|
|
@ -149,7 +149,7 @@ void led_blink_set(struct led_classdev *led_cdev,
|
|||
unsigned long *delay_on,
|
||||
unsigned long *delay_off)
|
||||
{
|
||||
del_timer_sync(&led_cdev->blink_timer);
|
||||
led_stop_software_blink(led_cdev);
|
||||
|
||||
led_cdev->flags &= ~LED_BLINK_ONESHOT;
|
||||
led_cdev->flags &= ~LED_BLINK_ONESHOT_STOP;
|
||||
|
|
|
@ -1029,9 +1029,6 @@ static int gpmi_ecc_read_page(struct mtd_info *mtd, struct nand_chip *chip,
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* handle the block mark swapping */
|
||||
block_mark_swapping(this, payload_virt, auxiliary_virt);
|
||||
|
||||
/* Loop over status bytes, accumulating ECC status. */
|
||||
status = auxiliary_virt + nfc_geo->auxiliary_status_offset;
|
||||
|
||||
|
@ -1047,6 +1044,9 @@ static int gpmi_ecc_read_page(struct mtd_info *mtd, struct nand_chip *chip,
|
|||
max_bitflips = max_t(unsigned int, max_bitflips, *status);
|
||||
}
|
||||
|
||||
/* handle the block mark swapping */
|
||||
block_mark_swapping(this, buf, auxiliary_virt);
|
||||
|
||||
if (oob_required) {
|
||||
/*
|
||||
* It's time to deliver the OOB bytes. See gpmi_ecc_read_oob()
|
||||
|
|
|
@ -493,7 +493,7 @@ static int flexcan_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
data = be32_to_cpup((__be32 *)&cf->data[0]);
|
||||
flexcan_write(data, ®s->mb[FLEXCAN_TX_BUF_ID].data[0]);
|
||||
}
|
||||
if (cf->can_dlc > 3) {
|
||||
if (cf->can_dlc > 4) {
|
||||
data = be32_to_cpup((__be32 *)&cf->data[4]);
|
||||
flexcan_write(data, ®s->mb[FLEXCAN_TX_BUF_ID].data[1]);
|
||||
}
|
||||
|
|
|
@ -250,39 +250,48 @@ static int arc_emac_rx(struct net_device *ndev, int budget)
|
|||
continue;
|
||||
}
|
||||
|
||||
pktlen = info & LEN_MASK;
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += pktlen;
|
||||
skb = rx_buff->skb;
|
||||
skb_put(skb, pktlen);
|
||||
skb->dev = ndev;
|
||||
skb->protocol = eth_type_trans(skb, ndev);
|
||||
|
||||
dma_unmap_single(&ndev->dev, dma_unmap_addr(rx_buff, addr),
|
||||
dma_unmap_len(rx_buff, len), DMA_FROM_DEVICE);
|
||||
|
||||
/* Prepare the BD for next cycle */
|
||||
rx_buff->skb = netdev_alloc_skb_ip_align(ndev,
|
||||
EMAC_BUFFER_SIZE);
|
||||
if (unlikely(!rx_buff->skb)) {
|
||||
/* Prepare the BD for next cycle. netif_receive_skb()
|
||||
* only if new skb was allocated and mapped to avoid holes
|
||||
* in the RX fifo.
|
||||
*/
|
||||
skb = netdev_alloc_skb_ip_align(ndev, EMAC_BUFFER_SIZE);
|
||||
if (unlikely(!skb)) {
|
||||
if (net_ratelimit())
|
||||
netdev_err(ndev, "cannot allocate skb\n");
|
||||
/* Return ownership to EMAC */
|
||||
rxbd->info = cpu_to_le32(FOR_EMAC | EMAC_BUFFER_SIZE);
|
||||
stats->rx_errors++;
|
||||
/* Because receive_skb is below, increment rx_dropped */
|
||||
stats->rx_dropped++;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* receive_skb only if new skb was allocated to avoid holes */
|
||||
netif_receive_skb(skb);
|
||||
|
||||
addr = dma_map_single(&ndev->dev, (void *)rx_buff->skb->data,
|
||||
addr = dma_map_single(&ndev->dev, (void *)skb->data,
|
||||
EMAC_BUFFER_SIZE, DMA_FROM_DEVICE);
|
||||
if (dma_mapping_error(&ndev->dev, addr)) {
|
||||
if (net_ratelimit())
|
||||
netdev_err(ndev, "cannot dma map\n");
|
||||
dev_kfree_skb(rx_buff->skb);
|
||||
netdev_err(ndev, "cannot map dma buffer\n");
|
||||
dev_kfree_skb(skb);
|
||||
/* Return ownership to EMAC */
|
||||
rxbd->info = cpu_to_le32(FOR_EMAC | EMAC_BUFFER_SIZE);
|
||||
stats->rx_errors++;
|
||||
stats->rx_dropped++;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* unmap previosly mapped skb */
|
||||
dma_unmap_single(&ndev->dev, dma_unmap_addr(rx_buff, addr),
|
||||
dma_unmap_len(rx_buff, len), DMA_FROM_DEVICE);
|
||||
|
||||
pktlen = info & LEN_MASK;
|
||||
stats->rx_packets++;
|
||||
stats->rx_bytes += pktlen;
|
||||
skb_put(rx_buff->skb, pktlen);
|
||||
rx_buff->skb->dev = ndev;
|
||||
rx_buff->skb->protocol = eth_type_trans(rx_buff->skb, ndev);
|
||||
|
||||
netif_receive_skb(rx_buff->skb);
|
||||
|
||||
rx_buff->skb = skb;
|
||||
dma_unmap_addr_set(rx_buff, addr, addr);
|
||||
dma_unmap_len_set(rx_buff, len, EMAC_BUFFER_SIZE);
|
||||
|
||||
|
|
|
@ -3052,7 +3052,7 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode, bool keep_link)
|
|||
|
||||
del_timer_sync(&bp->timer);
|
||||
|
||||
if (IS_PF(bp)) {
|
||||
if (IS_PF(bp) && !BP_NOMCP(bp)) {
|
||||
/* Set ALWAYS_ALIVE bit in shmem */
|
||||
bp->fw_drv_pulse_wr_seq |= DRV_PULSE_ALWAYS_ALIVE;
|
||||
bnx2x_drv_pulse(bp);
|
||||
|
@ -3134,7 +3134,7 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode, bool keep_link)
|
|||
bp->cnic_loaded = false;
|
||||
|
||||
/* Clear driver version indication in shmem */
|
||||
if (IS_PF(bp))
|
||||
if (IS_PF(bp) && !BP_NOMCP(bp))
|
||||
bnx2x_update_mng_version(bp);
|
||||
|
||||
/* Check if there are pending parity attentions. If there are - set
|
||||
|
|
|
@ -9570,6 +9570,15 @@ static int bnx2x_init_shmem(struct bnx2x *bp)
|
|||
|
||||
do {
|
||||
bp->common.shmem_base = REG_RD(bp, MISC_REG_SHARED_MEM_ADDR);
|
||||
|
||||
/* If we read all 0xFFs, means we are in PCI error state and
|
||||
* should bail out to avoid crashes on adapter's FW reads.
|
||||
*/
|
||||
if (bp->common.shmem_base == 0xFFFFFFFF) {
|
||||
bp->flags |= NO_MCP_FLAG;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (bp->common.shmem_base) {
|
||||
val = SHMEM_RD(bp, validity_map[BP_PORT(bp)]);
|
||||
if (val & SHR_MEM_VALIDITY_MB)
|
||||
|
@ -14214,7 +14223,10 @@ static pci_ers_result_t bnx2x_io_slot_reset(struct pci_dev *pdev)
|
|||
BNX2X_ERR("IO slot reset --> driver unload\n");
|
||||
|
||||
/* MCP should have been reset; Need to wait for validity */
|
||||
bnx2x_init_shmem(bp);
|
||||
if (bnx2x_init_shmem(bp)) {
|
||||
rtnl_unlock();
|
||||
return PCI_ERS_RESULT_DISCONNECT;
|
||||
}
|
||||
|
||||
if (IS_PF(bp) && SHMEM2_HAS(bp, drv_capabilities_flag)) {
|
||||
u32 v;
|
||||
|
|
|
@ -29,7 +29,7 @@ static int bnxt_vf_ndo_prep(struct bnxt *bp, int vf_id)
|
|||
netdev_err(bp->dev, "vf ndo called though sriov is disabled\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (vf_id >= bp->pf.max_vfs) {
|
||||
if (vf_id >= bp->pf.active_vfs) {
|
||||
netdev_err(bp->dev, "Invalid VF id %d\n", vf_id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
|
@ -10051,6 +10051,16 @@ static int tg3_reset_hw(struct tg3 *tp, bool reset_phy)
|
|||
|
||||
tw32(GRC_MODE, tp->grc_mode | val);
|
||||
|
||||
/* On one of the AMD platform, MRRS is restricted to 4000 because of
|
||||
* south bridge limitation. As a workaround, Driver is setting MRRS
|
||||
* to 2048 instead of default 4096.
|
||||
*/
|
||||
if (tp->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL &&
|
||||
tp->pdev->subsystem_device == TG3PCI_SUBDEVICE_ID_DELL_5762) {
|
||||
val = tr32(TG3PCI_DEV_STATUS_CTRL) & ~MAX_READ_REQ_MASK;
|
||||
tw32(TG3PCI_DEV_STATUS_CTRL, val | MAX_READ_REQ_SIZE_2048);
|
||||
}
|
||||
|
||||
/* Setup the timer prescalar register. Clock is always 66Mhz. */
|
||||
val = tr32(GRC_MISC_CFG);
|
||||
val &= ~0xff;
|
||||
|
@ -14230,7 +14240,8 @@ static int tg3_change_mtu(struct net_device *dev, int new_mtu)
|
|||
*/
|
||||
if (tg3_asic_rev(tp) == ASIC_REV_57766 ||
|
||||
tg3_asic_rev(tp) == ASIC_REV_5717 ||
|
||||
tg3_asic_rev(tp) == ASIC_REV_5719)
|
||||
tg3_asic_rev(tp) == ASIC_REV_5719 ||
|
||||
tg3_asic_rev(tp) == ASIC_REV_5720)
|
||||
reset_phy = true;
|
||||
|
||||
err = tg3_restart_hw(tp, reset_phy);
|
||||
|
|
|
@ -95,6 +95,7 @@
|
|||
#define TG3PCI_SUBDEVICE_ID_DELL_JAGUAR 0x0106
|
||||
#define TG3PCI_SUBDEVICE_ID_DELL_MERLOT 0x0109
|
||||
#define TG3PCI_SUBDEVICE_ID_DELL_SLIM_MERLOT 0x010a
|
||||
#define TG3PCI_SUBDEVICE_ID_DELL_5762 0x07f0
|
||||
#define TG3PCI_SUBVENDOR_ID_COMPAQ PCI_VENDOR_ID_COMPAQ
|
||||
#define TG3PCI_SUBDEVICE_ID_COMPAQ_BANSHEE 0x007c
|
||||
#define TG3PCI_SUBDEVICE_ID_COMPAQ_BANSHEE_2 0x009a
|
||||
|
@ -280,6 +281,9 @@
|
|||
#define TG3PCI_STD_RING_PROD_IDX 0x00000098 /* 64-bit */
|
||||
#define TG3PCI_RCV_RET_RING_CON_IDX 0x000000a0 /* 64-bit */
|
||||
/* 0xa8 --> 0xb8 unused */
|
||||
#define TG3PCI_DEV_STATUS_CTRL 0x000000b4
|
||||
#define MAX_READ_REQ_SIZE_2048 0x00004000
|
||||
#define MAX_READ_REQ_MASK 0x00007000
|
||||
#define TG3PCI_DUAL_MAC_CTRL 0x000000b8
|
||||
#define DUAL_MAC_CTRL_CH_MASK 0x00000003
|
||||
#define DUAL_MAC_CTRL_ID 0x00000004
|
||||
|
|
|
@ -314,11 +314,10 @@ static int ptp_gianfar_adjtime(struct ptp_clock_info *ptp, s64 delta)
|
|||
now = tmr_cnt_read(etsects);
|
||||
now += delta;
|
||||
tmr_cnt_write(etsects, now);
|
||||
set_fipers(etsects);
|
||||
|
||||
spin_unlock_irqrestore(&etsects->lock, flags);
|
||||
|
||||
set_fipers(etsects);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -331,7 +331,8 @@ struct e1000_adapter {
|
|||
enum e1000_state_t {
|
||||
__E1000_TESTING,
|
||||
__E1000_RESETTING,
|
||||
__E1000_DOWN
|
||||
__E1000_DOWN,
|
||||
__E1000_DISABLED
|
||||
};
|
||||
|
||||
#undef pr_fmt
|
||||
|
|
|
@ -940,7 +940,7 @@ static int e1000_init_hw_struct(struct e1000_adapter *adapter,
|
|||
static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
{
|
||||
struct net_device *netdev;
|
||||
struct e1000_adapter *adapter;
|
||||
struct e1000_adapter *adapter = NULL;
|
||||
struct e1000_hw *hw;
|
||||
|
||||
static int cards_found = 0;
|
||||
|
@ -950,6 +950,7 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
u16 tmp = 0;
|
||||
u16 eeprom_apme_mask = E1000_EEPROM_APME;
|
||||
int bars, need_ioport;
|
||||
bool disable_dev = false;
|
||||
|
||||
/* do not allocate ioport bars when not needed */
|
||||
need_ioport = e1000_is_need_ioport(pdev);
|
||||
|
@ -1250,11 +1251,13 @@ err_mdio_ioremap:
|
|||
iounmap(hw->ce4100_gbe_mdio_base_virt);
|
||||
iounmap(hw->hw_addr);
|
||||
err_ioremap:
|
||||
disable_dev = !test_and_set_bit(__E1000_DISABLED, &adapter->flags);
|
||||
free_netdev(netdev);
|
||||
err_alloc_etherdev:
|
||||
pci_release_selected_regions(pdev, bars);
|
||||
err_pci_reg:
|
||||
pci_disable_device(pdev);
|
||||
if (!adapter || disable_dev)
|
||||
pci_disable_device(pdev);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -1272,6 +1275,7 @@ static void e1000_remove(struct pci_dev *pdev)
|
|||
struct net_device *netdev = pci_get_drvdata(pdev);
|
||||
struct e1000_adapter *adapter = netdev_priv(netdev);
|
||||
struct e1000_hw *hw = &adapter->hw;
|
||||
bool disable_dev;
|
||||
|
||||
e1000_down_and_stop(adapter);
|
||||
e1000_release_manageability(adapter);
|
||||
|
@ -1290,9 +1294,11 @@ static void e1000_remove(struct pci_dev *pdev)
|
|||
iounmap(hw->flash_address);
|
||||
pci_release_selected_regions(pdev, adapter->bars);
|
||||
|
||||
disable_dev = !test_and_set_bit(__E1000_DISABLED, &adapter->flags);
|
||||
free_netdev(netdev);
|
||||
|
||||
pci_disable_device(pdev);
|
||||
if (disable_dev)
|
||||
pci_disable_device(pdev);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -5135,7 +5141,8 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake)
|
|||
if (netif_running(netdev))
|
||||
e1000_free_irq(adapter);
|
||||
|
||||
pci_disable_device(pdev);
|
||||
if (!test_and_set_bit(__E1000_DISABLED, &adapter->flags))
|
||||
pci_disable_device(pdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -5179,6 +5186,10 @@ static int e1000_resume(struct pci_dev *pdev)
|
|||
pr_err("Cannot enable PCI device from suspend\n");
|
||||
return err;
|
||||
}
|
||||
|
||||
/* flush memory to make sure state is correct */
|
||||
smp_mb__before_atomic();
|
||||
clear_bit(__E1000_DISABLED, &adapter->flags);
|
||||
pci_set_master(pdev);
|
||||
|
||||
pci_enable_wake(pdev, PCI_D3hot, 0);
|
||||
|
@ -5253,7 +5264,9 @@ static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev,
|
|||
|
||||
if (netif_running(netdev))
|
||||
e1000_down(adapter);
|
||||
pci_disable_device(pdev);
|
||||
|
||||
if (!test_and_set_bit(__E1000_DISABLED, &adapter->flags))
|
||||
pci_disable_device(pdev);
|
||||
|
||||
/* Request a slot slot reset. */
|
||||
return PCI_ERS_RESULT_NEED_RESET;
|
||||
|
@ -5281,6 +5294,10 @@ static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev)
|
|||
pr_err("Cannot re-enable PCI device after reset.\n");
|
||||
return PCI_ERS_RESULT_DISCONNECT;
|
||||
}
|
||||
|
||||
/* flush memory to make sure state is correct */
|
||||
smp_mb__before_atomic();
|
||||
clear_bit(__E1000_DISABLED, &adapter->flags);
|
||||
pci_set_master(pdev);
|
||||
|
||||
pci_enable_wake(pdev, PCI_D3hot, 0);
|
||||
|
|
|
@ -128,8 +128,10 @@ static int sun4i_mdio_probe(struct platform_device *pdev)
|
|||
|
||||
data->regulator = devm_regulator_get(&pdev->dev, "phy");
|
||||
if (IS_ERR(data->regulator)) {
|
||||
if (PTR_ERR(data->regulator) == -EPROBE_DEFER)
|
||||
return -EPROBE_DEFER;
|
||||
if (PTR_ERR(data->regulator) == -EPROBE_DEFER) {
|
||||
ret = -EPROBE_DEFER;
|
||||
goto err_out_free_mdiobus;
|
||||
}
|
||||
|
||||
dev_info(&pdev->dev, "no regulator found\n");
|
||||
} else {
|
||||
|
|
|
@ -1331,6 +1331,7 @@ static struct net_device *xennet_create_dev(struct xenbus_device *dev)
|
|||
|
||||
netif_carrier_off(netdev);
|
||||
|
||||
xenbus_switch_state(dev, XenbusStateInitialising);
|
||||
return netdev;
|
||||
|
||||
exit:
|
||||
|
|
|
@ -179,14 +179,16 @@ static int ks_pcie_get_irq_controller_info(struct keystone_pcie *ks_pcie,
|
|||
}
|
||||
|
||||
/* interrupt controller is in a child node */
|
||||
*np_temp = of_find_node_by_name(np_pcie, controller);
|
||||
*np_temp = of_get_child_by_name(np_pcie, controller);
|
||||
if (!(*np_temp)) {
|
||||
dev_err(dev, "Node for %s is absent\n", controller);
|
||||
goto out;
|
||||
}
|
||||
temp = of_irq_count(*np_temp);
|
||||
if (!temp)
|
||||
if (!temp) {
|
||||
of_node_put(*np_temp);
|
||||
goto out;
|
||||
}
|
||||
if (temp > max_host_irqs)
|
||||
dev_warn(dev, "Too many %s interrupts defined %u\n",
|
||||
(legacy ? "legacy" : "MSI"), temp);
|
||||
|
@ -200,6 +202,9 @@ static int ks_pcie_get_irq_controller_info(struct keystone_pcie *ks_pcie,
|
|||
if (!host_irqs[temp])
|
||||
break;
|
||||
}
|
||||
|
||||
of_node_put(*np_temp);
|
||||
|
||||
if (temp) {
|
||||
*num_irqs = temp;
|
||||
ret = 0;
|
||||
|
|
|
@ -2743,6 +2743,16 @@ dasd_3990_erp_action(struct dasd_ccw_req * cqr)
|
|||
erp = dasd_3990_erp_handle_match_erp(cqr, erp);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* For path verification work we need to stick with the path that was
|
||||
* originally chosen so that the per path configuration data is
|
||||
* assigned correctly.
|
||||
*/
|
||||
if (test_bit(DASD_CQR_VERIFY_PATH, &erp->flags) && cqr->lpm) {
|
||||
erp->lpm = cqr->lpm;
|
||||
}
|
||||
|
||||
if (device->features & DASD_FEATURE_ERPLOG) {
|
||||
/* print current erp_chain */
|
||||
dev_err(&device->cdev->dev,
|
||||
|
|
|
@ -366,7 +366,7 @@ enum ibmvfc_fcp_rsp_info_codes {
|
|||
};
|
||||
|
||||
struct ibmvfc_fcp_rsp_info {
|
||||
__be16 reserved;
|
||||
u8 reserved[3];
|
||||
u8 rsp_code;
|
||||
u8 reserved2[4];
|
||||
}__attribute__((packed, aligned (2)));
|
||||
|
|
|
@ -890,10 +890,11 @@ static void storvsc_handle_error(struct vmscsi_request *vm_srb,
|
|||
case TEST_UNIT_READY:
|
||||
break;
|
||||
default:
|
||||
set_host_byte(scmnd, DID_TARGET_FAILURE);
|
||||
set_host_byte(scmnd, DID_ERROR);
|
||||
}
|
||||
break;
|
||||
case SRB_STATUS_INVALID_LUN:
|
||||
set_host_byte(scmnd, DID_NO_CONNECT);
|
||||
do_work = true;
|
||||
process_err_fn = storvsc_remove_lun;
|
||||
break;
|
||||
|
|
|
@ -1669,12 +1669,12 @@ static int atmel_spi_remove(struct platform_device *pdev)
|
|||
pm_runtime_get_sync(&pdev->dev);
|
||||
|
||||
/* reset the hardware and block queue progress */
|
||||
spin_lock_irq(&as->lock);
|
||||
if (as->use_dma) {
|
||||
atmel_spi_stop_dma(as);
|
||||
atmel_spi_release_dma(as);
|
||||
}
|
||||
|
||||
spin_lock_irq(&as->lock);
|
||||
spi_writel(as, CR, SPI_BIT(SWRST));
|
||||
spi_writel(as, CR, SPI_BIT(SWRST)); /* AT91SAM9263 Rev B workaround */
|
||||
spi_readl(as, SR);
|
||||
|
|
|
@ -225,6 +225,9 @@ static const struct usb_device_id usb_quirk_list[] = {
|
|||
{ USB_DEVICE(0x1a0a, 0x0200), .driver_info =
|
||||
USB_QUIRK_LINEAR_UFRAME_INTR_BINTERVAL },
|
||||
|
||||
/* Corsair K70 RGB */
|
||||
{ USB_DEVICE(0x1b1c, 0x1b13), .driver_info = USB_QUIRK_DELAY_INIT },
|
||||
|
||||
/* Corsair Strafe RGB */
|
||||
{ USB_DEVICE(0x1b1c, 0x1b20), .driver_info = USB_QUIRK_DELAY_INIT },
|
||||
|
||||
|
|
|
@ -2984,6 +2984,8 @@ static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc)
|
|||
break;
|
||||
}
|
||||
|
||||
dwc->eps[1]->endpoint.maxpacket = dwc->gadget.ep0->maxpacket;
|
||||
|
||||
/* Enable USB2 LPM Capability */
|
||||
|
||||
if ((dwc->revision > DWC3_REVISION_194A)
|
||||
|
|
|
@ -3226,8 +3226,8 @@ static int _ffs_func_bind(struct usb_configuration *c,
|
|||
struct ffs_data *ffs = func->ffs;
|
||||
|
||||
const int full = !!func->ffs->fs_descs_count;
|
||||
const int high = func->ffs->hs_descs_count;
|
||||
const int super = func->ffs->ss_descs_count;
|
||||
const int high = !!func->ffs->hs_descs_count;
|
||||
const int super = !!func->ffs->ss_descs_count;
|
||||
|
||||
int fs_len, hs_len, ss_len, ret, i;
|
||||
struct ffs_ep *eps_ptr;
|
||||
|
|
|
@ -1018,6 +1018,8 @@ skip_ed:
|
|||
* have modified this list. normally it's just prepending
|
||||
* entries (which we'd ignore), but paranoia won't hurt.
|
||||
*/
|
||||
*last = ed->ed_next;
|
||||
ed->ed_next = NULL;
|
||||
modified = 0;
|
||||
|
||||
/* unlink urbs as requested, but rescan the list after
|
||||
|
@ -1076,21 +1078,22 @@ rescan_this:
|
|||
goto rescan_this;
|
||||
|
||||
/*
|
||||
* If no TDs are queued, take ED off the ed_rm_list.
|
||||
* If no TDs are queued, ED is now idle.
|
||||
* Otherwise, if the HC is running, reschedule.
|
||||
* If not, leave it on the list for further dequeues.
|
||||
* If the HC isn't running, add ED back to the
|
||||
* start of the list for later processing.
|
||||
*/
|
||||
if (list_empty(&ed->td_list)) {
|
||||
*last = ed->ed_next;
|
||||
ed->ed_next = NULL;
|
||||
ed->state = ED_IDLE;
|
||||
list_del(&ed->in_use_list);
|
||||
} else if (ohci->rh_state == OHCI_RH_RUNNING) {
|
||||
*last = ed->ed_next;
|
||||
ed->ed_next = NULL;
|
||||
ed_schedule(ohci, ed);
|
||||
} else {
|
||||
last = &ed->ed_next;
|
||||
ed->ed_next = ohci->ed_rm_list;
|
||||
ohci->ed_rm_list = ed;
|
||||
/* Don't loop on the same ED */
|
||||
if (last == &ohci->ed_rm_list)
|
||||
last = &ed->ed_next;
|
||||
}
|
||||
|
||||
if (modified)
|
||||
|
|
|
@ -46,6 +46,9 @@
|
|||
#define USB_DEVICE_ID_LD_MICROCASSYTIME 0x1033 /* USB Product ID of Micro-CASSY Time (reserved) */
|
||||
#define USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE 0x1035 /* USB Product ID of Micro-CASSY Temperature */
|
||||
#define USB_DEVICE_ID_LD_MICROCASSYPH 0x1038 /* USB Product ID of Micro-CASSY pH */
|
||||
#define USB_DEVICE_ID_LD_POWERANALYSERCASSY 0x1040 /* USB Product ID of Power Analyser CASSY */
|
||||
#define USB_DEVICE_ID_LD_CONVERTERCONTROLLERCASSY 0x1042 /* USB Product ID of Converter Controller CASSY */
|
||||
#define USB_DEVICE_ID_LD_MACHINETESTCASSY 0x1043 /* USB Product ID of Machine Test CASSY */
|
||||
#define USB_DEVICE_ID_LD_JWM 0x1080 /* USB Product ID of Joule and Wattmeter */
|
||||
#define USB_DEVICE_ID_LD_DMMP 0x1081 /* USB Product ID of Digital Multimeter P (reserved) */
|
||||
#define USB_DEVICE_ID_LD_UMIP 0x1090 /* USB Product ID of UMI P */
|
||||
|
@ -88,6 +91,9 @@ static const struct usb_device_id ld_usb_table[] = {
|
|||
{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTIME) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYPH) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POWERANALYSERCASSY) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CONVERTERCONTROLLERCASSY) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MACHINETESTCASSY) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_JWM) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_DMMP) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIP) },
|
||||
|
|
|
@ -999,6 +999,10 @@ static int usbhsf_dma_prepare_pop_with_usb_dmac(struct usbhs_pkt *pkt,
|
|||
if ((uintptr_t)pkt->buf & (USBHS_USB_DMAC_XFER_SIZE - 1))
|
||||
goto usbhsf_pio_prepare_pop;
|
||||
|
||||
/* return at this time if the pipe is running */
|
||||
if (usbhs_pipe_is_running(pipe))
|
||||
return 0;
|
||||
|
||||
usbhs_pipe_config_change_bfre(pipe, 1);
|
||||
|
||||
ret = usbhsf_fifo_select(pipe, fifo, 0);
|
||||
|
@ -1189,6 +1193,7 @@ static int usbhsf_dma_pop_done_with_usb_dmac(struct usbhs_pkt *pkt,
|
|||
usbhsf_fifo_clear(pipe, fifo);
|
||||
pkt->actual = usbhs_dma_calc_received_size(pkt, chan, rcv_len);
|
||||
|
||||
usbhs_pipe_running(pipe, 0);
|
||||
usbhsf_dma_stop(pipe, fifo);
|
||||
usbhsf_dma_unmap(pkt);
|
||||
usbhsf_fifo_unselect(pipe, pipe->fifo);
|
||||
|
|
|
@ -378,10 +378,8 @@ static int unmap_grant_pages(struct grant_map *map, int offset, int pages)
|
|||
}
|
||||
range = 0;
|
||||
while (range < pages) {
|
||||
if (map->unmap_ops[offset+range].handle == -1) {
|
||||
range--;
|
||||
if (map->unmap_ops[offset+range].handle == -1)
|
||||
break;
|
||||
}
|
||||
range++;
|
||||
}
|
||||
err = __unmap_grant_pages(map, offset, range);
|
||||
|
@ -876,8 +874,10 @@ unlock_out:
|
|||
out_unlock_put:
|
||||
mutex_unlock(&priv->lock);
|
||||
out_put_map:
|
||||
if (use_ptemod)
|
||||
if (use_ptemod) {
|
||||
map->vma = NULL;
|
||||
unmap_grant_pages(map, 0, map->count);
|
||||
}
|
||||
gntdev_put_map(priv, map);
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -659,6 +659,7 @@ static struct config_item *extension_details_make_item(struct config_group *grou
|
|||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
qstr_init(&extension_details->name, tmp);
|
||||
extension_details->num = extensions_value->num;
|
||||
ret = insert_ext_gid_entry(&extension_details->name, extensions_value->num);
|
||||
|
||||
if (ret) {
|
||||
|
|
|
@ -497,7 +497,11 @@ retry:
|
|||
hlist_add_head(&s->s_instances, &type->fs_supers);
|
||||
spin_unlock(&sb_lock);
|
||||
get_filesystem(type);
|
||||
register_shrinker(&s->s_shrink);
|
||||
err = register_shrinker(&s->s_shrink);
|
||||
if (err) {
|
||||
deactivate_locked_super(s);
|
||||
s = ERR_PTR(err);
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
|
|
|
@ -47,7 +47,7 @@
|
|||
STATIC int xfs_qm_init_quotainos(xfs_mount_t *);
|
||||
STATIC int xfs_qm_init_quotainfo(xfs_mount_t *);
|
||||
|
||||
|
||||
STATIC void xfs_qm_destroy_quotainos(xfs_quotainfo_t *qi);
|
||||
STATIC void xfs_qm_dqfree_one(struct xfs_dquot *dqp);
|
||||
/*
|
||||
* We use the batch lookup interface to iterate over the dquots as it
|
||||
|
@ -660,9 +660,17 @@ xfs_qm_init_quotainfo(
|
|||
qinf->qi_shrinker.scan_objects = xfs_qm_shrink_scan;
|
||||
qinf->qi_shrinker.seeks = DEFAULT_SEEKS;
|
||||
qinf->qi_shrinker.flags = SHRINKER_NUMA_AWARE;
|
||||
register_shrinker(&qinf->qi_shrinker);
|
||||
|
||||
error = register_shrinker(&qinf->qi_shrinker);
|
||||
if (error)
|
||||
goto out_free_inos;
|
||||
|
||||
return 0;
|
||||
|
||||
out_free_inos:
|
||||
mutex_destroy(&qinf->qi_quotaofflock);
|
||||
mutex_destroy(&qinf->qi_tree_lock);
|
||||
xfs_qm_destroy_quotainos(qinf);
|
||||
out_free_lru:
|
||||
list_lru_destroy(&qinf->qi_lru);
|
||||
out_free_qinf:
|
||||
|
@ -671,7 +679,6 @@ out_free_qinf:
|
|||
return error;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Gets called when unmounting a filesystem or when all quotas get
|
||||
* turned off.
|
||||
|
@ -688,19 +695,8 @@ xfs_qm_destroy_quotainfo(
|
|||
|
||||
unregister_shrinker(&qi->qi_shrinker);
|
||||
list_lru_destroy(&qi->qi_lru);
|
||||
|
||||
if (qi->qi_uquotaip) {
|
||||
IRELE(qi->qi_uquotaip);
|
||||
qi->qi_uquotaip = NULL; /* paranoia */
|
||||
}
|
||||
if (qi->qi_gquotaip) {
|
||||
IRELE(qi->qi_gquotaip);
|
||||
qi->qi_gquotaip = NULL;
|
||||
}
|
||||
if (qi->qi_pquotaip) {
|
||||
IRELE(qi->qi_pquotaip);
|
||||
qi->qi_pquotaip = NULL;
|
||||
}
|
||||
xfs_qm_destroy_quotainos(qi);
|
||||
mutex_destroy(&qi->qi_tree_lock);
|
||||
mutex_destroy(&qi->qi_quotaofflock);
|
||||
kmem_free(qi);
|
||||
mp->m_quotainfo = NULL;
|
||||
|
@ -1561,6 +1557,24 @@ error_rele:
|
|||
return error;
|
||||
}
|
||||
|
||||
STATIC void
|
||||
xfs_qm_destroy_quotainos(
|
||||
xfs_quotainfo_t *qi)
|
||||
{
|
||||
if (qi->qi_uquotaip) {
|
||||
IRELE(qi->qi_uquotaip);
|
||||
qi->qi_uquotaip = NULL; /* paranoia */
|
||||
}
|
||||
if (qi->qi_gquotaip) {
|
||||
IRELE(qi->qi_gquotaip);
|
||||
qi->qi_gquotaip = NULL;
|
||||
}
|
||||
if (qi->qi_pquotaip) {
|
||||
IRELE(qi->qi_pquotaip);
|
||||
qi->qi_pquotaip = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
STATIC void
|
||||
xfs_qm_dqfree_one(
|
||||
struct xfs_dquot *dqp)
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include <net/netns/generic.h>
|
||||
#include <net/rtnetlink.h>
|
||||
#include <net/lwtunnel.h>
|
||||
#include <net/dst_cache.h>
|
||||
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
#include <net/ipv6.h>
|
||||
|
@ -85,11 +86,6 @@ struct ip_tunnel_prl_entry {
|
|||
struct rcu_head rcu_head;
|
||||
};
|
||||
|
||||
struct ip_tunnel_dst {
|
||||
struct dst_entry __rcu *dst;
|
||||
__be32 saddr;
|
||||
};
|
||||
|
||||
struct metadata_dst;
|
||||
|
||||
struct ip_tunnel {
|
||||
|
@ -108,7 +104,7 @@ struct ip_tunnel {
|
|||
int tun_hlen; /* Precalculated header length */
|
||||
int mlink;
|
||||
|
||||
struct ip_tunnel_dst __percpu *dst_cache;
|
||||
struct dst_cache dst_cache;
|
||||
|
||||
struct ip_tunnel_parm parms;
|
||||
|
||||
|
@ -248,7 +244,6 @@ int ip_tunnel_changelink(struct net_device *dev, struct nlattr *tb[],
|
|||
int ip_tunnel_newlink(struct net_device *dev, struct nlattr *tb[],
|
||||
struct ip_tunnel_parm *p);
|
||||
void ip_tunnel_setup(struct net_device *dev, int net_id);
|
||||
void ip_tunnel_dst_reset_all(struct ip_tunnel *t);
|
||||
int ip_tunnel_encap_setup(struct ip_tunnel *t,
|
||||
struct ip_tunnel_encap *ipencap);
|
||||
|
||||
|
|
|
@ -1118,7 +1118,12 @@ static void __hrtimer_init(struct hrtimer *timer, clockid_t clock_id,
|
|||
|
||||
cpu_base = raw_cpu_ptr(&hrtimer_bases);
|
||||
|
||||
if (clock_id == CLOCK_REALTIME && mode != HRTIMER_MODE_ABS)
|
||||
/*
|
||||
* POSIX magic: Relative CLOCK_REALTIME timers are not affected by
|
||||
* clock modifications, so they needs to become CLOCK_MONOTONIC to
|
||||
* ensure POSIX compliance.
|
||||
*/
|
||||
if (clock_id == CLOCK_REALTIME && mode & HRTIMER_MODE_REL)
|
||||
clock_id = CLOCK_MONOTONIC;
|
||||
|
||||
base = hrtimer_clockid_to_base(clock_id);
|
||||
|
|
|
@ -671,7 +671,23 @@ do { \
|
|||
************** MIPS/64 **************
|
||||
***************************************/
|
||||
#if (defined(__mips) && __mips >= 3) && W_TYPE_SIZE == 64
|
||||
#if (__GNUC__ >= 5) || (__GNUC__ >= 4 && __GNUC_MINOR__ >= 4)
|
||||
#if defined(__mips_isa_rev) && __mips_isa_rev >= 6
|
||||
/*
|
||||
* GCC ends up emitting a __multi3 intrinsic call for MIPS64r6 with the plain C
|
||||
* code below, so we special case MIPS64r6 until the compiler can do better.
|
||||
*/
|
||||
#define umul_ppmm(w1, w0, u, v) \
|
||||
do { \
|
||||
__asm__ ("dmulu %0,%1,%2" \
|
||||
: "=d" ((UDItype)(w0)) \
|
||||
: "d" ((UDItype)(u)), \
|
||||
"d" ((UDItype)(v))); \
|
||||
__asm__ ("dmuhu %0,%1,%2" \
|
||||
: "=d" ((UDItype)(w1)) \
|
||||
: "d" ((UDItype)(u)), \
|
||||
"d" ((UDItype)(v))); \
|
||||
} while (0)
|
||||
#elif (__GNUC__ >= 5) || (__GNUC__ >= 4 && __GNUC_MINOR__ >= 4)
|
||||
#define umul_ppmm(w1, w0, u, v) \
|
||||
do { \
|
||||
typedef unsigned int __ll_UTItype __attribute__((mode(TI))); \
|
||||
|
|
|
@ -186,6 +186,7 @@ config NET_IPGRE_DEMUX
|
|||
|
||||
config NET_IP_TUNNEL
|
||||
tristate
|
||||
select DST_CACHE
|
||||
default n
|
||||
|
||||
config NET_IPGRE
|
||||
|
|
|
@ -1527,10 +1527,7 @@ int ip_getsockopt(struct sock *sk, int level,
|
|||
if (get_user(len, optlen))
|
||||
return -EFAULT;
|
||||
|
||||
lock_sock(sk);
|
||||
err = nf_getsockopt(sk, PF_INET, optname, optval,
|
||||
&len);
|
||||
release_sock(sk);
|
||||
err = nf_getsockopt(sk, PF_INET, optname, optval, &len);
|
||||
if (err >= 0)
|
||||
err = put_user(len, optlen);
|
||||
return err;
|
||||
|
@ -1562,9 +1559,7 @@ int compat_ip_getsockopt(struct sock *sk, int level, int optname,
|
|||
if (get_user(len, optlen))
|
||||
return -EFAULT;
|
||||
|
||||
lock_sock(sk);
|
||||
err = compat_nf_getsockopt(sk, PF_INET, optname, optval, &len);
|
||||
release_sock(sk);
|
||||
if (err >= 0)
|
||||
err = put_user(len, optlen);
|
||||
return err;
|
||||
|
|
|
@ -69,61 +69,6 @@ static unsigned int ip_tunnel_hash(__be32 key, __be32 remote)
|
|||
IP_TNL_HASH_BITS);
|
||||
}
|
||||
|
||||
static void __tunnel_dst_set(struct ip_tunnel_dst *idst,
|
||||
struct dst_entry *dst, __be32 saddr)
|
||||
{
|
||||
struct dst_entry *old_dst;
|
||||
|
||||
dst_clone(dst);
|
||||
old_dst = xchg((__force struct dst_entry **)&idst->dst, dst);
|
||||
dst_release(old_dst);
|
||||
idst->saddr = saddr;
|
||||
}
|
||||
|
||||
static noinline void tunnel_dst_set(struct ip_tunnel *t,
|
||||
struct dst_entry *dst, __be32 saddr)
|
||||
{
|
||||
__tunnel_dst_set(raw_cpu_ptr(t->dst_cache), dst, saddr);
|
||||
}
|
||||
|
||||
static void tunnel_dst_reset(struct ip_tunnel *t)
|
||||
{
|
||||
tunnel_dst_set(t, NULL, 0);
|
||||
}
|
||||
|
||||
void ip_tunnel_dst_reset_all(struct ip_tunnel *t)
|
||||
{
|
||||
int i;
|
||||
|
||||
for_each_possible_cpu(i)
|
||||
__tunnel_dst_set(per_cpu_ptr(t->dst_cache, i), NULL, 0);
|
||||
}
|
||||
EXPORT_SYMBOL(ip_tunnel_dst_reset_all);
|
||||
|
||||
static struct rtable *tunnel_rtable_get(struct ip_tunnel *t,
|
||||
u32 cookie, __be32 *saddr)
|
||||
{
|
||||
struct ip_tunnel_dst *idst;
|
||||
struct dst_entry *dst;
|
||||
|
||||
rcu_read_lock();
|
||||
idst = raw_cpu_ptr(t->dst_cache);
|
||||
dst = rcu_dereference(idst->dst);
|
||||
if (dst && !atomic_inc_not_zero(&dst->__refcnt))
|
||||
dst = NULL;
|
||||
if (dst) {
|
||||
if (!dst->obsolete || dst->ops->check(dst, cookie)) {
|
||||
*saddr = idst->saddr;
|
||||
} else {
|
||||
tunnel_dst_reset(t);
|
||||
dst_release(dst);
|
||||
dst = NULL;
|
||||
}
|
||||
}
|
||||
rcu_read_unlock();
|
||||
return (struct rtable *)dst;
|
||||
}
|
||||
|
||||
static bool ip_tunnel_key_match(const struct ip_tunnel_parm *p,
|
||||
__be16 flags, __be32 key)
|
||||
{
|
||||
|
@ -382,11 +327,12 @@ static int ip_tunnel_bind_dev(struct net_device *dev)
|
|||
|
||||
if (!IS_ERR(rt)) {
|
||||
tdev = rt->dst.dev;
|
||||
tunnel_dst_set(tunnel, &rt->dst, fl4.saddr);
|
||||
ip_rt_put(rt);
|
||||
}
|
||||
if (dev->type != ARPHRD_ETHER)
|
||||
dev->flags |= IFF_POINTOPOINT;
|
||||
|
||||
dst_cache_reset(&tunnel->dst_cache);
|
||||
}
|
||||
|
||||
if (!tdev && tunnel->parms.link)
|
||||
|
@ -733,7 +679,8 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,
|
|||
if (ip_tunnel_encap(skb, tunnel, &protocol, &fl4) < 0)
|
||||
goto tx_error;
|
||||
|
||||
rt = connected ? tunnel_rtable_get(tunnel, 0, &fl4.saddr) : NULL;
|
||||
rt = connected ? dst_cache_get_ip4(&tunnel->dst_cache, &fl4.saddr) :
|
||||
NULL;
|
||||
|
||||
if (!rt) {
|
||||
rt = ip_route_output_key(tunnel->net, &fl4);
|
||||
|
@ -743,7 +690,8 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,
|
|||
goto tx_error;
|
||||
}
|
||||
if (connected)
|
||||
tunnel_dst_set(tunnel, &rt->dst, fl4.saddr);
|
||||
dst_cache_set_ip4(&tunnel->dst_cache, &rt->dst,
|
||||
fl4.saddr);
|
||||
}
|
||||
|
||||
if (rt->dst.dev == dev) {
|
||||
|
@ -841,7 +789,7 @@ static void ip_tunnel_update(struct ip_tunnel_net *itn,
|
|||
if (set_mtu)
|
||||
dev->mtu = mtu;
|
||||
}
|
||||
ip_tunnel_dst_reset_all(t);
|
||||
dst_cache_reset(&t->dst_cache);
|
||||
netdev_state_change(dev);
|
||||
}
|
||||
|
||||
|
@ -980,7 +928,7 @@ static void ip_tunnel_dev_free(struct net_device *dev)
|
|||
struct ip_tunnel *tunnel = netdev_priv(dev);
|
||||
|
||||
gro_cells_destroy(&tunnel->gro_cells);
|
||||
free_percpu(tunnel->dst_cache);
|
||||
dst_cache_destroy(&tunnel->dst_cache);
|
||||
free_percpu(dev->tstats);
|
||||
free_netdev(dev);
|
||||
}
|
||||
|
@ -1174,15 +1122,15 @@ int ip_tunnel_init(struct net_device *dev)
|
|||
if (!dev->tstats)
|
||||
return -ENOMEM;
|
||||
|
||||
tunnel->dst_cache = alloc_percpu(struct ip_tunnel_dst);
|
||||
if (!tunnel->dst_cache) {
|
||||
err = dst_cache_init(&tunnel->dst_cache, GFP_KERNEL);
|
||||
if (err) {
|
||||
free_percpu(dev->tstats);
|
||||
return -ENOMEM;
|
||||
return err;
|
||||
}
|
||||
|
||||
err = gro_cells_init(&tunnel->gro_cells, dev);
|
||||
if (err) {
|
||||
free_percpu(tunnel->dst_cache);
|
||||
dst_cache_destroy(&tunnel->dst_cache);
|
||||
free_percpu(dev->tstats);
|
||||
return err;
|
||||
}
|
||||
|
@ -1212,7 +1160,7 @@ void ip_tunnel_uninit(struct net_device *dev)
|
|||
if (itn->fb_tunnel_dev != dev)
|
||||
ip_tunnel_del(itn, netdev_priv(dev));
|
||||
|
||||
ip_tunnel_dst_reset_all(tunnel);
|
||||
dst_cache_reset(&tunnel->dst_cache);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ip_tunnel_uninit);
|
||||
|
||||
|
|
|
@ -1340,10 +1340,7 @@ int ipv6_getsockopt(struct sock *sk, int level, int optname,
|
|||
if (get_user(len, optlen))
|
||||
return -EFAULT;
|
||||
|
||||
lock_sock(sk);
|
||||
err = nf_getsockopt(sk, PF_INET6, optname, optval,
|
||||
&len);
|
||||
release_sock(sk);
|
||||
err = nf_getsockopt(sk, PF_INET6, optname, optval, &len);
|
||||
if (err >= 0)
|
||||
err = put_user(len, optlen);
|
||||
}
|
||||
|
@ -1382,10 +1379,7 @@ int compat_ipv6_getsockopt(struct sock *sk, int level, int optname,
|
|||
if (get_user(len, optlen))
|
||||
return -EFAULT;
|
||||
|
||||
lock_sock(sk);
|
||||
err = compat_nf_getsockopt(sk, PF_INET6,
|
||||
optname, optval, &len);
|
||||
release_sock(sk);
|
||||
err = compat_nf_getsockopt(sk, PF_INET6, optname, optval, &len);
|
||||
if (err >= 0)
|
||||
err = put_user(len, optlen);
|
||||
}
|
||||
|
|
|
@ -1612,6 +1612,7 @@ struct dst_entry *icmp6_dst_alloc(struct net_device *dev,
|
|||
}
|
||||
|
||||
rt->dst.flags |= DST_HOST;
|
||||
rt->dst.input = ip6_input;
|
||||
rt->dst.output = ip6_output;
|
||||
atomic_set(&rt->dst.__refcnt, 1);
|
||||
rt->rt6i_gateway = fl6->daddr;
|
||||
|
|
|
@ -475,7 +475,7 @@ static void ipip6_tunnel_uninit(struct net_device *dev)
|
|||
ipip6_tunnel_unlink(sitn, tunnel);
|
||||
ipip6_tunnel_del_prl(tunnel, NULL);
|
||||
}
|
||||
ip_tunnel_dst_reset_all(tunnel);
|
||||
dst_cache_reset(&tunnel->dst_cache);
|
||||
dev_put(dev);
|
||||
}
|
||||
|
||||
|
@ -1098,7 +1098,7 @@ static void ipip6_tunnel_update(struct ip_tunnel *t, struct ip_tunnel_parm *p)
|
|||
t->parms.link = p->link;
|
||||
ipip6_tunnel_bind_dev(t->dev);
|
||||
}
|
||||
ip_tunnel_dst_reset_all(t);
|
||||
dst_cache_reset(&t->dst_cache);
|
||||
netdev_state_change(t->dev);
|
||||
}
|
||||
|
||||
|
@ -1129,7 +1129,7 @@ static int ipip6_tunnel_update_6rd(struct ip_tunnel *t,
|
|||
t->ip6rd.relay_prefix = relay_prefix;
|
||||
t->ip6rd.prefixlen = ip6rd->prefixlen;
|
||||
t->ip6rd.relay_prefixlen = ip6rd->relay_prefixlen;
|
||||
ip_tunnel_dst_reset_all(t);
|
||||
dst_cache_reset(&t->dst_cache);
|
||||
netdev_state_change(t->dev);
|
||||
return 0;
|
||||
}
|
||||
|
@ -1283,7 +1283,7 @@ ipip6_tunnel_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|||
err = ipip6_tunnel_add_prl(t, &prl, cmd == SIOCCHGPRL);
|
||||
break;
|
||||
}
|
||||
ip_tunnel_dst_reset_all(t);
|
||||
dst_cache_reset(&t->dst_cache);
|
||||
netdev_state_change(dev);
|
||||
break;
|
||||
|
||||
|
@ -1344,7 +1344,7 @@ static void ipip6_dev_free(struct net_device *dev)
|
|||
{
|
||||
struct ip_tunnel *tunnel = netdev_priv(dev);
|
||||
|
||||
free_percpu(tunnel->dst_cache);
|
||||
dst_cache_destroy(&tunnel->dst_cache);
|
||||
free_percpu(dev->tstats);
|
||||
free_netdev(dev);
|
||||
}
|
||||
|
@ -1377,6 +1377,7 @@ static void ipip6_tunnel_setup(struct net_device *dev)
|
|||
static int ipip6_tunnel_init(struct net_device *dev)
|
||||
{
|
||||
struct ip_tunnel *tunnel = netdev_priv(dev);
|
||||
int err;
|
||||
|
||||
tunnel->dev = dev;
|
||||
tunnel->net = dev_net(dev);
|
||||
|
@ -1387,11 +1388,11 @@ static int ipip6_tunnel_init(struct net_device *dev)
|
|||
if (!dev->tstats)
|
||||
return -ENOMEM;
|
||||
|
||||
tunnel->dst_cache = alloc_percpu(struct ip_tunnel_dst);
|
||||
if (!tunnel->dst_cache) {
|
||||
err = dst_cache_init(&tunnel->dst_cache, GFP_KERNEL);
|
||||
if (err) {
|
||||
free_percpu(dev->tstats);
|
||||
dev->tstats = NULL;
|
||||
return -ENOMEM;
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -2877,7 +2877,7 @@ cfg80211_beacon_dup(struct cfg80211_beacon_data *beacon)
|
|||
}
|
||||
if (beacon->probe_resp_len) {
|
||||
new_beacon->probe_resp_len = beacon->probe_resp_len;
|
||||
beacon->probe_resp = pos;
|
||||
new_beacon->probe_resp = pos;
|
||||
memcpy(pos, beacon->probe_resp, beacon->probe_resp_len);
|
||||
pos += beacon->probe_resp_len;
|
||||
}
|
||||
|
|
|
@ -3368,6 +3368,8 @@ static bool ieee80211_accept_frame(struct ieee80211_rx_data *rx)
|
|||
}
|
||||
return true;
|
||||
case NL80211_IFTYPE_MESH_POINT:
|
||||
if (ether_addr_equal(sdata->vif.addr, hdr->addr2))
|
||||
return false;
|
||||
if (multicast)
|
||||
return true;
|
||||
return ether_addr_equal(sdata->vif.addr, hdr->addr1);
|
||||
|
|
|
@ -4445,7 +4445,7 @@ static int sctp_getsockopt_autoclose(struct sock *sk, int len, char __user *optv
|
|||
len = sizeof(int);
|
||||
if (put_user(len, optlen))
|
||||
return -EFAULT;
|
||||
if (copy_to_user(optval, &sctp_sk(sk)->autoclose, sizeof(int)))
|
||||
if (copy_to_user(optval, &sctp_sk(sk)->autoclose, len))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
|
@ -5022,6 +5022,9 @@ copy_getaddrs:
|
|||
err = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
/* XXX: We should have accounted for sizeof(struct sctp_getaddrs) too,
|
||||
* but we can't change it anymore.
|
||||
*/
|
||||
if (put_user(bytes_copied, optlen))
|
||||
err = -EFAULT;
|
||||
out:
|
||||
|
@ -5458,7 +5461,7 @@ static int sctp_getsockopt_maxseg(struct sock *sk, int len,
|
|||
params.assoc_id = 0;
|
||||
} else if (len >= sizeof(struct sctp_assoc_value)) {
|
||||
len = sizeof(struct sctp_assoc_value);
|
||||
if (copy_from_user(¶ms, optval, sizeof(params)))
|
||||
if (copy_from_user(¶ms, optval, len))
|
||||
return -EFAULT;
|
||||
} else
|
||||
return -EINVAL;
|
||||
|
@ -5627,7 +5630,9 @@ static int sctp_getsockopt_active_key(struct sock *sk, int len,
|
|||
|
||||
if (len < sizeof(struct sctp_authkeyid))
|
||||
return -EINVAL;
|
||||
if (copy_from_user(&val, optval, sizeof(struct sctp_authkeyid)))
|
||||
|
||||
len = sizeof(struct sctp_authkeyid);
|
||||
if (copy_from_user(&val, optval, len))
|
||||
return -EFAULT;
|
||||
|
||||
asoc = sctp_id2assoc(sk, val.scact_assoc_id);
|
||||
|
@ -5639,7 +5644,6 @@ static int sctp_getsockopt_active_key(struct sock *sk, int len,
|
|||
else
|
||||
val.scact_keynumber = ep->active_key_id;
|
||||
|
||||
len = sizeof(struct sctp_authkeyid);
|
||||
if (put_user(len, optlen))
|
||||
return -EFAULT;
|
||||
if (copy_to_user(optval, &val, len))
|
||||
|
@ -5665,7 +5669,7 @@ static int sctp_getsockopt_peer_auth_chunks(struct sock *sk, int len,
|
|||
if (len < sizeof(struct sctp_authchunks))
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_from_user(&val, optval, sizeof(struct sctp_authchunks)))
|
||||
if (copy_from_user(&val, optval, sizeof(val)))
|
||||
return -EFAULT;
|
||||
|
||||
to = p->gauth_chunks;
|
||||
|
@ -5710,7 +5714,7 @@ static int sctp_getsockopt_local_auth_chunks(struct sock *sk, int len,
|
|||
if (len < sizeof(struct sctp_authchunks))
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_from_user(&val, optval, sizeof(struct sctp_authchunks)))
|
||||
if (copy_from_user(&val, optval, sizeof(val)))
|
||||
return -EFAULT;
|
||||
|
||||
to = p->gauth_chunks;
|
||||
|
|
Loading…
Add table
Reference in a new issue