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:
commit
0382cccfee
221 changed files with 4868 additions and 1194 deletions
|
@ -192,3 +192,14 @@ Date: November 2017
|
|||
Contact: "Sheng Yong" <shengyong1@huawei.com>
|
||||
Description:
|
||||
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
|
||||
|
|
|
@ -172,6 +172,23 @@ offgrpjquota Turn off group journelled quota.
|
|||
offprjjquota Turn off project journelled quota.
|
||||
quota Enable plain user disk quota accounting.
|
||||
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
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,6 +1,6 @@
|
|||
VERSION = 4
|
||||
PATCHLEVEL = 4
|
||||
SUBLEVEL = 127
|
||||
SUBLEVEL = 128
|
||||
EXTRAVERSION =
|
||||
NAME = Blurry Fish Butt
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
imx53-qsrb {
|
||||
pinctrl_pmic: pmicgrp {
|
||||
fsl,pins = <
|
||||
MX53_PAD_CSI0_DAT5__GPIO5_23 0x1e4 /* IRQ */
|
||||
MX53_PAD_CSI0_DAT5__GPIO5_23 0x1c4 /* IRQ */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
|
|
@ -88,6 +88,7 @@
|
|||
clocks = <&clks 201>;
|
||||
VDDA-supply = <®_2p5v>;
|
||||
VDDIO-supply = <®_3p3v>;
|
||||
lrclk-strength = <3>;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -132,7 +132,7 @@
|
|||
};
|
||||
|
||||
esdhc: esdhc@1560000 {
|
||||
compatible = "fsl,esdhc";
|
||||
compatible = "fsl,ls1021a-esdhc", "fsl,esdhc";
|
||||
reg = <0x0 0x1560000 0x0 0x10000>;
|
||||
interrupts = <GIC_SPI 94 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clock-frequency = <0>;
|
||||
|
|
|
@ -16,7 +16,7 @@ static inline int xen_irqs_disabled(struct pt_regs *regs)
|
|||
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, \
|
||||
counter), (val))
|
||||
|
||||
|
|
|
@ -795,6 +795,8 @@ static struct platform_device da8xx_dsp = {
|
|||
.resource = da8xx_rproc_resources,
|
||||
};
|
||||
|
||||
static bool rproc_mem_inited __initdata;
|
||||
|
||||
#if IS_ENABLED(CONFIG_DA8XX_REMOTEPROC)
|
||||
|
||||
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);
|
||||
if (ret)
|
||||
pr_err("%s: dma_declare_contiguous failed %d\n", __func__, ret);
|
||||
else
|
||||
rproc_mem_inited = true;
|
||||
}
|
||||
|
||||
#else
|
||||
|
@ -847,6 +851,12 @@ int __init da8xx_register_rproc(void)
|
|||
{
|
||||
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);
|
||||
if (ret)
|
||||
pr_err("%s: can't register DSP device: %d\n", __func__, ret);
|
||||
|
|
|
@ -133,6 +133,9 @@ struct device * __init imx_soc_device_init(void)
|
|||
case MXC_CPU_IMX6UL:
|
||||
soc_id = "i.MX6UL";
|
||||
break;
|
||||
case MXC_CPU_IMX6ULL:
|
||||
soc_id = "i.MX6ULL";
|
||||
break;
|
||||
case MXC_CPU_IMX7D:
|
||||
soc_id = "i.MX7D";
|
||||
break;
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
#define MXC_CPU_IMX6SX 0x62
|
||||
#define MXC_CPU_IMX6Q 0x63
|
||||
#define MXC_CPU_IMX6UL 0x64
|
||||
#define MXC_CPU_IMX6ULL 0x65
|
||||
#define MXC_CPU_IMX7D 0x72
|
||||
|
||||
#define IMX_DDR_TYPE_LPDDR2 1
|
||||
|
@ -171,6 +172,11 @@ static inline bool cpu_is_imx6ul(void)
|
|||
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)
|
||||
{
|
||||
return __mxc_cpu_type == MXC_CPU_IMX6Q;
|
||||
|
|
|
@ -48,16 +48,16 @@ do { \
|
|||
} while (0)
|
||||
|
||||
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 cmp = (encoded_op >> 24) & 15;
|
||||
int oparg = (encoded_op << 8) >> 20;
|
||||
int cmparg = (encoded_op << 20) >> 20;
|
||||
int oparg = (int)(encoded_op << 8) >> 20;
|
||||
int cmparg = (int)(encoded_op << 20) >> 20;
|
||||
int oldval = 0, ret, tmp;
|
||||
|
||||
if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28))
|
||||
oparg = 1 << oparg;
|
||||
oparg = 1U << (oparg & 0x1f);
|
||||
|
||||
if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32)))
|
||||
return -EFAULT;
|
||||
|
|
|
@ -40,7 +40,8 @@ typedef union mips_instruction kprobe_opcode_t;
|
|||
|
||||
#define flush_insn_slot(p) \
|
||||
do { \
|
||||
flush_icache_range((unsigned long)p->addr, \
|
||||
if (p->addr) \
|
||||
flush_icache_range((unsigned long)p->addr, \
|
||||
(unsigned long)p->addr + \
|
||||
(MAX_INSN_SIZE * sizeof(kprobe_opcode_t))); \
|
||||
} while (0)
|
||||
|
|
|
@ -18,6 +18,10 @@
|
|||
|
||||
#include <asm-generic/pgtable-nopmd.h>
|
||||
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
#include <asm/highmem.h>
|
||||
#endif
|
||||
|
||||
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 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
|
||||
# define VMALLOC_END (PKMAP_BASE-2*PAGE_SIZE)
|
||||
|
|
|
@ -51,15 +51,15 @@ void __init pagetable_init(void)
|
|||
/*
|
||||
* Fixed mappings:
|
||||
*/
|
||||
vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK;
|
||||
fixrange_init(vaddr, vaddr + FIXADDR_SIZE, pgd_base);
|
||||
vaddr = __fix_to_virt(__end_of_fixed_addresses - 1);
|
||||
fixrange_init(vaddr & PMD_MASK, vaddr + FIXADDR_SIZE, pgd_base);
|
||||
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
/*
|
||||
* Permanent kmaps:
|
||||
*/
|
||||
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);
|
||||
pud = pud_offset(pgd, vaddr);
|
||||
|
|
|
@ -132,7 +132,19 @@ extern long long virt_phys_offset;
|
|||
#define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT)
|
||||
#define virt_to_page(kaddr) pfn_to_page(virt_to_pfn(kaddr))
|
||||
#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))
|
||||
#endif
|
||||
|
||||
/*
|
||||
* On Book-E parts we need __va to parse the device tree and we can't
|
||||
|
|
|
@ -686,12 +686,20 @@ static int __init get_freq(char *name, int cells, unsigned long *val)
|
|||
static void start_cpu_decrementer(void)
|
||||
{
|
||||
#if defined(CONFIG_BOOKE) || defined(CONFIG_40x)
|
||||
unsigned int tcr;
|
||||
|
||||
/* Clear any pending timer interrupts */
|
||||
mtspr(SPRN_TSR, TSR_ENW | TSR_WIS | TSR_DIS | TSR_FIS);
|
||||
|
||||
/* Enable decrementer interrupt */
|
||||
mtspr(SPRN_TCR, TCR_DIE);
|
||||
#endif /* defined(CONFIG_BOOKE) || defined(CONFIG_40x) */
|
||||
tcr = mfspr(SPRN_TCR);
|
||||
/*
|
||||
* 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)
|
||||
|
|
|
@ -50,7 +50,9 @@ static int kvmppc_h_pr_enter(struct kvm_vcpu *vcpu)
|
|||
pteg_addr = get_pteg_addr(vcpu, pte_index);
|
||||
|
||||
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;
|
||||
|
||||
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[1] = cpu_to_be64(kvmppc_get_gpr(vcpu, 7));
|
||||
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);
|
||||
ret = H_SUCCESS;
|
||||
|
||||
|
@ -93,7 +97,9 @@ static int kvmppc_h_pr_remove(struct kvm_vcpu *vcpu)
|
|||
|
||||
pteg = get_pteg_addr(vcpu, pte_index);
|
||||
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[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))
|
||||
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);
|
||||
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);
|
||||
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[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;
|
||||
} else {
|
||||
/* 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],
|
||||
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);
|
||||
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[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);
|
||||
pte[0] = (__force u64)cpu_to_be64(pte[0]);
|
||||
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;
|
||||
|
||||
done:
|
||||
|
|
|
@ -174,6 +174,8 @@ static int spufs_arch_write_note(struct spu_context *ctx, int i,
|
|||
if (!dump_skip(cprm,
|
||||
roundup(cprm->written - total + sz, 4) - cprm->written))
|
||||
goto Eio;
|
||||
|
||||
rc = 0;
|
||||
out:
|
||||
free_page((unsigned long)buf);
|
||||
return rc;
|
||||
|
|
|
@ -21,8 +21,14 @@ SECTIONS
|
|||
{
|
||||
. = 0x00000000;
|
||||
.text : {
|
||||
_text = .; /* Text and read-only data */
|
||||
/* Text and read-only data */
|
||||
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
|
||||
SCHED_TEXT
|
||||
LOCK_TEXT
|
||||
|
|
|
@ -1733,9 +1733,14 @@ static int read_nonraw(struct ldc_channel *lp, void *buf, unsigned int size)
|
|||
|
||||
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)) {
|
||||
new = rx_advance(lp, new);
|
||||
goto no_data;
|
||||
break;
|
||||
}
|
||||
if (p->stype & (LDC_ACK | LDC_NACK)) {
|
||||
err = data_ack_nack(lp, p);
|
||||
|
|
442
arch/x86/configs/x86_64_cuttlefish_defconfig
Normal file
442
arch/x86/configs/x86_64_cuttlefish_defconfig
Normal 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
|
|
@ -365,6 +365,8 @@ static int __init tsc_setup(char *str)
|
|||
tsc_clocksource_reliable = 1;
|
||||
if (!strncmp(str, "noirqtime", 9))
|
||||
no_sched_irq_time = 1;
|
||||
if (!strcmp(str, "unstable"))
|
||||
mark_tsc_unstable("boot parameter");
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -1386,6 +1386,7 @@ static void svm_get_segment(struct kvm_vcpu *vcpu,
|
|||
*/
|
||||
if (var->unusable)
|
||||
var->db = 0;
|
||||
/* This is symmetric with svm_set_segment() */
|
||||
var->dpl = to_svm(vcpu)->vmcb->save.cpl;
|
||||
break;
|
||||
}
|
||||
|
@ -1531,18 +1532,14 @@ static void svm_set_segment(struct kvm_vcpu *vcpu,
|
|||
s->base = var->base;
|
||||
s->limit = var->limit;
|
||||
s->selector = var->selector;
|
||||
if (var->unusable)
|
||||
s->attrib = 0;
|
||||
else {
|
||||
s->attrib = (var->type & SVM_SELECTOR_TYPE_MASK);
|
||||
s->attrib |= (var->s & 1) << SVM_SELECTOR_S_SHIFT;
|
||||
s->attrib |= (var->dpl & 3) << SVM_SELECTOR_DPL_SHIFT;
|
||||
s->attrib |= (var->present & 1) << SVM_SELECTOR_P_SHIFT;
|
||||
s->attrib |= (var->avl & 1) << SVM_SELECTOR_AVL_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;
|
||||
}
|
||||
s->attrib = (var->type & SVM_SELECTOR_TYPE_MASK);
|
||||
s->attrib |= (var->s & 1) << SVM_SELECTOR_S_SHIFT;
|
||||
s->attrib |= (var->dpl & 3) << SVM_SELECTOR_DPL_SHIFT;
|
||||
s->attrib |= ((var->present & 1) && !var->unusable) << SVM_SELECTOR_P_SHIFT;
|
||||
s->attrib |= (var->avl & 1) << SVM_SELECTOR_AVL_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
|
||||
|
@ -1551,7 +1548,8 @@ static void svm_set_segment(struct kvm_vcpu *vcpu,
|
|||
* would entail passing the CPL to userspace and back.
|
||||
*/
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -7657,11 +7657,13 @@ static bool nested_vmx_exit_handled_cr(struct kvm_vcpu *vcpu,
|
|||
{
|
||||
unsigned long exit_qualification = vmcs_readl(EXIT_QUALIFICATION);
|
||||
int cr = exit_qualification & 15;
|
||||
int reg = (exit_qualification >> 8) & 15;
|
||||
unsigned long val = kvm_register_readl(vcpu, reg);
|
||||
int reg;
|
||||
unsigned long val;
|
||||
|
||||
switch ((exit_qualification >> 4) & 3) {
|
||||
case 0: /* mov to cr */
|
||||
reg = (exit_qualification >> 8) & 15;
|
||||
val = kvm_register_readl(vcpu, reg);
|
||||
switch (cr) {
|
||||
case 0:
|
||||
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
|
||||
* cr0. Other attempted changes are ignored, with no exit.
|
||||
*/
|
||||
val = (exit_qualification >> LMSW_SOURCE_DATA_SHIFT) & 0x0f;
|
||||
if (vmcs12->cr0_guest_host_mask & 0xe &
|
||||
(val ^ vmcs12->cr0_read_shadow))
|
||||
return true;
|
||||
|
|
|
@ -55,7 +55,7 @@ ENTRY(csum_partial_copy_generic)
|
|||
movq %r12, 3*8(%rsp)
|
||||
movq %r14, 4*8(%rsp)
|
||||
movq %r13, 5*8(%rsp)
|
||||
movq %rbp, 6*8(%rsp)
|
||||
movq %r15, 6*8(%rsp)
|
||||
|
||||
movq %r8, (%rsp)
|
||||
movq %r9, 1*8(%rsp)
|
||||
|
@ -74,7 +74,7 @@ ENTRY(csum_partial_copy_generic)
|
|||
/* main loop. clear in 64 byte blocks */
|
||||
/* r9: zero, r8: temp2, rbx: temp1, rax: sum, rcx: saved length */
|
||||
/* r11: temp3, rdx: temp4, r12 loopcnt */
|
||||
/* r10: temp5, rbp: temp6, r14 temp7, r13 temp8 */
|
||||
/* r10: temp5, r15: temp6, r14 temp7, r13 temp8 */
|
||||
.p2align 4
|
||||
.Lloop:
|
||||
source
|
||||
|
@ -89,7 +89,7 @@ ENTRY(csum_partial_copy_generic)
|
|||
source
|
||||
movq 32(%rdi), %r10
|
||||
source
|
||||
movq 40(%rdi), %rbp
|
||||
movq 40(%rdi), %r15
|
||||
source
|
||||
movq 48(%rdi), %r14
|
||||
source
|
||||
|
@ -103,7 +103,7 @@ ENTRY(csum_partial_copy_generic)
|
|||
adcq %r11, %rax
|
||||
adcq %rdx, %rax
|
||||
adcq %r10, %rax
|
||||
adcq %rbp, %rax
|
||||
adcq %r15, %rax
|
||||
adcq %r14, %rax
|
||||
adcq %r13, %rax
|
||||
|
||||
|
@ -121,7 +121,7 @@ ENTRY(csum_partial_copy_generic)
|
|||
dest
|
||||
movq %r10, 32(%rsi)
|
||||
dest
|
||||
movq %rbp, 40(%rsi)
|
||||
movq %r15, 40(%rsi)
|
||||
dest
|
||||
movq %r14, 48(%rsi)
|
||||
dest
|
||||
|
@ -203,7 +203,7 @@ ENTRY(csum_partial_copy_generic)
|
|||
movq 3*8(%rsp), %r12
|
||||
movq 4*8(%rsp), %r14
|
||||
movq 5*8(%rsp), %r13
|
||||
movq 6*8(%rsp), %rbp
|
||||
movq 6*8(%rsp), %r15
|
||||
addq $7*8, %rsp
|
||||
ret
|
||||
|
||||
|
|
|
@ -175,6 +175,9 @@ bool bio_integrity_enabled(struct bio *bio)
|
|||
if (!bio_is_rw(bio))
|
||||
return false;
|
||||
|
||||
if (!bio_sectors(bio))
|
||||
return false;
|
||||
|
||||
/* Already protected? */
|
||||
if (bio_integrity(bio))
|
||||
return false;
|
||||
|
|
|
@ -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_split(q, &bio, q->bio_split);
|
||||
|
||||
if (bio_integrity_enabled(bio) && bio_integrity_prep(bio)) {
|
||||
bio_io_error(bio);
|
||||
return BLK_QC_T_NONE;
|
||||
}
|
||||
|
||||
blk_queue_split(q, &bio, q->bio_split);
|
||||
|
||||
if (!is_flush_fua && !blk_queue_nomerges(q) &&
|
||||
blk_attempt_plug_merge(q, bio, &request_count, &same_queue_rq))
|
||||
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;
|
||||
|
||||
blk_mq_tag_idle(hctx);
|
||||
if (blk_mq_hw_queue_mapped(hctx))
|
||||
blk_mq_tag_idle(hctx);
|
||||
|
||||
if (set->ops->exit_request)
|
||||
set->ops->exit_request(set->driver_data,
|
||||
|
|
|
@ -320,8 +320,10 @@ struct hd_struct *add_partition(struct gendisk *disk, int partno,
|
|||
|
||||
if (info) {
|
||||
struct partition_meta_info *pinfo = alloc_part_info(disk);
|
||||
if (!pinfo)
|
||||
if (!pinfo) {
|
||||
err = -ENOMEM;
|
||||
goto out_free_stats;
|
||||
}
|
||||
memcpy(pinfo, info, sizeof(*info));
|
||||
p->info = pinfo;
|
||||
}
|
||||
|
|
15
build.config.cuttlefish.x86_64
Normal file
15
build.config.cuttlefish.x86_64
Normal 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
|
||||
"
|
|
@ -62,9 +62,6 @@ do_async_gen_syndrome(struct dma_chan *chan,
|
|||
dma_addr_t dma_dest[2];
|
||||
int src_off = 0;
|
||||
|
||||
if (submit->flags & ASYNC_TX_FENCE)
|
||||
dma_flags |= DMA_PREP_FENCE;
|
||||
|
||||
while (src_cnt > 0) {
|
||||
submit->flags = flags_orig;
|
||||
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)
|
||||
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
|
||||
* a descriptor
|
||||
|
|
|
@ -180,6 +180,12 @@ acpi_status acpi_enable_event(u32 event, u32 flags)
|
|||
|
||||
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 */
|
||||
|
||||
if (event > ACPI_EVENT_MAX) {
|
||||
|
@ -237,6 +243,12 @@ acpi_status acpi_disable_event(u32 event, u32 flags)
|
|||
|
||||
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 */
|
||||
|
||||
if (event > ACPI_EVENT_MAX) {
|
||||
|
@ -290,6 +302,12 @@ acpi_status acpi_clear_event(u32 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 */
|
||||
|
||||
if (event > ACPI_EVENT_MAX) {
|
||||
|
|
|
@ -121,6 +121,9 @@ static acpi_status acpi_ps_get_aml_opcode(struct acpi_walk_state *walk_state)
|
|||
(u32)(aml_offset +
|
||||
sizeof(struct acpi_table_header)));
|
||||
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Aborting disassembly, AML byte code is corrupt"));
|
||||
|
||||
/* Dump the context surrounding the invalid opcode */
|
||||
|
||||
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) -
|
||||
16));
|
||||
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
|
||||
}
|
||||
|
||||
|
@ -293,6 +304,9 @@ acpi_ps_create_op(struct acpi_walk_state *walk_state,
|
|||
if (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 */
|
||||
|
||||
|
|
|
@ -514,8 +514,9 @@ int ahci_platform_init_host(struct platform_device *pdev,
|
|||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq <= 0) {
|
||||
dev_err(dev, "no irq\n");
|
||||
return -EINVAL;
|
||||
if (irq != -EPROBE_DEFER)
|
||||
dev_err(dev, "no irq\n");
|
||||
return irq;
|
||||
}
|
||||
|
||||
hpriv->irq = irq;
|
||||
|
|
|
@ -623,6 +623,9 @@ static int loop_switch(struct loop_device *lo, struct file *file)
|
|||
*/
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
* 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_STATUS_TIMEOUT (1 << 12)
|
||||
#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_VALID (1 << 0)
|
||||
|
||||
|
@ -43,7 +41,6 @@ enum {
|
|||
ARB_ERR_CAP_CLR,
|
||||
ARB_ERR_CAP_HI_ADDR,
|
||||
ARB_ERR_CAP_ADDR,
|
||||
ARB_ERR_CAP_DATA,
|
||||
ARB_ERR_CAP_STATUS,
|
||||
ARB_ERR_CAP_MASTER,
|
||||
};
|
||||
|
@ -53,7 +50,6 @@ static const int gisb_offsets_bcm7038[] = {
|
|||
[ARB_ERR_CAP_CLR] = 0x0c4,
|
||||
[ARB_ERR_CAP_HI_ADDR] = -1,
|
||||
[ARB_ERR_CAP_ADDR] = 0x0c8,
|
||||
[ARB_ERR_CAP_DATA] = 0x0cc,
|
||||
[ARB_ERR_CAP_STATUS] = 0x0d0,
|
||||
[ARB_ERR_CAP_MASTER] = -1,
|
||||
};
|
||||
|
@ -63,7 +59,6 @@ static const int gisb_offsets_bcm7400[] = {
|
|||
[ARB_ERR_CAP_CLR] = 0x0c8,
|
||||
[ARB_ERR_CAP_HI_ADDR] = -1,
|
||||
[ARB_ERR_CAP_ADDR] = 0x0cc,
|
||||
[ARB_ERR_CAP_DATA] = 0x0d0,
|
||||
[ARB_ERR_CAP_STATUS] = 0x0d4,
|
||||
[ARB_ERR_CAP_MASTER] = 0x0d8,
|
||||
};
|
||||
|
@ -73,7 +68,6 @@ static const int gisb_offsets_bcm7435[] = {
|
|||
[ARB_ERR_CAP_CLR] = 0x168,
|
||||
[ARB_ERR_CAP_HI_ADDR] = -1,
|
||||
[ARB_ERR_CAP_ADDR] = 0x16c,
|
||||
[ARB_ERR_CAP_DATA] = 0x170,
|
||||
[ARB_ERR_CAP_STATUS] = 0x174,
|
||||
[ARB_ERR_CAP_MASTER] = 0x178,
|
||||
};
|
||||
|
@ -83,7 +77,6 @@ static const int gisb_offsets_bcm7445[] = {
|
|||
[ARB_ERR_CAP_CLR] = 0x7e4,
|
||||
[ARB_ERR_CAP_HI_ADDR] = 0x7e8,
|
||||
[ARB_ERR_CAP_ADDR] = 0x7ec,
|
||||
[ARB_ERR_CAP_DATA] = 0x7f0,
|
||||
[ARB_ERR_CAP_STATUS] = 0x7f4,
|
||||
[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];
|
||||
|
||||
/* return 1 if the hardware doesn't have ARB_ERR_CAP_MASTER */
|
||||
if (offset == -1)
|
||||
return 1;
|
||||
if (offset < 0) {
|
||||
/* return 1 if the hardware doesn't have ARB_ERR_CAP_MASTER */
|
||||
if (reg == ARB_ERR_CAP_MASTER)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (gdev->big_endian)
|
||||
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);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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;
|
||||
|
||||
if (gdev->big_endian)
|
||||
iowrite32be(val, gdev->base + reg);
|
||||
iowrite32be(val, gdev->base + offset);
|
||||
else
|
||||
iowrite32(val, gdev->base + reg);
|
||||
iowrite32(val, gdev->base + offset);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
u32 cap_status;
|
||||
unsigned long arb_addr;
|
||||
u64 arb_addr;
|
||||
u32 master;
|
||||
const char *m_name;
|
||||
char m_fmt[11];
|
||||
|
@ -193,10 +200,7 @@ static int brcmstb_gisb_arb_decode_addr(struct brcmstb_gisb_arb_device *gdev,
|
|||
return 1;
|
||||
|
||||
/* Read the address and master */
|
||||
arb_addr = gisb_read(gdev, ARB_ERR_CAP_ADDR) & 0xffffffff;
|
||||
#if (IS_ENABLED(CONFIG_PHYS_ADDR_T_64BIT))
|
||||
arb_addr |= (u64)gisb_read(gdev, ARB_ERR_CAP_HI_ADDR) << 32;
|
||||
#endif
|
||||
arb_addr = gisb_read_address(gdev);
|
||||
master = gisb_read(gdev, ARB_ERR_CAP_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;
|
||||
}
|
||||
|
||||
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,
|
||||
cap_status & ARB_ERR_CAP_STATUS_WRITE ? 'W' : 'R',
|
||||
cap_status & ARB_ERR_CAP_STATUS_TIMEOUT ? "timeout" : "",
|
||||
|
|
|
@ -409,6 +409,7 @@ static void start_event_fetch(struct ssif_info *ssif_info, unsigned long *flags)
|
|||
msg = ipmi_alloc_smi_msg();
|
||||
if (!msg) {
|
||||
ssif_info->ssif_state = SSIF_NORMAL;
|
||||
ipmi_ssif_unlock_cond(ssif_info, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -431,6 +432,7 @@ static void start_recv_msg_fetch(struct ssif_info *ssif_info,
|
|||
msg = ipmi_alloc_smi_msg();
|
||||
if (!msg) {
|
||||
ssif_info->ssif_state = SSIF_NORMAL;
|
||||
ipmi_ssif_unlock_cond(ssif_info, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -886,12 +886,16 @@ static void add_interrupt_bench(cycles_t start)
|
|||
static __u32 get_reg(struct fast_pool *f, struct pt_regs *regs)
|
||||
{
|
||||
__u32 *ptr = (__u32 *) regs;
|
||||
unsigned int idx;
|
||||
|
||||
if (regs == NULL)
|
||||
return 0;
|
||||
if (f->reg_idx >= sizeof(struct pt_regs) / sizeof(__u32))
|
||||
f->reg_idx = 0;
|
||||
return *(ptr + f->reg_idx++);
|
||||
idx = READ_ONCE(f->reg_idx);
|
||||
if (idx >= sizeof(struct pt_regs) / sizeof(__u32))
|
||||
idx = 0;
|
||||
ptr += idx++;
|
||||
WRITE_ONCE(f->reg_idx, idx);
|
||||
return *ptr;
|
||||
}
|
||||
|
||||
void add_interrupt_randomness(int irq, int irq_flags)
|
||||
|
|
|
@ -106,7 +106,7 @@ static int __set_clk_rates(struct device_node *node, bool clk_supplier)
|
|||
|
||||
rc = clk_set_rate(clk, rate);
|
||||
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_rate(clk));
|
||||
clk_put(clk);
|
||||
|
|
|
@ -71,15 +71,15 @@ static const struct clk_ops scpi_clk_ops = {
|
|||
};
|
||||
|
||||
/* 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;
|
||||
u32 fmin = 0, fmax = ~0, ftmp;
|
||||
unsigned long fmin = 0, fmax = ~0, ftmp;
|
||||
const struct scpi_opp *opp = clk->info->opps;
|
||||
|
||||
for (idx = 0; idx < clk->info->count; idx++, opp++) {
|
||||
ftmp = opp->freq;
|
||||
if (ftmp >= (u32)rate) {
|
||||
if (ftmp >= rate) {
|
||||
if (ftmp <= fmax)
|
||||
fmax = ftmp;
|
||||
break;
|
||||
|
|
|
@ -174,8 +174,10 @@ int dt_init_idle_driver(struct cpuidle_driver *drv,
|
|||
if (!state_node)
|
||||
break;
|
||||
|
||||
if (!of_device_is_available(state_node))
|
||||
if (!of_device_is_available(state_node)) {
|
||||
of_node_put(state_node);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!idle_state_valid(state_node, i, cpumask)) {
|
||||
pr_warn("%s idle state not valid, bailing out\n",
|
||||
|
|
|
@ -1722,17 +1722,24 @@ static int sdma_probe(struct platform_device *pdev)
|
|||
if (IS_ERR(sdma->clk_ahb))
|
||||
return PTR_ERR(sdma->clk_ahb);
|
||||
|
||||
clk_prepare(sdma->clk_ipg);
|
||||
clk_prepare(sdma->clk_ahb);
|
||||
ret = clk_prepare(sdma->clk_ipg);
|
||||
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",
|
||||
sdma);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_irq;
|
||||
|
||||
sdma->script_addrs = kzalloc(sizeof(*sdma->script_addrs), GFP_KERNEL);
|
||||
if (!sdma->script_addrs)
|
||||
return -ENOMEM;
|
||||
if (!sdma->script_addrs) {
|
||||
ret = -ENOMEM;
|
||||
goto err_irq;
|
||||
}
|
||||
|
||||
/* initially no scripts available */
|
||||
saddr_arr = (s32 *)sdma->script_addrs;
|
||||
|
@ -1847,6 +1854,10 @@ err_register:
|
|||
dma_async_device_unregister(&sdma->dma_device);
|
||||
err_init:
|
||||
kfree(sdma->script_addrs);
|
||||
err_irq:
|
||||
clk_unprepare(sdma->clk_ahb);
|
||||
err_clk:
|
||||
clk_unprepare(sdma->clk_ipg);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1857,6 +1868,8 @@ static int sdma_remove(struct platform_device *pdev)
|
|||
|
||||
dma_async_device_unregister(&sdma->dma_device);
|
||||
kfree(sdma->script_addrs);
|
||||
clk_unprepare(sdma->clk_ahb);
|
||||
clk_unprepare(sdma->clk_ipg);
|
||||
/* Kill the tasklet */
|
||||
for (i = 0; i < MAX_DMA_CHANNELS; i++) {
|
||||
struct sdma_channel *sdmac = &sdma->channel[i];
|
||||
|
|
|
@ -763,7 +763,7 @@ static int mv64x60_mc_err_probe(struct platform_device *pdev)
|
|||
/* Non-ECC RAM? */
|
||||
printk(KERN_WARNING "%s: No ECC DIMMs discovered\n", __func__);
|
||||
res = -ENODEV;
|
||||
goto err2;
|
||||
goto err;
|
||||
}
|
||||
|
||||
edac_dbg(3, "init mci\n");
|
||||
|
|
|
@ -2145,7 +2145,8 @@ struct gpio_desc *__must_check gpiod_get_index(struct device *dev,
|
|||
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)
|
||||
return ERR_PTR(status);
|
||||
|
||||
|
|
|
@ -158,7 +158,7 @@ static void evict_entry(struct drm_gem_object *obj,
|
|||
size_t size = PAGE_SIZE * n;
|
||||
loff_t off = mmap_offset(obj) +
|
||||
(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) {
|
||||
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
|
||||
* 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: */
|
||||
pgoff = ((unsigned long)vmf->virtual_address -
|
||||
|
|
|
@ -94,18 +94,20 @@ enum ina2xx_ids { ina219, ina226 };
|
|||
|
||||
struct ina2xx_config {
|
||||
u16 config_default;
|
||||
int calibration_factor;
|
||||
int calibration_value;
|
||||
int registers;
|
||||
int shunt_div;
|
||||
int bus_voltage_shift;
|
||||
int bus_voltage_lsb; /* uV */
|
||||
int power_lsb; /* uW */
|
||||
int power_lsb_factor;
|
||||
};
|
||||
|
||||
struct ina2xx_data {
|
||||
const struct ina2xx_config *config;
|
||||
|
||||
long rshunt;
|
||||
long current_lsb_uA;
|
||||
long power_lsb_uW;
|
||||
struct mutex config_lock;
|
||||
struct regmap *regmap;
|
||||
|
||||
|
@ -115,21 +117,21 @@ struct ina2xx_data {
|
|||
static const struct ina2xx_config ina2xx_config[] = {
|
||||
[ina219] = {
|
||||
.config_default = INA219_CONFIG_DEFAULT,
|
||||
.calibration_factor = 40960000,
|
||||
.calibration_value = 4096,
|
||||
.registers = INA219_REGISTERS,
|
||||
.shunt_div = 100,
|
||||
.bus_voltage_shift = 3,
|
||||
.bus_voltage_lsb = 4000,
|
||||
.power_lsb = 20000,
|
||||
.power_lsb_factor = 20,
|
||||
},
|
||||
[ina226] = {
|
||||
.config_default = INA226_CONFIG_DEFAULT,
|
||||
.calibration_factor = 5120000,
|
||||
.calibration_value = 2048,
|
||||
.registers = INA226_REGISTERS,
|
||||
.shunt_div = 400,
|
||||
.bus_voltage_shift = 0,
|
||||
.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);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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)
|
||||
{
|
||||
u16 val = DIV_ROUND_CLOSEST(data->config->calibration_factor,
|
||||
data->rshunt);
|
||||
|
||||
return regmap_write(data->regmap, INA2XX_CALIBRATION, val);
|
||||
return regmap_write(data->regmap, INA2XX_CALIBRATION,
|
||||
data->config->calibration_value);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -186,10 +192,6 @@ static int ina2xx_init(struct ina2xx_data *data)
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* Set current LSB to 1mA, shunt is in uOhms
|
||||
* (equation 13 in datasheet).
|
||||
*/
|
||||
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);
|
||||
break;
|
||||
case INA2XX_POWER:
|
||||
val = regval * data->config->power_lsb;
|
||||
val = regval * data->power_lsb_uW;
|
||||
break;
|
||||
case INA2XX_CURRENT:
|
||||
/* signed register, LSB=1mA (selected), in mA */
|
||||
val = (s16)regval;
|
||||
/* signed register, result in mA */
|
||||
val = regval * data->current_lsb_uA;
|
||||
val = DIV_ROUND_CLOSEST(val, 1000);
|
||||
break;
|
||||
case INA2XX_CALIBRATION:
|
||||
val = DIV_ROUND_CLOSEST(data->config->calibration_factor,
|
||||
regval);
|
||||
val = regval;
|
||||
break;
|
||||
default:
|
||||
/* programmer goofed */
|
||||
|
@ -303,9 +305,32 @@ static ssize_t ina2xx_show_value(struct device *dev,
|
|||
ina2xx_get_value(data, attr->index, regval));
|
||||
}
|
||||
|
||||
static ssize_t ina2xx_set_shunt(struct device *dev,
|
||||
struct device_attribute *da,
|
||||
const char *buf, size_t count)
|
||||
/*
|
||||
* In order to keep calibration register value fixed, the product
|
||||
* 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;
|
||||
int status;
|
||||
|
@ -315,18 +340,9 @@ static ssize_t ina2xx_set_shunt(struct device *dev,
|
|||
if (status < 0)
|
||||
return status;
|
||||
|
||||
if (val == 0 ||
|
||||
/* 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);
|
||||
status = ina2xx_set_shunt(data, val);
|
||||
if (status < 0)
|
||||
return status;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
|
@ -386,7 +402,7 @@ static SENSOR_DEVICE_ATTR(power1_input, S_IRUGO, ina2xx_show_value, NULL,
|
|||
|
||||
/* shunt resistance */
|
||||
static SENSOR_DEVICE_ATTR(shunt_resistor, S_IRUGO | S_IWUSR,
|
||||
ina2xx_show_value, ina2xx_set_shunt,
|
||||
ina2xx_show_value, ina2xx_store_shunt,
|
||||
INA2XX_CALIBRATION);
|
||||
|
||||
/* update interval (ina226 only) */
|
||||
|
@ -441,10 +457,7 @@ static int ina2xx_probe(struct i2c_client *client,
|
|||
val = INA2XX_RSHUNT_DEFAULT;
|
||||
}
|
||||
|
||||
if (val <= 0 || val > data->config->calibration_factor)
|
||||
return -ENODEV;
|
||||
|
||||
data->rshunt = val;
|
||||
ina2xx_set_shunt(data, val);
|
||||
|
||||
ina2xx_regmap_config.max_register = data->config->registers;
|
||||
|
||||
|
|
|
@ -121,10 +121,21 @@ static int hi8435_write_event_config(struct iio_dev *idev,
|
|||
enum iio_event_direction dir, int state)
|
||||
{
|
||||
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);
|
||||
} else
|
||||
priv->event_scan_mask &= ~BIT(chan->channel);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -442,13 +453,15 @@ static int hi8435_probe(struct spi_device *spi)
|
|||
priv->spi = spi;
|
||||
|
||||
reset_gpio = devm_gpiod_get(&spi->dev, NULL, GPIOD_OUT_LOW);
|
||||
if (IS_ERR(reset_gpio)) {
|
||||
/* chip s/w reset if h/w reset failed */
|
||||
if (!IS_ERR(reset_gpio)) {
|
||||
/* 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, 0);
|
||||
} else {
|
||||
udelay(5);
|
||||
gpiod_set_value(reset_gpio, 1);
|
||||
}
|
||||
|
||||
spi_set_drvdata(spi, idev);
|
||||
|
|
|
@ -48,8 +48,6 @@ static int st_magn_spi_remove(struct spi_device *spi)
|
|||
}
|
||||
|
||||
static const struct spi_device_id st_magn_id_table[] = {
|
||||
{ LSM303DLHC_MAGN_DEV_NAME },
|
||||
{ LSM303DLM_MAGN_DEV_NAME },
|
||||
{ LIS3MDL_MAGN_DEV_NAME },
|
||||
{ LSM303AGR_MAGN_DEV_NAME },
|
||||
{},
|
||||
|
|
|
@ -2974,12 +2974,8 @@ static void srpt_queue_response(struct se_cmd *cmd)
|
|||
}
|
||||
spin_unlock_irqrestore(&ioctx->spinlock, flags);
|
||||
|
||||
if (unlikely(transport_check_aborted_status(&ioctx->cmd, false)
|
||||
|| WARN_ON_ONCE(state == SRPT_STATE_CMD_RSP_SENT))) {
|
||||
atomic_inc(&ch->req_lim_delta);
|
||||
srpt_abort_cmd(ioctx);
|
||||
if (unlikely(WARN_ON_ONCE(state == SRPT_STATE_CMD_RSP_SENT)))
|
||||
return;
|
||||
}
|
||||
|
||||
dir = ioctx->cmd.data_direction;
|
||||
|
||||
|
|
|
@ -1082,6 +1082,13 @@ static int elan_probe(struct i2c_client *client,
|
|||
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. */
|
||||
error = elan_initialize(data);
|
||||
if (error)
|
||||
|
|
|
@ -557,7 +557,14 @@ static int elan_i2c_finish_fw_update(struct i2c_client *client,
|
|||
long ret;
|
||||
int error;
|
||||
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);
|
||||
enable_irq(client->irq);
|
||||
|
|
|
@ -1715,6 +1715,17 @@ int elantech_init(struct psmouse *psmouse)
|
|||
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)) {
|
||||
psmouse_err(psmouse,
|
||||
"failed to put touchpad into absolute mode.\n");
|
||||
|
|
|
@ -72,7 +72,7 @@ send_socklist(struct mISDN_sock_list *sl, struct sk_buff *skb)
|
|||
if (sk->sk_state != MISDN_BOUND)
|
||||
continue;
|
||||
if (!cskb)
|
||||
cskb = skb_copy(skb, GFP_KERNEL);
|
||||
cskb = skb_copy(skb, GFP_ATOMIC);
|
||||
if (!cskb) {
|
||||
printk(KERN_WARNING "%s no skb\n", __func__);
|
||||
break;
|
||||
|
|
|
@ -281,7 +281,7 @@ static int pca955x_probe(struct i2c_client *client,
|
|||
"slave address 0x%02x\n",
|
||||
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;
|
||||
|
||||
if (pdata) {
|
||||
|
|
|
@ -514,15 +514,21 @@ struct open_bucket {
|
|||
|
||||
/*
|
||||
* 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
|
||||
* 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.
|
||||
* write streams for better cache utilization: first we try to segregate flash
|
||||
* only volume write streams from cached devices, secondly we look for a bucket
|
||||
* 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
|
||||
* same time, you'll get better cache utilization if you try to segregate their
|
||||
* 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
|
||||
* 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.
|
||||
|
@ -539,7 +545,10 @@ static struct open_bucket *pick_data_bucket(struct cache_set *c,
|
|||
struct open_bucket *ret, *ret_task = NULL;
|
||||
|
||||
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;
|
||||
else if (ret->last_write_point == write_point)
|
||||
ret_task = ret;
|
||||
|
|
|
@ -890,6 +890,12 @@ static void cached_dev_detach_finish(struct work_struct *w)
|
|||
|
||||
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);
|
||||
SET_BDEV_STATE(&dc->sb, BDEV_STATE_NONE);
|
||||
|
||||
|
|
|
@ -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);
|
||||
lock_comm(cinfo);
|
||||
ret = __sendmsg(cinfo, &cmsg);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
unlock_comm(cinfo);
|
||||
return ret;
|
||||
}
|
||||
cinfo->no_new_dev_lockres->flags |= DLM_LKF_NOQUEUE;
|
||||
ret = dlm_lock_sync(cinfo->no_new_dev_lockres, DLM_LOCK_EX);
|
||||
cinfo->no_new_dev_lockres->flags &= ~DLM_LKF_NOQUEUE;
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
int i;
|
||||
local_irq_disable();
|
||||
spin_lock(conf->hash_locks);
|
||||
spin_lock_irq(conf->hash_locks);
|
||||
for (i = 1; i < NR_STRIPE_HASH_LOCKS; i++)
|
||||
spin_lock_nest_lock(conf->hash_locks + i, conf->hash_locks);
|
||||
spin_lock(&conf->device_lock);
|
||||
|
@ -121,9 +120,9 @@ static inline void unlock_all_device_hash_locks_irq(struct r5conf *conf)
|
|||
{
|
||||
int i;
|
||||
spin_unlock(&conf->device_lock);
|
||||
for (i = NR_STRIPE_HASH_LOCKS; i; i--)
|
||||
spin_unlock(conf->hash_locks + i - 1);
|
||||
local_irq_enable();
|
||||
for (i = NR_STRIPE_HASH_LOCKS - 1; i; i--)
|
||||
spin_unlock(conf->hash_locks + i);
|
||||
spin_unlock_irq(conf->hash_locks);
|
||||
}
|
||||
|
||||
/* 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)
|
||||
{
|
||||
local_irq_disable();
|
||||
if (sh1 > sh2) {
|
||||
spin_lock(&sh2->stripe_lock);
|
||||
spin_lock_irq(&sh2->stripe_lock);
|
||||
spin_lock_nested(&sh1->stripe_lock, 1);
|
||||
} else {
|
||||
spin_lock(&sh1->stripe_lock);
|
||||
spin_lock_irq(&sh1->stripe_lock);
|
||||
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)
|
||||
{
|
||||
spin_unlock(&sh1->stripe_lock);
|
||||
spin_unlock(&sh2->stripe_lock);
|
||||
local_irq_enable();
|
||||
spin_unlock_irq(&sh2->stripe_lock);
|
||||
}
|
||||
|
||||
/* Only freshly new full stripe normal write stripe can be added to a batch list */
|
||||
|
|
|
@ -420,11 +420,13 @@ static void cx25840_initialize(struct i2c_client *client)
|
|||
INIT_WORK(&state->fw_work, cx25840_work_handler);
|
||||
init_waitqueue_head(&state->fw_wait);
|
||||
q = create_singlethread_workqueue("cx25840_fw");
|
||||
prepare_to_wait(&state->fw_wait, &wait, TASK_UNINTERRUPTIBLE);
|
||||
queue_work(q, &state->fw_work);
|
||||
schedule();
|
||||
finish_wait(&state->fw_wait, &wait);
|
||||
destroy_workqueue(q);
|
||||
if (q) {
|
||||
prepare_to_wait(&state->fw_wait, &wait, TASK_UNINTERRUPTIBLE);
|
||||
queue_work(q, &state->fw_work);
|
||||
schedule();
|
||||
finish_wait(&state->fw_wait, &wait);
|
||||
destroy_workqueue(q);
|
||||
}
|
||||
|
||||
/* 6. */
|
||||
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_waitqueue_head(&state->fw_wait);
|
||||
q = create_singlethread_workqueue("cx25840_fw");
|
||||
prepare_to_wait(&state->fw_wait, &wait, TASK_UNINTERRUPTIBLE);
|
||||
queue_work(q, &state->fw_work);
|
||||
schedule();
|
||||
finish_wait(&state->fw_wait, &wait);
|
||||
destroy_workqueue(q);
|
||||
if (q) {
|
||||
prepare_to_wait(&state->fw_wait, &wait, TASK_UNINTERRUPTIBLE);
|
||||
queue_work(q, &state->fw_work);
|
||||
schedule();
|
||||
finish_wait(&state->fw_wait, &wait);
|
||||
destroy_workqueue(q);
|
||||
}
|
||||
|
||||
/* Call the cx23888 specific std setup func, we no longer rely on
|
||||
* 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_waitqueue_head(&state->fw_wait);
|
||||
q = create_singlethread_workqueue("cx25840_fw");
|
||||
prepare_to_wait(&state->fw_wait, &wait, TASK_UNINTERRUPTIBLE);
|
||||
queue_work(q, &state->fw_work);
|
||||
schedule();
|
||||
finish_wait(&state->fw_wait, &wait);
|
||||
destroy_workqueue(q);
|
||||
if (q) {
|
||||
prepare_to_wait(&state->fw_wait, &wait, TASK_UNINTERRUPTIBLE);
|
||||
queue_work(q, &state->fw_work);
|
||||
schedule();
|
||||
finish_wait(&state->fw_wait, &wait);
|
||||
destroy_workqueue(q);
|
||||
}
|
||||
|
||||
cx25840_std_setup(client);
|
||||
|
||||
|
|
|
@ -1370,8 +1370,13 @@ static int mceusb_dev_probe(struct usb_interface *intf,
|
|||
goto rc_dev_fail;
|
||||
|
||||
/* wire up inbound data handler */
|
||||
usb_fill_int_urb(ir->urb_in, dev, pipe, ir->buf_in, maxp,
|
||||
mceusb_dev_recv, ir, ep_in->bInterval);
|
||||
if (usb_endpoint_xfer_int(ep_in))
|
||||
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_flags |= URB_NO_TRANSFER_DMA_MAP;
|
||||
|
||||
|
|
|
@ -205,6 +205,10 @@ static int __vb2_queue_alloc(struct vb2_queue *q, enum vb2_memory memory,
|
|||
struct vb2_buffer *vb;
|
||||
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) {
|
||||
/* Allocate videobuf buffer structures */
|
||||
vb = kzalloc(q->buf_struct_size, GFP_KERNEL);
|
||||
|
|
|
@ -298,8 +298,11 @@ static void *qp_alloc_queue(u64 size, u32 flags)
|
|||
size_t pas_size;
|
||||
size_t vas_size;
|
||||
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 >
|
||||
(SIZE_MAX - queue_size) /
|
||||
(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;
|
||||
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));
|
||||
|
||||
if (size > SIZE_MAX - PAGE_SIZE)
|
||||
return NULL;
|
||||
num_pages = DIV_ROUND_UP(size, PAGE_SIZE) + 1;
|
||||
if (num_pages > (SIZE_MAX - queue_size) /
|
||||
sizeof(*queue->kernel_if->u.h.page))
|
||||
return NULL;
|
||||
|
|
|
@ -1490,39 +1490,6 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
|
|||
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);
|
||||
if (res) {
|
||||
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;
|
||||
}
|
||||
|
||||
/* 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_compute_features(bond);
|
||||
bond_set_carrier(bond);
|
||||
|
@ -1702,6 +1703,9 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
|
|||
return 0;
|
||||
|
||||
/* Undo stages on error */
|
||||
err_sysfs_del:
|
||||
bond_sysfs_slave_del(new_slave);
|
||||
|
||||
err_upper_unlink:
|
||||
bond_upper_dev_unlink(bond_dev, slave_dev);
|
||||
|
||||
|
@ -1709,9 +1713,6 @@ err_unregister:
|
|||
netdev_rx_handler_unregister(slave_dev);
|
||||
|
||||
err_detach:
|
||||
if (!bond_uses_primary(bond))
|
||||
bond_hw_addr_flush(bond_dev, slave_dev);
|
||||
|
||||
vlan_vids_del_by_dev(slave_dev, bond_dev);
|
||||
if (rcu_access_pointer(bond->primary_slave) == new_slave)
|
||||
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) {
|
||||
unsigned long trans_start = dev_trans_start(slave->dev);
|
||||
|
||||
slave->new_link = BOND_LINK_NOCHANGE;
|
||||
|
||||
if (slave->link != BOND_LINK_UP) {
|
||||
if (bond_time_in_interval(bond, trans_start, 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;
|
||||
|
||||
/* 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) ||
|
||||
!bond_time_in_interval(bond, slave->last_rx, 2)) {
|
||||
|
||||
slave->link = BOND_LINK_DOWN;
|
||||
slave->new_link = BOND_LINK_DOWN;
|
||||
slave_state_changed = 1;
|
||||
|
||||
if (slave->link_failure_count < UINT_MAX)
|
||||
|
@ -2617,6 +2620,11 @@ static void bond_loadbalance_arp_mon(struct work_struct *work)
|
|||
if (!rtnl_trylock())
|
||||
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) {
|
||||
bond_slave_state_change(bond);
|
||||
if (BOND_MODE(bond) == BOND_MODE_XOR)
|
||||
|
|
|
@ -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
|
||||
* for fw to enforce it
|
||||
*/
|
||||
u16 vlan_tci = 0;
|
||||
#ifndef BNX2X_STOP_ON_ERROR
|
||||
if (IS_VF(bp))
|
||||
if (IS_VF(bp)) {
|
||||
#endif
|
||||
tx_start_bd->vlan_or_ethertype =
|
||||
cpu_to_le16(ntohs(eth->h_proto));
|
||||
/* Still need to consider inband vlan for enforced */
|
||||
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
|
||||
else
|
||||
} else {
|
||||
/* used by FW for packet accounting */
|
||||
tx_start_bd->vlan_or_ethertype = cpu_to_le16(pkt_prod);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -2845,7 +2845,7 @@ bfa_ioc_get_adapter_optrom_ver(struct bfa_ioc *ioc, char *optrom_ver)
|
|||
static void
|
||||
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
|
||||
|
|
|
@ -6076,13 +6076,18 @@ int t4_fw_upgrade(struct adapter *adap, unsigned int mbox,
|
|||
if (!t4_fw_matches_chip(adap, fw_hdr))
|
||||
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);
|
||||
if (ret < 0 && !force)
|
||||
return ret;
|
||||
goto out;
|
||||
|
||||
ret = t4_load_fw(adap, fw_data, size);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
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]);
|
||||
if (ret)
|
||||
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:
|
||||
if (cfg & UPDBGLAEN_F) {
|
||||
|
|
|
@ -2604,8 +2604,8 @@ void t4vf_sge_stop(struct adapter *adapter)
|
|||
int t4vf_sge_init(struct adapter *adapter)
|
||||
{
|
||||
struct sge_params *sge_params = &adapter->params.sge;
|
||||
u32 fl0 = sge_params->sge_fl_buffer_size[0];
|
||||
u32 fl1 = sge_params->sge_fl_buffer_size[1];
|
||||
u32 fl_small_pg = sge_params->sge_fl_buffer_size[0];
|
||||
u32 fl_large_pg = sge_params->sge_fl_buffer_size[1];
|
||||
struct sge *s = &adapter->sge;
|
||||
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
|
||||
* 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",
|
||||
fl0, fl1);
|
||||
fl_small_pg, fl_large_pg);
|
||||
return -EINVAL;
|
||||
}
|
||||
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.
|
||||
*/
|
||||
if (fl1)
|
||||
s->fl_pg_order = ilog2(fl1) - PAGE_SHIFT;
|
||||
if (fl_large_pg)
|
||||
s->fl_pg_order = ilog2(fl_large_pg) - PAGE_SHIFT;
|
||||
s->stat_len = ((sge_params->sge_control & EGRSTATUSPAGESIZE_F)
|
||||
? 128 : 64);
|
||||
s->pktshift = PKTSHIFT_G(sge_params->sge_control);
|
||||
|
|
|
@ -382,7 +382,7 @@ static int fsl_pq_mdio_probe(struct platform_device *pdev)
|
|||
{
|
||||
const struct of_device_id *id =
|
||||
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 resource res;
|
||||
struct device_node *tbi;
|
||||
|
@ -390,6 +390,13 @@ static int fsl_pq_mdio_probe(struct platform_device *pdev)
|
|||
struct mii_bus *new_bus;
|
||||
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);
|
||||
|
||||
new_bus = mdiobus_alloc_size(sizeof(*priv));
|
||||
|
|
|
@ -342,6 +342,7 @@ static int emac_reset(struct emac_instance *dev)
|
|||
{
|
||||
struct emac_regs __iomem *p = dev->emacp;
|
||||
int n = 20;
|
||||
bool __maybe_unused try_internal_clock = false;
|
||||
|
||||
DBG(dev, "reset" NL);
|
||||
|
||||
|
@ -354,6 +355,7 @@ static int emac_reset(struct emac_instance *dev)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_PPC_DCR_NATIVE
|
||||
do_retry:
|
||||
/*
|
||||
* PPC460EX/GT Embedded Processor Advanced User's Manual
|
||||
* 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
|
||||
* (SDR0_ETH_CFG[EMACx_PHY_CLK] = 1).
|
||||
* 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 (dev->phy_address == 0xffffffff &&
|
||||
dev->phy_map == 0xffffffff) {
|
||||
if (try_internal_clock || (dev->phy_address == 0xffffffff &&
|
||||
dev->phy_map == 0xffffffff)) {
|
||||
/* No PHY: select internal loop clock before reset */
|
||||
dcri_clrset(SDR0, SDR0_ETH_CFG,
|
||||
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
|
||||
if (emac_has_feature(dev, EMAC_FTR_460EX_PHY_CLK_FIX)) {
|
||||
if (dev->phy_address == 0xffffffff &&
|
||||
dev->phy_map == 0xffffffff) {
|
||||
if (!n && !try_internal_clock) {
|
||||
/* 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 */
|
||||
dcri_clrset(SDR0, SDR0_ETH_CFG,
|
||||
SDR0_ETH_CFG_ECS << dev->cell_index, 0);
|
||||
|
|
|
@ -1182,6 +1182,7 @@ static void e1000e_tx_hwtstamp_work(struct work_struct *work)
|
|||
struct e1000_hw *hw = &adapter->hw;
|
||||
|
||||
if (er32(TSYNCTXCTL) & E1000_TSYNCTXCTL_VALID) {
|
||||
struct sk_buff *skb = adapter->tx_hwtstamp_skb;
|
||||
struct skb_shared_hwtstamps shhwtstamps;
|
||||
u64 txstmp;
|
||||
|
||||
|
@ -1190,9 +1191,14 @@ static void e1000e_tx_hwtstamp_work(struct work_struct *work)
|
|||
|
||||
e1000e_systim_to_hwtstamp(adapter, &shhwtstamps, txstmp);
|
||||
|
||||
skb_tstamp_tx(adapter->tx_hwtstamp_skb, &shhwtstamps);
|
||||
dev_kfree_skb_any(adapter->tx_hwtstamp_skb);
|
||||
/* Clear the global tx_hwtstamp_skb pointer and force writes
|
||||
* prior to notifying the stack of a Tx timestamp.
|
||||
*/
|
||||
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
|
||||
+ adapter->tx_timeout_factor * HZ)) {
|
||||
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)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
int rc;
|
||||
|
||||
e1000e_flush_lpic(pdev);
|
||||
|
||||
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)
|
||||
|
|
|
@ -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);
|
||||
|
||||
pci_set_drvdata(pdev, hw);
|
||||
pdev->d3_delay = 150;
|
||||
pdev->d3_delay = 200;
|
||||
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#include <linux/etherdevice.h>
|
||||
|
||||
#include <linux/mlx4/cmd.h>
|
||||
#include <linux/mlx4/qp.h>
|
||||
#include <linux/export.h>
|
||||
|
||||
#include "mlx4.h"
|
||||
|
@ -985,16 +986,21 @@ int mlx4_flow_attach(struct mlx4_dev *dev,
|
|||
if (IS_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);
|
||||
|
||||
size += sizeof(struct mlx4_net_trans_rule_hw_ctrl);
|
||||
|
||||
list_for_each_entry(cur, &rule->list, list) {
|
||||
ret = parse_trans_rule(dev, cur, mailbox->buf + size);
|
||||
if (ret < 0) {
|
||||
mlx4_free_cmd_mailbox(dev, mailbox);
|
||||
return ret;
|
||||
}
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
size += ret;
|
||||
}
|
||||
|
||||
|
@ -1021,6 +1027,7 @@ int mlx4_flow_attach(struct mlx4_dev *dev,
|
|||
}
|
||||
}
|
||||
|
||||
out:
|
||||
mlx4_free_cmd_mailbox(dev, mailbox);
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -381,6 +381,19 @@ static void mlx4_qp_free_icm(struct mlx4_dev *dev, int 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)
|
||||
{
|
||||
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 (!(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;
|
||||
cmd->qp_context.qos_vport = params->qos_vport;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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;
|
||||
upd_context->qp_context.pri_path.sched_queue |=
|
||||
((work->qos & 0x7) << 3);
|
||||
upd_context->qp_mask |=
|
||||
cpu_to_be64(1ULL <<
|
||||
MLX4_UPD_QP_MASK_QOS_VPP);
|
||||
upd_context->qp_context.qos_vport =
|
||||
work->qos_vport;
|
||||
|
||||
if (dev->caps.flags2 &
|
||||
MLX4_DEV_CAP_FLAG2_QOS_VPP)
|
||||
update_qos_vpp(upd_context, work);
|
||||
}
|
||||
|
||||
err = mlx4_cmd(dev, mailbox->dma,
|
||||
|
|
|
@ -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 msix_entry *msix = priv->msix_arr;
|
||||
int irq = msix[i + MLX5_EQ_VEC_COMP_BASE].vector;
|
||||
int err;
|
||||
|
||||
if (!zalloc_cpumask_var(&priv->irq_info[i].mask, GFP_KERNEL)) {
|
||||
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),
|
||||
priv->irq_info[i].mask);
|
||||
|
||||
err = irq_set_affinity_hint(irq, priv->irq_info[i].mask);
|
||||
if (err) {
|
||||
mlx5_core_warn(mdev, "irq_set_affinity_hint failed,irq 0x%.4x",
|
||||
irq);
|
||||
goto err_clear_mask;
|
||||
}
|
||||
if (IS_ENABLED(CONFIG_SMP) &&
|
||||
irq_set_affinity_hint(irq, priv->irq_info[i].mask))
|
||||
mlx5_core_warn(mdev, "irq_set_affinity_hint failed, irq 0x%.4x", irq);
|
||||
|
||||
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)
|
||||
|
|
|
@ -247,7 +247,7 @@ nx_fw_cmd_set_mtu(struct netxen_adapter *adapter, int mtu)
|
|||
cmd.req.arg3 = 0;
|
||||
|
||||
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)
|
||||
return -EIO;
|
||||
|
|
|
@ -341,7 +341,7 @@ qlcnic_pcie_sem_lock(struct qlcnic_adapter *adapter, int sem, u32 id_reg)
|
|||
}
|
||||
return -EIO;
|
||||
}
|
||||
usleep_range(1000, 1500);
|
||||
udelay(1200);
|
||||
}
|
||||
|
||||
if (id_reg)
|
||||
|
|
|
@ -765,7 +765,7 @@ int ql_core_dump(struct ql_adapter *qdev, struct ql_mpi_coredump *mpi_coredump)
|
|||
sizeof(struct mpi_coredump_global_header);
|
||||
mpi_coredump->mpi_global_header.imageSize =
|
||||
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));
|
||||
|
||||
/* 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);
|
||||
mpi_coredump->mpi_global_header.imageSize =
|
||||
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));
|
||||
|
||||
|
||||
|
|
|
@ -296,8 +296,9 @@ qcaspi_receive(struct qcaspi *qca)
|
|||
|
||||
/* Allocate rx SKB if we don't have one available. */
|
||||
if (!qca->rx_skb) {
|
||||
qca->rx_skb = netdev_alloc_skb(net_dev,
|
||||
net_dev->mtu + VLAN_ETH_HLEN);
|
||||
qca->rx_skb = netdev_alloc_skb_ip_align(net_dev,
|
||||
net_dev->mtu +
|
||||
VLAN_ETH_HLEN);
|
||||
if (!qca->rx_skb) {
|
||||
netdev_dbg(net_dev, "out of RX resources\n");
|
||||
qca->stats.out_of_mem++;
|
||||
|
@ -377,7 +378,7 @@ qcaspi_receive(struct qcaspi *qca)
|
|||
qca->rx_skb, qca->rx_skb->dev);
|
||||
qca->rx_skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||
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);
|
||||
if (!qca->rx_skb) {
|
||||
netdev_dbg(net_dev, "out of RX resources\n");
|
||||
|
@ -759,7 +760,8 @@ qcaspi_netdev_init(struct net_device *dev)
|
|||
if (!qca->rx_buffer)
|
||||
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) {
|
||||
kfree(qca->rx_buffer);
|
||||
netdev_info(qca->net_dev, "Failed to allocate RX sk_buff.\n");
|
||||
|
|
|
@ -8411,12 +8411,12 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
goto err_out_msi_4;
|
||||
}
|
||||
|
||||
pci_set_drvdata(pdev, dev);
|
||||
|
||||
rc = register_netdev(dev);
|
||||
if (rc < 0)
|
||||
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",
|
||||
rtl_chip_infos[chipset].name, ioaddr, dev->dev_addr,
|
||||
(u32)(RTL_R32(TxConfig) & 0x9cf0f8ff), pdev->irq);
|
||||
|
|
|
@ -3222,7 +3222,7 @@ static int sh_eth_drv_probe(struct platform_device *pdev)
|
|||
/* MDIO bus init */
|
||||
ret = sh_mdio_init(mdp, pd);
|
||||
if (ret) {
|
||||
dev_err(&ndev->dev, "failed to initialise MDIO\n");
|
||||
dev_err(&pdev->dev, "failed to initialise MDIO\n");
|
||||
goto out_release;
|
||||
}
|
||||
|
||||
|
|
|
@ -280,6 +280,10 @@ struct cpsw_ss_regs {
|
|||
/* Bit definitions for the CPSW1_TS_SEQ_LTYPE register */
|
||||
#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 {
|
||||
u32 max_blks;
|
||||
u32 blk_cnt;
|
||||
|
@ -1127,11 +1131,23 @@ static void cpsw_slave_open(struct cpsw_slave *slave, struct cpsw_priv *priv)
|
|||
switch (priv->version) {
|
||||
case CPSW_VERSION_1:
|
||||
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;
|
||||
case CPSW_VERSION_2:
|
||||
case CPSW_VERSION_3:
|
||||
case CPSW_VERSION_4:
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -574,6 +574,8 @@ static int hdlcdrv_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|||
case HDLCDRVCTL_CALIBRATE:
|
||||
if(!capable(CAP_SYS_RAWIO))
|
||||
return -EPERM;
|
||||
if (s->par.bitrate <= 0)
|
||||
return -EINVAL;
|
||||
if (bi.data.calibrate > INT_MAX / s->par.bitrate)
|
||||
return -EINVAL;
|
||||
s->hdlctx.calibrate = bi.data.calibrate * s->par.bitrate / 16;
|
||||
|
|
|
@ -148,6 +148,12 @@ static inline int phy_aneg_done(struct phy_device *phydev)
|
|||
if (phydev->drv->aneg_done)
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -501,7 +501,6 @@ static int pptp_connect(struct socket *sock, struct sockaddr *uservaddr,
|
|||
po->chan.mtu = dst_mtu(&rt->dst);
|
||||
if (!po->chan.mtu)
|
||||
po->chan.mtu = PPP_MRU;
|
||||
ip_rt_put(rt);
|
||||
po->chan.mtu -= PPTP_HEADER_OVERHEAD;
|
||||
|
||||
po->chan.hdrlen = 2 + sizeof(struct pptp_gre_header);
|
||||
|
|
|
@ -1069,6 +1069,7 @@ cdc_ncm_fill_tx_frame(struct usbnet *dev, struct sk_buff *skb, __le32 sign)
|
|||
u16 n = 0, index, ndplen;
|
||||
u8 ready2send = 0;
|
||||
u32 delayed_ndp_size;
|
||||
size_t padding_count;
|
||||
|
||||
/* When our NDP gets written in cdc_ncm_ndp(), then skb_out->len gets updated
|
||||
* 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.
|
||||
*/
|
||||
if (!(dev->driver_info->flags & FLAG_SEND_ZLP) &&
|
||||
skb_out->len > ctx->min_tx_pkt)
|
||||
memset(skb_put(skb_out, ctx->tx_max - skb_out->len), 0,
|
||||
ctx->tx_max - skb_out->len);
|
||||
else if (skb_out->len < ctx->tx_max && (skb_out->len % dev->maxpacket) == 0)
|
||||
skb_out->len > ctx->min_tx_pkt) {
|
||||
padding_count = 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) {
|
||||
*skb_put(skb_out, 1) = 0; /* force short packet */
|
||||
}
|
||||
|
||||
/* set final frame length */
|
||||
nth16 = (struct usb_cdc_ncm_nth16 *)skb_out->data;
|
||||
|
|
|
@ -556,7 +556,12 @@ static int add_recvbuf_small(struct virtnet_info *vi, struct receive_queue *rq,
|
|||
hdr = skb_vnet_hdr(skb);
|
||||
sg_init_table(rq->sg, 2);
|
||||
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);
|
||||
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;
|
||||
const unsigned char *dest = ((struct ethhdr *)skb->data)->h_dest;
|
||||
struct virtnet_info *vi = sq->vq->vdev->priv;
|
||||
unsigned num_sg;
|
||||
int num_sg;
|
||||
unsigned hdr_len = vi->hdr_len;
|
||||
bool can_push;
|
||||
|
||||
|
@ -911,11 +916,16 @@ static int xmit_skb(struct send_queue *sq, struct sk_buff *skb)
|
|||
if (can_push) {
|
||||
__skb_push(skb, hdr_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. */
|
||||
__skb_pull(skb, hdr_len);
|
||||
} else {
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -2789,6 +2789,11 @@ vmxnet3_force_close(struct vmxnet3_adapter *adapter)
|
|||
/* we need to enable NAPI, otherwise dev_close will deadlock */
|
||||
for (i = 0; i < adapter->num_rx_queues; i++)
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
if (unlikely(!neigh))
|
||||
neigh = __neigh_create(&arp_tbl, &nexthop, dev, false);
|
||||
if (!IS_ERR(neigh))
|
||||
if (!IS_ERR(neigh)) {
|
||||
ret = dst_neigh_output(dst, neigh, skb);
|
||||
rcu_read_unlock_bh();
|
||||
return ret;
|
||||
}
|
||||
|
||||
rcu_read_unlock_bh();
|
||||
err:
|
||||
if (unlikely(ret < 0))
|
||||
vrf_tx_error(skb->dev, skb);
|
||||
vrf_tx_error(skb->dev, skb);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -962,7 +962,7 @@ static bool vxlan_snoop(struct net_device *dev,
|
|||
return false;
|
||||
|
||||
/* Don't migrate static entries, drop packets */
|
||||
if (f->state & NUD_NOARP)
|
||||
if (f->state & (NUD_PERMANENT | NUD_NOARP))
|
||||
return true;
|
||||
|
||||
if (net_ratelimit())
|
||||
|
|
|
@ -939,7 +939,10 @@ static int open_file_eeprom(struct inode *inode, struct file *file)
|
|||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -247,7 +247,10 @@ static const UCHAR b4_default_startup_parms[] = {
|
|||
0x04, 0x08, /* Noise gain, limit offset */
|
||||
0x28, 0x28, /* det rssi, med busy offsets */
|
||||
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
|
||||
*//* 64ms = 010000 */
|
||||
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));
|
||||
/* Translate sane kus input values to old build 4/5 format */
|
||||
/* i = hop time in uS truncated to 3 bytes */
|
||||
|
|
|
@ -1196,8 +1196,7 @@ static void wl1251_op_bss_info_changed(struct ieee80211_hw *hw,
|
|||
WARN_ON(wl->bss_type != BSS_TYPE_STA_BSS);
|
||||
|
||||
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)
|
||||
goto out_sleep;
|
||||
}
|
||||
|
|
|
@ -538,6 +538,7 @@ struct powercap_zone *powercap_register_zone(
|
|||
|
||||
power_zone->id = result;
|
||||
idr_init(&power_zone->idr);
|
||||
result = -ENOMEM;
|
||||
power_zone->name = kstrdup(name, GFP_KERNEL);
|
||||
if (!power_zone->name)
|
||||
goto err_name_alloc;
|
||||
|
|
|
@ -217,6 +217,13 @@ int __rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
|
|||
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 */
|
||||
t_now = rtc_tm_to_time64(&now);
|
||||
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");
|
||||
}
|
||||
|
||||
done:
|
||||
err = rtc_valid_tm(&alarm->time);
|
||||
|
||||
done:
|
||||
if (err) {
|
||||
dev_warn(&rtc->dev, "invalid alarm value: %d-%d-%d %d:%d:%d\n",
|
||||
alarm->time.tm_year + 1900, alarm->time.tm_mon + 1,
|
||||
|
|
|
@ -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);
|
||||
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);
|
||||
|
||||
exit:
|
||||
|
|
|
@ -257,7 +257,7 @@ static int snvs_rtc_probe(struct platform_device *pdev)
|
|||
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");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
|
|
@ -1881,8 +1881,12 @@ static int __dasd_device_is_unusable(struct dasd_device *device,
|
|||
{
|
||||
int mask = ~(DASD_STOPPED_DC_WAIT | DASD_UNRESUMED_PM);
|
||||
|
||||
if (test_bit(DASD_FLAG_OFFLINE, &device->flags)) {
|
||||
/* dasd is being set offline. */
|
||||
if (test_bit(DASD_FLAG_OFFLINE, &device->flags) &&
|
||||
!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;
|
||||
}
|
||||
if (device->stopped) {
|
||||
|
|
|
@ -191,6 +191,7 @@ struct bnx2fc_hba {
|
|||
struct bnx2fc_cmd_mgr *cmd_mgr;
|
||||
spinlock_t hba_lock;
|
||||
struct mutex hba_mutex;
|
||||
struct mutex hba_stats_mutex;
|
||||
unsigned long adapter_state;
|
||||
#define ADAPTER_STATE_UP 0
|
||||
#define ADAPTER_STATE_GOING_DOWN 1
|
||||
|
|
|
@ -641,15 +641,17 @@ static struct fc_host_statistics *bnx2fc_get_host_stats(struct Scsi_Host *shost)
|
|||
if (!fw_stats)
|
||||
return NULL;
|
||||
|
||||
mutex_lock(&hba->hba_stats_mutex);
|
||||
|
||||
bnx2fc_stats = fc_get_host_stats(shost);
|
||||
|
||||
init_completion(&hba->stat_req_done);
|
||||
if (bnx2fc_send_stat_req(hba))
|
||||
return bnx2fc_stats;
|
||||
goto unlock_stats_mutex;
|
||||
rc = wait_for_completion_timeout(&hba->stat_req_done, (2 * HZ));
|
||||
if (!rc) {
|
||||
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->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,
|
||||
sizeof(struct fcoe_statistics_params));
|
||||
|
||||
unlock_stats_mutex:
|
||||
mutex_unlock(&hba->hba_stats_mutex);
|
||||
return bnx2fc_stats;
|
||||
}
|
||||
|
||||
|
@ -1302,6 +1307,7 @@ static struct bnx2fc_hba *bnx2fc_hba_create(struct cnic_dev *cnic)
|
|||
}
|
||||
spin_lock_init(&hba->hba_lock);
|
||||
mutex_init(&hba->hba_mutex);
|
||||
mutex_init(&hba->hba_stats_mutex);
|
||||
|
||||
hba->cnic = cnic;
|
||||
|
||||
|
|
|
@ -1769,7 +1769,6 @@ csio_hw_use_fwconfig(struct csio_hw *hw, int reset, u32 *fw_cfg_param)
|
|||
goto bye;
|
||||
}
|
||||
|
||||
mempool_free(mbp, hw->mb_mempool);
|
||||
if (finicsum != cfcsum) {
|
||||
csio_warn(hw,
|
||||
"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);
|
||||
if (rv != 0)
|
||||
goto bye;
|
||||
|
||||
mempool_free(mbp, hw->mb_mempool);
|
||||
mbp = NULL;
|
||||
|
||||
/*
|
||||
* Note that we're operating with parameters
|
||||
* 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
Loading…
Add table
Reference in a new issue