Merge android-4.4.128 (89904cc) into msm-4.4

* refs/heads/tmp-89904cc
  ANDROID: Add build server config for cuttlefish.
  ANDROID: Add defconfig for cuttlefish.
  FROMLIST: staging: Android: Add 'vsoc' driver for cuttlefish.
  Revert "proc: make oom adjustment files user read-only"
  Revert "fixup! proc: make oom adjustment files user read-only"
  Linux 4.4.128
  Revert "xhci: plat: Register shutdown for xhci_plat"
  vrf: Fix use after free and double free in vrf_finish_output
  ipv6: the entire IPv6 header chain must fit the first fragment
  net/ipv6: Increment OUTxxx counters after netfilter hook
  net sched actions: fix dumping which requires several messages to user space
  r8169: fix setting driver_data after register_netdev
  vti6: better validate user provided tunnel names
  ip6_tunnel: better validate user provided tunnel names
  ip6_gre: better validate user provided tunnel names
  ipv6: sit: better validate user provided tunnel names
  ip_tunnel: better validate user provided tunnel names
  net: fool proof dev_valid_name()
  bonding: process the err returned by dev_set_allmulti properly in bond_enslave
  bonding: move dev_mc_sync after master_upper_dev_link in bond_enslave
  bonding: fix the err path for dev hwaddr sync in bond_enslave
  vlan: also check phy_driver ts_info for vlan's real device
  vhost: correctly remove wait queue during poll failure
  sky2: Increase D3 delay to sky2 stops working after suspend
  sctp: sctp_sockaddr_af must check minimal addr length for AF_INET6
  sctp: do not leak kernel memory to user space
  pptp: remove a buggy dst release in pptp_connect()
  net/sched: fix NULL dereference in the error path of tcf_bpf_init()
  netlink: make sure nladdr has correct size in netlink_connect()
  net/ipv6: Fix route leaking between VRFs
  net: fix possible out-of-bound read in skb_network_protocol()
  arp: fix arp_filter on l3slave devices
  Kbuild: provide a __UNIQUE_ID for clang
  futex: Remove requirement for lock_page() in get_futex_key()
  random: use lockless method of accessing and updating f->reg_idx
  virtio_net: check return value of skb_to_sgvec in one more location
  virtio_net: check return value of skb_to_sgvec always
  rxrpc: check return value of skb_to_sgvec always
  ipsec: check return value of skb_to_sgvec always
  perf tools: Fix copyfile_offset update of output offset
  cxgb4vf: Fix SGE FL buffer initialization logic for 64K pages
  EDAC, mv64x60: Fix an error handling path
  tty: n_gsm: Allow ADM response in addition to UA for control dlci
  blk-mq: fix kernel oops in blk_mq_tag_idle()
  scsi: libsas: initialize sas_phy status according to response of DISCOVER
  scsi: libsas: fix error when getting phy events
  scsi: libsas: fix memory leak in sas_smp_get_phy_events()
  bcache: segregate flash only volume write streams
  bcache: stop writeback thread after detaching
  vxlan: dont migrate permanent fdb entries during learn
  s390/dasd: fix hanging safe offline
  ACPICA: Disassembler: Abort on an invalid/unknown AML opcode
  ACPICA: Events: Add runtime stub support for event APIs
  cpuidle: dt: Add missing 'of_node_put()'
  Bluetooth: Send HCI Set Event Mask Page 2 command only when needed
  iio: magnetometer: st_magn_spi: fix spi_device_id table
  sparc64: ldc abort during vds iso boot
  sctp: fix recursive locking warning in sctp_do_peeloff
  bnx2x: Allow vfs to disable txvlan offload
  xen: avoid type warning in xchg_xen_ulong
  skbuff: only inherit relevant tx_flags
  perf tests: Decompress kernel module before objdump
  net: emac: fix reset timeout with AR8035 phy
  Fix loop device flush before configure v3
  MIPS: kprobes: flush_insn_slot should flush only if probe initialised
  MIPS: mm: adjust PKMAP location
  MIPS: mm: fixed mappings: correct initialisation
  perf/core: Correct event creation with PERF_FORMAT_GROUP
  e1000e: Undo e1000e_pm_freeze if __e1000_shutdown fails
  ARM: imx: Add MXC_CPU_IMX6ULL and cpu_is_imx6ull
  net: phy: avoid genphy_aneg_done() for PHYs without clause 22 support
  mceusb: sporadic RX truncation corruption fix
  cx25840: fix unchecked return values
  e1000e: fix race condition around skb_tstamp_tx()
  tags: honor COMPILED_SOURCE with apart output directory
  perf report: Ensure the perf DSO mapping matches what libdw sees
  perf header: Set proper module name when build-id event found
  net/mlx4: Check if Granular QoS per VF has been enabled before updating QP qos_vport
  net/mlx4: Fix the check in attaching steering rules
  sit: reload iphdr in ipip6_rcv
  skbuff: return -EMSGSIZE in skb_to_sgvec to prevent overflow
  bio-integrity: Do not allocate integrity context for bio w/o data
  Fix serial console on SNI RM400 machines
  cxgb4: fix incorrect cim_la output for T6
  drm/omap: fix tiled buffer stride calculations
  mISDN: Fix a sleep-in-atomic bug
  qlcnic: Fix a sleep-in-atomic bug in qlcnic_82xx_hw_write_wx_2M and qlcnic_82xx_hw_read_wx_2M
  perf trace: Add mmap alias for s390
  powerpc/spufs: Fix coredump of SPU contexts
  clk: Fix __set_clk_rates error print-string
  clk: scpi: fix return type of __scpi_dvfs_round_rate
  KVM: SVM: do not zero out segment attributes if segment is unusable or not present
  net: freescale: fix potential null pointer dereference
  SUNRPC: ensure correct error is reported by xs_tcp_setup_socket()
  rtc: interface: Validate alarm-time before handling rollover
  rtc: opal: Handle disabled TPO in opal_get_tpo_time()
  cxgb4: FW upgrade fixes
  net/mlx5: avoid build warning for uniprocessor
  arm64: futex: Fix undefined behaviour with FUTEX_OP_OPARG_SHIFT usage
  dmaengine: imx-sdma: Handle return value of clk_prepare_enable
  powerpc/[booke|4xx]: Don't clobber TCR[WP] when setting TCR[DIE]
  ovl: filter trusted xattr for non-admin
  hdlcdrv: Fix divide by zero in hdlcdrv_ioctl
  wl1251: check return from call to wl1251_acx_arp_ip_filter
  ASoC: Intel: sst: Fix the return value of 'sst_send_byte_stream_mrfld()'
  gpio: label descriptors using the device name
  vfb: fix video mode and line_length being set when loaded
  scsi: mpt3sas: Proper handling of set/clear of "ATA command pending" flag.
  scsi: libiscsi: Allow sd_shutdown on bad transport
  ASoC: Intel: cht_bsw_rt5645: Analog Mic support
  media: videobuf2-core: don't go out of the buffer range
  hwmon: (ina2xx) Make calibration register value fixed
  rds; Reset rs->rs_bound_addr in rds_add_bound() failure path
  l2tp: fix missing print session offset info
  perf probe: Add warning message if there is unexpected event name
  thermal: power_allocator: fix one race condition issue for thermal_instances list
  ARM: dts: ls1021a: add "fsl,ls1021a-esdhc" compatible string to esdhc node
  net: llc: add lock_sock in llc_ui_bind to avoid a race condition
  KVM: nVMX: Fix handling of lmsw instruction
  bonding: Don't update slave->link until ready to commit
  Input: elan_i2c - clear INT before resetting controller
  net: move somaxconn init from sysctl code
  tcp: better validation of received ack sequences
  ext4: fix off-by-one on max nr_pages in ext4_find_unwritten_pgoff()
  fix race in drivers/char/random.c:get_reg()
  scsi: bnx2fc: fix race condition in bnx2fc_get_host_stats()
  ASoC: rsnd: SSI PIO adjust to 24bit mode
  pNFS/flexfiles: missing error code in ff_layout_alloc_lseg()
  netfilter: ctnetlink: fix incorrect nf_ct_put during hash resize
  libceph: NULL deref on crush_decode() error path
  net: ieee802154: fix net_device reference release too early
  mlx5: fix bug reading rss_hash_type from CQE
  block: fix an error code in add_partition()
  selinux: do not check open permission on sockets
  net/mlx5: Tolerate irq_set_affinity_hint() failures
  sched/numa: Use down_read_trylock() for the mmap_sem
  leds: pca955x: Correct I2C Functionality
  ray_cs: Avoid reading past end of buffer
  ARM: davinci: da8xx: Create DSP device only when assigned memory
  md-cluster: fix potential lock issue in add_new_disk
  ext4: handle the rest of ext4_mb_load_buddy() ENOMEM errors
  iio: hi8435: cleanup reset gpio
  iio: hi8435: avoid garbage event at first enable
  xfrm: fix state migration copy replay sequence numbers
  selftests/powerpc: Fix TM resched DSCR test with some compilers
  ath5k: fix memory leak on buf on failed eeprom read
  powerpc/mm: Fix virt_addr_valid() etc. on 64-bit hash
  scsi: csiostor: fix use after free in csio_hw_use_fwconfig()
  sh_eth: Use platform device for printing before register_netdev()
  serial: sh-sci: Fix race condition causing garbage during shutdown
  serial: 8250: omap: Disable DMA for console UART
  USB: ene_usb6250: fix SCSI residue overwriting
  net: x25: fix one potential use-after-free issue
  USB: ene_usb6250: fix first command execution
  usb: chipidea: properly handle host or gadget initialization failure
  arp: honour gratuitous ARP _replies_
  neighbour: update neigh timestamps iff update is effective
  ata: libahci: properly propagate return value of platform_get_irq()
  btrfs: fix incorrect error return ret being passed to mapping_set_error
  usb: dwc3: keystone: check return value
  async_tx: Fix DMA_PREP_FENCE usage in do_async_gen_syndrome()
  ipv6: avoid dad-failures for addresses with NODAD
  ARM: dts: imx6qdl-wandboard: Fix audio channel swap
  x86/tsc: Provide 'tsc=unstable' boot parameter
  staging: wlan-ng: prism2mgmt.c: fixed a double endian conversion before calling hfa384x_drvr_setconfig16, also fixes relative sparse warning
  ARM: dts: imx53-qsrb: Pulldown PMIC IRQ pin
  PowerCap: Fix an error code in powercap_register_zone()
  bus: brcmstb_gisb: correct support for 64-bit address output
  bus: brcmstb_gisb: Use register offsets with writes too
  SMB2: Fix share type handling
  vmxnet3: ensure that adapter is in proper state during force_close
  KVM: PPC: Book3S PR: Check copy_to/from_user return values
  Input: elantech - force relative mode on a certain module
  Input: elan_i2c - check if device is there before really probing
  netxen_nic: set rcode to the return status from the call to netxen_issue_cmd
  net: qca_spi: Fix alignment issues in rx path
  blk-mq: NVMe 512B/4K+T10 DIF/DIX format returns I/O error on dd with split op
  CIFS: silence lockdep splat in cifs_relock_file()
  NFSv4.1: Work around a Linux server bug...
  net/mlx4_en: Avoid adding steering rules with invalid ring
  s390: move _text symbol to address higher than zero
  pidns: disable pid allocation if pid_ns_prepare_proc() is failed in alloc_pid()
  drivers/misc/vmw_vmci/vmci_queue_pair.c: fix a couple integer overflow tests
  lockd: fix lockd shutdown race
  net: ethernet: ti: cpsw: adjust cpsw fifos depth for fullduplex flow control
  net: cdc_ncm: Fix TX zero padding
  ipmi_ssif: unlock on allocation failure
  qlge: Avoid reading past end of buffer
  bna: Avoid reading past end of buffer
  mac80211: bail out from prep_connection() if a reconfig is ongoing
  af_key: Fix slab-out-of-bounds in pfkey_compile_policy.
  IB/srpt: Fix abort handling
  NFSv4.1: RECLAIM_COMPLETE must handle NFS4ERR_CONN_NOT_BOUND_TO_SESSION
  x86/asm: Don't use RBP as a temporary register in csum_partial_copy_generic()
  rtc: snvs: fix an incorrect check of return value
  md/raid5: make use of spin_lock_irq over local_irq_disable + spin_lock
  cfg80211: make RATE_INFO_BW_20 the default
  ANDROID: proc: add null check in proc_uid_init
  f2fs/fscrypt: updates to v4.17-rc1
  Reduce amount of casting in drivers/tty/goldfish.c.

Conflicts:
	drivers/staging/android/Kconfig
	drivers/staging/android/Makefile

Change-Id: Ic7aa3df76a0312b8d6d84f8a8e11e793311a239a
Signed-off-by: Srinivasarao P <spathi@codeaurora.org>
This commit is contained in:
Srinivasarao P 2018-04-20 13:04:48 +05:30
commit 0382cccfee
221 changed files with 4868 additions and 1194 deletions

View file

@ -192,3 +192,14 @@ Date: November 2017
Contact: "Sheng Yong" <shengyong1@huawei.com> Contact: "Sheng Yong" <shengyong1@huawei.com>
Description: Description:
Controls readahead inode block in readdir. Controls readahead inode block in readdir.
What: /sys/fs/f2fs/<disk>/extension_list
Date: Feburary 2018
Contact: "Chao Yu" <yuchao0@huawei.com>
Description:
Used to control configure extension list:
- Query: cat /sys/fs/f2fs/<disk>/extension_list
- Add: echo '[h/c]extension' > /sys/fs/f2fs/<disk>/extension_list
- Del: echo '[h/c]!extension' > /sys/fs/f2fs/<disk>/extension_list
- [h] means add/del hot file extension
- [c] means add/del cold file extension

View file

@ -172,6 +172,23 @@ offgrpjquota Turn off group journelled quota.
offprjjquota Turn off project journelled quota. offprjjquota Turn off project journelled quota.
quota Enable plain user disk quota accounting. quota Enable plain user disk quota accounting.
noquota Disable all plain disk quota option. noquota Disable all plain disk quota option.
whint_mode=%s Control which write hints are passed down to block
layer. This supports "off", "user-based", and
"fs-based". In "off" mode (default), f2fs does not pass
down hints. In "user-based" mode, f2fs tries to pass
down hints given by users. And in "fs-based" mode, f2fs
passes down hints with its policy.
alloc_mode=%s Adjust block allocation policy, which supports "reuse"
and "default".
fsync_mode=%s Control the policy of fsync. Currently supports "posix"
and "strict". In "posix" mode, which is default, fsync
will follow POSIX semantics and does a light operation
to improve the filesystem performance. In "strict" mode,
fsync will be heavy and behaves in line with xfs, ext4
and btrfs, where xfstest generic/342 will pass, but the
performance will regress.
test_dummy_encryption Enable dummy encryption, which provides a fake fscrypt
context. The fake fscrypt context is used by xfstests.
================================================================================ ================================================================================
DEBUGFS ENTRIES DEBUGFS ENTRIES

View file

@ -1,6 +1,6 @@
VERSION = 4 VERSION = 4
PATCHLEVEL = 4 PATCHLEVEL = 4
SUBLEVEL = 127 SUBLEVEL = 128
EXTRAVERSION = EXTRAVERSION =
NAME = Blurry Fish Butt NAME = Blurry Fish Butt

View file

@ -23,7 +23,7 @@
imx53-qsrb { imx53-qsrb {
pinctrl_pmic: pmicgrp { pinctrl_pmic: pmicgrp {
fsl,pins = < fsl,pins = <
MX53_PAD_CSI0_DAT5__GPIO5_23 0x1e4 /* IRQ */ MX53_PAD_CSI0_DAT5__GPIO5_23 0x1c4 /* IRQ */
>; >;
}; };
}; };

View file

@ -88,6 +88,7 @@
clocks = <&clks 201>; clocks = <&clks 201>;
VDDA-supply = <&reg_2p5v>; VDDA-supply = <&reg_2p5v>;
VDDIO-supply = <&reg_3p3v>; VDDIO-supply = <&reg_3p3v>;
lrclk-strength = <3>;
}; };
}; };

View file

@ -132,7 +132,7 @@
}; };
esdhc: esdhc@1560000 { esdhc: esdhc@1560000 {
compatible = "fsl,esdhc"; compatible = "fsl,ls1021a-esdhc", "fsl,esdhc";
reg = <0x0 0x1560000 0x0 0x10000>; reg = <0x0 0x1560000 0x0 0x10000>;
interrupts = <GIC_SPI 94 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 94 IRQ_TYPE_LEVEL_HIGH>;
clock-frequency = <0>; clock-frequency = <0>;

View file

@ -16,7 +16,7 @@ static inline int xen_irqs_disabled(struct pt_regs *regs)
return raw_irqs_disabled_flags(regs->ARM_cpsr); return raw_irqs_disabled_flags(regs->ARM_cpsr);
} }
#define xchg_xen_ulong(ptr, val) atomic64_xchg(container_of((ptr), \ #define xchg_xen_ulong(ptr, val) atomic64_xchg(container_of((long long*)(ptr),\
atomic64_t, \ atomic64_t, \
counter), (val)) counter), (val))

View file

@ -795,6 +795,8 @@ static struct platform_device da8xx_dsp = {
.resource = da8xx_rproc_resources, .resource = da8xx_rproc_resources,
}; };
static bool rproc_mem_inited __initdata;
#if IS_ENABLED(CONFIG_DA8XX_REMOTEPROC) #if IS_ENABLED(CONFIG_DA8XX_REMOTEPROC)
static phys_addr_t rproc_base __initdata; static phys_addr_t rproc_base __initdata;
@ -833,6 +835,8 @@ void __init da8xx_rproc_reserve_cma(void)
ret = dma_declare_contiguous(&da8xx_dsp.dev, rproc_size, rproc_base, 0); ret = dma_declare_contiguous(&da8xx_dsp.dev, rproc_size, rproc_base, 0);
if (ret) if (ret)
pr_err("%s: dma_declare_contiguous failed %d\n", __func__, ret); pr_err("%s: dma_declare_contiguous failed %d\n", __func__, ret);
else
rproc_mem_inited = true;
} }
#else #else
@ -847,6 +851,12 @@ int __init da8xx_register_rproc(void)
{ {
int ret; int ret;
if (!rproc_mem_inited) {
pr_warn("%s: memory not reserved for DSP, not registering DSP device\n",
__func__);
return -ENOMEM;
}
ret = platform_device_register(&da8xx_dsp); ret = platform_device_register(&da8xx_dsp);
if (ret) if (ret)
pr_err("%s: can't register DSP device: %d\n", __func__, ret); pr_err("%s: can't register DSP device: %d\n", __func__, ret);

View file

@ -133,6 +133,9 @@ struct device * __init imx_soc_device_init(void)
case MXC_CPU_IMX6UL: case MXC_CPU_IMX6UL:
soc_id = "i.MX6UL"; soc_id = "i.MX6UL";
break; break;
case MXC_CPU_IMX6ULL:
soc_id = "i.MX6ULL";
break;
case MXC_CPU_IMX7D: case MXC_CPU_IMX7D:
soc_id = "i.MX7D"; soc_id = "i.MX7D";
break; break;

View file

@ -39,6 +39,7 @@
#define MXC_CPU_IMX6SX 0x62 #define MXC_CPU_IMX6SX 0x62
#define MXC_CPU_IMX6Q 0x63 #define MXC_CPU_IMX6Q 0x63
#define MXC_CPU_IMX6UL 0x64 #define MXC_CPU_IMX6UL 0x64
#define MXC_CPU_IMX6ULL 0x65
#define MXC_CPU_IMX7D 0x72 #define MXC_CPU_IMX7D 0x72
#define IMX_DDR_TYPE_LPDDR2 1 #define IMX_DDR_TYPE_LPDDR2 1
@ -171,6 +172,11 @@ static inline bool cpu_is_imx6ul(void)
return __mxc_cpu_type == MXC_CPU_IMX6UL; return __mxc_cpu_type == MXC_CPU_IMX6UL;
} }
static inline bool cpu_is_imx6ull(void)
{
return __mxc_cpu_type == MXC_CPU_IMX6ULL;
}
static inline bool cpu_is_imx6q(void) static inline bool cpu_is_imx6q(void)
{ {
return __mxc_cpu_type == MXC_CPU_IMX6Q; return __mxc_cpu_type == MXC_CPU_IMX6Q;

View file

@ -48,16 +48,16 @@ do { \
} while (0) } while (0)
static inline int static inline int
futex_atomic_op_inuser (int encoded_op, u32 __user *uaddr) futex_atomic_op_inuser(unsigned int encoded_op, u32 __user *uaddr)
{ {
int op = (encoded_op >> 28) & 7; int op = (encoded_op >> 28) & 7;
int cmp = (encoded_op >> 24) & 15; int cmp = (encoded_op >> 24) & 15;
int oparg = (encoded_op << 8) >> 20; int oparg = (int)(encoded_op << 8) >> 20;
int cmparg = (encoded_op << 20) >> 20; int cmparg = (int)(encoded_op << 20) >> 20;
int oldval = 0, ret, tmp; int oldval = 0, ret, tmp;
if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28)) if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28))
oparg = 1 << oparg; oparg = 1U << (oparg & 0x1f);
if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32))) if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32)))
return -EFAULT; return -EFAULT;

View file

