Merge branch 'android-4.9-q' of https://android.googlesource.com/kernel/common into android-msm-pixel-4.9
* 'android-4.9-q' of https://android.googlesource.com/kernel/common: UPSTREAM: ipv6: raw: Deduct extension header length in rawv6_push_pending_frames UPSTREAM: netfilter: ipset: Fix overflow before widen in the bitmap_ip_create() function. Linux 4.9.337 ext4: initialize quota before expanding inode in setproject ioctl ext4: avoid BUG_ON when creating xattrs ext4: fix error code return to user-space in ext4_get_branch() ext4: init quota for 'old.inode' in 'ext4_rename' ext4: fix bug_on in __es_tree_search caused by bad boot loader inode ext4: fix undefined behavior in bit shift for ext4_check_flag_values ext4: add inode table check in __ext4_get_inode_loc to aovid possible infinite loop drm/vmwgfx: Validate the box size for the snooped cursor drm/connector: send hotplug uevent on connector cleanup device_cgroup: Roll back to original exceptions after copy failure parisc: led: Fix potential null-ptr-deref in start_task() iommu/amd: Fix ivrs_acpihid cmdline parsing code crypto: n2 - add missing hash statesize PCI/sysfs: Fix double free in error path cifs: fix confusing debug message media: dvb-core: Fix double free in dvb_register_device() ARM: 9256/1: NWFPE: avoid compiler-generated __aeabi_uldivmod tracing: Fix infinite loop in tracing_read_pipe on overflowed print_trace_line dm cache: set needs_check flag after aborting metadata dm cache: Fix UAF in destroy() dm thin: Fix UAF in run_timer_softirq() dm thin: Use last transaction's pmd->root when commit failed dm cache: Fix ABBA deadlock between shrink_slab and dm_cache_metadata_abort ARM: ux500: do not directly dereference __iomem ktest.pl minconfig: Unset configs instead of just removing them media: stv0288: use explicitly signed char mmc: vub300: fix warning - do not call blocking ops when !TASK_RUNNING md: fix a crash in mempool_free pnode: terminate at peers of source ALSA: line6: fix stack overflow in line6_midi_transmit ALSA: line6: correct midi status byte when receiving data from podxt hfsplus: fix bug causing custom uid and gid being unable to be assigned with mount HID: plantronics: Additional PIDs for double volume key presses quirk powerpc/rtas: avoid scheduling in rtas_os_term() gcov: add support for checksum field iio: adc: ad_sigma_delta: do not use internal iio_dev lock reiserfs: Add missing calls to reiserfs_security_free() HID: wacom: Ensure bootloader PID is usable in hidraw mode ASoC: rt5670: Remove unbalanced pm_runtime_put() ASoC: rockchip: spdif: Add missing clk_disable_unprepare() in rk_spdif_runtime_resume() ASoC: wm8994: Fix potential deadlock ASoC: mediatek: mt8173-rt5650-rt5514: fix refcount leak in mt8173_rt5650_rt5514_dev_probe() orangefs: Fix kmemleak in orangefs_prepare_debugfs_help_string() drm/sti: Fix return type of sti_{dvo,hda,hdmi}_connector_mode_valid() drm/fsl-dcu: Fix return type of fsl_dcu_drm_connector_mode_valid() clk: st: Fix memory leak in st_of_quadfs_setup() media: si470x: Fix use-after-free in si470x_int_in_callback() mmc: f-sdh30: Add quirks for broken timeout clock capability blk-mq: fix possible memleak when register 'hctx' failed media: dvb-usb: fix memory leak in dvb_usb_adapter_init() media: dvb-frontends: fix leak of memory fw ppp: associate skb with a device at tx mrp: introduce active flags to prevent UAF when applicant uninit md/raid1: stop mdx_raid1 thread when raid1 array run failed drm/sti: Use drm_mode_copy() s390/lcs: Fix return type of lcs_start_xmit() s390/netiucv: Fix return type of netiucv_tx() s390/ctcm: Fix return type of ctc{mp,}m_tx() igb: Do not free q_vector unless new one was allocated wifi: brcmfmac: Fix potential shift-out-of-bounds in brcmf_fw_alloc_request() hamradio: baycom_epp: Fix return type of baycom_send_packet() net: ethernet: ti: Fix return type of netcp_ndo_start_xmit() ipmi: fix memleak when unload ipmi driver wifi: ar5523: Fix use-after-free on ar5523_cmd() timed out wifi: ath9k: verify the expected usb_endpoints are present hfs: fix OOB Read in __hfs_brec_find acct: fix potential integer overflow in encode_comp_t() nilfs2: fix shift-out-of-bounds/overflow in nilfs_sb2_bad_offset() ACPICA: Fix error code path in acpi_ds_call_control_method() fs: jfs: fix shift-out-of-bounds in dbDiscardAG udf: Avoid double brelse() in udf_rename() fs: jfs: fix shift-out-of-bounds in dbAllocAG binfmt_misc: fix shift-out-of-bounds in check_special_flags net: stream: purge sk_error_queue in sk_stream_kill_queues() myri10ge: Fix an error handling path in myri10ge_probe() net_sched: reject TCF_EM_SIMPLE case for complex ematch module skbuff: Account for tail adjustment during pull operations openvswitch: Fix flow lookup to use unmasked key r6040: Fix kmemleak in probe and remove nfc: pn533: Clear nfc_target before being used mISDN: hfcmulti: don't call dev_kfree_skb/kfree_skb() under spin_lock_irqsave() mISDN: hfcpci: don't call dev_kfree_skb/kfree_skb() under spin_lock_irqsave() mISDN: hfcsusb: don't call dev_kfree_skb/kfree_skb() under spin_lock_irqsave() nfsd: under NFSv4.1, fix double svc_xprt_put on rpc_create failure rtc: st-lpc: Add missing clk_disable_unprepare in st_rtc_probe() selftests/powerpc: Fix resource leaks powerpc/hv-gpci: Fix hv_gpci event list powerpc/83xx/mpc832x_rdb: call platform_device_put() in error case in of_fsl_spi_probe() powerpc/perf: callchain validate kernel stack pointer bounds powerpc/52xx: Fix a resource leak in an error handling path macintosh/macio-adb: check the return value of ioremap() macintosh: fix possible memory leak in macio_add_one_device() iommu/fsl_pamu: Fix resource leak in fsl_pamu_probe() rtc: snvs: Allow a time difference on clock register read include/uapi/linux/swab: Fix potentially missing __always_inline HSI: omap_ssi_core: Fix error handling in ssi_init() power: supply: fix residue sysfs file in error handle route of __power_supply_register() HSI: omap_ssi_core: fix possible memory leak in ssi_probe() HSI: omap_ssi_core: fix unbalanced pm_runtime_disable() fbdev: uvesafb: Fixes an error handling path in uvesafb_probe() fbdev: vermilion: decrease reference count in error path fbdev: via: Fix error in via_core_init() fbdev: pm2fb: fix missing pci_disable_device() fbdev: ssd1307fb: Drop optional dependency usb: storage: Add check for kcalloc i2c: ismt: Fix an out-of-bounds bug in ismt_access() vme: Fix error not catched in fake_init() staging: rtl8192e: Fix potential use-after-free in rtllib_rx_Monitor() staging: rtl8192u: Fix use after free in ieee80211_rx() i2c: pxa-pci: fix missing pci_disable_device() on error in ce4100_i2c_probe chardev: fix error handling in cdev_device_add() mcb: mcb-parse: fix error handing in chameleon_parse_gdd() drivers: mcb: fix resource leak in mcb_probe() cxl: fix possible null-ptr-deref in cxl_pci_init_afu|adapter() cxl: fix possible null-ptr-deref in cxl_guest_init_afu|adapter() misc: sgi-gru: fix use-after-free error in gru_set_context_option, gru_fault and gru_handle_user_call_os misc: tifm: fix possible memory leak in tifm_7xx1_switch_media() serial: sunsab: Fix error handling in sunsab_init() serial: pch: Fix PCI device refcount leak in pch_request_dma() serial: amba-pl011: avoid SBSA UART accessing DMACR register staging: vme_user: Fix possible UAF in tsi148_dma_list_add usb: fotg210-udc: Fix ages old endianness issues uio: uio_dmem_genirq: Fix deadlock between irq config and handling uio: uio_dmem_genirq: Fix missing unlock in irq configuration vfio: platform: Do not pass return buffer to ACPI _RST method drivers: dio: fix possible memory leak in dio_init() IB/IPoIB: Fix queue count inconsistency for PKEY child interfaces hwrng: geode - Fix PCI device refcount leak hwrng: amd - Fix PCI device refcount leak crypto: img-hash - Fix variable dereferenced before check 'hdev->req' orangefs: Fix sysfs not cleanup when dev init failed scsi: snic: Fix possible UAF in snic_tgt_create() scsi: fcoe: Fix transport not deattached when fcoe_if_init() fails scsi: ipr: Fix WARNING in ipr_init() scsi: fcoe: Fix possible name leak when device_register() fails scsi: hpsa: Fix possible memory leak in hpsa_add_sas_device() scsi: hpsa: Fix error handling in hpsa_add_sas_host() stmmac: fix potential division by 0 Bluetooth: hci_core: don't call kfree_skb() under spin_lock_irqsave() Bluetooth: hci_bcsp: don't call kfree_skb() under spin_lock_irqsave() Bluetooth: hci_h5: don't call kfree_skb() under spin_lock_irqsave() Bluetooth: hci_qca: don't call kfree_skb() under spin_lock_irqsave() Bluetooth: btusb: don't call kfree_skb() under spin_lock_irqsave() ntb_netdev: Use dev_kfree_skb_any() in interrupt context net: amd: lance: don't call dev_kfree_skb() under spin_lock_irqsave() hamradio: don't call dev_kfree_skb() under spin_lock_irqsave() net: ethernet: dnet: don't call dev_kfree_skb() under spin_lock_irqsave() net: emaclite: don't call dev_kfree_skb() under spin_lock_irqsave() net: apple: bmac: don't call dev_kfree_skb() under spin_lock_irqsave() net: apple: mace: don't call dev_kfree_skb() under spin_lock_irqsave() net/tunnel: wait until all sk_user_data reader finish before releasing the sock net: farsync: Fix kmemleak when rmmods farsync ethernet: s2io: don't call dev_kfree_skb() under spin_lock_irqsave() drivers: net: qlcnic: Fix potential memory leak in qlcnic_sriov_init() net: defxx: Fix missing err handling in dfx_init() net: vmw_vsock: vmci: Check memcpy_from_msg() blktrace: Fix output non-blktrace event when blk_classic option enabled wifi: brcmfmac: Fix error return code in brcmf_sdio_download_firmware() wifi: rtl8xxxu: Add __packed to struct rtl8723bu_c2h media: coda: Add check for kmalloc media: coda: Add check for dcoda_iram_alloc media: c8sectpfe: Add of_node_put() when breaking out of loop mmc: mmci: fix return value check of mmc_add_host() mmc: wbsd: fix return value check of mmc_add_host() mmc: via-sdmmc: fix return value check of mmc_add_host() mmc: vub300: fix return value check of mmc_add_host() mmc: toshsd: fix return value check of mmc_add_host() mmc: rtsx_usb_sdmmc: fix return value check of mmc_add_host() mmc: mxcmmc: fix return value check of mmc_add_host() mmc: moxart: fix return value check of mmc_add_host() SUNRPC: Fix missing release socket in rpc_sockname() ALSA: mts64: fix possible null-ptr-defer in snd_mts64_interrupt media: saa7164: fix missing pci_disable_device() regulator: core: fix module refcount leak in set_supply() bonding: uninitialized variable in bond_miimon_inspect() ASoC: pcm512x: Fix PM disable depth imbalance in pcm512x_probe drm/amdgpu: Fix PCI device refcount leak in amdgpu_atrm_get_bios() drm/radeon: Fix PCI device refcount leak in radeon_atrm_get_bios() ALSA: asihpi: fix missing pci_disable_device() NFSv4: Fix a deadlock between nfs4_open_recover_helper() and delegreturn NFSv4.2: Fix a memory stomp in decode_attr_security_label media: dvb-usb: az6027: fix null-ptr-deref in az6027_i2c_xfer() pinctrl: pinconf-generic: add missing of_node_put() media: imon: fix a race condition in send_packet() mtd: maps: pxa2xx-flash: fix memory leak in probe clk: rockchip: Fix memory leak in rockchip_clk_register_pll() ALSA: seq: fix undefined behavior in bit shift for SNDRV_SEQ_FILTER_USE_EVENT HID: hid-sensor-custom: set fixed size for custom attributes media: platform: exynos4-is: Fix error handling in fimc_md_init() media: solo6x10: fix possible memory leak in solo_sysfs_init() Input: elants_i2c - properly handle the reset GPIO when power is off mtd: lpddr2_nvm: Fix possible null-ptr-deref wifi: ath10k: Fix return value in ath10k_pci_init() ima: Fix misuse of dereference of pointer in template_desc_init_fields() regulator: core: fix unbalanced of node refcount in regulator_dev_lookup() ASoC: pxa: fix null-pointer dereference in filter() mtd: Fix device name leak when register device failed in add_mtd_device() media: vivid: fix compose size exceed boundary media: i2c: ad5820: Fix error path wifi: ath9k: hif_usb: Fix use-after-free in ath9k_hif_usb_reg_in_cb() wifi: ath9k: hif_usb: fix memory leak of urbs in ath9k_hif_usb_dealloc_tx_urbs() rapidio: devices: fix missing put_device in mport_cdev_open hfs: Fix OOB Write in hfs_asc2mac eventfd: change int to __u64 in eventfd_signal() ifndef CONFIG_EVENTFD rapidio: fix possible UAF when kfifo_alloc() fails fs: sysv: Fix sysv_nblocks() returns wrong value MIPS: BCM63xx: Add check for NULL for clk in clk_enable x86/xen: Fix memory leak in xen_init_lock_cpu() uprobes/x86: Allow to probe a NOP instruction with 0x66 prefix ACPICA: Fix use-after-free in acpi_ut_copy_ipackage_to_ipackage() rapidio: rio: fix possible name leak in rio_register_mport() rapidio: fix possible name leaks when rio_add_device() fails lib/notifier-error-inject: fix error when writing -errno to debugfs file libfs: add DEFINE_SIMPLE_ATTRIBUTE_SIGNED for signed value irqchip: gic-pm: Use pm_runtime_resume_and_get() in gic_probe() PNP: fix name memory leak in pnp_alloc_dev() MIPS: vpe-cmp: fix possible memory leak while module exiting MIPS: vpe-mt: fix possible memory leak while module exiting ocfs2: fix memory leak in ocfs2_stack_glue_init() timerqueue: Use rb_entry_safe() in timerqueue_getnext() perf: Fix possible memleak in pmu_dev_alloc() fs: don't audit the capability check in simple_xattr_list() PM: hibernate: Fix mistake in kerneldoc comment alpha: fix syscall entry in !AUDUT_SYSCALL case cpuidle: dt: Return the correct numbers of parsed idle states pstore: Avoid kcore oops by vmap()ing with VM_IOREMAP ARM: mmp: fix timer_read delay ARM: dts: armada-39x: Fix assigned-addresses for every PCIe Root Port ARM: dts: armada-38x: Fix assigned-addresses for every PCIe Root Port ARM: dts: armada-375: Fix assigned-addresses for every PCIe Root Port ARM: dts: armada-xp: Fix assigned-addresses for every PCIe Root Port ARM: dts: armada-370: Fix assigned-addresses for every PCIe Root Port ARM: dts: dove: Fix assigned-addresses for every PCIe Root Port soc: ti: smartreflex: Fix PM disable depth imbalance in omap_sr_probe arm: dts: spear600: Fix clcd interrupt drivers: soc: ti: knav_qmss_queue: Mark knav_acc_firmwares as static net: loopback: use NET_NAME_PREDICTABLE for name_assign_type Bluetooth: L2CAP: Fix u8 overflow USB: serial: cp210x: add Kamstrup RF sniffer PIDs usb: gadget: uvc: Prevent buffer overflow in setup handler udf: Fix extending file within last block udf: Do not bother looking for prealloc extents if i_lenExtents matches i_size udf: Fix preallocation discarding at indirect extent boundary udf: Drop unused arguments of udf_delete_aext() udf: Discard preallocation before extending file with a hole ASoC: ops: Correct bounds check for second channel on SX controls can: sja1000: fix size of OCR_MODE_MASK define ASoC: ops: Check bounds for second channel in snd_soc_put_volsw_sx() block: unhash blkdev part inode when the part is deleted mm/khugepaged: invoke MMU notifiers in shmem/file collapse paths mm/khugepaged: fix GUP-fast interaction by sending IPI Change-Id: I64c8371e754e29bd7633756d85a5e8d5721939b6
This commit is contained in:
2
Makefile
2
Makefile
@@ -1,6 +1,6 @@
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 9
|
||||
SUBLEVEL = 336
|
||||
SUBLEVEL = 337
|
||||
EXTRAVERSION =
|
||||
NAME = Roaring Lionus
|
||||
|
||||
|
||||
@@ -468,8 +468,10 @@ entSys:
|
||||
#ifdef CONFIG_AUDITSYSCALL
|
||||
lda $6, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT
|
||||
and $3, $6, $3
|
||||
#endif
|
||||
bne $3, strace
|
||||
#else
|
||||
blbs $3, strace /* check for SYSCALL_TRACE in disguise */
|
||||
#endif
|
||||
beq $4, 1f
|
||||
ldq $27, 0($5)
|
||||
1: jsr $26, ($27), alpha_ni_syscall
|
||||
|
||||
@@ -108,7 +108,7 @@
|
||||
|
||||
pcie@2,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82002800 0 0x80000 0 0x2000>;
|
||||
assigned-addresses = <0x82001000 0 0x80000 0 0x2000>;
|
||||
reg = <0x1000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
|
||||
@@ -618,7 +618,7 @@
|
||||
|
||||
pcie@2,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x44000 0 0x2000>;
|
||||
assigned-addresses = <0x82001000 0 0x44000 0 0x2000>;
|
||||
reg = <0x1000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
|
||||
@@ -115,7 +115,7 @@
|
||||
/* x1 port */
|
||||
pcie@2,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x40000 0 0x2000>;
|
||||
assigned-addresses = <0x82001000 0 0x40000 0 0x2000>;
|
||||
reg = <0x1000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -133,7 +133,7 @@
|
||||
/* x1 port */
|
||||
pcie@3,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x44000 0 0x2000>;
|
||||
assigned-addresses = <0x82001800 0 0x44000 0 0x2000>;
|
||||
reg = <0x1800 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
|
||||
@@ -126,7 +126,7 @@
|
||||
/* x1 port */
|
||||
pcie@2,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x40000 0 0x2000>;
|
||||
assigned-addresses = <0x82001000 0 0x40000 0 0x2000>;
|
||||
reg = <0x1000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -144,7 +144,7 @@
|
||||
/* x1 port */
|
||||
pcie@3,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x44000 0 0x2000>;
|
||||
assigned-addresses = <0x82001800 0 0x44000 0 0x2000>;
|
||||
reg = <0x1800 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -165,7 +165,7 @@
|
||||
*/
|
||||
pcie@4,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x48000 0 0x2000>;
|
||||
assigned-addresses = <0x82002000 0 0x48000 0 0x2000>;
|
||||
reg = <0x2000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
|
||||
@@ -492,7 +492,7 @@
|
||||
/* x1 port */
|
||||
pcie@2,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x40000 0 0x2000>;
|
||||
assigned-addresses = <0x82001000 0 0x40000 0 0x2000>;
|
||||
reg = <0x1000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -510,7 +510,7 @@
|
||||
/* x1 port */
|
||||
pcie@3,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x44000 0 0x2000>;
|
||||
assigned-addresses = <0x82001800 0 0x44000 0 0x2000>;
|
||||
reg = <0x1800 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -531,7 +531,7 @@
|
||||
*/
|
||||
pcie@4,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x48000 0 0x2000>;
|
||||
assigned-addresses = <0x82002000 0 0x48000 0 0x2000>;
|
||||
reg = <0x2000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
|
||||
@@ -133,7 +133,7 @@
|
||||
|
||||
pcie@2,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x44000 0 0x2000>;
|
||||
assigned-addresses = <0x82001000 0 0x44000 0 0x2000>;
|
||||
reg = <0x1000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -150,7 +150,7 @@
|
||||
|
||||
pcie@3,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x48000 0 0x2000>;
|
||||
assigned-addresses = <0x82001800 0 0x48000 0 0x2000>;
|
||||
reg = <0x1800 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -167,7 +167,7 @@
|
||||
|
||||
pcie@4,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x4c000 0 0x2000>;
|
||||
assigned-addresses = <0x82002000 0 0x4c000 0 0x2000>;
|
||||
reg = <0x2000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -184,7 +184,7 @@
|
||||
|
||||
pcie@5,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x80000 0 0x2000>;
|
||||
assigned-addresses = <0x82002800 0 0x80000 0 0x2000>;
|
||||
reg = <0x2800 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
|
||||
@@ -148,7 +148,7 @@
|
||||
|
||||
pcie@2,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x44000 0 0x2000>;
|
||||
assigned-addresses = <0x82001000 0 0x44000 0 0x2000>;
|
||||
reg = <0x1000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -165,7 +165,7 @@
|
||||
|
||||
pcie@3,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x48000 0 0x2000>;
|
||||
assigned-addresses = <0x82001800 0 0x48000 0 0x2000>;
|
||||
reg = <0x1800 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -182,7 +182,7 @@
|
||||
|
||||
pcie@4,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x4c000 0 0x2000>;
|
||||
assigned-addresses = <0x82002000 0 0x4c000 0 0x2000>;
|
||||
reg = <0x2000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -199,7 +199,7 @@
|
||||
|
||||
pcie@5,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x80000 0 0x2000>;
|
||||
assigned-addresses = <0x82002800 0 0x80000 0 0x2000>;
|
||||
reg = <0x2800 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -216,7 +216,7 @@
|
||||
|
||||
pcie@6,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x84000 0 0x2000>;
|
||||
assigned-addresses = <0x82003000 0 0x84000 0 0x2000>;
|
||||
reg = <0x3000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -233,7 +233,7 @@
|
||||
|
||||
pcie@7,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x88000 0 0x2000>;
|
||||
assigned-addresses = <0x82003800 0 0x88000 0 0x2000>;
|
||||
reg = <0x3800 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -250,7 +250,7 @@
|
||||
|
||||
pcie@8,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x8c000 0 0x2000>;
|
||||
assigned-addresses = <0x82004000 0 0x8c000 0 0x2000>;
|
||||
reg = <0x4000 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
@@ -267,7 +267,7 @@
|
||||
|
||||
pcie@9,0 {
|
||||
device_type = "pci";
|
||||
assigned-addresses = <0x82000800 0 0x42000 0 0x2000>;
|
||||
assigned-addresses = <0x82004800 0 0x42000 0 0x2000>;
|
||||
reg = <0x4800 0 0 0 0>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
|
||||
@@ -127,7 +127,7 @@
|
||||
pcie1: pcie-port@1 {
|
||||
device_type = "pci";
|
||||
status = "disabled";
|
||||
assigned-addresses = <0x82002800 0 0x80000 0 0x2000>;
|
||||
assigned-addresses = <0x82001000 0 0x80000 0 0x2000>;
|
||||
reg = <0x1000 0 0 0 0>;
|
||||
clocks = <&gate_clk 5>;
|
||||
marvell,pcie-port = <1>;
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
compatible = "arm,pl110", "arm,primecell";
|
||||
reg = <0xfc200000 0x1000>;
|
||||
interrupt-parent = <&vic1>;
|
||||
interrupts = <12>;
|
||||
interrupts = <13>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
||||
@@ -52,18 +52,21 @@
|
||||
static void __iomem *mmp_timer_base = TIMERS_VIRT_BASE;
|
||||
|
||||
/*
|
||||
* FIXME: the timer needs some delay to stablize the counter capture
|
||||
* Read the timer through the CVWR register. Delay is required after requesting
|
||||
* a read. The CR register cannot be directly read due to metastability issues
|
||||
* documented in the PXA168 software manual.
|
||||
*/
|
||||
static inline uint32_t timer_read(void)
|
||||
{
|
||||
int delay = 100;
|
||||
uint32_t val;
|
||||
int delay = 3;
|
||||
|
||||
__raw_writel(1, mmp_timer_base + TMR_CVWR(1));
|
||||
|
||||
while (delay--)
|
||||
cpu_relax();
|
||||
val = __raw_readl(mmp_timer_base + TMR_CVWR(1));
|
||||
|
||||
return __raw_readl(mmp_timer_base + TMR_CVWR(1));
|
||||
return val;
|
||||
}
|
||||
|
||||
static u64 notrace mmp_read_sched_clock(void)
|
||||
|
||||
@@ -10,3 +10,9 @@ nwfpe-y += fpa11.o fpa11_cpdo.o fpa11_cpdt.o \
|
||||
entry.o
|
||||
|
||||
nwfpe-$(CONFIG_FPE_NWFPE_XP) += extended_cpdo.o
|
||||
|
||||
# Try really hard to avoid generating calls to __aeabi_uldivmod() from
|
||||
# float64_rem() due to loop elision.
|
||||
ifdef CONFIG_CC_IS_CLANG
|
||||
CFLAGS_softfloat.o += -mllvm -replexitval=never
|
||||
endif
|
||||
|
||||
@@ -316,6 +316,8 @@ static struct clk clk_periph = {
|
||||
*/
|
||||
int clk_enable(struct clk *clk)
|
||||
{
|
||||
if (!clk)
|
||||
return 0;
|
||||
mutex_lock(&clocks_mutex);
|
||||
clk_enable_unlocked(clk);
|
||||
mutex_unlock(&clocks_mutex);
|
||||
|
||||
@@ -75,7 +75,6 @@ ATTRIBUTE_GROUPS(vpe);
|
||||
|
||||
static void vpe_device_release(struct device *cd)
|
||||
{
|
||||
kfree(cd);
|
||||
}
|
||||
|
||||
static struct class vpe_class = {
|
||||
@@ -157,6 +156,7 @@ out_dev:
|
||||
device_del(&vpe_device);
|
||||
|
||||
out_class:
|
||||
put_device(&vpe_device);
|
||||
class_unregister(&vpe_class);
|
||||
|
||||
out_chrdev:
|
||||
@@ -169,7 +169,7 @@ void __exit vpe_module_exit(void)
|
||||
{
|
||||
struct vpe *v, *n;
|
||||
|
||||
device_del(&vpe_device);
|
||||
device_unregister(&vpe_device);
|
||||
class_unregister(&vpe_class);
|
||||
unregister_chrdev(major, VPE_MODULE_NAME);
|
||||
|
||||
|
||||
@@ -313,7 +313,6 @@ ATTRIBUTE_GROUPS(vpe);
|
||||
|
||||
static void vpe_device_release(struct device *cd)
|
||||
{
|
||||
kfree(cd);
|
||||
}
|
||||
|
||||
static struct class vpe_class = {
|
||||
@@ -497,6 +496,7 @@ out_dev:
|
||||
device_del(&vpe_device);
|
||||
|
||||
out_class:
|
||||
put_device(&vpe_device);
|
||||
class_unregister(&vpe_class);
|
||||
|
||||
out_chrdev:
|
||||
@@ -509,7 +509,7 @@ void __exit vpe_module_exit(void)
|
||||
{
|
||||
struct vpe *v, *n;
|
||||
|
||||
device_del(&vpe_device);
|
||||
device_unregister(&vpe_device);
|
||||
class_unregister(&vpe_class);
|
||||
unregister_chrdev(major, VPE_MODULE_NAME);
|
||||
|
||||
|
||||
@@ -733,10 +733,15 @@ void rtas_os_term(char *str)
|
||||
|
||||
snprintf(rtas_os_term_buf, 2048, "OS panic: %s", str);
|
||||
|
||||
/*
|
||||
* Keep calling as long as RTAS returns a "try again" status,
|
||||
* but don't use rtas_busy_delay(), which potentially
|
||||
* schedules.
|
||||
*/
|
||||
do {
|
||||
status = rtas_call(rtas_token("ibm,os-term"), 1, 1, NULL,
|
||||
__pa(rtas_os_term_buf));
|
||||
} while (rtas_busy_delay(status));
|
||||
} while (rtas_busy_delay_time(status));
|
||||
|
||||
if (status != 0)
|
||||
printk(KERN_EMERG "ibm,os-term call failed %d\n", status);
|
||||
|
||||
@@ -67,6 +67,7 @@ perf_callchain_kernel(struct perf_callchain_entry_ctx *entry, struct pt_regs *re
|
||||
next_sp = fp[0];
|
||||
|
||||
if (next_sp == sp + STACK_INT_FRAME_SIZE &&
|
||||
validate_sp(sp, current, STACK_INT_FRAME_SIZE) &&
|
||||
fp[STACK_FRAME_MARKER] == STACK_FRAME_REGS_MARKER) {
|
||||
/*
|
||||
* This looks like an interrupt frame for an
|
||||
|
||||
@@ -78,6 +78,7 @@ REQUEST(__field(0, 8, partition_id)
|
||||
)
|
||||
#include I(REQUEST_END)
|
||||
|
||||
#ifdef ENABLE_EVENTS_COUNTERINFO_V6
|
||||
/*
|
||||
* Not available for counter_info_version >= 0x8, use
|
||||
* run_instruction_cycles_by_partition(0x100) instead.
|
||||
@@ -91,6 +92,7 @@ REQUEST(__field(0, 8, partition_id)
|
||||
__count(0x10, 8, cycles)
|
||||
)
|
||||
#include I(REQUEST_END)
|
||||
#endif
|
||||
|
||||
#define REQUEST_NAME system_performance_capabilities
|
||||
#define REQUEST_NUM 0x40
|
||||
@@ -102,6 +104,7 @@ REQUEST(__field(0, 1, perf_collect_privileged)
|
||||
)
|
||||
#include I(REQUEST_END)
|
||||
|
||||
#ifdef ENABLE_EVENTS_COUNTERINFO_V6
|
||||
#define REQUEST_NAME processor_bus_utilization_abc_links
|
||||
#define REQUEST_NUM 0x50
|
||||
#define REQUEST_IDX_KIND "hw_chip_id=?"
|
||||
@@ -193,6 +196,7 @@ REQUEST(__field(0, 4, phys_processor_idx)
|
||||
__count(0x28, 8, instructions_completed)
|
||||
)
|
||||
#include I(REQUEST_END)
|
||||
#endif
|
||||
|
||||
/* Processor_core_power_mode (0x95) skipped, no counters */
|
||||
/* Affinity_domain_information_by_virtual_processor (0xA0) skipped,
|
||||
|
||||
@@ -74,7 +74,7 @@ static struct attribute_group format_group = {
|
||||
|
||||
static struct attribute_group event_group = {
|
||||
.name = "events",
|
||||
.attrs = hv_gpci_event_attrs,
|
||||
/* .attrs is set in init */
|
||||
};
|
||||
|
||||
#define HV_CAPS_ATTR(_name, _format) \
|
||||
@@ -292,6 +292,7 @@ static int hv_gpci_init(void)
|
||||
int r;
|
||||
unsigned long hret;
|
||||
struct hv_perf_caps caps;
|
||||
struct hv_gpci_request_buffer *arg;
|
||||
|
||||
hv_gpci_assert_offsets_correct();
|
||||
|
||||
@@ -310,6 +311,36 @@ static int hv_gpci_init(void)
|
||||
/* sampling not supported */
|
||||
h_gpci_pmu.capabilities |= PERF_PMU_CAP_NO_INTERRUPT;
|
||||
|
||||
arg = (void *)get_cpu_var(hv_gpci_reqb);
|
||||
memset(arg, 0, HGPCI_REQ_BUFFER_SIZE);
|
||||
|
||||
/*
|
||||
* hcall H_GET_PERF_COUNTER_INFO populates the output
|
||||
* counter_info_version value based on the system hypervisor.
|
||||
* Pass the counter request 0x10 corresponds to request type
|
||||
* 'Dispatch_timebase_by_processor', to get the supported
|
||||
* counter_info_version.
|
||||
*/
|
||||
arg->params.counter_request = cpu_to_be32(0x10);
|
||||
|
||||
r = plpar_hcall_norets(H_GET_PERF_COUNTER_INFO,
|
||||
virt_to_phys(arg), HGPCI_REQ_BUFFER_SIZE);
|
||||
if (r) {
|
||||
pr_devel("hcall failed, can't get supported counter_info_version: 0x%x\n", r);
|
||||
arg->params.counter_info_version_out = 0x8;
|
||||
}
|
||||
|
||||
/*
|
||||
* Use counter_info_version_out value to assign
|
||||
* required hv-gpci event list.
|
||||
*/
|
||||
if (arg->params.counter_info_version_out >= 0x8)
|
||||
event_group.attrs = hv_gpci_event_attrs;
|
||||
else
|
||||
event_group.attrs = hv_gpci_event_attrs_v6;
|
||||
|
||||
put_cpu_var(hv_gpci_reqb);
|
||||
|
||||
r = perf_pmu_register(&h_gpci_pmu, h_gpci_pmu.name, -1);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
@@ -52,6 +52,7 @@ enum {
|
||||
#define REQUEST_FILE "../hv-gpci-requests.h"
|
||||
#define NAME_LOWER hv_gpci
|
||||
#define NAME_UPPER HV_GPCI
|
||||
#define ENABLE_EVENTS_COUNTERINFO_V6
|
||||
#include "req-gen/perf.h"
|
||||
#undef REQUEST_FILE
|
||||
#undef NAME_LOWER
|
||||
|
||||
@@ -137,6 +137,26 @@ PMU_EVENT_ATTR_STRING( \
|
||||
#define REQUEST_(r_name, r_value, r_idx_1, r_fields) \
|
||||
r_fields
|
||||
|
||||
/* Generate event list for platforms with counter_info_version 0x6 or below */
|
||||
static __maybe_unused struct attribute *hv_gpci_event_attrs_v6[] = {
|
||||
#include REQUEST_FILE
|
||||
NULL
|
||||
};
|
||||
|
||||
/*
|
||||
* Based on getPerfCountInfo v1.018 documentation, some of the hv-gpci
|
||||
* events were deprecated for platform firmware that supports
|
||||
* counter_info_version 0x8 or above.
|
||||
* Those deprecated events are still part of platform firmware that
|
||||
* support counter_info_version 0x6 and below. As per the getPerfCountInfo
|
||||
* v1.018 documentation there is no counter_info_version 0x7.
|
||||
* Undefining macro ENABLE_EVENTS_COUNTERINFO_V6, to disable the addition of
|
||||
* deprecated events in "hv_gpci_event_attrs" attribute group, for platforms
|
||||
* that supports counter_info_version 0x8 or above.
|
||||
*/
|
||||
#undef ENABLE_EVENTS_COUNTERINFO_V6
|
||||
|
||||
/* Generate event list for platforms with counter_info_version 0x8 or above*/
|
||||
static __maybe_unused struct attribute *hv_gpci_event_attrs[] = {
|
||||
#include REQUEST_FILE
|
||||
NULL
|
||||
|
||||
@@ -531,6 +531,7 @@ static int mpc52xx_lpbfifo_probe(struct platform_device *op)
|
||||
err_bcom_rx_irq:
|
||||
bcom_gen_bd_rx_release(lpbfifo.bcom_rx_task);
|
||||
err_bcom_rx:
|
||||
free_irq(lpbfifo.irq, &lpbfifo);
|
||||
err_irq:
|
||||
iounmap(lpbfifo.regs);
|
||||
lpbfifo.regs = NULL;
|
||||
|
||||
@@ -111,7 +111,7 @@ static int __init of_fsl_spi_probe(char *type, char *compatible, u32 sysclk,
|
||||
|
||||
goto next;
|
||||
unreg:
|
||||
platform_device_del(pdev);
|
||||
platform_device_put(pdev);
|
||||
err:
|
||||
pr_err("%s: registration failed\n", np->full_name);
|
||||
next:
|
||||
|
||||
@@ -718,8 +718,9 @@ static int branch_setup_xol_ops(struct arch_uprobe *auprobe, struct insn *insn)
|
||||
switch (opc1) {
|
||||
case 0xeb: /* jmp 8 */
|
||||
case 0xe9: /* jmp 32 */
|
||||
case 0x90: /* prefix* + nop; same as jmp with .offs = 0 */
|
||||
break;
|
||||
case 0x90: /* prefix* + nop; same as jmp with .offs = 0 */
|
||||
goto setup;
|
||||
|
||||
case 0xe8: /* call relative */
|
||||
branch_clear_offset(auprobe, insn);
|
||||
@@ -748,6 +749,7 @@ static int branch_setup_xol_ops(struct arch_uprobe *auprobe, struct insn *insn)
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
setup:
|
||||
auprobe->branch.opc1 = opc1;
|
||||
auprobe->branch.ilen = insn->length;
|
||||
auprobe->branch.offs = insn->immediate.value;
|
||||
|
||||
@@ -80,6 +80,7 @@ void xen_init_lock_cpu(int cpu)
|
||||
cpu, per_cpu(lock_kicker_irq, cpu));
|
||||
|
||||
name = kasprintf(GFP_KERNEL, "spinlock%d", cpu);
|
||||
per_cpu(irq_name, cpu) = name;
|
||||
irq = bind_ipi_to_irqhandler(XEN_SPIN_UNLOCK_VECTOR,
|
||||
cpu,
|
||||
dummy_handler,
|
||||
@@ -90,7 +91,6 @@ void xen_init_lock_cpu(int cpu)
|
||||
if (irq >= 0) {
|
||||
disable_irq(irq); /* make sure it's never delivered */
|
||||
per_cpu(lock_kicker_irq, cpu) = irq;
|
||||
per_cpu(irq_name, cpu) = name;
|
||||
}
|
||||
|
||||
printk("cpu %d spinlock event irq %d\n", cpu, irq);
|
||||
@@ -103,6 +103,8 @@ void xen_uninit_lock_cpu(int cpu)
|
||||
if (!xen_pvspin)
|
||||
return;
|
||||
|
||||
kfree(per_cpu(irq_name, cpu));
|
||||
per_cpu(irq_name, cpu) = NULL;
|
||||
/*
|
||||
* When booting the kernel with 'mitigations=auto,nosmt', the secondary
|
||||
* CPUs are not activated, and lock_kicker_irq is not initialized.
|
||||
@@ -113,8 +115,6 @@ void xen_uninit_lock_cpu(int cpu)
|
||||
|
||||
unbind_from_irqhandler(irq, NULL);
|
||||
per_cpu(lock_kicker_irq, cpu) = -1;
|
||||
kfree(per_cpu(irq_name, cpu));
|
||||
per_cpu(irq_name, cpu) = NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -380,7 +380,7 @@ static int blk_mq_register_hctx(struct blk_mq_hw_ctx *hctx)
|
||||
{
|
||||
struct request_queue *q = hctx->queue;
|
||||
struct blk_mq_ctx *ctx;
|
||||
int i, ret;
|
||||
int i, j, ret;
|
||||
|
||||
if (!hctx->nr_ctx)
|
||||
return 0;
|
||||
@@ -392,9 +392,16 @@ static int blk_mq_register_hctx(struct blk_mq_hw_ctx *hctx)
|
||||
hctx_for_each_ctx(hctx, ctx, i) {
|
||||
ret = kobject_add(&ctx->kobj, &hctx->kobj, "cpu%u", ctx->cpu);
|
||||
if (ret)
|
||||
break;
|
||||
goto out;
|
||||
}
|
||||
|
||||
return 0;
|
||||
out:
|
||||
hctx_for_each_ctx(hctx, ctx, j) {
|
||||
if (j < i)
|
||||
kobject_del(&ctx->kobj);
|
||||
}
|
||||
kobject_del(&hctx->kobj);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -254,6 +254,7 @@ void delete_partition(struct gendisk *disk, int partno)
|
||||
{
|
||||
struct disk_part_tbl *ptbl = disk->part_tbl;
|
||||
struct hd_struct *part;
|
||||
struct block_device *bdev;
|
||||
|
||||
if (partno >= ptbl->len)
|
||||
return;
|
||||
@@ -267,6 +268,11 @@ void delete_partition(struct gendisk *disk, int partno)
|
||||
kobject_put(part->holder_dir);
|
||||
device_del(part_to_dev(part));
|
||||
|
||||
bdev = bdget(part_devt(part));
|
||||
if (bdev) {
|
||||
remove_inode_hash(bdev->bd_inode);
|
||||
bdput(bdev);
|
||||
}
|
||||
hd_struct_kill(part);
|
||||
}
|
||||
|
||||
|
||||
@@ -547,7 +547,7 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread,
|
||||
info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_evaluate_info));
|
||||
if (!info) {
|
||||
status = AE_NO_MEMORY;
|
||||
goto cleanup;
|
||||
goto pop_walk_state;
|
||||
}
|
||||
|
||||
info->parameters = &this_walk_state->operands[0];
|
||||
@@ -559,7 +559,7 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread,
|
||||
|
||||
ACPI_FREE(info);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto cleanup;
|
||||
goto pop_walk_state;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -591,6 +591,12 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread,
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
|
||||
pop_walk_state:
|
||||
|
||||
/* On error, pop the walk state to be deleted from thread */
|
||||
|
||||
acpi_ds_pop_walk_state(thread);
|
||||
|
||||
cleanup:
|
||||
|
||||
/* On error, we must terminate the method properly */
|
||||
|
||||
@@ -950,13 +950,6 @@ acpi_ut_copy_ipackage_to_ipackage(union acpi_operand_object *source_obj,
|
||||
status = acpi_ut_walk_package_tree(source_obj, dest_obj,
|
||||
acpi_ut_copy_ielement_to_ielement,
|
||||
walk_state);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
|
||||
/* On failure, delete the destination package object */
|
||||
|
||||
acpi_ut_remove_reference(dest_obj);
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
|
||||
@@ -440,13 +440,13 @@ static inline void btusb_free_frags(struct btusb_data *data)
|
||||
|
||||
spin_lock_irqsave(&data->rxlock, flags);
|
||||
|
||||
kfree_skb(data->evt_skb);
|
||||
dev_kfree_skb_irq(data->evt_skb);
|
||||
data->evt_skb = NULL;
|
||||
|
||||
kfree_skb(data->acl_skb);
|
||||
dev_kfree_skb_irq(data->acl_skb);
|
||||
data->acl_skb = NULL;
|
||||
|
||||
kfree_skb(data->sco_skb);
|
||||
dev_kfree_skb_irq(data->sco_skb);
|
||||
data->sco_skb = NULL;
|
||||
|
||||
spin_unlock_irqrestore(&data->rxlock, flags);
|
||||
|
||||
@@ -392,7 +392,7 @@ static void bcsp_pkt_cull(struct bcsp_struct *bcsp)
|
||||
i++;
|
||||
|
||||
__skb_unlink(skb, &bcsp->unack);
|
||||
kfree_skb(skb);
|
||||
dev_kfree_skb_irq(skb);
|
||||
}
|
||||
|
||||
if (skb_queue_empty(&bcsp->unack))
|
||||
|
||||
@@ -266,7 +266,7 @@ static void h5_pkt_cull(struct h5 *h5)
|
||||
break;
|
||||
|
||||
__skb_unlink(skb, &h5->unack);
|
||||
kfree_skb(skb);
|
||||
dev_kfree_skb_irq(skb);
|
||||
}
|
||||
|
||||
if (skb_queue_empty(&h5->unack))
|
||||
|
||||
@@ -731,7 +731,7 @@ static int qca_enqueue(struct hci_uart *hu, struct sk_buff *skb)
|
||||
default:
|
||||
BT_ERR("Illegal tx state: %d (losing packet)",
|
||||
qca->tx_ibs_state);
|
||||
kfree_skb(skb);
|
||||
dev_kfree_skb_irq(skb);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -143,15 +143,19 @@ static int __init mod_init(void)
|
||||
found:
|
||||
err = pci_read_config_dword(pdev, 0x58, &pmbase);
|
||||
if (err)
|
||||
return err;
|
||||
goto put_dev;
|
||||
|
||||
pmbase &= 0x0000FF00;
|
||||
if (pmbase == 0)
|
||||
return -EIO;
|
||||
if (pmbase == 0) {
|
||||
err = -EIO;
|
||||
goto put_dev;
|
||||
}
|
||||
|
||||
priv = kzalloc(sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
if (!priv) {
|
||||
err = -ENOMEM;
|
||||
goto put_dev;
|
||||
}
|
||||
|
||||
if (!request_region(pmbase + PMBASE_OFFSET, PMBASE_SIZE, DRV_NAME)) {
|
||||
dev_err(&pdev->dev, DRV_NAME " region 0x%x already in use!\n",
|
||||
@@ -185,6 +189,8 @@ err_iomap:
|
||||
release_region(pmbase + PMBASE_OFFSET, PMBASE_SIZE);
|
||||
out:
|
||||
kfree(priv);
|
||||
put_dev:
|
||||
pci_dev_put(pdev);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -200,6 +206,8 @@ static void __exit mod_exit(void)
|
||||
|
||||
release_region(priv->pmbase + PMBASE_OFFSET, PMBASE_SIZE);
|
||||
|
||||
pci_dev_put(priv->pcidev);
|
||||
|
||||
kfree(priv);
|
||||
}
|
||||
|
||||
|
||||
@@ -51,6 +51,10 @@ static const struct pci_device_id pci_tbl[] = {
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, pci_tbl);
|
||||
|
||||
struct amd_geode_priv {
|
||||
struct pci_dev *pcidev;
|
||||
void __iomem *membase;
|
||||
};
|
||||
|
||||
static int geode_rng_data_read(struct hwrng *rng, u32 *data)
|
||||
{
|
||||
@@ -90,6 +94,7 @@ static int __init mod_init(void)
|
||||
const struct pci_device_id *ent;
|
||||
void __iomem *mem;
|
||||
unsigned long rng_base;
|
||||
struct amd_geode_priv *priv;
|
||||
|
||||
for_each_pci_dev(pdev) {
|
||||
ent = pci_match_id(pci_tbl, pdev);
|
||||
@@ -97,17 +102,26 @@ static int __init mod_init(void)
|
||||
goto found;
|
||||
}
|
||||
/* Device not found. */
|
||||
goto out;
|
||||
return err;
|
||||
|
||||
found:
|
||||
priv = kzalloc(sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv) {
|
||||
err = -ENOMEM;
|
||||
goto put_dev;
|
||||
}
|
||||
|
||||
rng_base = pci_resource_start(pdev, 0);
|
||||
if (rng_base == 0)
|
||||
goto out;
|
||||
goto free_priv;
|
||||
err = -ENOMEM;
|
||||
mem = ioremap(rng_base, 0x58);
|
||||
if (!mem)
|
||||
goto out;
|
||||
geode_rng.priv = (unsigned long)mem;
|
||||
goto free_priv;
|
||||
|
||||
geode_rng.priv = (unsigned long)priv;
|
||||
priv->membase = mem;
|
||||
priv->pcidev = pdev;
|
||||
|
||||
pr_info("AMD Geode RNG detected\n");
|
||||
err = hwrng_register(&geode_rng);
|
||||
@@ -116,20 +130,26 @@ found:
|
||||
err);
|
||||
goto err_unmap;
|
||||
}
|
||||
out:
|
||||
return err;
|
||||
|
||||
err_unmap:
|
||||
iounmap(mem);
|
||||
goto out;
|
||||
free_priv:
|
||||
kfree(priv);
|
||||
put_dev:
|
||||
pci_dev_put(pdev);
|
||||
return err;
|
||||
}
|
||||
|
||||
static void __exit mod_exit(void)
|
||||
{
|
||||
void __iomem *mem = (void __iomem *)geode_rng.priv;
|
||||
struct amd_geode_priv *priv;
|
||||
|
||||
priv = (struct amd_geode_priv *)geode_rng.priv;
|
||||
hwrng_unregister(&geode_rng);
|
||||
iounmap(mem);
|
||||
iounmap(priv->membase);
|
||||
pci_dev_put(priv->pcidev);
|
||||
kfree(priv);
|
||||
}
|
||||
|
||||
module_init(mod_init);
|
||||
|
||||
@@ -2930,12 +2930,16 @@ static void deliver_smi_err_response(ipmi_smi_t intf,
|
||||
struct ipmi_smi_msg *msg,
|
||||
unsigned char err)
|
||||
{
|
||||
int rv;
|
||||
msg->rsp[0] = msg->data[0] | 4;
|
||||
msg->rsp[1] = msg->data[1];
|
||||
msg->rsp[2] = err;
|
||||
msg->rsp_size = 3;
|
||||
/* It's an error, so it will never requeue, no need to check return. */
|
||||
handle_one_recv_msg(intf, msg);
|
||||
|
||||
/* This will never requeue, but it may ask us to free the message. */
|
||||
rv = handle_one_recv_msg(intf, msg);
|
||||
if (rv == 0)
|
||||
ipmi_free_smi_msg(msg);
|
||||
}
|
||||
|
||||
static void cleanup_smi_msgs(ipmi_smi_t intf)
|
||||
|
||||
@@ -957,6 +957,7 @@ struct clk *rockchip_clk_register_pll(struct rockchip_clk_provider *ctx,
|
||||
return mux_clk;
|
||||
|
||||
err_pll:
|
||||
kfree(pll->rate_table);
|
||||
clk_unregister(mux_clk);
|
||||
mux_clk = pll_clk;
|
||||
err_mux:
|
||||
|
||||
@@ -948,9 +948,10 @@ static void __init st_of_quadfs_setup(struct device_node *np,
|
||||
|
||||
clk = st_clk_register_quadfs_pll(pll_name, clk_parent_name, data,
|
||||
reg, lock);
|
||||
if (IS_ERR(clk))
|
||||
if (IS_ERR(clk)) {
|
||||
kfree(lock);
|
||||
goto err_exit;
|
||||
else
|
||||
} else
|
||||
pr_debug("%s: parent %s rate %u\n",
|
||||
__clk_get_name(clk),
|
||||
__clk_get_name(clk_get_parent(clk)),
|
||||
|
||||
@@ -218,6 +218,6 @@ int dt_init_idle_driver(struct cpuidle_driver *drv,
|
||||
* also be 0 on platforms with missing DT idle states or legacy DT
|
||||
* configuration predating the DT idle states bindings.
|
||||
*/
|
||||
return i;
|
||||
return state_idx - start_idx;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dt_init_idle_driver);
|
||||
|
||||
@@ -359,12 +359,16 @@ static int img_hash_dma_init(struct img_hash_dev *hdev)
|
||||
static void img_hash_dma_task(unsigned long d)
|
||||
{
|
||||
struct img_hash_dev *hdev = (struct img_hash_dev *)d;
|
||||
struct img_hash_request_ctx *ctx = ahash_request_ctx(hdev->req);
|
||||
struct img_hash_request_ctx *ctx;
|
||||
u8 *addr;
|
||||
size_t nbytes, bleft, wsend, len, tbc;
|
||||
struct scatterlist tsg;
|
||||
|
||||
if (!hdev->req || !ctx->sg)
|
||||
if (!hdev->req)
|
||||
return;
|
||||
|
||||
ctx = ahash_request_ctx(hdev->req);
|
||||
if (!ctx->sg)
|
||||
return;
|
||||
|
||||
addr = sg_virt(ctx->sg);
|
||||
|
||||
@@ -1271,6 +1271,7 @@ struct n2_hash_tmpl {
|
||||
const u32 *hash_init;
|
||||
u8 hw_op_hashsz;
|
||||
u8 digest_size;
|
||||
u8 statesize;
|
||||
u8 block_size;
|
||||
u8 auth_type;
|
||||
u8 hmac_type;
|
||||
@@ -1302,6 +1303,7 @@ static const struct n2_hash_tmpl hash_tmpls[] = {
|
||||
.hmac_type = AUTH_TYPE_HMAC_MD5,
|
||||
.hw_op_hashsz = MD5_DIGEST_SIZE,
|
||||
.digest_size = MD5_DIGEST_SIZE,
|
||||
.statesize = sizeof(struct md5_state),
|
||||
.block_size = MD5_HMAC_BLOCK_SIZE },
|
||||
{ .name = "sha1",
|
||||
.hash_zero = sha1_zero_message_hash,
|
||||
@@ -1310,6 +1312,7 @@ static const struct n2_hash_tmpl hash_tmpls[] = {
|
||||
.hmac_type = AUTH_TYPE_HMAC_SHA1,
|
||||
.hw_op_hashsz = SHA1_DIGEST_SIZE,
|
||||
.digest_size = SHA1_DIGEST_SIZE,
|
||||
.statesize = sizeof(struct sha1_state),
|
||||
.block_size = SHA1_BLOCK_SIZE },
|
||||
{ .name = "sha256",
|
||||
.hash_zero = sha256_zero_message_hash,
|
||||
@@ -1318,6 +1321,7 @@ static const struct n2_hash_tmpl hash_tmpls[] = {
|
||||
.hmac_type = AUTH_TYPE_HMAC_SHA256,
|
||||
.hw_op_hashsz = SHA256_DIGEST_SIZE,
|
||||
.digest_size = SHA256_DIGEST_SIZE,
|
||||
.statesize = sizeof(struct sha256_state),
|
||||
.block_size = SHA256_BLOCK_SIZE },
|
||||
{ .name = "sha224",
|
||||
.hash_zero = sha224_zero_message_hash,
|
||||
@@ -1326,6 +1330,7 @@ static const struct n2_hash_tmpl hash_tmpls[] = {
|
||||
.hmac_type = AUTH_TYPE_RESERVED,
|
||||
.hw_op_hashsz = SHA256_DIGEST_SIZE,
|
||||
.digest_size = SHA224_DIGEST_SIZE,
|
||||
.statesize = sizeof(struct sha256_state),
|
||||
.block_size = SHA224_BLOCK_SIZE },
|
||||
};
|
||||
#define NUM_HASH_TMPLS ARRAY_SIZE(hash_tmpls)
|
||||
@@ -1465,6 +1470,7 @@ static int __n2_register_one_ahash(const struct n2_hash_tmpl *tmpl)
|
||||
|
||||
halg = &ahash->halg;
|
||||
halg->digestsize = tmpl->digest_size;
|
||||
halg->statesize = tmpl->statesize;
|
||||
|
||||
base = &halg->base;
|
||||
snprintf(base->cra_name, CRYPTO_MAX_ALG_NAME, "%s", tmpl->name);
|
||||
|
||||
@@ -109,6 +109,12 @@ static char dio_no_name[] = { 0 };
|
||||
|
||||
#endif /* CONFIG_DIO_CONSTANTS */
|
||||
|
||||
static void dio_dev_release(struct device *dev)
|
||||
{
|
||||
struct dio_dev *ddev = container_of(dev, typeof(struct dio_dev), dev);
|
||||
kfree(ddev);
|
||||
}
|
||||
|
||||
int __init dio_find(int deviceid)
|
||||
{
|
||||
/* Called to find a DIO device before the full bus scan has run.
|
||||
@@ -234,6 +240,7 @@ static int __init dio_init(void)
|
||||
dev->bus = &dio_bus;
|
||||
dev->dev.parent = &dio_bus.dev;
|
||||
dev->dev.bus = &dio_bus_type;
|
||||
dev->dev.release = dio_dev_release;
|
||||
dev->scode = scode;
|
||||
dev->resource.start = pa;
|
||||
dev->resource.end = pa + DIO_SIZE(scode, va);
|
||||
@@ -261,6 +268,7 @@ static int __init dio_init(void)
|
||||
if (error) {
|
||||
pr_err("DIO: Error registering device %s\n",
|
||||
dev->name);
|
||||
put_device(&dev->dev);
|
||||
continue;
|
||||
}
|
||||
error = dio_create_sysfs_dev_files(dev);
|
||||
|
||||
@@ -253,6 +253,7 @@ static bool amdgpu_atrm_get_bios(struct amdgpu_device *adev)
|
||||
|
||||
if (!found)
|
||||
return false;
|
||||
pci_dev_put(pdev);
|
||||
|
||||
adev->bios = kmalloc(size, GFP_KERNEL);
|
||||
if (!adev->bios) {
|
||||
|
||||
@@ -363,6 +363,9 @@ void drm_connector_cleanup(struct drm_connector *connector)
|
||||
mutex_destroy(&connector->mutex);
|
||||
|
||||
memset(connector, 0, sizeof(*connector));
|
||||
|
||||
if (dev->registered)
|
||||
drm_sysfs_hotplug_event(dev);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_connector_cleanup);
|
||||
|
||||
|
||||
@@ -90,8 +90,9 @@ static int fsl_dcu_drm_connector_get_modes(struct drm_connector *connector)
|
||||
return num_modes;
|
||||
}
|
||||
|
||||
static int fsl_dcu_drm_connector_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
static enum drm_mode_status
|
||||
fsl_dcu_drm_connector_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
{
|
||||
if (mode->hdisplay & 0xf)
|
||||
return MODE_ERROR;
|
||||
|
||||
@@ -215,6 +215,7 @@ static bool radeon_atrm_get_bios(struct radeon_device *rdev)
|
||||
|
||||
if (!found)
|
||||
return false;
|
||||
pci_dev_put(pdev);
|
||||
|
||||
rdev->bios = kmalloc(size, GFP_KERNEL);
|
||||
if (!rdev->bios) {
|
||||
|
||||
@@ -296,7 +296,7 @@ static void sti_dvo_set_mode(struct drm_bridge *bridge,
|
||||
|
||||
DRM_DEBUG_DRIVER("\n");
|
||||
|
||||
memcpy(&dvo->mode, mode, sizeof(struct drm_display_mode));
|
||||
drm_mode_copy(&dvo->mode, mode);
|
||||
|
||||
/* According to the path used (main or aux), the dvo clocks should
|
||||
* have a different parent clock. */
|
||||
@@ -354,8 +354,9 @@ static int sti_dvo_connector_get_modes(struct drm_connector *connector)
|
||||
|
||||
#define CLK_TOLERANCE_HZ 50
|
||||
|
||||
static int sti_dvo_connector_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
static enum drm_mode_status
|
||||
sti_dvo_connector_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
{
|
||||
int target = mode->clock * 1000;
|
||||
int target_min = target - CLK_TOLERANCE_HZ;
|
||||
|
||||
@@ -528,7 +528,7 @@ static void sti_hda_set_mode(struct drm_bridge *bridge,
|
||||
|
||||
DRM_DEBUG_DRIVER("\n");
|
||||
|
||||
memcpy(&hda->mode, mode, sizeof(struct drm_display_mode));
|
||||
drm_mode_copy(&hda->mode, mode);
|
||||
|
||||
if (!hda_get_mode_idx(hda->mode, &mode_idx)) {
|
||||
DRM_ERROR("Undefined mode\n");
|
||||
@@ -606,8 +606,9 @@ static int sti_hda_connector_get_modes(struct drm_connector *connector)
|
||||
|
||||
#define CLK_TOLERANCE_HZ 50
|
||||
|
||||
static int sti_hda_connector_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
static enum drm_mode_status
|
||||
sti_hda_connector_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
{
|
||||
int target = mode->clock * 1000;
|
||||
int target_min = target - CLK_TOLERANCE_HZ;
|
||||
|
||||
@@ -848,7 +848,7 @@ static void sti_hdmi_set_mode(struct drm_bridge *bridge,
|
||||
DRM_DEBUG_DRIVER("\n");
|
||||
|
||||
/* Copy the drm display mode in the connector local structure */
|
||||
memcpy(&hdmi->mode, mode, sizeof(struct drm_display_mode));
|
||||
drm_mode_copy(&hdmi->mode, mode);
|
||||
|
||||
/* Update clock framerate according to the selected mode */
|
||||
ret = clk_set_rate(hdmi->clk_pix, mode->clock * 1000);
|
||||
@@ -906,8 +906,9 @@ fail:
|
||||
|
||||
#define CLK_TOLERANCE_HZ 50
|
||||
|
||||
static int sti_hdmi_connector_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
static enum drm_mode_status
|
||||
sti_hdmi_connector_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
{
|
||||
int target = mode->clock * 1000;
|
||||
int target_min = target - CLK_TOLERANCE_HZ;
|
||||
|
||||
@@ -301,7 +301,8 @@ void vmw_kms_cursor_snoop(struct vmw_surface *srf,
|
||||
if (cmd->dma.guest.ptr.offset % PAGE_SIZE ||
|
||||
box->x != 0 || box->y != 0 || box->z != 0 ||
|
||||
box->srcx != 0 || box->srcy != 0 || box->srcz != 0 ||
|
||||
box->d != 1 || box_count != 1) {
|
||||
box->d != 1 || box_count != 1 ||
|
||||
box->w > 64 || box->h > 64) {
|
||||
/* TODO handle none page aligned offsets */
|
||||
/* TODO handle more dst & src != 0 */
|
||||
/* TODO handle more then one copy */
|
||||
|
||||
@@ -820,7 +820,10 @@
|
||||
#define USB_DEVICE_ID_ORTEK_WKB2000 0x2000
|
||||
|
||||
#define USB_VENDOR_ID_PLANTRONICS 0x047f
|
||||
#define USB_DEVICE_ID_PLANTRONICS_BLACKWIRE_3210_SERIES 0xc055
|
||||
#define USB_DEVICE_ID_PLANTRONICS_BLACKWIRE_3220_SERIES 0xc056
|
||||
#define USB_DEVICE_ID_PLANTRONICS_BLACKWIRE_3215_SERIES 0xc057
|
||||
#define USB_DEVICE_ID_PLANTRONICS_BLACKWIRE_3225_SERIES 0xc058
|
||||
|
||||
#define USB_VENDOR_ID_PANASONIC 0x04da
|
||||
#define USB_DEVICE_ID_PANABOARD_UBT780 0x1044
|
||||
|
||||
@@ -201,9 +201,18 @@ err:
|
||||
}
|
||||
|
||||
static const struct hid_device_id plantronics_devices[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_PLANTRONICS,
|
||||
USB_DEVICE_ID_PLANTRONICS_BLACKWIRE_3210_SERIES),
|
||||
.driver_data = PLT_QUIRK_DOUBLE_VOLUME_KEYS },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_PLANTRONICS,
|
||||
USB_DEVICE_ID_PLANTRONICS_BLACKWIRE_3220_SERIES),
|
||||
.driver_data = PLT_QUIRK_DOUBLE_VOLUME_KEYS },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_PLANTRONICS,
|
||||
USB_DEVICE_ID_PLANTRONICS_BLACKWIRE_3215_SERIES),
|
||||
.driver_data = PLT_QUIRK_DOUBLE_VOLUME_KEYS },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_PLANTRONICS,
|
||||
USB_DEVICE_ID_PLANTRONICS_BLACKWIRE_3225_SERIES),
|
||||
.driver_data = PLT_QUIRK_DOUBLE_VOLUME_KEYS },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_PLANTRONICS, HID_ANY_ID) },
|
||||
{ }
|
||||
};
|
||||
|
||||
@@ -67,7 +67,7 @@ struct hid_sensor_sample {
|
||||
u32 raw_len;
|
||||
} __packed;
|
||||
|
||||
static struct attribute hid_custom_attrs[] = {
|
||||
static struct attribute hid_custom_attrs[HID_CUSTOM_TOTAL_ATTRS] = {
|
||||
{.name = "name", .mode = S_IRUGO},
|
||||
{.name = "units", .mode = S_IRUGO},
|
||||
{.name = "unit-expo", .mode = S_IRUGO},
|
||||
|
||||
@@ -69,6 +69,9 @@ static int wacom_raw_event(struct hid_device *hdev, struct hid_report *report,
|
||||
{
|
||||
struct wacom *wacom = hid_get_drvdata(hdev);
|
||||
|
||||
if (wacom->wacom_wac.features.type == BOOTLOADER)
|
||||
return 0;
|
||||
|
||||
if (size > WACOM_PKGLEN_MAX)
|
||||
return 1;
|
||||
|
||||
@@ -2409,6 +2412,11 @@ static int wacom_probe(struct hid_device *hdev,
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (features->type == BOOTLOADER) {
|
||||
hid_warn(hdev, "Using device in hidraw-only mode");
|
||||
return hid_hw_start(hdev, HID_CONNECT_HIDRAW);
|
||||
}
|
||||
|
||||
error = wacom_parse_and_register(wacom, false);
|
||||
if (error)
|
||||
goto fail;
|
||||
|
||||
@@ -3550,6 +3550,9 @@ static const struct wacom_features wacom_features_0x343 =
|
||||
static const struct wacom_features wacom_features_HID_ANY_ID =
|
||||
{ "Wacom HID", .type = HID_GENERIC, .oVid = HID_ANY_ID, .oPid = HID_ANY_ID };
|
||||
|
||||
static const struct wacom_features wacom_features_0x94 =
|
||||
{ "Wacom Bootloader", .type = BOOTLOADER };
|
||||
|
||||
#define USB_DEVICE_WACOM(prod) \
|
||||
HID_DEVICE(BUS_USB, HID_GROUP_WACOM, USB_VENDOR_ID_WACOM, prod),\
|
||||
.driver_data = (kernel_ulong_t)&wacom_features_##prod
|
||||
@@ -3623,6 +3626,7 @@ const struct hid_device_id wacom_ids[] = {
|
||||
{ USB_DEVICE_WACOM(0x84) },
|
||||
{ USB_DEVICE_WACOM(0x90) },
|
||||
{ USB_DEVICE_WACOM(0x93) },
|
||||
{ USB_DEVICE_WACOM(0x94) },
|
||||
{ USB_DEVICE_WACOM(0x97) },
|
||||
{ USB_DEVICE_WACOM(0x9A) },
|
||||
{ USB_DEVICE_WACOM(0x9F) },
|
||||
|
||||
@@ -154,6 +154,7 @@ enum {
|
||||
MTTPC,
|
||||
MTTPC_B,
|
||||
HID_GENERIC,
|
||||
BOOTLOADER,
|
||||
MAX_TYPE
|
||||
};
|
||||
|
||||
|
||||
@@ -540,8 +540,10 @@ static int ssi_probe(struct platform_device *pd)
|
||||
platform_set_drvdata(pd, ssi);
|
||||
|
||||
err = ssi_add_controller(ssi, pd);
|
||||
if (err < 0)
|
||||
if (err < 0) {
|
||||
hsi_put_controller(ssi);
|
||||
goto out1;
|
||||
}
|
||||
|
||||
pm_runtime_enable(&pd->dev);
|
||||
|
||||
@@ -574,9 +576,9 @@ out3:
|
||||
device_for_each_child(&pd->dev, NULL, ssi_remove_ports);
|
||||
out2:
|
||||
ssi_remove_controller(ssi);
|
||||
pm_runtime_disable(&pd->dev);
|
||||
out1:
|
||||
platform_set_drvdata(pd, NULL);
|
||||
pm_runtime_disable(&pd->dev);
|
||||
|
||||
return err;
|
||||
}
|
||||
@@ -667,7 +669,13 @@ static int __init ssi_init(void) {
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return platform_driver_register(&ssi_port_pdriver);
|
||||
ret = platform_driver_register(&ssi_port_pdriver);
|
||||
if (ret) {
|
||||
platform_driver_unregister(&ssi_pdriver);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
module_init(ssi_init);
|
||||
|
||||
|
||||
@@ -495,6 +495,9 @@ static int ismt_access(struct i2c_adapter *adap, u16 addr,
|
||||
if (read_write == I2C_SMBUS_WRITE) {
|
||||
/* Block Write */
|
||||
dev_dbg(dev, "I2C_SMBUS_BLOCK_DATA: WRITE\n");
|
||||
if (data->block[0] < 1 || data->block[0] > I2C_SMBUS_BLOCK_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
dma_size = data->block[0] + 1;
|
||||
dma_direction = DMA_TO_DEVICE;
|
||||
desc->wr_len_cmd = dma_size;
|
||||
|
||||
@@ -101,7 +101,7 @@ static int ce4100_i2c_probe(struct pci_dev *dev,
|
||||
int i;
|
||||
struct ce4100_devices *sds;
|
||||
|
||||
ret = pci_enable_device_mem(dev);
|
||||
ret = pcim_enable_device(dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -110,10 +110,8 @@ static int ce4100_i2c_probe(struct pci_dev *dev,
|
||||
return -EINVAL;
|
||||
}
|
||||
sds = kzalloc(sizeof(*sds), GFP_KERNEL);
|
||||
if (!sds) {
|
||||
ret = -ENOMEM;
|
||||
goto err_mem;
|
||||
}
|
||||
if (!sds)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(sds->pdev); i++) {
|
||||
sds->pdev[i] = add_i2c_device(dev, i);
|
||||
@@ -129,8 +127,6 @@ static int ce4100_i2c_probe(struct pci_dev *dev,
|
||||
|
||||
err_dev_add:
|
||||
kfree(sds);
|
||||
err_mem:
|
||||
pci_disable_device(dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -282,10 +282,10 @@ int ad_sigma_delta_single_conversion(struct iio_dev *indio_dev,
|
||||
unsigned int sample, raw_sample;
|
||||
int ret = 0;
|
||||
|
||||
if (iio_buffer_enabled(indio_dev))
|
||||
return -EBUSY;
|
||||
ret = iio_device_claim_direct_mode(indio_dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
mutex_lock(&indio_dev->mlock);
|
||||
ad_sigma_delta_set_channel(sigma_delta, chan->address);
|
||||
|
||||
spi_bus_lock(sigma_delta->spi->master);
|
||||
@@ -319,7 +319,7 @@ out:
|
||||
ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE);
|
||||
sigma_delta->bus_locked = false;
|
||||
spi_bus_unlock(sigma_delta->spi->master);
|
||||
mutex_unlock(&indio_dev->mlock);
|
||||
iio_device_release_direct_mode(indio_dev);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -42,6 +42,11 @@ static const struct nla_policy ipoib_policy[IFLA_IPOIB_MAX + 1] = {
|
||||
[IFLA_IPOIB_UMCAST] = { .type = NLA_U16 },
|
||||
};
|
||||
|
||||
static unsigned int ipoib_get_max_num_queues(void)
|
||||
{
|
||||
return min_t(unsigned int, num_possible_cpus(), 128);
|
||||
}
|
||||
|
||||
static int ipoib_fill_info(struct sk_buff *skb, const struct net_device *dev)
|
||||
{
|
||||
struct ipoib_dev_priv *priv = netdev_priv(dev);
|
||||
@@ -167,6 +172,8 @@ static struct rtnl_link_ops ipoib_link_ops __read_mostly = {
|
||||
.dellink = ipoib_unregister_child_dev,
|
||||
.get_size = ipoib_get_size,
|
||||
.fill_info = ipoib_fill_info,
|
||||
.get_num_rx_queues = ipoib_get_max_num_queues,
|
||||
.get_num_tx_queues = ipoib_get_max_num_queues,
|
||||
};
|
||||
|
||||
int __init ipoib_netlink_init(void)
|
||||
|
||||
@@ -1088,14 +1088,12 @@ static int elants_i2c_power_on(struct elants_data *ts)
|
||||
if (IS_ERR_OR_NULL(ts->reset_gpio))
|
||||
return 0;
|
||||
|
||||
gpiod_set_value_cansleep(ts->reset_gpio, 1);
|
||||
|
||||
error = regulator_enable(ts->vcc33);
|
||||
if (error) {
|
||||
dev_err(&ts->client->dev,
|
||||
"failed to enable vcc33 regulator: %d\n",
|
||||
error);
|
||||
goto release_reset_gpio;
|
||||
return error;
|
||||
}
|
||||
|
||||
error = regulator_enable(ts->vccio);
|
||||
@@ -1104,7 +1102,7 @@ static int elants_i2c_power_on(struct elants_data *ts)
|
||||
"failed to enable vccio regulator: %d\n",
|
||||
error);
|
||||
regulator_disable(ts->vcc33);
|
||||
goto release_reset_gpio;
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1113,7 +1111,6 @@ static int elants_i2c_power_on(struct elants_data *ts)
|
||||
*/
|
||||
udelay(ELAN_POWERON_DELAY_USEC);
|
||||
|
||||
release_reset_gpio:
|
||||
gpiod_set_value_cansleep(ts->reset_gpio, 0);
|
||||
if (error)
|
||||
return error;
|
||||
@@ -1182,7 +1179,7 @@ static int elants_i2c_probe(struct i2c_client *client,
|
||||
return error;
|
||||
}
|
||||
|
||||
ts->reset_gpio = devm_gpiod_get(&client->dev, "reset", GPIOD_OUT_LOW);
|
||||
ts->reset_gpio = devm_gpiod_get(&client->dev, "reset", GPIOD_OUT_HIGH);
|
||||
if (IS_ERR(ts->reset_gpio)) {
|
||||
error = PTR_ERR(ts->reset_gpio);
|
||||
|
||||
|
||||
@@ -2684,6 +2684,13 @@ static int __init parse_ivrs_acpihid(char *str)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Ignore leading zeroes after ':', so e.g., AMDI0095:00
|
||||
* will match AMDI0095:0 in the second strcmp in acpi_dev_hid_uid_match
|
||||
*/
|
||||
while (*uid == '0' && *(uid + 1))
|
||||
uid++;
|
||||
|
||||
i = early_acpihid_map_size++;
|
||||
memcpy(early_acpihid_map[i].hid, hid, strlen(hid));
|
||||
memcpy(early_acpihid_map[i].uid, uid, strlen(uid));
|
||||
|
||||
@@ -1131,7 +1131,7 @@ static int fsl_pamu_probe(struct platform_device *pdev)
|
||||
ret = create_csd(ppaact_phys, mem_size, csd_port_id);
|
||||
if (ret) {
|
||||
dev_err(dev, "could not create coherence subdomain\n");
|
||||
return ret;
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -112,7 +112,7 @@ static int gic_probe(struct platform_device *pdev)
|
||||
|
||||
pm_runtime_enable(dev);
|
||||
|
||||
ret = pm_runtime_get_sync(dev);
|
||||
ret = pm_runtime_resume_and_get(dev);
|
||||
if (ret < 0)
|
||||
goto rpm_disable;
|
||||
|
||||
|
||||
@@ -3234,6 +3234,7 @@ static int
|
||||
hfcm_l1callback(struct dchannel *dch, u_int cmd)
|
||||
{
|
||||
struct hfc_multi *hc = dch->hw;
|
||||
struct sk_buff_head free_queue;
|
||||
u_long flags;
|
||||
|
||||
switch (cmd) {
|
||||
@@ -3262,6 +3263,7 @@ hfcm_l1callback(struct dchannel *dch, u_int cmd)
|
||||
l1_event(dch->l1, HW_POWERUP_IND);
|
||||
break;
|
||||
case HW_DEACT_REQ:
|
||||
__skb_queue_head_init(&free_queue);
|
||||
/* start deactivation */
|
||||
spin_lock_irqsave(&hc->lock, flags);
|
||||
if (hc->ctype == HFC_TYPE_E1) {
|
||||
@@ -3281,20 +3283,21 @@ hfcm_l1callback(struct dchannel *dch, u_int cmd)
|
||||
plxsd_checksync(hc, 0);
|
||||
}
|
||||
}
|
||||
skb_queue_purge(&dch->squeue);
|
||||
skb_queue_splice_init(&dch->squeue, &free_queue);
|
||||
if (dch->tx_skb) {
|
||||
dev_kfree_skb(dch->tx_skb);
|
||||
__skb_queue_tail(&free_queue, dch->tx_skb);
|
||||
dch->tx_skb = NULL;
|
||||
}
|
||||
dch->tx_idx = 0;
|
||||
if (dch->rx_skb) {
|
||||
dev_kfree_skb(dch->rx_skb);
|
||||
__skb_queue_tail(&free_queue, dch->rx_skb);
|
||||
dch->rx_skb = NULL;
|
||||
}
|
||||
test_and_clear_bit(FLG_TX_BUSY, &dch->Flags);
|
||||
if (test_and_clear_bit(FLG_BUSY_TIMER, &dch->Flags))
|
||||
del_timer(&dch->timer);
|
||||
spin_unlock_irqrestore(&hc->lock, flags);
|
||||
__skb_queue_purge(&free_queue);
|
||||
break;
|
||||
case HW_POWERUP_REQ:
|
||||
spin_lock_irqsave(&hc->lock, flags);
|
||||
@@ -3401,6 +3404,9 @@ handle_dmsg(struct mISDNchannel *ch, struct sk_buff *skb)
|
||||
case PH_DEACTIVATE_REQ:
|
||||
test_and_clear_bit(FLG_L2_ACTIVATED, &dch->Flags);
|
||||
if (dch->dev.D.protocol != ISDN_P_TE_S0) {
|
||||
struct sk_buff_head free_queue;
|
||||
|
||||
__skb_queue_head_init(&free_queue);
|
||||
spin_lock_irqsave(&hc->lock, flags);
|
||||
if (debug & DEBUG_HFCMULTI_MSG)
|
||||
printk(KERN_DEBUG
|
||||
@@ -3422,14 +3428,14 @@ handle_dmsg(struct mISDNchannel *ch, struct sk_buff *skb)
|
||||
/* deactivate */
|
||||
dch->state = 1;
|
||||
}
|
||||
skb_queue_purge(&dch->squeue);
|
||||
skb_queue_splice_init(&dch->squeue, &free_queue);
|
||||
if (dch->tx_skb) {
|
||||
dev_kfree_skb(dch->tx_skb);
|
||||
__skb_queue_tail(&free_queue, dch->tx_skb);
|
||||
dch->tx_skb = NULL;
|
||||
}
|
||||
dch->tx_idx = 0;
|
||||
if (dch->rx_skb) {
|
||||
dev_kfree_skb(dch->rx_skb);
|
||||
__skb_queue_tail(&free_queue, dch->rx_skb);
|
||||
dch->rx_skb = NULL;
|
||||
}
|
||||
test_and_clear_bit(FLG_TX_BUSY, &dch->Flags);
|
||||
@@ -3441,6 +3447,7 @@ handle_dmsg(struct mISDNchannel *ch, struct sk_buff *skb)
|
||||
#endif
|
||||
ret = 0;
|
||||
spin_unlock_irqrestore(&hc->lock, flags);
|
||||
__skb_queue_purge(&free_queue);
|
||||
} else
|
||||
ret = l1_event(dch->l1, hh->prim);
|
||||
break;
|
||||
|
||||
@@ -1631,16 +1631,19 @@ hfcpci_l2l1D(struct mISDNchannel *ch, struct sk_buff *skb)
|
||||
test_and_clear_bit(FLG_L2_ACTIVATED, &dch->Flags);
|
||||
spin_lock_irqsave(&hc->lock, flags);
|
||||
if (hc->hw.protocol == ISDN_P_NT_S0) {
|
||||
struct sk_buff_head free_queue;
|
||||
|
||||
__skb_queue_head_init(&free_queue);
|
||||
/* prepare deactivation */
|
||||
Write_hfc(hc, HFCPCI_STATES, 0x40);
|
||||
skb_queue_purge(&dch->squeue);
|
||||
skb_queue_splice_init(&dch->squeue, &free_queue);
|
||||
if (dch->tx_skb) {
|
||||
dev_kfree_skb(dch->tx_skb);
|
||||
__skb_queue_tail(&free_queue, dch->tx_skb);
|
||||
dch->tx_skb = NULL;
|
||||
}
|
||||
dch->tx_idx = 0;
|
||||
if (dch->rx_skb) {
|
||||
dev_kfree_skb(dch->rx_skb);
|
||||
__skb_queue_tail(&free_queue, dch->rx_skb);
|
||||
dch->rx_skb = NULL;
|
||||
}
|
||||
test_and_clear_bit(FLG_TX_BUSY, &dch->Flags);
|
||||
@@ -1653,10 +1656,12 @@ hfcpci_l2l1D(struct mISDNchannel *ch, struct sk_buff *skb)
|
||||
hc->hw.mst_m &= ~HFCPCI_MASTER;
|
||||
Write_hfc(hc, HFCPCI_MST_MODE, hc->hw.mst_m);
|
||||
ret = 0;
|
||||
spin_unlock_irqrestore(&hc->lock, flags);
|
||||
__skb_queue_purge(&free_queue);
|
||||
} else {
|
||||
ret = l1_event(dch->l1, hh->prim);
|
||||
spin_unlock_irqrestore(&hc->lock, flags);
|
||||
}
|
||||
spin_unlock_irqrestore(&hc->lock, flags);
|
||||
break;
|
||||
}
|
||||
if (!ret)
|
||||
|
||||
@@ -337,20 +337,24 @@ hfcusb_l2l1D(struct mISDNchannel *ch, struct sk_buff *skb)
|
||||
test_and_clear_bit(FLG_L2_ACTIVATED, &dch->Flags);
|
||||
|
||||
if (hw->protocol == ISDN_P_NT_S0) {
|
||||
struct sk_buff_head free_queue;
|
||||
|
||||
__skb_queue_head_init(&free_queue);
|
||||
hfcsusb_ph_command(hw, HFC_L1_DEACTIVATE_NT);
|
||||
spin_lock_irqsave(&hw->lock, flags);
|
||||
skb_queue_purge(&dch->squeue);
|
||||
skb_queue_splice_init(&dch->squeue, &free_queue);
|
||||
if (dch->tx_skb) {
|
||||
dev_kfree_skb(dch->tx_skb);
|
||||
__skb_queue_tail(&free_queue, dch->tx_skb);
|
||||
dch->tx_skb = NULL;
|
||||
}
|
||||
dch->tx_idx = 0;
|
||||
if (dch->rx_skb) {
|
||||
dev_kfree_skb(dch->rx_skb);
|
||||
__skb_queue_tail(&free_queue, dch->rx_skb);
|
||||
dch->rx_skb = NULL;
|
||||
}
|
||||
test_and_clear_bit(FLG_TX_BUSY, &dch->Flags);
|
||||
spin_unlock_irqrestore(&hw->lock, flags);
|
||||
__skb_queue_purge(&free_queue);
|
||||
#ifdef FIXME
|
||||
if (test_and_clear_bit(FLG_L1_BUSY, &dch->Flags))
|
||||
dchannel_sched_event(&hc->dch, D_CLEARBUSY);
|
||||
@@ -1340,7 +1344,7 @@ tx_iso_complete(struct urb *urb)
|
||||
printk("\n");
|
||||
}
|
||||
|
||||
dev_kfree_skb(tx_skb);
|
||||
dev_consume_skb_irq(tx_skb);
|
||||
tx_skb = NULL;
|
||||
if (fifo->dch && get_next_dframe(fifo->dch))
|
||||
tx_skb = fifo->dch->tx_skb;
|
||||
|
||||
@@ -106,6 +106,10 @@ int macio_init(void)
|
||||
return -ENXIO;
|
||||
}
|
||||
adb = ioremap(r.start, sizeof(struct adb_regs));
|
||||
if (!adb) {
|
||||
of_node_put(adbs);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
out_8(&adb->ctrl.r, 0);
|
||||
out_8(&adb->intr.r, 0);
|
||||
|
||||
@@ -425,7 +425,7 @@ static struct macio_dev * macio_add_one_device(struct macio_chip *chip,
|
||||
if (of_device_register(&dev->ofdev) != 0) {
|
||||
printk(KERN_DEBUG"macio: device registration error for %s!\n",
|
||||
dev_name(&dev->ofdev.dev));
|
||||
kfree(dev);
|
||||
put_device(&dev->ofdev.dev);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -74,8 +74,10 @@ static int mcb_probe(struct device *dev)
|
||||
|
||||
get_device(dev);
|
||||
ret = mdrv->probe(mdev, found_id);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
module_put(carrier_mod);
|
||||
put_device(dev);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -107,7 +107,7 @@ static int chameleon_parse_gdd(struct mcb_bus *bus,
|
||||
return 0;
|
||||
|
||||
err:
|
||||
mcb_free_dev(mdev);
|
||||
put_device(&mdev->dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -522,11 +522,13 @@ static int __create_persistent_data_objects(struct dm_cache_metadata *cmd,
|
||||
return r;
|
||||
}
|
||||
|
||||
static void __destroy_persistent_data_objects(struct dm_cache_metadata *cmd)
|
||||
static void __destroy_persistent_data_objects(struct dm_cache_metadata *cmd,
|
||||
bool destroy_bm)
|
||||
{
|
||||
dm_sm_destroy(cmd->metadata_sm);
|
||||
dm_tm_destroy(cmd->tm);
|
||||
dm_block_manager_destroy(cmd->bm);
|
||||
if (destroy_bm)
|
||||
dm_block_manager_destroy(cmd->bm);
|
||||
}
|
||||
|
||||
typedef unsigned long (*flags_mutator)(unsigned long);
|
||||
@@ -780,7 +782,7 @@ static struct dm_cache_metadata *lookup_or_open(struct block_device *bdev,
|
||||
cmd2 = lookup(bdev);
|
||||
if (cmd2) {
|
||||
mutex_unlock(&table_lock);
|
||||
__destroy_persistent_data_objects(cmd);
|
||||
__destroy_persistent_data_objects(cmd, true);
|
||||
kfree(cmd);
|
||||
return cmd2;
|
||||
}
|
||||
@@ -827,7 +829,7 @@ void dm_cache_metadata_close(struct dm_cache_metadata *cmd)
|
||||
mutex_unlock(&table_lock);
|
||||
|
||||
if (!cmd->fail_io)
|
||||
__destroy_persistent_data_objects(cmd);
|
||||
__destroy_persistent_data_objects(cmd, true);
|
||||
kfree(cmd);
|
||||
}
|
||||
}
|
||||
@@ -1551,14 +1553,53 @@ int dm_cache_metadata_needs_check(struct dm_cache_metadata *cmd, bool *result)
|
||||
|
||||
int dm_cache_metadata_abort(struct dm_cache_metadata *cmd)
|
||||
{
|
||||
int r;
|
||||
int r = -EINVAL;
|
||||
struct dm_block_manager *old_bm = NULL, *new_bm = NULL;
|
||||
|
||||
/* fail_io is double-checked with cmd->root_lock held below */
|
||||
if (unlikely(cmd->fail_io))
|
||||
return r;
|
||||
|
||||
/*
|
||||
* Replacement block manager (new_bm) is created and old_bm destroyed outside of
|
||||
* cmd root_lock to avoid ABBA deadlock that would result (due to life-cycle of
|
||||
* shrinker associated with the block manager's bufio client vs cmd root_lock).
|
||||
* - must take shrinker_rwsem without holding cmd->root_lock
|
||||
*/
|
||||
new_bm = dm_block_manager_create(cmd->bdev, DM_CACHE_METADATA_BLOCK_SIZE << SECTOR_SHIFT,
|
||||
CACHE_METADATA_CACHE_SIZE,
|
||||
CACHE_MAX_CONCURRENT_LOCKS);
|
||||
|
||||
WRITE_LOCK(cmd);
|
||||
__destroy_persistent_data_objects(cmd);
|
||||
r = __create_persistent_data_objects(cmd, false);
|
||||
if (cmd->fail_io) {
|
||||
WRITE_UNLOCK(cmd);
|
||||
goto out;
|
||||
}
|
||||
|
||||
__destroy_persistent_data_objects(cmd, false);
|
||||
old_bm = cmd->bm;
|
||||
if (IS_ERR(new_bm)) {
|
||||
DMERR("could not create block manager during abort");
|
||||
cmd->bm = NULL;
|
||||
r = PTR_ERR(new_bm);
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
cmd->bm = new_bm;
|
||||
r = __open_or_format_metadata(cmd, false);
|
||||
if (r) {
|
||||
cmd->bm = NULL;
|
||||
goto out_unlock;
|
||||
}
|
||||
new_bm = NULL;
|
||||
out_unlock:
|
||||
if (r)
|
||||
cmd->fail_io = true;
|
||||
WRITE_UNLOCK(cmd);
|
||||
dm_block_manager_destroy(old_bm);
|
||||
out:
|
||||
if (new_bm && !IS_ERR(new_bm))
|
||||
dm_block_manager_destroy(new_bm);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -1030,16 +1030,16 @@ static void abort_transaction(struct cache *cache)
|
||||
if (get_cache_mode(cache) >= CM_READ_ONLY)
|
||||
return;
|
||||
|
||||
if (dm_cache_metadata_set_needs_check(cache->cmd)) {
|
||||
DMERR("%s: failed to set 'needs_check' flag in metadata", dev_name);
|
||||
set_cache_mode(cache, CM_FAIL);
|
||||
}
|
||||
|
||||
DMERR_LIMIT("%s: aborting current metadata transaction", dev_name);
|
||||
if (dm_cache_metadata_abort(cache->cmd)) {
|
||||
DMERR("%s: failed to abort metadata transaction", dev_name);
|
||||
set_cache_mode(cache, CM_FAIL);
|
||||
}
|
||||
|
||||
if (dm_cache_metadata_set_needs_check(cache->cmd)) {
|
||||
DMERR("%s: failed to set 'needs_check' flag in metadata", dev_name);
|
||||
set_cache_mode(cache, CM_FAIL);
|
||||
}
|
||||
}
|
||||
|
||||
static void metadata_operation_failed(struct cache *cache, const char *op, int r)
|
||||
@@ -2321,6 +2321,7 @@ static void destroy(struct cache *cache)
|
||||
if (cache->prison)
|
||||
dm_bio_prison_destroy(cache->prison);
|
||||
|
||||
cancel_delayed_work_sync(&cache->waker);
|
||||
if (cache->wq)
|
||||
destroy_workqueue(cache->wq);
|
||||
|
||||
|
||||
@@ -661,6 +661,15 @@ static int __open_metadata(struct dm_pool_metadata *pmd)
|
||||
goto bad_cleanup_data_sm;
|
||||
}
|
||||
|
||||
/*
|
||||
* For pool metadata opening process, root setting is redundant
|
||||
* because it will be set again in __begin_transaction(). But dm
|
||||
* pool aborting process really needs to get last transaction's
|
||||
* root to avoid accessing broken btree.
|
||||
*/
|
||||
pmd->root = le64_to_cpu(disk_super->data_mapping_root);
|
||||
pmd->details_root = le64_to_cpu(disk_super->device_details_root);
|
||||
|
||||
__setup_btree_details(pmd);
|
||||
dm_bm_unlock(sblock);
|
||||
|
||||
|
||||
@@ -2935,6 +2935,8 @@ static void __pool_destroy(struct pool *pool)
|
||||
dm_bio_prison_destroy(pool->prison);
|
||||
dm_kcopyd_client_destroy(pool->copier);
|
||||
|
||||
cancel_delayed_work_sync(&pool->waker);
|
||||
cancel_delayed_work_sync(&pool->no_space_timeout);
|
||||
if (pool->wq)
|
||||
destroy_workqueue(pool->wq);
|
||||
|
||||
|
||||
@@ -360,13 +360,14 @@ static void md_end_flush(struct bio *bio)
|
||||
struct md_rdev *rdev = bio->bi_private;
|
||||
struct mddev *mddev = rdev->mddev;
|
||||
|
||||
bio_put(bio);
|
||||
|
||||
rdev_dec_pending(rdev, mddev);
|
||||
|
||||
if (atomic_dec_and_test(&mddev->flush_pending)) {
|
||||
/* The pre-request flush has finished */
|
||||
queue_work(md_wq, &mddev->flush_work);
|
||||
}
|
||||
bio_put(bio);
|
||||
}
|
||||
|
||||
static void md_submit_flush_data(struct work_struct *ws);
|
||||
@@ -725,10 +726,12 @@ static void super_written(struct bio *bio)
|
||||
md_error(mddev, rdev);
|
||||
}
|
||||
|
||||
bio_put(bio);
|
||||
|
||||
rdev_dec_pending(rdev, mddev);
|
||||
|
||||
if (atomic_dec_and_test(&mddev->pending_writes))
|
||||
wake_up(&mddev->sb_wait);
|
||||
rdev_dec_pending(rdev, mddev);
|
||||
bio_put(bio);
|
||||
}
|
||||
|
||||
void md_super_write(struct mddev *mddev, struct md_rdev *rdev,
|
||||
|
||||
@@ -2964,6 +2964,7 @@ static int raid1_run(struct mddev *mddev)
|
||||
* RAID1 needs at least one disk in active
|
||||
*/
|
||||
if (conf->raid_disks - mddev->degraded < 1) {
|
||||
md_unregister_thread(&conf->thread);
|
||||
ret = -EINVAL;
|
||||
goto abort;
|
||||
}
|
||||
|
||||
@@ -317,6 +317,7 @@ static int dvb_create_media_entity(struct dvb_device *dvbdev,
|
||||
GFP_KERNEL);
|
||||
if (!dvbdev->pads) {
|
||||
kfree(dvbdev->entity);
|
||||
dvbdev->entity = NULL;
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -648,6 +648,7 @@ static int bcm3510_download_firmware(struct dvb_frontend* fe)
|
||||
deb_info("firmware chunk, addr: 0x%04x, len: 0x%04x, total length: 0x%04zx\n",addr,len,fw->size);
|
||||
if ((ret = bcm3510_write_ram(st,addr,&b[i+4],len)) < 0) {
|
||||
err("firmware download failed: %d\n",ret);
|
||||
release_firmware(fw);
|
||||
return ret;
|
||||
}
|
||||
i += 4 + len;
|
||||
|
||||
@@ -452,9 +452,8 @@ static int stv0288_set_frontend(struct dvb_frontend *fe)
|
||||
struct stv0288_state *state = fe->demodulator_priv;
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
|
||||
char tm;
|
||||
unsigned char tda[3];
|
||||
u8 reg, time_out = 0;
|
||||
u8 tda[3], reg, time_out = 0;
|
||||
s8 tm;
|
||||
|
||||
dprintk("%s : FE_SET_FRONTEND\n", __func__);
|
||||
|
||||
|
||||
@@ -320,18 +320,18 @@ static int ad5820_probe(struct i2c_client *client,
|
||||
|
||||
ret = media_entity_pads_init(&coil->subdev.entity, 0, NULL);
|
||||
if (ret < 0)
|
||||
goto cleanup2;
|
||||
goto clean_mutex;
|
||||
|
||||
ret = v4l2_async_register_subdev(&coil->subdev);
|
||||
if (ret < 0)
|
||||
goto cleanup;
|
||||
goto clean_entity;
|
||||
|
||||
return ret;
|
||||
|
||||
cleanup2:
|
||||
mutex_destroy(&coil->power_lock);
|
||||
cleanup:
|
||||
clean_entity:
|
||||
media_entity_cleanup(&coil->subdev.entity);
|
||||
clean_mutex:
|
||||
mutex_destroy(&coil->power_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -1250,7 +1250,7 @@ static int saa7164_initdev(struct pci_dev *pci_dev,
|
||||
|
||||
if (saa7164_dev_setup(dev) < 0) {
|
||||
err = -EINVAL;
|
||||
goto fail_free;
|
||||
goto fail_dev;
|
||||
}
|
||||
|
||||
/* print pci info */
|
||||
@@ -1422,6 +1422,8 @@ fail_fw:
|
||||
|
||||
fail_irq:
|
||||
saa7164_dev_unregister(dev);
|
||||
fail_dev:
|
||||
pci_disable_device(pci_dev);
|
||||
fail_free:
|
||||
v4l2_device_unregister(&dev->v4l2_dev);
|
||||
kfree(dev);
|
||||
|
||||
@@ -428,6 +428,7 @@ static int solo_sysfs_init(struct solo_dev *solo_dev)
|
||||
solo_dev->nr_chans);
|
||||
|
||||
if (device_register(dev)) {
|
||||
put_device(dev);
|
||||
dev->parent = NULL;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@@ -595,7 +595,7 @@ static void coda_setup_iram(struct coda_ctx *ctx)
|
||||
/* Only H.264BP and H.263P3 are considered */
|
||||
iram_info->buf_dbk_y_use = coda_iram_alloc(iram_info, w64);
|
||||
iram_info->buf_dbk_c_use = coda_iram_alloc(iram_info, w64);
|
||||
if (!iram_info->buf_dbk_c_use)
|
||||
if (!iram_info->buf_dbk_y_use || !iram_info->buf_dbk_c_use)
|
||||
goto out;
|
||||
iram_info->axi_sram_use |= dbk_bits;
|
||||
|
||||
@@ -619,7 +619,7 @@ static void coda_setup_iram(struct coda_ctx *ctx)
|
||||
|
||||
iram_info->buf_dbk_y_use = coda_iram_alloc(iram_info, w128);
|
||||
iram_info->buf_dbk_c_use = coda_iram_alloc(iram_info, w128);
|
||||
if (!iram_info->buf_dbk_c_use)
|
||||
if (!iram_info->buf_dbk_y_use || !iram_info->buf_dbk_c_use)
|
||||
goto out;
|
||||
iram_info->axi_sram_use |= dbk_bits;
|
||||
|
||||
@@ -821,10 +821,16 @@ static int coda_start_encoding(struct coda_ctx *ctx)
|
||||
}
|
||||
|
||||
if (dst_fourcc == V4L2_PIX_FMT_JPEG) {
|
||||
if (!ctx->params.jpeg_qmat_tab[0])
|
||||
if (!ctx->params.jpeg_qmat_tab[0]) {
|
||||
ctx->params.jpeg_qmat_tab[0] = kmalloc(64, GFP_KERNEL);
|
||||
if (!ctx->params.jpeg_qmat_tab[1])
|
||||
if (!ctx->params.jpeg_qmat_tab[0])
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (!ctx->params.jpeg_qmat_tab[1]) {
|
||||
ctx->params.jpeg_qmat_tab[1] = kmalloc(64, GFP_KERNEL);
|
||||
if (!ctx->params.jpeg_qmat_tab[1])
|
||||
return -ENOMEM;
|
||||
}
|
||||
coda_set_jpeg_compression_quality(ctx, ctx->params.jpeg_quality);
|
||||
}
|
||||
|
||||
|
||||
@@ -1245,7 +1245,7 @@ int __init fimc_register_driver(void)
|
||||
return platform_driver_register(&fimc_driver);
|
||||
}
|
||||
|
||||
void __exit fimc_unregister_driver(void)
|
||||
void fimc_unregister_driver(void)
|
||||
{
|
||||
platform_driver_unregister(&fimc_driver);
|
||||
}
|
||||
|
||||
@@ -1559,7 +1559,11 @@ static int __init fimc_md_init(void)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return platform_driver_register(&fimc_md_driver);
|
||||
ret = platform_driver_register(&fimc_md_driver);
|
||||
if (ret)
|
||||
fimc_unregister_driver();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit fimc_md_exit(void)
|
||||
|
||||
@@ -953,6 +953,7 @@ static int configure_channels(struct c8sectpfei *fei)
|
||||
if (ret) {
|
||||
dev_err(fei->dev,
|
||||
"configure_memdma_and_inputblock failed\n");
|
||||
of_node_put(child);
|
||||
goto err_unmap;
|
||||
}
|
||||
index++;
|
||||
|
||||
@@ -915,6 +915,7 @@ int vivid_vid_cap_s_selection(struct file *file, void *fh, struct v4l2_selection
|
||||
if (dev->has_compose_cap) {
|
||||
v4l2_rect_set_min_size(compose, &min_rect);
|
||||
v4l2_rect_set_max_size(compose, &max_rect);
|
||||
v4l2_rect_map_inside(compose, &fmt);
|
||||
}
|
||||
dev->fmt_cap_rect = fmt;
|
||||
tpg_s_buf_height(&dev->tpg, fmt.height);
|
||||
|
||||
@@ -741,8 +741,10 @@ static int si470x_usb_driver_probe(struct usb_interface *intf,
|
||||
|
||||
/* start radio */
|
||||
retval = si470x_start_usb(radio);
|
||||
if (retval < 0)
|
||||
if (retval < 0 && !radio->int_in_running)
|
||||
goto err_buf;
|
||||
else if (retval < 0) /* in case of radio->int_in_running == 1 */
|
||||
goto err_all;
|
||||
|
||||
/* set initial frequency */
|
||||
si470x_set_freq(radio, 87.5 * FREQ_MUL); /* available in all regions */
|
||||
|
||||
@@ -622,15 +622,14 @@ static int send_packet(struct imon_context *ictx)
|
||||
pr_err_ratelimited("error submitting urb(%d)\n", retval);
|
||||
} else {
|
||||
/* Wait for transmission to complete (or abort) */
|
||||
mutex_unlock(&ictx->lock);
|
||||
retval = wait_for_completion_interruptible(
|
||||
&ictx->tx.finished);
|
||||
if (retval) {
|
||||
usb_kill_urb(ictx->tx_urb);
|
||||
pr_err_ratelimited("task interrupted\n");
|
||||
}
|
||||
mutex_lock(&ictx->lock);
|
||||
|
||||
ictx->tx.busy = false;
|
||||
retval = ictx->tx.status;
|
||||
if (retval)
|
||||
pr_err_ratelimited("packet tx failed (%d)\n", retval);
|
||||
@@ -939,7 +938,8 @@ static ssize_t vfd_write(struct file *file, const char __user *buf,
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
mutex_lock(&ictx->lock);
|
||||
if (mutex_lock_interruptible(&ictx->lock))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
if (!ictx->dev_present_intf0) {
|
||||
pr_err_ratelimited("no iMON device present\n");
|
||||
|
||||
@@ -978,6 +978,10 @@ static int az6027_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], int n
|
||||
if (msg[i].addr == 0x99) {
|
||||
req = 0xBE;
|
||||
index = 0;
|
||||
if (msg[i].len < 1) {
|
||||
i = -EOPNOTSUPP;
|
||||
break;
|
||||
}
|
||||
value = msg[i].buf[0] & 0x00ff;
|
||||
length = 1;
|
||||
az6027_usb_out_op(d, req, value, index, data, length);
|
||||
|
||||
@@ -84,7 +84,7 @@ static int dvb_usb_adapter_init(struct dvb_usb_device *d, short *adapter_nrs)
|
||||
|
||||
ret = dvb_usb_adapter_stream_init(adap);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto stream_init_err;
|
||||
|
||||
ret = dvb_usb_adapter_dvb_init(adap, adapter_nrs);
|
||||
if (ret)
|
||||
@@ -117,6 +117,8 @@ frontend_init_err:
|
||||
dvb_usb_adapter_dvb_exit(adap);
|
||||
dvb_init_err:
|
||||
dvb_usb_adapter_stream_exit(adap);
|
||||
stream_init_err:
|
||||
kfree(adap->priv);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -969,10 +969,10 @@ int cxl_guest_init_afu(struct cxl *adapter, int slice, struct device_node *afu_n
|
||||
* if it returns an error!
|
||||
*/
|
||||
if ((rc = cxl_register_afu(afu)))
|
||||
goto err_put1;
|
||||
goto err_put_dev;
|
||||
|
||||
if ((rc = cxl_sysfs_afu_add(afu)))
|
||||
goto err_put1;
|
||||
goto err_del_dev;
|
||||
|
||||
/*
|
||||
* pHyp doesn't expose the programming models supported by the
|
||||
@@ -988,7 +988,7 @@ int cxl_guest_init_afu(struct cxl *adapter, int slice, struct device_node *afu_n
|
||||
afu->modes_supported = CXL_MODE_DIRECTED;
|
||||
|
||||
if ((rc = cxl_afu_select_best_mode(afu)))
|
||||
goto err_put2;
|
||||
goto err_remove_sysfs;
|
||||
|
||||
adapter->afu[afu->slice] = afu;
|
||||
|
||||
@@ -1008,10 +1008,12 @@ int cxl_guest_init_afu(struct cxl *adapter, int slice, struct device_node *afu_n
|
||||
|
||||
return 0;
|
||||
|
||||
err_put2:
|
||||
err_remove_sysfs:
|
||||
cxl_sysfs_afu_remove(afu);
|
||||
err_put1:
|
||||
device_unregister(&afu->dev);
|
||||
err_del_dev:
|
||||
device_del(&afu->dev);
|
||||
err_put_dev:
|
||||
put_device(&afu->dev);
|
||||
free = false;
|
||||
guest_release_serr_irq(afu);
|
||||
err2:
|
||||
@@ -1145,18 +1147,20 @@ struct cxl *cxl_guest_init_adapter(struct device_node *np, struct platform_devic
|
||||
* even if it returns an error!
|
||||
*/
|
||||
if ((rc = cxl_register_adapter(adapter)))
|
||||
goto err_put1;
|
||||
goto err_put_dev;
|
||||
|
||||
if ((rc = cxl_sysfs_adapter_add(adapter)))
|
||||
goto err_put1;
|
||||
goto err_del_dev;
|
||||
|
||||
/* release the context lock as the adapter is configured */
|
||||
cxl_adapter_context_unlock(adapter);
|
||||
|
||||
return adapter;
|
||||
|
||||
err_put1:
|
||||
device_unregister(&adapter->dev);
|
||||
err_del_dev:
|
||||
device_del(&adapter->dev);
|
||||
err_put_dev:
|
||||
put_device(&adapter->dev);
|
||||
free = false;
|
||||
cxl_guest_remove_chardev(adapter);
|
||||
err1:
|
||||
|
||||
@@ -1187,10 +1187,10 @@ static int pci_init_afu(struct cxl *adapter, int slice, struct pci_dev *dev)
|
||||
* if it returns an error!
|
||||
*/
|
||||
if ((rc = cxl_register_afu(afu)))
|
||||
goto err_put1;
|
||||
goto err_put_dev;
|
||||
|
||||
if ((rc = cxl_sysfs_afu_add(afu)))
|
||||
goto err_put1;
|
||||
goto err_del_dev;
|
||||
|
||||
adapter->afu[afu->slice] = afu;
|
||||
|
||||
@@ -1199,10 +1199,12 @@ static int pci_init_afu(struct cxl *adapter, int slice, struct pci_dev *dev)
|
||||
|
||||
return 0;
|
||||
|
||||
err_put1:
|
||||
err_del_dev:
|
||||
device_del(&afu->dev);
|
||||
err_put_dev:
|
||||
pci_deconfigure_afu(afu);
|
||||
cxl_debugfs_afu_remove(afu);
|
||||
device_unregister(&afu->dev);
|
||||
put_device(&afu->dev);
|
||||
return rc;
|
||||
|
||||
err_free_native:
|
||||
@@ -1589,23 +1591,25 @@ static struct cxl *cxl_pci_init_adapter(struct pci_dev *dev)
|
||||
* even if it returns an error!
|
||||
*/
|
||||
if ((rc = cxl_register_adapter(adapter)))
|
||||
goto err_put1;
|
||||
goto err_put_dev;
|
||||
|
||||
if ((rc = cxl_sysfs_adapter_add(adapter)))
|
||||
goto err_put1;
|
||||
goto err_del_dev;
|
||||
|
||||
/* Release the context lock as adapter is configured */
|
||||
cxl_adapter_context_unlock(adapter);
|
||||
|
||||
return adapter;
|
||||
|
||||
err_put1:
|
||||
err_del_dev:
|
||||
device_del(&adapter->dev);
|
||||
err_put_dev:
|
||||
/* This should mirror cxl_remove_adapter, except without the
|
||||
* sysfs parts
|
||||
*/
|
||||
cxl_debugfs_adapter_remove(adapter);
|
||||
cxl_deconfigure_adapter(adapter);
|
||||
device_unregister(&adapter->dev);
|
||||
put_device(&adapter->dev);
|
||||
return ERR_PTR(rc);
|
||||
|
||||
err_release:
|
||||
|
||||
@@ -656,6 +656,7 @@ int gru_handle_user_call_os(unsigned long cb)
|
||||
if ((cb & (GRU_HANDLE_STRIDE - 1)) || ucbnum >= GRU_NUM_CB)
|
||||
return -EINVAL;
|
||||
|
||||
again:
|
||||
gts = gru_find_lock_gts(cb);
|
||||
if (!gts)
|
||||
return -EINVAL;
|
||||
@@ -664,7 +665,11 @@ int gru_handle_user_call_os(unsigned long cb)
|
||||
if (ucbnum >= gts->ts_cbr_au_count * GRU_CBR_AU_SIZE)
|
||||
goto exit;
|
||||
|
||||
gru_check_context_placement(gts);
|
||||
if (gru_check_context_placement(gts)) {
|
||||
gru_unlock_gts(gts);
|
||||
gru_unload_context(gts, 1);
|
||||
goto again;
|
||||
}
|
||||
|
||||
/*
|
||||
* CCH may contain stale data if ts_force_cch_reload is set.
|
||||
@@ -882,7 +887,11 @@ int gru_set_context_option(unsigned long arg)
|
||||
} else {
|
||||
gts->ts_user_blade_id = req.val1;
|
||||
gts->ts_user_chiplet_id = req.val0;
|
||||
gru_check_context_placement(gts);
|
||||
if (gru_check_context_placement(gts)) {
|
||||
gru_unlock_gts(gts);
|
||||
gru_unload_context(gts, 1);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case sco_gseg_owner:
|
||||
|
||||
@@ -729,9 +729,10 @@ static int gru_check_chiplet_assignment(struct gru_state *gru,
|
||||
* chiplet. Misassignment can occur if the process migrates to a different
|
||||
* blade or if the user changes the selected blade/chiplet.
|
||||
*/
|
||||
void gru_check_context_placement(struct gru_thread_state *gts)
|
||||
int gru_check_context_placement(struct gru_thread_state *gts)
|
||||
{
|
||||
struct gru_state *gru;
|
||||
int ret = 0;
|
||||
|
||||
/*
|
||||
* If the current task is the context owner, verify that the
|
||||
@@ -739,15 +740,23 @@ void gru_check_context_placement(struct gru_thread_state *gts)
|
||||
* references. Pthread apps use non-owner references to the CBRs.
|
||||
*/
|
||||
gru = gts->ts_gru;
|
||||
/*
|
||||
* If gru or gts->ts_tgid_owner isn't initialized properly, return
|
||||
* success to indicate that the caller does not need to unload the
|
||||
* gru context.The caller is responsible for their inspection and
|
||||
* reinitialization if needed.
|
||||
*/
|
||||
if (!gru || gts->ts_tgid_owner != current->tgid)
|
||||
return;
|
||||
return ret;
|
||||
|
||||
if (!gru_check_chiplet_assignment(gru, gts)) {
|
||||
STAT(check_context_unload);
|
||||
gru_unload_context(gts, 1);
|
||||
ret = -EINVAL;
|
||||
} else if (gru_retarget_intr(gts)) {
|
||||
STAT(check_context_retarget_intr);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -946,7 +955,12 @@ again:
|
||||
mutex_lock(>s->ts_ctxlock);
|
||||
preempt_disable();
|
||||
|
||||
gru_check_context_placement(gts);
|
||||
if (gru_check_context_placement(gts)) {
|
||||
preempt_enable();
|
||||
mutex_unlock(>s->ts_ctxlock);
|
||||
gru_unload_context(gts, 1);
|
||||
return VM_FAULT_NOPAGE;
|
||||
}
|
||||
|
||||
if (!gts->ts_gru) {
|
||||
STAT(load_user_context);
|
||||
|
||||
@@ -651,7 +651,7 @@ extern int gru_user_flush_tlb(unsigned long arg);
|
||||
extern int gru_user_unload_context(unsigned long arg);
|
||||
extern int gru_get_exception_detail(unsigned long arg);
|
||||
extern int gru_set_context_option(unsigned long address);
|
||||
extern void gru_check_context_placement(struct gru_thread_state *gts);
|
||||
extern int gru_check_context_placement(struct gru_thread_state *gts);
|
||||
extern int gru_cpu_fault_map_id(void);
|
||||
extern struct vm_area_struct *gru_find_vma(unsigned long vaddr);
|
||||
extern void gru_flush_all_tlb(struct gru_state *gru);
|
||||
|
||||
@@ -194,7 +194,7 @@ static void tifm_7xx1_switch_media(struct work_struct *work)
|
||||
spin_unlock_irqrestore(&fm->lock, flags);
|
||||
}
|
||||
if (sock)
|
||||
tifm_free_device(&sock->dev);
|
||||
put_device(&sock->dev);
|
||||
}
|
||||
spin_lock_irqsave(&fm->lock, flags);
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user