This is the 4.4.128 stable release

-----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAlrQ7ekACgkQONu9yGCS
 aT6Znw//VtAP82BGP/+H6X6gt0rBRIYseEJkHOpKRu5PK+Vpx7mMQFIfBId95P6R
 buq1QyzY9yz8ixbByg/w60WA2jK/I9i0tDGBnSlZzNmUvbk01oBN+cc/weZDynF7
 rFbSvD3aTmPB4nm9VE+n7V/tgGeuu/bwi04zulAm/B0/zA+w9GZv/aAto3WlLdjF
 ogZPSo5y6ifm6Qryq9sTR42LyDBXOy1klRSIK5EXY1OnIvPL1HSYR3ea2yj3AMXB
 RPvpCCY8j7zC9yVifX1c+Gfv2tXVHb9kjgheJixP2J4M3fFlR5tjLQXtTP2S2I8G
 cuMcdT6MiQw31rMoLcpej66dMtkL3k6sEpzcnSPPNenTuDIolz7BLEyaO/hhgi9J
 6vIXAd4Xm9D8HkH3iG/L3GtD3JXpVPtHyli/X1M3hz/VNUSOUPENIjMmGoxfBOtQ
 d7c8VGxDjnqmafri3fBAm4c603qW7O1wqJ7vLs9z7vgOIxlOLoJ/uiazoJKgW6O0
 z0S/BABWqpAUAI9jgm2GvRDR2keM2mhQIgIrY0+ZpnaLSGe3MugB+GbK6xdBCuYA
 anOv9VTEAPlTc8gb+GlusbUVjQyacEDwXoT6f9mELCW8cqpMgh+3TiKFihbYkUTN
 ly/DxZH3jpva0dq94Mgjv1u/nlg9ac3zqGeo9buQQFC7MSoZKEM=
 =LiZa
 -----END PGP SIGNATURE-----

Merge 4.4.128 into android-4.4

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