@ -40,7 +40,8 @@ typedef union mips_instruction kprobe_opcode_t;
#define flush_insn_slot(p) \ #define flush_insn_slot(p) \
do { \ do { \
flush_icache_range((unsigned long)p->addr, \ if (p->addr) \
flush_icache_range((unsigned long)p->addr, \
(unsigned long)p->addr + \ (unsigned long)p->addr + \
(MAX_INSN_SIZE * sizeof(kprobe_opcode_t))); \ (MAX_INSN_SIZE * sizeof(kprobe_opcode_t))); \
} while (0) } while (0)

View file

@ -18,6 +18,10 @@
#include <asm-generic/pgtable-nopmd.h> #include <asm-generic/pgtable-nopmd.h>
#ifdef CONFIG_HIGHMEM
#include <asm/highmem.h>
#endif
extern int temp_tlb_entry; extern int temp_tlb_entry;
/* /*
@ -61,7 +65,8 @@ extern int add_temporary_entry(unsigned long entrylo0, unsigned long entrylo1,
#define VMALLOC_START MAP_BASE #define VMALLOC_START MAP_BASE
#define PKMAP_BASE (0xfe000000UL) #define PKMAP_END ((FIXADDR_START) & ~((LAST_PKMAP << PAGE_SHIFT)-1))
#define PKMAP_BASE (PKMAP_END - PAGE_SIZE * LAST_PKMAP)
#ifdef CONFIG_HIGHMEM #ifdef CONFIG_HIGHMEM
# define VMALLOC_END (PKMAP_BASE-2*PAGE_SIZE) # define VMALLOC_END (PKMAP_BASE-2*PAGE_SIZE)

View file

@ -51,15 +51,15 @@ void __init pagetable_init(void)
/* /*
* Fixed mappings: * Fixed mappings:
*/ */
vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK; vaddr = __fix_to_virt(__end_of_fixed_addresses - 1);
fixrange_init(vaddr, vaddr + FIXADDR_SIZE, pgd_base); fixrange_init(vaddr & PMD_MASK, vaddr + FIXADDR_SIZE, pgd_base);
#ifdef CONFIG_HIGHMEM #ifdef CONFIG_HIGHMEM
/* /*
* Permanent kmaps: * Permanent kmaps:
*/ */
vaddr = PKMAP_BASE; vaddr = PKMAP_BASE;
fixrange_init(vaddr, vaddr + PAGE_SIZE*LAST_PKMAP, pgd_base); fixrange_init(vaddr & PMD_MASK, vaddr + PAGE_SIZE*LAST_PKMAP, pgd_base);
pgd = swapper_pg_dir + __pgd_offset(vaddr); pgd = swapper_pg_dir + __pgd_offset(vaddr);
pud = pud_offset(pgd, vaddr); pud = pud_offset(pgd, vaddr);

View file

@ -132,7 +132,19 @@ extern long long virt_phys_offset;
#define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT) #define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT)
#define virt_to_page(kaddr) pfn_to_page(virt_to_pfn(kaddr)) #define virt_to_page(kaddr) pfn_to_page(virt_to_pfn(kaddr))
#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT)
#ifdef CONFIG_PPC_BOOK3S_64
/*
* On hash the vmalloc and other regions alias to the kernel region when passed
* through __pa(), which virt_to_pfn() uses. That means virt_addr_valid() can
* return true for some vmalloc addresses, which is incorrect. So explicitly
* check that the address is in the kernel region.
*/
#define virt_addr_valid(kaddr) (REGION_ID(kaddr) == KERNEL_REGION_ID && \
pfn_valid(virt_to_pfn(kaddr)))
#else
#define virt_addr_valid(kaddr) pfn_valid(virt_to_pfn(kaddr)) #define virt_addr_valid(kaddr) pfn_valid(virt_to_pfn(kaddr))
#endif
/* /*
* On Book-E parts we need __va to parse the device tree and we can't * On Book-E parts we need __va to parse the device tree and we can't

View file

@ -686,12 +686,20 @@ static int __init get_freq(char *name, int cells, unsigned long *val)
static void start_cpu_decrementer(void) static void start_cpu_decrementer(void)
{ {
#if defined(CONFIG_BOOKE) || defined(CONFIG_40x) #if defined(CONFIG_BOOKE) || defined(CONFIG_40x)
unsigned int tcr;
/* Clear any pending timer interrupts */ /* Clear any pending timer interrupts */
mtspr(SPRN_TSR, TSR_ENW | TSR_WIS | TSR_DIS | TSR_FIS); mtspr(SPRN_TSR, TSR_ENW | TSR_WIS | TSR_DIS | TSR_FIS);
/* Enable decrementer interrupt */ tcr = mfspr(SPRN_TCR);
mtspr(SPRN_TCR, TCR_DIE); /*
#endif /* defined(CONFIG_BOOKE) || defined(CONFIG_40x) */ * The watchdog may have already been enabled by u-boot. So leave
* TRC[WP] (Watchdog Period) alone.
*/
tcr &= TCR_WP_MASK; /* Clear all bits except for TCR[WP] */
tcr |= TCR_DIE; /* Enable decrementer */
mtspr(SPRN_TCR, tcr);
#endif
} }
void __init generic_calibrate_decr(void) void __init generic_calibrate_decr(void)

View file

