mirror of
https://github.com/joel16/android_kernel_sony_msm8994_rework.git
synced 2025-02-17 00:29:21 +00:00
Merge tag 'v3.10.107' into lineage-15.1
0e3d574 Linux 3.10.107 0fcba8f Allow stack to grow up to address space limit 28ebf89 mm: fix new crash in unmapped_area_topdown() 1ad9a25 mm: larger stack guard gap, between vmas a5eec86 x86/mm/32: Enable full randomization on i386 and X86_32 2d49a81 x86: standardize mmap_rnd() usage 36805c5 ipv6: check raw payload size correctly in ioctl d46354f printk: use rcuidle console tracepoint 302c74b tun: read vnet_hdr_sz once 58e4633 kvm: nVMX: Allow L1 to intercept software exceptions (#BP and #OF) b3d2d8a ftrace/x86: Fix triple fault with graph tracing and suspend-to-ram 2103905 nfsd: check for oversized NFSv2/v3 arguments 37a23f2 p9_client_readdir() fix 1e46601 xen/x86: don't lose event interrupts 403642a RDS: Fix the atomicity for congestion map update 32b0616 MIPS: Fix crash registers on non-crashing CPUs ab93db2 ip6mr: fix notification device destruction 075de21 sctp: listen on the sock only when it's state is listening or closed 4d1b81c net: neigh: guard against NULL solicit() method c1b4204 gfs2: avoid uninitialized variable warning f6d81f2 hostap: avoid uninitialized variable use in hfa384x_get_rid 8998669 tty: nozomi: avoid a harmless gcc warning a8069ae net/packet: fix overflow in check for tp_reserve 492980c net/packet: fix overflow in check for tp_frame_nr 187d3b3 powerpc: Reject binutils 2.24 when building little endian 2c6896a x86/mce/AMD: Give a name to MCA bank 3 when accessed with legacy MSRs e898332 ubi/upd: Always flush after prepared for an update 0854b58 Drivers: hv: get rid of timeout in vmbus_open() 0c792ee Drivers: hv: don't leak memory in vmbus_establish_gpadl() 3fa1656 net: ipv6: check route protocol when deleting routes 6b7c152 catc: Use heap buffer for memory size test f3487f84 catc: Combine failure cleanup code in catc_probe() fad53245 virtio-console: avoid DMA from stack 081fb3d mm: Tighten x86 /dev/mem with zeroing reads c9b40c2 platform/x86: acer-wmi: setup accelerometer when ACPI device was found 9b2b8b0 platform/x86: acer-wmi: setup accelerometer when machine has appropriate notify event c0dd8ff char: lack of bool string made CONFIG_DEVPORT always on 3fa1aeb xen, fbfront: fix connecting to backend 6694041 iscsi-target: Drop work-around for legacy GlobalSAN initiator e71bfbe iscsi-target: Fix TMR reference leak during session shutdown 5e25d2d x86/vdso: Plug race between mapping and ELF header setup 56bc42d net/packet: fix overflow in check for priv area size db930d8 mtd: bcm47xxpart: fix parsing first block after aligned TRX ef67ca9 mm/mempolicy.c: fix error handling in set_mempolicy and mbind. 4261679 powerpc: Don't try to fix up misaligned load-with-reservation instructions aaf47bf metag/usercopy: Zero rest of buffer from copy_from_user 0f84dfc metag/usercopy: Drop unused macros 903377e Reset TreeId to zero on SMB2 TREE_CONNECT 404f763 drm/vmwgfx: fix integer overflow in vmw_surface_define_ioctl() 3a36304 drm/vmwgfx: Remove getparam error message 354b332 drm/vmwgfx: avoid calling vzalloc with a 0 size in vmw_get_cap_3d_ioctl() 30cd45a6 drm/vmwgfx: NULL pointer dereference in vmw_surface_define_ioctl() 02f1f3f HID: i2c-hid: Add sleep between POWER ON and RESET 2ee4455 HID: hid-lg: Fix immediate disconnection of Logitech Rumblepad 2 7a76e42 padata: avoid race in reordering 535c7d6 rtc: s35390a: improve irq handling df4be7e rtc: s35390a: implement reset routine as suggested by the reference 231b0f80 rtc: s35390a: make sure all members in the output are set 1812b5c ACPI / power: Avoid maybe-uninitialized warning 42fdd36 ACPI: Fix incompatibility with mcount-based function graph tracing edaad97 libceph: force GFP_NOIO for socket allocations 80fb16c metag/ptrace: Reject partial NT_METAG_RPIPE writes 137b9e2 metag/ptrace: Provide default TXSTATUS for short NT_PRSTATUS 1dc7c2d metag/ptrace: Preserve previous registers for short regset write e1e277f sparc/ptrace: Preserve previous registers for short regset write 7d3e34e c6x/ptrace: Remove useless PTRACE_SETREGSET implementation e2e1170 virtio_balloon: init 1st buffer in stats vq 0907dbe crypto: algif_hash - avoid zero-sized array 88085d8 fbcon: Fix vc attr at deinit 935896e uvcvideo: uvc_scan_fallback() for webcams with broken chain ecf229c mmc: sdhci: Do not disable interrupts while waiting for clock 7eb0374 ACM gadget: fix endianness in notifications f754ccc tcp: initialize icsk_ack.lrcvtime at session start time 7dbfa25 ipv4: provide stronger user input validation in nl_fib_input() 6e37a68 igb: add i211 to i210 PHY workaround cc7f31b igb: Workaround for igb i210 firmware issue 741c8ac cpufreq: Fix and clean up show_cpuinfo_cur_freq() ab6c86a s390/pci: fix use after free in dma_init 2b49b19 Drivers: hv: balloon: don't crash when memory is added in non-sorted order 4bbe571 ACPI / video: skip evaluating _DOD when it does not exist a4da2b0 crypto: cryptd - Assign statesize properly 4324a47 crypto: ghash-clmulni - Fix load failure 42be60f cancel the setfilesize transation when io error happen 46d284b give up on gcc ilog2() constant optimizations 4401c71 futex: Add missing error handling to FUTEX_REQUEUE_PI 8f4a52d futex: Fix potential use-after-free in FUTEX_REQUEUE_PI 3710b15 dccp: fix memory leak during tear-down of unsuccessful connection request cb93d3f ipv6: avoid write to a possibly cloned skb ce01649 uapi: fix linux/packet_diag.h userspace compilation error 9b4c2e7 tcp: fix various issues for sockets morphing to listen state 0363343 dccp: Unlock sock before calling sk_free() bc00602be net: don't call strlen() on the user buffer in packet_bind_spkt() 3475371 l2tp: avoid use-after-free caused by l2tp_ip_backlog_recv 57f2082 mvsas: fix misleading indentation ab4de16 cpmac: remove hopeless #warning c424014 mtd: pmcmsp: use kstrndup instead of kmalloc+strncpy 4f9f848 crypto: improve gcc optimization flags for serpent and wp512 2ebbe4f xhci: fix 10 second timeout on removal of PCI hotpluggable xhci controllers 8d05f35 drivers: hv: Turn off write permission on the hypercall page 496355e fat: fix using uninitialized fields of fat_inode/fsinfo_inode 51f2df4 drm/ttm: Make sure BOs being swapped out are cacheable 6ac2741 drm/ast: Fix test for VGA enabled 6958f50 mac80211: flush delayed work when entering suspend 0c51e5d xtensa: move parse_tag_fdt out of #ifdef CONFIG_BLK_DEV_INITRD 71116d6 s390: TASK_SIZE for kernel threads f7bbcab KVM: s390: fix task size check 9f3a56a KVM: PPC: Book3S PR: Fix illegal opcode emulation d1e71d5 KVM: VMX: use correct vmcs_read/write for guest segment selector/base 96a14fe powerpc/xmon: Fix data-breakpoint 4289b9c bcma: use (get|put)_device when probing/removing device driver 249eb34 NFSv4: fix getacl ERANGE for some ACL buffer sizes 11f43b2 rdma_cm: fail iwarp accepts w/o connection params f84c064 ath5k: drop bogus warning on drv_set_key with unsupported cipher 109b421 samples/seccomp: fix 64-bit comparison macros 1ba4fc4 sd: get disk reference in sd_check_events() 20bfb0a ipc/shm: Fix shmat mmap nil-page protection 281c8f7 mm: vmpressure: fix sending wrong events on underflow 95589a7 MIPS: Fix special case in 64 bit IP checksumming. c0c294a af_packet: remove a stray tab in packet_set_ring() 5751935 rtlwifi: rtl_usb: Fix for URB leaking when doing ifconfig up/down 298feed tty: serial: msm: Fix module autoload 5988be3 irda: Fix lockdep annotations in hashbin_delete(). 296a1ab rtc: interface: ignore expired timers when enqueuing new timers bbd2068 futex: Move futex_init() to core_initcall 7160035 siano: make it work again with CONFIG_VMAP_STACK fe75d1a vfs: fix uninitialized flags in splice_to_pipe() c6cc07d packet: round up linear to header len b0899f8 macvtap: read vnet_hdr_size once 5c235ec tcp: fix 0 divide in __tcp_select_window() 4718919 sched/debug: Don't dump sched debug info in SysRq-W e2ec149 ARC: [arcompact] brown paper bag bug in unaligned access delay slot fixup 6ee1806 mm, fs: check for fatal signals in do_generic_file_read() 18f6264 mm/memory_hotplug.c: check start_pfn in test_pages_in_a_zone() bb3d39c ata: sata_mv:- Handle return value of devm_ioremap. 055d0a8 crypto: api - Clear CRYPTO_ALG_DEAD bit before registering an alg bb47c5c drm/nouveau/nv1a,nv1f/disp: fix memory clock rate retrieval ddee222 af_unix: move unix_mknod() out of bindlock cba3e28 ipv6: addrconf: Avoid addrconf_disable_change() using RCU read-side lock 379fa3e nfs: Don't increment lock sequence ID after NFS4ERR_MOVED 485f990 parisc: Don't use BITS_PER_LONG in userspace-exported swab.h header b5882ec ARC: [arcompact] handle unaligned access delay slot corner case ddf2415 ISDN: eicon: silence misleading array-bounds warning db2b7cd sysctl: fix proc_doulongvec_ms_jiffies_minmax() 3cc334c tile/ptrace: Preserve previous registers for short regset write baaee1b bnx2x: Correct ringparam estimate when DOWN 1d662dc serial: 8250_pci: Detach low-level driver during PCI error recovery 64df8d3 move the call of __d_drop(anon) into __d_materialise_unique(dentry, anon) dda50d9 sg: Fix double-free when drives detach during SG_IO 0570aff bna: Add synchronization for tx ring. 37ccd2b vfio/pci: Fix integer overflows, bitmask check f466ca6 apparmor: do not expose kernel stack a078d77 apparmor: fix module parameters can be changed after policy is locked 1259d17 apparmor: fix oops in profile_unpack() when policy_db is not present 4b0f1ec apparmor: don't check for vmalloc_addr if kvzalloc() failed efbb2d5 apparmor: add missing id bounds check on dfa verification 57ad170 apparmor: check that xindex is in trans_table bounds 8b201a9 apparmor: internal paths should be treated as disconnected 31d33070 apparmor: fix disconnected bind mnts reconnection 8d14bc9 apparmor: exec should not be returning ENOENT when it denies e41dd34 apparmor: fix uninitialized lsm_audit member 0e872a0 Fix regression which breaks DFS mounting 685957c Move check for prefix path to within cifs_get_root() 5c33dcb Compare prepaths when comparing superblocks 528d066 Fix memory leaks in cifs_do_mount() 40fb18b vmxnet3: Wake queue from reset work da39d11 NFSv4: Ensure nfs_atomic_open set the dentry verifier on ENOENT 1c17617 ARM: dts: da850-evm: fix read access to SPI flash d6797dd ARM: 8634/1: hw_breakpoint: blacklist Scorpion CPUs 2044077 qla2xxx: Fix crash due to null pointer access 369ca80 x86/PCI: Ignore _CRS on Supermicro X8DTH-i/6/iF/6F 9cbef9a pinctrl: sh-pfc: Do not unconditionally support PIN_CONFIG_BIAS_DISABLE a5464db sysrq: attach sysrq handler correctly for 32-bit kernel 23913c7 vme: Fix wrong pointer utilization in ca91cx42_slave_get f8ddf96 i2c: fix kernel memory disclosure in dev interface b7f5924 Input: i8042 - add Clevo P650RS to the i8042 reset list 091db52 Input: mpr121 - set missing event capability 3910681 Input: mpr121 - handle multiple bits change of status register 4a878a0 Input: tca8418 - use the interrupt trigger from the device tree 840c242 Input: joydev - do not report stale values on first open 3f25fb3 Input: kbtab - validate number of endpoints before using them f0819a4 Input: iforce - validate number of endpoints before using them 4fccf69 Input: i8042 - add noloop quirk for Dell Embedded Box PC 3000 e2c835e Input: xpad - use correct product id for x360w controllers a48d5b1 HID: hid-cypress: validate length of report 461527f igmp: Make igmp group member RFC 3376 compliant e88f37a drop_monitor: consider inserted data in genlmsg_end 0cfc062 drop_monitor: add missing call to genlmsg_end 4375298 netvsc: reduce maximum GSO size 468316b tick/broadcast: Prevent NULL pointer dereference 8f58777 net: ti: cpmac: Fix compiler warning due to type confusion de2e280 cred/userns: define current_user_ns() as a function fa51c86 ftrace/x86: Set ftrace_stub to weak to prevent gcc from using short jumps to it 823a2a0 sg_write()/bsg_write() is not fit to be called under KERNEL_DS b1230ef powerpc/ps3: Fix system hang with GCC 5 builds 768ce7b nfs_write_end(): fix handling of short copies 93c83e37 libceph: verify authorize reply on connect 8cfc539 s390/vmlogrdr: fix IUCV buffer allocation 937f076 scsi: sd: Fix capacity calculation with 32-bit sector_t d427ab5 scsi: sr: Sanity check returned mode data dfda822 scsi: lpfc: Add shutdown method for kexec 22e0bbb target/pscsi: Fix TYPE_TAPE + TYPE_MEDIMUM_CHANGER export d49e93f scsi: storvsc: properly set residual data length on errors d9b6a46 scsi: storvsc: properly handle SRB_ERROR when sense message is present c243c61 scsi: don't BUG_ON() empty DMA transfers cf8ec2c scsi: move the nr_phys_segments assert into scsi_init_io b3ffb4c scsi: avoid a permanent stop of the scsi device's request queue 0175d92 drivers/gpu/drm/ast: Fix infinite loop if read fails 048eeeb ssb: Fix error routine when fallback SPROM fails 4e448d4 xfs: clear _XBF_PAGES from buffers when readahead page dfd97b5 xfs: set AGI buffer type in xlog_recover_clear_agi_bucket afeef47 arm/xen: Use alloc_percpu rather than __alloc_percpu 50da0b0 USB: UHCI: report non-PME wakeup signalling for Intel hardware d4dfd03 usb: gadget: composite: correctly initialize ep->maxpacket 1ea3d6c usb: hub: Wait for connection to be reestablished after port reset 91c86d7 usb: dwc3: gadget: delay unmap of bounced requests a3fdfc6 usb: host: xhci-plat: Fix timeout on removal of hot pluggable xhci controllers 8cada85 usb: dwc3: gadget: make Set Endpoint Configuration macros safe 817a471 USB: cdc-acm: fix failed open not being detected 256d49b USB: cdc-acm: fix open and suspend race f8dc9ab USB: cdc-acm: fix double usb_autopm_put_interface() in acm_port_activate() 7b1a80c usb: gadget: composite: always set ep->mult to a sensible value a1bf279 USB: serial: io_ti: bind to interface after fw download e233c67 xhci: free xhci virtual devices with leaf nodes first bde22e3 USB: gadgetfs: fix checks of wTotalLength in config descriptors 6ccec4b USB: gadgetfs: fix use-after-free bug 66e87b4 USB: gadgetfs: fix unbounded memory allocation bug 133caaf usb: gadgetfs: restrict upper bound on device configuration size 7563f27 ALSA: usb-audio: Add QuickCam Communicate Deluxe/S7500 to volume_control_quirks 42860da ALSA: seq: Don't break snd_use_lock_sync() loop by timeout 28e0ebd ALSA: seq: Fix race during FIFO resize 2dbb155 ALSA: seq: Fix racy cell insertions during snd_seq_pool_done() 2dbfb5c ALSA: seq: Fix link corruption by event error handling 7a3085a ALSA: timer: Reject user params with too small ticks 28567fb ALSA: seq: Don't handle loop timeout at snd_seq_pool_done() 6dd5cf4 ALSA: seq: Fix race at creating a queue bbcdcb8 ALSA: hda - Fix up GPIO for ASUS ROG Ranger d2ab6e5 can: usb_8dev: Fix memory leak of priv->cmd_msg_buffer d5361ee can: bcm: fix hrtimer/tasklet termination in bcm op removal 2adddc0a can: ti_hecc: add missing prepare and unprepare of the clock 165cc03 can: c_can_pci: fix null-pointer-deref in c_can_start() - set device pointer 3e7b58a can: peak: fix bad memory access and free sequence cf79690 can: raw: raw_setsockopt: limit number of can_filter that can be set 1918581 ocfs2: fix BUG_ON() in ocfs2_ci_checkpointed() 4b93c1d ocfs2: fix crash caused by stale lvb with fsdlm plugin 4549e4a cifs: Do not send echoes before Negotiate is complete a9baa44 fs/cifs: make share unaccessible at root level mountable 60f2c2f CIFS: remove bad_network_name flag f9e74c2 CIFS: Fix a possible memory corruption in push locks 85beff4 CIFS: Fix missing nls unload in smb2_reconnect() e008a96 CIFS: Fix a possible memory corruption during reconnect d45256f md linear: fix a race between linear_add() and linear_congested() 7a56cc0 md:raid1: fix a dead loop when read from a WriteMostly disk 523d769 md/raid5: limit request size according to implementation limits 8255960 dm space map metadata: fix 'struct sm_metadata' leak on failed create 3044e19 dm crypt: mark key as invalid until properly loaded 1dd3d3e block: fix del_gendisk() vs blkdev_ioctl crash 5cb0174 block: allow WRITE_SAME commands with the SG_IO ioctl 0f3a4aa block: fix use-after-free in sys_ioprio_get() cd0d925 ext4: fix inode checksum calculation problem if i_extra_size is small 48a5889 ext4: return EROFS if device is r/o and journal replay is needed 399562b ext4: preserve the needs_recovery flag when the journal is aborted 98f58e0 ext4: trim allocation requests to group size 77bd57e ext4: fix fencepost in s_first_meta_bg validation 45f1a95 jbd2: don't leak modified metadata buffers on an aborted journal 188b2eb ext4: validate s_first_meta_bg at mount time d61f4e2 ext4: add sanity checking to count_overhead() bd652ad ext4: fix in-superblock mount options processing 408d824 ext4: use more strict checks for inodes_per_block on mount de714a8 Btrfs: fix memory leak in reading btree blocks 0ee8821 Revert "Btrfs: don't delay inode ref updates during log, replay" Signed-off-by: Rk779 <Rahulkrishna585@gmail.com> Conflicts: arch/x86/mm/init.c
This commit is contained in:
parent
194365cbe6
commit
4c1dafc453
2
Makefile
2
Makefile
@ -1,6 +1,6 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 10
|
||||
SUBLEVEL = 106
|
||||
SUBLEVEL = 107
|
||||
EXTRAVERSION =
|
||||
NAME = TOSSUG Baby Fish
|
||||
|
||||
|
@ -228,8 +228,9 @@ int misaligned_fixup(unsigned long address, struct pt_regs *regs,
|
||||
if (state.fault)
|
||||
goto fault;
|
||||
|
||||
/* clear any remanants of delay slot */
|
||||
if (delay_mode(regs)) {
|
||||
regs->ret = regs->bta;
|
||||
regs->ret = regs->bta & ~1U;
|
||||
regs->status32 &= ~STATUS_DE_MASK;
|
||||
} else {
|
||||
regs->ret += state.instr_len;
|
||||
|
@ -59,6 +59,7 @@
|
||||
#size-cells = <1>;
|
||||
compatible = "m25p64";
|
||||
spi-max-frequency = <30000000>;
|
||||
m25p,fast-read;
|
||||
reg = <0>;
|
||||
partition@0 {
|
||||
label = "U-Boot-SPL";
|
||||
|
@ -59,6 +59,9 @@
|
||||
#define ARM_CPU_XSCALE_ARCH_V2 0x4000
|
||||
#define ARM_CPU_XSCALE_ARCH_V3 0x6000
|
||||
|
||||
/* Qualcomm implemented cores */
|
||||
#define ARM_CPU_PART_SCORPION 0x510002d0
|
||||
|
||||
extern unsigned int processor_id;
|
||||
|
||||
#ifdef CONFIG_CPU_CP15
|
||||
|
@ -1088,6 +1088,22 @@ static int __init arch_hw_breakpoint_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Scorpion CPUs (at least those in APQ8060) seem to set DBGPRSR.SPD
|
||||
* whenever a WFI is issued, even if the core is not powered down, in
|
||||
* violation of the architecture. When DBGPRSR.SPD is set, accesses to
|
||||
* breakpoint and watchpoint registers are treated as undefined, so
|
||||
* this results in boot time and runtime failures when these are
|
||||
* accessed and we unexpectedly take a trap.
|
||||
*
|
||||
* It's not clear if/how this can be worked around, so we blacklist
|
||||
* Scorpion CPUs to avoid these issues.
|
||||
*/
|
||||
if ((read_cpuid_id() & 0xff00fff0) == ARM_CPU_PART_SCORPION) {
|
||||
pr_info("Scorpion CPU detected. Hardware breakpoints and watchpoints disabled\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
has_ossr = core_has_os_save_restore();
|
||||
|
||||
/* Determine how many BRPs/WRPs are available. */
|
||||
|
@ -258,8 +258,7 @@ static int __init xen_guest_init(void)
|
||||
* for secondary CPUs as they are brought up.
|
||||
* For uniformity we use VCPUOP_register_vcpu_info even on cpu0.
|
||||
*/
|
||||
xen_vcpu_info = __alloc_percpu(sizeof(struct vcpu_info),
|
||||
sizeof(struct vcpu_info));
|
||||
xen_vcpu_info = alloc_percpu(struct vcpu_info);
|
||||
if (xen_vcpu_info == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -69,46 +69,6 @@ static int gpr_get(struct task_struct *target,
|
||||
0, sizeof(*regs));
|
||||
}
|
||||
|
||||
static int gpr_set(struct task_struct *target,
|
||||
const struct user_regset *regset,
|
||||
unsigned int pos, unsigned int count,
|
||||
const void *kbuf, const void __user *ubuf)
|
||||
{
|
||||
int ret;
|
||||
struct pt_regs *regs = task_pt_regs(target);
|
||||
|
||||
/* Don't copyin TSR or CSR */
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
|
||||
®s,
|
||||
0, PT_TSR * sizeof(long));
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
PT_TSR * sizeof(long),
|
||||
(PT_TSR + 1) * sizeof(long));
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
|
||||
®s,
|
||||
(PT_TSR + 1) * sizeof(long),
|
||||
PT_CSR * sizeof(long));
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
|
||||
PT_CSR * sizeof(long),
|
||||
(PT_CSR + 1) * sizeof(long));
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
|
||||
®s,
|
||||
(PT_CSR + 1) * sizeof(long), -1);
|
||||
return ret;
|
||||
}
|
||||
|
||||
enum c6x_regset {
|
||||
REGSET_GPR,
|
||||
};
|
||||
@ -120,7 +80,6 @@ static const struct user_regset c6x_regsets[] = {
|
||||
.size = sizeof(u32),
|
||||
.align = sizeof(u32),
|
||||
.get = gpr_get,
|
||||
.set = gpr_set
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -192,20 +192,21 @@ extern long __must_check strnlen_user(const char __user *src, long count);
|
||||
|
||||
#define strlen_user(str) strnlen_user(str, 32767)
|
||||
|
||||
extern unsigned long __must_check __copy_user_zeroing(void *to,
|
||||
const void __user *from,
|
||||
unsigned long n);
|
||||
extern unsigned long raw_copy_from_user(void *to, const void __user *from,
|
||||
unsigned long n);
|
||||
|
||||
static inline unsigned long
|
||||
copy_from_user(void *to, const void __user *from, unsigned long n)
|
||||
{
|
||||
unsigned long res = n;
|
||||
if (likely(access_ok(VERIFY_READ, from, n)))
|
||||
return __copy_user_zeroing(to, from, n);
|
||||
memset(to, 0, n);
|
||||
return n;
|
||||
res = raw_copy_from_user(to, from, n);
|
||||
if (unlikely(res))
|
||||
memset(to + (n - res), 0, res);
|
||||
return res;
|
||||
}
|
||||
|
||||
#define __copy_from_user(to, from, n) __copy_user_zeroing(to, from, n)
|
||||
#define __copy_from_user(to, from, n) raw_copy_from_user(to, from, n)
|
||||
#define __copy_from_user_inatomic __copy_from_user
|
||||
|
||||
extern unsigned long __must_check __copy_user(void __user *to,
|
||||
|
@ -24,6 +24,16 @@
|
||||
* user_regset definitions.
|
||||
*/
|
||||
|
||||
static unsigned long user_txstatus(const struct pt_regs *regs)
|
||||
{
|
||||
unsigned long data = (unsigned long)regs->ctx.Flags;
|
||||
|
||||
if (regs->ctx.SaveMask & TBICTX_CBUF_BIT)
|
||||
data |= USER_GP_REGS_STATUS_CATCH_BIT;
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
int metag_gp_regs_copyout(const struct pt_regs *regs,
|
||||
unsigned int pos, unsigned int count,
|
||||
void *kbuf, void __user *ubuf)
|
||||
@ -62,9 +72,7 @@ int metag_gp_regs_copyout(const struct pt_regs *regs,
|
||||
if (ret)
|
||||
goto out;
|
||||
/* TXSTATUS */
|
||||
data = (unsigned long)regs->ctx.Flags;
|
||||
if (regs->ctx.SaveMask & TBICTX_CBUF_BIT)
|
||||
data |= USER_GP_REGS_STATUS_CATCH_BIT;
|
||||
data = user_txstatus(regs);
|
||||
ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
|
||||
&data, 4*25, 4*26);
|
||||
if (ret)
|
||||
@ -119,6 +127,7 @@ int metag_gp_regs_copyin(struct pt_regs *regs,
|
||||
if (ret)
|
||||
goto out;
|
||||
/* TXSTATUS */
|
||||
data = user_txstatus(regs);
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
|
||||
&data, 4*25, 4*26);
|
||||
if (ret)
|
||||
@ -244,6 +253,8 @@ int metag_rp_state_copyin(struct pt_regs *regs,
|
||||
unsigned long long *ptr;
|
||||
int ret, i;
|
||||
|
||||
if (count < 4*13)
|
||||
return -EINVAL;
|
||||
/* Read the entire pipeline before making any changes */
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
|
||||
&rp, 0, 4*13);
|
||||
@ -303,7 +314,7 @@ static int metag_tls_set(struct task_struct *target,
|
||||
const void *kbuf, const void __user *ubuf)
|
||||
{
|
||||
int ret;
|
||||
void __user *tls;
|
||||
void __user *tls = target->thread.tls_ptr;
|
||||
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &tls, 0, -1);
|
||||
if (ret)
|
||||
|
@ -29,7 +29,6 @@
|
||||
COPY \
|
||||
"1:\n" \
|
||||
" .section .fixup,\"ax\"\n" \
|
||||
" MOV D1Ar1,#0\n" \
|
||||
FIXUP \
|
||||
" MOVT D1Ar1,#HI(1b)\n" \
|
||||
" JUMP D1Ar1,#LO(1b)\n" \
|
||||
@ -661,16 +660,14 @@ EXPORT_SYMBOL(__copy_user);
|
||||
__asm_copy_user_cont(to, from, ret, \
|
||||
" GETB D1Ar1,[%1++]\n" \
|
||||
"2: SETB [%0++],D1Ar1\n", \
|
||||
"3: ADD %2,%2,#1\n" \
|
||||
" SETB [%0++],D1Ar1\n", \
|
||||
"3: ADD %2,%2,#1\n", \
|
||||
" .long 2b,3b\n")
|
||||
|
||||
#define __asm_copy_from_user_2x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
|
||||
__asm_copy_user_cont(to, from, ret, \
|
||||
" GETW D1Ar1,[%1++]\n" \
|
||||
"2: SETW [%0++],D1Ar1\n" COPY, \
|
||||
"3: ADD %2,%2,#2\n" \
|
||||
" SETW [%0++],D1Ar1\n" FIXUP, \
|
||||
"3: ADD %2,%2,#2\n" FIXUP, \
|
||||
" .long 2b,3b\n" TENTRY)
|
||||
|
||||
#define __asm_copy_from_user_2(to, from, ret) \
|
||||
@ -680,145 +677,26 @@ EXPORT_SYMBOL(__copy_user);
|
||||
__asm_copy_from_user_2x_cont(to, from, ret, \
|
||||
" GETB D1Ar1,[%1++]\n" \
|
||||
"4: SETB [%0++],D1Ar1\n", \
|
||||
"5: ADD %2,%2,#1\n" \
|
||||
" SETB [%0++],D1Ar1\n", \
|
||||
"5: ADD %2,%2,#1\n", \
|
||||
" .long 4b,5b\n")
|
||||
|
||||
#define __asm_copy_from_user_4x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
|
||||
__asm_copy_user_cont(to, from, ret, \
|
||||
" GETD D1Ar1,[%1++]\n" \
|
||||
"2: SETD [%0++],D1Ar1\n" COPY, \
|
||||
"3: ADD %2,%2,#4\n" \
|
||||
" SETD [%0++],D1Ar1\n" FIXUP, \
|
||||
"3: ADD %2,%2,#4\n" FIXUP, \
|
||||
" .long 2b,3b\n" TENTRY)
|
||||
|
||||
#define __asm_copy_from_user_4(to, from, ret) \
|
||||
__asm_copy_from_user_4x_cont(to, from, ret, "", "", "")
|
||||
|
||||
#define __asm_copy_from_user_5(to, from, ret) \
|
||||
__asm_copy_from_user_4x_cont(to, from, ret, \
|
||||
" GETB D1Ar1,[%1++]\n" \
|
||||
"4: SETB [%0++],D1Ar1\n", \
|
||||
"5: ADD %2,%2,#1\n" \
|
||||
" SETB [%0++],D1Ar1\n", \
|
||||
" .long 4b,5b\n")
|
||||
|
||||
#define __asm_copy_from_user_6x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
|
||||
__asm_copy_from_user_4x_cont(to, from, ret, \
|
||||
" GETW D1Ar1,[%1++]\n" \
|
||||
"4: SETW [%0++],D1Ar1\n" COPY, \
|
||||
"5: ADD %2,%2,#2\n" \
|
||||
" SETW [%0++],D1Ar1\n" FIXUP, \
|
||||
" .long 4b,5b\n" TENTRY)
|
||||
|
||||
#define __asm_copy_from_user_6(to, from, ret) \
|
||||
__asm_copy_from_user_6x_cont(to, from, ret, "", "", "")
|
||||
|
||||
#define __asm_copy_from_user_7(to, from, ret) \
|
||||
__asm_copy_from_user_6x_cont(to, from, ret, \
|
||||
" GETB D1Ar1,[%1++]\n" \
|
||||
"6: SETB [%0++],D1Ar1\n", \
|
||||
"7: ADD %2,%2,#1\n" \
|
||||
" SETB [%0++],D1Ar1\n", \
|
||||
" .long 6b,7b\n")
|
||||
|
||||
#define __asm_copy_from_user_8x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
|
||||
__asm_copy_from_user_4x_cont(to, from, ret, \
|
||||
" GETD D1Ar1,[%1++]\n" \
|
||||
"4: SETD [%0++],D1Ar1\n" COPY, \
|
||||
"5: ADD %2,%2,#4\n" \
|
||||
" SETD [%0++],D1Ar1\n" FIXUP, \
|
||||
" .long 4b,5b\n" TENTRY)
|
||||
|
||||
#define __asm_copy_from_user_8(to, from, ret) \
|
||||
__asm_copy_from_user_8x_cont(to, from, ret, "", "", "")
|
||||
|
||||
#define __asm_copy_from_user_9(to, from, ret) \
|
||||
__asm_copy_from_user_8x_cont(to, from, ret, \
|
||||
" GETB D1Ar1,[%1++]\n" \
|
||||
"6: SETB [%0++],D1Ar1\n", \
|
||||
"7: ADD %2,%2,#1\n" \
|
||||
" SETB [%0++],D1Ar1\n", \
|
||||
" .long 6b,7b\n")
|
||||
|
||||
#define __asm_copy_from_user_10x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
|
||||
__asm_copy_from_user_8x_cont(to, from, ret, \
|
||||
" GETW D1Ar1,[%1++]\n" \
|
||||
"6: SETW [%0++],D1Ar1\n" COPY, \
|
||||
"7: ADD %2,%2,#2\n" \
|
||||
" SETW [%0++],D1Ar1\n" FIXUP, \
|
||||
" .long 6b,7b\n" TENTRY)
|
||||
|
||||
#define __asm_copy_from_user_10(to, from, ret) \
|
||||
__asm_copy_from_user_10x_cont(to, from, ret, "", "", "")
|
||||
|
||||
#define __asm_copy_from_user_11(to, from, ret) \
|
||||
__asm_copy_from_user_10x_cont(to, from, ret, \
|
||||
" GETB D1Ar1,[%1++]\n" \
|
||||
"8: SETB [%0++],D1Ar1\n", \
|
||||
"9: ADD %2,%2,#1\n" \
|
||||
" SETB [%0++],D1Ar1\n", \
|
||||
" .long 8b,9b\n")
|
||||
|
||||
#define __asm_copy_from_user_12x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
|
||||
__asm_copy_from_user_8x_cont(to, from, ret, \
|
||||
" GETD D1Ar1,[%1++]\n" \
|
||||
"6: SETD [%0++],D1Ar1\n" COPY, \
|
||||
"7: ADD %2,%2,#4\n" \
|
||||
" SETD [%0++],D1Ar1\n" FIXUP, \
|
||||
" .long 6b,7b\n" TENTRY)
|
||||
|
||||
#define __asm_copy_from_user_12(to, from, ret) \
|
||||
__asm_copy_from_user_12x_cont(to, from, ret, "", "", "")
|
||||
|
||||
#define __asm_copy_from_user_13(to, from, ret) \
|
||||
__asm_copy_from_user_12x_cont(to, from, ret, \
|
||||
" GETB D1Ar1,[%1++]\n" \
|
||||
"8: SETB [%0++],D1Ar1\n", \
|
||||
"9: ADD %2,%2,#1\n" \
|
||||
" SETB [%0++],D1Ar1\n", \
|
||||
" .long 8b,9b\n")
|
||||
|
||||
#define __asm_copy_from_user_14x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
|
||||
__asm_copy_from_user_12x_cont(to, from, ret, \
|
||||
" GETW D1Ar1,[%1++]\n" \
|
||||
"8: SETW [%0++],D1Ar1\n" COPY, \
|
||||
"9: ADD %2,%2,#2\n" \
|
||||
" SETW [%0++],D1Ar1\n" FIXUP, \
|
||||
" .long 8b,9b\n" TENTRY)
|
||||
|
||||
#define __asm_copy_from_user_14(to, from, ret) \
|
||||
__asm_copy_from_user_14x_cont(to, from, ret, "", "", "")
|
||||
|
||||
#define __asm_copy_from_user_15(to, from, ret) \
|
||||
__asm_copy_from_user_14x_cont(to, from, ret, \
|
||||
" GETB D1Ar1,[%1++]\n" \
|
||||
"10: SETB [%0++],D1Ar1\n", \
|
||||
"11: ADD %2,%2,#1\n" \
|
||||
" SETB [%0++],D1Ar1\n", \
|
||||
" .long 10b,11b\n")
|
||||
|
||||
#define __asm_copy_from_user_16x_cont(to, from, ret, COPY, FIXUP, TENTRY) \
|
||||
__asm_copy_from_user_12x_cont(to, from, ret, \
|
||||
" GETD D1Ar1,[%1++]\n" \
|
||||
"8: SETD [%0++],D1Ar1\n" COPY, \
|
||||
"9: ADD %2,%2,#4\n" \
|
||||
" SETD [%0++],D1Ar1\n" FIXUP, \
|
||||
" .long 8b,9b\n" TENTRY)
|
||||
|
||||
#define __asm_copy_from_user_16(to, from, ret) \
|
||||
__asm_copy_from_user_16x_cont(to, from, ret, "", "", "")
|
||||
|
||||
#define __asm_copy_from_user_8x64(to, from, ret) \
|
||||
asm volatile ( \
|
||||
" GETL D0Ar2,D1Ar1,[%1++]\n" \
|
||||
"2: SETL [%0++],D0Ar2,D1Ar1\n" \
|
||||
"1:\n" \
|
||||
" .section .fixup,\"ax\"\n" \
|
||||
" MOV D1Ar1,#0\n" \
|
||||
" MOV D0Ar2,#0\n" \
|
||||
"3: ADD %2,%2,#8\n" \
|
||||
" SETL [%0++],D0Ar2,D1Ar1\n" \
|
||||
" MOVT D0Ar2,#HI(1b)\n" \
|
||||
" JUMP D0Ar2,#LO(1b)\n" \
|
||||
" .previous\n" \
|
||||
@ -878,11 +756,12 @@ EXPORT_SYMBOL(__copy_user);
|
||||
"SUB %1, %1, D0Ar2\n")
|
||||
|
||||
|
||||
/* Copy from user to kernel, zeroing the bytes that were inaccessible in
|
||||
userland. The return-value is the number of bytes that were
|
||||
inaccessible. */
|
||||
unsigned long __copy_user_zeroing(void *pdst, const void __user *psrc,
|
||||
unsigned long n)
|
||||
/*
|
||||
* Copy from user to kernel. The return-value is the number of bytes that were
|
||||
* inaccessible.
|
||||
*/
|
||||
unsigned long raw_copy_from_user(void *pdst, const void __user *psrc,
|
||||
unsigned long n)
|
||||
{
|
||||
register char *dst asm ("A0.2") = pdst;
|
||||
register const char __user *src asm ("A1.2") = psrc;
|
||||
@ -895,7 +774,7 @@ unsigned long __copy_user_zeroing(void *pdst, const void __user *psrc,
|
||||
__asm_copy_from_user_1(dst, src, retn);
|
||||
n--;
|
||||
if (retn)
|
||||
goto copy_exception_bytes;
|
||||
return retn + n;
|
||||
}
|
||||
if ((unsigned long) dst & 1) {
|
||||
/* Worst case - byte copy */
|
||||
@ -903,14 +782,14 @@ unsigned long __copy_user_zeroing(void *pdst, const void __user *psrc,
|
||||
__asm_copy_from_user_1(dst, src, retn);
|
||||
n--;
|
||||
if (retn)
|
||||
goto copy_exception_bytes;
|
||||
return retn + n;
|
||||
}
|
||||
}
|
||||
if (((unsigned long) src & 2) && n >= 2) {
|
||||
__asm_copy_from_user_2(dst, src, retn);
|
||||
n -= 2;
|
||||
if (retn)
|
||||
goto copy_exception_bytes;
|
||||
return retn + n;
|
||||
}
|
||||
if ((unsigned long) dst & 2) {
|
||||
/* Second worst case - word copy */
|
||||
@ -918,7 +797,7 @@ unsigned long __copy_user_zeroing(void *pdst, const void __user *psrc,
|
||||
__asm_copy_from_user_2(dst, src, retn);
|
||||
n -= 2;
|
||||
if (retn)
|
||||
goto copy_exception_bytes;
|
||||
return retn + n;
|
||||
}
|
||||
}
|
||||
|
||||
@ -934,7 +813,7 @@ unsigned long __copy_user_zeroing(void *pdst, const void __user *psrc,
|
||||
__asm_copy_from_user_8x64(dst, src, retn);
|
||||
n -= 8;
|
||||
if (retn)
|
||||
goto copy_exception_bytes;
|
||||
return retn + n;
|
||||
}
|
||||
}
|
||||
|
||||
@ -950,7 +829,7 @@ unsigned long __copy_user_zeroing(void *pdst, const void __user *psrc,
|
||||
__asm_copy_from_user_8x64(dst, src, retn);
|
||||
n -= 8;
|
||||
if (retn)
|
||||
goto copy_exception_bytes;
|
||||
return retn + n;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -960,7 +839,7 @@ unsigned long __copy_user_zeroing(void *pdst, const void __user *psrc,
|
||||
n -= 4;
|
||||
|
||||
if (retn)
|
||||
goto copy_exception_bytes;
|
||||
return retn + n;
|
||||
}
|
||||
|
||||
/* If we get here, there were no memory read faults. */
|
||||
@ -986,21 +865,8 @@ unsigned long __copy_user_zeroing(void *pdst, const void __user *psrc,
|
||||
/* If we get here, retn correctly reflects the number of failing
|
||||
bytes. */
|
||||
return retn;
|
||||
|
||||
copy_exception_bytes:
|
||||
/* We already have "retn" bytes cleared, and need to clear the
|
||||
remaining "n" bytes. A non-optimized simple byte-for-byte in-line
|
||||
memset is preferred here, since this isn't speed-critical code and
|
||||
we'd rather have this a leaf-function than calling memset. */
|
||||
{
|
||||
char *endp;
|
||||
for (endp = dst + n; dst < endp; dst++)
|
||||
*dst = 0;
|
||||
}
|
||||
|
||||
return retn + n;
|
||||
}
|
||||
EXPORT_SYMBOL(__copy_user_zeroing);
|
||||
EXPORT_SYMBOL(raw_copy_from_user);
|
||||
|
||||
#define __asm_clear_8x64(to, ret) \
|
||||
asm volatile ( \
|
||||
|
@ -155,7 +155,9 @@ static inline __wsum csum_tcpudp_nofold(__be32 saddr,
|
||||
" daddu %0, %4 \n"
|
||||
" dsll32 $1, %0, 0 \n"
|
||||
" daddu %0, $1 \n"
|
||||
" sltu $1, %0, $1 \n"
|
||||
" dsra32 %0, %0, 0 \n"
|
||||
" addu %0, $1 \n"
|
||||
#endif
|
||||
" .set pop"
|
||||
: "=r" (sum)
|
||||
|
@ -15,12 +15,22 @@ static int crashing_cpu = -1;
|
||||
static cpumask_t cpus_in_crash = CPU_MASK_NONE;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
static void crash_shutdown_secondary(void *ignore)
|
||||
static void crash_shutdown_secondary(void *passed_regs)
|
||||
{
|
||||
struct pt_regs *regs;
|
||||
struct pt_regs *regs = passed_regs;
|
||||
int cpu = smp_processor_id();
|
||||
|
||||
regs = task_pt_regs(current);
|
||||
/*
|
||||
* If we are passed registers, use those. Otherwise get the
|
||||
* regs from the last interrupt, which should be correct, as
|
||||
* we are in an interrupt. But if the regs are not there,
|
||||
* pull them from the top of the stack. They are probably
|
||||
* wrong, but we need something to keep from crashing again.
|
||||
*/
|
||||
if (!regs)
|
||||
regs = get_irq_regs();
|
||||
if (!regs)
|
||||
regs = task_pt_regs(current);
|
||||
|
||||
if (!cpu_online(cpu))
|
||||
return;
|
||||
|
@ -6,7 +6,7 @@
|
||||
#endif
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <asm/types.h> /* for BITS_PER_LONG/SHIFT_PER_LONG */
|
||||
#include <asm/types.h>
|
||||
#include <asm/byteorder.h>
|
||||
#include <linux/atomic.h>
|
||||
|
||||
@ -16,6 +16,12 @@
|
||||
* to include/asm-i386/bitops.h or kerneldoc
|
||||
*/
|
||||
|
||||
#if __BITS_PER_LONG == 64
|
||||
#define SHIFT_PER_LONG 6
|
||||
#else
|
||||
#define SHIFT_PER_LONG 5
|
||||
#endif
|
||||
|
||||
#define CHOP_SHIFTCOUNT(x) (((unsigned long) (x)) & (BITS_PER_LONG - 1))
|
||||
|
||||
|
||||
|
@ -9,10 +9,8 @@
|
||||
*/
|
||||
#if (defined(__KERNEL__) && defined(CONFIG_64BIT)) || defined (__LP64__)
|
||||
#define __BITS_PER_LONG 64
|
||||
#define SHIFT_PER_LONG 6
|
||||
#else
|
||||
#define __BITS_PER_LONG 32
|
||||
#define SHIFT_PER_LONG 5
|
||||
#endif
|
||||
|
||||
#include <asm-generic/bitsperlong.h>
|
||||
|
@ -1,6 +1,7 @@
|
||||
#ifndef _PARISC_SWAB_H
|
||||
#define _PARISC_SWAB_H
|
||||
|
||||
#include <asm/bitsperlong.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/compiler.h>
|
||||
|
||||
@ -38,7 +39,7 @@ static inline __attribute_const__ __u32 __arch_swab32(__u32 x)
|
||||
}
|
||||
#define __arch_swab32 __arch_swab32
|
||||
|
||||
#if BITS_PER_LONG > 32
|
||||
#if __BITS_PER_LONG > 32
|
||||
/*
|
||||
** From "PA-RISC 2.0 Architecture", HP Professional Books.
|
||||
** See Appendix I page 8 , "Endian Byte Swapping".
|
||||
@ -61,6 +62,6 @@ static inline __attribute_const__ __u64 __arch_swab64(__u64 x)
|
||||
return x;
|
||||
}
|
||||
#define __arch_swab64 __arch_swab64
|
||||
#endif /* BITS_PER_LONG > 32 */
|
||||
#endif /* __BITS_PER_LONG > 32 */
|
||||
|
||||
#endif /* _PARISC_SWAB_H */
|
||||
|
@ -273,6 +273,14 @@ checkbin:
|
||||
echo 'disable kernel modules' ; \
|
||||
false ; \
|
||||
fi
|
||||
@if test "x${CONFIG_CPU_LITTLE_ENDIAN}" = "xy" \
|
||||
&& $(LD) --version | head -1 | grep ' 2\.24$$' >/dev/null ; then \
|
||||
echo -n '*** binutils 2.24 miscompiles weak symbols ' ; \
|
||||
echo 'in some circumstances.' ; \
|
||||
echo -n '*** Please use a different binutils version.' ; \
|
||||
false ; \
|
||||
fi
|
||||
|
||||
|
||||
CLEAN_FILES += $(TOUT)
|
||||
|
||||
|
@ -57,11 +57,6 @@ __system_reset_overlay:
|
||||
bctr
|
||||
|
||||
1:
|
||||
/* Save the value at addr zero for a null pointer write check later. */
|
||||
|
||||
li r4, 0
|
||||
lwz r3, 0(r4)
|
||||
|
||||
/* Primary delays then goes to _zimage_start in wrapper. */
|
||||
|
||||
or 31, 31, 31 /* db16cyc */
|
||||
|
@ -119,13 +119,12 @@ void ps3_copy_vectors(void)
|
||||
flush_cache((void *)0x100, 512);
|
||||
}
|
||||
|
||||
void platform_init(unsigned long null_check)
|
||||
void platform_init(void)
|
||||
{
|
||||
const u32 heapsize = 0x1000000 - (u32)_end; /* 16MiB */
|
||||
void *chosen;
|
||||
unsigned long ft_addr;
|
||||
u64 rm_size;
|
||||
unsigned long val;
|
||||
|
||||
console_ops.write = ps3_console_write;
|
||||
platform_ops.exit = ps3_exit;
|
||||
@ -153,11 +152,6 @@ void platform_init(unsigned long null_check)
|
||||
|
||||
printf(" flat tree at 0x%lx\n\r", ft_addr);
|
||||
|
||||
val = *(unsigned long *)0;
|
||||
|
||||
if (val != null_check)
|
||||
printf("null check failed: %lx != %lx\n\r", val, null_check);
|
||||
|
||||
((kernel_entry_t)0)(ft_addr, 0, NULL);
|
||||
|
||||
ps3_exit();
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include <asm/cputable.h>
|
||||
#include <asm/emulated_ops.h>
|
||||
#include <asm/switch_to.h>
|
||||
#include <asm/disassemble.h>
|
||||
|
||||
struct aligninfo {
|
||||
unsigned char len;
|
||||
@ -764,14 +765,25 @@ int fix_alignment(struct pt_regs *regs)
|
||||
nb = aligninfo[instr].len;
|
||||
flags = aligninfo[instr].flags;
|
||||
|
||||
/* ldbrx/stdbrx overlap lfs/stfs in the DSISR unfortunately */
|
||||
if (IS_XFORM(instruction) && ((instruction >> 1) & 0x3ff) == 532) {
|
||||
nb = 8;
|
||||
flags = LD+SW;
|
||||
} else if (IS_XFORM(instruction) &&
|
||||
((instruction >> 1) & 0x3ff) == 660) {
|
||||
nb = 8;
|
||||
flags = ST+SW;
|
||||
/*
|
||||
* Handle some cases which give overlaps in the DSISR values.
|
||||
*/
|
||||
if (IS_XFORM(instruction)) {
|
||||
switch (get_xop(instruction)) {
|
||||
case 532: /* ldbrx */
|
||||
nb = 8;
|
||||
flags = LD+SW;
|
||||
break;
|
||||
case 660: /* stdbrx */
|
||||
nb = 8;
|
||||
flags = ST+SW;
|
||||
break;
|
||||
case 20: /* lwarx */
|
||||
case 84: /* ldarx */
|
||||
case 116: /* lharx */
|
||||
case 276: /* lqarx */
|
||||
return 0; /* not emulated ever */
|
||||
}
|
||||
}
|
||||
|
||||
/* Byteswap little endian loads and stores */
|
||||
|
@ -228,8 +228,10 @@ int __kprobes hw_breakpoint_handler(struct die_args *args)
|
||||
rcu_read_lock();
|
||||
|
||||
bp = __get_cpu_var(bp_per_reg);
|
||||
if (!bp)
|
||||
if (!bp) {
|
||||
rc = NOTIFY_DONE;
|
||||
goto out;
|
||||
}
|
||||
info = counter_arch_bp(bp);
|
||||
|
||||
/*
|
||||
|
@ -511,7 +511,6 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu)
|
||||
advance = 0;
|
||||
printk(KERN_ERR "Couldn't emulate instruction 0x%08x "
|
||||
"(op %d xop %d)\n", inst, get_op(inst), get_xop(inst));
|
||||
kvmppc_core_queue_program(vcpu, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -43,14 +43,17 @@ extern void execve_tail(void);
|
||||
#ifndef CONFIG_64BIT
|
||||
|
||||
#define TASK_SIZE (1UL << 31)
|
||||
#define TASK_MAX_SIZE (1UL << 31)
|
||||
#define TASK_UNMAPPED_BASE (1UL << 30)
|
||||
|
||||
#else /* CONFIG_64BIT */
|
||||
|
||||
#define TASK_SIZE_OF(tsk) ((tsk)->mm->context.asce_limit)
|
||||
#define TASK_SIZE_OF(tsk) ((tsk)->mm ? \
|
||||
(tsk)->mm->context.asce_limit : TASK_MAX_SIZE)
|
||||
#define TASK_UNMAPPED_BASE (test_thread_flag(TIF_31BIT) ? \
|
||||
(1UL << 30) : (1UL << 41))
|
||||
#define TASK_SIZE TASK_SIZE_OF(current)
|
||||
#define TASK_MAX_SIZE (1UL << 53)
|
||||
|
||||
#endif /* CONFIG_64BIT */
|
||||
|
||||
|
@ -335,7 +335,7 @@ int gmap_map_segment(struct gmap *gmap, unsigned long from,
|
||||
|
||||
if ((from | to | len) & (PMD_SIZE - 1))
|
||||
return -EINVAL;
|
||||
if (len == 0 || from + len > PGDIR_SIZE ||
|
||||
if (len == 0 || from + len > TASK_MAX_SIZE ||
|
||||
from + len < from || to + len < to)
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -416,7 +416,7 @@ int zpci_dma_init_device(struct zpci_dev *zdev)
|
||||
zdev->dma_table = dma_alloc_cpu_table();
|
||||
if (!zdev->dma_table) {
|
||||
rc = -ENOMEM;
|
||||
goto out_clean;
|
||||
goto out;
|
||||
}
|
||||
|
||||
zdev->iommu_size = (unsigned long) high_memory - PAGE_OFFSET;
|
||||
@ -429,7 +429,7 @@ int zpci_dma_init_device(struct zpci_dev *zdev)
|
||||
bitmap_order);
|
||||
if (!zdev->iommu_bitmap) {
|
||||
rc = -ENOMEM;
|
||||
goto out_reg;
|
||||
goto free_dma_table;
|
||||
}
|
||||
|
||||
rc = zpci_register_ioat(zdev,
|
||||
@ -438,12 +438,16 @@ int zpci_dma_init_device(struct zpci_dev *zdev)
|
||||
zdev->start_dma + zdev->iommu_size - 1,
|
||||
(u64) zdev->dma_table);
|
||||
if (rc)
|
||||
goto out_reg;
|
||||
return 0;
|
||||
goto free_bitmap;
|
||||
|
||||
out_reg:
|
||||
return 0;
|
||||
free_bitmap:
|
||||
vfree(zdev->iommu_bitmap);
|
||||
zdev->iommu_bitmap = NULL;
|
||||
free_dma_table:
|
||||
dma_free_cpu_table(zdev->dma_table);
|
||||
out_clean:
|
||||
zdev->dma_table = NULL;
|
||||
out:
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -308,7 +308,7 @@ static int genregs64_set(struct task_struct *target,
|
||||
}
|
||||
|
||||
if (!ret) {
|
||||
unsigned long y;
|
||||
unsigned long y = regs->y;
|
||||
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
|
||||
&y,
|
||||
|
@ -110,7 +110,7 @@ static int tile_gpr_set(struct task_struct *target,
|
||||
const void *kbuf, const void __user *ubuf)
|
||||
{
|
||||
int ret;
|
||||
struct pt_regs regs;
|
||||
struct pt_regs regs = *task_pt_regs(target);
|
||||
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, ®s, 0,
|
||||
sizeof(regs));
|
||||
|
@ -218,6 +218,29 @@ static int ghash_async_final(struct ahash_request *req)
|
||||
}
|
||||
}
|
||||
|
||||
static int ghash_async_import(struct ahash_request *req, const void *in)
|
||||
{
|
||||
struct ahash_request *cryptd_req = ahash_request_ctx(req);
|
||||
struct shash_desc *desc = cryptd_shash_desc(cryptd_req);
|
||||
struct ghash_desc_ctx *dctx = shash_desc_ctx(desc);
|
||||
|
||||
ghash_async_init(req);
|
||||
memcpy(dctx, in, sizeof(*dctx));
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
static int ghash_async_export(struct ahash_request *req, void *out)
|
||||
{
|
||||
struct ahash_request *cryptd_req = ahash_request_ctx(req);
|
||||
struct shash_desc *desc = cryptd_shash_desc(cryptd_req);
|
||||
struct ghash_desc_ctx *dctx = shash_desc_ctx(desc);
|
||||
|
||||
memcpy(out, dctx, sizeof(*dctx));
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
static int ghash_async_digest(struct ahash_request *req)
|
||||
{
|
||||
struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
|
||||
@ -285,8 +308,11 @@ static struct ahash_alg ghash_async_alg = {
|
||||
.final = ghash_async_final,
|
||||
.setkey = ghash_async_setkey,
|
||||
.digest = ghash_async_digest,
|
||||
.export = ghash_async_export,
|
||||
.import = ghash_async_import,
|
||||
.halg = {
|
||||
.digestsize = GHASH_DIGEST_SIZE,
|
||||
.statesize = sizeof(struct ghash_desc_ctx),
|
||||
.base = {
|
||||
.cra_name = "ghash",
|
||||
.cra_driver_name = "ghash-clmulni",
|
||||
|
@ -272,7 +272,7 @@ struct task_struct;
|
||||
|
||||
#define ARCH_DLINFO_IA32(vdso_enabled) \
|
||||
do { \
|
||||
if (vdso_enabled) { \
|
||||
if (VDSO_CURRENT_BASE) { \
|
||||
NEW_AUX_ENT(AT_SYSINFO, VDSO_ENTRY); \
|
||||
NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_CURRENT_BASE); \
|
||||
} \
|
||||
|
@ -51,7 +51,7 @@ static const char * const th_names[] = {
|
||||
"load_store",
|
||||
"insn_fetch",
|
||||
"combined_unit",
|
||||
"",
|
||||
"decode_unit",
|
||||
"northbridge",
|
||||
"execution_unit",
|
||||
};
|
||||
|
@ -122,7 +122,8 @@ GLOBAL(ftrace_graph_call)
|
||||
jmp ftrace_stub
|
||||
#endif
|
||||
|
||||
GLOBAL(ftrace_stub)
|
||||
/* This is weak to keep gas from relaxing the jumps */
|
||||
WEAK(ftrace_stub)
|
||||
retq
|
||||
END(ftrace_caller)
|
||||
|
||||
|
@ -744,6 +744,18 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr,
|
||||
unsigned long return_hooker = (unsigned long)
|
||||
&return_to_handler;
|
||||
|
||||
/*
|
||||
* When resuming from suspend-to-ram, this function can be indirectly
|
||||
* called from early CPU startup code while the CPU is in real mode,
|
||||
* which would fail miserably. Make sure the stack pointer is a
|
||||
* virtual address.
|
||||
*
|
||||
* This check isn't as accurate as virt_addr_valid(), but it should be
|
||||
* good enough for this purpose, and it's fast.
|
||||
*/
|
||||
if (unlikely((long)__builtin_frame_address(0) >= 0))
|
||||
return;
|
||||
|
||||
if (unlikely(atomic_read(¤t->tracing_graph_pause)))
|
||||
return;
|
||||
|
||||
|
@ -1047,10 +1047,10 @@ static inline bool nested_cpu_has_virtual_nmis(struct vmcs12 *vmcs12,
|
||||
return vmcs12->pin_based_vm_exec_control & PIN_BASED_VIRTUAL_NMIS;
|
||||
}
|
||||
|
||||
static inline bool is_exception(u32 intr_info)
|
||||
static inline bool is_nmi(u32 intr_info)
|
||||
{
|
||||
return (intr_info & (INTR_INFO_INTR_TYPE_MASK | INTR_INFO_VALID_MASK))
|
||||
== (INTR_TYPE_HARD_EXCEPTION | INTR_INFO_VALID_MASK);
|
||||
== (INTR_TYPE_NMI_INTR | INTR_INFO_VALID_MASK);
|
||||
}
|
||||
|
||||
static void nested_vmx_vmexit(struct kvm_vcpu *vcpu);
|
||||
@ -3074,7 +3074,7 @@ static void fix_rmode_seg(int seg, struct kvm_segment *save)
|
||||
}
|
||||
|
||||
vmcs_write16(sf->selector, var.selector);
|
||||
vmcs_write32(sf->base, var.base);
|
||||
vmcs_writel(sf->base, var.base);
|
||||
vmcs_write32(sf->limit, var.limit);
|
||||
vmcs_write32(sf->ar_bytes, vmx_segment_access_rights(&var));
|
||||
}
|
||||
@ -4716,7 +4716,7 @@ static int handle_exception(struct kvm_vcpu *vcpu)
|
||||
if (is_machine_check(intr_info))
|
||||
return handle_machine_check(vcpu);
|
||||
|
||||
if ((intr_info & INTR_INFO_INTR_TYPE_MASK) == INTR_TYPE_NMI_INTR)
|
||||
if (is_nmi(intr_info))
|
||||
return 1; /* already handled by vmx_vcpu_run() */
|
||||
|
||||
if (is_no_device(intr_info)) {
|
||||
@ -6507,7 +6507,7 @@ static bool nested_vmx_exit_handled(struct kvm_vcpu *vcpu)
|
||||
|
||||
switch (exit_reason) {
|
||||
case EXIT_REASON_EXCEPTION_NMI:
|
||||
if (!is_exception(intr_info))
|
||||
if (is_nmi(intr_info))
|
||||
return 0;
|
||||
else if (is_page_fault(intr_info))
|
||||
return enable_ept;
|
||||
@ -6803,8 +6803,7 @@ static void vmx_complete_atomic_exit(struct vcpu_vmx *vmx)
|
||||
kvm_machine_check();
|
||||
|
||||
/* We need to handle NMIs before interrupts are enabled */
|
||||
if ((exit_intr_info & INTR_INFO_INTR_TYPE_MASK) == INTR_TYPE_NMI_INTR &&
|
||||
(exit_intr_info & INTR_INFO_VALID_MASK)) {
|
||||
if (is_nmi(exit_intr_info)) {
|
||||
kvm_before_handle_nmi(&vmx->vcpu);
|
||||
asm("int $2");
|
||||
kvm_after_handle_nmi(&vmx->vcpu);
|
||||
|
@ -475,7 +475,6 @@ void __init init_mem_mapping(void)
|
||||
* devmem_is_allowed() checks to see if /dev/mem access to a certain address
|
||||
* is valid. The argument is a physical page number.
|
||||
*
|
||||
*
|
||||
* On x86, access has to be given to the first megabyte of RAM because that
|
||||
* area traditionally contains BIOS code and data regions used by X, dosemu,
|
||||
* and similar apps. Since they map the entire memory range, the whole range
|
||||
|
@ -67,10 +67,9 @@ static int mmap_is_legacy(void)
|
||||
|
||||
static unsigned long mmap_rnd(void)
|
||||
{
|
||||
unsigned long rnd = 0;
|
||||
unsigned long rnd;
|
||||
|
||||
if (current->flags & PF_RANDOMIZE) {
|
||||
if (mmap_is_ia32())
|
||||
if (mmap_is_ia32())
|
||||
#ifdef CONFIG_COMPAT
|
||||
rnd = get_random_long() & ((1UL << mmap_rnd_compat_bits) - 1);
|
||||
#else
|
||||
@ -78,11 +77,11 @@ static unsigned long mmap_rnd(void)
|
||||
#endif
|
||||
else
|
||||
rnd = get_random_long() & ((1UL << mmap_rnd_bits) - 1);
|
||||
}
|
||||
|
||||
return rnd << PAGE_SHIFT;
|
||||
}
|
||||
|
||||
static unsigned long mmap_base(void)
|
||||
static unsigned long mmap_base(unsigned long rnd)
|
||||
{
|
||||
unsigned long gap = rlimit(RLIMIT_STACK);
|
||||
|
||||
@ -91,19 +90,7 @@ static unsigned long mmap_base(void)
|
||||
else if (gap > MAX_GAP)
|
||||
gap = MAX_GAP;
|
||||
|
||||
return PAGE_ALIGN(TASK_SIZE - gap - mmap_rnd());
|
||||
}
|
||||
|
||||
/*
|
||||
* Bottom-up (legacy) layout on X86_32 did not support randomization, X86_64
|
||||
* does, but not when emulating X86_32
|
||||
*/
|
||||
static unsigned long mmap_legacy_base(void)
|
||||
{
|
||||
if (mmap_is_ia32())
|
||||
return TASK_UNMAPPED_BASE;
|
||||
else
|
||||
return TASK_UNMAPPED_BASE + mmap_rnd();
|
||||
return PAGE_ALIGN(TASK_SIZE - gap - rnd);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -112,13 +99,18 @@ static unsigned long mmap_legacy_base(void)
|
||||
*/
|
||||
void arch_pick_mmap_layout(struct mm_struct *mm)
|
||||
{
|
||||
mm->mmap_legacy_base = mmap_legacy_base();
|
||||
mm->mmap_base = mmap_base();
|
||||
unsigned long random_factor = 0UL;
|
||||
|
||||
if (current->flags & PF_RANDOMIZE)
|
||||
random_factor = mmap_rnd();
|
||||
|
||||
mm->mmap_legacy_base = TASK_UNMAPPED_BASE + random_factor;
|
||||
|
||||
if (mmap_is_legacy()) {
|
||||
mm->mmap_base = mm->mmap_legacy_base;
|
||||
mm->get_unmapped_area = arch_get_unmapped_area;
|
||||
} else {
|
||||
mm->mmap_base = mmap_base(random_factor);
|
||||
mm->get_unmapped_area = arch_get_unmapped_area_topdown;
|
||||
}
|
||||
}
|
||||
|
@ -118,6 +118,16 @@ static const struct dmi_system_id pci_crs_quirks[] __initconst = {
|
||||
DMI_MATCH(DMI_BIOS_VERSION, "6JET85WW (1.43 )"),
|
||||
},
|
||||
},
|
||||
/* https://bugzilla.kernel.org/show_bug.cgi?id=42606 */
|
||||
{
|
||||
.callback = set_nouse_crs,
|
||||
.ident = "Supermicro X8DTH",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Supermicro"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "X8DTH-i/6/iF/6F"),
|
||||
DMI_MATCH(DMI_BIOS_VERSION, "2.0a"),
|
||||
},
|
||||
},
|
||||
|
||||
/* https://bugzilla.kernel.org/show_bug.cgi?id=15362 */
|
||||
{
|
||||
|
@ -338,11 +338,11 @@ static int xen_vcpuop_set_next_event(unsigned long delta,
|
||||
WARN_ON(evt->mode != CLOCK_EVT_MODE_ONESHOT);
|
||||
|
||||
single.timeout_abs_ns = get_abs_timeout(delta);
|
||||
single.flags = VCPU_SSHOTTMR_future;
|
||||
/* Get an event anyway, even if the timeout is already expired */
|
||||
single.flags = 0;
|
||||
|
||||
ret = HYPERVISOR_vcpu_op(VCPUOP_set_singleshot_timer, cpu, &single);
|
||||
|
||||
BUG_ON(ret != 0 && ret != -ETIME);
|
||||
BUG_ON(ret != 0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -160,6 +160,8 @@ static int __init parse_tag_initrd(const bp_tag_t* tag)
|
||||
|
||||
__tagtable(BP_TAG_INITRD, parse_tag_initrd);
|
||||
|
||||
#endif /* CONFIG_BLK_DEV_INITRD */
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
|
||||
static int __init parse_tag_fdt(const bp_tag_t *tag)
|
||||
@ -179,8 +181,6 @@ void __init early_init_dt_setup_initrd_arch(u64 start, u64 end)
|
||||
|
||||
#endif /* CONFIG_OF */
|
||||
|
||||
#endif /* CONFIG_BLK_DEV_INITRD */
|
||||
|
||||
static int __init parse_tag_cmdline(const bp_tag_t* tag)
|
||||
{
|
||||
strlcpy(command_line, (char *)(tag->data), COMMAND_LINE_SIZE);
|
||||
|
@ -662,7 +662,6 @@ void del_gendisk(struct gendisk *disk)
|
||||
|
||||
kobject_put(disk->part0.holder_dir);
|
||||
kobject_put(disk->slave_dir);
|
||||
disk->driverfs_dev = NULL;
|
||||
if (!sysfs_deprecated)
|
||||
sysfs_remove_link(block_depr, dev_name(disk_to_dev(disk)));
|
||||
pm_runtime_set_memalloc_noio(disk_to_dev(disk), false);
|
||||
|
@ -175,6 +175,9 @@ static void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter)
|
||||
__set_bit(WRITE_16, filter->write_ok);
|
||||
__set_bit(WRITE_LONG, filter->write_ok);
|
||||
__set_bit(WRITE_LONG_2, filter->write_ok);
|
||||
__set_bit(WRITE_SAME, filter->write_ok);
|
||||
__set_bit(WRITE_SAME_16, filter->write_ok);
|
||||
__set_bit(WRITE_SAME_32, filter->write_ok);
|
||||
__set_bit(ERASE, filter->write_ok);
|
||||
__set_bit(GPCMD_MODE_SELECT_10, filter->write_ok);
|
||||
__set_bit(MODE_SELECT, filter->write_ok);
|
||||
|
@ -52,6 +52,7 @@ obj-$(CONFIG_CRYPTO_SHA1) += sha1_generic.o
|
||||
obj-$(CONFIG_CRYPTO_SHA256) += sha256_generic.o
|
||||
obj-$(CONFIG_CRYPTO_SHA512) += sha512_generic.o
|
||||
obj-$(CONFIG_CRYPTO_WP512) += wp512.o
|
||||
CFLAGS_wp512.o := $(call cc-option,-fno-schedule-insns) # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79149
|
||||
obj-$(CONFIG_CRYPTO_TGR192) += tgr192.o
|
||||
obj-$(CONFIG_CRYPTO_GF128MUL) += gf128mul.o
|
||||
obj-$(CONFIG_CRYPTO_ECB) += ecb.o
|
||||
@ -72,6 +73,7 @@ obj-$(CONFIG_CRYPTO_BLOWFISH_COMMON) += blowfish_common.o
|
||||
obj-$(CONFIG_CRYPTO_TWOFISH) += twofish_generic.o
|
||||
obj-$(CONFIG_CRYPTO_TWOFISH_COMMON) += twofish_common.o
|
||||
obj-$(CONFIG_CRYPTO_SERPENT) += serpent_generic.o
|
||||
CFLAGS_serpent_generic.o := $(call cc-option,-fsched-pressure) # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79149
|
||||
obj-$(CONFIG_CRYPTO_AES) += aes_generic.o
|
||||
obj-$(CONFIG_CRYPTO_CAMELLIA) += camellia_generic.o
|
||||
obj-$(CONFIG_CRYPTO_CAST_COMMON) += cast_common.o
|
||||
|
@ -337,6 +337,7 @@ int crypto_register_alg(struct crypto_alg *alg)
|
||||
struct crypto_larval *larval;
|
||||
int err;
|
||||
|
||||
alg->cra_flags &= ~CRYPTO_ALG_DEAD;
|
||||
err = crypto_check_alg(alg);
|
||||
if (err)
|
||||
return err;
|
||||
|
@ -195,7 +195,7 @@ static int hash_accept(struct socket *sock, struct socket *newsock, int flags)
|
||||
struct alg_sock *ask = alg_sk(sk);
|
||||
struct hash_ctx *ctx = ask->private;
|
||||
struct ahash_request *req = &ctx->req;
|
||||
char state[crypto_ahash_statesize(crypto_ahash_reqtfm(req))];
|
||||
char state[crypto_ahash_statesize(crypto_ahash_reqtfm(req)) ? : 1];
|
||||
struct sock *sk2;
|
||||
struct alg_sock *ask2;
|
||||
struct hash_ctx *ctx2;
|
||||
|
@ -606,6 +606,7 @@ static int cryptd_create_hash(struct crypto_template *tmpl, struct rtattr **tb,
|
||||
inst->alg.halg.base.cra_flags = CRYPTO_ALG_ASYNC;
|
||||
|
||||
inst->alg.halg.digestsize = salg->digestsize;
|
||||
inst->alg.halg.statesize = salg->statesize;
|
||||
inst->alg.halg.base.cra_ctxsize = sizeof(struct cryptd_hash_ctx);
|
||||
|
||||
inst->alg.halg.base.cra_init = cryptd_hash_init_tfm;
|
||||
|
@ -2,7 +2,6 @@
|
||||
# Makefile for the Linux ACPI interpreter
|
||||
#
|
||||
|
||||
ccflags-y := -Os
|
||||
ccflags-$(CONFIG_ACPI_DEBUG) += -DACPI_DEBUG_OUTPUT
|
||||
|
||||
#
|
||||
|
@ -211,6 +211,7 @@ static int acpi_power_get_list_state(struct list_head *list, int *state)
|
||||
return -EINVAL;
|
||||
|
||||
/* The state of the list is 'on' IFF all resources are 'on'. */
|
||||
cur_state = 0;
|
||||
list_for_each_entry(entry, list, node) {
|
||||
struct acpi_power_resource *resource = entry->resource;
|
||||
acpi_handle handle = resource->device.handle;
|
||||
|
@ -1263,6 +1263,9 @@ static int acpi_video_device_enumerate(struct acpi_video_bus *video)
|
||||
union acpi_object *dod = NULL;
|
||||
union acpi_object *obj;
|
||||
|
||||
if (!video->cap._DOD)
|
||||
return AE_NOT_EXIST;
|
||||
|
||||
status = acpi_evaluate_object(video->device->handle, "_DOD", NULL, &buffer);
|
||||
if (!ACPI_SUCCESS(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status, "Evaluating _DOD"));
|
||||
|
@ -4097,6 +4097,9 @@ static int mv_platform_probe(struct platform_device *pdev)
|
||||
host->iomap = NULL;
|
||||
hpriv->base = devm_ioremap(&pdev->dev, res->start,
|
||||
resource_size(res));
|
||||
if (!hpriv->base)
|
||||
return -ENOMEM;
|
||||
|
||||
hpriv->base -= SATAHC0_REG_BASE;
|
||||
|
||||
#if defined(CONFIG_HAVE_CLK)
|
||||
|
@ -432,8 +432,11 @@ static int bcma_device_probe(struct device *dev)
|
||||
drv);
|
||||
int err = 0;
|
||||
|
||||
get_device(dev);
|
||||
if (adrv->probe)
|
||||
err = adrv->probe(core);
|
||||
if (err)
|
||||
put_device(dev);
|
||||
|
||||
return err;
|
||||
}
|
||||
@ -446,6 +449,7 @@ static int bcma_device_remove(struct device *dev)
|
||||
|
||||
if (adrv->remove)
|
||||
adrv->remove(core);
|
||||
put_device(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1129,6 +1129,8 @@ static int put_chars(u32 vtermno, const char *buf, int count)
|
||||
{
|
||||
struct port *port;
|
||||
struct scatterlist sg[1];
|
||||
void *data;
|
||||
int ret;
|
||||
|
||||
if (unlikely(early_put_chars))
|
||||
return early_put_chars(vtermno, buf, count);
|
||||
@ -1137,8 +1139,14 @@ static int put_chars(u32 vtermno, const char *buf, int count)
|
||||
if (!port)
|
||||
return -EPIPE;
|
||||
|
||||
sg_init_one(sg, buf, count);
|
||||
return __send_to_port(port, sg, 1, count, (void *)buf, false);
|
||||
data = kmemdup(buf, count, GFP_ATOMIC);
|
||||
if (!data)
|
||||
return -ENOMEM;
|
||||
|
||||
sg_init_one(sg, data, count);
|
||||
ret = __send_to_port(port, sg, 1, count, data, false);
|
||||
kfree(data);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -470,9 +470,11 @@ static ssize_t show_cpuinfo_cur_freq(struct cpufreq_policy *policy,
|
||||
char *buf)
|
||||
{
|
||||
unsigned int cur_freq = __cpufreq_get(policy->cpu);
|
||||
if (!cur_freq)
|
||||
return sprintf(buf, "<unknown>");
|
||||
return sprintf(buf, "%u\n", cur_freq);
|
||||
|
||||
if (cur_freq)
|
||||
return sprintf(buf, "%u\n", cur_freq);
|
||||
|
||||
return sprintf(buf, "<unknown>\n");
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -120,7 +120,8 @@ static int ast_get_dram_info(struct drm_device *dev)
|
||||
ast_write32(ast, 0x10000, 0xfc600309);
|
||||
|
||||
do {
|
||||
;
|
||||
if (pci_channel_offline(dev->pdev))
|
||||
return -EIO;
|
||||
} while (ast_read32(ast, 0x10000) != 0x01);
|
||||
data = ast_read32(ast, 0x10004);
|
||||
|
||||
@ -343,7 +344,9 @@ int ast_driver_load(struct drm_device *dev, unsigned long flags)
|
||||
ast_detect_chip(dev);
|
||||
|
||||
if (ast->chip != AST1180) {
|
||||
ast_get_dram_info(dev);
|
||||
ret = ast_get_dram_info(dev);
|
||||
if (ret)
|
||||
goto out_free;
|
||||
ast->vram_size = ast_get_vram_info(dev);
|
||||
DRM_INFO("dram %d %d %d %08x\n", ast->mclk, ast->dram_type, ast->dram_bus_width, ast->vram_size);
|
||||
}
|
||||
|
@ -53,13 +53,9 @@ ast_is_vga_enabled(struct drm_device *dev)
|
||||
/* TODO 1180 */
|
||||
} else {
|
||||
ch = ast_io_read8(ast, 0x43);
|
||||
if (ch) {
|
||||
ast_open_key(ast);
|
||||
ch = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb6, 0xff);
|
||||
return ch & 0x04;
|
||||
}
|
||||
return !!(ch & 0x01);
|
||||
}
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -224,6 +224,7 @@ nouveau_hw_get_clock(struct drm_device *dev, enum nvbios_pll_type plltype)
|
||||
uint32_t mpllP;
|
||||
|
||||
pci_read_config_dword(pci_get_bus_and_slot(0, 3), 0x6c, &mpllP);
|
||||
mpllP = (mpllP >> 8) & 0xf;
|
||||
if (!mpllP)
|
||||
mpllP = 4;
|
||||
|
||||
@ -234,7 +235,7 @@ nouveau_hw_get_clock(struct drm_device *dev, enum nvbios_pll_type plltype)
|
||||
uint32_t clock;
|
||||
|
||||
pci_read_config_dword(pci_get_bus_and_slot(0, 5), 0x4c, &clock);
|
||||
return clock;
|
||||
return clock / 1000;
|
||||
}
|
||||
|
||||
ret = nouveau_hw_get_pllvals(dev, plltype, &pllvals);
|
||||
|
@ -1866,7 +1866,6 @@ static int ttm_bo_swapout(struct ttm_mem_shrink *shrink)
|
||||
struct ttm_buffer_object *bo;
|
||||
int ret = -EBUSY;
|
||||
int put_count;
|
||||
uint32_t swap_placement = (TTM_PL_FLAG_CACHED | TTM_PL_FLAG_SYSTEM);
|
||||
|
||||
spin_lock(&glob->lru_lock);
|
||||
list_for_each_entry(bo, &glob->swap_lru, swap) {
|
||||
@ -1904,7 +1903,8 @@ static int ttm_bo_swapout(struct ttm_mem_shrink *shrink)
|
||||
if (unlikely(ret != 0))
|
||||
goto out;
|
||||
|
||||
if ((bo->mem.placement & swap_placement) != swap_placement) {
|
||||
if (bo->mem.mem_type != TTM_PL_SYSTEM ||
|
||||
bo->ttm->caching_state != tt_cached) {
|
||||
struct ttm_mem_reg evict_mem;
|
||||
|
||||
evict_mem = bo->mem;
|
||||
|
@ -69,8 +69,6 @@ int vmw_getparam_ioctl(struct drm_device *dev, void *data,
|
||||
break;
|
||||
}
|
||||
default:
|
||||
DRM_ERROR("Illegal vmwgfx get param request: %d\n",
|
||||
param->param);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -90,7 +88,7 @@ int vmw_get_cap_3d_ioctl(struct drm_device *dev, void *data,
|
||||
void *bounce;
|
||||
int ret;
|
||||
|
||||
if (unlikely(arg->pad64 != 0)) {
|
||||
if (unlikely(arg->pad64 != 0 || arg->max_size == 0)) {
|
||||
DRM_ERROR("Illegal GET_3D_CAP argument.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -677,11 +677,14 @@ int vmw_surface_define_ioctl(struct drm_device *dev, void *data,
|
||||
128;
|
||||
|
||||
num_sizes = 0;
|
||||
for (i = 0; i < DRM_VMW_MAX_SURFACE_FACES; ++i)
|
||||
for (i = 0; i < DRM_VMW_MAX_SURFACE_FACES; ++i) {
|
||||
if (req->mip_levels[i] > DRM_VMW_MAX_MIP_LEVELS)
|
||||
return -EINVAL;
|
||||
num_sizes += req->mip_levels[i];
|
||||
}
|
||||
|
||||
if (num_sizes > DRM_VMW_MAX_SURFACE_FACES *
|
||||
DRM_VMW_MAX_MIP_LEVELS)
|
||||
if (num_sizes > DRM_VMW_MAX_SURFACE_FACES * DRM_VMW_MAX_MIP_LEVELS ||
|
||||
num_sizes == 0)
|
||||
return -EINVAL;
|
||||
|
||||
size = vmw_user_surface_size + 128 +
|
||||
|
@ -39,6 +39,9 @@ static __u8 *cp_report_fixup(struct hid_device *hdev, __u8 *rdesc,
|
||||
if (!(quirks & CP_RDESC_SWAPPED_MIN_MAX))
|
||||
return rdesc;
|
||||
|
||||
if (*rsize < 4)
|
||||
return rdesc;
|
||||
|
||||
for (i = 0; i < *rsize - 4; i++)
|
||||
if (rdesc[i] == 0x29 && rdesc[i + 2] == 0x19) {
|
||||
__u8 tmp;
|
||||
|
@ -790,7 +790,7 @@ static const struct hid_device_id lg_devices[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WINGMAN_FFG),
|
||||
.driver_data = LG_FF },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2),
|
||||
.driver_data = LG_FF2 },
|
||||
.driver_data = LG_NOGET | LG_FF2 },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_FLIGHT_SYSTEM_G940),
|
||||
.driver_data = LG_FF3 },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACENAVIGATOR),
|
||||
|
@ -326,6 +326,15 @@ static int i2c_hid_hwreset(struct i2c_client *client)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* The HID over I2C specification states that if a DEVICE needs time
|
||||
* after the PWR_ON request, it should utilise CLOCK stretching.
|
||||
* However, it has been observered that the Windows driver provides a
|
||||
* 1ms sleep between the PWR_ON and RESET requests and that some devices
|
||||
* rely on this.
|
||||
*/
|
||||
usleep_range(1000, 5000);
|
||||
|
||||
i2c_hid_dbg(ihid, "resetting...\n");
|
||||
|
||||
ret = i2c_hid_command(client, &hid_reset_cmd, NULL, 0);
|
||||
|
@ -114,7 +114,7 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size,
|
||||
struct vmbus_channel_msginfo *open_info = NULL;
|
||||
void *in, *out;
|
||||
unsigned long flags;
|
||||
int ret, t, err = 0;
|
||||
int ret, err = 0;
|
||||
|
||||
newchannel->onchannel_callback = onchannelcallback;
|
||||
newchannel->channel_callback_context = context;
|
||||
@ -204,11 +204,7 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size,
|
||||
goto error1;
|
||||
}
|
||||
|
||||
t = wait_for_completion_timeout(&open_info->waitevent, 5*HZ);
|
||||
if (t == 0) {
|
||||
err = -ETIMEDOUT;
|
||||
goto error1;
|
||||
}
|
||||
wait_for_completion(&open_info->waitevent);
|
||||
|
||||
|
||||
if (open_info->response.open_result.status)
|
||||
@ -391,7 +387,7 @@ int vmbus_establish_gpadl(struct vmbus_channel *channel, void *kbuffer,
|
||||
struct vmbus_channel_gpadl_header *gpadlmsg;
|
||||
struct vmbus_channel_gpadl_body *gpadl_body;
|
||||
struct vmbus_channel_msginfo *msginfo = NULL;
|
||||
struct vmbus_channel_msginfo *submsginfo;
|
||||
struct vmbus_channel_msginfo *submsginfo, *tmp;
|
||||
u32 msgcount;
|
||||
struct list_head *curr;
|
||||
u32 next_gpadl_handle;
|
||||
@ -453,6 +449,13 @@ cleanup:
|
||||
list_del(&msginfo->msglistentry);
|
||||
spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags);
|
||||
|
||||
if (msgcount > 1) {
|
||||
list_for_each_entry_safe(submsginfo, tmp, &msginfo->submsglist,
|
||||
msglistentry) {
|
||||
kfree(submsginfo);
|
||||
}
|
||||
}
|
||||
|
||||
kfree(msginfo);
|
||||
return ret;
|
||||
}
|
||||
|
@ -154,7 +154,7 @@ int hv_init(void)
|
||||
/* See if the hypercall page is already set */
|
||||
rdmsrl(HV_X64_MSR_HYPERCALL, hypercall_msr.as_uint64);
|
||||
|
||||
virtaddr = __vmalloc(PAGE_SIZE, GFP_KERNEL, PAGE_KERNEL_EXEC);
|
||||
virtaddr = __vmalloc(PAGE_SIZE, GFP_KERNEL, PAGE_KERNEL_RX);
|
||||
|
||||
if (!virtaddr)
|
||||
goto cleanup;
|
||||
|
@ -673,7 +673,7 @@ static bool pfn_covered(unsigned long start_pfn, unsigned long pfn_cnt)
|
||||
* If the pfn range we are dealing with is not in the current
|
||||
* "hot add block", move on.
|
||||
*/
|
||||
if ((start_pfn >= has->end_pfn))
|
||||
if (start_pfn < has->start_pfn || start_pfn >= has->end_pfn)
|
||||
continue;
|
||||
/*
|
||||
* If the current hot add-request extends beyond
|
||||
@ -728,7 +728,7 @@ static unsigned long handle_pg_range(unsigned long pg_start,
|
||||
* If the pfn range we are dealing with is not in the current
|
||||
* "hot add block", move on.
|
||||
*/
|
||||
if ((start_pfn >= has->end_pfn))
|
||||
if (start_pfn < has->start_pfn || start_pfn >= has->end_pfn)
|
||||
continue;
|
||||
|
||||
old_covered_state = has->covered_end_pfn;
|
||||
|
@ -328,7 +328,7 @@ static noinline int i2cdev_ioctl_smbus(struct i2c_client *client,
|
||||
unsigned long arg)
|
||||
{
|
||||
struct i2c_smbus_ioctl_data data_arg;
|
||||
union i2c_smbus_data temp;
|
||||
union i2c_smbus_data temp = {};
|
||||
int datasize, res;
|
||||
|
||||
if (copy_from_user(&data_arg,
|
||||
|
@ -2772,6 +2772,9 @@ static int cma_accept_iw(struct rdma_id_private *id_priv,
|
||||
struct iw_cm_conn_param iw_param;
|
||||
int ret;
|
||||
|
||||
if (!conn_param)
|
||||
return -EINVAL;
|
||||
|
||||
ret = cma_modify_qp_rtr(id_priv, conn_param);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -188,6 +188,17 @@ static void joydev_detach_client(struct joydev *joydev,
|
||||
synchronize_rcu();
|
||||
}
|
||||
|
||||
static void joydev_refresh_state(struct joydev *joydev)
|
||||
{
|
||||
struct input_dev *dev = joydev->handle.dev;
|
||||
int i, val;
|
||||
|
||||
for (i = 0; i < joydev->nabs; i++) {
|
||||
val = input_abs_get_val(dev, joydev->abspam[i]);
|
||||
joydev->abs[i] = joydev_correct(val, &joydev->corr[i]);
|
||||
}
|
||||
}
|
||||
|
||||
static int joydev_open_device(struct joydev *joydev)
|
||||
{
|
||||
int retval;
|
||||
@ -202,6 +213,8 @@ static int joydev_open_device(struct joydev *joydev)
|
||||
retval = input_open_device(&joydev->handle);
|
||||
if (retval)
|
||||
joydev->open--;
|
||||
else
|
||||
joydev_refresh_state(joydev);
|
||||
}
|
||||
|
||||
mutex_unlock(&joydev->mutex);
|
||||
@ -823,7 +836,6 @@ static int joydev_connect(struct input_handler *handler, struct input_dev *dev,
|
||||
j = joydev->abspam[i];
|
||||
if (input_abs_get_max(dev, j) == input_abs_get_min(dev, j)) {
|
||||
joydev->corr[i].type = JS_CORR_NONE;
|
||||
joydev->abs[i] = input_abs_get_val(dev, j);
|
||||
continue;
|
||||
}
|
||||
joydev->corr[i].type = JS_CORR_BROKEN;
|
||||
@ -838,10 +850,6 @@ static int joydev_connect(struct input_handler *handler, struct input_dev *dev,
|
||||
if (t) {
|
||||
joydev->corr[i].coef[2] = (1 << 29) / t;
|
||||
joydev->corr[i].coef[3] = (1 << 29) / t;
|
||||
|
||||
joydev->abs[i] =
|
||||
joydev_correct(input_abs_get_val(dev, j),
|
||||
joydev->corr + i);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -141,6 +141,9 @@ static int iforce_usb_probe(struct usb_interface *intf,
|
||||
|
||||
interface = intf->cur_altsetting;
|
||||
|
||||
if (interface->desc.bNumEndpoints < 2)
|
||||
return -ENODEV;
|
||||
|
||||
epirq = &interface->endpoint[0].desc;
|
||||
epout = &interface->endpoint[1].desc;
|
||||
|
||||
|
@ -1134,8 +1134,14 @@ static int xpad_init_input(struct usb_xpad *xpad)
|
||||
xpad->dev = input_dev;
|
||||
input_dev->name = xpad->name;
|
||||
input_dev->phys = xpad->phys;
|
||||
usb_to_input_id(xpad->udev, &input_dev->id);
|
||||
input_dev->dev.parent = &xpad->intf->dev;
|
||||
usb_to_input_id(udev, &input_dev->id);
|
||||
|
||||
if (xpad->xtype == XTYPE_XBOX360W) {
|
||||
/* x360w controllers and the receiver have different ids */
|
||||
input_dev->id.product = 0x02a1;
|
||||
}
|
||||
|
||||
input_dev->dev.parent = &intf->dev;
|
||||
|
||||
input_set_drvdata(input_dev, xpad);
|
||||
|
||||
|
@ -88,7 +88,8 @@ static irqreturn_t mpr_touchkey_interrupt(int irq, void *dev_id)
|
||||
struct mpr121_touchkey *mpr121 = dev_id;
|
||||
struct i2c_client *client = mpr121->client;
|
||||
struct input_dev *input = mpr121->input_dev;
|
||||
unsigned int key_num, key_val, pressed;
|
||||
unsigned long bit_changed;
|
||||
unsigned int key_num;
|
||||
int reg;
|
||||
|
||||
reg = i2c_smbus_read_byte_data(client, ELE_TOUCH_STATUS_1_ADDR);
|
||||
@ -106,19 +107,23 @@ static irqreturn_t mpr_touchkey_interrupt(int irq, void *dev_id)
|
||||
|
||||
reg &= TOUCH_STATUS_MASK;
|
||||
/* use old press bit to figure out which bit changed */
|
||||
key_num = ffs(reg ^ mpr121->statusbits) - 1;
|
||||
pressed = reg & (1 << key_num);
|
||||
bit_changed = reg ^ mpr121->statusbits;
|
||||
mpr121->statusbits = reg;
|
||||
for_each_set_bit(key_num, &bit_changed, mpr121->keycount) {
|
||||
unsigned int key_val, pressed;
|
||||
|
||||
key_val = mpr121->keycodes[key_num];
|
||||
pressed = reg & BIT(key_num);
|
||||
key_val = mpr121->keycodes[key_num];
|
||||
|
||||
input_event(input, EV_MSC, MSC_SCAN, key_num);
|
||||
input_report_key(input, key_val, pressed);
|
||||
input_event(input, EV_MSC, MSC_SCAN, key_num);
|
||||
input_report_key(input, key_val, pressed);
|
||||
|
||||
dev_dbg(&client->dev, "key %d %d %s\n", key_num, key_val,
|
||||
pressed ? "pressed" : "released");
|
||||
|
||||
}
|
||||
input_sync(input);
|
||||
|
||||
dev_dbg(&client->dev, "key %d %d %s\n", key_num, key_val,
|
||||
pressed ? "pressed" : "released");
|
||||
|
||||
out:
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@ -230,6 +235,7 @@ static int mpr_touchkey_probe(struct i2c_client *client,
|
||||
input_dev->id.bustype = BUS_I2C;
|
||||
input_dev->dev.parent = &client->dev;
|
||||
input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP);
|
||||
input_set_capability(input_dev, EV_MSC, MSC_SCAN);
|
||||
|
||||
input_dev->keycode = mpr121->keycodes;
|
||||
input_dev->keycodesize = sizeof(mpr121->keycodes[0]);
|
||||
|
@ -274,6 +274,7 @@ static int tca8418_keypad_probe(struct i2c_client *client,
|
||||
bool irq_is_gpio = false;
|
||||
int irq;
|
||||
int error, row_shift, max_keys;
|
||||
unsigned long trigger = 0;
|
||||
|
||||
/* Copy the platform data */
|
||||
if (pdata) {
|
||||
@ -286,6 +287,7 @@ static int tca8418_keypad_probe(struct i2c_client *client,
|
||||
cols = pdata->cols;
|
||||
rep = pdata->rep;
|
||||
irq_is_gpio = pdata->irq_is_gpio;
|
||||
trigger = IRQF_TRIGGER_FALLING;
|
||||
} else {
|
||||
struct device_node *np = dev->of_node;
|
||||
int err;
|
||||
@ -360,9 +362,7 @@ static int tca8418_keypad_probe(struct i2c_client *client,
|
||||
irq = gpio_to_irq(irq);
|
||||
|
||||
error = devm_request_threaded_irq(dev, irq, NULL, tca8418_irq_handler,
|
||||
IRQF_TRIGGER_FALLING |
|
||||
IRQF_SHARED |
|
||||
IRQF_ONESHOT,
|
||||
trigger | IRQF_SHARED | IRQF_ONESHOT,
|
||||
client->name, keypad_data);
|
||||
if (error) {
|
||||
dev_err(dev, "Unable to claim irq %d; error %d\n",
|
||||
|
@ -119,6 +119,13 @@ static const struct dmi_system_id __initconst i8042_dmi_noloop_table[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_VERSION, "DL760"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Dell Embedded Box PC 3000 */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Embedded Box PC 3000"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* OQO Model 01 */
|
||||
.matches = {
|
||||
@ -580,6 +587,13 @@ static const struct dmi_system_id __initconst i8042_dmi_reset_table[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "20046"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Clevo P650RS, 650RP6, Sager NP8152-S, and others */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Notebook"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "P65xRP"),
|
||||
},
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
|
@ -123,6 +123,9 @@ static int kbtab_probe(struct usb_interface *intf, const struct usb_device_id *i
|
||||
struct input_dev *input_dev;
|
||||
int error = -ENOMEM;
|
||||
|
||||
if (intf->cur_altsetting->desc.bNumEndpoints < 1)
|
||||
return -ENODEV;
|
||||
|
||||
kbtab = kzalloc(sizeof(struct kbtab), GFP_KERNEL);
|
||||
input_dev = input_allocate_device();
|
||||
if (!kbtab || !input_dev)
|
||||
|
@ -11304,7 +11304,8 @@ static void mixer_notify_update(PLCI *plci, byte others)
|
||||
((CAPI_MSG *) msg)->header.ncci = 0;
|
||||
((CAPI_MSG *) msg)->info.facility_req.Selector = SELECTOR_LINE_INTERCONNECT;
|
||||
((CAPI_MSG *) msg)->info.facility_req.structs[0] = 3;
|
||||
PUT_WORD(&(((CAPI_MSG *) msg)->info.facility_req.structs[1]), LI_REQ_SILENT_UPDATE);
|
||||
((CAPI_MSG *) msg)->info.facility_req.structs[1] = LI_REQ_SILENT_UPDATE & 0xff;
|
||||
((CAPI_MSG *) msg)->info.facility_req.structs[2] = LI_REQ_SILENT_UPDATE >> 8;
|
||||
((CAPI_MSG *) msg)->info.facility_req.structs[3] = 0;
|
||||
w = api_put(notify_plci->appl, (CAPI_MSG *) msg);
|
||||
if (w != _QUEUE_FULL)
|
||||
|
@ -1311,12 +1311,15 @@ static int crypt_set_key(struct crypt_config *cc, char *key)
|
||||
if (!cc->key_size && strcmp(key, "-"))
|
||||
goto out;
|
||||
|
||||
/* clear the flag since following operations may invalidate previously valid key */
|
||||
clear_bit(DM_CRYPT_KEY_VALID, &cc->flags);
|
||||
|
||||
if (cc->key_size && crypt_decode_key(cc->key, key, cc->key_size) < 0)
|
||||
goto out;
|
||||
|
||||
set_bit(DM_CRYPT_KEY_VALID, &cc->flags);
|
||||
|
||||
r = crypt_setkey_allcpus(cc);
|
||||
if (!r)
|
||||
set_bit(DM_CRYPT_KEY_VALID, &cc->flags);
|
||||
|
||||
out:
|
||||
/* Hex key string not needed after here, so wipe it. */
|
||||
|
@ -97,6 +97,12 @@ static int linear_mergeable_bvec(struct request_queue *q,
|
||||
return maxsectors << 9;
|
||||
}
|
||||
|
||||
/*
|
||||
* In linear_congested() conf->raid_disks is used as a copy of
|
||||
* mddev->raid_disks to iterate conf->disks[], because conf->raid_disks
|
||||
* and conf->disks[] are created in linear_conf(), they are always
|
||||
* consitent with each other, but mddev->raid_disks does not.
|
||||
*/
|
||||
static int linear_congested(void *data, int bits)
|
||||
{
|
||||
struct mddev *mddev = data;
|
||||
@ -109,7 +115,7 @@ static int linear_congested(void *data, int bits)
|
||||
rcu_read_lock();
|
||||
conf = rcu_dereference(mddev->private);
|
||||
|
||||
for (i = 0; i < mddev->raid_disks && !ret ; i++) {
|
||||
for (i = 0; i < conf->raid_disks && !ret ; i++) {
|
||||
struct request_queue *q = bdev_get_queue(conf->disks[i].rdev->bdev);
|
||||
ret |= bdi_congested(&q->backing_dev_info, bits);
|
||||
}
|
||||
@ -196,6 +202,19 @@ static struct linear_conf *linear_conf(struct mddev *mddev, int raid_disks)
|
||||
conf->disks[i-1].end_sector +
|
||||
conf->disks[i].rdev->sectors;
|
||||
|
||||
/*
|
||||
* conf->raid_disks is copy of mddev->raid_disks. The reason to
|
||||
* keep a copy of mddev->raid_disks in struct linear_conf is,
|
||||
* mddev->raid_disks may not be consistent with pointers number of
|
||||
* conf->disks[] when it is updated in linear_add() and used to
|
||||
* iterate old conf->disks[] earray in linear_congested().
|
||||
* Here conf->raid_disks is always consitent with number of
|
||||
* pointers in conf->disks[] array, and mddev->private is updated
|
||||
* with rcu_assign_pointer() in linear_addr(), such race can be
|
||||
* avoided.
|
||||
*/
|
||||
conf->raid_disks = raid_disks;
|
||||
|
||||
return conf;
|
||||
|
||||
out:
|
||||
@ -252,10 +271,18 @@ static int linear_add(struct mddev *mddev, struct md_rdev *rdev)
|
||||
if (!newconf)
|
||||
return -ENOMEM;
|
||||
|
||||
/* newconf->raid_disks already keeps a copy of * the increased
|
||||
* value of mddev->raid_disks, WARN_ONCE() is just used to make
|
||||
* sure of this. It is possible that oldconf is still referenced
|
||||
* in linear_congested(), therefore kfree_rcu() is used to free
|
||||
* oldconf until no one uses it anymore.
|
||||
*/
|
||||
oldconf = rcu_dereference_protected(mddev->private,
|
||||
lockdep_is_held(
|
||||
&mddev->reconfig_mutex));
|
||||
mddev->raid_disks++;
|
||||
WARN_ONCE(mddev->raid_disks != newconf->raid_disks,
|
||||
"copied raid_disks doesn't match mddev->raid_disks");
|
||||
rcu_assign_pointer(mddev->private, newconf);
|
||||
md_set_array_sectors(mddev, linear_size(mddev, 0, 0));
|
||||
set_capacity(mddev->gendisk, mddev->array_sectors);
|
||||
|
@ -10,6 +10,7 @@ struct linear_conf
|
||||
{
|
||||
struct rcu_head rcu;
|
||||
sector_t array_sectors;
|
||||
int raid_disks; /* a copy of mddev->raid_disks */
|
||||
struct dev_info disks[0];
|
||||
};
|
||||
#endif
|
||||
|
@ -679,14 +679,12 @@ int dm_sm_metadata_create(struct dm_space_map *sm,
|
||||
memcpy(&smm->sm, &bootstrap_ops, sizeof(smm->sm));
|
||||
|
||||
r = sm_ll_new_metadata(&smm->ll, tm);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
r = sm_ll_extend(&smm->ll, nr_blocks);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
if (!r) {
|
||||
r = sm_ll_extend(&smm->ll, nr_blocks);
|
||||
}
|
||||
memcpy(&smm->sm, &ops, sizeof(smm->sm));
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
/*
|
||||
* Now we need to update the newly created data structures with the
|
||||
|
@ -560,7 +560,7 @@ static int read_balance(struct r1conf *conf, struct r1bio *r1_bio, int *max_sect
|
||||
if (best_dist_disk < 0) {
|
||||
if (is_badblock(rdev, this_sector, sectors,
|
||||
&first_bad, &bad_sectors)) {
|
||||
if (first_bad < this_sector)
|
||||
if (first_bad <= this_sector)
|
||||
/* Cannot use this */
|
||||
continue;
|
||||
best_good_sectors = first_bad - this_sector;
|
||||
|
@ -5616,6 +5616,15 @@ static int run(struct mddev *mddev)
|
||||
stripe = (stripe | (stripe-1)) + 1;
|
||||
mddev->queue->limits.discard_alignment = stripe;
|
||||
mddev->queue->limits.discard_granularity = stripe;
|
||||
|
||||
/*
|
||||
* We use 16-bit counter of active stripes in bi_phys_segments
|
||||
* (minus one for over-loaded initialization)
|
||||
*/
|
||||
blk_queue_max_hw_sectors(mddev->queue, 0xfffe * STRIPE_SECTORS);
|
||||
blk_queue_max_discard_sectors(mddev->queue,
|
||||
0xfffe * STRIPE_SECTORS);
|
||||
|
||||
/*
|
||||
* unaligned part of discard request will be ignored, so can't
|
||||
* guarantee discard_zeroes_data
|
||||
|
@ -206,20 +206,28 @@ static int smsusb_start_streaming(struct smsusb_device_t *dev)
|
||||
static int smsusb_sendrequest(void *context, void *buffer, size_t size)
|
||||
{
|
||||
struct smsusb_device_t *dev = (struct smsusb_device_t *) context;
|
||||
struct sms_msg_hdr *phdr = (struct sms_msg_hdr *) buffer;
|
||||
int dummy;
|
||||
struct sms_msg_hdr *phdr;
|
||||
int dummy, ret;
|
||||
|
||||
if (dev->state != SMSUSB_ACTIVE)
|
||||
return -ENOENT;
|
||||
|
||||
phdr = kmalloc(size, GFP_KERNEL);
|
||||
if (!phdr)
|
||||
return -ENOMEM;
|
||||
memcpy(phdr, buffer, size);
|
||||
|
||||
sms_debug("sending %s(%d) size: %d",
|
||||
smscore_translate_msg(phdr->msg_type), phdr->msg_type,
|
||||
phdr->msg_length);
|
||||
|
||||
smsendian_handle_tx_message((struct sms_msg_data *) phdr);
|
||||
smsendian_handle_message_header((struct sms_msg_hdr *)buffer);
|
||||
return usb_bulk_msg(dev->udev, usb_sndbulkpipe(dev->udev, 2),
|
||||
buffer, size, &dummy, 1000);
|
||||
smsendian_handle_message_header((struct sms_msg_hdr *)phdr);
|
||||
ret = usb_bulk_msg(dev->udev, usb_sndbulkpipe(dev->udev, 2),
|
||||
phdr, size, &dummy, 1000);
|
||||
|
||||
kfree(phdr);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static char *smsusb1_fw_lkup[] = {
|
||||
|
@ -1533,6 +1533,114 @@ static const char *uvc_print_chain(struct uvc_video_chain *chain)
|
||||
return buffer;
|
||||
}
|
||||
|
||||
static struct uvc_video_chain *uvc_alloc_chain(struct uvc_device *dev)
|
||||
{
|
||||
struct uvc_video_chain *chain;
|
||||
|
||||
chain = kzalloc(sizeof(*chain), GFP_KERNEL);
|
||||
if (chain == NULL)
|
||||
return NULL;
|
||||
|
||||
INIT_LIST_HEAD(&chain->entities);
|
||||
mutex_init(&chain->ctrl_mutex);
|
||||
chain->dev = dev;
|
||||
v4l2_prio_init(&chain->prio);
|
||||
|
||||
return chain;
|
||||
}
|
||||
|
||||
/*
|
||||
* Fallback heuristic for devices that don't connect units and terminals in a
|
||||
* valid chain.
|
||||
*
|
||||
* Some devices have invalid baSourceID references, causing uvc_scan_chain()
|
||||
* to fail, but if we just take the entities we can find and put them together
|
||||
* in the most sensible chain we can think of, turns out they do work anyway.
|
||||
* Note: This heuristic assumes there is a single chain.
|
||||
*
|
||||
* At the time of writing, devices known to have such a broken chain are
|
||||
* - Acer Integrated Camera (5986:055a)
|
||||
* - Realtek rtl157a7 (0bda:57a7)
|
||||
*/
|
||||
static int uvc_scan_fallback(struct uvc_device *dev)
|
||||
{
|
||||
struct uvc_video_chain *chain;
|
||||
struct uvc_entity *iterm = NULL;
|
||||
struct uvc_entity *oterm = NULL;
|
||||
struct uvc_entity *entity;
|
||||
struct uvc_entity *prev;
|
||||
|
||||
/*
|
||||
* Start by locating the input and output terminals. We only support
|
||||
* devices with exactly one of each for now.
|
||||
*/
|
||||
list_for_each_entry(entity, &dev->entities, list) {
|
||||
if (UVC_ENTITY_IS_ITERM(entity)) {
|
||||
if (iterm)
|
||||
return -EINVAL;
|
||||
iterm = entity;
|
||||
}
|
||||
|
||||
if (UVC_ENTITY_IS_OTERM(entity)) {
|
||||
if (oterm)
|
||||
return -EINVAL;
|
||||
oterm = entity;
|
||||
}
|
||||
}
|
||||
|
||||
if (iterm == NULL || oterm == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
/* Allocate the chain and fill it. */
|
||||
chain = uvc_alloc_chain(dev);
|
||||
if (chain == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
if (uvc_scan_chain_entity(chain, oterm) < 0)
|
||||
goto error;
|
||||
|
||||
prev = oterm;
|
||||
|
||||
/*
|
||||
* Add all Processing and Extension Units with two pads. The order
|
||||
* doesn't matter much, use reverse list traversal to connect units in
|
||||
* UVC descriptor order as we build the chain from output to input. This
|
||||
* leads to units appearing in the order meant by the manufacturer for
|
||||
* the cameras known to require this heuristic.
|
||||
*/
|
||||
list_for_each_entry_reverse(entity, &dev->entities, list) {
|
||||
if (entity->type != UVC_VC_PROCESSING_UNIT &&
|
||||
entity->type != UVC_VC_EXTENSION_UNIT)
|
||||
continue;
|
||||
|
||||
if (entity->num_pads != 2)
|
||||
continue;
|
||||
|
||||
if (uvc_scan_chain_entity(chain, entity) < 0)
|
||||
goto error;
|
||||
|
||||
prev->baSourceID[0] = entity->id;
|
||||
prev = entity;
|
||||
}
|
||||
|
||||
if (uvc_scan_chain_entity(chain, iterm) < 0)
|
||||
goto error;
|
||||
|
||||
prev->baSourceID[0] = iterm->id;
|
||||
|
||||
list_add_tail(&chain->list, &dev->chains);
|
||||
|
||||
uvc_trace(UVC_TRACE_PROBE,
|
||||
"Found a video chain by fallback heuristic (%s).\n",
|
||||
uvc_print_chain(chain));
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
kfree(chain);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Scan the device for video chains and register video devices.
|
||||
*
|
||||
@ -1555,15 +1663,10 @@ static int uvc_scan_device(struct uvc_device *dev)
|
||||
if (term->chain.next || term->chain.prev)
|
||||
continue;
|
||||
|
||||
chain = kzalloc(sizeof(*chain), GFP_KERNEL);
|
||||
chain = uvc_alloc_chain(dev);
|
||||
if (chain == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
INIT_LIST_HEAD(&chain->entities);
|
||||
mutex_init(&chain->ctrl_mutex);
|
||||
chain->dev = dev;
|
||||
v4l2_prio_init(&chain->prio);
|
||||
|
||||
term->flags |= UVC_ENTITY_FLAG_DEFAULT;
|
||||
|
||||
if (uvc_scan_chain(chain, term) < 0) {
|
||||
@ -1577,6 +1680,9 @@ static int uvc_scan_device(struct uvc_device *dev)
|
||||
list_add_tail(&chain->list, &dev->chains);
|
||||
}
|
||||
|
||||
if (list_empty(&dev->chains))
|
||||
uvc_scan_fallback(dev);
|
||||
|
||||
if (list_empty(&dev->chains)) {
|
||||
uvc_printk(KERN_INFO, "No valid video chain found.\n");
|
||||
return -1;
|
||||
|
@ -1450,6 +1450,9 @@ clock_set:
|
||||
}
|
||||
timeout--;
|
||||
udelay(1);
|
||||
spin_unlock_irq(&host->lock);
|
||||
usleep_range(900, 1100);
|
||||
spin_lock_irq(&host->lock);
|
||||
}
|
||||
|
||||
clk |= SDHCI_CLOCK_CARD_EN;
|
||||
|
@ -159,12 +159,10 @@ static int bcm47xxpart_parse(struct mtd_info *master,
|
||||
|
||||
last_trx_part = curr_part - 1;
|
||||
|
||||
/*
|
||||
* We have whole TRX scanned, skip to the next part. Use
|
||||
* roundown (not roundup), as the loop will increase
|
||||
* offset in next step.
|
||||
*/
|
||||
offset = rounddown(offset + trx->length, blocksize);
|
||||
/* Jump to the end of TRX */
|
||||
offset = roundup(offset + trx->length, blocksize);
|
||||
/* Next loop iteration will increase the offset */
|
||||
offset -= blocksize;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
@ -139,15 +139,13 @@ static int __init init_msp_flash(void)
|
||||
}
|
||||
|
||||
msp_maps[i].bankwidth = 1;
|
||||
msp_maps[i].name = kmalloc(7, GFP_KERNEL);
|
||||
msp_maps[i].name = kstrndup(flash_name, 7, GFP_KERNEL);
|
||||
if (!msp_maps[i].name) {
|
||||
iounmap(msp_maps[i].virt);
|
||||
kfree(msp_parts[i]);
|
||||
goto cleanup_loop;
|
||||
}
|
||||
|
||||
msp_maps[i].name = strncpy(msp_maps[i].name, flash_name, 7);
|
||||
|
||||
for (j = 0; j < pcnt; j++) {
|
||||
part_name[5] = '0' + i;
|
||||
part_name[7] = '0' + j;
|
||||
|
@ -148,11 +148,11 @@ int ubi_start_update(struct ubi_device *ubi, struct ubi_volume *vol,
|
||||
return err;
|
||||
}
|
||||
|
||||
if (bytes == 0) {
|
||||
err = ubi_wl_flush(ubi, UBI_ALL, UBI_ALL);
|
||||
if (err)
|
||||
return err;
|
||||
err = ubi_wl_flush(ubi, UBI_ALL, UBI_ALL);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (bytes == 0) {
|
||||
err = clear_update_marker(ubi, vol, 0);
|
||||
if (err)
|
||||
return err;
|
||||
|
@ -109,6 +109,7 @@ static int c_can_pci_probe(struct pci_dev *pdev,
|
||||
|
||||
dev->irq = pdev->irq;
|
||||
priv->base = addr;
|
||||
priv->device = &pdev->dev;
|
||||
|
||||
if (!c_can_pci_data->freq) {
|
||||
dev_err(&pdev->dev, "no clock frequency defined\n");
|
||||
|
@ -962,7 +962,12 @@ static int ti_hecc_probe(struct platform_device *pdev)
|
||||
netif_napi_add(ndev, &priv->napi, ti_hecc_rx_poll,
|
||||
HECC_DEF_NAPI_WEIGHT);
|
||||
|
||||
clk_enable(priv->clk);
|
||||
err = clk_prepare_enable(priv->clk);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "clk_prepare_enable() failed\n");
|
||||
goto probe_exit_clk;
|
||||
}
|
||||
|
||||
err = register_candev(ndev);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "register_candev() failed\n");
|
||||
@ -995,7 +1000,7 @@ static int ti_hecc_remove(struct platform_device *pdev)
|
||||
struct ti_hecc_priv *priv = netdev_priv(ndev);
|
||||
|
||||
unregister_candev(ndev);
|
||||
clk_disable(priv->clk);
|
||||
clk_disable_unprepare(priv->clk);
|
||||
clk_put(priv->clk);
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
iounmap(priv->base);
|
||||
@ -1021,7 +1026,7 @@ static int ti_hecc_suspend(struct platform_device *pdev, pm_message_t state)
|
||||
hecc_set_bit(priv, HECC_CANMC, HECC_CANMC_PDR);
|
||||
priv->can.state = CAN_STATE_SLEEPING;
|
||||
|
||||
clk_disable(priv->clk);
|
||||
clk_disable_unprepare(priv->clk);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1030,8 +1035,11 @@ static int ti_hecc_resume(struct platform_device *pdev)
|
||||
{
|
||||
struct net_device *dev = platform_get_drvdata(pdev);
|
||||
struct ti_hecc_priv *priv = netdev_priv(dev);
|
||||
int err;
|
||||
|
||||
clk_enable(priv->clk);
|
||||
err = clk_prepare_enable(priv->clk);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
hecc_clear_bit(priv, HECC_CANMC, HECC_CANMC_PDR);
|
||||
priv->can.state = CAN_STATE_ERROR_ACTIVE;
|
||||
|
@ -817,23 +817,25 @@ lbl_free_candev:
|
||||
static void peak_usb_disconnect(struct usb_interface *intf)
|
||||
{
|
||||
struct peak_usb_device *dev;
|
||||
struct peak_usb_device *dev_prev_siblings;
|
||||
|
||||
/* unregister as many netdev devices as siblings */
|
||||
for (dev = usb_get_intfdata(intf); dev; dev = dev->prev_siblings) {
|
||||
for (dev = usb_get_intfdata(intf); dev; dev = dev_prev_siblings) {
|
||||
struct net_device *netdev = dev->netdev;
|
||||
char name[IFNAMSIZ];
|
||||
|
||||
dev_prev_siblings = dev->prev_siblings;
|
||||
dev->state &= ~PCAN_USB_STATE_CONNECTED;
|
||||
strncpy(name, netdev->name, IFNAMSIZ);
|
||||
|
||||
unregister_netdev(netdev);
|
||||
free_candev(netdev);
|
||||
|
||||
kfree(dev->cmd_buf);
|
||||
dev->next_siblings = NULL;
|
||||
if (dev->adapter->dev_free)
|
||||
dev->adapter->dev_free(dev);
|
||||
|
||||
free_candev(netdev);
|
||||
dev_info(&intf->dev, "%s removed\n", name);
|
||||
}
|
||||
|
||||
|
@ -956,8 +956,8 @@ static int usb_8dev_probe(struct usb_interface *intf,
|
||||
for (i = 0; i < MAX_TX_URBS; i++)
|
||||
priv->tx_contexts[i].echo_index = MAX_TX_URBS;
|
||||
|
||||
priv->cmd_msg_buffer = kzalloc(sizeof(struct usb_8dev_cmd_msg),
|
||||
GFP_KERNEL);
|
||||
priv->cmd_msg_buffer = devm_kzalloc(&intf->dev, sizeof(struct usb_8dev_cmd_msg),
|
||||
GFP_KERNEL);
|
||||
if (!priv->cmd_msg_buffer)
|
||||
goto cleanup_candev;
|
||||
|
||||
@ -971,7 +971,7 @@ static int usb_8dev_probe(struct usb_interface *intf,
|
||||
if (err) {
|
||||
netdev_err(netdev,
|
||||
"couldn't register CAN device: %d\n", err);
|
||||
goto cleanup_cmd_msg_buffer;
|
||||
goto cleanup_candev;
|
||||
}
|
||||
|
||||
err = usb_8dev_cmd_version(priv, &version);
|
||||
@ -992,9 +992,6 @@ static int usb_8dev_probe(struct usb_interface *intf,
|
||||
cleanup_unregister_candev:
|
||||
unregister_netdev(priv->netdev);
|
||||
|
||||
cleanup_cmd_msg_buffer:
|
||||
kfree(priv->cmd_msg_buffer);
|
||||
|
||||
cleanup_candev:
|
||||
free_candev(netdev);
|
||||
|
||||
|
@ -1792,8 +1792,16 @@ static void bnx2x_get_ringparam(struct net_device *dev,
|
||||
|
||||
ering->rx_max_pending = MAX_RX_AVAIL;
|
||||
|
||||
/* If size isn't already set, we give an estimation of the number
|
||||
* of buffers we'll have. We're neglecting some possible conditions
|
||||
* [we couldn't know for certain at this point if number of queues
|
||||
* might shrink] but the number would be correct for the likely
|
||||
* scenario.
|
||||
*/
|
||||
if (bp->rx_ring_size)
|
||||
ering->rx_pending = bp->rx_ring_size;
|
||||
else if (BNX2X_NUM_RX_QUEUES(bp))
|
||||
ering->rx_pending = MAX_RX_AVAIL / BNX2X_NUM_RX_QUEUES(bp);
|
||||
else
|
||||
ering->rx_pending = MAX_RX_AVAIL;
|
||||
|
||||
|
@ -193,6 +193,7 @@ bnad_txcmpl_process(struct bnad *bnad, struct bna_tcb *tcb)
|
||||
return 0;
|
||||
|
||||
hw_cons = *(tcb->hw_consumer_index);
|
||||
rmb();
|
||||
cons = tcb->consumer_index;
|
||||
q_depth = tcb->q_depth;
|
||||
|
||||
@ -2903,13 +2904,12 @@ bnad_start_xmit(struct sk_buff *skb, struct net_device *netdev)
|
||||
BNA_QE_INDX_INC(prod, q_depth);
|
||||
tcb->producer_index = prod;
|
||||
|
||||
smp_mb();
|
||||
wmb();
|
||||
|
||||
if (unlikely(!test_bit(BNAD_TXQ_TX_STARTED, &tcb->flags)))
|
||||
return NETDEV_TX_OK;
|
||||
|
||||
bna_txq_prod_indx_doorbell(tcb);
|
||||
smp_mb();
|
||||
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
@ -87,6 +87,10 @@ s32 igb_get_phy_id(struct e1000_hw *hw)
|
||||
s32 ret_val = 0;
|
||||
u16 phy_id;
|
||||
|
||||
/* ensure PHY page selection to fix misconfigured i210 */
|
||||
if ((hw->mac.type == e1000_i210) || (hw->mac.type == e1000_i211))
|
||||
phy->ops.write_reg(hw, I347AT4_PAGE_SELECT, 0);
|
||||
|
||||
ret_val = phy->ops.read_reg(hw, PHY_ID1, &phy_id);
|
||||
if (ret_val)
|
||||
goto out;
|
||||
|
@ -557,7 +557,8 @@ fatal_error:
|
||||
|
||||
static int cpmac_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
{
|
||||
int queue, len;
|
||||
int queue;
|
||||
unsigned int len;
|
||||
struct cpmac_desc *desc;
|
||||
struct cpmac_priv *priv = netdev_priv(dev);
|
||||
|
||||
@ -567,7 +568,7 @@ static int cpmac_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
if (unlikely(skb_padto(skb, ETH_ZLEN)))
|
||||
return NETDEV_TX_OK;
|
||||
|
||||
len = max(skb->len, ETH_ZLEN);
|
||||
len = max_t(unsigned int, skb->len, ETH_ZLEN);
|
||||
queue = skb_get_queue_mapping(skb);
|
||||
netif_stop_subqueue(dev, queue);
|
||||
|
||||
@ -1241,7 +1242,7 @@ int cpmac_init(void)
|
||||
goto fail_alloc;
|
||||
}
|
||||
|
||||
#warning FIXME: unhardcode gpio&reset bits
|
||||
/* FIXME: unhardcode gpio&reset bits */
|
||||
ar7_gpio_disable(26);
|
||||
ar7_gpio_disable(27);
|
||||
ar7_device_reset(AR7_RESET_BIT_CPMAC_LO);
|
||||
|
@ -48,6 +48,9 @@ struct net_device_context {
|
||||
struct work_struct work;
|
||||
};
|
||||
|
||||
/* Restrict GSO size to account for NVGRE */
|
||||
#define NETVSC_GSO_MAX_SIZE 62768
|
||||
|
||||
#define RING_SIZE_MIN 64
|
||||
static int ring_size = 128;
|
||||
module_param(ring_size, int, S_IRUGO);
|
||||
@ -436,6 +439,7 @@ static int netvsc_probe(struct hv_device *dev,
|
||||
|
||||
SET_ETHTOOL_OPS(net, ðtool_ops);
|
||||
SET_NETDEV_DEV(net, &dev->device);
|
||||
netif_set_gso_max_size(net, NETVSC_GSO_MAX_SIZE);
|
||||
|
||||
ret = register_netdev(net);
|
||||
if (ret != 0) {
|
||||
|
@ -678,7 +678,7 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m,
|
||||
size_t linear;
|
||||
|
||||
if (q->flags & IFF_VNET_HDR) {
|
||||
vnet_hdr_len = q->vnet_hdr_sz;
|
||||
vnet_hdr_len = ACCESS_ONCE(q->vnet_hdr_sz);
|
||||
|
||||
err = -EINVAL;
|
||||
if (len < vnet_hdr_len)
|
||||
@ -809,7 +809,7 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,
|
||||
|
||||
if (q->flags & IFF_VNET_HDR) {
|
||||
struct virtio_net_hdr vnet_hdr;
|
||||
vnet_hdr_len = q->vnet_hdr_sz;
|
||||
vnet_hdr_len = ACCESS_ONCE(q->vnet_hdr_sz);
|
||||
if ((len -= vnet_hdr_len) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -1087,9 +1087,11 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
|
||||
}
|
||||
|
||||
if (tun->flags & TUN_VNET_HDR) {
|
||||
if (len < tun->vnet_hdr_sz)
|
||||
int vnet_hdr_sz = ACCESS_ONCE(tun->vnet_hdr_sz);
|
||||
|
||||
if (len < vnet_hdr_sz)
|
||||
return -EINVAL;
|
||||
len -= tun->vnet_hdr_sz;
|
||||
len -= vnet_hdr_sz;
|
||||
|
||||
if (memcpy_fromiovecend((void *)&gso, iv, offset, sizeof(gso)))
|
||||
return -EFAULT;
|
||||
@ -1100,7 +1102,7 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
|
||||
|
||||
if (gso.hdr_len > len)
|
||||
return -EINVAL;
|
||||
offset += tun->vnet_hdr_sz;
|
||||
offset += vnet_hdr_sz;
|
||||
}
|
||||
|
||||
if ((tun->flags & TUN_TYPE_MASK) == TUN_TAP_DEV) {
|
||||
@ -1275,7 +1277,7 @@ static ssize_t tun_put_user(struct tun_struct *tun,
|
||||
int vnet_hdr_sz = 0;
|
||||
|
||||
if (tun->flags & TUN_VNET_HDR)
|
||||
vnet_hdr_sz = tun->vnet_hdr_sz;
|
||||
vnet_hdr_sz = ACCESS_ONCE(tun->vnet_hdr_sz);
|
||||
|
||||
if (!(tun->flags & TUN_NO_PI)) {
|
||||
if ((len -= sizeof(pi)) < 0)
|
||||
|
@ -779,7 +779,7 @@ static int catc_probe(struct usb_interface *intf, const struct usb_device_id *id
|
||||
struct net_device *netdev;
|
||||
struct catc *catc;
|
||||
u8 broadcast[6];
|
||||
int i, pktsz;
|
||||
int pktsz, ret;
|
||||
|
||||
if (usb_set_interface(usbdev,
|
||||
intf->altsetting->desc.bInterfaceNumber, 1)) {
|
||||
@ -814,12 +814,8 @@ static int catc_probe(struct usb_interface *intf, const struct usb_device_id *id
|
||||
if ((!catc->ctrl_urb) || (!catc->tx_urb) ||
|
||||
(!catc->rx_urb) || (!catc->irq_urb)) {
|
||||
dev_err(&intf->dev, "No free urbs available.\n");
|
||||
usb_free_urb(catc->ctrl_urb);
|
||||
usb_free_urb(catc->tx_urb);
|
||||
usb_free_urb(catc->rx_urb);
|
||||
usb_free_urb(catc->irq_urb);
|
||||
free_netdev(netdev);
|
||||
return -ENOMEM;
|
||||
ret = -ENOMEM;
|
||||
goto fail_free;
|
||||
}
|
||||
|
||||
/* The F5U011 has the same vendor/product as the netmate but a device version of 0x130 */
|
||||
@ -847,15 +843,24 @@ static int catc_probe(struct usb_interface *intf, const struct usb_device_id *id
|
||||
catc->irq_buf, 2, catc_irq_done, catc, 1);
|
||||
|
||||
if (!catc->is_f5u011) {
|
||||
u32 *buf;
|
||||
int i;
|
||||
|
||||
dev_dbg(dev, "Checking memory size\n");
|
||||
|
||||
i = 0x12345678;
|
||||
catc_write_mem(catc, 0x7a80, &i, 4);
|
||||
i = 0x87654321;
|
||||
catc_write_mem(catc, 0xfa80, &i, 4);
|
||||
catc_read_mem(catc, 0x7a80, &i, 4);
|
||||
buf = kmalloc(4, GFP_KERNEL);
|
||||
if (!buf) {
|
||||
ret = -ENOMEM;
|
||||
goto fail_free;
|
||||
}
|
||||
|
||||
*buf = 0x12345678;
|
||||
catc_write_mem(catc, 0x7a80, buf, 4);
|
||||
*buf = 0x87654321;
|
||||
catc_write_mem(catc, 0xfa80, buf, 4);
|
||||
catc_read_mem(catc, 0x7a80, buf, 4);
|
||||
|
||||
switch (i) {
|
||||
switch (*buf) {
|
||||
case 0x12345678:
|
||||
catc_set_reg(catc, TxBufCount, 8);
|
||||
catc_set_reg(catc, RxBufCount, 32);
|
||||
@ -870,6 +875,8 @@ static int catc_probe(struct usb_interface *intf, const struct usb_device_id *id
|
||||
dev_dbg(dev, "32k Memory\n");
|
||||
break;
|
||||
}
|
||||
|
||||
kfree(buf);
|
||||
|
||||
dev_dbg(dev, "Getting MAC from SEEROM.\n");
|
||||
|
||||
@ -916,16 +923,21 @@ static int catc_probe(struct usb_interface *intf, const struct usb_device_id *id
|
||||
usb_set_intfdata(intf, catc);
|
||||
|
||||
SET_NETDEV_DEV(netdev, &intf->dev);
|
||||
if (register_netdev(netdev) != 0) {
|
||||
usb_set_intfdata(intf, NULL);
|
||||
usb_free_urb(catc->ctrl_urb);
|
||||
usb_free_urb(catc->tx_urb);
|
||||
usb_free_urb(catc->rx_urb);
|
||||
usb_free_urb(catc->irq_urb);
|
||||
free_netdev(netdev);
|
||||
return -EIO;
|
||||
}
|
||||
ret = register_netdev(netdev);
|
||||
if (ret)
|
||||
goto fail_clear_intfdata;
|
||||
|
||||
return 0;
|
||||
|
||||
fail_clear_intfdata:
|
||||
usb_set_intfdata(intf, NULL);
|
||||
fail_free:
|
||||
usb_free_urb(catc->ctrl_urb);
|
||||
usb_free_urb(catc->tx_urb);
|
||||
usb_free_urb(catc->rx_urb);
|
||||
usb_free_urb(catc->irq_urb);
|
||||
free_netdev(netdev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void catc_disconnect(struct usb_interface *intf)
|
||||
|
@ -2862,7 +2862,6 @@ vmxnet3_tx_timeout(struct net_device *netdev)
|
||||
|
||||
netdev_err(adapter->netdev, "tx hang\n");
|
||||
schedule_work(&adapter->work);
|
||||
netif_wake_queue(adapter->netdev);
|
||||
}
|
||||
|
||||
|
||||
@ -2889,6 +2888,7 @@ vmxnet3_reset_work(struct work_struct *data)
|
||||
}
|
||||
rtnl_unlock();
|
||||
|
||||
netif_wake_queue(adapter->netdev);
|
||||
clear_bit(VMXNET3_STATE_BIT_RESETTING, &adapter->state);
|
||||
}
|
||||
|
||||
|
@ -511,8 +511,7 @@ ath5k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
break;
|
||||
return -EOPNOTSUPP;
|
||||
default:
|
||||
WARN_ON(1);
|
||||
return -EINVAL;
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
mutex_lock(&ah->lock);
|
||||
|
@ -836,25 +836,30 @@ static int hfa384x_get_rid(struct net_device *dev, u16 rid, void *buf, int len,
|
||||
spin_lock_bh(&local->baplock);
|
||||
|
||||
res = hfa384x_setup_bap(dev, BAP0, rid, 0);
|
||||
if (!res)
|
||||
res = hfa384x_from_bap(dev, BAP0, &rec, sizeof(rec));
|
||||
if (res)
|
||||
goto unlock;
|
||||
|
||||
res = hfa384x_from_bap(dev, BAP0, &rec, sizeof(rec));
|
||||
if (res)
|
||||
goto unlock;
|
||||
|
||||
if (le16_to_cpu(rec.len) == 0) {
|
||||
/* RID not available */
|
||||
res = -ENODATA;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
rlen = (le16_to_cpu(rec.len) - 1) * 2;
|
||||
if (!res && exact_len && rlen != len) {
|
||||
if (exact_len && rlen != len) {
|
||||
printk(KERN_DEBUG "%s: hfa384x_get_rid - RID len mismatch: "
|
||||
"rid=0x%04x, len=%d (expected %d)\n",
|
||||
dev->name, rid, rlen, len);
|
||||
res = -ENODATA;
|
||||
}
|
||||
|
||||
if (!res)
|
||||
res = hfa384x_from_bap(dev, BAP0, buf, len);
|
||||
res = hfa384x_from_bap(dev, BAP0, buf, len);
|
||||
|
||||
unlock:
|
||||
spin_unlock_bh(&local->baplock);
|
||||
mutex_unlock(&local->rid_bap_mtx);
|
||||
|
||||
|
@ -823,6 +823,7 @@ static void rtl_usb_stop(struct ieee80211_hw *hw)
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
|
||||
struct rtl_usb *rtlusb = rtl_usbdev(rtl_usbpriv(hw));
|
||||
struct urb *urb;
|
||||
|
||||
/* should after adapter start and interrupt enable. */
|
||||
set_hal_stop(rtlhal);
|
||||
@ -830,6 +831,23 @@ static void rtl_usb_stop(struct ieee80211_hw *hw)
|
||||
/* Enable software */
|
||||
SET_USB_STOP(rtlusb);
|
||||
rtl_usb_deinit(hw);
|
||||
|
||||
/* free pre-allocated URBs from rtl_usb_start() */
|
||||
usb_kill_anchored_urbs(&rtlusb->rx_submitted);
|
||||
|
||||
tasklet_kill(&rtlusb->rx_work_tasklet);
|
||||
cancel_work_sync(&rtlpriv->works.lps_change_work);
|
||||
|
||||
flush_workqueue(rtlpriv->works.rtl_wq);
|
||||
|
||||
skb_queue_purge(&rtlusb->rx_queue);
|
||||
|
||||
while ((urb = usb_get_from_anchor(&rtlusb->rx_cleanup_urbs))) {
|
||||
usb_free_coherent(urb->dev, urb->transfer_buffer_length,
|
||||
urb->transfer_buffer, urb->transfer_dma);
|
||||
usb_free_urb(urb);
|
||||
}
|
||||
|
||||
rtlpriv->cfg->ops->hw_disable(hw);
|
||||
}
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user