Change-Id: I9c1e58f634cc18f15a840c9d192c892dfcc5ff73
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
Greg Kroah-Hartman 2018-04-14 15:35:32 +02:00
commit 89904ccfe2
181 changed files with 1411 additions and 524 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1695,6 +1695,15 @@ int iscsi_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *sc)
*/ */
switch (session->state) { switch (session->state) {
case ISCSI_STATE_FAILED: case ISCSI_STATE_FAILED:
/*
* cmds should fail during shutdown, if the session
* state is bad, allowing completion to happen
*/
if (unlikely(system_state != SYSTEM_RUNNING)) {
reason = FAILURE_SESSION_FAILED;
sc->result = DID_NO_CONNECT << 16;
break;
}
case ISCSI_STATE_IN_RECOVERY: case ISCSI_STATE_IN_RECOVERY:
reason = FAILURE_SESSION_IN_RECOVERY; reason = FAILURE_SESSION_IN_RECOVERY;
sc->result = DID_IMM_RETRY << 16; sc->result = DID_IMM_RETRY << 16;
@ -1979,6 +1988,19 @@ static enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc)
} }
if (session->state != ISCSI_STATE_LOGGED_IN) { if (session->state != ISCSI_STATE_LOGGED_IN) {
/*
* During shutdown, if session is prematurely disconnected,
* recovery won't happen and there will be hung cmds. Not
* handling cmds would trigger EH, also bad in this case.
* Instead, handle cmd, allow completion to happen and let
* upper layer to deal with the result.
*/
if (unlikely(system_state != SYSTEM_RUNNING)) {
sc->result = DID_NO_CONNECT << 16;
ISCSI_DBG_EH(session, "sc on shutdown, handled\n");
rc = BLK_EH_HANDLED;
goto done;
}
/* /*
* We are probably in the middle of iscsi recovery so let * We are probably in the middle of iscsi recovery so let
* that complete and handle the error. * that complete and handle the error.
@ -2083,7 +2105,7 @@ done:
task->last_timeout = jiffies; task->last_timeout = jiffies;
spin_unlock(&session->frwd_lock); spin_unlock(&session->frwd_lock);
ISCSI_DBG_EH(session, "return %s\n", rc == BLK_EH_RESET_TIMER ? ISCSI_DBG_EH(session, "return %s\n", rc == BLK_EH_RESET_TIMER ?
"timer reset" : "nh"); "timer reset" : "shutdown or nh");
return rc; return rc;
} }

View file

@ -282,6 +282,7 @@ static void sas_set_ex_phy(struct domain_device *dev, int phy_id, void *rsp)
phy->phy->minimum_linkrate = dr->pmin_linkrate; phy->phy->minimum_linkrate = dr->pmin_linkrate;
phy->phy->maximum_linkrate = dr->pmax_linkrate; phy->phy->maximum_linkrate = dr->pmax_linkrate;
phy->phy->negotiated_linkrate = phy->linkrate; phy->phy->negotiated_linkrate = phy->linkrate;
phy->phy->enabled = (phy->linkrate != SAS_PHY_DISABLED);
skip: skip:
if (new_phy) if (new_phy)
@ -675,7 +676,7 @@ int sas_smp_get_phy_events(struct sas_phy *phy)
res = smp_execute_task(dev, req, RPEL_REQ_SIZE, res = smp_execute_task(dev, req, RPEL_REQ_SIZE,
resp, RPEL_RESP_SIZE); resp, RPEL_RESP_SIZE);
if (!res) if (res)
goto out; goto out;
phy->invalid_dword_count = scsi_to_u32(&resp[12]); phy->invalid_dword_count = scsi_to_u32(&resp[12]);
@ -684,6 +685,7 @@ int sas_smp_get_phy_events(struct sas_phy *phy)
phy->phy_reset_problem_count = scsi_to_u32(&resp[24]); phy->phy_reset_problem_count = scsi_to_u32(&resp[24]);
out: out:
kfree(req);
kfree(resp); kfree(resp);
return res; return res;

View file

@ -3886,19 +3886,6 @@ scsih_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *scmd)
return 0; return 0;
} }
/*
* Bug work around for firmware SATL handling. The loop
* is based on atomic operations and ensures consistency
* since we're lockless at this point
*/
do {
if (test_bit(0, &sas_device_priv_data->ata_command_pending)) {
scmd->result = SAM_STAT_BUSY;
scmd->scsi_done(scmd);
return 0;
}
} while (_scsih_set_satl_pending(scmd, true));
sas_target_priv_data = sas_device_priv_data->sas_target; sas_target_priv_data = sas_device_priv_data->sas_target;
/* invalid device handle */ /* invalid device handle */
@ -3924,6 +3911,19 @@ scsih_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *scmd)
sas_device_priv_data->block) sas_device_priv_data->block)
return SCSI_MLQUEUE_DEVICE_BUSY; return SCSI_MLQUEUE_DEVICE_BUSY;
/*
* Bug work around for firmware SATL handling. The loop
* is based on atomic operations and ensures consistency
* since we're lockless at this point
*/
do {
if (test_bit(0, &sas_device_priv_data->ata_command_pending)) {
scmd->result = SAM_STAT_BUSY;
scmd->scsi_done(scmd);
return 0;
}
} while (_scsih_set_satl_pending(scmd, true));
if (scmd->sc_data_direction == DMA_FROM_DEVICE) if (scmd->sc_data_direction == DMA_FROM_DEVICE)
mpi_control = MPI2_SCSIIO_CONTROL_READ; mpi_control = MPI2_SCSIIO_CONTROL_READ;
else if (scmd->sc_data_direction == DMA_TO_DEVICE) else if (scmd->sc_data_direction == DMA_TO_DEVICE)
@ -3945,6 +3945,7 @@ scsih_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *scmd)
if (!smid) { if (!smid) {
pr_err(MPT3SAS_FMT "%s: failed obtaining a smid\n", pr_err(MPT3SAS_FMT "%s: failed obtaining a smid\n",
ioc->name, __func__); ioc->name, __func__);
_scsih_set_satl_pending(scmd, false);
goto out; goto out;
} }
mpi_request = mpt3sas_base_get_msg_frame(ioc, smid); mpi_request = mpt3sas_base_get_msg_frame(ioc, smid);
@ -3975,6 +3976,7 @@ scsih_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *scmd)
if (mpi_request->DataLength) { if (mpi_request->DataLength) {
if (ioc->build_sg_scmd(ioc, scmd, smid)) { if (ioc->build_sg_scmd(ioc, scmd, smid)) {
mpt3sas_base_free_smid(ioc, smid); mpt3sas_base_free_smid(ioc, smid);
_scsih_set_satl_pending(scmd, false);
goto out; goto out;
} }
} else } else

View file

@ -169,7 +169,7 @@ int prism2mgmt_scan(wlandevice_t *wlandev, void *msgp)
hw->ident_sta_fw.variant) > hw->ident_sta_fw.variant) >
HFA384x_FIRMWARE_VERSION(1, 5, 0)) { HFA384x_FIRMWARE_VERSION(1, 5, 0)) {
if (msg->scantype.data != P80211ENUM_scantype_active) if (msg->scantype.data != P80211ENUM_scantype_active)
word = cpu_to_le16(msg->maxchanneltime.data); word = msg->maxchanneltime.data;
else else
word = 0; word = 0;

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