@ -50,7 +50,9 @@ static int kvmppc_h_pr_enter(struct kvm_vcpu *vcpu)
pteg_addr = get_pteg_addr(vcpu, pte_index); pteg_addr = get_pteg_addr(vcpu, pte_index);
mutex_lock(&vcpu->kvm->arch.hpt_mutex); mutex_lock(&vcpu->kvm->arch.hpt_mutex);
copy_from_user(pteg, (void __user *)pteg_addr, sizeof(pteg)); ret = H_FUNCTION;
if (copy_from_user(pteg, (void __user *)pteg_addr, sizeof(pteg)))
goto done;
hpte = pteg; hpte = pteg;
ret = H_PTEG_FULL; ret = H_PTEG_FULL;
@ -71,7 +73,9 @@ static int kvmppc_h_pr_enter(struct kvm_vcpu *vcpu)
hpte[0] = cpu_to_be64(kvmppc_get_gpr(vcpu, 6)); hpte[0] = cpu_to_be64(kvmppc_get_gpr(vcpu, 6));
hpte[1] = cpu_to_be64(kvmppc_get_gpr(vcpu, 7)); hpte[1] = cpu_to_be64(kvmppc_get_gpr(vcpu, 7));
pteg_addr += i * HPTE_SIZE; pteg_addr += i * HPTE_SIZE;
copy_to_user((void __user *)pteg_addr, hpte, HPTE_SIZE); ret = H_FUNCTION;
if (copy_to_user((void __user *)pteg_addr, hpte, HPTE_SIZE))
goto done;
kvmppc_set_gpr(vcpu, 4, pte_index | i); kvmppc_set_gpr(vcpu, 4, pte_index | i);
ret = H_SUCCESS; ret = H_SUCCESS;
@ -93,7 +97,9 @@ static int kvmppc_h_pr_remove(struct kvm_vcpu *vcpu)
pteg = get_pteg_addr(vcpu, pte_index); pteg = get_pteg_addr(vcpu, pte_index);
mutex_lock(&vcpu->kvm->arch.hpt_mutex); mutex_lock(&vcpu->kvm->arch.hpt_mutex);
copy_from_user(pte, (void __user *)pteg, sizeof(pte)); ret = H_FUNCTION;
if (copy_from_user(pte, (void __user *)pteg, sizeof(pte)))
goto done;
pte[0] = be64_to_cpu((__force __be64)pte[0]); pte[0] = be64_to_cpu((__force __be64)pte[0]);
pte[1] = be64_to_cpu((__force __be64)pte[1]); pte[1] = be64_to_cpu((__force __be64)pte[1]);
@ -103,7 +109,9 @@ static int kvmppc_h_pr_remove(struct kvm_vcpu *vcpu)
((flags & H_ANDCOND) && (pte[0] & avpn) != 0)) ((flags & H_ANDCOND) && (pte[0] & avpn) != 0))
goto done; goto done;
copy_to_user((void __user *)pteg, &v, sizeof(v)); ret = H_FUNCTION;
if (copy_to_user((void __user *)pteg, &v, sizeof(v)))
goto done;
rb = compute_tlbie_rb(pte[0], pte[1], pte_index); rb = compute_tlbie_rb(pte[0], pte[1], pte_index);
vcpu->arch.mmu.tlbie(vcpu, rb, rb & 1 ? true : false); vcpu->arch.mmu.tlbie(vcpu, rb, rb & 1 ? true : false);
@ -171,7 +179,10 @@ static int kvmppc_h_pr_bulk_remove(struct kvm_vcpu *vcpu)
} }
pteg = get_pteg_addr(vcpu, tsh & H_BULK_REMOVE_PTEX); pteg = get_pteg_addr(vcpu, tsh & H_BULK_REMOVE_PTEX);
copy_from_user(pte, (void __user *)pteg, sizeof(pte)); if (copy_from_user(pte, (void __user *)pteg, sizeof(pte))) {
ret = H_FUNCTION;
break;
}
pte[0] = be64_to_cpu((__force __be64)pte[0]); pte[0] = be64_to_cpu((__force __be64)pte[0]);
pte[1] = be64_to_cpu((__force __be64)pte[1]); pte[1] = be64_to_cpu((__force __be64)pte[1]);
@ -184,7 +195,10 @@ static int kvmppc_h_pr_bulk_remove(struct kvm_vcpu *vcpu)
tsh |= H_BULK_REMOVE_NOT_FOUND; tsh |= H_BULK_REMOVE_NOT_FOUND;
} else { } else {
/* Splat the pteg in (userland) hpt */ /* Splat the pteg in (userland) hpt */
copy_to_user((void __user *)pteg, &v, sizeof(v)); if (copy_to_user((void __user *)pteg, &v, sizeof(v))) {
ret = H_FUNCTION;
break;
}
rb = compute_tlbie_rb(pte[0], pte[1], rb = compute_tlbie_rb(pte[0], pte[1],
tsh & H_BULK_REMOVE_PTEX); tsh & H_BULK_REMOVE_PTEX);
@ -211,7 +225,9 @@ static int kvmppc_h_pr_protect(struct kvm_vcpu *vcpu)
pteg = get_pteg_addr(vcpu, pte_index); pteg = get_pteg_addr(vcpu, pte_index);
mutex_lock(&vcpu->kvm->arch.hpt_mutex); mutex_lock(&vcpu->kvm->arch.hpt_mutex);
copy_from_user(pte, (void __user *)pteg, sizeof(pte)); ret = H_FUNCTION;
if (copy_from_user(pte, (void __user *)pteg, sizeof(pte)))
goto done;
pte[0] = be64_to_cpu((__force __be64)pte[0]); pte[0] = be64_to_cpu((__force __be64)pte[0]);
pte[1] = be64_to_cpu((__force __be64)pte[1]); pte[1] = be64_to_cpu((__force __be64)pte[1]);
@ -234,7 +250,9 @@ static int kvmppc_h_pr_protect(struct kvm_vcpu *vcpu)
vcpu->arch.mmu.tlbie(vcpu, rb, rb & 1 ? true : false); vcpu->arch.mmu.tlbie(vcpu, rb, rb & 1 ? true : false);
pte[0] = (__force u64)cpu_to_be64(pte[0]); pte[0] = (__force u64)cpu_to_be64(pte[0]);
pte[1] = (__force u64)cpu_to_be64(pte[1]); pte[1] = (__force u64)cpu_to_be64(pte[1]);
copy_to_user((void __user *)pteg, pte, sizeof(pte)); ret = H_FUNCTION;
if (copy_to_user((void __user *)pteg, pte, sizeof(pte)))
goto done;
ret = H_SUCCESS; ret = H_SUCCESS;
done: done:

View file

@ -174,6 +174,8 @@ static int spufs_arch_write_note(struct spu_context *ctx, int i,
if (!dump_skip(cprm, if (!dump_skip(cprm,
roundup(cprm->written - total + sz, 4) - cprm->written)) roundup(cprm->written - total + sz, 4) - cprm->written))
goto Eio; goto Eio;
rc = 0;
out: out:
free_page((unsigned long)buf); free_page((unsigned long)buf);
return rc; return rc;

View file

@ -21,8 +21,14 @@ SECTIONS
{ {
. = 0x00000000; . = 0x00000000;
.text : { .text : {
_text = .; /* Text and read-only data */ /* Text and read-only data */
HEAD_TEXT HEAD_TEXT
/*
* E.g. perf doesn't like symbols starting at address zero,
* therefore skip the initial PSW and channel program located
* at address zero and let _text start at 0x200.
*/
_text = 0x200;
TEXT_TEXT TEXT_TEXT
SCHED_TEXT SCHED_TEXT
LOCK_TEXT LOCK_TEXT

View file

@ -1733,9 +1733,14 @@ static int read_nonraw(struct ldc_channel *lp, void *buf, unsigned int size)
lp->rcv_nxt = p->seqid; lp->rcv_nxt = p->seqid;
/*
* If this is a control-only packet, there is nothing
* else to do but advance the rx queue since the packet
* was already processed above.
*/
if (!(p->type & LDC_DATA)) { if (!(p->type & LDC_DATA)) {
new = rx_advance(lp, new); new = rx_advance(lp, new);
goto no_data; break;
} }
if (p->stype & (LDC_ACK | LDC_NACK)) { if (p->stype & (LDC_ACK | LDC_NACK)) {
err = data_ack_nack(lp, p); err = data_ack_nack(lp, p);

View file

@ -0,0 +1,442 @@
CONFIG_POSIX_MQUEUE=y
# CONFIG_USELIB is not set
CONFIG_AUDIT=y
CONFIG_NO_HZ=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_BSD_PROCESS_ACCT=y
CONFIG_TASKSTATS=y
CONFIG_TASK_DELAY_ACCT=y
CONFIG_TASK_XACCT=y
CONFIG_TASK_IO_ACCOUNTING=y
CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
CONFIG_CGROUPS=y
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_SCHED=y
CONFIG_RT_GROUP_SCHED=y
CONFIG_NAMESPACES=y
CONFIG_BLK_DEV_INITRD=y
# CONFIG_RD_LZ4 is not set
CONFIG_KALLSYMS_ALL=y
# CONFIG_PCSPKR_PLATFORM is not set
CONFIG_BPF_SYSCALL=y
CONFIG_EMBEDDED=y
# CONFIG_COMPAT_BRK is not set
CONFIG_PROFILING=y
CONFIG_OPROFILE=y
CONFIG_KPROBES=y
CONFIG_JUMP_LABEL=y
CONFIG_CC_STACKPROTECTOR_STRONG=y
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
CONFIG_MODVERSIONS=y
CONFIG_PARTITION_ADVANCED=y
CONFIG_SMP=y
CONFIG_HYPERVISOR_GUEST=y
CONFIG_PARAVIRT=y
CONFIG_PARAVIRT_SPINLOCKS=y
CONFIG_MCORE2=y
CONFIG_PROCESSOR_SELECT=y
# CONFIG_CPU_SUP_CENTAUR is not set
CONFIG_NR_CPUS=8
CONFIG_PREEMPT=y
# CONFIG_MICROCODE is not set
CONFIG_X86_MSR=y
CONFIG_X86_CPUID=y
CONFIG_KSM=y
CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
CONFIG_TRANSPARENT_HUGEPAGE=y
# CONFIG_MTRR is not set
CONFIG_HZ_100=y
CONFIG_KEXEC=y
CONFIG_CRASH_DUMP=y
CONFIG_PHYSICAL_START=0x200000
CONFIG_RANDOMIZE_BASE=y
CONFIG_PHYSICAL_ALIGN=0x1000000
CONFIG_CMDLINE_BOOL=y
CONFIG_CMDLINE="console=ttyS0 reboot=p"
CONFIG_PM_WAKELOCKS=y
CONFIG_PM_WAKELOCKS_LIMIT=0
# CONFIG_PM_WAKELOCKS_GC is not set
CONFIG_PM_DEBUG=y
CONFIG_ACPI_PROCFS_POWER=y
# CONFIG_ACPI_FAN is not set
# CONFIG_ACPI_THERMAL is not set
# CONFIG_X86_PM_TIMER is not set
CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
CONFIG_X86_ACPI_CPUFREQ=y
# CONFIG_X86_ACPI_CPUFREQ_CPB is not set
CONFIG_PCI_MMCONFIG=y
CONFIG_PCI_MSI=y
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
CONFIG_BINFMT_MISC=y
CONFIG_IA32_EMULATION=y
CONFIG_NET=y
CONFIG_PACKET=y
CONFIG_UNIX=y
CONFIG_XFRM_USER=y
CONFIG_NET_KEY=y
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
CONFIG_IP_ADVANCED_ROUTER=y
CONFIG_IP_MULTIPLE_TABLES=y
CONFIG_IP_ROUTE_MULTIPATH=y
CONFIG_IP_ROUTE_VERBOSE=y
CONFIG_IP_MROUTE=y
CONFIG_IP_PIMSM_V1=y
CONFIG_IP_PIMSM_V2=y
CONFIG_SYN_COOKIES=y
CONFIG_INET_ESP=y
# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
# CONFIG_INET_XFRM_MODE_BEET is not set
# CONFIG_INET_LRO is not set
CONFIG_INET_DIAG_DESTROY=y
CONFIG_TCP_CONG_ADVANCED=y
# CONFIG_TCP_CONG_BIC is not set
# CONFIG_TCP_CONG_WESTWOOD is not set
# CONFIG_TCP_CONG_HTCP is not set
CONFIG_TCP_MD5SIG=y
CONFIG_IPV6_ROUTER_PREF=y
CONFIG_IPV6_ROUTE_INFO=y
CONFIG_IPV6_OPTIMISTIC_DAD=y
CONFIG_INET6_AH=y
CONFIG_INET6_ESP=y
CONFIG_INET6_IPCOMP=y
CONFIG_IPV6_MIP6=y
CONFIG_IPV6_MULTIPLE_TABLES=y
CONFIG_NETLABEL=y
CONFIG_NETFILTER=y
CONFIG_NF_CONNTRACK=y
CONFIG_NF_CONNTRACK_SECMARK=y
CONFIG_NF_CONNTRACK_EVENTS=y
CONFIG_NF_CT_PROTO_DCCP=y
CONFIG_NF_CT_PROTO_SCTP=y
CONFIG_NF_CT_PROTO_UDPLITE=y
CONFIG_NF_CONNTRACK_AMANDA=y
CONFIG_NF_CONNTRACK_FTP=y
CONFIG_NF_CONNTRACK_H323=y
CONFIG_NF_CONNTRACK_IRC=y
CONFIG_NF_CONNTRACK_NETBIOS_NS=y
CONFIG_NF_CONNTRACK_PPTP=y
CONFIG_NF_CONNTRACK_SANE=y
CONFIG_NF_CONNTRACK_TFTP=y
CONFIG_NF_CT_NETLINK=y
CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y
CONFIG_NETFILTER_XT_TARGET_CONNMARK=y
CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y
CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y
CONFIG_NETFILTER_XT_TARGET_MARK=y
CONFIG_NETFILTER_XT_TARGET_NFLOG=y
CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y
CONFIG_NETFILTER_XT_TARGET_TPROXY=y
CONFIG_NETFILTER_XT_TARGET_TRACE=y
CONFIG_NETFILTER_XT_TARGET_SECMARK=y
CONFIG_NETFILTER_XT_TARGET_TCPMSS=y
CONFIG_NETFILTER_XT_MATCH_COMMENT=y
CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y
CONFIG_NETFILTER_XT_MATCH_CONNMARK=y
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y
CONFIG_NETFILTER_XT_MATCH_HELPER=y
CONFIG_NETFILTER_XT_MATCH_IPRANGE=y
CONFIG_NETFILTER_XT_MATCH_LENGTH=y
CONFIG_NETFILTER_XT_MATCH_LIMIT=y
CONFIG_NETFILTER_XT_MATCH_MAC=y
CONFIG_NETFILTER_XT_MATCH_MARK=y
CONFIG_NETFILTER_XT_MATCH_POLICY=y
CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y
CONFIG_NETFILTER_XT_MATCH_QTAGUID=y
CONFIG_NETFILTER_XT_MATCH_QUOTA=y
CONFIG_NETFILTER_XT_MATCH_QUOTA2=y
CONFIG_NETFILTER_XT_MATCH_SOCKET=y
CONFIG_NETFILTER_XT_MATCH_STATE=y
CONFIG_NETFILTER_XT_MATCH_STATISTIC=y
CONFIG_NETFILTER_XT_MATCH_STRING=y
CONFIG_NETFILTER_XT_MATCH_TIME=y
CONFIG_NETFILTER_XT_MATCH_U32=y
CONFIG_NF_CONNTRACK_IPV4=y
CONFIG_IP_NF_IPTABLES=y
CONFIG_IP_NF_MATCH_AH=y
CONFIG_IP_NF_MATCH_ECN=y
CONFIG_IP_NF_MATCH_TTL=y
CONFIG_IP_NF_FILTER=y
CONFIG_IP_NF_TARGET_REJECT=y
CONFIG_IP_NF_NAT=y
CONFIG_IP_NF_TARGET_MASQUERADE=y
CONFIG_IP_NF_TARGET_NETMAP=y
CONFIG_IP_NF_TARGET_REDIRECT=y
CONFIG_IP_NF_MANGLE=y
CONFIG_IP_NF_RAW=y
CONFIG_IP_NF_SECURITY=y
CONFIG_IP_NF_ARPTABLES=y
CONFIG_IP_NF_ARPFILTER=y
CONFIG_IP_NF_ARP_MANGLE=y
CONFIG_NF_CONNTRACK_IPV6=y
CONFIG_IP6_NF_IPTABLES=y
CONFIG_IP6_NF_MATCH_IPV6HEADER=y
CONFIG_IP6_NF_MATCH_RPFILTER=y
CONFIG_IP6_NF_FILTER=y
CONFIG_IP6_NF_TARGET_REJECT=y
CONFIG_IP6_NF_MANGLE=y
CONFIG_IP6_NF_RAW=y
CONFIG_NET_SCHED=y
CONFIG_NET_SCH_HTB=y
CONFIG_NET_CLS_U32=y
CONFIG_NET_EMATCH=y
CONFIG_NET_EMATCH_U32=y
CONFIG_NET_CLS_ACT=y
CONFIG_CFG80211=y
CONFIG_MAC80211=y
CONFIG_RFKILL=y
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
CONFIG_DEVTMPFS=y
CONFIG_DEBUG_DEVRES=y
CONFIG_OF=y
CONFIG_OF_UNITTEST=y
# CONFIG_PNP_DEBUG_MESSAGES is not set
CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=8192
CONFIG_VIRTIO_BLK=y
CONFIG_UID_SYS_STATS=y
CONFIG_MEMORY_STATE_TIME=y
CONFIG_SCSI=y
CONFIG_BLK_DEV_SD=y
CONFIG_BLK_DEV_SR=y
CONFIG_BLK_DEV_SR_VENDOR=y
CONFIG_CHR_DEV_SG=y
CONFIG_SCSI_CONSTANTS=y
CONFIG_SCSI_SPI_ATTRS=y
CONFIG_SCSI_VIRTIO=y
CONFIG_MD=y
CONFIG_BLK_DEV_DM=y
CONFIG_DM_CRYPT=y
CONFIG_DM_MIRROR=y
CONFIG_DM_ZERO=y
CONFIG_DM_UEVENT=y
CONFIG_DM_VERITY=y
CONFIG_DM_VERITY_FEC=y
CONFIG_NETDEVICES=y
CONFIG_NETCONSOLE=y
CONFIG_NETCONSOLE_DYNAMIC=y
CONFIG_TUN=y
CONFIG_VIRTIO_NET=y
# CONFIG_ETHERNET is not set
CONFIG_PPP=y
CONFIG_PPP_BSDCOMP=y
CONFIG_PPP_DEFLATE=y
CONFIG_PPP_MPPE=y
CONFIG_PPPOLAC=y
CONFIG_PPPOPNS=y
CONFIG_USB_USBNET=y
# CONFIG_USB_NET_AX8817X is not set
# CONFIG_USB_NET_AX88179_178A is not set
# CONFIG_USB_NET_CDCETHER is not set
# CONFIG_USB_NET_CDC_NCM is not set
# CONFIG_USB_NET_NET1080 is not set
# CONFIG_USB_NET_CDC_SUBSET is not set
# CONFIG_USB_NET_ZAURUS is not set
CONFIG_MAC80211_HWSIM=y
CONFIG_INPUT_EVDEV=y
CONFIG_INPUT_KEYRESET=y
# CONFIG_INPUT_KEYBOARD is not set
# CONFIG_INPUT_MOUSE is not set
CONFIG_INPUT_JOYSTICK=y
CONFIG_JOYSTICK_XPAD=y
CONFIG_JOYSTICK_XPAD_FF=y
CONFIG_JOYSTICK_XPAD_LEDS=y
CONFIG_INPUT_TABLET=y
CONFIG_TABLET_USB_ACECAD=y
CONFIG_TABLET_USB_AIPTEK=y
CONFIG_TABLET_USB_GTCO=y
CONFIG_TABLET_USB_HANWANG=y
CONFIG_TABLET_USB_KBTAB=y
CONFIG_INPUT_MISC=y
CONFIG_INPUT_KEYCHORD=y
CONFIG_INPUT_UINPUT=y
CONFIG_INPUT_GPIO=y
# CONFIG_SERIO_I8042 is not set
# CONFIG_VT is not set
# CONFIG_LEGACY_PTYS is not set
# CONFIG_DEVMEM is not set
# CONFIG_DEVKMEM is not set
CONFIG_SERIAL_8250=y
# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_NR_UARTS=48
CONFIG_SERIAL_8250_EXTENDED=y
CONFIG_SERIAL_8250_MANY_PORTS=y
CONFIG_SERIAL_8250_SHARE_IRQ=y
CONFIG_VIRTIO_CONSOLE=y
CONFIG_HW_RANDOM=y
# CONFIG_HW_RANDOM_INTEL is not set
# CONFIG_HW_RANDOM_AMD is not set
# CONFIG_HW_RANDOM_VIA is not set
CONFIG_HW_RANDOM_VIRTIO=y
CONFIG_HPET=y
# CONFIG_HPET_MMAP_DEFAULT is not set
# CONFIG_DEVPORT is not set
# CONFIG_ACPI_I2C_OPREGION is not set
# CONFIG_I2C_COMPAT is not set
# CONFIG_I2C_HELPER_AUTO is not set
CONFIG_PTP_1588_CLOCK=y
CONFIG_GPIOLIB=y
# CONFIG_HWMON is not set
# CONFIG_X86_PKG_TEMP_THERMAL is not set
CONFIG_WATCHDOG=y
CONFIG_SOFT_WATCHDOG=y
CONFIG_MEDIA_SUPPORT=y
# CONFIG_DVB_TUNER_DIB0070 is not set
# CONFIG_DVB_TUNER_DIB0090 is not set
# CONFIG_VGA_ARB is not set
CONFIG_DRM=y
# CONFIG_DRM_FBDEV_EMULATION is not set
CONFIG_DRM_VIRTIO_GPU=y
CONFIG_SOUND=y
CONFIG_SND=y
CONFIG_HIDRAW=y
CONFIG_UHID=y
# CONFIG_HID_GENERIC is not set
CONFIG_HID_A4TECH=y
CONFIG_HID_ACRUX=y
CONFIG_HID_ACRUX_FF=y
CONFIG_HID_APPLE=y
CONFIG_HID_BELKIN=y
CONFIG_HID_CHERRY=y
CONFIG_HID_CHICONY=y
CONFIG_HID_PRODIKEYS=y
CONFIG_HID_CYPRESS=y
CONFIG_HID_DRAGONRISE=y
CONFIG_DRAGONRISE_FF=y
CONFIG_HID_EMS_FF=y
CONFIG_HID_ELECOM=y
CONFIG_HID_EZKEY=y
CONFIG_HID_HOLTEK=y
CONFIG_HID_KEYTOUCH=y
CONFIG_HID_KYE=y
CONFIG_HID_UCLOGIC=y
CONFIG_HID_WALTOP=y
CONFIG_HID_GYRATION=y
CONFIG_HID_TWINHAN=y
CONFIG_HID_KENSINGTON=y
CONFIG_HID_LCPOWER=y
CONFIG_HID_LOGITECH=y
CONFIG_HID_LOGITECH_DJ=y
CONFIG_LOGITECH_FF=y
CONFIG_LOGIRUMBLEPAD2_FF=y
CONFIG_LOGIG940_FF=y
CONFIG_HID_MAGICMOUSE=y
CONFIG_HID_MICROSOFT=y
CONFIG_HID_MONTEREY=y
CONFIG_HID_MULTITOUCH=y
CONFIG_HID_NTRIG=y
CONFIG_HID_ORTEK=y
CONFIG_HID_PANTHERLORD=y
CONFIG_PANTHERLORD_FF=y
CONFIG_HID_PETALYNX=y
CONFIG_HID_PICOLCD=y
CONFIG_HID_PRIMAX=y
CONFIG_HID_ROCCAT=y
CONFIG_HID_SAITEK=y
CONFIG_HID_SAMSUNG=y
CONFIG_HID_SONY=y
CONFIG_HID_SPEEDLINK=y
CONFIG_HID_SUNPLUS=y
CONFIG_HID_GREENASIA=y
CONFIG_GREENASIA_FF=y
CONFIG_HID_SMARTJOYPLUS=y
CONFIG_SMARTJOYPLUS_FF=y
CONFIG_HID_TIVO=y
CONFIG_HID_TOPSEED=y
CONFIG_HID_THRUSTMASTER=y
CONFIG_HID_WACOM=y
CONFIG_HID_WIIMOTE=y
CONFIG_HID_ZEROPLUS=y
CONFIG_HID_ZYDACRON=y
CONFIG_USB_HIDDEV=y
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_GADGET=y
CONFIG_USB_DUMMY_HCD=y
CONFIG_USB_CONFIGFS=y
CONFIG_USB_CONFIGFS_F_FS=y
CONFIG_USB_CONFIGFS_F_ACC=y
CONFIG_USB_CONFIGFS_F_AUDIO_SRC=y
CONFIG_USB_CONFIGFS_UEVENT=y
CONFIG_USB_CONFIGFS_F_MIDI=y
CONFIG_RTC_CLASS=y
# CONFIG_RTC_HCTOSYS is not set
CONFIG_VIRTIO_PCI=y
CONFIG_VIRTIO_BALLOON=y
CONFIG_VIRTIO_MMIO=y
CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y
CONFIG_STAGING=y
CONFIG_ASHMEM=y
CONFIG_ANDROID_TIMED_GPIO=y
CONFIG_ANDROID_LOW_MEMORY_KILLER=y
CONFIG_SYNC=y
CONFIG_SW_SYNC=y
CONFIG_SW_SYNC_USER=y
CONFIG_ANDROID_VSOC=y
CONFIG_ION=y
# CONFIG_X86_PLATFORM_DEVICES is not set
# CONFIG_IOMMU_SUPPORT is not set
CONFIG_ANDROID=y
CONFIG_ANDROID_BINDER_IPC=y
# CONFIG_FIRMWARE_MEMMAP is not set
CONFIG_EXT4_FS=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_EXT4_FS_SECURITY=y
CONFIG_EXT4_ENCRYPTION=y
CONFIG_QUOTA=y
CONFIG_QUOTA_NETLINK_INTERFACE=y
# CONFIG_PRINT_QUOTA_WARNING is not set
CONFIG_QFMT_V2=y
CONFIG_AUTOFS4_FS=y
CONFIG_FUSE_FS=y
CONFIG_MSDOS_FS=y
CONFIG_VFAT_FS=y
CONFIG_PROC_KCORE=y
CONFIG_TMPFS=y
CONFIG_TMPFS_POSIX_ACL=y
CONFIG_HUGETLBFS=y
CONFIG_SDCARD_FS=y
CONFIG_PSTORE=y
CONFIG_PSTORE_CONSOLE=y
CONFIG_PSTORE_RAM=y
CONFIG_NLS_DEFAULT="utf8"
CONFIG_NLS_CODEPAGE_437=y
CONFIG_NLS_ASCII=y
CONFIG_NLS_ISO8859_1=y
CONFIG_NLS_UTF8=y
CONFIG_PRINTK_TIME=y
CONFIG_DEBUG_INFO=y
# CONFIG_ENABLE_WARN_DEPRECATED is not set
# CONFIG_ENABLE_MUST_CHECK is not set
CONFIG_FRAME_WARN=1024
# CONFIG_UNUSED_SYMBOLS is not set
CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_STACK_USAGE=y
CONFIG_DEBUG_MEMORY_INIT=y
CONFIG_DEBUG_STACKOVERFLOW=y
CONFIG_LOCKUP_DETECTOR=y
CONFIG_PANIC_TIMEOUT=5
# CONFIG_SCHED_DEBUG is not set
CONFIG_SCHEDSTATS=y
CONFIG_TIMER_STATS=y
CONFIG_RCU_CPU_STALL_TIMEOUT=60
CONFIG_ENABLE_DEFAULT_TRACERS=y
CONFIG_IO_DELAY_NONE=y
CONFIG_DEBUG_BOOT_PARAMS=y
CONFIG_OPTIMIZE_INLINING=y
CONFIG_SECURITY_PERF_EVENTS_RESTRICT=y
CONFIG_SECURITY=y
CONFIG_SECURITY_NETWORK=y
CONFIG_SECURITY_PATH=y
CONFIG_HARDENED_USERCOPY=y
CONFIG_SECURITY_SELINUX=y
CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1
# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set
CONFIG_CRYPTO_ECHAINIV=y

View file

@ -365,6 +365,8 @@ static int __init tsc_setup(char *str)
tsc_clocksource_reliable = 1; tsc_clocksource_reliable = 1;
if (!strncmp(str, "noirqtime", 9)) if (!strncmp(str, "noirqtime", 9))
no_sched_irq_time = 1; no_sched_irq_time = 1;
if (!strcmp(str, "unstable"))
mark_tsc_unstable("boot parameter");
return 1; return 1;
} }

View file

@ -1386,6 +1386,7 @@ static void svm_get_segment(struct kvm_vcpu *vcpu,
*/ */
if (var->unusable) if (var->unusable)
var->db = 0; var->db = 0;
/* This is symmetric with svm_set_segment() */
var->dpl = to_svm(vcpu)->vmcb->save.cpl; var->dpl = to_svm(vcpu)->vmcb->save.cpl;
break; break;
} }
@ -1531,18 +1532,14 @@ static void svm_set_segment(struct kvm_vcpu *vcpu,
s->base = var->base; s->base = var->base;
s->limit = var->limit; s->limit = var->limit;
s->selector = var->selector; s->selector = var->selector;
if (var->unusable) s->attrib = (var->type & SVM_SELECTOR_TYPE_MASK);
s->attrib = 0; s->attrib |= (var->s & 1) << SVM_SELECTOR_S_SHIFT;
else { s->attrib |= (var->dpl & 3) << SVM_SELECTOR_DPL_SHIFT;
s->attrib = (var->type & SVM_SELECTOR_TYPE_MASK); s->attrib |= ((var->present & 1) && !var->unusable) << SVM_SELECTOR_P_SHIFT;
s->attrib |= (var->s & 1) << SVM_SELECTOR_S_SHIFT; s->attrib |= (var->avl & 1) << SVM_SELECTOR_AVL_SHIFT;
s->attrib |= (var->dpl & 3) << SVM_SELECTOR_DPL_SHIFT; s->attrib |= (var->l & 1) << SVM_SELECTOR_L_SHIFT;
s->attrib |= (var->present & 1) << SVM_SELECTOR_P_SHIFT; s->attrib |= (var->db & 1) << SVM_SELECTOR_DB_SHIFT;
s->attrib |= (var->avl & 1) << SVM_SELECTOR_AVL_SHIFT; s->attrib |= (var->g & 1) << SVM_SELECTOR_G_SHIFT;
s->attrib |= (var->l & 1) << SVM_SELECTOR_L_SHIFT;
s->attrib |= (var->db & 1) << SVM_SELECTOR_DB_SHIFT;
s->attrib |= (var->g & 1) << SVM_SELECTOR_G_SHIFT;
}
/* /*
* This is always accurate, except if SYSRET returned to a segment * This is always accurate, except if SYSRET returned to a segment
@ -1551,7 +1548,8 @@ static void svm_set_segment(struct kvm_vcpu *vcpu,
* would entail passing the CPL to userspace and back. * would entail passing the CPL to userspace and back.
*/ */
if (seg == VCPU_SREG_SS) if (seg == VCPU_SREG_SS)
svm->vmcb->save.cpl = (s->attrib >> SVM_SELECTOR_DPL_SHIFT) & 3; /* This is symmetric with svm_get_segment() */
svm->vmcb->save.cpl = (var->dpl & 3);
mark_dirty(svm->vmcb, VMCB_SEG); mark_dirty(svm->vmcb, VMCB_SEG);
} }

View file

@ -7657,11 +7657,13 @@ static bool nested_vmx_exit_handled_cr(struct kvm_vcpu *vcpu,
{ {
unsigned long exit_qualification = vmcs_readl(EXIT_QUALIFICATION); unsigned long exit_qualification = vmcs_readl(EXIT_QUALIFICATION);
int cr = exit_qualification & 15; int cr = exit_qualification & 15;
int reg = (exit_qualification >> 8) & 15; int reg;
unsigned long val = kvm_register_readl(vcpu, reg); unsigned long val;
switch ((exit_qualification >> 4) & 3) { switch ((exit_qualification >> 4) & 3) {
case 0: /* mov to cr */ case 0: /* mov to cr */
reg = (exit_qualification >> 8) & 15;
val = kvm_register_readl(vcpu, reg);
switch (cr) { switch (cr) {
case 0: case 0:
if (vmcs12->cr0_guest_host_mask & if (vmcs12->cr0_guest_host_mask &
@ -7716,6 +7718,7 @@ static bool nested_vmx_exit_handled_cr(struct kvm_vcpu *vcpu,
* lmsw can change bits 1..3 of cr0, and only set bit 0 of * lmsw can change bits 1..3 of cr0, and only set bit 0 of
* cr0. Other attempted changes are ignored, with no exit. * cr0. Other attempted changes are ignored, with no exit.
*/ */
val = (exit_qualification >> LMSW_SOURCE_DATA_SHIFT) & 0x0f;
if (vmcs12->cr0_guest_host_mask & 0xe & if (vmcs12->cr0_guest_host_mask & 0xe &
(val ^ vmcs12->cr0_read_shadow)) (val ^ vmcs12->cr0_read_shadow))
return true; return true;

View file

@ -55,7 +55,7 @@ ENTRY(csum_partial_copy_generic)
movq %r12, 3*8(%rsp) movq %r12, 3*8(%rsp)
movq %r14, 4*8(%rsp) movq %r14, 4*8(%rsp)
movq %r13, 5*8(%rsp) movq %r13, 5*8(%rsp)
movq %rbp, 6*8(%rsp) movq %r15, 6*8(%rsp)
movq %r8, (%rsp) movq %r8, (%rsp)
movq %r9, 1*8(%rsp) movq %r9, 1*8(%rsp)
@ -74,7 +74,7 @@ ENTRY(csum_partial_copy_generic)
/* main loop. clear in 64 byte blocks */ /* main loop. clear in 64 byte blocks */
/* r9: zero, r8: temp2, rbx: temp1, rax: sum, rcx: saved length */ /* r9: zero, r8: temp2, rbx: temp1, rax: sum, rcx: saved length */
/* r11: temp3, rdx: temp4, r12 loopcnt */ /* r11: temp3, rdx: temp4, r12 loopcnt */
/* r10: temp5, rbp: temp6, r14 temp7, r13 temp8 */ /* r10: temp5, r15: temp6, r14 temp7, r13 temp8 */
.p2align 4 .p2align 4
.Lloop: .Lloop:
source source
@ -89,7 +89,7 @@ ENTRY(csum_partial_copy_generic)
source source
movq 32(%rdi), %r10 movq 32(%rdi), %r10
source source
movq 40(%rdi), %rbp movq 40(%rdi), %r15
source source
movq 48(%rdi), %r14 movq 48(%rdi), %r14
source source
@ -103,7 +103,7 @@ ENTRY(csum_partial_copy_generic)
adcq %r11, %rax adcq %r11, %rax
adcq %rdx, %rax adcq %rdx, %rax
adcq %r10, %rax adcq %r10, %rax
adcq %rbp, %rax adcq %r15, %rax
adcq %r14, %rax adcq %r14, %rax
adcq %r13, %rax adcq %r13, %rax
@ -121,7 +121,7 @@ ENTRY(csum_partial_copy_generic)
dest dest
movq %r10, 32(%rsi) movq %r10, 32(%rsi)
dest dest
movq %rbp, 40(%rsi) movq %r15, 40(%rsi)
dest dest
movq %r14, 48(%rsi) movq %r14, 48(%rsi)
dest dest
@ -203,7 +203,7 @@ ENTRY(csum_partial_copy_generic)
movq 3*8(%rsp), %r12 movq 3*8(%rsp), %r12
movq 4*8(%rsp), %r14 movq 4*8(%rsp), %r14
movq 5*8(%rsp), %r13 movq 5*8(%rsp), %r13
movq 6*8(%rsp), %rbp movq 6*8(%rsp), %r15
addq $7*8, %rsp addq $7*8, %rsp
ret ret

View file

@ -175,6 +175,9 @@ bool bio_integrity_enabled(struct bio *bio)
if (!bio_is_rw(bio)) if (!bio_is_rw(bio))
return false; return false;
if (!bio_sectors(bio))
return false;
/* Already protected? */ /* Already protected? */
if (bio_integrity(bio)) if (bio_integrity(bio))
return false; return false;

View file

@ -1252,13 +1252,13 @@ static blk_qc_t blk_mq_make_request(struct request_queue *q, struct bio *bio)
blk_queue_bounce(q, &bio); blk_queue_bounce(q, &bio);
blk_queue_split(q, &bio, q->bio_split);
if (bio_integrity_enabled(bio) && bio_integrity_prep(bio)) { if (bio_integrity_enabled(bio) && bio_integrity_prep(bio)) {
bio_io_error(bio); bio_io_error(bio);
return BLK_QC_T_NONE; return BLK_QC_T_NONE;
} }
blk_queue_split(q, &bio, q->bio_split);
if (!is_flush_fua && !blk_queue_nomerges(q) && if (!is_flush_fua && !blk_queue_nomerges(q) &&
blk_attempt_plug_merge(q, bio, &request_count, &same_queue_rq)) blk_attempt_plug_merge(q, bio, &request_count, &same_queue_rq))
return BLK_QC_T_NONE; return BLK_QC_T_NONE;
@ -1634,7 +1634,8 @@ static void blk_mq_exit_hctx(struct request_queue *q,
{ {
unsigned flush_start_tag = set->queue_depth; unsigned flush_start_tag = set->queue_depth;
blk_mq_tag_idle(hctx); if (blk_mq_hw_queue_mapped(hctx))
blk_mq_tag_idle(hctx);
if (set->ops->exit_request) if (set->ops->exit_request)
set->ops->exit_request(set->driver_data, set->ops->exit_request(set->driver_data,

View file

@ -320,8 +320,10 @@ struct hd_struct *add_partition(struct gendisk *disk, int partno,
if (info) { if (info) {
struct partition_meta_info *pinfo = alloc_part_info(disk); struct partition_meta_info *pinfo = alloc_part_info(disk);
if (!pinfo) if (!pinfo) {
err = -ENOMEM;
goto out_free_stats; goto out_free_stats;
}
memcpy(pinfo, info, sizeof(*info)); memcpy(pinfo, info, sizeof(*info));
p->info = pinfo; p->info = pinfo;
} }

View file

@ -0,0 +1,15 @@
ARCH=x86_64
BRANCH=android-4.4
CLANG_TRIPLE=x86_64-linux-gnu-
CROSS_COMPILE=x86_64-linux-androidkernel-
DEFCONFIG=x86_64_cuttlefish_defconfig
EXTRA_CMDS=''
KERNEL_DIR=common
POST_DEFCONFIG_CMDS="check_defconfig"
CLANG_PREBUILT_BIN=prebuilts/clang/host/linux-x86/clang-4630689/bin
LINUX_GCC_CROSS_COMPILE_PREBUILTS_BIN=prebuilts/gcc/linux-x86/x86/x86_64-linux-android-4.9/bin
FILES="
arch/x86/boot/bzImage
vmlinux
System.map
"

View file

@ -62,9 +62,6 @@ do_async_gen_syndrome(struct dma_chan *chan,
dma_addr_t dma_dest[2]; dma_addr_t dma_dest[2];
int src_off = 0; int src_off = 0;
if (submit->flags & ASYNC_TX_FENCE)
dma_flags |= DMA_PREP_FENCE;
while (src_cnt > 0) { while (src_cnt > 0) {
submit->flags = flags_orig; submit->flags = flags_orig;
pq_src_cnt = min(src_cnt, dma_maxpq(dma, dma_flags)); pq_src_cnt = min(src_cnt, dma_maxpq(dma, dma_flags));
@ -83,6 +80,8 @@ do_async_gen_syndrome(struct dma_chan *chan,
if (cb_fn_orig) if (cb_fn_orig)
dma_flags |= DMA_PREP_INTERRUPT; dma_flags |= DMA_PREP_INTERRUPT;
} }
if (submit->flags & ASYNC_TX_FENCE)
dma_flags |= DMA_PREP_FENCE;
/* Drivers force forward progress in case they can not provide /* Drivers force forward progress in case they can not provide
* a descriptor * a descriptor

View file

@ -180,6 +180,12 @@ acpi_status acpi_enable_event(u32 event, u32 flags)
ACPI_FUNCTION_TRACE(acpi_enable_event); ACPI_FUNCTION_TRACE(acpi_enable_event);
/* If Hardware Reduced flag is set, there are no fixed events */
if (acpi_gbl_reduced_hardware) {
return_ACPI_STATUS(AE_OK);
}
/* Decode the Fixed Event */ /* Decode the Fixed Event */
if (event > ACPI_EVENT_MAX) { if (event > ACPI_EVENT_MAX) {
@ -237,6 +243,12 @@ acpi_status acpi_disable_event(u32 event, u32 flags)
ACPI_FUNCTION_TRACE(acpi_disable_event); ACPI_FUNCTION_TRACE(acpi_disable_event);
/* If Hardware Reduced flag is set, there are no fixed events */
if (acpi_gbl_reduced_hardware) {
return_ACPI_STATUS(AE_OK);
}
/* Decode the Fixed Event */ /* Decode the Fixed Event */
if (event > ACPI_EVENT_MAX) { if (event > ACPI_EVENT_MAX) {
@ -290,6 +302,12 @@ acpi_status acpi_clear_event(u32 event)
ACPI_FUNCTION_TRACE(acpi_clear_event); ACPI_FUNCTION_TRACE(acpi_clear_event);
/* If Hardware Reduced flag is set, there are no fixed events */
if (acpi_gbl_reduced_hardware) {
return_ACPI_STATUS(AE_OK);
}
/* Decode the Fixed Event */ /* Decode the Fixed Event */
if (event > ACPI_EVENT_MAX) { if (event > ACPI_EVENT_MAX) {

View file

@ -121,6 +121,9 @@ static acpi_status acpi_ps_get_aml_opcode(struct acpi_walk_state *walk_state)
(u32)(aml_offset + (u32)(aml_offset +
sizeof(struct acpi_table_header))); sizeof(struct acpi_table_header)));
ACPI_ERROR((AE_INFO,
"Aborting disassembly, AML byte code is corrupt"));
/* Dump the context surrounding the invalid opcode */ /* Dump the context surrounding the invalid opcode */
acpi_ut_dump_buffer(((u8 *)walk_state->parser_state. acpi_ut_dump_buffer(((u8 *)walk_state->parser_state.
@ -129,6 +132,14 @@ static acpi_status acpi_ps_get_aml_opcode(struct acpi_walk_state *walk_state)
sizeof(struct acpi_table_header) - sizeof(struct acpi_table_header) -
16)); 16));
acpi_os_printf(" */\n"); acpi_os_printf(" */\n");
/*
* Just abort the disassembly, cannot continue because the
* parser is essentially lost. The disassembler can then
* randomly fail because an ill-constructed parse tree
* can result.
*/
return_ACPI_STATUS(AE_AML_BAD_OPCODE);
#endif #endif
} }
@ -293,6 +304,9 @@ acpi_ps_create_op(struct acpi_walk_state *walk_state,
if (status == AE_CTRL_PARSE_CONTINUE) { if (status == AE_CTRL_PARSE_CONTINUE) {
return_ACPI_STATUS(AE_CTRL_PARSE_CONTINUE); return_ACPI_STATUS(AE_CTRL_PARSE_CONTINUE);
} }
if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status);
}
/* Create Op structure and append to parent's argument list */ /* Create Op structure and append to parent's argument list */

View file

@ -514,8 +514,9 @@ int ahci_platform_init_host(struct platform_device *pdev,
irq = platform_get_irq(pdev, 0); irq = platform_get_irq(pdev, 0);
if (irq <= 0) { if (irq <= 0) {
dev_err(dev, "no irq\n"); if (irq != -EPROBE_DEFER)
return -EINVAL; dev_err(dev, "no irq\n");
return irq;
} }
hpriv->irq = irq; hpriv->irq = irq;

View file

@ -623,6 +623,9 @@ static int loop_switch(struct loop_device *lo, struct file *file)
*/ */
static int loop_flush(struct loop_device *lo) static int loop_flush(struct loop_device *lo)
{ {
/* loop not yet configured, no running thread, nothing to flush */
if (lo->lo_state != Lo_bound)
return 0;
return loop_switch(lo, NULL); return loop_switch(lo, NULL);
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2014 Broadcom Corporation * Copyright (C) 2014-2017 Broadcom
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as * it under the terms of the GNU General Public License version 2 as
@ -33,8 +33,6 @@
#define ARB_ERR_CAP_CLEAR (1 << 0) #define ARB_ERR_CAP_CLEAR (1 << 0)
#define ARB_ERR_CAP_STATUS_TIMEOUT (1 << 12) #define ARB_ERR_CAP_STATUS_TIMEOUT (1 << 12)
#define ARB_ERR_CAP_STATUS_TEA (1 << 11) #define ARB_ERR_CAP_STATUS_TEA (1 << 11)
#define ARB_ERR_CAP_STATUS_BS_SHIFT (1 << 2)
#define ARB_ERR_CAP_STATUS_BS_MASK 0x3c
#define ARB_ERR_CAP_STATUS_WRITE (1 << 1) #define ARB_ERR_CAP_STATUS_WRITE (1 << 1)
#define ARB_ERR_CAP_STATUS_VALID (1 << 0) #define ARB_ERR_CAP_STATUS_VALID (1 << 0)
@ -43,7 +41,6 @@ enum {
ARB_ERR_CAP_CLR, ARB_ERR_CAP_CLR,
ARB_ERR_CAP_HI_ADDR, ARB_ERR_CAP_HI_ADDR,
ARB_ERR_CAP_ADDR, ARB_ERR_CAP_ADDR,
ARB_ERR_CAP_DATA,
ARB_ERR_CAP_STATUS, ARB_ERR_CAP_STATUS,
ARB_ERR_CAP_MASTER, ARB_ERR_CAP_MASTER,
}; };
@ -53,7 +50,6 @@ static const int gisb_offsets_bcm7038[] = {
[ARB_ERR_CAP_CLR] = 0x0c4, [ARB_ERR_CAP_CLR] = 0x0c4,
[ARB_ERR_CAP_HI_ADDR] = -1, [ARB_ERR_CAP_HI_ADDR] = -1,
[ARB_ERR_CAP_ADDR] = 0x0c8, [ARB_ERR_CAP_ADDR] = 0x0c8,
[ARB_ERR_CAP_DATA] = 0x0cc,
[ARB_ERR_CAP_STATUS] = 0x0d0, [ARB_ERR_CAP_STATUS] = 0x0d0,
[ARB_ERR_CAP_MASTER] = -1, [ARB_ERR_CAP_MASTER] = -1,
}; };
@ -63,7 +59,6 @@ static const int gisb_offsets_bcm7400[] = {
[ARB_ERR_CAP_CLR] = 0x0c8, [ARB_ERR_CAP_CLR] = 0x0c8,
[ARB_ERR_CAP_HI_ADDR] = -1, [ARB_ERR_CAP_HI_ADDR] = -1,
[ARB_ERR_CAP_ADDR] = 0x0cc, [ARB_ERR_CAP_ADDR] = 0x0cc,
[ARB_ERR_CAP_DATA] = 0x0d0,
[ARB_ERR_CAP_STATUS] = 0x0d4, [ARB_ERR_CAP_STATUS] = 0x0d4,
[ARB_ERR_CAP_MASTER] = 0x0d8, [ARB_ERR_CAP_MASTER] = 0x0d8,
}; };
@ -73,7 +68,6 @@ static const int gisb_offsets_bcm7435[] = {
[ARB_ERR_CAP_CLR] = 0x168, [ARB_ERR_CAP_CLR] = 0x168,
[ARB_ERR_CAP_HI_ADDR] = -1, [ARB_ERR_CAP_HI_ADDR] = -1,
[ARB_ERR_CAP_ADDR] = 0x16c, [ARB_ERR_CAP_ADDR] = 0x16c,
[ARB_ERR_CAP_DATA] = 0x170,
[ARB_ERR_CAP_STATUS] = 0x174, [ARB_ERR_CAP_STATUS] = 0x174,
[ARB_ERR_CAP_MASTER] = 0x178, [ARB_ERR_CAP_MASTER] = 0x178,
}; };
@ -83,7 +77,6 @@ static const int gisb_offsets_bcm7445[] = {
[ARB_ERR_CAP_CLR] = 0x7e4, [ARB_ERR_CAP_CLR] = 0x7e4,
[ARB_ERR_CAP_HI_ADDR] = 0x7e8, [ARB_ERR_CAP_HI_ADDR] = 0x7e8,
[ARB_ERR_CAP_ADDR] = 0x7ec, [ARB_ERR_CAP_ADDR] = 0x7ec,
[ARB_ERR_CAP_DATA] = 0x7f0,
[ARB_ERR_CAP_STATUS] = 0x7f4, [ARB_ERR_CAP_STATUS] = 0x7f4,
[ARB_ERR_CAP_MASTER] = 0x7f8, [ARB_ERR_CAP_MASTER] = 0x7f8,
}; };
@ -105,9 +98,13 @@ static u32 gisb_read(struct brcmstb_gisb_arb_device *gdev, int reg)
{ {
int offset = gdev->gisb_offsets[reg]; int offset = gdev->gisb_offsets[reg];
/* return 1 if the hardware doesn't have ARB_ERR_CAP_MASTER */ if (offset < 0) {
if (offset == -1) /* return 1 if the hardware doesn't have ARB_ERR_CAP_MASTER */
return 1; if (reg == ARB_ERR_CAP_MASTER)
return 1;
else
return 0;
}
if (gdev->big_endian) if (gdev->big_endian)
return ioread32be(gdev->base + offset); return ioread32be(gdev->base + offset);
@ -115,6 +112,16 @@ static u32 gisb_read(struct brcmstb_gisb_arb_device *gdev, int reg)
return ioread32(gdev->base + offset); return ioread32(gdev->base + offset);
} }
static u64 gisb_read_address(struct brcmstb_gisb_arb_device *gdev)
{
u64 value;
value = gisb_read(gdev, ARB_ERR_CAP_ADDR);
value |= (u64)gisb_read(gdev, ARB_ERR_CAP_HI_ADDR) << 32;
return value;
}
static void gisb_write(struct brcmstb_gisb_arb_device *gdev, u32 val, int reg) static void gisb_write(struct brcmstb_gisb_arb_device *gdev, u32 val, int reg)
{ {
int offset = gdev->gisb_offsets[reg]; int offset = gdev->gisb_offsets[reg];
@ -123,9 +130,9 @@ static void gisb_write(struct brcmstb_gisb_arb_device *gdev, u32 val, int reg)
return; return;
if (gdev->big_endian) if (gdev->big_endian)
iowrite32be(val, gdev->base + reg); iowrite32be(val, gdev->base + offset);
else else
iowrite32(val, gdev->base + reg); iowrite32(val, gdev->base + offset);
} }
static ssize_t gisb_arb_get_timeout(struct device *dev, static ssize_t gisb_arb_get_timeout(struct device *dev,
@ -181,7 +188,7 @@ static int brcmstb_gisb_arb_decode_addr(struct brcmstb_gisb_arb_device *gdev,
const char *reason) const char *reason)
{ {
u32 cap_status; u32 cap_status;
unsigned long arb_addr; u64 arb_addr;
u32 master; u32 master;
const char *m_name; const char *m_name;
char m_fmt[11]; char m_fmt[11];
@ -193,10 +200,7 @@ static int brcmstb_gisb_arb_decode_addr(struct brcmstb_gisb_arb_device *gdev,
return 1; return 1;
/* Read the address and master */ /* Read the address and master */
arb_addr = gisb_read(gdev, ARB_ERR_CAP_ADDR) & 0xffffffff; arb_addr = gisb_read_address(gdev);
#if (IS_ENABLED(CONFIG_PHYS_ADDR_T_64BIT))
arb_addr |= (u64)gisb_read(gdev, ARB_ERR_CAP_HI_ADDR) << 32;
#endif
master = gisb_read(gdev, ARB_ERR_CAP_MASTER); master = gisb_read(gdev, ARB_ERR_CAP_MASTER);
m_name = brcmstb_gisb_master_to_str(gdev, master); m_name = brcmstb_gisb_master_to_str(gdev, master);
@ -205,7 +209,7 @@ static int brcmstb_gisb_arb_decode_addr(struct brcmstb_gisb_arb_device *gdev,
m_name = m_fmt; m_name = m_fmt;
} }
pr_crit("%s: %s at 0x%lx [%c %s], core: %s\n", pr_crit("%s: %s at 0x%llx [%c %s], core: %s\n",
__func__, reason, arb_addr, __func__, reason, arb_addr,
cap_status & ARB_ERR_CAP_STATUS_WRITE ? 'W' : 'R', cap_status & ARB_ERR_CAP_STATUS_WRITE ? 'W' : 'R',
cap_status & ARB_ERR_CAP_STATUS_TIMEOUT ? "timeout" : "", cap_status & ARB_ERR_CAP_STATUS_TIMEOUT ? "timeout" : "",

View file

@ -409,6 +409,7 @@ static void start_event_fetch(struct ssif_info *ssif_info, unsigned long *flags)
msg = ipmi_alloc_smi_msg(); msg = ipmi_alloc_smi_msg();
if (!msg) { if (!msg) {
ssif_info->ssif_state = SSIF_NORMAL; ssif_info->ssif_state = SSIF_NORMAL;
ipmi_ssif_unlock_cond(ssif_info, flags);
return; return;
} }
@ -431,6 +432,7 @@ static void start_recv_msg_fetch(struct ssif_info *ssif_info,
msg = ipmi_alloc_smi_msg(); msg = ipmi_alloc_smi_msg();
if (!msg) { if (!msg) {
ssif_info->ssif_state = SSIF_NORMAL; ssif_info->ssif_state = SSIF_NORMAL;
ipmi_ssif_unlock_cond(ssif_info, flags);
return; return;
} }

View file

@ -886,12 +886,16 @@ static void add_interrupt_bench(cycles_t start)
static __u32 get_reg(struct fast_pool *f, struct pt_regs *regs) static __u32 get_reg(struct fast_pool *f, struct pt_regs *regs)
{ {
__u32 *ptr = (__u32 *) regs; __u32 *ptr = (__u32 *) regs;
unsigned int idx;
if (regs == NULL) if (regs == NULL)
return 0; return 0;
if (f->reg_idx >= sizeof(struct pt_regs) / sizeof(__u32)) idx = READ_ONCE(f->reg_idx);
f->reg_idx = 0; if (idx >= sizeof(struct pt_regs) / sizeof(__u32))
return *(ptr + f->reg_idx++); idx = 0;
ptr += idx++;
WRITE_ONCE(f->reg_idx, idx);
return *ptr;
} }
void add_interrupt_randomness(int irq, int irq_flags) void add_interrupt_randomness(int irq, int irq_flags)

View file

@ -106,7 +106,7 @@ static int __set_clk_rates(struct device_node *node, bool clk_supplier)
rc = clk_set_rate(clk, rate); rc = clk_set_rate(clk, rate);
if (rc < 0) if (rc < 0)
pr_err("clk: couldn't set %s clk rate to %d (%d), current rate: %ld\n", pr_err("clk: couldn't set %s clk rate to %u (%d), current rate: %lu\n",
__clk_get_name(clk), rate, rc, __clk_get_name(clk), rate, rc,
clk_get_rate(clk)); clk_get_rate(clk));
clk_put(clk); clk_put(clk);

View file

@ -71,15 +71,15 @@ static const struct clk_ops scpi_clk_ops = {
}; };
/* find closest match to given frequency in OPP table */ /* find closest match to given frequency in OPP table */
static int __scpi_dvfs_round_rate(struct scpi_clk *clk, unsigned long rate) static long __scpi_dvfs_round_rate(struct scpi_clk *clk, unsigned long rate)
{ {
int idx; int idx;
u32 fmin = 0, fmax = ~0, ftmp; unsigned long fmin = 0, fmax = ~0, ftmp;
const struct scpi_opp *opp = clk->info->opps; const struct scpi_opp *opp = clk->info->opps;
for (idx = 0; idx < clk->info->count; idx++, opp++) { for (idx = 0; idx < clk->info->count; idx++, opp++) {
ftmp = opp->freq; ftmp = opp->freq;
if (ftmp >= (u32)rate) { if (ftmp >= rate) {
if (ftmp <= fmax) if (ftmp <= fmax)
fmax = ftmp; fmax = ftmp;
break; break;

View file

@ -174,8 +174,10 @@ int dt_init_idle_driver(struct cpuidle_driver *drv,
if (!state_node) if (!state_node)
break; break;
if (!of_device_is_available(state_node)) if (!of_device_is_available(state_node)) {
of_node_put(state_node);
continue; continue;
}
if (!idle_state_valid(state_node, i, cpumask)) { if (!idle_state_valid(state_node, i, cpumask)) {
pr_warn("%s idle state not valid, bailing out\n", pr_warn("%s idle state not valid, bailing out\n",

View file

@ -1722,17 +1722,24 @@ static int sdma_probe(struct platform_device *pdev)
if (IS_ERR(sdma->clk_ahb)) if (IS_ERR(sdma->clk_ahb))
return PTR_ERR(sdma->clk_ahb); return PTR_ERR(sdma->clk_ahb);
clk_prepare(sdma->clk_ipg); ret = clk_prepare(sdma->clk_ipg);
clk_prepare(sdma->clk_ahb); if (ret)
return ret;
ret = clk_prepare(sdma->clk_ahb);
if (ret)
goto err_clk;
ret = devm_request_irq(&pdev->dev, irq, sdma_int_handler, 0, "sdma", ret = devm_request_irq(&pdev->dev, irq, sdma_int_handler, 0, "sdma",
sdma); sdma);
if (ret) if (ret)
return ret; goto err_irq;
sdma->script_addrs = kzalloc(sizeof(*sdma->script_addrs), GFP_KERNEL); sdma->script_addrs = kzalloc(sizeof(*sdma->script_addrs), GFP_KERNEL);
if (!sdma->script_addrs) if (!sdma->script_addrs) {
return -ENOMEM; ret = -ENOMEM;
goto err_irq;
}
/* initially no scripts available */ /* initially no scripts available */
saddr_arr = (s32 *)sdma->script_addrs; saddr_arr = (s32 *)sdma->script_addrs;
@ -1847,6 +1854,10 @@ err_register:
dma_async_device_unregister(&sdma->dma_device); dma_async_device_unregister(&sdma->dma_device);
err_init: err_init:
kfree(sdma->script_addrs); kfree(sdma->script_addrs);
err_irq:
clk_unprepare(sdma->clk_ahb);
err_clk:
clk_unprepare(sdma->clk_ipg);
return ret; return ret;
} }
@ -1857,6 +1868,8 @@ static int sdma_remove(struct platform_device *pdev)
dma_async_device_unregister(&sdma->dma_device); dma_async_device_unregister(&sdma->dma_device);
kfree(sdma->script_addrs); kfree(sdma->script_addrs);
clk_unprepare(sdma->clk_ahb);
clk_unprepare(sdma->clk_ipg);
/* Kill the tasklet */ /* Kill the tasklet */
for (i = 0; i < MAX_DMA_CHANNELS; i++) { for (i = 0; i < MAX_DMA_CHANNELS; i++) {
struct sdma_channel *sdmac = &sdma->channel[i]; struct sdma_channel *sdmac = &sdma->channel[i];

View file

@ -763,7 +763,7 @@ static int mv64x60_mc_err_probe(struct platform_device *pdev)
/* Non-ECC RAM? */ /* Non-ECC RAM? */
printk(KERN_WARNING "%s: No ECC DIMMs discovered\n", __func__); printk(KERN_WARNING "%s: No ECC DIMMs discovered\n", __func__);
res = -ENODEV; res = -ENODEV;
goto err2; goto err;
} }
edac_dbg(3, "init mci\n"); edac_dbg(3, "init mci\n");

View file

@ -2145,7 +2145,8 @@ struct gpio_desc *__must_check gpiod_get_index(struct device *dev,
return desc; return desc;
} }
status = gpiod_request(desc, con_id); /* If a connection label was passed use that, else use the device name as label */
status = gpiod_request(desc, con_id ? con_id : dev_name(dev));
if (status < 0) if (status < 0)
return ERR_PTR(status); return ERR_PTR(status);

View file

@ -158,7 +158,7 @@ static void evict_entry(struct drm_gem_object *obj,
size_t size = PAGE_SIZE * n; size_t size = PAGE_SIZE * n;
loff_t off = mmap_offset(obj) + loff_t off = mmap_offset(obj) +
(entry->obj_pgoff << PAGE_SHIFT); (entry->obj_pgoff << PAGE_SHIFT);
const int m = 1 + ((omap_obj->width << fmt) / PAGE_SIZE); const int m = DIV_ROUND_UP(omap_obj->width << fmt, PAGE_SIZE);
if (m > 1) { if (m > 1) {
int i; int i;
@ -415,7 +415,7 @@ static int fault_2d(struct drm_gem_object *obj,
* into account in some of the math, so figure out virtual stride * into account in some of the math, so figure out virtual stride
* in pages * in pages
*/ */
const int m = 1 + ((omap_obj->width << fmt) / PAGE_SIZE); const int m = DIV_ROUND_UP(omap_obj->width << fmt, PAGE_SIZE);
/* We don't use vmf->pgoff since that has the fake offset: */ /* We don't use vmf->pgoff since that has the fake offset: */
pgoff = ((unsigned long)vmf->virtual_address - pgoff = ((unsigned long)vmf->virtual_address -

View file

@ -94,18 +94,20 @@ enum ina2xx_ids { ina219, ina226 };
struct ina2xx_config { struct ina2xx_config {
u16 config_default; u16 config_default;
int calibration_factor; int calibration_value;
int registers; int registers;
int shunt_div; int shunt_div;
int bus_voltage_shift; int bus_voltage_shift;
int bus_voltage_lsb; /* uV */ int bus_voltage_lsb; /* uV */
int power_lsb; /* uW */ int power_lsb_factor;
}; };
struct ina2xx_data { struct ina2xx_data {
const struct ina2xx_config *config; const struct ina2xx_config *config;
long rshunt; long rshunt;
long current_lsb_uA;
long power_lsb_uW;
struct mutex config_lock; struct mutex config_lock;
struct regmap *regmap; struct regmap *regmap;
@ -115,21 +117,21 @@ struct ina2xx_data {
static const struct ina2xx_config ina2xx_config[] = { static const struct ina2xx_config ina2xx_config[] = {
[ina219] = { [ina219] = {
.config_default = INA219_CONFIG_DEFAULT, .config_default = INA219_CONFIG_DEFAULT,
.calibration_factor = 40960000, .calibration_value = 4096,
.registers = INA219_REGISTERS, .registers = INA219_REGISTERS,
.shunt_div = 100, .shunt_div = 100,
.bus_voltage_shift = 3, .bus_voltage_shift = 3,
.bus_voltage_lsb = 4000, .bus_voltage_lsb = 4000,
.power_lsb = 20000, .power_lsb_factor = 20,
}, },
[ina226] = { [ina226] = {
.config_default = INA226_CONFIG_DEFAULT, .config_default = INA226_CONFIG_DEFAULT,
.calibration_factor = 5120000, .calibration_value = 2048,
.registers = INA226_REGISTERS, .registers = INA226_REGISTERS,
.shunt_div = 400, .shunt_div = 400,
.bus_voltage_shift = 0, .bus_voltage_shift = 0,
.bus_voltage_lsb = 1250, .bus_voltage_lsb = 1250,
.power_lsb = 25000, .power_lsb_factor = 25,
}, },
}; };
@ -168,12 +170,16 @@ static u16 ina226_interval_to_reg(int interval)
return INA226_SHIFT_AVG(avg_bits); return INA226_SHIFT_AVG(avg_bits);
} }
/*
* Calibration register is set to the best value, which eliminates
* truncation errors on calculating current register in hardware.
* According to datasheet (eq. 3) the best values are 2048 for
* ina226 and 4096 for ina219. They are hardcoded as calibration_value.
*/
static int ina2xx_calibrate(struct ina2xx_data *data) static int ina2xx_calibrate(struct ina2xx_data *data)
{ {
u16 val = DIV_ROUND_CLOSEST(data->config->calibration_factor, return regmap_write(data->regmap, INA2XX_CALIBRATION,
data->rshunt); data->config->calibration_value);
return regmap_write(data->regmap, INA2XX_CALIBRATION, val);
} }
/* /*
@ -186,10 +192,6 @@ static int ina2xx_init(struct ina2xx_data *data)
if (ret < 0) if (ret < 0)
return ret; return ret;
/*
* Set current LSB to 1mA, shunt is in uOhms
* (equation 13 in datasheet).
*/
return ina2xx_calibrate(data); return ina2xx_calibrate(data);
} }
@ -267,15 +269,15 @@ static int ina2xx_get_value(struct ina2xx_data *data, u8 reg,
val = DIV_ROUND_CLOSEST(val, 1000); val = DIV_ROUND_CLOSEST(val, 1000);
break; break;
case INA2XX_POWER: case INA2XX_POWER:
val = regval * data->config->power_lsb; val = regval * data->power_lsb_uW;
break; break;
case INA2XX_CURRENT: case INA2XX_CURRENT:
/* signed register, LSB=1mA (selected), in mA */ /* signed register, result in mA */
val = (s16)regval; val = regval * data->current_lsb_uA;
val = DIV_ROUND_CLOSEST(val, 1000);
break; break;
case INA2XX_CALIBRATION: case INA2XX_CALIBRATION:
val = DIV_ROUND_CLOSEST(data->config->calibration_factor, val = regval;
regval);
break; break;
default: default:
/* programmer goofed */ /* programmer goofed */
@ -303,9 +305,32 @@ static ssize_t ina2xx_show_value(struct device *dev,
ina2xx_get_value(data, attr->index, regval)); ina2xx_get_value(data, attr->index, regval));
} }
static ssize_t ina2xx_set_shunt(struct device *dev, /*
struct device_attribute *da, * In order to keep calibration register value fixed, the product
const char *buf, size_t count) * of current_lsb and shunt_resistor should also be fixed and equal
* to shunt_voltage_lsb = 1 / shunt_div multiplied by 10^9 in order
* to keep the scale.
*/
static int ina2xx_set_shunt(struct ina2xx_data *data, long val)
{
unsigned int dividend = DIV_ROUND_CLOSEST(1000000000,
data->config->shunt_div);
if (val <= 0 || val > dividend)
return -EINVAL;
mutex_lock(&data->config_lock);
data->rshunt = val;
data->current_lsb_uA = DIV_ROUND_CLOSEST(dividend, val);
data->power_lsb_uW = data->config->power_lsb_factor *
data->current_lsb_uA;
mutex_unlock(&data->config_lock);
return 0;
}
static ssize_t ina2xx_store_shunt(struct device *dev,
struct device_attribute *da,
const char *buf, size_t count)
{ {
unsigned long val; unsigned long val;
int status; int status;
@ -315,18 +340,9 @@ static ssize_t ina2xx_set_shunt(struct device *dev,
if (status < 0) if (status < 0)
return status; return status;
if (val == 0 || status = ina2xx_set_shunt(data, val);
/* Values greater than the calibration factor make no sense. */
val > data->config->calibration_factor)
return -EINVAL;
mutex_lock(&data->config_lock);
data->rshunt = val;
status = ina2xx_calibrate(data);
mutex_unlock(&data->config_lock);
if (status < 0) if (status < 0)
return status; return status;
return count; return count;
} }
@ -386,7 +402,7 @@ static SENSOR_DEVICE_ATTR(power1_input, S_IRUGO, ina2xx_show_value, NULL,
/* shunt resistance */ /* shunt resistance */
static SENSOR_DEVICE_ATTR(shunt_resistor, S_IRUGO | S_IWUSR, static SENSOR_DEVICE_ATTR(shunt_resistor, S_IRUGO | S_IWUSR,
ina2xx_show_value, ina2xx_set_shunt, ina2xx_show_value, ina2xx_store_shunt,
INA2XX_CALIBRATION); INA2XX_CALIBRATION);
/* update interval (ina226 only) */ /* update interval (ina226 only) */
@ -441,10 +457,7 @@ static int ina2xx_probe(struct i2c_client *client,
val = INA2XX_RSHUNT_DEFAULT; val = INA2XX_RSHUNT_DEFAULT;
} }
if (val <= 0 || val > data->config->calibration_factor) ina2xx_set_shunt(data, val);
return -ENODEV;
data->rshunt = val;
ina2xx_regmap_config.max_register = data->config->registers; ina2xx_regmap_config.max_register = data->config->registers;

View file

@ -121,10 +121,21 @@ static int hi8435_write_event_config(struct iio_dev *idev,
enum iio_event_direction dir, int state) enum iio_event_direction dir, int state)
{ {
struct hi8435_priv *priv = iio_priv(idev); struct hi8435_priv *priv = iio_priv(idev);
int ret;
u32 tmp;
if (state) {
ret = hi8435_readl(priv, HI8435_SO31_0_REG, &tmp);
if (ret < 0)
return ret;
if (tmp & BIT(chan->channel))
priv->event_prev_val |= BIT(chan->channel);
else
priv->event_prev_val &= ~BIT(chan->channel);
priv->event_scan_mask &= ~BIT(chan->channel);
if (state)
priv->event_scan_mask |= BIT(chan->channel); priv->event_scan_mask |= BIT(chan->channel);
} else
priv->event_scan_mask &= ~BIT(chan->channel);
return 0; return 0;
} }
@ -442,13 +453,15 @@ static int hi8435_probe(struct spi_device *spi)
priv->spi = spi; priv->spi = spi;
reset_gpio = devm_gpiod_get(&spi->dev, NULL, GPIOD_OUT_LOW); reset_gpio = devm_gpiod_get(&spi->dev, NULL, GPIOD_OUT_LOW);
if (IS_ERR(reset_gpio)) { if (!IS_ERR(reset_gpio)) {
/* chip s/w reset if h/w reset failed */ /* need >=100ns low pulse to reset chip */
gpiod_set_raw_value_cansleep(reset_gpio, 0);
udelay(1);
gpiod_set_raw_value_cansleep(reset_gpio, 1);
} else {
/* s/w reset chip if h/w reset is not available */
hi8435_writeb(priv, HI8435_CTRL_REG, HI8435_CTRL_SRST); hi8435_writeb(priv, HI8435_CTRL_REG, HI8435_CTRL_SRST);
hi8435_writeb(priv, HI8435_CTRL_REG, 0); hi8435_writeb(priv, HI8435_CTRL_REG, 0);
} else {
udelay(5);
gpiod_set_value(reset_gpio, 1);
} }
spi_set_drvdata(spi, idev); spi_set_drvdata(spi, idev);

View file

@ -48,8 +48,6 @@ static int st_magn_spi_remove(struct spi_device *spi)
} }
static const struct spi_device_id st_magn_id_table[] = { static const struct spi_device_id st_magn_id_table[] = {
{ LSM303DLHC_MAGN_DEV_NAME },
{ LSM303DLM_MAGN_DEV_NAME },
{ LIS3MDL_MAGN_DEV_NAME }, { LIS3MDL_MAGN_DEV_NAME },
{ LSM303AGR_MAGN_DEV_NAME }, { LSM303AGR_MAGN_DEV_NAME },
{}, {},

View file

@ -2974,12 +2974,8 @@ static void srpt_queue_response(struct se_cmd *cmd)
} }
spin_unlock_irqrestore(&ioctx->spinlock, flags); spin_unlock_irqrestore(&ioctx->spinlock, flags);
if (unlikely(transport_check_aborted_status(&ioctx->cmd, false) if (unlikely(WARN_ON_ONCE(state == SRPT_STATE_CMD_RSP_SENT)))
|| WARN_ON_ONCE(state == SRPT_STATE_CMD_RSP_SENT))) {
atomic_inc(&ch->req_lim_delta);
srpt_abort_cmd(ioctx);
return; return;
}
dir = ioctx->cmd.data_direction; dir = ioctx->cmd.data_direction;

View file

@ -1082,6 +1082,13 @@ static int elan_probe(struct i2c_client *client,
return error; return error;
} }
/* Make sure there is something at this address */
error = i2c_smbus_read_byte(client);
if (error < 0) {
dev_dbg(&client->dev, "nothing at this address: %d\n", error);
return -ENXIO;
}
/* Initialize the touchpad. */ /* Initialize the touchpad. */
error = elan_initialize(data); error = elan_initialize(data);
if (error) if (error)

View file

@ -557,7 +557,14 @@ static int elan_i2c_finish_fw_update(struct i2c_client *client,
long ret; long ret;
int error; int error;
int len; int len;
u8 buffer[ETP_I2C_INF_LENGTH]; u8 buffer[ETP_I2C_REPORT_LEN];
len = i2c_master_recv(client, buffer, ETP_I2C_REPORT_LEN);
if (len != ETP_I2C_REPORT_LEN) {
error = len < 0 ? len : -EIO;
dev_warn(dev, "failed to read I2C data after FW WDT reset: %d (%d)\n",
error, len);
}
reinit_completion(completion); reinit_completion(completion);
enable_irq(client->irq); enable_irq(client->irq);

View file

@ -1715,6 +1715,17 @@ int elantech_init(struct psmouse *psmouse)
etd->samples[0], etd->samples[1], etd->samples[2]); etd->samples[0], etd->samples[1], etd->samples[2]);
} }
if (etd->samples[1] == 0x74 && etd->hw_version == 0x03) {
/*
* This module has a bug which makes absolute mode
* unusable, so let's abort so we'll be using standard
* PS/2 protocol.
*/
psmouse_info(psmouse,
"absolute mode broken, forcing standard PS/2 protocol\n");
goto init_fail;
}
if (elantech_set_absolute_mode(psmouse)) { if (elantech_set_absolute_mode(psmouse)) {
psmouse_err(psmouse, psmouse_err(psmouse,
"failed to put touchpad into absolute mode.\n"); "failed to put touchpad into absolute mode.\n");

View file

@ -72,7 +72,7 @@ send_socklist(struct mISDN_sock_list *sl, struct sk_buff *skb)
if (sk->sk_state != MISDN_BOUND) if (sk->sk_state != MISDN_BOUND)
continue; continue;
if (!cskb) if (!cskb)
cskb = skb_copy(skb, GFP_KERNEL); cskb = skb_copy(skb, GFP_ATOMIC);
if (!cskb) { if (!cskb) {
printk(KERN_WARNING "%s no skb\n", __func__); printk(KERN_WARNING "%s no skb\n", __func__);
break; break;

View file

@ -281,7 +281,7 @@ static int pca955x_probe(struct i2c_client *client,
"slave address 0x%02x\n", "slave address 0x%02x\n",
id->name, chip->bits, client->addr); id->name, chip->bits, client->addr);
if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
return -EIO; return -EIO;
if (pdata) { if (pdata) {

View file

@ -514,15 +514,21 @@ struct open_bucket {
/* /*
* We keep multiple buckets open for writes, and try to segregate different * We keep multiple buckets open for writes, and try to segregate different
* write streams for better cache utilization: first we look for a bucket where * write streams for better cache utilization: first we try to segregate flash
* the last write to it was sequential with the current write, and failing that * only volume write streams from cached devices, secondly we look for a bucket
* we look for a bucket that was last used by the same task. * where the last write to it was sequential with the current write, and
* failing that we look for a bucket that was last used by the same task.
* *
* The ideas is if you've got multiple tasks pulling data into the cache at the * The ideas is if you've got multiple tasks pulling data into the cache at the
* same time, you'll get better cache utilization if you try to segregate their * same time, you'll get better cache utilization if you try to segregate their
* data and preserve locality. * data and preserve locality.
* *
* For example, say you've starting Firefox at the same time you're copying a * For example, dirty sectors of flash only volume is not reclaimable, if their
* dirty sectors mixed with dirty sectors of cached device, such buckets will
* be marked as dirty and won't be reclaimed, though the dirty data of cached
* device have been written back to backend device.
*
* And say you've starting Firefox at the same time you're copying a
* bunch of files. Firefox will likely end up being fairly hot and stay in the * bunch of files. Firefox will likely end up being fairly hot and stay in the
* cache awhile, but the data you copied might not be; if you wrote all that * cache awhile, but the data you copied might not be; if you wrote all that
* data to the same buckets it'd get invalidated at the same time. * data to the same buckets it'd get invalidated at the same time.
@ -539,7 +545,10 @@ static struct open_bucket *pick_data_bucket(struct cache_set *c,
struct open_bucket *ret, *ret_task = NULL; struct open_bucket *ret, *ret_task = NULL;
list_for_each_entry_reverse(ret, &c->data_buckets, list) list_for_each_entry_reverse(ret, &c->data_buckets, list)
if (!bkey_cmp(&ret->key, search)) if (UUID_FLASH_ONLY(&c->uuids[KEY_INODE(&ret->key)]) !=
UUID_FLASH_ONLY(&c->uuids[KEY_INODE(search)]))
continue;
else if (!bkey_cmp(&ret->key, search))
goto found; goto found;
else if (ret->last_write_point == write_point) else if (ret->last_write_point == write_point)
ret_task = ret; ret_task = ret;

View file

@ -890,6 +890,12 @@ static void cached_dev_detach_finish(struct work_struct *w)
mutex_lock(&bch_register_lock); mutex_lock(&bch_register_lock);
cancel_delayed_work_sync(&dc->writeback_rate_update);
if (!IS_ERR_OR_NULL(dc->writeback_thread)) {
kthread_stop(dc->writeback_thread);
dc->writeback_thread = NULL;
}
memset(&dc->sb.set_uuid, 0, 16); memset(&dc->sb.set_uuid, 0, 16);
SET_BDEV_STATE(&dc->sb, BDEV_STATE_NONE); SET_BDEV_STATE(&dc->sb, BDEV_STATE_NONE);

View file

@ -945,8 +945,10 @@ static int add_new_disk(struct mddev *mddev, struct md_rdev *rdev)
cmsg.raid_slot = cpu_to_le32(rdev->desc_nr); cmsg.raid_slot = cpu_to_le32(rdev->desc_nr);
lock_comm(cinfo); lock_comm(cinfo);
ret = __sendmsg(cinfo, &cmsg); ret = __sendmsg(cinfo, &cmsg);
if (ret) if (ret) {
unlock_comm(cinfo);
return ret; return ret;
}
cinfo->no_new_dev_lockres->flags |= DLM_LKF_NOQUEUE; cinfo->no_new_dev_lockres->flags |= DLM_LKF_NOQUEUE;
ret = dlm_lock_sync(cinfo->no_new_dev_lockres, DLM_LOCK_EX); ret = dlm_lock_sync(cinfo->no_new_dev_lockres, DLM_LOCK_EX);
cinfo->no_new_dev_lockres->flags &= ~DLM_LKF_NOQUEUE; cinfo->no_new_dev_lockres->flags &= ~DLM_LKF_NOQUEUE;

View file

@ -110,8 +110,7 @@ static inline void unlock_device_hash_lock(struct r5conf *conf, int hash)
static inline void lock_all_device_hash_locks_irq(struct r5conf *conf) static inline void lock_all_device_hash_locks_irq(struct r5conf *conf)
{ {
int i; int i;
local_irq_disable(); spin_lock_irq(conf->hash_locks);
spin_lock(conf->hash_locks);
for (i = 1; i < NR_STRIPE_HASH_LOCKS; i++) for (i = 1; i < NR_STRIPE_HASH_LOCKS; i++)
spin_lock_nest_lock(conf->hash_locks + i, conf->hash_locks); spin_lock_nest_lock(conf->hash_locks + i, conf->hash_locks);
spin_lock(&conf->device_lock); spin_lock(&conf->device_lock);
@ -121,9 +120,9 @@ static inline void unlock_all_device_hash_locks_irq(struct r5conf *conf)
{ {
int i; int i;
spin_unlock(&conf->device_lock); spin_unlock(&conf->device_lock);
for (i = NR_STRIPE_HASH_LOCKS; i; i--) for (i = NR_STRIPE_HASH_LOCKS - 1; i; i--)
spin_unlock(conf->hash_locks + i - 1); spin_unlock(conf->hash_locks + i);
local_irq_enable(); spin_unlock_irq(conf->hash_locks);
} }
/* bio's attached to a stripe+device for I/O are linked together in bi_sector /* bio's attached to a stripe+device for I/O are linked together in bi_sector
@ -726,12 +725,11 @@ static bool is_full_stripe_write(struct stripe_head *sh)
static void lock_two_stripes(struct stripe_head *sh1, struct stripe_head *sh2) static void lock_two_stripes(struct stripe_head *sh1, struct stripe_head *sh2)
{ {
local_irq_disable();
if (sh1 > sh2) { if (sh1 > sh2) {
spin_lock(&sh2->stripe_lock); spin_lock_irq(&sh2->stripe_lock);
spin_lock_nested(&sh1->stripe_lock, 1); spin_lock_nested(&sh1->stripe_lock, 1);
} else { } else {
spin_lock(&sh1->stripe_lock); spin_lock_irq(&sh1->stripe_lock);
spin_lock_nested(&sh2->stripe_lock, 1); spin_lock_nested(&sh2->stripe_lock, 1);
} }
} }
@ -739,8 +737,7 @@ static void lock_two_stripes(struct stripe_head *sh1, struct stripe_head *sh2)
static void unlock_two_stripes(struct stripe_head *sh1, struct stripe_head *sh2) static void unlock_two_stripes(struct stripe_head *sh1, struct stripe_head *sh2)
{ {
spin_unlock(&sh1->stripe_lock); spin_unlock(&sh1->stripe_lock);
spin_unlock(&sh2->stripe_lock); spin_unlock_irq(&sh2->stripe_lock);
local_irq_enable();
} }
/* Only freshly new full stripe normal write stripe can be added to a batch list */ /* Only freshly new full stripe normal write stripe can be added to a batch list */

View file

@ -420,11 +420,13 @@ static void cx25840_initialize(struct i2c_client *client)
INIT_WORK(&state->fw_work, cx25840_work_handler); INIT_WORK(&state->fw_work, cx25840_work_handler);
init_waitqueue_head(&state->fw_wait); init_waitqueue_head(&state->fw_wait);
q = create_singlethread_workqueue("cx25840_fw"); q = create_singlethread_workqueue("cx25840_fw");
prepare_to_wait(&state->fw_wait, &wait, TASK_UNINTERRUPTIBLE); if (q) {
queue_work(q, &state->fw_work); prepare_to_wait(&state->fw_wait, &wait, TASK_UNINTERRUPTIBLE);
schedule(); queue_work(q, &state->fw_work);
finish_wait(&state->fw_wait, &wait); schedule();
destroy_workqueue(q); finish_wait(&state->fw_wait, &wait);
destroy_workqueue(q);
}
/* 6. */ /* 6. */
cx25840_write(client, 0x115, 0x8c); cx25840_write(client, 0x115, 0x8c);
@ -631,11 +633,13 @@ static void cx23885_initialize(struct i2c_client *client)
INIT_WORK(&state->fw_work, cx25840_work_handler); INIT_WORK(&state->fw_work, cx25840_work_handler);
init_waitqueue_head(&state->fw_wait); init_waitqueue_head(&state->fw_wait);
q = create_singlethread_workqueue("cx25840_fw"); q = create_singlethread_workqueue("cx25840_fw");
prepare_to_wait(&state->fw_wait, &wait, TASK_UNINTERRUPTIBLE); if (q) {
queue_work(q, &state->fw_work); prepare_to_wait(&state->fw_wait, &wait, TASK_UNINTERRUPTIBLE);
schedule(); queue_work(q, &state->fw_work);
finish_wait(&state->fw_wait, &wait); schedule();
destroy_workqueue(q); finish_wait(&state->fw_wait, &wait);
destroy_workqueue(q);
}
/* Call the cx23888 specific std setup func, we no longer rely on /* Call the cx23888 specific std setup func, we no longer rely on
* the generic cx24840 func. * the generic cx24840 func.
@ -746,11 +750,13 @@ static void cx231xx_initialize(struct i2c_client *client)
INIT_WORK(&state->fw_work, cx25840_work_handler); INIT_WORK(&state->fw_work, cx25840_work_handler);
init_waitqueue_head(&state->fw_wait); init_waitqueue_head(&state->fw_wait);
q = create_singlethread_workqueue("cx25840_fw"); q = create_singlethread_workqueue("cx25840_fw");
prepare_to_wait(&state->fw_wait, &wait, TASK_UNINTERRUPTIBLE); if (q) {
queue_work(q, &state->fw_work); prepare_to_wait(&state->fw_wait, &wait, TASK_UNINTERRUPTIBLE);
schedule(); queue_work(q, &state->fw_work);
finish_wait(&state->fw_wait, &wait); schedule();
destroy_workqueue(q); finish_wait(&state->fw_wait, &wait);
destroy_workqueue(q);
}
cx25840_std_setup(client); cx25840_std_setup(client);

View file

@ -1370,8 +1370,13 @@ static int mceusb_dev_probe(struct usb_interface *intf,
goto rc_dev_fail; goto rc_dev_fail;
/* wire up inbound data handler */ /* wire up inbound data handler */
usb_fill_int_urb(ir->urb_in, dev, pipe, ir->buf_in, maxp, if (usb_endpoint_xfer_int(ep_in))
mceusb_dev_recv, ir, ep_in->bInterval); usb_fill_int_urb(ir->urb_in, dev, pipe, ir->buf_in, maxp,
mceusb_dev_recv, ir, ep_in->bInterval);
else
usb_fill_bulk_urb(ir->urb_in, dev, pipe, ir->buf_in, maxp,
mceusb_dev_recv, ir);
ir->urb_in->transfer_dma = ir->dma_in; ir->urb_in->transfer_dma = ir->dma_in;
ir->urb_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; ir->urb_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;

View file

@ -205,6 +205,10 @@ static int __vb2_queue_alloc(struct vb2_queue *q, enum vb2_memory memory,
struct vb2_buffer *vb; struct vb2_buffer *vb;
int ret; int ret;
/* Ensure that q->num_buffers+num_buffers is below VB2_MAX_FRAME */
num_buffers = min_t(unsigned int, num_buffers,
VB2_MAX_FRAME - q->num_buffers);
for (buffer = 0; buffer < num_buffers; ++buffer) { for (buffer = 0; buffer < num_buffers; ++buffer) {
/* Allocate videobuf buffer structures */ /* Allocate videobuf buffer structures */
vb = kzalloc(q->buf_struct_size, GFP_KERNEL); vb = kzalloc(q->buf_struct_size, GFP_KERNEL);

View file

@ -298,8 +298,11 @@ static void *qp_alloc_queue(u64 size, u32 flags)
size_t pas_size; size_t pas_size;
size_t vas_size; size_t vas_size;
size_t queue_size = sizeof(*queue) + sizeof(*queue->kernel_if); size_t queue_size = sizeof(*queue) + sizeof(*queue->kernel_if);
const u64 num_pages = DIV_ROUND_UP(size, PAGE_SIZE) + 1; u64 num_pages;
if (size > SIZE_MAX - PAGE_SIZE)
return NULL;
num_pages = DIV_ROUND_UP(size, PAGE_SIZE) + 1;
if (num_pages > if (num_pages >
(SIZE_MAX - queue_size) / (SIZE_MAX - queue_size) /
(sizeof(*queue->kernel_if->u.g.pas) + (sizeof(*queue->kernel_if->u.g.pas) +
@ -624,9 +627,12 @@ static struct vmci_queue *qp_host_alloc_queue(u64 size)
{ {
struct vmci_queue *queue; struct vmci_queue *queue;
size_t queue_page_size; size_t queue_page_size;
const u64 num_pages = DIV_ROUND_UP(size, PAGE_SIZE) + 1; u64 num_pages;
const size_t queue_size = sizeof(*queue) + sizeof(*(queue->kernel_if)); const size_t queue_size = sizeof(*queue) + sizeof(*(queue->kernel_if));
if (size > SIZE_MAX - PAGE_SIZE)
return NULL;
num_pages = DIV_ROUND_UP(size, PAGE_SIZE) + 1;
if (num_pages > (SIZE_MAX - queue_size) / if (num_pages > (SIZE_MAX - queue_size) /
sizeof(*queue->kernel_if->u.h.page)) sizeof(*queue->kernel_if->u.h.page))
return NULL; return NULL;

View file

@ -1490,39 +1490,6 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
goto err_close; goto err_close;
} }
/* If the mode uses primary, then the following is handled by
* bond_change_active_slave().
*/
if (!bond_uses_primary(bond)) {
/* set promiscuity level to new slave */
if (bond_dev->flags & IFF_PROMISC) {
res = dev_set_promiscuity(slave_dev, 1);
if (res)
goto err_close;
}
/* set allmulti level to new slave */
if (bond_dev->flags & IFF_ALLMULTI) {
res = dev_set_allmulti(slave_dev, 1);
if (res)
goto err_close;
}
netif_addr_lock_bh(bond_dev);
dev_mc_sync_multiple(slave_dev, bond_dev);
dev_uc_sync_multiple(slave_dev, bond_dev);
netif_addr_unlock_bh(bond_dev);
}
if (BOND_MODE(bond) == BOND_MODE_8023AD) {
/* add lacpdu mc addr to mc list */
u8 lacpdu_multicast[ETH_ALEN] = MULTICAST_LACPDU_ADDR;
dev_mc_add(slave_dev, lacpdu_multicast);
}
res = vlan_vids_add_by_dev(slave_dev, bond_dev); res = vlan_vids_add_by_dev(slave_dev, bond_dev);
if (res) { if (res) {
netdev_err(bond_dev, "Couldn't add bond vlan ids to %s\n", netdev_err(bond_dev, "Couldn't add bond vlan ids to %s\n",
@ -1679,6 +1646,40 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
goto err_upper_unlink; goto err_upper_unlink;
} }
/* If the mode uses primary, then the following is handled by
* bond_change_active_slave().
*/
if (!bond_uses_primary(bond)) {
/* set promiscuity level to new slave */
if (bond_dev->flags & IFF_PROMISC) {
res = dev_set_promiscuity(slave_dev, 1);
if (res)
goto err_sysfs_del;
}
/* set allmulti level to new slave */
if (bond_dev->flags & IFF_ALLMULTI) {
res = dev_set_allmulti(slave_dev, 1);
if (res) {
if (bond_dev->flags & IFF_PROMISC)
dev_set_promiscuity(slave_dev, -1);
goto err_sysfs_del;
}
}
netif_addr_lock_bh(bond_dev);
dev_mc_sync_multiple(slave_dev, bond_dev);
dev_uc_sync_multiple(slave_dev, bond_dev);
netif_addr_unlock_bh(bond_dev);
if (BOND_MODE(bond) == BOND_MODE_8023AD) {
/* add lacpdu mc addr to mc list */
u8 lacpdu_multicast[ETH_ALEN] = MULTICAST_LACPDU_ADDR;
dev_mc_add(slave_dev, lacpdu_multicast);
}
}
bond->slave_cnt++; bond->slave_cnt++;
bond_compute_features(bond); bond_compute_features(bond);
bond_set_carrier(bond); bond_set_carrier(bond);
@ -1702,6 +1703,9 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
return 0; return 0;
/* Undo stages on error */ /* Undo stages on error */
err_sysfs_del:
bond_sysfs_slave_del(new_slave);
err_upper_unlink: err_upper_unlink:
bond_upper_dev_unlink(bond_dev, slave_dev); bond_upper_dev_unlink(bond_dev, slave_dev);
@ -1709,9 +1713,6 @@ err_unregister:
netdev_rx_handler_unregister(slave_dev); netdev_rx_handler_unregister(slave_dev);
err_detach: err_detach:
if (!bond_uses_primary(bond))
bond_hw_addr_flush(bond_dev, slave_dev);
vlan_vids_del_by_dev(slave_dev, bond_dev); vlan_vids_del_by_dev(slave_dev, bond_dev);
if (rcu_access_pointer(bond->primary_slave) == new_slave) if (rcu_access_pointer(bond->primary_slave) == new_slave)
RCU_INIT_POINTER(bond->primary_slave, NULL); RCU_INIT_POINTER(bond->primary_slave, NULL);
@ -2555,11 +2556,13 @@ static void bond_loadbalance_arp_mon(struct work_struct *work)
bond_for_each_slave_rcu(bond, slave, iter) { bond_for_each_slave_rcu(bond, slave, iter) {
unsigned long trans_start = dev_trans_start(slave->dev); unsigned long trans_start = dev_trans_start(slave->dev);
slave->new_link = BOND_LINK_NOCHANGE;
if (slave->link != BOND_LINK_UP) { if (slave->link != BOND_LINK_UP) {
if (bond_time_in_interval(bond, trans_start, 1) && if (bond_time_in_interval(bond, trans_start, 1) &&
bond_time_in_interval(bond, slave->last_rx, 1)) { bond_time_in_interval(bond, slave->last_rx, 1)) {
slave->link = BOND_LINK_UP; slave->new_link = BOND_LINK_UP;
slave_state_changed = 1; slave_state_changed = 1;
/* primary_slave has no meaning in round-robin /* primary_slave has no meaning in round-robin
@ -2586,7 +2589,7 @@ static void bond_loadbalance_arp_mon(struct work_struct *work)
if (!bond_time_in_interval(bond, trans_start, 2) || if (!bond_time_in_interval(bond, trans_start, 2) ||
!bond_time_in_interval(bond, slave->last_rx, 2)) { !bond_time_in_interval(bond, slave->last_rx, 2)) {
slave->link = BOND_LINK_DOWN; slave->new_link = BOND_LINK_DOWN;
slave_state_changed = 1; slave_state_changed = 1;
if (slave->link_failure_count < UINT_MAX) if (slave->link_failure_count < UINT_MAX)
@ -2617,6 +2620,11 @@ static void bond_loadbalance_arp_mon(struct work_struct *work)
if (!rtnl_trylock()) if (!rtnl_trylock())
goto re_arm; goto re_arm;
bond_for_each_slave(bond, slave, iter) {
if (slave->new_link != BOND_LINK_NOCHANGE)
slave->link = slave->new_link;
}
if (slave_state_changed) { if (slave_state_changed) {
bond_slave_state_change(bond); bond_slave_state_change(bond);
if (BOND_MODE(bond) == BOND_MODE_XOR) if (BOND_MODE(bond) == BOND_MODE_XOR)

View file

@ -3943,15 +3943,26 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev)
/* when transmitting in a vf, start bd must hold the ethertype /* when transmitting in a vf, start bd must hold the ethertype
* for fw to enforce it * for fw to enforce it
*/ */
u16 vlan_tci = 0;
#ifndef BNX2X_STOP_ON_ERROR #ifndef BNX2X_STOP_ON_ERROR
if (IS_VF(bp)) if (IS_VF(bp)) {
#endif #endif
tx_start_bd->vlan_or_ethertype = /* Still need to consider inband vlan for enforced */
cpu_to_le16(ntohs(eth->h_proto)); if (__vlan_get_tag(skb, &vlan_tci)) {
tx_start_bd->vlan_or_ethertype =
cpu_to_le16(ntohs(eth->h_proto));
} else {
tx_start_bd->bd_flags.as_bitfield |=
(X_ETH_INBAND_VLAN <<
ETH_TX_BD_FLAGS_VLAN_MODE_SHIFT);
tx_start_bd->vlan_or_ethertype =
cpu_to_le16(vlan_tci);
}
#ifndef BNX2X_STOP_ON_ERROR #ifndef BNX2X_STOP_ON_ERROR
else } else {
/* used by FW for packet accounting */ /* used by FW for packet accounting */
tx_start_bd->vlan_or_ethertype = cpu_to_le16(pkt_prod); tx_start_bd->vlan_or_ethertype = cpu_to_le16(pkt_prod);
}
#endif #endif
} }

View file

@ -2845,7 +2845,7 @@ bfa_ioc_get_adapter_optrom_ver(struct bfa_ioc *ioc, char *optrom_ver)
static void static void
bfa_ioc_get_adapter_manufacturer(struct bfa_ioc *ioc, char *manufacturer) bfa_ioc_get_adapter_manufacturer(struct bfa_ioc *ioc, char *manufacturer)
{ {
memcpy(manufacturer, BFA_MFG_NAME, BFA_ADAPTER_MFG_NAME_LEN); strncpy(manufacturer, BFA_MFG_NAME, BFA_ADAPTER_MFG_NAME_LEN);
} }
static void static void

View file

@ -6076,13 +6076,18 @@ int t4_fw_upgrade(struct adapter *adap, unsigned int mbox,
if (!t4_fw_matches_chip(adap, fw_hdr)) if (!t4_fw_matches_chip(adap, fw_hdr))
return -EINVAL; return -EINVAL;
/* Disable FW_OK flag so that mbox commands with FW_OK flag set
* wont be sent when we are flashing FW.
*/
adap->flags &= ~FW_OK;
ret = t4_fw_halt(adap, mbox, force); ret = t4_fw_halt(adap, mbox, force);
if (ret < 0 && !force) if (ret < 0 && !force)
return ret; goto out;
ret = t4_load_fw(adap, fw_data, size); ret = t4_load_fw(adap, fw_data, size);
if (ret < 0) if (ret < 0)
return ret; goto out;
/* /*
* Older versions of the firmware don't understand the new * Older versions of the firmware don't understand the new
@ -6093,7 +6098,17 @@ int t4_fw_upgrade(struct adapter *adap, unsigned int mbox,
* its header flags to see if it advertises the capability. * its header flags to see if it advertises the capability.
*/ */
reset = ((be32_to_cpu(fw_hdr->flags) & FW_HDR_FLAGS_RESET_HALT) == 0); reset = ((be32_to_cpu(fw_hdr->flags) & FW_HDR_FLAGS_RESET_HALT) == 0);
return t4_fw_restart(adap, mbox, reset); ret = t4_fw_restart(adap, mbox, reset);
/* Grab potentially new Firmware Device Log parameters so we can see
* how healthy the new Firmware is. It's okay to contact the new
* Firmware for these parameters even though, as far as it's
* concerned, we've never said "HELLO" to it ...
*/
(void)t4_init_devlog_params(adap);
out:
adap->flags |= FW_OK;
return ret;
} }
/** /**
@ -7696,7 +7711,16 @@ int t4_cim_read_la(struct adapter *adap, u32 *la_buf, unsigned int *wrptr)
ret = t4_cim_read(adap, UP_UP_DBG_LA_DATA_A, 1, &la_buf[i]); ret = t4_cim_read(adap, UP_UP_DBG_LA_DATA_A, 1, &la_buf[i]);
if (ret) if (ret)
break; break;
idx = (idx + 1) & UPDBGLARDPTR_M;
/* Bits 0-3 of UpDbgLaRdPtr can be between 0000 to 1001 to
* identify the 32-bit portion of the full 312-bit data
*/
if (is_t6(adap->params.chip) && (idx & 0xf) >= 9)
idx = (idx & 0xff0) + 0x10;
else
idx++;
/* address can't exceed 0xfff */
idx &= UPDBGLARDPTR_M;
} }
restart: restart:
if (cfg & UPDBGLAEN_F) { if (cfg & UPDBGLAEN_F) {

View file

@ -2604,8 +2604,8 @@ void t4vf_sge_stop(struct adapter *adapter)
int t4vf_sge_init(struct adapter *adapter) int t4vf_sge_init(struct adapter *adapter)
{ {
struct sge_params *sge_params = &adapter->params.sge; struct sge_params *sge_params = &adapter->params.sge;
u32 fl0 = sge_params->sge_fl_buffer_size[0]; u32 fl_small_pg = sge_params->sge_fl_buffer_size[0];
u32 fl1 = sge_params->sge_fl_buffer_size[1]; u32 fl_large_pg = sge_params->sge_fl_buffer_size[1];
struct sge *s = &adapter->sge; struct sge *s = &adapter->sge;
unsigned int ingpadboundary, ingpackboundary; unsigned int ingpadboundary, ingpackboundary;
@ -2614,9 +2614,20 @@ int t4vf_sge_init(struct adapter *adapter)
* the Physical Function Driver. Ideally we should be able to deal * the Physical Function Driver. Ideally we should be able to deal
* with _any_ configuration. Practice is different ... * with _any_ configuration. Practice is different ...
*/ */
if (fl0 != PAGE_SIZE || (fl1 != 0 && fl1 <= fl0)) {
/* We only bother using the Large Page logic if the Large Page Buffer
* is larger than our Page Size Buffer.
*/
if (fl_large_pg <= fl_small_pg)
fl_large_pg = 0;
/* The Page Size Buffer must be exactly equal to our Page Size and the
* Large Page Size Buffer should be 0 (per above) or a power of 2.
*/
if (fl_small_pg != PAGE_SIZE ||
(fl_large_pg & (fl_large_pg - 1)) != 0) {
dev_err(adapter->pdev_dev, "bad SGE FL buffer sizes [%d, %d]\n", dev_err(adapter->pdev_dev, "bad SGE FL buffer sizes [%d, %d]\n",
fl0, fl1); fl_small_pg, fl_large_pg);
return -EINVAL; return -EINVAL;
} }
if ((sge_params->sge_control & RXPKTCPLMODE_F) == 0) { if ((sge_params->sge_control & RXPKTCPLMODE_F) == 0) {
@ -2627,8 +2638,8 @@ int t4vf_sge_init(struct adapter *adapter)
/* /*
* Now translate the adapter parameters into our internal forms. * Now translate the adapter parameters into our internal forms.
*/ */
if (fl1) if (fl_large_pg)
s->fl_pg_order = ilog2(fl1) - PAGE_SHIFT; s->fl_pg_order = ilog2(fl_large_pg) - PAGE_SHIFT;
s->stat_len = ((sge_params->sge_control & EGRSTATUSPAGESIZE_F) s->stat_len = ((sge_params->sge_control & EGRSTATUSPAGESIZE_F)
? 128 : 64); ? 128 : 64);
s->pktshift = PKTSHIFT_G(sge_params->sge_control); s->pktshift = PKTSHIFT_G(sge_params->sge_control);

View file

@ -382,7 +382,7 @@ static int fsl_pq_mdio_probe(struct platform_device *pdev)
{ {
const struct of_device_id *id = const struct of_device_id *id =
of_match_device(fsl_pq_mdio_match, &pdev->dev); of_match_device(fsl_pq_mdio_match, &pdev->dev);
const struct fsl_pq_mdio_data *data = id->data; const struct fsl_pq_mdio_data *data;
struct device_node *np = pdev->dev.of_node; struct device_node *np = pdev->dev.of_node;
struct resource res; struct resource res;
struct device_node *tbi; struct device_node *tbi;
@ -390,6 +390,13 @@ static int fsl_pq_mdio_probe(struct platform_device *pdev)
struct mii_bus *new_bus; struct mii_bus *new_bus;
int err; int err;
if (!id) {
dev_err(&pdev->dev, "Failed to match device\n");
return -ENODEV;
}
data = id->data;
dev_dbg(&pdev->dev, "found %s compatible node\n", id->compatible); dev_dbg(&pdev->dev, "found %s compatible node\n", id->compatible);
new_bus = mdiobus_alloc_size(sizeof(*priv)); new_bus = mdiobus_alloc_size(sizeof(*priv));

View file

@ -342,6 +342,7 @@ static int emac_reset(struct emac_instance *dev)
{ {
struct emac_regs __iomem *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
int n = 20; int n = 20;
bool __maybe_unused try_internal_clock = false;
DBG(dev, "reset" NL); DBG(dev, "reset" NL);
@ -354,6 +355,7 @@ static int emac_reset(struct emac_instance *dev)
} }
#ifdef CONFIG_PPC_DCR_NATIVE #ifdef CONFIG_PPC_DCR_NATIVE
do_retry:
/* /*
* PPC460EX/GT Embedded Processor Advanced User's Manual * PPC460EX/GT Embedded Processor Advanced User's Manual
* section 28.10.1 Mode Register 0 (EMACx_MR0) states: * section 28.10.1 Mode Register 0 (EMACx_MR0) states:
@ -361,10 +363,19 @@ static int emac_reset(struct emac_instance *dev)
* of the EMAC. If none is present, select the internal clock * of the EMAC. If none is present, select the internal clock
* (SDR0_ETH_CFG[EMACx_PHY_CLK] = 1). * (SDR0_ETH_CFG[EMACx_PHY_CLK] = 1).
* After a soft reset, select the external clock. * After a soft reset, select the external clock.
*
* The AR8035-A PHY Meraki MR24 does not provide a TX Clk if the
* ethernet cable is not attached. This causes the reset to timeout
* and the PHY detection code in emac_init_phy() is unable to
* communicate and detect the AR8035-A PHY. As a result, the emac
* driver bails out early and the user has no ethernet.
* In order to stay compatible with existing configurations, the
* driver will temporarily switch to the internal clock, after
* the first reset fails.
*/ */
if (emac_has_feature(dev, EMAC_FTR_460EX_PHY_CLK_FIX)) { if (emac_has_feature(dev, EMAC_FTR_460EX_PHY_CLK_FIX)) {
if (dev->phy_address == 0xffffffff && if (try_internal_clock || (dev->phy_address == 0xffffffff &&
dev->phy_map == 0xffffffff) { dev->phy_map == 0xffffffff)) {
/* No PHY: select internal loop clock before reset */ /* No PHY: select internal loop clock before reset */
dcri_clrset(SDR0, SDR0_ETH_CFG, dcri_clrset(SDR0, SDR0_ETH_CFG,
0, SDR0_ETH_CFG_ECS << dev->cell_index); 0, SDR0_ETH_CFG_ECS << dev->cell_index);
@ -382,8 +393,15 @@ static int emac_reset(struct emac_instance *dev)
#ifdef CONFIG_PPC_DCR_NATIVE #ifdef CONFIG_PPC_DCR_NATIVE
if (emac_has_feature(dev, EMAC_FTR_460EX_PHY_CLK_FIX)) { if (emac_has_feature(dev, EMAC_FTR_460EX_PHY_CLK_FIX)) {
if (dev->phy_address == 0xffffffff && if (!n && !try_internal_clock) {
dev->phy_map == 0xffffffff) { /* first attempt has timed out. */
n = 20;
try_internal_clock = true;
goto do_retry;
}
if (try_internal_clock || (dev->phy_address == 0xffffffff &&
dev->phy_map == 0xffffffff)) {
/* No PHY: restore external clock source after reset */ /* No PHY: restore external clock source after reset */
dcri_clrset(SDR0, SDR0_ETH_CFG, dcri_clrset(SDR0, SDR0_ETH_CFG,
SDR0_ETH_CFG_ECS << dev->cell_index, 0); SDR0_ETH_CFG_ECS << dev->cell_index, 0);

View file

@ -1182,6 +1182,7 @@ static void e1000e_tx_hwtstamp_work(struct work_struct *work)
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
if (er32(TSYNCTXCTL) & E1000_TSYNCTXCTL_VALID) { if (er32(TSYNCTXCTL) & E1000_TSYNCTXCTL_VALID) {
struct sk_buff *skb = adapter->tx_hwtstamp_skb;
struct skb_shared_hwtstamps shhwtstamps; struct skb_shared_hwtstamps shhwtstamps;
u64 txstmp; u64 txstmp;
@ -1190,9 +1191,14 @@ static void e1000e_tx_hwtstamp_work(struct work_struct *work)
e1000e_systim_to_hwtstamp(adapter, &shhwtstamps, txstmp); e1000e_systim_to_hwtstamp(adapter, &shhwtstamps, txstmp);
skb_tstamp_tx(adapter->tx_hwtstamp_skb, &shhwtstamps); /* Clear the global tx_hwtstamp_skb pointer and force writes
dev_kfree_skb_any(adapter->tx_hwtstamp_skb); * prior to notifying the stack of a Tx timestamp.
*/
adapter->tx_hwtstamp_skb = NULL; adapter->tx_hwtstamp_skb = NULL;
wmb(); /* force write prior to skb_tstamp_tx */
skb_tstamp_tx(skb, &shhwtstamps);
dev_kfree_skb_any(skb);
} else if (time_after(jiffies, adapter->tx_hwtstamp_start } else if (time_after(jiffies, adapter->tx_hwtstamp_start
+ adapter->tx_timeout_factor * HZ)) { + adapter->tx_timeout_factor * HZ)) {
dev_kfree_skb_any(adapter->tx_hwtstamp_skb); dev_kfree_skb_any(adapter->tx_hwtstamp_skb);
@ -6589,12 +6595,17 @@ static int e1000e_pm_thaw(struct device *dev)
static int e1000e_pm_suspend(struct device *dev) static int e1000e_pm_suspend(struct device *dev)
{ {
struct pci_dev *pdev = to_pci_dev(dev); struct pci_dev *pdev = to_pci_dev(dev);
int rc;
e1000e_flush_lpic(pdev); e1000e_flush_lpic(pdev);
e1000e_pm_freeze(dev); e1000e_pm_freeze(dev);
return __e1000_shutdown(pdev, false); rc = __e1000_shutdown(pdev, false);
if (rc)
e1000e_pm_thaw(dev);
return rc;
} }
static int e1000e_pm_resume(struct device *dev) static int e1000e_pm_resume(struct device *dev)

View file

@ -5079,7 +5079,7 @@ static int sky2_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
INIT_WORK(&hw->restart_work, sky2_restart); INIT_WORK(&hw->restart_work, sky2_restart);
pci_set_drvdata(pdev, hw); pci_set_drvdata(pdev, hw);
pdev->d3_delay = 150; pdev->d3_delay = 200;
return 0; return 0;

View file

@ -35,6 +35,7 @@
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/mlx4/cmd.h> #include <linux/mlx4/cmd.h>
#include <linux/mlx4/qp.h>
#include <linux/export.h> #include <linux/export.h>
#include "mlx4.h" #include "mlx4.h"
@ -985,16 +986,21 @@ int mlx4_flow_attach(struct mlx4_dev *dev,
if (IS_ERR(mailbox)) if (IS_ERR(mailbox))
return PTR_ERR(mailbox); return PTR_ERR(mailbox);
if (!mlx4_qp_lookup(dev, rule->qpn)) {
mlx4_err_rule(dev, "QP doesn't exist\n", rule);
ret = -EINVAL;
goto out;
}
trans_rule_ctrl_to_hw(rule, mailbox->buf); trans_rule_ctrl_to_hw(rule, mailbox->buf);
size += sizeof(struct mlx4_net_trans_rule_hw_ctrl); size += sizeof(struct mlx4_net_trans_rule_hw_ctrl);
list_for_each_entry(cur, &rule->list, list) { list_for_each_entry(cur, &rule->list, list) {
ret = parse_trans_rule(dev, cur, mailbox->buf + size); ret = parse_trans_rule(dev, cur, mailbox->buf + size);
if (ret < 0) { if (ret < 0)
mlx4_free_cmd_mailbox(dev, mailbox); goto out;
return ret;
}
size += ret; size += ret;
} }
@ -1021,6 +1027,7 @@ int mlx4_flow_attach(struct mlx4_dev *dev,
} }
} }
out:
mlx4_free_cmd_mailbox(dev, mailbox); mlx4_free_cmd_mailbox(dev, mailbox);
return ret; return ret;

View file

@ -381,6 +381,19 @@ static void mlx4_qp_free_icm(struct mlx4_dev *dev, int qpn)
__mlx4_qp_free_icm(dev, qpn); __mlx4_qp_free_icm(dev, qpn);
} }
struct mlx4_qp *mlx4_qp_lookup(struct mlx4_dev *dev, u32 qpn)
{
struct mlx4_qp_table *qp_table = &mlx4_priv(dev)->qp_table;
struct mlx4_qp *qp;
spin_lock(&qp_table->lock);
qp = __mlx4_qp_lookup(dev, qpn);
spin_unlock(&qp_table->lock);
return qp;
}
int mlx4_qp_alloc(struct mlx4_dev *dev, int qpn, struct mlx4_qp *qp, gfp_t gfp) int mlx4_qp_alloc(struct mlx4_dev *dev, int qpn, struct mlx4_qp *qp, gfp_t gfp)
{ {
struct mlx4_priv *priv = mlx4_priv(dev); struct mlx4_priv *priv = mlx4_priv(dev);
@ -468,6 +481,12 @@ int mlx4_update_qp(struct mlx4_dev *dev, u32 qpn,
} }
if (attr & MLX4_UPDATE_QP_QOS_VPORT) { if (attr & MLX4_UPDATE_QP_QOS_VPORT) {
if (!(dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_QOS_VPP)) {
mlx4_warn(dev, "Granular QoS per VF is not enabled\n");
err = -EOPNOTSUPP;
goto out;
}
qp_mask |= 1ULL << MLX4_UPD_QP_MASK_QOS_VPP; qp_mask |= 1ULL << MLX4_UPD_QP_MASK_QOS_VPP;
cmd->qp_context.qos_vport = params->qos_vport; cmd->qp_context.qos_vport = params->qos_vport;
} }

View file

@ -5040,6 +5040,13 @@ void mlx4_delete_all_resources_for_slave(struct mlx4_dev *dev, int slave)
mutex_unlock(&priv->mfunc.master.res_tracker.slave_list[slave].mutex); mutex_unlock(&priv->mfunc.master.res_tracker.slave_list[slave].mutex);
} }
static void update_qos_vpp(struct mlx4_update_qp_context *ctx,
struct mlx4_vf_immed_vlan_work *work)
{
ctx->qp_mask |= cpu_to_be64(1ULL << MLX4_UPD_QP_MASK_QOS_VPP);
ctx->qp_context.qos_vport = work->qos_vport;
}
void mlx4_vf_immed_vlan_work_handler(struct work_struct *_work) void mlx4_vf_immed_vlan_work_handler(struct work_struct *_work)
{ {
struct mlx4_vf_immed_vlan_work *work = struct mlx4_vf_immed_vlan_work *work =
@ -5144,11 +5151,10 @@ void mlx4_vf_immed_vlan_work_handler(struct work_struct *_work)
qp->sched_queue & 0xC7; qp->sched_queue & 0xC7;
upd_context->qp_context.pri_path.sched_queue |= upd_context->qp_context.pri_path.sched_queue |=
((work->qos & 0x7) << 3); ((work->qos & 0x7) << 3);
upd_context->qp_mask |=
cpu_to_be64(1ULL << if (dev->caps.flags2 &
MLX4_UPD_QP_MASK_QOS_VPP); MLX4_DEV_CAP_FLAG2_QOS_VPP)
upd_context->qp_context.qos_vport = update_qos_vpp(upd_context, work);
work->qos_vport;
} }
err = mlx4_cmd(dev, mailbox->dma, err = mlx4_cmd(dev, mailbox->dma,

View file

@ -513,7 +513,6 @@ static int mlx5_irq_set_affinity_hint(struct mlx5_core_dev *mdev, int i)
struct mlx5_priv *priv = &mdev->priv; struct mlx5_priv *priv = &mdev->priv;
struct msix_entry *msix = priv->msix_arr; struct msix_entry *msix = priv->msix_arr;
int irq = msix[i + MLX5_EQ_VEC_COMP_BASE].vector; int irq = msix[i + MLX5_EQ_VEC_COMP_BASE].vector;
int err;
if (!zalloc_cpumask_var(&priv->irq_info[i].mask, GFP_KERNEL)) { if (!zalloc_cpumask_var(&priv->irq_info[i].mask, GFP_KERNEL)) {
mlx5_core_warn(mdev, "zalloc_cpumask_var failed"); mlx5_core_warn(mdev, "zalloc_cpumask_var failed");
@ -523,18 +522,11 @@ static int mlx5_irq_set_affinity_hint(struct mlx5_core_dev *mdev, int i)
cpumask_set_cpu(cpumask_local_spread(i, priv->numa_node), cpumask_set_cpu(cpumask_local_spread(i, priv->numa_node),
priv->irq_info[i].mask); priv->irq_info[i].mask);
err = irq_set_affinity_hint(irq, priv->irq_info[i].mask); if (IS_ENABLED(CONFIG_SMP) &&
if (err) { irq_set_affinity_hint(irq, priv->irq_info[i].mask))
mlx5_core_warn(mdev, "irq_set_affinity_hint failed,irq 0x%.4x", mlx5_core_warn(mdev, "irq_set_affinity_hint failed, irq 0x%.4x", irq);
irq);
goto err_clear_mask;
}
return 0; return 0;
err_clear_mask:
free_cpumask_var(priv->irq_info[i].mask);
return err;
} }
static void mlx5_irq_clear_affinity_hint(struct mlx5_core_dev *mdev, int i) static void mlx5_irq_clear_affinity_hint(struct mlx5_core_dev *mdev, int i)

View file

@ -247,7 +247,7 @@ nx_fw_cmd_set_mtu(struct netxen_adapter *adapter, int mtu)
cmd.req.arg3 = 0; cmd.req.arg3 = 0;
if (recv_ctx->state == NX_HOST_CTX_STATE_ACTIVE) if (recv_ctx->state == NX_HOST_CTX_STATE_ACTIVE)
netxen_issue_cmd(adapter, &cmd); rcode = netxen_issue_cmd(adapter, &cmd);
if (rcode != NX_RCODE_SUCCESS) if (rcode != NX_RCODE_SUCCESS)
return -EIO; return -EIO;

View file

@ -341,7 +341,7 @@ qlcnic_pcie_sem_lock(struct qlcnic_adapter *adapter, int sem, u32 id_reg)
} }
return -EIO; return -EIO;
} }
usleep_range(1000, 1500); udelay(1200);
} }
if (id_reg) if (id_reg)

View file

@ -765,7 +765,7 @@ int ql_core_dump(struct ql_adapter *qdev, struct ql_mpi_coredump *mpi_coredump)
sizeof(struct mpi_coredump_global_header); sizeof(struct mpi_coredump_global_header);
mpi_coredump->mpi_global_header.imageSize = mpi_coredump->mpi_global_header.imageSize =
sizeof(struct ql_mpi_coredump); sizeof(struct ql_mpi_coredump);
memcpy(mpi_coredump->mpi_global_header.idString, "MPI Coredump", strncpy(mpi_coredump->mpi_global_header.idString, "MPI Coredump",
sizeof(mpi_coredump->mpi_global_header.idString)); sizeof(mpi_coredump->mpi_global_header.idString));
/* Get generic NIC reg dump */ /* Get generic NIC reg dump */
@ -1255,7 +1255,7 @@ static void ql_gen_reg_dump(struct ql_adapter *qdev,
sizeof(struct mpi_coredump_global_header); sizeof(struct mpi_coredump_global_header);
mpi_coredump->mpi_global_header.imageSize = mpi_coredump->mpi_global_header.imageSize =
sizeof(struct ql_reg_dump); sizeof(struct ql_reg_dump);
memcpy(mpi_coredump->mpi_global_header.idString, "MPI Coredump", strncpy(mpi_coredump->mpi_global_header.idString, "MPI Coredump",
sizeof(mpi_coredump->mpi_global_header.idString)); sizeof(mpi_coredump->mpi_global_header.idString));

View file

@ -296,8 +296,9 @@ qcaspi_receive(struct qcaspi *qca)
/* Allocate rx SKB if we don't have one available. */ /* Allocate rx SKB if we don't have one available. */
if (!qca->rx_skb) { if (!qca->rx_skb) {
qca->rx_skb = netdev_alloc_skb(net_dev, qca->rx_skb = netdev_alloc_skb_ip_align(net_dev,
net_dev->mtu + VLAN_ETH_HLEN); net_dev->mtu +
VLAN_ETH_HLEN);
if (!qca->rx_skb) { if (!qca->rx_skb) {
netdev_dbg(net_dev, "out of RX resources\n"); netdev_dbg(net_dev, "out of RX resources\n");
qca->stats.out_of_mem++; qca->stats.out_of_mem++;
@ -377,7 +378,7 @@ qcaspi_receive(struct qcaspi *qca)
qca->rx_skb, qca->rx_skb->dev); qca->rx_skb, qca->rx_skb->dev);
qca->rx_skb->ip_summed = CHECKSUM_UNNECESSARY; qca->rx_skb->ip_summed = CHECKSUM_UNNECESSARY;
netif_rx_ni(qca->rx_skb); netif_rx_ni(qca->rx_skb);
qca->rx_skb = netdev_alloc_skb(net_dev, qca->rx_skb = netdev_alloc_skb_ip_align(net_dev,
net_dev->mtu + VLAN_ETH_HLEN); net_dev->mtu + VLAN_ETH_HLEN);
if (!qca->rx_skb) { if (!qca->rx_skb) {
netdev_dbg(net_dev, "out of RX resources\n"); netdev_dbg(net_dev, "out of RX resources\n");
@ -759,7 +760,8 @@ qcaspi_netdev_init(struct net_device *dev)
if (!qca->rx_buffer) if (!qca->rx_buffer)
return -ENOBUFS; return -ENOBUFS;
qca->rx_skb = netdev_alloc_skb(dev, qca->net_dev->mtu + VLAN_ETH_HLEN); qca->rx_skb = netdev_alloc_skb_ip_align(dev, qca->net_dev->mtu +
VLAN_ETH_HLEN);
if (!qca->rx_skb) { if (!qca->rx_skb) {
kfree(qca->rx_buffer); kfree(qca->rx_buffer);
netdev_info(qca->net_dev, "Failed to allocate RX sk_buff.\n"); netdev_info(qca->net_dev, "Failed to allocate RX sk_buff.\n");

View file

@ -8411,12 +8411,12 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
goto err_out_msi_4; goto err_out_msi_4;
} }
pci_set_drvdata(pdev, dev);
rc = register_netdev(dev); rc = register_netdev(dev);
if (rc < 0) if (rc < 0)
goto err_out_cnt_5; goto err_out_cnt_5;
pci_set_drvdata(pdev, dev);
netif_info(tp, probe, dev, "%s at 0x%p, %pM, XID %08x IRQ %d\n", netif_info(tp, probe, dev, "%s at 0x%p, %pM, XID %08x IRQ %d\n",
rtl_chip_infos[chipset].name, ioaddr, dev->dev_addr, rtl_chip_infos[chipset].name, ioaddr, dev->dev_addr,
(u32)(RTL_R32(TxConfig) & 0x9cf0f8ff), pdev->irq); (u32)(RTL_R32(TxConfig) & 0x9cf0f8ff), pdev->irq);

View file

@ -3222,7 +3222,7 @@ static int sh_eth_drv_probe(struct platform_device *pdev)
/* MDIO bus init */ /* MDIO bus init */
ret = sh_mdio_init(mdp, pd); ret = sh_mdio_init(mdp, pd);
if (ret) { if (ret) {
dev_err(&ndev->dev, "failed to initialise MDIO\n"); dev_err(&pdev->dev, "failed to initialise MDIO\n");
goto out_release; goto out_release;
} }

View file

@ -280,6 +280,10 @@ struct cpsw_ss_regs {
/* Bit definitions for the CPSW1_TS_SEQ_LTYPE register */ /* Bit definitions for the CPSW1_TS_SEQ_LTYPE register */
#define CPSW_V1_SEQ_ID_OFS_SHIFT 16 #define CPSW_V1_SEQ_ID_OFS_SHIFT 16
#define CPSW_MAX_BLKS_TX 15
#define CPSW_MAX_BLKS_TX_SHIFT 4
#define CPSW_MAX_BLKS_RX 5
struct cpsw_host_regs { struct cpsw_host_regs {
u32 max_blks; u32 max_blks;
u32 blk_cnt; u32 blk_cnt;
@ -1127,11 +1131,23 @@ static void cpsw_slave_open(struct cpsw_slave *slave, struct cpsw_priv *priv)
switch (priv->version) { switch (priv->version) {
case CPSW_VERSION_1: case CPSW_VERSION_1:
slave_write(slave, TX_PRIORITY_MAPPING, CPSW1_TX_PRI_MAP); slave_write(slave, TX_PRIORITY_MAPPING, CPSW1_TX_PRI_MAP);
/* Increase RX FIFO size to 5 for supporting fullduplex
* flow control mode
*/
slave_write(slave,
(CPSW_MAX_BLKS_TX << CPSW_MAX_BLKS_TX_SHIFT) |
CPSW_MAX_BLKS_RX, CPSW1_MAX_BLKS);
break; break;
case CPSW_VERSION_2: case CPSW_VERSION_2:
case CPSW_VERSION_3: case CPSW_VERSION_3:
case CPSW_VERSION_4: case CPSW_VERSION_4:
slave_write(slave, TX_PRIORITY_MAPPING, CPSW2_TX_PRI_MAP); slave_write(slave, TX_PRIORITY_MAPPING, CPSW2_TX_PRI_MAP);
/* Increase RX FIFO size to 5 for supporting fullduplex
* flow control mode
*/
slave_write(slave,
(CPSW_MAX_BLKS_TX << CPSW_MAX_BLKS_TX_SHIFT) |
CPSW_MAX_BLKS_RX, CPSW2_MAX_BLKS);
break; break;
} }

View file

@ -574,6 +574,8 @@ static int hdlcdrv_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
case HDLCDRVCTL_CALIBRATE: case HDLCDRVCTL_CALIBRATE:
if(!capable(CAP_SYS_RAWIO)) if(!capable(CAP_SYS_RAWIO))
return -EPERM; return -EPERM;
if (s->par.bitrate <= 0)
return -EINVAL;
if (bi.data.calibrate > INT_MAX / s->par.bitrate) if (bi.data.calibrate > INT_MAX / s->par.bitrate)
return -EINVAL; return -EINVAL;
s->hdlctx.calibrate = bi.data.calibrate * s->par.bitrate / 16; s->hdlctx.calibrate = bi.data.calibrate * s->par.bitrate / 16;

View file

@ -148,6 +148,12 @@ static inline int phy_aneg_done(struct phy_device *phydev)
if (phydev->drv->aneg_done) if (phydev->drv->aneg_done)
return phydev->drv->aneg_done(phydev); return phydev->drv->aneg_done(phydev);
/* Avoid genphy_aneg_done() if the Clause 45 PHY does not
* implement Clause 22 registers
*/
if (phydev->is_c45 && !(phydev->c45_ids.devices_in_package & BIT(0)))
return -EINVAL;
return genphy_aneg_done(phydev); return genphy_aneg_done(phydev);
} }

View file

@ -501,7 +501,6 @@ static int pptp_connect(struct socket *sock, struct sockaddr *uservaddr,
po->chan.mtu = dst_mtu(&rt->dst); po->chan.mtu = dst_mtu(&rt->dst);
if (!po->chan.mtu) if (!po->chan.mtu)
po->chan.mtu = PPP_MRU; po->chan.mtu = PPP_MRU;
ip_rt_put(rt);
po->chan.mtu -= PPTP_HEADER_OVERHEAD; po->chan.mtu -= PPTP_HEADER_OVERHEAD;
po->chan.hdrlen = 2 + sizeof(struct pptp_gre_header); po->chan.hdrlen = 2 + sizeof(struct pptp_gre_header);

View file

@ -1069,6 +1069,7 @@ cdc_ncm_fill_tx_frame(struct usbnet *dev, struct sk_buff *skb, __le32 sign)
u16 n = 0, index, ndplen; u16 n = 0, index, ndplen;
u8 ready2send = 0; u8 ready2send = 0;
u32 delayed_ndp_size; u32 delayed_ndp_size;
size_t padding_count;
/* When our NDP gets written in cdc_ncm_ndp(), then skb_out->len gets updated /* When our NDP gets written in cdc_ncm_ndp(), then skb_out->len gets updated
* accordingly. Otherwise, we should check here. * accordingly. Otherwise, we should check here.
@ -1225,11 +1226,13 @@ cdc_ncm_fill_tx_frame(struct usbnet *dev, struct sk_buff *skb, __le32 sign)
* a ZLP after full sized NTBs. * a ZLP after full sized NTBs.
*/ */
if (!(dev->driver_info->flags & FLAG_SEND_ZLP) && if (!(dev->driver_info->flags & FLAG_SEND_ZLP) &&
skb_out->len > ctx->min_tx_pkt) skb_out->len > ctx->min_tx_pkt) {
memset(skb_put(skb_out, ctx->tx_max - skb_out->len), 0, padding_count = ctx->tx_max - skb_out->len;
ctx->tx_max - skb_out->len); memset(skb_put(skb_out, padding_count), 0, padding_count);
else if (skb_out->len < ctx->tx_max && (skb_out->len % dev->maxpacket) == 0) } else if (skb_out->len < ctx->tx_max &&
(skb_out->len % dev->maxpacket) == 0) {
*skb_put(skb_out, 1) = 0; /* force short packet */ *skb_put(skb_out, 1) = 0; /* force short packet */
}
/* set final frame length */ /* set final frame length */
nth16 = (struct usb_cdc_ncm_nth16 *)skb_out->data; nth16 = (struct usb_cdc_ncm_nth16 *)skb_out->data;

View file

@ -556,7 +556,12 @@ static int add_recvbuf_small(struct virtnet_info *vi, struct receive_queue *rq,
hdr = skb_vnet_hdr(skb); hdr = skb_vnet_hdr(skb);
sg_init_table(rq->sg, 2); sg_init_table(rq->sg, 2);
sg_set_buf(rq->sg, hdr, vi->hdr_len); sg_set_buf(rq->sg, hdr, vi->hdr_len);
skb_to_sgvec(skb, rq->sg + 1, 0, skb->len);
err = skb_to_sgvec(skb, rq->sg + 1, 0, skb->len);
if (unlikely(err < 0)) {
dev_kfree_skb(skb);
return err;
}
err = virtqueue_add_inbuf(rq->vq, rq->sg, 2, skb, gfp); err = virtqueue_add_inbuf(rq->vq, rq->sg, 2, skb, gfp);
if (err < 0) if (err < 0)
@ -858,7 +863,7 @@ static int xmit_skb(struct send_queue *sq, struct sk_buff *skb)
struct virtio_net_hdr_mrg_rxbuf *hdr; struct virtio_net_hdr_mrg_rxbuf *hdr;
const unsigned char *dest = ((struct ethhdr *)skb->data)->h_dest; const unsigned char *dest = ((struct ethhdr *)skb->data)->h_dest;
struct virtnet_info *vi = sq->vq->vdev->priv; struct virtnet_info *vi = sq->vq->vdev->priv;
unsigned num_sg; int num_sg;
unsigned hdr_len = vi->hdr_len; unsigned hdr_len = vi->hdr_len;
bool can_push; bool can_push;
@ -911,11 +916,16 @@ static int xmit_skb(struct send_queue *sq, struct sk_buff *skb)
if (can_push) { if (can_push) {
__skb_push(skb, hdr_len); __skb_push(skb, hdr_len);
num_sg = skb_to_sgvec(skb, sq->sg, 0, skb->len); num_sg = skb_to_sgvec(skb, sq->sg, 0, skb->len);
if (unlikely(num_sg < 0))
return num_sg;
/* Pull header back to avoid skew in tx bytes calculations. */ /* Pull header back to avoid skew in tx bytes calculations. */
__skb_pull(skb, hdr_len); __skb_pull(skb, hdr_len);
} else { } else {
sg_set_buf(sq->sg, hdr, hdr_len); sg_set_buf(sq->sg, hdr, hdr_len);
num_sg = skb_to_sgvec(skb, sq->sg + 1, 0, skb->len) + 1; num_sg = skb_to_sgvec(skb, sq->sg + 1, 0, skb->len);
if (unlikely(num_sg < 0))
return num_sg;
num_sg++;
} }
return virtqueue_add_outbuf(sq->vq, sq->sg, num_sg, skb, GFP_ATOMIC); return virtqueue_add_outbuf(sq->vq, sq->sg, num_sg, skb, GFP_ATOMIC);
} }

View file

@ -2789,6 +2789,11 @@ vmxnet3_force_close(struct vmxnet3_adapter *adapter)
/* we need to enable NAPI, otherwise dev_close will deadlock */ /* we need to enable NAPI, otherwise dev_close will deadlock */
for (i = 0; i < adapter->num_rx_queues; i++) for (i = 0; i < adapter->num_rx_queues; i++)
napi_enable(&adapter->rx_queue[i].napi); napi_enable(&adapter->rx_queue[i].napi);
/*
* Need to clear the quiesce bit to ensure that vmxnet3_close
* can quiesce the device properly
*/
clear_bit(VMXNET3_STATE_BIT_QUIESCED, &adapter->state);
dev_close(adapter->netdev); dev_close(adapter->netdev);
} }

View file

@ -550,13 +550,15 @@ static int vrf_finish_output(struct net *net, struct sock *sk, struct sk_buff *s
neigh = __ipv4_neigh_lookup_noref(dev, nexthop); neigh = __ipv4_neigh_lookup_noref(dev, nexthop);
if (unlikely(!neigh)) if (unlikely(!neigh))
neigh = __neigh_create(&arp_tbl, &nexthop, dev, false); neigh = __neigh_create(&arp_tbl, &nexthop, dev, false);
if (!IS_ERR(neigh)) if (!IS_ERR(neigh)) {
ret = dst_neigh_output(dst, neigh, skb); ret = dst_neigh_output(dst, neigh, skb);
rcu_read_unlock_bh();
return ret;
}
rcu_read_unlock_bh(); rcu_read_unlock_bh();
err: err:
if (unlikely(ret < 0)) vrf_tx_error(skb->dev, skb);
vrf_tx_error(skb->dev, skb);
return ret; return ret;
} }

View file

@ -962,7 +962,7 @@ static bool vxlan_snoop(struct net_device *dev,
return false; return false;
/* Don't migrate static entries, drop packets */ /* Don't migrate static entries, drop packets */
if (f->state & NUD_NOARP) if (f->state & (NUD_PERMANENT | NUD_NOARP))
return true; return true;
if (net_ratelimit()) if (net_ratelimit())

View file

@ -939,7 +939,10 @@ static int open_file_eeprom(struct inode *inode, struct file *file)
} }
for (i = 0; i < eesize; ++i) { for (i = 0; i < eesize; ++i) {
AR5K_EEPROM_READ(i, val); if (!ath5k_hw_nvram_read(ah, i, &val)) {
ret = -EIO;
goto freebuf;
}
buf[i] = val; buf[i] = val;
} }

View file

@ -247,7 +247,10 @@ static const UCHAR b4_default_startup_parms[] = {
0x04, 0x08, /* Noise gain, limit offset */ 0x04, 0x08, /* Noise gain, limit offset */
0x28, 0x28, /* det rssi, med busy offsets */ 0x28, 0x28, /* det rssi, med busy offsets */
7, /* det sync thresh */ 7, /* det sync thresh */
0, 2, 2 /* test mode, min, max */ 0, 2, 2, /* test mode, min, max */
0, /* rx/tx delay */
0, 0, 0, 0, 0, 0, /* current BSS id */
0 /* hop set */
}; };
/*===========================================================================*/ /*===========================================================================*/
@ -598,7 +601,7 @@ static void init_startup_params(ray_dev_t *local)
* a_beacon_period = hops a_beacon_period = KuS * a_beacon_period = hops a_beacon_period = KuS
*//* 64ms = 010000 */ *//* 64ms = 010000 */
if (local->fw_ver == 0x55) { if (local->fw_ver == 0x55) {
memcpy((UCHAR *) &local->sparm.b4, b4_default_startup_parms, memcpy(&local->sparm.b4, b4_default_startup_parms,
sizeof(struct b4_startup_params)); sizeof(struct b4_startup_params));
/* Translate sane kus input values to old build 4/5 format */ /* Translate sane kus input values to old build 4/5 format */
/* i = hop time in uS truncated to 3 bytes */ /* i = hop time in uS truncated to 3 bytes */

View file

@ -1196,8 +1196,7 @@ static void wl1251_op_bss_info_changed(struct ieee80211_hw *hw,
WARN_ON(wl->bss_type != BSS_TYPE_STA_BSS); WARN_ON(wl->bss_type != BSS_TYPE_STA_BSS);
enable = bss_conf->arp_addr_cnt == 1 && bss_conf->assoc; enable = bss_conf->arp_addr_cnt == 1 && bss_conf->assoc;
wl1251_acx_arp_ip_filter(wl, enable, addr); ret = wl1251_acx_arp_ip_filter(wl, enable, addr);
if (ret < 0) if (ret < 0)
goto out_sleep; goto out_sleep;
} }

View file

@ -538,6 +538,7 @@ struct powercap_zone *powercap_register_zone(
power_zone->id = result; power_zone->id = result;
idr_init(&power_zone->idr); idr_init(&power_zone->idr);
result = -ENOMEM;
power_zone->name = kstrdup(name, GFP_KERNEL); power_zone->name = kstrdup(name, GFP_KERNEL);
if (!power_zone->name) if (!power_zone->name)
goto err_name_alloc; goto err_name_alloc;

View file

@ -217,6 +217,13 @@ int __rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
missing = year; missing = year;
} }
/* Can't proceed if alarm is still invalid after replacing
* missing fields.
*/
err = rtc_valid_tm(&alarm->time);
if (err)
goto done;
/* with luck, no rollover is needed */ /* with luck, no rollover is needed */
t_now = rtc_tm_to_time64(&now); t_now = rtc_tm_to_time64(&now);
t_alm = rtc_tm_to_time64(&alarm->time); t_alm = rtc_tm_to_time64(&alarm->time);
@ -268,9 +275,9 @@ int __rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
dev_warn(&rtc->dev, "alarm rollover not handled\n"); dev_warn(&rtc->dev, "alarm rollover not handled\n");
} }
done:
err = rtc_valid_tm(&alarm->time); err = rtc_valid_tm(&alarm->time);
done:
if (err) { if (err) {
dev_warn(&rtc->dev, "invalid alarm value: %d-%d-%d %d:%d:%d\n", dev_warn(&rtc->dev, "invalid alarm value: %d-%d-%d %d:%d:%d\n",
alarm->time.tm_year + 1900, alarm->time.tm_mon + 1, alarm->time.tm_year + 1900, alarm->time.tm_mon + 1,

View file

@ -150,6 +150,16 @@ static int opal_get_tpo_time(struct device *dev, struct rtc_wkalrm *alarm)
y_m_d = be32_to_cpu(__y_m_d); y_m_d = be32_to_cpu(__y_m_d);
h_m_s_ms = ((u64)be32_to_cpu(__h_m) << 32); h_m_s_ms = ((u64)be32_to_cpu(__h_m) << 32);
/* check if no alarm is set */
if (y_m_d == 0 && h_m_s_ms == 0) {
pr_debug("No alarm is set\n");
rc = -ENOENT;
goto exit;
} else {
pr_debug("Alarm set to %x %llx\n", y_m_d, h_m_s_ms);
}
opal_to_tm(y_m_d, h_m_s_ms, &alarm->time); opal_to_tm(y_m_d, h_m_s_ms, &alarm->time);
exit: exit:

View file

@ -257,7 +257,7 @@ static int snvs_rtc_probe(struct platform_device *pdev)
of_property_read_u32(pdev->dev.of_node, "offset", &data->offset); of_property_read_u32(pdev->dev.of_node, "offset", &data->offset);
} }
if (!data->regmap) { if (IS_ERR(data->regmap)) {
dev_err(&pdev->dev, "Can't find snvs syscon\n"); dev_err(&pdev->dev, "Can't find snvs syscon\n");
return -ENODEV; return -ENODEV;
} }

View file

@ -1881,8 +1881,12 @@ static int __dasd_device_is_unusable(struct dasd_device *device,
{ {
int mask = ~(DASD_STOPPED_DC_WAIT | DASD_UNRESUMED_PM); int mask = ~(DASD_STOPPED_DC_WAIT | DASD_UNRESUMED_PM);
if (test_bit(DASD_FLAG_OFFLINE, &device->flags)) { if (test_bit(DASD_FLAG_OFFLINE, &device->flags) &&
/* dasd is being set offline. */ !test_bit(DASD_FLAG_SAFE_OFFLINE_RUNNING, &device->flags)) {
/*
* dasd is being set offline
* but it is no safe offline where we have to allow I/O
*/
return 1; return 1;
} }
if (device->stopped) { if (device->stopped) {

View file

@ -191,6 +191,7 @@ struct bnx2fc_hba {
struct bnx2fc_cmd_mgr *cmd_mgr; struct bnx2fc_cmd_mgr *cmd_mgr;
spinlock_t hba_lock; spinlock_t hba_lock;
struct mutex hba_mutex; struct mutex hba_mutex;
struct mutex hba_stats_mutex;
unsigned long adapter_state; unsigned long adapter_state;
#define ADAPTER_STATE_UP 0 #define ADAPTER_STATE_UP 0
#define ADAPTER_STATE_GOING_DOWN 1 #define ADAPTER_STATE_GOING_DOWN 1

View file

@ -641,15 +641,17 @@ static struct fc_host_statistics *bnx2fc_get_host_stats(struct Scsi_Host *shost)
if (!fw_stats) if (!fw_stats)
return NULL; return NULL;
mutex_lock(&hba->hba_stats_mutex);
bnx2fc_stats = fc_get_host_stats(shost); bnx2fc_stats = fc_get_host_stats(shost);
init_completion(&hba->stat_req_done); init_completion(&hba->stat_req_done);
if (bnx2fc_send_stat_req(hba)) if (bnx2fc_send_stat_req(hba))
return bnx2fc_stats; goto unlock_stats_mutex;
rc = wait_for_completion_timeout(&hba->stat_req_done, (2 * HZ)); rc = wait_for_completion_timeout(&hba->stat_req_done, (2 * HZ));
if (!rc) { if (!rc) {
BNX2FC_HBA_DBG(lport, "FW stat req timed out\n"); BNX2FC_HBA_DBG(lport, "FW stat req timed out\n");
return bnx2fc_stats; goto unlock_stats_mutex;
} }
BNX2FC_STATS(hba, rx_stat2, fc_crc_cnt); BNX2FC_STATS(hba, rx_stat2, fc_crc_cnt);
bnx2fc_stats->invalid_crc_count += hba->bfw_stats.fc_crc_cnt; bnx2fc_stats->invalid_crc_count += hba->bfw_stats.fc_crc_cnt;
@ -671,6 +673,9 @@ static struct fc_host_statistics *bnx2fc_get_host_stats(struct Scsi_Host *shost)
memcpy(&hba->prev_stats, hba->stats_buffer, memcpy(&hba->prev_stats, hba->stats_buffer,
sizeof(struct fcoe_statistics_params)); sizeof(struct fcoe_statistics_params));
unlock_stats_mutex:
mutex_unlock(&hba->hba_stats_mutex);
return bnx2fc_stats; return bnx2fc_stats;
} }
@ -1302,6 +1307,7 @@ static struct bnx2fc_hba *bnx2fc_hba_create(struct cnic_dev *cnic)
} }
spin_lock_init(&hba->hba_lock); spin_lock_init(&hba->hba_lock);
mutex_init(&hba->hba_mutex); mutex_init(&hba->hba_mutex);
mutex_init(&hba->hba_stats_mutex);
hba->cnic = cnic; hba->cnic = cnic;

View file

@ -1769,7 +1769,6 @@ csio_hw_use_fwconfig(struct csio_hw *hw, int reset, u32 *fw_cfg_param)
goto bye; goto bye;
} }
mempool_free(mbp, hw->mb_mempool);
if (finicsum != cfcsum) { if (finicsum != cfcsum) {
csio_warn(hw, csio_warn(hw,
"Config File checksum mismatch: csum=%#x, computed=%#x\n", "Config File checksum mismatch: csum=%#x, computed=%#x\n",
@ -1780,6 +1779,10 @@ csio_hw_use_fwconfig(struct csio_hw *hw, int reset, u32 *fw_cfg_param)
rv = csio_hw_validate_caps(hw, mbp); rv = csio_hw_validate_caps(hw, mbp);
if (rv != 0) if (rv != 0)
goto bye; goto bye;
mempool_free(mbp, hw->mb_mempool);
mbp = NULL;
/* /*
* Note that we're operating with parameters * Note that we're operating with parameters
* not supplied by the driver, rather than from hard-wired * not supplied by the driver, rather than from hard-wired

Some files were not shown because too many files have changed in this diff Show more