Merge tag 'android11-5.4.268_r00' into android11-5.4
This merges up to the 5.4.268 LTS release into the android11-5.4 branch. included in here are the following commits: *8eb6062606
ANDROID: GKI: db845c: Update symbols list and ABI *5400c339e0
Merge "Merge branch 'android11-5.4' into branch 'android11-5.4-lts'" into android11-5.4-lts |\ | *16a567b6c7
Merge branch 'android11-5.4' into branch 'android11-5.4-lts' * |c980fbd6a6
UPSTREAM: drm/msm/dsi: Enable runtime PM * |7c607fec96
UPSTREAM: PM: runtime: Have devm_pm_runtime_enable() handle pm_runtime_dont_use_autosuspend() * |f9f96d9da7
UPSTREAM: PM: runtime: add devm_pm_runtime_enable helper |/ *b70f9975af
FROMGIT: clk: qcom: gcc-sdm845: Add soft dependency on rpmhpd *74299cb130
Merge 5.4.268 into android11-5.4-lts |\ | *f0602893f4
Linux 5.4.268 | *5ff9836ab0
arm64: dts: armada-3720-turris-mox: set irq type for RTC | *300a55a3a6
perf top: Skip side-band event setup if HAVE_LIBBPF_SUPPORT is not set | *ea5587946a
i2c: s3c24xx: fix transferring more than one message in polling mode | *90734f1cde
i2c: s3c24xx: fix read transfers in polling mode | *05b6d0234a
mlxsw: spectrum_acl_erp: Fix error flow of pool allocation failure | *d5661f46c1
kdb: Fix a potential buffer overflow in kdb_local() | *cf6260a34d
kdb: Censor attempts to set PROMPT without ENABLE_MEM_READ | *36b6db699c
ipvs: avoid stat macros calls from preemptible context | *4c8a827d68
netfilter: nf_tables: skip dead set elements in netlink dump | *db9fda526c
net: dsa: vsc73xx: Add null pointer check to vsc73xx_gpio_probe | *8efe3e8a6c
net: ravb: Fix dma_addr_t truncation in error case | *f7a153e3ac
net: phy: micrel: populate .soft_reset for KSZ9131 | *02467ab8b4
net: qualcomm: rmnet: fix global oob in rmnet_policy | *5b58cfcd4c
s390/pci: fix max size calculation in zpci_memcpy_toio() | *14a7e3a0d0
PCI: keystone: Fix race condition when initializing PHYs | *40d171ef23
nvmet-tcp: Fix the H2C expected PDU len calculation | *258dccd67b
serial: imx: Correct clock error message in function probe() | *1d8e62b556
apparmor: avoid crash when parsed profile name is empty | *4cd5db4fc4
perf env: Avoid recursively taking env->bpf_progs.lock | *f19a1cb1f9
perf bpf: Decouple creating the evlist from adding the SB event | *739b800279
perf top: Move sb_evlist to 'struct perf_top' | *2d59b6ed99
perf record: Move sb_evlist to 'struct record' | *14a9769a76
perf env: Add perf_env__numa_node() | *9638beb4e1
nvmet-tcp: fix a crash in nvmet_req_complete() | *ee5e7632e9
nvmet-tcp: Fix a kernel panic when host sends an invalid H2C PDU length | *887ab0a444
perf genelf: Set ELF program header addresses properly | *ed903eeb4e
software node: Let args be NULL in software_node_get_reference_args | *dbb71ba531
acpi: property: Let args be NULL in __acpi_node_get_property_reference | *b502fb43f7
serial: 8250: omap: Don't skip resource freeing if pm_runtime_resume_and_get() failed | *d8003fdcc6
MIPS: Alchemy: Fix an out-of-bound access in db1550_dev_setup() | *93a7b8d433
MIPS: Alchemy: Fix an out-of-bound access in db1200_dev_setup() | *fa873e9030
mips: Fix incorrect max_low_pfn adjustment | *b419fe1180
HID: wacom: Correct behavior when processing some confidence == false touches | *f7a92bec8e
x86/kvm: Do not try to disable kvmclock if it was not enabled | *1d6d95aaa6
wifi: mwifiex: configure BSSID consistently when starting AP | *249b78dbb1
wifi: rtlwifi: Convert LNKCTL change to PCIe cap RMW accessors | *c22b4f159b
wifi: rtlwifi: Remove bogus and dangerous ASPM disable/enable code | *b33a303588
rootfs: Fix support for rootfstype= when root= is given | *02bd78673b
fbdev: flush deferred work in fb_deferred_io_fsync() | *7cfc97d1ec
ALSA: oxygen: Fix right channel of capture volume mixer | *85f6a6590d
usb: mon: Fix atomicity violation in mon_bin_vma_fault | *14e60d584a
usb: typec: class: fix typec_altmode_put_partner to put plugs | *94f2aa8145
Revert "usb: typec: class: fix typec_altmode_put_partner to put plugs" | *a05ebd5779
usb: chipidea: wait controller resume finished for wakeup irq | *d9c8275c59
Revert "usb: dwc3: don't reset device side if dwc3 was configured as host-only" | *548a00780d
Revert "usb: dwc3: Soft reset phy on probe for host" | *c145217af8
usb: dwc: ep0: Update request status in dwc3_ep0_stall_restart | *5d5d982701
usb: phy: mxs: remove CONFIG_USB_OTG condition for mxs_phy_is_otg_host() | *29032c8e3e
tick-sched: Fix idle and iowait sleeptime accounting vs CPU hotplug | *5c3d4930c7
binder: fix unused alloc->free_async_space | *252a2a5569
binder: fix race between mmput() and do_exit() | *4404c2b832
xen-netback: don't produce zero-size SKB frags | *ee4e9c5fff
Revert "ASoC: atmel: Remove system clock tree configuration for at91sam9g20ek" | *01fe1b7bb0
Input: atkbd - use ab83 as id when skipping the getid command | *a53e15e592
binder: fix use-after-free in shinker's callback | *fc1119a3c6
binder: fix async space check for 0-sized buffers | *1b7c039260
of: unittest: Fix of_count_phandle_with_args() expected value message | *a0a061151a
of: Fix double free in of_parse_phandle_with_args_map | *a9de8a4f52
mmc: sdhci_omap: Fix TI SoC dependencies | *b8bbe33544
clk: si5341: fix an error code problem in si5341_output_clk_set_rate | *4810cce029
watchdog: bcm2835_wdt: Fix WDIOC_SETTIMEOUT handling | *11a64041d9
watchdog/hpwdt: Only claim UNKNOWN NMI if from iLO | *0d5685c13d
watchdog: set cdev owner before adding | *777aa44f63
drivers: clk: zynqmp: calculate closest mux rate | *5a572eb32f
gpu/drm/radeon: fix two memleaks in radeon_vm_init | *8b55b06e73
drivers/amd/pm: fix a use-after-free in kv_parse_power_table | *06d95c99d5
drm/amd/pm: fix a double-free in si_dpm_init | *8ee1fb4c51
drm/amdgpu/debugfs: fix error code when smc register accessors are NULL | *68ec0a0211
media: dvbdev: drop refcount on error path in dvb_device_open() | *06a9263ac9
media: cx231xx: fix a memleak in cx231xx_init_isoc | *6a421928f7
drm/bridge: tc358767: Fix return value on error case | *d46fe2e93e
drm/radeon/trinity_dpm: fix a memleak in trinity_parse_power_table | *c0769f091f
drm/radeon/dpm: fix a memleak in sumo_parse_power_table | *5d12c5d75f
drm/radeon: check the alloc_workqueue return value in radeon_crtc_init() | *09d59f73f4
drm/drv: propagate errors from drm_modeset_register_all() | *31b169a8be
drm/msm/dsi: Use pm_runtime_resume_and_get to prevent refcnt leaks | *9170aa07cb
drm/msm/mdp4: flush vblank event on disable | *136f919816
ASoC: cs35l34: Fix GPIO name and drop legacy include | *86af5d7acf
ASoC: cs35l33: Fix GPIO name and drop legacy include | *94aa82723a
drm/radeon: check return value of radeon_ring_lock() | *bf48d89123
drm/radeon/r100: Fix integer overflow issues in r100_cs_track_check() | *8e5bcb781f
drm/radeon/r600_cs: Fix possible int overflows in r600_cs_check_reg() | *5624a3c1b1
f2fs: fix to avoid dirent corruption | *b083ec00f3
drm/bridge: Fix typo in post_disable() description | *47aa8fcd5e
media: pvrusb2: fix use after free on context disconnection | *f6a35c21cd
RDMA/usnic: Silence uninitialized symbol smatch warnings | *9bb9775217
ARM: davinci: always select CONFIG_CPU_ARM926T | *3f15ba3dc1
ip6_tunnel: fix NEXTHDR_FRAGMENT handling in ip6_tnl_parse_tlv_enc_lim() | *dcc9cd5ddb
Bluetooth: btmtkuart: fix recv_buf() return value | *efcfcd5f2b
Bluetooth: Fix bogus check for re-auth no supported with non-ssp | *598c902649
netfilter: nf_tables: mark newset as dead on transaction abort | *8dbaaf71ff
wifi: rtlwifi: rtl8192se: using calculate_bit_shift() | *8fa54f7532
wifi: rtlwifi: rtl8192ee: using calculate_bit_shift() | *4838d16666
wifi: rtlwifi: rtl8192de: using calculate_bit_shift() | *e15fcb1945
rtlwifi: rtl8192de: make arrays static const, makes object smaller | *ae1df4cc0a
wifi: rtlwifi: rtl8192ce: using calculate_bit_shift() | *a3a25b5d01
wifi: rtlwifi: rtl8192cu: using calculate_bit_shift() | *6f84a338ed
wifi: rtlwifi: rtl8192c: using calculate_bit_shift() | *ee0a81cf7e
wifi: rtlwifi: rtl8188ee: phy: using calculate_bit_shift() | *7cbcf5fe01
wifi: rtlwifi: add calculate_bit_shift() | *4985e507e0
dma-mapping: clear dev->dma_mem to NULL after freeing it | *48614d528b
virtio/vsock: fix logic which reduces credit update messages | *332cd73a92
selftests/net: fix grep checking for fib_nexthop_multiprefix | *12b91f3636
scsi: hisi_sas: Replace with standard error code return value | *14470da02d
arm64: dts: qcom: sdm845-db845c: correct LED panic indicator | *c23c4984ce
scsi: fnic: Return error if vmalloc() failed | *16d21bfcb3
wifi: rtlwifi: rtl8821ae: phy: fix an undefined bitwise shift behavior | *4a20fa7322
rtlwifi: Use ffs in <foo>_phy_calculate_bit_shift | *0226926ba3
firmware: ti_sci: Fix an off-by-one in ti_sci_debugfs_create() | *ef75f3c56b
net/ncsi: Fix netlink major/minor version numbers | *7276fac0a6
ncsi: internal.h: Fix a spello | *f6154d4983
ARM: dts: qcom: apq8064: correct XOADC register address | *bd1bf5e805
wifi: libertas: stop selecting wext | *dc843ed97d
bpf, lpm: Fix check prefixlen before walking trie | *93c71706a1
wifi: rtw88: fix RX filter in FIF_ALLMULTI flag | *aebe7e47c2
NFSv4.1/pnfs: Ensure we handle the error NFS4ERR_RETURNCONFLICT | *db55dbbba5
blocklayoutdriver: Fix reference leak of pnfs_device_node | *e0e3f4a187
crypto: scomp - fix req->dst buffer overflow | *77d2b18336
crypto: sahara - do not resize req->src when doing hash operations | *53ba86f765
crypto: sahara - fix processing hash requests with req->nbytes < sg->length | *ba1ef4276e
crypto: sahara - improve error handling in sahara_sha_process() | *0274697075
crypto: sahara - fix wait_for_completion_timeout() error handling | *b588ed190b
crypto: sahara - fix ahash reqsize | *aea92cca43
crypto: virtio - Wait for tasklet to complete on device remove | *efc8ef87ab
gfs2: Fix kernel NULL pointer dereference in gfs2_rgrp_dump | *d1fe1aede6
pstore: ram_core: fix possible overflow in persistent_ram_init_ecc() | *6e907574ef
crypto: sahara - fix error handling in sahara_hw_descriptor_create() | *e82d07d5c7
crypto: sahara - fix processing requests with cryptlen < sg->length | *da43c26203
crypto: sahara - fix ahash selftest failure | *beb815a000
crypto: sahara - remove FLAGS_NEW_KEY logic | *4c10928e31
crypto: af_alg - Disallow multiple in-flight AIO requests | *ca3484d5ca
crypto: ccp - fix memleak in ccp_init_dm_workarea | *9fffae6cc4
virtio_crypto: Introduce VIRTIO_CRYPTO_NOSPC | *01081d76cc
crypto: virtio - don't use 'default m' | *830a4f073f
crypto: virtio - Handle dataq logic with tasklet | *86a7c9ba83
selinux: Fix error priority for bind with AF_UNSPEC on PF_INET6 socket | *1bf4fe14e9
mtd: Fix gluebi NULL pointer dereference caused by ftl notifier | *6b84cb9e38
spi: sh-msiof: Enforce fixed DTDL for R-Car H3 | *36e19f8463
calipso: fix memory leak in netlbl_calipso_add_pass() | *0396c1e211
netlabel: remove unused parameter in netlbl_netlink_auditinfo() | *7b99eafea0
net: netlabel: Fix kerneldoc warnings | *6c38e791bd
ACPI: LPIT: Avoid u32 multiplication overflow | *1e3a2b9b40
ACPI: video: check for error while searching for backlight device parent | *f5ea2cf3bb
mtd: rawnand: Increment IFC_TIMEOUT_MSECS for nand controller response | *1e80aa25d1
powerpc/imc-pmu: Add a null pointer check in update_events_in_group() | *9da4a56dd3
powerpc/powernv: Add a null pointer check in opal_powercap_init() | *e93d7cf4c1
powerpc/powernv: Add a null pointer check in opal_event_init() | *f84c1446da
powerpc/powernv: Add a null pointer check to scom_debug_init_one() | *b0200560b6
selftests/powerpc: Fix error handling in FPU/VMX preemption tests | *9b5f03500b
powerpc/pseries/memhp: Fix access beyond end of drmem array | *69c0b92f78
powerpc/pseries/memhotplug: Quieten some DLPAR operations | *5401b689ad
powerpc/44x: select I2C for CURRITUCK | *245da9eebb
powerpc: add crtsavres.o to always-y instead of extra-y | *5da3b6e719
EDAC/thunderx: Fix possible out-of-bounds string access | *555a2f09a6
x86/lib: Fix overflow when counting digits | *6ee48d7102
coresight: etm4x: Fix width of CCITMIN field | *b00d5f7152
parport: parport_serial: Add Brainboxes device IDs and geometry | *760a5ab4d8
parport: parport_serial: Add Brainboxes BAR details | *e93da893d5
uio: Fix use-after-free in uio_open | *da488e1aad
binder: fix comment on binder_alloc_new_buf() return value | *a92b2797ca
binder: fix trivial typo of binder_free_buf_locked() | *9774dabad7
binder: use EPOLLERR from eventpoll.h | *5e1eb0dfc9
ACPI: resource: Add another DMI match for the TongFang GMxXGxx | *c5b0517500
drm/crtc: fix uninitialized variable use | *cfc6afe930
ARM: sun9i: smp: fix return code check of of_property_match_string | *ef7152f870
ida: Fix crash in ida_free when the bitmap is empty | *c97996451f
Input: xpad - add Razer Wolverine V2 support | *510a7bc368
ARC: fix spare error | *0fe6431622
s390/scm: fix virtual vs physical address confusion | *8fb5795bcf
Input: i8042 - add nomux quirk for Acer P459-G2-M | *2c70bf9978
Input: atkbd - skip ATKBD_CMD_GETID in translated mode | *3d9a9c0881
reset: hisilicon: hi6220: fix Wvoid-pointer-to-enum-cast warning | *4f7512e779
ring-buffer: Do not record in NMI if the arch does not support cmpxchg in NMI | *e405c22ee5
tracing: Add size check when printing trace_marker output | *f787481af4
tracing: Have large events show up as '[LINE TOO BIG]' instead of nothing | *d4408ffeb8
neighbour: Don't let neigh_forced_gc() disable preemption for long | *9cc9683aec
drm/crtc: Fix uninit-value bug in drm_mode_setcrtc | *2f601e8696
jbd2: correct the printing of write_flags in jbd2_write_superblock() | *1c187cb210
clk: rockchip: rk3128: Fix HCLK_OTG gate register | *3f50a73fd9
drm/exynos: fix a wrong error checking | *8bc21ac17d
drm/exynos: fix a potential error pointer dereference | *6eb9759328
nvme: introduce helper function to get ctrl state | *971c0b10c9
ASoC: da7219: Support low DC impedance headset | *ec76b9e057
net/tg3: fix race condition in tg3_reset_task() | *ef9fefca3f
nouveau/tu102: flush all pdbs on vmm flush | *b67005b284
ASoC: rt5650: add mutex to avoid the jack detection failure | *4fece6617b
ASoC: cs43130: Fix incorrect frame delay configuration | *1bf33a67a9
ASoC: cs43130: Fix the position of const qualifier | *61c1e46fb8
ASoC: Intel: Skylake: mem leak in skl register function | *81610106fd
ASoC: nau8822: Fix incorrect type in assignment and cast to restricted __be16 | *ad5a06e163
ASoC: Intel: Skylake: Fix mem leak in few functions | *57a95d06da
ALSA: hda - Fix speaker and headset mic pin config for CHUWI CoreBook XPro | *ebc3c8e090
pinctrl: lochnagar: Don't build on MIPS | *12cf91e23b
f2fs: explicitly null-terminate the xattr list * |5826ec2af1
Revert "ipv6: make ip6_rt_gc_expire an atomic_t" * |fa82780056
Revert "ipv6: remove max_size check inline with ipv4" * |bc9b1af36e
Merge "Merge 5.4.267 into android11-5.4-lts" into android11-5.4-lts |\ \ | * |ac7d08f396
Merge 5.4.267 into android11-5.4-lts | |\| | | *9153fc9664
Linux 5.4.267 | | *69ef165176
ASoC: meson: codec-glue: fix pcm format cast warning | | *584756c3d7
ipv6: remove max_size check inline with ipv4 | | *66b3025202
ipv6: make ip6_rt_gc_expire an atomic_t | | *ae424c848d
net/dst: use a smaller percpu_counter batch for dst entries accounting | | *7b3a9c2bf3
PCI: Disable ATS for specific Intel IPU E2000 devices | | *c6141c49bc
PCI: Extract ATS disabling to a helper function | | *8711fa0c06
netfilter: nf_tables: Reject tables of unsupported family | | *c67bf30baf
net: tls, update curr on splice as well | | *c2d9b43855
ath10k: Get rid of "per_ce_irq" hw param | | *d15f869cb3
ath10k: Keep track of which interrupts fired, don't poll them | | *696b992edc
ath10k: Add interrupt summary based CE processing | | *366df9ecbc
ath10k: Wait until copy complete is actually done before completing | | *c4541e3980
mmc: sdhci-sprd: Fix eMMC init failure after hw reset | | *a9c9ffcd21
mmc: core: Cancel delayed work before releasing host | | *bfc3720ca8
mmc: rpmb: fixes pause retune on all RPMB partitions. | | *77359c4973
mm: fix unmap_mapping_range high bits shift bug | | *5af5e946c4
i2c: core: Fix atomic xfer check for non-preempt config | | *d8ec24d79d
firewire: ohci: suppress unexpected system reboot in AMD Ryzen machines and ASM108x/VT630x PCIe cards | | *85015a96bc
mm/memory-failure: check the mapcount of the precise page | | *3d8fab93ca
net: Implement missing SO_TIMESTAMPING_NEW cmsg support | | *f7084217d9
bnxt_en: Remove mis-applied code from bnxt_cfg_ntp_filters() | | *acfeb9039b
asix: Add check for usbnet_get_endpoints | | *6c00721ad7
net/qla3xxx: fix potential memleak in ql_alloc_buffer_queues | | *a4ea54c528
net/qla3xxx: switch from 'pci_' to 'dma_' API | | *863ca421b4
i40e: Restore VF MSI-X state during PCI reset | | *01c2d73ae2
ASoC: meson: g12a-tohdmitx: Fix event generation for S/PDIF mux | | *bdc00b8c3a
ASoC: meson: g12a-tohdmitx: Validate written enum values | | *fe2d1dda1d
ASoC: meson: g12a: extract codec-to-codec utils | | *93d80aadc0
i40e: fix use-after-free in i40e_aqc_add_filters() | | *b40828a2ab
net: Save and restore msg_namelen in sock_sendmsg | | *68c8fdb9f9
net: bcmgenet: Fix FCS generation for fragmented skbuffs | | *4c0fa624a6
ARM: sun9i: smp: Fix array-index-out-of-bounds read in sunxi_mc_smp_init | | *c1556217ff
net-timestamp: extend SOF_TIMESTAMPING_OPT_ID to HW timestamps | | *2cdb650848
can: raw: add support for SO_MARK | | *96a6d1bb28
can: raw: add support for SO_TXTIME/SCM_TXTIME | | *b1719cbb73
net: sched: em_text: fix possible memory leak in em_text_destroy() | | *ef4fd7518c
i40e: Fix filter input checks to prevent config with invalid values | | *65c6ef02ff
nfc: llcp_core: Hold a ref to llcp_local->dev when holding a ref to llcp_local * | |6ba3eed4fa
ANDROID: db845c: Enable device tree overlay support |/ / * /0d5ac7fe30
Merge 5.4.266 into android11-5.4-lts |/ *4410df7011
Linux 5.4.266 *7d0f1fd80a
block: Don't invalidate pagecache for invalid falloc modes *a0678f5047
ring-buffer: Fix wake ups when buffer_percent is set to 100 *508e2fdd97
smb: client: fix OOB in smbCalcSize() *644b956c94
usb: fotg210-hcd: delete an incorrect bounds test *a56a19e44b
x86/alternatives: Sync core before enabling interrupts *4111986fb9
net: rfkill: gpio: set GPIO direction *5c375a83d1
net: 9p: avoid freeing uninit memory in p9pdu_vreadf *4e7f3899fb
Bluetooth: hci_event: Fix not checking if HCI_OP_INQUIRY has been sent *a83debb523
USB: serial: option: add Quectel RM500Q R13 firmware support *c82ba4cb44
USB: serial: option: add Foxconn T99W265 with new baseline *1f87ba56c4
USB: serial: option: add Quectel EG912Y module support *a59cb26bc1
USB: serial: ftdi_sio: update Actisense PIDs constant names *a70b1933fa
wifi: cfg80211: fix certs build to not depend on file order *e8fb002051
wifi: cfg80211: Add my certificate *8717fd6d0c
iio: adc: ti_am335x_adc: Fix return value check of tiadc_request_dma() *45af72f149
iio: common: ms_sensors: ms_sensors_i2c: fix humidity conversion time table *4257c16c14
scsi: bnx2fc: Fix skb double free in bnx2fc_rcv() *e1b31edfe7
Input: ipaq-micro-keys - add error handling for devm_kmemdup *a85d6aa2b5
iio: imu: inv_mpu6050: fix an error code problem in inv_mpu6050_read_raw *388c90c577
interconnect: Treat xlate() returning NULL node as an error *04c2223344
btrfs: do not allow non subvolume root targets for snapshot *3230a69e66
smb: client: fix NULL deref in asn1_ber_decoder() *0ccb39511a
ALSA: hda/hdmi: add force-connect quirk for NUC5CPYB *6bcf819198
ALSA: hda/hdmi: Add quirk to force pin connectivity on NUC10 *34e6c4c6a9
pinctrl: at91-pio4: use dedicated lock class for IRQ *624659563e
i2c: aspeed: Handle the coalesced stop conditions with the start conditions. *47ae524229
afs: Fix overwriting of result of DNS query *c04b7b28c9
net: check dev->gso_max_size in gso_features_check() *761ee09e9f
net: warn if gso_type isn't set for a GSO SKB *eec7ef60d2
afs: Fix dynamic root lookup DNS check *82d64cbe48
afs: Fix the dynamic root's d_delete to always delete unused dentries *2b4600fb69
net: check vlan filter feature in vlan_vids_add_by_dev() and vlan_vids_del_by_dev() *b10265532d
net/rose: fix races in rose_kill_by_device() *ed4cb8a42c
ethernet: atheros: fix a memleak in atl1e_setup_ring_resources *3f82a6a6d7
net: sched: ife: fix potential use-after-free *f48e3337ab
net/mlx5e: Correct snprintf truncation handling for fw_version buffer used by representors *d07ef3a870
net/mlx5: Fix fw tracer first block check *a46bb28fdb
net/mlx5: improve some comments *333fd10955
Revert "net/mlx5e: fix double free of encap_header" *7bd305f5f2
wifi: mac80211: mesh_plink: fix matches_local logic *76366b399a
s390/vx: fix save/restore of fpu kernel context *f40d484e16
reset: Fix crash when freeing non-existent optional resets *14d915ca5a
ARM: OMAP2+: Fix null pointer dereference and memory leak in omap_soc_device_init *62ef5887dd
ksmbd: fix wrong name of SMB2_CREATE_ALLOCATION_SIZE *35e12efde0
ALSA: hda/realtek: Enable headset on Lenovo M90 Gen5 Updates the .xml file to add the new needed symbol: Leaf changes summary: 1 artifact changed Changed leaf types summary: 0 leaf type changed Removed/Changed/Added functions summary: 0 Removed, 0 Changed, 1 Added function Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable 1 Added function: [A] 'function int devm_pm_runtime_enable(device*)' Change-Id: I1e68409087f3f833dbfcdbfc56546d982d22d10c Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
commit
7570ec5696
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 4
|
||||
SUBLEVEL = 265
|
||||
SUBLEVEL = 268
|
||||
EXTRAVERSION =
|
||||
NAME = Kleptomaniac Octopus
|
||||
|
||||
|
164442
android/abi_gki_aarch64.xml
164442
android/abi_gki_aarch64.xml
File diff suppressed because it is too large
Load Diff
@ -66,7 +66,6 @@
|
||||
device_register
|
||||
device_set_wakeup_capable
|
||||
device_unregister
|
||||
device_wakeup_enable
|
||||
_dev_info
|
||||
__dev_kfree_skb_any
|
||||
devm_add_action
|
||||
@ -236,6 +235,7 @@
|
||||
__memcpy_fromio
|
||||
memremap
|
||||
memset
|
||||
memunmap
|
||||
misc_deregister
|
||||
misc_register
|
||||
mod_timer
|
||||
@ -425,6 +425,7 @@
|
||||
strlen
|
||||
strncmp
|
||||
strncpy
|
||||
strscpy
|
||||
strscpy_pad
|
||||
__sw_hweight32
|
||||
__sw_hweight64
|
||||
@ -595,7 +596,6 @@
|
||||
skb_copy
|
||||
skb_realloc_headroom
|
||||
strlcat
|
||||
strscpy
|
||||
__sw_hweight16
|
||||
__sw_hweight8
|
||||
synchronize_net
|
||||
@ -610,8 +610,8 @@
|
||||
pci_clear_master
|
||||
pci_disable_device
|
||||
pci_disable_msi
|
||||
pcie_capability_clear_and_set_word
|
||||
pcie_capability_read_word
|
||||
pcie_capability_write_word
|
||||
pci_enable_device
|
||||
pci_enable_msi
|
||||
pci_iomap
|
||||
@ -620,6 +620,7 @@
|
||||
pci_set_master
|
||||
|
||||
# required by ath10k_snoc.ko
|
||||
__bitmap_clear
|
||||
devm_regulator_get_optional
|
||||
dmam_alloc_attrs
|
||||
kernel_connect
|
||||
@ -650,6 +651,7 @@
|
||||
# required by dwc3-qcom.ko
|
||||
devm_extcon_register_notifier
|
||||
of_clk_get_parent_count
|
||||
platform_device_del
|
||||
|
||||
# required by dwc3.ko
|
||||
dev_fwnode
|
||||
@ -661,7 +663,6 @@
|
||||
of_usb_get_phy_mode
|
||||
phy_pm_runtime_get_sync
|
||||
phy_pm_runtime_put_sync
|
||||
platform_device_add_data
|
||||
platform_get_irq_byname_optional
|
||||
pm_runtime_barrier
|
||||
system_freezable_wq
|
||||
@ -839,6 +840,7 @@
|
||||
devm_clk_register
|
||||
devm_devfreq_add_device
|
||||
devm_ioremap_nocache
|
||||
devm_pm_runtime_enable
|
||||
devm_regulator_get_exclusive
|
||||
dev_pm_opp_find_freq_ceil
|
||||
dev_pm_opp_find_freq_exact
|
||||
@ -1048,7 +1050,6 @@
|
||||
kvmalloc_node
|
||||
llist_add_batch
|
||||
memparse
|
||||
memunmap
|
||||
mipi_dsi_create_packet
|
||||
mipi_dsi_host_register
|
||||
mipi_dsi_host_unregister
|
||||
@ -1127,6 +1128,7 @@
|
||||
usb_amd_prefetch_quirk
|
||||
|
||||
# required by ohci-platform.ko
|
||||
device_wakeup_enable
|
||||
usb_create_hcd
|
||||
|
||||
# required by phy-qcom-qmp.ko
|
||||
@ -1444,6 +1446,7 @@
|
||||
|
||||
# required by xhci-hcd.ko
|
||||
add_timer
|
||||
iommu_get_domain_for_dev
|
||||
mod_delayed_work_on
|
||||
__num_online_cpus
|
||||
param_ops_ullong
|
||||
@ -1482,3 +1485,7 @@
|
||||
# required by xhci-plat-hcd.ko
|
||||
of_usb_host_tpl_support
|
||||
__usb_create_hcd
|
||||
|
||||
# preserved by --additions-only
|
||||
pcie_capability_write_word
|
||||
platform_device_add_data
|
||||
|
@ -61,7 +61,7 @@ struct rt_sigframe {
|
||||
unsigned int sigret_magic;
|
||||
};
|
||||
|
||||
static int save_arcv2_regs(struct sigcontext *mctx, struct pt_regs *regs)
|
||||
static int save_arcv2_regs(struct sigcontext __user *mctx, struct pt_regs *regs)
|
||||
{
|
||||
int err = 0;
|
||||
#ifndef CONFIG_ISA_ARCOMPACT
|
||||
@ -74,12 +74,12 @@ static int save_arcv2_regs(struct sigcontext *mctx, struct pt_regs *regs)
|
||||
#else
|
||||
v2abi.r58 = v2abi.r59 = 0;
|
||||
#endif
|
||||
err = __copy_to_user(&mctx->v2abi, &v2abi, sizeof(v2abi));
|
||||
err = __copy_to_user(&mctx->v2abi, (void const *)&v2abi, sizeof(v2abi));
|
||||
#endif
|
||||
return err;
|
||||
}
|
||||
|
||||
static int restore_arcv2_regs(struct sigcontext *mctx, struct pt_regs *regs)
|
||||
static int restore_arcv2_regs(struct sigcontext __user *mctx, struct pt_regs *regs)
|
||||
{
|
||||
int err = 0;
|
||||
#ifndef CONFIG_ISA_ARCOMPACT
|
||||
|
@ -759,7 +759,7 @@
|
||||
|
||||
xoadc: xoadc@197 {
|
||||
compatible = "qcom,pm8921-adc";
|
||||
reg = <197>;
|
||||
reg = <0x197>;
|
||||
interrupts-extended = <&pmicintc 78 IRQ_TYPE_EDGE_RISING>;
|
||||
#address-cells = <2>;
|
||||
#size-cells = <0>;
|
||||
|
@ -3,6 +3,7 @@
|
||||
menuconfig ARCH_DAVINCI
|
||||
bool "TI DaVinci"
|
||||
depends on ARCH_MULTI_V5
|
||||
select CPU_ARM926T
|
||||
select DAVINCI_TIMER
|
||||
select ZONE_DMA
|
||||
select PM_GENERIC_DOMAINS if PM
|
||||
|
@ -797,10 +797,15 @@ void __init omap_soc_device_init(void)
|
||||
|
||||
soc_dev_attr->machine = soc_name;
|
||||
soc_dev_attr->family = omap_get_family();
|
||||
if (!soc_dev_attr->family) {
|
||||
kfree(soc_dev_attr);
|
||||
return;
|
||||
}
|
||||
soc_dev_attr->revision = soc_rev;
|
||||
|
||||
soc_dev = soc_device_register(soc_dev_attr);
|
||||
if (IS_ERR(soc_dev)) {
|
||||
kfree(soc_dev_attr->family);
|
||||
kfree(soc_dev_attr);
|
||||
return;
|
||||
}
|
||||
|
@ -804,16 +804,16 @@ static int __init sunxi_mc_smp_init(void)
|
||||
for (i = 0; i < ARRAY_SIZE(sunxi_mc_smp_data); i++) {
|
||||
ret = of_property_match_string(node, "enable-method",
|
||||
sunxi_mc_smp_data[i].enable_method);
|
||||
if (!ret)
|
||||
if (ret >= 0)
|
||||
break;
|
||||
}
|
||||
|
||||
is_a83t = sunxi_mc_smp_data[i].is_a83t;
|
||||
|
||||
of_node_put(node);
|
||||
if (ret)
|
||||
if (ret < 0)
|
||||
return -ENODEV;
|
||||
|
||||
is_a83t = sunxi_mc_smp_data[i].is_a83t;
|
||||
|
||||
if (!sunxi_mc_smp_cpu_table_init())
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -127,7 +127,7 @@
|
||||
compatible = "microchip,mcp7940x";
|
||||
reg = <0x6f>;
|
||||
interrupt-parent = <&gpiosb>;
|
||||
interrupts = <5 0>; /* GPIO2_5 */
|
||||
interrupts = <5 IRQ_TYPE_EDGE_FALLING>; /* GPIO2_5 */
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -53,8 +53,8 @@
|
||||
user4 {
|
||||
label = "green:user4";
|
||||
gpios = <&pm8998_gpio 13 GPIO_ACTIVE_HIGH>;
|
||||
linux,default-trigger = "panic-indicator";
|
||||
default-state = "off";
|
||||
panic-indicator;
|
||||
};
|
||||
|
||||
wlan {
|
||||
|
@ -847,7 +847,7 @@ int __init db1200_dev_setup(void)
|
||||
i2c_register_board_info(0, db1200_i2c_devs,
|
||||
ARRAY_SIZE(db1200_i2c_devs));
|
||||
spi_register_board_info(db1200_spi_devs,
|
||||
ARRAY_SIZE(db1200_i2c_devs));
|
||||
ARRAY_SIZE(db1200_spi_devs));
|
||||
|
||||
/* SWITCHES: S6.8 I2C/SPI selector (OFF=I2C ON=SPI)
|
||||
* S6.7 AC97/I2S selector (OFF=AC97 ON=I2S)
|
||||
|
@ -588,7 +588,7 @@ int __init db1550_dev_setup(void)
|
||||
i2c_register_board_info(0, db1550_i2c_devs,
|
||||
ARRAY_SIZE(db1550_i2c_devs));
|
||||
spi_register_board_info(db1550_spi_devs,
|
||||
ARRAY_SIZE(db1550_i2c_devs));
|
||||
ARRAY_SIZE(db1550_spi_devs));
|
||||
|
||||
c = clk_get(NULL, "psc0_intclk");
|
||||
if (!IS_ERR(c)) {
|
||||
|
@ -362,11 +362,11 @@ static void __init bootmem_init(void)
|
||||
panic("Incorrect memory mapping !!!");
|
||||
|
||||
if (max_pfn > PFN_DOWN(HIGHMEM_START)) {
|
||||
max_low_pfn = PFN_DOWN(HIGHMEM_START);
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
highstart_pfn = PFN_DOWN(HIGHMEM_START);
|
||||
highstart_pfn = max_low_pfn;
|
||||
highend_pfn = max_pfn;
|
||||
#else
|
||||
max_low_pfn = PFN_DOWN(HIGHMEM_START);
|
||||
max_pfn = max_low_pfn;
|
||||
#endif
|
||||
}
|
||||
|
@ -35,7 +35,7 @@ obj-$(CONFIG_FUNCTION_ERROR_INJECTION) += error-inject.o
|
||||
# so it is only needed for modules, and only for older linkers which
|
||||
# do not support --save-restore-funcs
|
||||
ifeq ($(call ld-ifversion, -lt, 225000000, y),y)
|
||||
extra-$(CONFIG_PPC64) += crtsavres.o
|
||||
always-$(CONFIG_PPC64) += crtsavres.o
|
||||
endif
|
||||
|
||||
obj-$(CONFIG_PPC_BOOK3S_64) += copyuser_power7.o copypage_power7.o \
|
||||
|
@ -292,6 +292,8 @@ static int update_events_in_group(struct device_node *node, struct imc_pmu *pmu)
|
||||
attr_group->attrs = attrs;
|
||||
do {
|
||||
ev_val_str = kasprintf(GFP_KERNEL, "event=0x%x", pmu->events[i].value);
|
||||
if (!ev_val_str)
|
||||
continue;
|
||||
dev_str = device_str_attr_create(pmu->events[i].name, ev_val_str);
|
||||
if (!dev_str)
|
||||
continue;
|
||||
@ -299,6 +301,8 @@ static int update_events_in_group(struct device_node *node, struct imc_pmu *pmu)
|
||||
attrs[j++] = dev_str;
|
||||
if (pmu->events[i].scale) {
|
||||
ev_scale_str = kasprintf(GFP_KERNEL, "%s.scale", pmu->events[i].name);
|
||||
if (!ev_scale_str)
|
||||
continue;
|
||||
dev_str = device_str_attr_create(ev_scale_str, pmu->events[i].scale);
|
||||
if (!dev_str)
|
||||
continue;
|
||||
@ -308,6 +312,8 @@ static int update_events_in_group(struct device_node *node, struct imc_pmu *pmu)
|
||||
|
||||
if (pmu->events[i].unit) {
|
||||
ev_unit_str = kasprintf(GFP_KERNEL, "%s.unit", pmu->events[i].name);
|
||||
if (!ev_unit_str)
|
||||
continue;
|
||||
dev_str = device_str_attr_create(ev_unit_str, pmu->events[i].unit);
|
||||
if (!dev_str)
|
||||
continue;
|
||||
|
@ -178,6 +178,7 @@ config ISS4xx
|
||||
config CURRITUCK
|
||||
bool "IBM Currituck (476fpe) Support"
|
||||
depends on PPC_47x
|
||||
select I2C
|
||||
select SWIOTLB
|
||||
select 476FPE
|
||||
select FORCE_PCI
|
||||
|
@ -278,6 +278,8 @@ int __init opal_event_init(void)
|
||||
else
|
||||
name = kasprintf(GFP_KERNEL, "opal");
|
||||
|
||||
if (!name)
|
||||
continue;
|
||||
/* Install interrupt handler */
|
||||
rc = request_irq(r->start, opal_interrupt, r->flags & IRQD_TRIGGER_MASK,
|
||||
name, NULL);
|
||||
|
@ -196,6 +196,12 @@ void __init opal_powercap_init(void)
|
||||
|
||||
j = 0;
|
||||
pcaps[i].pg.name = kasprintf(GFP_KERNEL, "%pOFn", node);
|
||||
if (!pcaps[i].pg.name) {
|
||||
kfree(pcaps[i].pattrs);
|
||||
kfree(pcaps[i].pg.attrs);
|
||||
goto out_pcaps_pattrs;
|
||||
}
|
||||
|
||||
if (has_min) {
|
||||
powercap_add_attr(min, "powercap-min",
|
||||
&pcaps[i].pattrs[j]);
|
||||
|
@ -165,6 +165,11 @@ static int scom_debug_init_one(struct dentry *root, struct device_node *dn,
|
||||
ent->chip = chip;
|
||||
snprintf(ent->name, 16, "%08x", chip);
|
||||
ent->path.data = (void *)kasprintf(GFP_KERNEL, "%pOF", dn);
|
||||
if (!ent->path.data) {
|
||||
kfree(ent);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ent->path.size = strlen((char *)ent->path.data);
|
||||
|
||||
dir = debugfs_create_dir(ent->name, root);
|
||||
|
@ -496,7 +496,7 @@ static int dlpar_memory_remove_by_index(u32 drc_index)
|
||||
int lmb_found;
|
||||
int rc;
|
||||
|
||||
pr_info("Attempting to hot-remove LMB, drc index %x\n", drc_index);
|
||||
pr_debug("Attempting to hot-remove LMB, drc index %x\n", drc_index);
|
||||
|
||||
lmb_found = 0;
|
||||
for_each_drmem_lmb(lmb) {
|
||||
@ -510,14 +510,15 @@ static int dlpar_memory_remove_by_index(u32 drc_index)
|
||||
}
|
||||
}
|
||||
|
||||
if (!lmb_found)
|
||||
if (!lmb_found) {
|
||||
pr_debug("Failed to look up LMB for drc index %x\n", drc_index);
|
||||
rc = -EINVAL;
|
||||
|
||||
if (rc)
|
||||
pr_info("Failed to hot-remove memory at %llx\n",
|
||||
lmb->base_addr);
|
||||
else
|
||||
pr_info("Memory at %llx was hot-removed\n", lmb->base_addr);
|
||||
} else if (rc) {
|
||||
pr_debug("Failed to hot-remove memory at %llx\n",
|
||||
lmb->base_addr);
|
||||
} else {
|
||||
pr_debug("Memory at %llx was hot-removed\n", lmb->base_addr);
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
@ -770,8 +771,8 @@ static int dlpar_memory_add_by_count(u32 lmbs_to_add)
|
||||
if (!drmem_lmb_reserved(lmb))
|
||||
continue;
|
||||
|
||||
pr_info("Memory at %llx (drc index %x) was hot-added\n",
|
||||
lmb->base_addr, lmb->drc_index);
|
||||
pr_debug("Memory at %llx (drc index %x) was hot-added\n",
|
||||
lmb->base_addr, lmb->drc_index);
|
||||
drmem_remove_lmb_reservation(lmb);
|
||||
}
|
||||
rc = 0;
|
||||
|
@ -76,7 +76,7 @@ static inline int test_fp_ctl(u32 fpc)
|
||||
#define KERNEL_VXR_HIGH (KERNEL_VXR_V16V23|KERNEL_VXR_V24V31)
|
||||
|
||||
#define KERNEL_VXR (KERNEL_VXR_LOW|KERNEL_VXR_HIGH)
|
||||
#define KERNEL_FPR (KERNEL_FPC|KERNEL_VXR_V0V7)
|
||||
#define KERNEL_FPR (KERNEL_FPC|KERNEL_VXR_LOW)
|
||||
|
||||
struct kernel_fpu;
|
||||
|
||||
|
@ -11,6 +11,8 @@
|
||||
/* I/O size constraints */
|
||||
#define ZPCI_MAX_READ_SIZE 8
|
||||
#define ZPCI_MAX_WRITE_SIZE 128
|
||||
#define ZPCI_BOUNDARY_SIZE (1 << 12)
|
||||
#define ZPCI_BOUNDARY_MASK (ZPCI_BOUNDARY_SIZE - 1)
|
||||
|
||||
/* I/O Map */
|
||||
#define ZPCI_IOMAP_SHIFT 48
|
||||
@ -125,16 +127,18 @@ out:
|
||||
int zpci_write_block(volatile void __iomem *dst, const void *src,
|
||||
unsigned long len);
|
||||
|
||||
static inline u8 zpci_get_max_write_size(u64 src, u64 dst, int len, int max)
|
||||
static inline int zpci_get_max_io_size(u64 src, u64 dst, int len, int max)
|
||||
{
|
||||
int count = len > max ? max : len, size = 1;
|
||||
int offset = dst & ZPCI_BOUNDARY_MASK;
|
||||
int size;
|
||||
|
||||
while (!(src & 0x1) && !(dst & 0x1) && ((size << 1) <= count)) {
|
||||
dst = dst >> 1;
|
||||
src = src >> 1;
|
||||
size = size << 1;
|
||||
}
|
||||
return size;
|
||||
size = min3(len, ZPCI_BOUNDARY_SIZE - offset, max);
|
||||
if (IS_ALIGNED(src, 8) && IS_ALIGNED(dst, 8) && IS_ALIGNED(size, 8))
|
||||
return size;
|
||||
|
||||
if (size >= 8)
|
||||
return 8;
|
||||
return rounddown_pow_of_two(size);
|
||||
}
|
||||
|
||||
static inline int zpci_memcpy_fromio(void *dst,
|
||||
@ -144,9 +148,9 @@ static inline int zpci_memcpy_fromio(void *dst,
|
||||
int size, rc = 0;
|
||||
|
||||
while (n > 0) {
|
||||
size = zpci_get_max_write_size((u64 __force) src,
|
||||
(u64) dst, n,
|
||||
ZPCI_MAX_READ_SIZE);
|
||||
size = zpci_get_max_io_size((u64 __force) src,
|
||||
(u64) dst, n,
|
||||
ZPCI_MAX_READ_SIZE);
|
||||
rc = zpci_read_single(dst, src, size);
|
||||
if (rc)
|
||||
break;
|
||||
@ -166,9 +170,9 @@ static inline int zpci_memcpy_toio(volatile void __iomem *dst,
|
||||
return -EINVAL;
|
||||
|
||||
while (n > 0) {
|
||||
size = zpci_get_max_write_size((u64 __force) dst,
|
||||
(u64) src, n,
|
||||
ZPCI_MAX_WRITE_SIZE);
|
||||
size = zpci_get_max_io_size((u64 __force) dst,
|
||||
(u64) src, n,
|
||||
ZPCI_MAX_WRITE_SIZE);
|
||||
if (size > 8) /* main path */
|
||||
rc = zpci_write_block(dst, src, size);
|
||||
else
|
||||
|
@ -100,9 +100,9 @@ static inline int __memcpy_toio_inuser(void __iomem *dst,
|
||||
|
||||
old_fs = enable_sacf_uaccess();
|
||||
while (n > 0) {
|
||||
size = zpci_get_max_write_size((u64 __force) dst,
|
||||
(u64 __force) src, n,
|
||||
ZPCI_MAX_WRITE_SIZE);
|
||||
size = zpci_get_max_io_size((u64 __force) dst,
|
||||
(u64 __force) src, n,
|
||||
ZPCI_MAX_WRITE_SIZE);
|
||||
if (size > 8) /* main path */
|
||||
rc = __pcistb_mio_inuser(dst, src, size, &status);
|
||||
else
|
||||
@ -250,9 +250,9 @@ static inline int __memcpy_fromio_inuser(void __user *dst,
|
||||
|
||||
old_fs = enable_sacf_uaccess();
|
||||
while (n > 0) {
|
||||
size = zpci_get_max_write_size((u64 __force) src,
|
||||
(u64 __force) dst, n,
|
||||
ZPCI_MAX_READ_SIZE);
|
||||
size = zpci_get_max_io_size((u64 __force) src,
|
||||
(u64 __force) dst, n,
|
||||
ZPCI_MAX_READ_SIZE);
|
||||
rc = __pcilg_mio_inuser(dst, src, size, &status);
|
||||
if (rc)
|
||||
break;
|
||||
|
@ -759,8 +759,8 @@ void __init_or_module text_poke_early(void *addr, const void *opcode,
|
||||
} else {
|
||||
local_irq_save(flags);
|
||||
memcpy(addr, opcode, len);
|
||||
local_irq_restore(flags);
|
||||
sync_core();
|
||||
local_irq_restore(flags);
|
||||
|
||||
/*
|
||||
* Could also do a CLFLUSH here to speed up CPU recovery; but
|
||||
|
@ -24,8 +24,8 @@
|
||||
|
||||
static int kvmclock __initdata = 1;
|
||||
static int kvmclock_vsyscall __initdata = 1;
|
||||
static int msr_kvm_system_time __ro_after_init = MSR_KVM_SYSTEM_TIME;
|
||||
static int msr_kvm_wall_clock __ro_after_init = MSR_KVM_WALL_CLOCK;
|
||||
static int msr_kvm_system_time __ro_after_init;
|
||||
static int msr_kvm_wall_clock __ro_after_init;
|
||||
static u64 kvm_sched_clock_offset __ro_after_init;
|
||||
|
||||
static int __init parse_no_kvmclock(char *arg)
|
||||
@ -189,7 +189,8 @@ static void kvm_setup_secondary_clock(void)
|
||||
|
||||
void kvmclock_disable(void)
|
||||
{
|
||||
native_write_msr(msr_kvm_system_time, 0, 0);
|
||||
if (msr_kvm_system_time)
|
||||
native_write_msr(msr_kvm_system_time, 0, 0);
|
||||
}
|
||||
|
||||
static void __init kvmclock_init_mem(void)
|
||||
@ -286,7 +287,10 @@ void __init kvmclock_init(void)
|
||||
if (kvm_para_has_feature(KVM_FEATURE_CLOCKSOURCE2)) {
|
||||
msr_kvm_system_time = MSR_KVM_SYSTEM_TIME_NEW;
|
||||
msr_kvm_wall_clock = MSR_KVM_WALL_CLOCK_NEW;
|
||||
} else if (!kvm_para_has_feature(KVM_FEATURE_CLOCKSOURCE)) {
|
||||
} else if (kvm_para_has_feature(KVM_FEATURE_CLOCKSOURCE)) {
|
||||
msr_kvm_system_time = MSR_KVM_SYSTEM_TIME;
|
||||
msr_kvm_wall_clock = MSR_KVM_WALL_CLOCK;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
*/
|
||||
int num_digits(int val)
|
||||
{
|
||||
int m = 10;
|
||||
long long m = 10;
|
||||
int d = 1;
|
||||
|
||||
if (val < 0) {
|
||||
|
@ -7,6 +7,8 @@ FRAGMENT_CONFIG=${KERNEL_DIR}/arch/arm64/configs/db845c_gki.fragment
|
||||
PRE_DEFCONFIG_CMDS="KCONFIG_CONFIG=${ROOT_DIR}/${KERNEL_DIR}/arch/arm64/configs/${DEFCONFIG} ${ROOT_DIR}/${KERNEL_DIR}/scripts/kconfig/merge_config.sh -m -r ${ROOT_DIR}/${KERNEL_DIR}/arch/arm64/configs/gki_defconfig ${ROOT_DIR}/${FRAGMENT_CONFIG}"
|
||||
POST_DEFCONFIG_CMDS="rm ${ROOT_DIR}/${KERNEL_DIR}/arch/arm64/configs/${DEFCONFIG}"
|
||||
|
||||
DTC_FLAGS="${DTC_FLAGS} -@"
|
||||
|
||||
FILES="
|
||||
arch/arm64/boot/Image.gz
|
||||
arch/arm64/boot/dts/qcom/sdm845-db845c.dtb
|
||||
|
@ -1029,9 +1029,13 @@ EXPORT_SYMBOL_GPL(af_alg_sendpage);
|
||||
void af_alg_free_resources(struct af_alg_async_req *areq)
|
||||
{
|
||||
struct sock *sk = areq->sk;
|
||||
struct af_alg_ctx *ctx;
|
||||
|
||||
af_alg_free_areq_sgls(areq);
|
||||
sock_kfree_s(sk, areq, areq->areqlen);
|
||||
|
||||
ctx = alg_sk(sk)->private;
|
||||
ctx->inflight = false;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(af_alg_free_resources);
|
||||
|
||||
@ -1095,11 +1099,19 @@ EXPORT_SYMBOL_GPL(af_alg_poll);
|
||||
struct af_alg_async_req *af_alg_alloc_areq(struct sock *sk,
|
||||
unsigned int areqlen)
|
||||
{
|
||||
struct af_alg_async_req *areq = sock_kmalloc(sk, areqlen, GFP_KERNEL);
|
||||
struct af_alg_ctx *ctx = alg_sk(sk)->private;
|
||||
struct af_alg_async_req *areq;
|
||||
|
||||
/* Only one AIO request can be in flight. */
|
||||
if (ctx->inflight)
|
||||
return ERR_PTR(-EBUSY);
|
||||
|
||||
areq = sock_kmalloc(sk, areqlen, GFP_KERNEL);
|
||||
if (unlikely(!areq))
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
ctx->inflight = true;
|
||||
|
||||
areq->areqlen = areqlen;
|
||||
areq->sk = sk;
|
||||
areq->last_rsgl = NULL;
|
||||
|
@ -124,6 +124,7 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir)
|
||||
struct crypto_scomp *scomp = *tfm_ctx;
|
||||
void **ctx = acomp_request_ctx(req);
|
||||
struct scomp_scratch *scratch;
|
||||
unsigned int dlen;
|
||||
int ret;
|
||||
|
||||
if (!req->src || !req->slen || req->slen > SCOMP_SCRATCH_SIZE)
|
||||
@ -135,6 +136,8 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir)
|
||||
if (!req->dlen || req->dlen > SCOMP_SCRATCH_SIZE)
|
||||
req->dlen = SCOMP_SCRATCH_SIZE;
|
||||
|
||||
dlen = req->dlen;
|
||||
|
||||
scratch = raw_cpu_ptr(&scomp_scratch);
|
||||
spin_lock(&scratch->lock);
|
||||
|
||||
@ -152,6 +155,9 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir)
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
} else if (req->dlen > dlen) {
|
||||
ret = -ENOSPC;
|
||||
goto out;
|
||||
}
|
||||
scatterwalk_map_and_copy(scratch->dst, req->dst, 0, req->dlen,
|
||||
1);
|
||||
|
@ -98,7 +98,7 @@ static void lpit_update_residency(struct lpit_residency_info *info,
|
||||
struct acpi_lpit_native *lpit_native)
|
||||
{
|
||||
info->frequency = lpit_native->counter_frequency ?
|
||||
lpit_native->counter_frequency : tsc_khz * 1000;
|
||||
lpit_native->counter_frequency : mul_u32_u32(tsc_khz, 1000U);
|
||||
if (!info->frequency)
|
||||
info->frequency = 1;
|
||||
|
||||
|
@ -1784,12 +1784,12 @@ static void acpi_video_dev_register_backlight(struct acpi_video_device *device)
|
||||
return;
|
||||
count++;
|
||||
|
||||
acpi_get_parent(device->dev->handle, &acpi_parent);
|
||||
|
||||
pdev = acpi_get_pci_dev(acpi_parent);
|
||||
if (pdev) {
|
||||
parent = &pdev->dev;
|
||||
pci_dev_put(pdev);
|
||||
if (ACPI_SUCCESS(acpi_get_parent(device->dev->handle, &acpi_parent))) {
|
||||
pdev = acpi_get_pci_dev(acpi_parent);
|
||||
if (pdev) {
|
||||
parent = &pdev->dev;
|
||||
pci_dev_put(pdev);
|
||||
}
|
||||
}
|
||||
|
||||
memset(&props, 0, sizeof(struct backlight_properties));
|
||||
|
@ -646,6 +646,7 @@ acpi_fwnode_get_named_child_node(const struct fwnode_handle *fwnode,
|
||||
* @index: Index of the reference to return
|
||||
* @num_args: Maximum number of arguments after each reference
|
||||
* @args: Location to store the returned reference with optional arguments
|
||||
* (may be NULL)
|
||||
*
|
||||
* Find property with @name, verifify that it is a package containing at least
|
||||
* one object reference and if so, store the ACPI device object pointer to the
|
||||
@ -704,6 +705,9 @@ int __acpi_node_get_property_reference(const struct fwnode_handle *fwnode,
|
||||
if (ret)
|
||||
return ret == -ENODEV ? -EINVAL : ret;
|
||||
|
||||
if (!args)
|
||||
return 0;
|
||||
|
||||
args->fwnode = acpi_fwnode_handle(device);
|
||||
args->nargs = 0;
|
||||
return 0;
|
||||
|
@ -455,6 +455,13 @@ static const struct dmi_system_id asus_laptop[] = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "B1402CVA"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* TongFang GMxXGxx sold as Eluktronics Inc. RP-15 */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Eluktronics Inc."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "RP-15"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* TongFang GM6XGxX/TUXEDO Stellaris 16 Gen5 AMD */
|
||||
.matches = {
|
||||
|
@ -4980,7 +4980,7 @@ static __poll_t binder_poll(struct file *filp,
|
||||
|
||||
thread = binder_get_thread(proc);
|
||||
if (!thread)
|
||||
return POLLERR;
|
||||
return EPOLLERR;
|
||||
|
||||
binder_inner_proc_lock(thread->proc);
|
||||
thread->looper |= BINDER_LOOPER_STATE_POLL;
|
||||
|
@ -272,7 +272,7 @@ static int binder_update_page_range(struct binder_alloc *alloc, int allocate,
|
||||
}
|
||||
if (mm) {
|
||||
up_write(&mm->mmap_sem);
|
||||
mmput(mm);
|
||||
mmput_async(mm);
|
||||
}
|
||||
return 0;
|
||||
|
||||
@ -305,7 +305,7 @@ err_page_ptr_cleared:
|
||||
err_no_vma:
|
||||
if (mm) {
|
||||
up_write(&mm->mmap_sem);
|
||||
mmput(mm);
|
||||
mmput_async(mm);
|
||||
}
|
||||
return vma ? -ENOMEM : -ESRCH;
|
||||
}
|
||||
@ -416,17 +416,17 @@ static struct binder_buffer *binder_alloc_new_buf_locked(
|
||||
alloc->pid, extra_buffers_size);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
if (is_async &&
|
||||
alloc->free_async_space < size + sizeof(struct binder_buffer)) {
|
||||
|
||||
/* Pad 0-size buffers so they get assigned unique addresses */
|
||||
size = max(size, sizeof(void *));
|
||||
|
||||
if (is_async && alloc->free_async_space < size) {
|
||||
binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC,
|
||||
"%d: binder_alloc_buf size %zd failed, no async space left\n",
|
||||
alloc->pid, size);
|
||||
return ERR_PTR(-ENOSPC);
|
||||
}
|
||||
|
||||
/* Pad 0-size buffers so they get assigned unique addresses */
|
||||
size = max(size, sizeof(void *));
|
||||
|
||||
while (n) {
|
||||
buffer = rb_entry(n, struct binder_buffer, rb_node);
|
||||
BUG_ON(!buffer->free);
|
||||
@ -527,7 +527,7 @@ static struct binder_buffer *binder_alloc_new_buf_locked(
|
||||
buffer->extra_buffers_size = extra_buffers_size;
|
||||
buffer->pid = pid;
|
||||
if (is_async) {
|
||||
alloc->free_async_space -= size + sizeof(struct binder_buffer);
|
||||
alloc->free_async_space -= size;
|
||||
binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC_ASYNC,
|
||||
"%d: binder_alloc_buf size %zd async free %zd\n",
|
||||
alloc->pid, size, alloc->free_async_space);
|
||||
@ -563,7 +563,7 @@ err_alloc_buf_struct_failed:
|
||||
* is the sum of the three given sizes (each rounded up to
|
||||
* pointer-sized boundary)
|
||||
*
|
||||
* Return: The allocated buffer or %NULL if error
|
||||
* Return: The allocated buffer or %ERR_PTR(-errno) if error
|
||||
*/
|
||||
struct binder_buffer *binder_alloc_new_buf(struct binder_alloc *alloc,
|
||||
size_t data_size,
|
||||
@ -662,8 +662,7 @@ static void binder_free_buf_locked(struct binder_alloc *alloc,
|
||||
BUG_ON(buffer->user_data > alloc->buffer + alloc->buffer_size);
|
||||
|
||||
if (buffer->async_transaction) {
|
||||
alloc->free_async_space += buffer_size + sizeof(struct binder_buffer);
|
||||
|
||||
alloc->free_async_space += buffer_size;
|
||||
binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC_ASYNC,
|
||||
"%d: binder_free_buf size %zd async free %zd\n",
|
||||
alloc->pid, size, alloc->free_async_space);
|
||||
@ -711,7 +710,7 @@ void binder_alloc_free_buf(struct binder_alloc *alloc,
|
||||
/*
|
||||
* We could eliminate the call to binder_alloc_clear_buf()
|
||||
* from binder_alloc_deferred_release() by moving this to
|
||||
* binder_alloc_free_buf_locked(). However, that could
|
||||
* binder_free_buf_locked(). However, that could
|
||||
* increase contention for the alloc mutex if clear_on_free
|
||||
* is used frequently for large buffers. The mutex is not
|
||||
* needed for correctness here.
|
||||
@ -1002,7 +1001,9 @@ enum lru_status binder_alloc_free_page(struct list_head *item,
|
||||
goto err_mmget;
|
||||
if (!down_read_trylock(&mm->mmap_sem))
|
||||
goto err_down_read_mmap_sem_failed;
|
||||
vma = binder_alloc_get_vma(alloc);
|
||||
vma = find_vma(mm, page_addr);
|
||||
if (vma && vma != binder_alloc_get_vma(alloc))
|
||||
goto err_invalid_vma;
|
||||
|
||||
list_lru_isolate(lru, item);
|
||||
spin_unlock(lock);
|
||||
@ -1028,6 +1029,8 @@ enum lru_status binder_alloc_free_page(struct list_head *item,
|
||||
mutex_unlock(&alloc->mutex);
|
||||
return LRU_REMOVED_RETRY;
|
||||
|
||||
err_invalid_vma:
|
||||
up_read(&mm->mmap_sem);
|
||||
err_down_read_mmap_sem_failed:
|
||||
mmput_async(mm);
|
||||
err_mmget:
|
||||
|
@ -1475,6 +1475,28 @@ void pm_runtime_enable(struct device *dev)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pm_runtime_enable);
|
||||
|
||||
static void pm_runtime_disable_action(void *data)
|
||||
{
|
||||
pm_runtime_dont_use_autosuspend(data);
|
||||
pm_runtime_disable(data);
|
||||
}
|
||||
|
||||
/**
|
||||
* devm_pm_runtime_enable - devres-enabled version of pm_runtime_enable.
|
||||
*
|
||||
* NOTE: this will also handle calling pm_runtime_dont_use_autosuspend() for
|
||||
* you at driver exit time if needed.
|
||||
*
|
||||
* @dev: Device to handle.
|
||||
*/
|
||||
int devm_pm_runtime_enable(struct device *dev)
|
||||
{
|
||||
pm_runtime_enable(dev);
|
||||
|
||||
return devm_add_action_or_reset(dev, pm_runtime_disable_action, dev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_pm_runtime_enable);
|
||||
|
||||
/**
|
||||
* pm_runtime_forbid - Block runtime PM of a device.
|
||||
* @dev: Device to handle.
|
||||
|
@ -604,6 +604,9 @@ software_node_get_reference_args(const struct fwnode_handle *fwnode,
|
||||
if (nargs > NR_FWNODE_REFERENCE_ARGS)
|
||||
return -EINVAL;
|
||||
|
||||
if (!args)
|
||||
return 0;
|
||||
|
||||
args->fwnode = software_node_get(refnode);
|
||||
args->nargs = nargs;
|
||||
|
||||
|
@ -471,7 +471,7 @@ mtk_stp_split(struct btmtkuart_dev *bdev, const unsigned char *data, int count,
|
||||
return data;
|
||||
}
|
||||
|
||||
static int btmtkuart_recv(struct hci_dev *hdev, const u8 *data, size_t count)
|
||||
static void btmtkuart_recv(struct hci_dev *hdev, const u8 *data, size_t count)
|
||||
{
|
||||
struct btmtkuart_dev *bdev = hci_get_drvdata(hdev);
|
||||
const unsigned char *p_left = data, *p_h4;
|
||||
@ -510,25 +510,20 @@ static int btmtkuart_recv(struct hci_dev *hdev, const u8 *data, size_t count)
|
||||
bt_dev_err(bdev->hdev,
|
||||
"Frame reassembly failed (%d)", err);
|
||||
bdev->rx_skb = NULL;
|
||||
return err;
|
||||
return;
|
||||
}
|
||||
|
||||
sz_left -= sz_h4;
|
||||
p_left += sz_h4;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int btmtkuart_receive_buf(struct serdev_device *serdev, const u8 *data,
|
||||
size_t count)
|
||||
{
|
||||
struct btmtkuart_dev *bdev = serdev_device_get_drvdata(serdev);
|
||||
int err;
|
||||
|
||||
err = btmtkuart_recv(bdev->hdev, data, count);
|
||||
if (err < 0)
|
||||
return err;
|
||||
btmtkuart_recv(bdev->hdev, data, count);
|
||||
|
||||
bdev->hdev->stat.byte_rx += count;
|
||||
|
||||
|
@ -732,10 +732,8 @@ static int si5341_output_clk_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
r[0] = r_div ? (r_div & 0xff) : 1;
|
||||
r[1] = (r_div >> 8) & 0xff;
|
||||
r[2] = (r_div >> 16) & 0xff;
|
||||
err = regmap_bulk_write(output->data->regmap,
|
||||
return regmap_bulk_write(output->data->regmap,
|
||||
SI5341_OUT_R_REG(output), r, 3);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int si5341_output_reparent(struct clk_si5341_output *output, u8 index)
|
||||
|
@ -489,7 +489,7 @@ static struct rockchip_clk_branch common_clk_branches[] __initdata = {
|
||||
GATE(HCLK_I2S_2CH, "hclk_i2s_2ch", "hclk_peri", 0, RK2928_CLKGATE_CON(7), 2, GFLAGS),
|
||||
GATE(0, "hclk_usb_peri", "hclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(9), 13, GFLAGS),
|
||||
GATE(HCLK_HOST2, "hclk_host2", "hclk_peri", 0, RK2928_CLKGATE_CON(7), 3, GFLAGS),
|
||||
GATE(HCLK_OTG, "hclk_otg", "hclk_peri", 0, RK2928_CLKGATE_CON(3), 13, GFLAGS),
|
||||
GATE(HCLK_OTG, "hclk_otg", "hclk_peri", 0, RK2928_CLKGATE_CON(5), 13, GFLAGS),
|
||||
GATE(0, "hclk_peri_ahb", "hclk_peri", CLK_IGNORE_UNUSED, RK2928_CLKGATE_CON(9), 14, GFLAGS),
|
||||
GATE(HCLK_SPDIF, "hclk_spdif", "hclk_peri", 0, RK2928_CLKGATE_CON(10), 9, GFLAGS),
|
||||
GATE(HCLK_TSP, "hclk_tsp", "hclk_peri", 0, RK2928_CLKGATE_CON(10), 12, GFLAGS),
|
||||
|
@ -85,7 +85,7 @@ static int zynqmp_clk_mux_set_parent(struct clk_hw *hw, u8 index)
|
||||
static const struct clk_ops zynqmp_clk_mux_ops = {
|
||||
.get_parent = zynqmp_clk_mux_get_parent,
|
||||
.set_parent = zynqmp_clk_mux_set_parent,
|
||||
.determine_rate = __clk_mux_determine_rate,
|
||||
.determine_rate = __clk_mux_determine_rate_closest,
|
||||
};
|
||||
|
||||
static const struct clk_ops zynqmp_clk_mux_ro_ops = {
|
||||
|
@ -178,8 +178,11 @@ static int ccp_init_dm_workarea(struct ccp_dm_workarea *wa,
|
||||
|
||||
wa->dma.address = dma_map_single(wa->dev, wa->address, len,
|
||||
dir);
|
||||
if (dma_mapping_error(wa->dev, wa->dma.address))
|
||||
if (dma_mapping_error(wa->dev, wa->dma.address)) {
|
||||
kfree(wa->address);
|
||||
wa->address = NULL;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
wa->dma.length = len;
|
||||
}
|
||||
|
@ -43,7 +43,6 @@
|
||||
#define FLAGS_MODE_MASK 0x000f
|
||||
#define FLAGS_ENCRYPT BIT(0)
|
||||
#define FLAGS_CBC BIT(1)
|
||||
#define FLAGS_NEW_KEY BIT(3)
|
||||
|
||||
#define SAHARA_HDR_BASE 0x00800000
|
||||
#define SAHARA_HDR_SKHA_ALG_AES 0
|
||||
@ -141,8 +140,6 @@ struct sahara_hw_link {
|
||||
};
|
||||
|
||||
struct sahara_ctx {
|
||||
unsigned long flags;
|
||||
|
||||
/* AES-specific context */
|
||||
int keylen;
|
||||
u8 key[AES_KEYSIZE_128];
|
||||
@ -445,27 +442,24 @@ static int sahara_hw_descriptor_create(struct sahara_dev *dev)
|
||||
int ret;
|
||||
int i, j;
|
||||
int idx = 0;
|
||||
u32 len;
|
||||
|
||||
/* Copy new key if necessary */
|
||||
if (ctx->flags & FLAGS_NEW_KEY) {
|
||||
memcpy(dev->key_base, ctx->key, ctx->keylen);
|
||||
ctx->flags &= ~FLAGS_NEW_KEY;
|
||||
memcpy(dev->key_base, ctx->key, ctx->keylen);
|
||||
|
||||
if (dev->flags & FLAGS_CBC) {
|
||||
dev->hw_desc[idx]->len1 = AES_BLOCK_SIZE;
|
||||
dev->hw_desc[idx]->p1 = dev->iv_phys_base;
|
||||
} else {
|
||||
dev->hw_desc[idx]->len1 = 0;
|
||||
dev->hw_desc[idx]->p1 = 0;
|
||||
}
|
||||
dev->hw_desc[idx]->len2 = ctx->keylen;
|
||||
dev->hw_desc[idx]->p2 = dev->key_phys_base;
|
||||
dev->hw_desc[idx]->next = dev->hw_phys_desc[1];
|
||||
|
||||
dev->hw_desc[idx]->hdr = sahara_aes_key_hdr(dev);
|
||||
|
||||
idx++;
|
||||
if (dev->flags & FLAGS_CBC) {
|
||||
dev->hw_desc[idx]->len1 = AES_BLOCK_SIZE;
|
||||
dev->hw_desc[idx]->p1 = dev->iv_phys_base;
|
||||
} else {
|
||||
dev->hw_desc[idx]->len1 = 0;
|
||||
dev->hw_desc[idx]->p1 = 0;
|
||||
}
|
||||
dev->hw_desc[idx]->len2 = ctx->keylen;
|
||||
dev->hw_desc[idx]->p2 = dev->key_phys_base;
|
||||
dev->hw_desc[idx]->next = dev->hw_phys_desc[1];
|
||||
dev->hw_desc[idx]->hdr = sahara_aes_key_hdr(dev);
|
||||
|
||||
idx++;
|
||||
|
||||
|
||||
dev->nb_in_sg = sg_nents_for_len(dev->in_sg, dev->total);
|
||||
if (dev->nb_in_sg < 0) {
|
||||
@ -487,24 +481,27 @@ static int sahara_hw_descriptor_create(struct sahara_dev *dev)
|
||||
DMA_TO_DEVICE);
|
||||
if (ret != dev->nb_in_sg) {
|
||||
dev_err(dev->device, "couldn't map in sg\n");
|
||||
goto unmap_in;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = dma_map_sg(dev->device, dev->out_sg, dev->nb_out_sg,
|
||||
DMA_FROM_DEVICE);
|
||||
if (ret != dev->nb_out_sg) {
|
||||
dev_err(dev->device, "couldn't map out sg\n");
|
||||
goto unmap_out;
|
||||
goto unmap_in;
|
||||
}
|
||||
|
||||
/* Create input links */
|
||||
dev->hw_desc[idx]->p1 = dev->hw_phys_link[0];
|
||||
sg = dev->in_sg;
|
||||
len = dev->total;
|
||||
for (i = 0; i < dev->nb_in_sg; i++) {
|
||||
dev->hw_link[i]->len = sg->length;
|
||||
dev->hw_link[i]->len = min(len, sg->length);
|
||||
dev->hw_link[i]->p = sg->dma_address;
|
||||
if (i == (dev->nb_in_sg - 1)) {
|
||||
dev->hw_link[i]->next = 0;
|
||||
} else {
|
||||
len -= min(len, sg->length);
|
||||
dev->hw_link[i]->next = dev->hw_phys_link[i + 1];
|
||||
sg = sg_next(sg);
|
||||
}
|
||||
@ -513,12 +510,14 @@ static int sahara_hw_descriptor_create(struct sahara_dev *dev)
|
||||
/* Create output links */
|
||||
dev->hw_desc[idx]->p2 = dev->hw_phys_link[i];
|
||||
sg = dev->out_sg;
|
||||
len = dev->total;
|
||||
for (j = i; j < dev->nb_out_sg + i; j++) {
|
||||
dev->hw_link[j]->len = sg->length;
|
||||
dev->hw_link[j]->len = min(len, sg->length);
|
||||
dev->hw_link[j]->p = sg->dma_address;
|
||||
if (j == (dev->nb_out_sg + i - 1)) {
|
||||
dev->hw_link[j]->next = 0;
|
||||
} else {
|
||||
len -= min(len, sg->length);
|
||||
dev->hw_link[j]->next = dev->hw_phys_link[j + 1];
|
||||
sg = sg_next(sg);
|
||||
}
|
||||
@ -537,9 +536,6 @@ static int sahara_hw_descriptor_create(struct sahara_dev *dev)
|
||||
|
||||
return 0;
|
||||
|
||||
unmap_out:
|
||||
dma_unmap_sg(dev->device, dev->out_sg, dev->nb_out_sg,
|
||||
DMA_FROM_DEVICE);
|
||||
unmap_in:
|
||||
dma_unmap_sg(dev->device, dev->in_sg, dev->nb_in_sg,
|
||||
DMA_TO_DEVICE);
|
||||
@ -584,16 +580,17 @@ static int sahara_aes_process(struct ablkcipher_request *req)
|
||||
|
||||
timeout = wait_for_completion_timeout(&dev->dma_completion,
|
||||
msecs_to_jiffies(SAHARA_TIMEOUT_MS));
|
||||
if (!timeout) {
|
||||
dev_err(dev->device, "AES timeout\n");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
dma_unmap_sg(dev->device, dev->out_sg, dev->nb_out_sg,
|
||||
DMA_FROM_DEVICE);
|
||||
dma_unmap_sg(dev->device, dev->in_sg, dev->nb_in_sg,
|
||||
DMA_TO_DEVICE);
|
||||
|
||||
if (!timeout) {
|
||||
dev_err(dev->device, "AES timeout\n");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -608,7 +605,6 @@ static int sahara_aes_setkey(struct crypto_ablkcipher *tfm, const u8 *key,
|
||||
/* SAHARA only supports 128bit keys */
|
||||
if (keylen == AES_KEYSIZE_128) {
|
||||
memcpy(ctx->key, key, keylen);
|
||||
ctx->flags |= FLAGS_NEW_KEY;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -796,6 +792,7 @@ static int sahara_sha_hw_links_create(struct sahara_dev *dev,
|
||||
int start)
|
||||
{
|
||||
struct scatterlist *sg;
|
||||
unsigned int len;
|
||||
unsigned int i;
|
||||
int ret;
|
||||
|
||||
@ -817,12 +814,14 @@ static int sahara_sha_hw_links_create(struct sahara_dev *dev,
|
||||
if (!ret)
|
||||
return -EFAULT;
|
||||
|
||||
len = rctx->total;
|
||||
for (i = start; i < dev->nb_in_sg + start; i++) {
|
||||
dev->hw_link[i]->len = sg->length;
|
||||
dev->hw_link[i]->len = min(len, sg->length);
|
||||
dev->hw_link[i]->p = sg->dma_address;
|
||||
if (i == (dev->nb_in_sg + start - 1)) {
|
||||
dev->hw_link[i]->next = 0;
|
||||
} else {
|
||||
len -= min(len, sg->length);
|
||||
dev->hw_link[i]->next = dev->hw_phys_link[i + 1];
|
||||
sg = sg_next(sg);
|
||||
}
|
||||
@ -903,24 +902,6 @@ static int sahara_sha_hw_context_descriptor_create(struct sahara_dev *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sahara_walk_and_recalc(struct scatterlist *sg, unsigned int nbytes)
|
||||
{
|
||||
if (!sg || !sg->length)
|
||||
return nbytes;
|
||||
|
||||
while (nbytes && sg) {
|
||||
if (nbytes <= sg->length) {
|
||||
sg->length = nbytes;
|
||||
sg_mark_end(sg);
|
||||
break;
|
||||
}
|
||||
nbytes -= sg->length;
|
||||
sg = sg_next(sg);
|
||||
}
|
||||
|
||||
return nbytes;
|
||||
}
|
||||
|
||||
static int sahara_sha_prepare_request(struct ahash_request *req)
|
||||
{
|
||||
struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
|
||||
@ -957,36 +938,20 @@ static int sahara_sha_prepare_request(struct ahash_request *req)
|
||||
hash_later, 0);
|
||||
}
|
||||
|
||||
/* nbytes should now be multiple of blocksize */
|
||||
req->nbytes = req->nbytes - hash_later;
|
||||
|
||||
sahara_walk_and_recalc(req->src, req->nbytes);
|
||||
|
||||
rctx->total = len - hash_later;
|
||||
/* have data from previous operation and current */
|
||||
if (rctx->buf_cnt && req->nbytes) {
|
||||
sg_init_table(rctx->in_sg_chain, 2);
|
||||
sg_set_buf(rctx->in_sg_chain, rctx->rembuf, rctx->buf_cnt);
|
||||
|
||||
sg_chain(rctx->in_sg_chain, 2, req->src);
|
||||
|
||||
rctx->total = req->nbytes + rctx->buf_cnt;
|
||||
rctx->in_sg = rctx->in_sg_chain;
|
||||
|
||||
req->src = rctx->in_sg_chain;
|
||||
/* only data from previous operation */
|
||||
} else if (rctx->buf_cnt) {
|
||||
if (req->src)
|
||||
rctx->in_sg = req->src;
|
||||
else
|
||||
rctx->in_sg = rctx->in_sg_chain;
|
||||
/* buf was copied into rembuf above */
|
||||
rctx->in_sg = rctx->in_sg_chain;
|
||||
sg_init_one(rctx->in_sg, rctx->rembuf, rctx->buf_cnt);
|
||||
rctx->total = rctx->buf_cnt;
|
||||
/* no data from previous operation */
|
||||
} else {
|
||||
rctx->in_sg = req->src;
|
||||
rctx->total = req->nbytes;
|
||||
req->src = rctx->in_sg;
|
||||
}
|
||||
|
||||
/* on next call, we only have the remaining data in the buffer */
|
||||
@ -1007,7 +972,10 @@ static int sahara_sha_process(struct ahash_request *req)
|
||||
return ret;
|
||||
|
||||
if (rctx->first) {
|
||||
sahara_sha_hw_data_descriptor_create(dev, rctx, req, 0);
|
||||
ret = sahara_sha_hw_data_descriptor_create(dev, rctx, req, 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
dev->hw_desc[0]->next = 0;
|
||||
rctx->first = 0;
|
||||
} else {
|
||||
@ -1015,7 +983,10 @@ static int sahara_sha_process(struct ahash_request *req)
|
||||
|
||||
sahara_sha_hw_context_descriptor_create(dev, rctx, req, 0);
|
||||
dev->hw_desc[0]->next = dev->hw_phys_desc[1];
|
||||
sahara_sha_hw_data_descriptor_create(dev, rctx, req, 1);
|
||||
ret = sahara_sha_hw_data_descriptor_create(dev, rctx, req, 1);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
dev->hw_desc[1]->next = 0;
|
||||
}
|
||||
|
||||
@ -1028,18 +999,19 @@ static int sahara_sha_process(struct ahash_request *req)
|
||||
|
||||
timeout = wait_for_completion_timeout(&dev->dma_completion,
|
||||
msecs_to_jiffies(SAHARA_TIMEOUT_MS));
|
||||
if (!timeout) {
|
||||
dev_err(dev->device, "SHA timeout\n");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
if (rctx->sg_in_idx)
|
||||
dma_unmap_sg(dev->device, dev->in_sg, dev->nb_in_sg,
|
||||
DMA_TO_DEVICE);
|
||||
|
||||
if (!timeout) {
|
||||
dev_err(dev->device, "SHA timeout\n");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
memcpy(rctx->context, dev->context_base, rctx->context_size);
|
||||
|
||||
if (req->result)
|
||||
if (req->result && rctx->last)
|
||||
memcpy(req->result, rctx->context, rctx->digest_size);
|
||||
|
||||
return 0;
|
||||
@ -1183,8 +1155,7 @@ static int sahara_sha_import(struct ahash_request *req, const void *in)
|
||||
static int sahara_sha_cra_init(struct crypto_tfm *tfm)
|
||||
{
|
||||
crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm),
|
||||
sizeof(struct sahara_sha_reqctx) +
|
||||
SHA_BUFFER_LEN + SHA256_BLOCK_SIZE);
|
||||
sizeof(struct sahara_sha_reqctx));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include <linux/virtio.h>
|
||||
#include <linux/crypto.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <crypto/aead.h>
|
||||
#include <crypto/aes.h>
|
||||
#include <crypto/engine.h>
|
||||
@ -27,6 +28,7 @@ struct data_queue {
|
||||
char name[32];
|
||||
|
||||
struct crypto_engine *engine;
|
||||
struct tasklet_struct done_task;
|
||||
};
|
||||
|
||||
struct virtio_crypto {
|
||||
|
@ -22,27 +22,28 @@ virtcrypto_clear_request(struct virtio_crypto_request *vc_req)
|
||||
}
|
||||
}
|
||||
|
||||
static void virtcrypto_dataq_callback(struct virtqueue *vq)
|
||||
static void virtcrypto_done_task(unsigned long data)
|
||||
{
|
||||
struct virtio_crypto *vcrypto = vq->vdev->priv;
|
||||
struct data_queue *data_vq = (struct data_queue *)data;
|
||||
struct virtqueue *vq = data_vq->vq;
|
||||
struct virtio_crypto_request *vc_req;
|
||||
unsigned long flags;
|
||||
unsigned int len;
|
||||
unsigned int qid = vq->index;
|
||||
|
||||
spin_lock_irqsave(&vcrypto->data_vq[qid].lock, flags);
|
||||
do {
|
||||
virtqueue_disable_cb(vq);
|
||||
while ((vc_req = virtqueue_get_buf(vq, &len)) != NULL) {
|
||||
spin_unlock_irqrestore(
|
||||
&vcrypto->data_vq[qid].lock, flags);
|
||||
if (vc_req->alg_cb)
|
||||
vc_req->alg_cb(vc_req, len);
|
||||
spin_lock_irqsave(
|
||||
&vcrypto->data_vq[qid].lock, flags);
|
||||
}
|
||||
} while (!virtqueue_enable_cb(vq));
|
||||
spin_unlock_irqrestore(&vcrypto->data_vq[qid].lock, flags);
|
||||
}
|
||||
|
||||
static void virtcrypto_dataq_callback(struct virtqueue *vq)
|
||||
{
|
||||
struct virtio_crypto *vcrypto = vq->vdev->priv;
|
||||
struct data_queue *dq = &vcrypto->data_vq[vq->index];
|
||||
|
||||
tasklet_schedule(&dq->done_task);
|
||||
}
|
||||
|
||||
static int virtcrypto_find_vqs(struct virtio_crypto *vi)
|
||||
@ -99,6 +100,8 @@ static int virtcrypto_find_vqs(struct virtio_crypto *vi)
|
||||
ret = -ENOMEM;
|
||||
goto err_engine;
|
||||
}
|
||||
tasklet_init(&vi->data_vq[i].done_task, virtcrypto_done_task,
|
||||
(unsigned long)&vi->data_vq[i]);
|
||||
}
|
||||
|
||||
kfree(names);
|
||||
@ -431,11 +434,14 @@ static void virtcrypto_free_unused_reqs(struct virtio_crypto *vcrypto)
|
||||
static void virtcrypto_remove(struct virtio_device *vdev)
|
||||
{
|
||||
struct virtio_crypto *vcrypto = vdev->priv;
|
||||
int i;
|
||||
|
||||
dev_info(&vdev->dev, "Start virtcrypto_remove.\n");
|
||||
|
||||
if (virtcrypto_dev_started(vcrypto))
|
||||
virtcrypto_dev_stop(vcrypto);
|
||||
for (i = 0; i < vcrypto->max_data_queues; i++)
|
||||
tasklet_kill(&vcrypto->data_vq[i].done_task);
|
||||
vdev->config->reset(vdev);
|
||||
virtcrypto_free_unused_reqs(vcrypto);
|
||||
virtcrypto_clear_crypto_engines(vcrypto);
|
||||
|
@ -1133,7 +1133,7 @@ static irqreturn_t thunderx_ocx_com_threaded_isr(int irq, void *irq_id)
|
||||
decode_register(other, OCX_OTHER_SIZE,
|
||||
ocx_com_errors, ctx->reg_com_int);
|
||||
|
||||
strncat(msg, other, OCX_MESSAGE_SIZE);
|
||||
strlcat(msg, other, OCX_MESSAGE_SIZE);
|
||||
|
||||
for (lane = 0; lane < OCX_RX_LANES; lane++)
|
||||
if (ctx->reg_com_int & BIT(lane)) {
|
||||
@ -1142,12 +1142,12 @@ static irqreturn_t thunderx_ocx_com_threaded_isr(int irq, void *irq_id)
|
||||
lane, ctx->reg_lane_int[lane],
|
||||
lane, ctx->reg_lane_stat11[lane]);
|
||||
|
||||
strncat(msg, other, OCX_MESSAGE_SIZE);
|
||||
strlcat(msg, other, OCX_MESSAGE_SIZE);
|
||||
|
||||
decode_register(other, OCX_OTHER_SIZE,
|
||||
ocx_lane_errors,
|
||||
ctx->reg_lane_int[lane]);
|
||||
strncat(msg, other, OCX_MESSAGE_SIZE);
|
||||
strlcat(msg, other, OCX_MESSAGE_SIZE);
|
||||
}
|
||||
|
||||
if (ctx->reg_com_int & OCX_COM_INT_CE)
|
||||
@ -1217,7 +1217,7 @@ static irqreturn_t thunderx_ocx_lnk_threaded_isr(int irq, void *irq_id)
|
||||
decode_register(other, OCX_OTHER_SIZE,
|
||||
ocx_com_link_errors, ctx->reg_com_link_int);
|
||||
|
||||
strncat(msg, other, OCX_MESSAGE_SIZE);
|
||||
strlcat(msg, other, OCX_MESSAGE_SIZE);
|
||||
|
||||
if (ctx->reg_com_link_int & OCX_COM_LINK_INT_UE)
|
||||
edac_device_handle_ue(ocx->edac_dev, 0, 0, msg);
|
||||
@ -1896,7 +1896,7 @@ static irqreturn_t thunderx_l2c_threaded_isr(int irq, void *irq_id)
|
||||
|
||||
decode_register(other, L2C_OTHER_SIZE, l2_errors, ctx->reg_int);
|
||||
|
||||
strncat(msg, other, L2C_MESSAGE_SIZE);
|
||||
strlcat(msg, other, L2C_MESSAGE_SIZE);
|
||||
|
||||
if (ctx->reg_int & mask_ue)
|
||||
edac_device_handle_ue(l2c->edac_dev, 0, 0, msg);
|
||||
|
@ -279,6 +279,51 @@ static char ohci_driver_name[] = KBUILD_MODNAME;
|
||||
#define QUIRK_TI_SLLZ059 0x20
|
||||
#define QUIRK_IR_WAKE 0x40
|
||||
|
||||
// On PCI Express Root Complex in any type of AMD Ryzen machine, VIA VT6306/6307/6308 with Asmedia
|
||||
// ASM1083/1085 brings an inconvenience that the read accesses to 'Isochronous Cycle Timer' register
|
||||
// (at offset 0xf0 in PCI I/O space) often causes unexpected system reboot. The mechanism is not
|
||||
// clear, since the read access to the other registers is enough safe; e.g. 'Node ID' register,
|
||||
// while it is probable due to detection of any type of PCIe error.
|
||||
#define QUIRK_REBOOT_BY_CYCLE_TIMER_READ 0x80000000
|
||||
|
||||
#if IS_ENABLED(CONFIG_X86)
|
||||
|
||||
static bool has_reboot_by_cycle_timer_read_quirk(const struct fw_ohci *ohci)
|
||||
{
|
||||
return !!(ohci->quirks & QUIRK_REBOOT_BY_CYCLE_TIMER_READ);
|
||||
}
|
||||
|
||||
#define PCI_DEVICE_ID_ASMEDIA_ASM108X 0x1080
|
||||
|
||||
static bool detect_vt630x_with_asm1083_on_amd_ryzen_machine(const struct pci_dev *pdev)
|
||||
{
|
||||
const struct pci_dev *pcie_to_pci_bridge;
|
||||
|
||||
// Detect any type of AMD Ryzen machine.
|
||||
if (!static_cpu_has(X86_FEATURE_ZEN))
|
||||
return false;
|
||||
|
||||
// Detect VIA VT6306/6307/6308.
|
||||
if (pdev->vendor != PCI_VENDOR_ID_VIA)
|
||||
return false;
|
||||
if (pdev->device != PCI_DEVICE_ID_VIA_VT630X)
|
||||
return false;
|
||||
|
||||
// Detect Asmedia ASM1083/1085.
|
||||
pcie_to_pci_bridge = pdev->bus->self;
|
||||
if (pcie_to_pci_bridge->vendor != PCI_VENDOR_ID_ASMEDIA)
|
||||
return false;
|
||||
if (pcie_to_pci_bridge->device != PCI_DEVICE_ID_ASMEDIA_ASM108X)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#else
|
||||
#define has_reboot_by_cycle_timer_read_quirk(ohci) false
|
||||
#define detect_vt630x_with_asm1083_on_amd_ryzen_machine(pdev) false
|
||||
#endif
|
||||
|
||||
/* In case of multiple matches in ohci_quirks[], only the first one is used. */
|
||||
static const struct {
|
||||
unsigned short vendor, device, revision, flags;
|
||||
@ -1717,6 +1762,9 @@ static u32 get_cycle_time(struct fw_ohci *ohci)
|
||||
s32 diff01, diff12;
|
||||
int i;
|
||||
|
||||
if (has_reboot_by_cycle_timer_read_quirk(ohci))
|
||||
return 0;
|
||||
|
||||
c2 = reg_read(ohci, OHCI1394_IsochronousCycleTimer);
|
||||
|
||||
if (ohci->quirks & QUIRK_CYCLE_TIMER) {
|
||||
@ -3619,6 +3667,9 @@ static int pci_probe(struct pci_dev *dev,
|
||||
if (param_quirks)
|
||||
ohci->quirks = param_quirks;
|
||||
|
||||
if (detect_vt630x_with_asm1083_on_amd_ryzen_machine(dev))
|
||||
ohci->quirks |= QUIRK_REBOOT_BY_CYCLE_TIMER_READ;
|
||||
|
||||
/*
|
||||
* Because dma_alloc_coherent() allocates at least one page,
|
||||
* we save space by using a common buffer for the AR request/
|
||||
|
@ -179,7 +179,7 @@ static int ti_sci_debugfs_create(struct platform_device *pdev,
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct resource *res;
|
||||
char debug_name[50] = "ti_sci_debug@";
|
||||
char debug_name[50];
|
||||
|
||||
/* Debug region is optional */
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
|
||||
@ -196,10 +196,10 @@ static int ti_sci_debugfs_create(struct platform_device *pdev,
|
||||
/* Setup NULL termination */
|
||||
info->debug_buffer[info->debug_region_size] = 0;
|
||||
|
||||
info->d = debugfs_create_file(strncat(debug_name, dev_name(dev),
|
||||
sizeof(debug_name) -
|
||||
sizeof("ti_sci_debug@")),
|
||||
0444, NULL, info, &ti_sci_debug_fops);
|
||||
snprintf(debug_name, sizeof(debug_name), "ti_sci_debug@%s",
|
||||
dev_name(dev));
|
||||
info->d = debugfs_create_file(debug_name, 0444, NULL, info,
|
||||
&ti_sci_debug_fops);
|
||||
if (IS_ERR(info->d))
|
||||
return PTR_ERR(info->d);
|
||||
|
||||
|
@ -393,7 +393,7 @@ static ssize_t amdgpu_debugfs_regs_smc_read(struct file *f, char __user *buf,
|
||||
int r;
|
||||
|
||||
if (!adev->smc_rreg)
|
||||
return -EPERM;
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (size & 0x3 || *pos & 0x3)
|
||||
return -EINVAL;
|
||||
@ -435,7 +435,7 @@ static ssize_t amdgpu_debugfs_regs_smc_write(struct file *f, const char __user *
|
||||
int r;
|
||||
|
||||
if (!adev->smc_wreg)
|
||||
return -EPERM;
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (size & 0x3 || *pos & 0x3)
|
||||
return -EINVAL;
|
||||
|
@ -2733,10 +2733,8 @@ static int kv_parse_power_table(struct amdgpu_device *adev)
|
||||
non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
|
||||
&non_clock_info_array->nonClockInfo[non_clock_array_index];
|
||||
ps = kzalloc(sizeof(struct kv_ps), GFP_KERNEL);
|
||||
if (ps == NULL) {
|
||||
kfree(adev->pm.dpm.ps);
|
||||
if (ps == NULL)
|
||||
return -ENOMEM;
|
||||
}
|
||||
adev->pm.dpm.ps[i].ps_priv = ps;
|
||||
k = 0;
|
||||
idx = (u8 *)&power_state->v2.clockInfoIndex[0];
|
||||
|
@ -7349,10 +7349,9 @@ static int si_dpm_init(struct amdgpu_device *adev)
|
||||
kcalloc(4,
|
||||
sizeof(struct amdgpu_clock_voltage_dependency_entry),
|
||||
GFP_KERNEL);
|
||||
if (!adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries) {
|
||||
amdgpu_free_extended_power_table(adev);
|
||||
if (!adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.count = 4;
|
||||
adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[0].clk = 0;
|
||||
adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[0].v = 0;
|
||||
|
@ -1574,7 +1574,7 @@ static int tc_probe(struct i2c_client *client, const struct i2c_device_id *id)
|
||||
} else {
|
||||
if (tc->hpd_pin < 0 || tc->hpd_pin > 1) {
|
||||
dev_err(dev, "failed to parse HPD number\n");
|
||||
return ret;
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -535,8 +535,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
|
||||
struct drm_mode_set set;
|
||||
uint32_t __user *set_connectors_ptr;
|
||||
struct drm_modeset_acquire_ctx ctx;
|
||||
int ret;
|
||||
int i;
|
||||
int ret, i, num_connectors = 0;
|
||||
|
||||
if (!drm_core_check_feature(dev, DRIVER_MODESET))
|
||||
return -EOPNOTSUPP;
|
||||
@ -694,6 +693,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
|
||||
connector->name);
|
||||
|
||||
connector_set[i] = connector;
|
||||
num_connectors++;
|
||||
}
|
||||
}
|
||||
|
||||
@ -702,7 +702,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
|
||||
set.y = crtc_req->y;
|
||||
set.mode = mode;
|
||||
set.connectors = connector_set;
|
||||
set.num_connectors = crtc_req->count_connectors;
|
||||
set.num_connectors = num_connectors;
|
||||
set.fb = fb;
|
||||
|
||||
if (drm_drv_uses_atomic_modeset(dev))
|
||||
@ -715,7 +715,7 @@ out:
|
||||
drm_framebuffer_put(fb);
|
||||
|
||||
if (connector_set) {
|
||||
for (i = 0; i < crtc_req->count_connectors; i++) {
|
||||
for (i = 0; i < num_connectors; i++) {
|
||||
if (connector_set[i])
|
||||
drm_connector_put(connector_set[i]);
|
||||
}
|
||||
|
@ -984,8 +984,11 @@ int drm_dev_register(struct drm_device *dev, unsigned long flags)
|
||||
goto err_minors;
|
||||
}
|
||||
|
||||
if (drm_core_check_feature(dev, DRIVER_MODESET))
|
||||
drm_modeset_register_all(dev);
|
||||
if (drm_core_check_feature(dev, DRIVER_MODESET)) {
|
||||
ret = drm_modeset_register_all(dev);
|
||||
if (ret)
|
||||
goto err_unload;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
|
||||
@ -997,6 +1000,9 @@ int drm_dev_register(struct drm_device *dev, unsigned long flags)
|
||||
|
||||
goto out_unlock;
|
||||
|
||||
err_unload:
|
||||
if (dev->driver->unload)
|
||||
dev->driver->unload(dev);
|
||||
err_minors:
|
||||
remove_compat_control_link(dev);
|
||||
drm_minor_unregister(dev, DRM_MINOR_PRIMARY);
|
||||
|
@ -133,18 +133,16 @@ int exynos_drm_register_dma(struct drm_device *drm, struct device *dev,
|
||||
return 0;
|
||||
|
||||
if (!priv->mapping) {
|
||||
void *mapping;
|
||||
void *mapping = NULL;
|
||||
|
||||
if (IS_ENABLED(CONFIG_ARM_DMA_USE_IOMMU))
|
||||
mapping = arm_iommu_create_mapping(&platform_bus_type,
|
||||
EXYNOS_DEV_ADDR_START, EXYNOS_DEV_ADDR_SIZE);
|
||||
else if (IS_ENABLED(CONFIG_IOMMU_DMA))
|
||||
mapping = iommu_get_domain_for_dev(priv->dma_dev);
|
||||
else
|
||||
mapping = ERR_PTR(-ENODEV);
|
||||
|
||||
if (IS_ERR(mapping))
|
||||
return PTR_ERR(mapping);
|
||||
if (!mapping)
|
||||
return -ENODEV;
|
||||
priv->mapping = mapping;
|
||||
}
|
||||
|
||||
|
@ -1850,6 +1850,8 @@ static int hdmi_bind(struct device *dev, struct device *master, void *data)
|
||||
return ret;
|
||||
|
||||
crtc = exynos_drm_crtc_get_by_type(drm_dev, EXYNOS_DISPLAY_TYPE_HDMI);
|
||||
if (IS_ERR(crtc))
|
||||
return PTR_ERR(crtc);
|
||||
crtc->pipe_clk = &hdata->phy_clk;
|
||||
|
||||
ret = hdmi_create_connector(encoder);
|
||||
|
@ -268,6 +268,7 @@ static void mdp4_crtc_atomic_disable(struct drm_crtc *crtc,
|
||||
{
|
||||
struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc);
|
||||
struct mdp4_kms *mdp4_kms = get_kms(crtc);
|
||||
unsigned long flags;
|
||||
|
||||
DBG("%s", mdp4_crtc->name);
|
||||
|
||||
@ -280,6 +281,14 @@ static void mdp4_crtc_atomic_disable(struct drm_crtc *crtc,
|
||||
mdp_irq_unregister(&mdp4_kms->base, &mdp4_crtc->err);
|
||||
mdp4_disable(mdp4_kms);
|
||||
|
||||
if (crtc->state->event && !crtc->state->active) {
|
||||
WARN_ON(mdp4_crtc->event);
|
||||
spin_lock_irqsave(&mdp4_kms->dev->event_lock, flags);
|
||||
drm_crtc_send_vblank_event(crtc, crtc->state->event);
|
||||
crtc->state->event = NULL;
|
||||
spin_unlock_irqrestore(&mdp4_kms->dev->event_lock, flags);
|
||||
}
|
||||
|
||||
mdp4_crtc->enabled = false;
|
||||
}
|
||||
|
||||
|
@ -464,7 +464,9 @@ static int dsi_phy_enable_resource(struct msm_dsi_phy *phy)
|
||||
struct device *dev = &phy->pdev->dev;
|
||||
int ret;
|
||||
|
||||
pm_runtime_get_sync(dev);
|
||||
ret = pm_runtime_resume_and_get(dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = clk_prepare_enable(phy->ahb_clk);
|
||||
if (ret) {
|
||||
@ -604,6 +606,10 @@ static int dsi_phy_driver_probe(struct platform_device *pdev)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
ret = devm_pm_runtime_enable(&pdev->dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* PLL init will call into clk_register which requires
|
||||
* register access, so we need to enable power and ahb clock.
|
||||
*/
|
||||
|
@ -32,7 +32,7 @@ tu102_vmm_flush(struct nvkm_vmm *vmm, int depth)
|
||||
|
||||
type = 0x00000001; /* PAGE_ALL */
|
||||
if (atomic_read(&vmm->engref[NVKM_SUBDEV_BAR]))
|
||||
type |= 0x00000004; /* HUB_ONLY */
|
||||
type |= 0x00000006; /* HUB_ONLY | ALL PDB (hack) */
|
||||
|
||||
mutex_lock(&subdev->mutex);
|
||||
|
||||
|
@ -2313,7 +2313,7 @@ int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track)
|
||||
switch (prim_walk) {
|
||||
case 1:
|
||||
for (i = 0; i < track->num_arrays; i++) {
|
||||
size = track->arrays[i].esize * track->max_indx * 4;
|
||||
size = track->arrays[i].esize * track->max_indx * 4UL;
|
||||
if (track->arrays[i].robj == NULL) {
|
||||
DRM_ERROR("(PW %u) Vertex array %u no buffer "
|
||||
"bound\n", prim_walk, i);
|
||||
@ -2332,7 +2332,7 @@ int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track)
|
||||
break;
|
||||
case 2:
|
||||
for (i = 0; i < track->num_arrays; i++) {
|
||||
size = track->arrays[i].esize * (nverts - 1) * 4;
|
||||
size = track->arrays[i].esize * (nverts - 1) * 4UL;
|
||||
if (track->arrays[i].robj == NULL) {
|
||||
DRM_ERROR("(PW %u) Vertex array %u no buffer "
|
||||
"bound\n", prim_walk, i);
|
||||
|
@ -1278,7 +1278,7 @@ static int r600_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx)
|
||||
return -EINVAL;
|
||||
}
|
||||
tmp = (reg - CB_COLOR0_BASE) / 4;
|
||||
track->cb_color_bo_offset[tmp] = radeon_get_ib_value(p, idx) << 8;
|
||||
track->cb_color_bo_offset[tmp] = (u64)radeon_get_ib_value(p, idx) << 8;
|
||||
ib[idx] += (u32)((reloc->gpu_offset >> 8) & 0xffffffff);
|
||||
track->cb_color_base_last[tmp] = ib[idx];
|
||||
track->cb_color_bo[tmp] = reloc->robj;
|
||||
@ -1305,7 +1305,7 @@ static int r600_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx)
|
||||
"0x%04X\n", reg);
|
||||
return -EINVAL;
|
||||
}
|
||||
track->htile_offset = radeon_get_ib_value(p, idx) << 8;
|
||||
track->htile_offset = (u64)radeon_get_ib_value(p, idx) << 8;
|
||||
ib[idx] += (u32)((reloc->gpu_offset >> 8) & 0xffffffff);
|
||||
track->htile_bo = reloc->robj;
|
||||
track->db_dirty = true;
|
||||
|
@ -682,11 +682,16 @@ static void radeon_crtc_init(struct drm_device *dev, int index)
|
||||
if (radeon_crtc == NULL)
|
||||
return;
|
||||
|
||||
radeon_crtc->flip_queue = alloc_workqueue("radeon-crtc", WQ_HIGHPRI, 0);
|
||||
if (!radeon_crtc->flip_queue) {
|
||||
kfree(radeon_crtc);
|
||||
return;
|
||||
}
|
||||
|
||||
drm_crtc_init(dev, &radeon_crtc->base, &radeon_crtc_funcs);
|
||||
|
||||
drm_mode_crtc_set_gamma_size(&radeon_crtc->base, 256);
|
||||
radeon_crtc->crtc_id = index;
|
||||
radeon_crtc->flip_queue = alloc_workqueue("radeon-crtc", WQ_HIGHPRI, 0);
|
||||
rdev->mode_info.crtcs[index] = radeon_crtc;
|
||||
|
||||
if (rdev->family >= CHIP_BONAIRE) {
|
||||
|
@ -1206,13 +1206,17 @@ int radeon_vm_init(struct radeon_device *rdev, struct radeon_vm *vm)
|
||||
r = radeon_bo_create(rdev, pd_size, align, true,
|
||||
RADEON_GEM_DOMAIN_VRAM, 0, NULL,
|
||||
NULL, &vm->page_directory);
|
||||
if (r)
|
||||
if (r) {
|
||||
kfree(vm->page_tables);
|
||||
vm->page_tables = NULL;
|
||||
return r;
|
||||
|
||||
}
|
||||
r = radeon_vm_clear_bo(rdev, vm->page_directory);
|
||||
if (r) {
|
||||
radeon_bo_unref(&vm->page_directory);
|
||||
vm->page_directory = NULL;
|
||||
kfree(vm->page_tables);
|
||||
vm->page_tables = NULL;
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -3616,6 +3616,10 @@ static int si_cp_start(struct radeon_device *rdev)
|
||||
for (i = RADEON_RING_TYPE_GFX_INDEX; i <= CAYMAN_RING_TYPE_CP2_INDEX; ++i) {
|
||||
ring = &rdev->ring[i];
|
||||
r = radeon_ring_lock(rdev, ring, 2);
|
||||
if (r) {
|
||||
DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
|
||||
return r;
|
||||
}
|
||||
|
||||
/* clear the compute context state */
|
||||
radeon_ring_write(ring, PACKET3_COMPUTE(PACKET3_CLEAR_STATE, 0));
|
||||
|
@ -1493,8 +1493,10 @@ static int sumo_parse_power_table(struct radeon_device *rdev)
|
||||
non_clock_array_index = power_state->v2.nonClockInfoIndex;
|
||||
non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
|
||||
&non_clock_info_array->nonClockInfo[non_clock_array_index];
|
||||
if (!rdev->pm.power_state[i].clock_info)
|
||||
if (!rdev->pm.power_state[i].clock_info) {
|
||||
kfree(rdev->pm.dpm.ps);
|
||||
return -EINVAL;
|
||||
}
|
||||
ps = kzalloc(sizeof(struct sumo_ps), GFP_KERNEL);
|
||||
if (ps == NULL) {
|
||||
kfree(rdev->pm.dpm.ps);
|
||||
|
@ -1771,8 +1771,10 @@ static int trinity_parse_power_table(struct radeon_device *rdev)
|
||||
non_clock_array_index = power_state->v2.nonClockInfoIndex;
|
||||
non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
|
||||
&non_clock_info_array->nonClockInfo[non_clock_array_index];
|
||||
if (!rdev->pm.power_state[i].clock_info)
|
||||
if (!rdev->pm.power_state[i].clock_info) {
|
||||
kfree(rdev->pm.dpm.ps);
|
||||
return -EINVAL;
|
||||
}
|
||||
ps = kzalloc(sizeof(struct sumo_ps), GFP_KERNEL);
|
||||
if (ps == NULL) {
|
||||
kfree(rdev->pm.dpm.ps);
|
||||
|
@ -2612,8 +2612,8 @@ static void wacom_wac_finger_slot(struct wacom_wac *wacom_wac,
|
||||
{
|
||||
struct hid_data *hid_data = &wacom_wac->hid_data;
|
||||
bool mt = wacom_wac->features.touch_max > 1;
|
||||
bool prox = hid_data->tipswitch &&
|
||||
report_touch_events(wacom_wac);
|
||||
bool touch_down = hid_data->tipswitch && hid_data->confidence;
|
||||
bool prox = touch_down && report_touch_events(wacom_wac);
|
||||
|
||||
if (wacom_wac->shared->has_mute_touch_switch &&
|
||||
!wacom_wac->shared->is_touch_on) {
|
||||
@ -2652,24 +2652,6 @@ static void wacom_wac_finger_slot(struct wacom_wac *wacom_wac,
|
||||
}
|
||||
}
|
||||
|
||||
static bool wacom_wac_slot_is_active(struct input_dev *dev, int key)
|
||||
{
|
||||
struct input_mt *mt = dev->mt;
|
||||
struct input_mt_slot *s;
|
||||
|
||||
if (!mt)
|
||||
return false;
|
||||
|
||||
for (s = mt->slots; s != mt->slots + mt->num_slots; s++) {
|
||||
if (s->key == key &&
|
||||
input_mt_get_value(s, ABS_MT_TRACKING_ID) >= 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static void wacom_wac_finger_event(struct hid_device *hdev,
|
||||
struct hid_field *field, struct hid_usage *usage, __s32 value)
|
||||
{
|
||||
@ -2717,14 +2699,8 @@ static void wacom_wac_finger_event(struct hid_device *hdev,
|
||||
}
|
||||
|
||||
if (usage->usage_index + 1 == field->report_count) {
|
||||
if (equivalent_usage == wacom_wac->hid_data.last_slot_field) {
|
||||
bool touch_removed = wacom_wac_slot_is_active(wacom_wac->touch_input,
|
||||
wacom_wac->hid_data.id) && !wacom_wac->hid_data.tipswitch;
|
||||
|
||||
if (wacom_wac->hid_data.confidence || touch_removed) {
|
||||
wacom_wac_finger_slot(wacom_wac, wacom_wac->touch_input);
|
||||
}
|
||||
}
|
||||
if (equivalent_usage == wacom_wac->hid_data.last_slot_field)
|
||||
wacom_wac_finger_slot(wacom_wac, wacom_wac->touch_input);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -361,7 +361,7 @@ struct etmv4_drvdata {
|
||||
u8 ctxid_size;
|
||||
u8 vmid_size;
|
||||
u8 ccsize;
|
||||
u8 ccitmin;
|
||||
u16 ccitmin;
|
||||
u8 s_ex_level;
|
||||
u8 ns_ex_level;
|
||||
u8 q_support;
|
||||
|
@ -250,18 +250,46 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status)
|
||||
if (!slave)
|
||||
return 0;
|
||||
|
||||
command = readl(bus->base + ASPEED_I2C_CMD_REG);
|
||||
/*
|
||||
* Handle stop conditions early, prior to SLAVE_MATCH. Some masters may drive
|
||||
* transfers with low enough latency between the nak/stop phase of the current
|
||||
* command and the start/address phase of the following command that the
|
||||
* interrupts are coalesced by the time we process them.
|
||||
*/
|
||||
if (irq_status & ASPEED_I2CD_INTR_NORMAL_STOP) {
|
||||
irq_handled |= ASPEED_I2CD_INTR_NORMAL_STOP;
|
||||
bus->slave_state = ASPEED_I2C_SLAVE_STOP;
|
||||
}
|
||||
|
||||
/* Slave was requested, restart state machine. */
|
||||
if (irq_status & ASPEED_I2CD_INTR_TX_NAK &&
|
||||
bus->slave_state == ASPEED_I2C_SLAVE_READ_PROCESSED) {
|
||||
irq_handled |= ASPEED_I2CD_INTR_TX_NAK;
|
||||
bus->slave_state = ASPEED_I2C_SLAVE_STOP;
|
||||
}
|
||||
|
||||
/* Propagate any stop conditions to the slave implementation. */
|
||||
if (bus->slave_state == ASPEED_I2C_SLAVE_STOP) {
|
||||
i2c_slave_event(slave, I2C_SLAVE_STOP, &value);
|
||||
bus->slave_state = ASPEED_I2C_SLAVE_INACTIVE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Now that we've dealt with any potentially coalesced stop conditions,
|
||||
* address any start conditions.
|
||||
*/
|
||||
if (irq_status & ASPEED_I2CD_INTR_SLAVE_MATCH) {
|
||||
irq_handled |= ASPEED_I2CD_INTR_SLAVE_MATCH;
|
||||
bus->slave_state = ASPEED_I2C_SLAVE_START;
|
||||
}
|
||||
|
||||
/* Slave is not currently active, irq was for someone else. */
|
||||
/*
|
||||
* If the slave has been stopped and not started then slave interrupt
|
||||
* handling is complete.
|
||||
*/
|
||||
if (bus->slave_state == ASPEED_I2C_SLAVE_INACTIVE)
|
||||
return irq_handled;
|
||||
|
||||
command = readl(bus->base + ASPEED_I2C_CMD_REG);
|
||||
dev_dbg(bus->dev, "slave irq status 0x%08x, cmd 0x%08x\n",
|
||||
irq_status, command);
|
||||
|
||||
@ -280,17 +308,6 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status)
|
||||
irq_handled |= ASPEED_I2CD_INTR_RX_DONE;
|
||||
}
|
||||
|
||||
/* Slave was asked to stop. */
|
||||
if (irq_status & ASPEED_I2CD_INTR_NORMAL_STOP) {
|
||||
irq_handled |= ASPEED_I2CD_INTR_NORMAL_STOP;
|
||||
bus->slave_state = ASPEED_I2C_SLAVE_STOP;
|
||||
}
|
||||
if (irq_status & ASPEED_I2CD_INTR_TX_NAK &&
|
||||
bus->slave_state == ASPEED_I2C_SLAVE_READ_PROCESSED) {
|
||||
irq_handled |= ASPEED_I2CD_INTR_TX_NAK;
|
||||
bus->slave_state = ASPEED_I2C_SLAVE_STOP;
|
||||
}
|
||||
|
||||
switch (bus->slave_state) {
|
||||
case ASPEED_I2C_SLAVE_READ_REQUESTED:
|
||||
if (unlikely(irq_status & ASPEED_I2CD_INTR_TX_ACK))
|
||||
@ -319,8 +336,7 @@ static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status)
|
||||
i2c_slave_event(slave, I2C_SLAVE_WRITE_RECEIVED, &value);
|
||||
break;
|
||||
case ASPEED_I2C_SLAVE_STOP:
|
||||
i2c_slave_event(slave, I2C_SLAVE_STOP, &value);
|
||||
bus->slave_state = ASPEED_I2C_SLAVE_INACTIVE;
|
||||
/* Stop event handling is done early. Unreachable. */
|
||||
break;
|
||||
case ASPEED_I2C_SLAVE_START:
|
||||
/* Slave was just started. Waiting for the next event. */;
|
||||
|
@ -223,8 +223,17 @@ static bool is_ack(struct s3c24xx_i2c *i2c)
|
||||
int tries;
|
||||
|
||||
for (tries = 50; tries; --tries) {
|
||||
if (readl(i2c->regs + S3C2410_IICCON)
|
||||
& S3C2410_IICCON_IRQPEND) {
|
||||
unsigned long tmp = readl(i2c->regs + S3C2410_IICCON);
|
||||
|
||||
if (!(tmp & S3C2410_IICCON_ACKEN)) {
|
||||
/*
|
||||
* Wait a bit for the bus to stabilize,
|
||||
* delay estimated experimentally.
|
||||
*/
|
||||
usleep_range(100, 200);
|
||||
return true;
|
||||
}
|
||||
if (tmp & S3C2410_IICCON_IRQPEND) {
|
||||
if (!(readl(i2c->regs + S3C2410_IICSTAT)
|
||||
& S3C2410_IICSTAT_LASTBIT))
|
||||
return true;
|
||||
@ -277,16 +286,6 @@ static void s3c24xx_i2c_message_start(struct s3c24xx_i2c *i2c,
|
||||
|
||||
stat |= S3C2410_IICSTAT_START;
|
||||
writel(stat, i2c->regs + S3C2410_IICSTAT);
|
||||
|
||||
if (i2c->quirks & QUIRK_POLL) {
|
||||
while ((i2c->msg_num != 0) && is_ack(i2c)) {
|
||||
i2c_s3c_irq_nextbyte(i2c, stat);
|
||||
stat = readl(i2c->regs + S3C2410_IICSTAT);
|
||||
|
||||
if (stat & S3C2410_IICSTAT_ARBITR)
|
||||
dev_err(i2c->dev, "deal with arbitration loss\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static inline void s3c24xx_i2c_stop(struct s3c24xx_i2c *i2c, int ret)
|
||||
@ -694,7 +693,7 @@ static void s3c24xx_i2c_wait_idle(struct s3c24xx_i2c *i2c)
|
||||
static int s3c24xx_i2c_doxfer(struct s3c24xx_i2c *i2c,
|
||||
struct i2c_msg *msgs, int num)
|
||||
{
|
||||
unsigned long timeout;
|
||||
unsigned long timeout = 0;
|
||||
int ret;
|
||||
|
||||
ret = s3c24xx_i2c_set_master(i2c);
|
||||
@ -714,16 +713,19 @@ static int s3c24xx_i2c_doxfer(struct s3c24xx_i2c *i2c,
|
||||
s3c24xx_i2c_message_start(i2c, msgs);
|
||||
|
||||
if (i2c->quirks & QUIRK_POLL) {
|
||||
ret = i2c->msg_idx;
|
||||
while ((i2c->msg_num != 0) && is_ack(i2c)) {
|
||||
unsigned long stat = readl(i2c->regs + S3C2410_IICSTAT);
|
||||
|
||||
if (ret != num)
|
||||
dev_dbg(i2c->dev, "incomplete xfer (%d)\n", ret);
|
||||
i2c_s3c_irq_nextbyte(i2c, stat);
|
||||
|
||||
goto out;
|
||||
stat = readl(i2c->regs + S3C2410_IICSTAT);
|
||||
if (stat & S3C2410_IICSTAT_ARBITR)
|
||||
dev_err(i2c->dev, "deal with arbitration loss\n");
|
||||
}
|
||||
} else {
|
||||
timeout = wait_event_timeout(i2c->wait, i2c->msg_num == 0, HZ * 5);
|
||||
}
|
||||
|
||||
timeout = wait_event_timeout(i2c->wait, i2c->msg_num == 0, HZ * 5);
|
||||
|
||||
ret = i2c->msg_idx;
|
||||
|
||||
/*
|
||||
|
@ -3,6 +3,7 @@
|
||||
* i2c-core.h - interfaces internal to the I2C framework
|
||||
*/
|
||||
|
||||
#include <linux/kconfig.h>
|
||||
#include <linux/rwsem.h>
|
||||
|
||||
struct i2c_devinfo {
|
||||
@ -29,7 +30,8 @@ int i2c_dev_irq_from_resources(const struct resource *resources,
|
||||
*/
|
||||
static inline bool i2c_in_atomic_xfer_mode(void)
|
||||
{
|
||||
return system_state > SYSTEM_RUNNING && !preemptible();
|
||||
return system_state > SYSTEM_RUNNING &&
|
||||
(IS_ENABLED(CONFIG_PREEMPT_COUNT) ? !preemptible() : irqs_disabled());
|
||||
}
|
||||
|
||||
static inline int __i2c_lock_bus_helper(struct i2c_adapter *adap)
|
||||
|
@ -656,8 +656,10 @@ static int tiadc_probe(struct platform_device *pdev)
|
||||
platform_set_drvdata(pdev, indio_dev);
|
||||
|
||||
err = tiadc_request_dma(pdev, adc_dev);
|
||||
if (err && err == -EPROBE_DEFER)
|
||||
if (err && err != -ENODEV) {
|
||||
dev_err_probe(&pdev->dev, err, "DMA request failed\n");
|
||||
goto err_dma;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -15,8 +15,8 @@
|
||||
/* Conversion times in us */
|
||||
static const u16 ms_sensors_ht_t_conversion_time[] = { 50000, 25000,
|
||||
13000, 7000 };
|
||||
static const u16 ms_sensors_ht_h_conversion_time[] = { 16000, 3000,
|
||||
5000, 8000 };
|
||||
static const u16 ms_sensors_ht_h_conversion_time[] = { 16000, 5000,
|
||||
3000, 8000 };
|
||||
static const u16 ms_sensors_tp_conversion_time[] = { 500, 1100, 2100,
|
||||
4100, 8220, 16440 };
|
||||
|
||||
|
@ -501,13 +501,13 @@ inv_mpu6050_read_raw(struct iio_dev *indio_dev,
|
||||
ret = inv_mpu6050_sensor_show(st, st->reg->gyro_offset,
|
||||
chan->channel2, val);
|
||||
mutex_unlock(&st->lock);
|
||||
return IIO_VAL_INT;
|
||||
return ret;
|
||||
case IIO_ACCEL:
|
||||
mutex_lock(&st->lock);
|
||||
ret = inv_mpu6050_sensor_show(st, st->reg->accl_offset,
|
||||
chan->channel2, val);
|
||||
mutex_unlock(&st->lock);
|
||||
return IIO_VAL_INT;
|
||||
return ret;
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
|
@ -635,7 +635,7 @@ void mthca_free_mailbox(struct mthca_dev *dev, struct mthca_mailbox *mailbox)
|
||||
|
||||
int mthca_SYS_EN(struct mthca_dev *dev)
|
||||
{
|
||||
u64 out;
|
||||
u64 out = 0;
|
||||
int ret;
|
||||
|
||||
ret = mthca_cmd_imm(dev, 0, &out, 0, 0, CMD_SYS_EN, CMD_TIME_CLASS_D);
|
||||
@ -1955,7 +1955,7 @@ int mthca_WRITE_MGM(struct mthca_dev *dev, int index,
|
||||
int mthca_MGID_HASH(struct mthca_dev *dev, struct mthca_mailbox *mailbox,
|
||||
u16 *hash)
|
||||
{
|
||||
u64 imm;
|
||||
u64 imm = 0;
|
||||
int err;
|
||||
|
||||
err = mthca_cmd_imm(dev, mailbox->dma, &imm, 0, 0, CMD_MGID_HASH,
|
||||
|
@ -382,7 +382,7 @@ static int mthca_init_icm(struct mthca_dev *mdev,
|
||||
struct mthca_init_hca_param *init_hca,
|
||||
u64 icm_size)
|
||||
{
|
||||
u64 aux_pages;
|
||||
u64 aux_pages = 0;
|
||||
int err;
|
||||
|
||||
err = mthca_SET_ICM_SIZE(mdev, icm_size, &aux_pages);
|
||||
|
@ -266,6 +266,7 @@ static const struct xpad_device {
|
||||
{ 0x146b, 0x0604, "Bigben Interactive DAIJA Arcade Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
|
||||
{ 0x1532, 0x0a00, "Razer Atrox Arcade Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE },
|
||||
{ 0x1532, 0x0a03, "Razer Wildcat", 0, XTYPE_XBOXONE },
|
||||
{ 0x1532, 0x0a29, "Razer Wolverine V2", 0, XTYPE_XBOXONE },
|
||||
{ 0x15e4, 0x3f00, "Power A Mini Pro Elite", 0, XTYPE_XBOX360 },
|
||||
{ 0x15e4, 0x3f0a, "Xbox Airflo wired controller", 0, XTYPE_XBOX360 },
|
||||
{ 0x15e4, 0x3f10, "Batarang Xbox 360 controller", 0, XTYPE_XBOX360 },
|
||||
|
@ -715,6 +715,44 @@ static void atkbd_deactivate(struct atkbd *atkbd)
|
||||
ps2dev->serio->phys);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86
|
||||
static bool atkbd_is_portable_device(void)
|
||||
{
|
||||
static const char * const chassis_types[] = {
|
||||
"8", /* Portable */
|
||||
"9", /* Laptop */
|
||||
"10", /* Notebook */
|
||||
"14", /* Sub-Notebook */
|
||||
"31", /* Convertible */
|
||||
"32", /* Detachable */
|
||||
};
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(chassis_types); i++)
|
||||
if (dmi_match(DMI_CHASSIS_TYPE, chassis_types[i]))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* On many modern laptops ATKBD_CMD_GETID may cause problems, on these laptops
|
||||
* the controller is always in translated mode. In this mode mice/touchpads will
|
||||
* not work. So in this case simply assume a keyboard is connected to avoid
|
||||
* confusing some laptop keyboards.
|
||||
*
|
||||
* Skipping ATKBD_CMD_GETID ends up using a fake keyboard id. Using the standard
|
||||
* 0xab83 id is ok in translated mode, only atkbd_select_set() checks atkbd->id
|
||||
* and in translated mode that is a no-op.
|
||||
*/
|
||||
static bool atkbd_skip_getid(struct atkbd *atkbd)
|
||||
{
|
||||
return atkbd->translated && atkbd_is_portable_device();
|
||||
}
|
||||
#else
|
||||
static inline bool atkbd_skip_getid(struct atkbd *atkbd) { return false; }
|
||||
#endif
|
||||
|
||||
/*
|
||||
* atkbd_probe() probes for an AT keyboard on a serio port.
|
||||
*/
|
||||
@ -723,6 +761,7 @@ static int atkbd_probe(struct atkbd *atkbd)
|
||||
{
|
||||
struct ps2dev *ps2dev = &atkbd->ps2dev;
|
||||
unsigned char param[2];
|
||||
bool skip_getid;
|
||||
|
||||
/*
|
||||
* Some systems, where the bit-twiddling when testing the io-lines of the
|
||||
@ -744,17 +783,18 @@ static int atkbd_probe(struct atkbd *atkbd)
|
||||
*/
|
||||
|
||||
param[0] = param[1] = 0xa5; /* initialize with invalid values */
|
||||
if (ps2_command(ps2dev, param, ATKBD_CMD_GETID)) {
|
||||
skip_getid = atkbd_skip_getid(atkbd);
|
||||
if (skip_getid || ps2_command(ps2dev, param, ATKBD_CMD_GETID)) {
|
||||
|
||||
/*
|
||||
* If the get ID command failed, we check if we can at least set the LEDs on
|
||||
* the keyboard. This should work on every keyboard out there. It also turns
|
||||
* the LEDs off, which we want anyway.
|
||||
* If the get ID command was skipped or failed, we check if we can at least set
|
||||
* the LEDs on the keyboard. This should work on every keyboard out there.
|
||||
* It also turns the LEDs off, which we want anyway.
|
||||
*/
|
||||
param[0] = 0;
|
||||
if (ps2_command(ps2dev, param, ATKBD_CMD_SETLEDS))
|
||||
return -1;
|
||||
atkbd->id = 0xabba;
|
||||
atkbd->id = skip_getid ? 0xab83 : 0xabba;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -105,6 +105,9 @@ static int micro_key_probe(struct platform_device *pdev)
|
||||
keys->codes = devm_kmemdup(&pdev->dev, micro_keycodes,
|
||||
keys->input->keycodesize * keys->input->keycodemax,
|
||||
GFP_KERNEL);
|
||||
if (!keys->codes)
|
||||
return -ENOMEM;
|
||||
|
||||
keys->input->keycode = keys->codes;
|
||||
|
||||
__set_bit(EV_KEY, keys->input->evbit);
|
||||
|
@ -351,6 +351,14 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_DRITEK)
|
||||
},
|
||||
{
|
||||
/* Acer TravelMate P459-G2-M */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate P459-G2-M"),
|
||||
},
|
||||
.driver_data = (void *)(SERIO_QUIRK_NOMUX)
|
||||
},
|
||||
{
|
||||
/* Amoi M636/A737 */
|
||||
.matches = {
|
||||
|
@ -273,6 +273,9 @@ static struct icc_node *of_icc_get_from_provider(struct of_phandle_args *spec)
|
||||
}
|
||||
mutex_unlock(&icc_lock);
|
||||
|
||||
if (!node)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -114,6 +114,8 @@ static int dvb_device_open(struct inode *inode, struct file *file)
|
||||
err = file->f_op->open(inode, file);
|
||||
up_read(&minor_rwsem);
|
||||
mutex_unlock(&dvbdev_mutex);
|
||||
if (err)
|
||||
dvb_device_put(dvbdev);
|
||||
return err;
|
||||
}
|
||||
fail:
|
||||
|
@ -1028,6 +1028,7 @@ int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
|
||||
if (!dev->video_mode.isoc_ctl.urb) {
|
||||
dev_err(dev->dev,
|
||||
"cannot alloc memory for usb buffers\n");
|
||||
kfree(dma_q->p_left_data);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@ -1037,6 +1038,7 @@ int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
|
||||
dev_err(dev->dev,
|
||||
"cannot allocate memory for usbtransfer\n");
|
||||
kfree(dev->video_mode.isoc_ctl.urb);
|
||||
kfree(dma_q->p_left_data);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
@ -268,7 +268,8 @@ void pvr2_context_disconnect(struct pvr2_context *mp)
|
||||
{
|
||||
pvr2_hdw_disconnect(mp->hdw);
|
||||
mp->disconnect_flag = !0;
|
||||
pvr2_context_notify(mp);
|
||||
if (!pvr2_context_shutok())
|
||||
pvr2_context_notify(mp);
|
||||
}
|
||||
|
||||
|
||||
|
@ -856,9 +856,10 @@ static const struct block_device_operations mmc_bdops = {
|
||||
static int mmc_blk_part_switch_pre(struct mmc_card *card,
|
||||
unsigned int part_type)
|
||||
{
|
||||
const unsigned int mask = EXT_CSD_PART_CONFIG_ACC_RPMB;
|
||||
int ret = 0;
|
||||
|
||||
if (part_type == EXT_CSD_PART_CONFIG_ACC_RPMB) {
|
||||
if ((part_type & mask) == mask) {
|
||||
if (card->ext_csd.cmdq_en) {
|
||||
ret = mmc_cmdq_disable(card);
|
||||
if (ret)
|
||||
@ -873,9 +874,10 @@ static int mmc_blk_part_switch_pre(struct mmc_card *card,
|
||||
static int mmc_blk_part_switch_post(struct mmc_card *card,
|
||||
unsigned int part_type)
|
||||
{
|
||||
const unsigned int mask = EXT_CSD_PART_CONFIG_ACC_RPMB;
|
||||
int ret = 0;
|
||||
|
||||
if (part_type == EXT_CSD_PART_CONFIG_ACC_RPMB) {
|
||||
if ((part_type & mask) == mask) {
|
||||
mmc_retune_unpause(card->host);
|
||||
if (card->reenable_cmdq && !card->ext_csd.cmdq_en)
|
||||
ret = mmc_cmdq_enable(card);
|
||||
@ -3151,4 +3153,3 @@ module_exit(mmc_blk_exit);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("Multimedia Card (MMC) block device driver");
|
||||
|
||||
|
@ -571,6 +571,7 @@ EXPORT_SYMBOL(mmc_remove_host);
|
||||
*/
|
||||
void mmc_free_host(struct mmc_host *host)
|
||||
{
|
||||
cancel_delayed_work_sync(&host->detect);
|
||||
mmc_crypto_free_host(host);
|
||||
mmc_pwrseq_free(host);
|
||||
put_device(&host->class_dev);
|
||||
|
@ -1008,13 +1008,14 @@ config MMC_SDHCI_XENON
|
||||
|
||||
config MMC_SDHCI_OMAP
|
||||
tristate "TI SDHCI Controller Support"
|
||||
depends on ARCH_OMAP2PLUS || ARCH_KEYSTONE || COMPILE_TEST
|
||||
depends on MMC_SDHCI_PLTFM && OF
|
||||
select THERMAL
|
||||
imply TI_SOC_THERMAL
|
||||
help
|
||||
This selects the Secure Digital Host Controller Interface (SDHCI)
|
||||
support present in TI's DRA7 SOCs. The controller supports
|
||||
SD/MMC/SDIO devices.
|
||||
support present in TI's Keystone/OMAP2+/DRA7 SOCs. The controller
|
||||
supports SD/MMC/SDIO devices.
|
||||
|
||||
If you have a controller with this interface, say Y or M here.
|
||||
|
||||
|
@ -224,15 +224,19 @@ static inline void _sdhci_sprd_set_clock(struct sdhci_host *host,
|
||||
div = ((div & 0x300) >> 2) | ((div & 0xFF) << 8);
|
||||
sdhci_enable_clk(host, div);
|
||||
|
||||
val = sdhci_readl(host, SDHCI_SPRD_REG_32_BUSY_POSI);
|
||||
mask = SDHCI_SPRD_BIT_OUTR_CLK_AUTO_EN | SDHCI_SPRD_BIT_INNR_CLK_AUTO_EN;
|
||||
/* Enable CLK_AUTO when the clock is greater than 400K. */
|
||||
if (clk > 400000) {
|
||||
val = sdhci_readl(host, SDHCI_SPRD_REG_32_BUSY_POSI);
|
||||
mask = SDHCI_SPRD_BIT_OUTR_CLK_AUTO_EN |
|
||||
SDHCI_SPRD_BIT_INNR_CLK_AUTO_EN;
|
||||
if (mask != (val & mask)) {
|
||||
val |= mask;
|
||||
sdhci_writel(host, val, SDHCI_SPRD_REG_32_BUSY_POSI);
|
||||
}
|
||||
} else {
|
||||
if (val & mask) {
|
||||
val &= ~mask;
|
||||
sdhci_writel(host, val, SDHCI_SPRD_REG_32_BUSY_POSI);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -533,7 +533,7 @@ static void blktrans_notify_add(struct mtd_info *mtd)
|
||||
{
|
||||
struct mtd_blktrans_ops *tr;
|
||||
|
||||
if (mtd->type == MTD_ABSENT)
|
||||
if (mtd->type == MTD_ABSENT || mtd->type == MTD_UBIVOLUME)
|
||||
return;
|
||||
|
||||
list_for_each_entry(tr, &blktrans_majors, list)
|
||||
@ -576,7 +576,7 @@ int register_mtd_blktrans(struct mtd_blktrans_ops *tr)
|
||||
list_add(&tr->list, &blktrans_majors);
|
||||
|
||||
mtd_for_each_device(mtd)
|
||||
if (mtd->type != MTD_ABSENT)
|
||||
if (mtd->type != MTD_ABSENT && mtd->type != MTD_UBIVOLUME)
|
||||
tr->add_mtd(tr, mtd);
|
||||
|
||||
mutex_unlock(&mtd_table_mutex);
|
||||
|
@ -21,7 +21,7 @@
|
||||
|
||||
#define ERR_BYTE 0xFF /* Value returned for read
|
||||
bytes when read failed */
|
||||
#define IFC_TIMEOUT_MSECS 500 /* Maximum number of mSecs to wait
|
||||
#define IFC_TIMEOUT_MSECS 1000 /* Maximum timeout to wait
|
||||
for IFC NAND Machine */
|
||||
|
||||
struct fsl_ifc_ctrl;
|
||||
|
@ -1108,6 +1108,8 @@ static int vsc73xx_gpio_probe(struct vsc73xx *vsc)
|
||||
|
||||
vsc->gc.label = devm_kasprintf(vsc->dev, GFP_KERNEL, "VSC%04x",
|
||||
vsc->chipid);
|
||||
if (!vsc->gc.label)
|
||||
return -ENOMEM;
|
||||
vsc->gc.ngpio = 4;
|
||||
vsc->gc.owner = THIS_MODULE;
|
||||
vsc->gc.parent = vsc->dev;
|
||||
|
@ -868,10 +868,13 @@ static int atl1e_setup_ring_resources(struct atl1e_adapter *adapter)
|
||||
netdev_err(adapter->netdev, "offset(%d) > ring size(%d) !!\n",
|
||||
offset, adapter->ring_size);
|
||||
err = -1;
|
||||
goto failed;
|
||||
goto free_buffer;
|
||||
}
|
||||
|
||||
return 0;
|
||||
free_buffer:
|
||||
kfree(tx_ring->tx_buffer);
|
||||
tx_ring->tx_buffer = NULL;
|
||||
failed:
|
||||
if (adapter->ring_vir_addr != NULL) {
|
||||
pci_free_consistent(pdev, adapter->ring_size,
|
||||
|
@ -10340,6 +10340,8 @@ static void bnxt_sp_task(struct work_struct *work)
|
||||
bnxt_cfg_ntp_filters(bp);
|
||||
if (test_and_clear_bit(BNXT_HWRM_EXEC_FWD_REQ_SP_EVENT, &bp->sp_event))
|
||||
bnxt_hwrm_exec_fwd_req(bp);
|
||||
if (test_and_clear_bit(BNXT_HWRM_PF_UNLOAD_SP_EVENT, &bp->sp_event))
|
||||
netdev_info(bp->dev, "Receive PF driver unload event!\n");
|
||||
if (test_and_clear_bit(BNXT_VXLAN_ADD_PORT_SP_EVENT, &bp->sp_event)) {
|
||||
bnxt_hwrm_tunnel_dst_port_alloc(
|
||||
bp, bp->vxlan_port,
|
||||
@ -11266,8 +11268,6 @@ static void bnxt_cfg_ntp_filters(struct bnxt *bp)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (test_and_clear_bit(BNXT_HWRM_PF_UNLOAD_SP_EVENT, &bp->sp_event))
|
||||
netdev_info(bp->dev, "Receive PF driver unload event!");
|
||||
}
|
||||
|
||||
#else
|
||||
|
@ -1648,8 +1648,10 @@ static netdev_tx_t bcmgenet_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
/* Note: if we ever change from DMA_TX_APPEND_CRC below we
|
||||
* will need to restore software padding of "runt" packets
|
||||
*/
|
||||
len_stat |= DMA_TX_APPEND_CRC;
|
||||
|
||||
if (!i) {
|
||||
len_stat |= DMA_TX_APPEND_CRC | DMA_SOP;
|
||||
len_stat |= DMA_SOP;
|
||||
if (skb->ip_summed == CHECKSUM_PARTIAL)
|
||||
len_stat |= DMA_TX_DO_CSUM;
|
||||
}
|
||||
|
@ -6460,6 +6460,14 @@ static void tg3_dump_state(struct tg3 *tp)
|
||||
int i;
|
||||
u32 *regs;
|
||||
|
||||
/* If it is a PCI error, all registers will be 0xffff,
|
||||
* we don't dump them out, just report the error and return
|
||||
*/
|
||||
if (tp->pdev->error_state != pci_channel_io_normal) {
|
||||
netdev_err(tp->dev, "PCI channel ERROR!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
regs = kzalloc(TG3_REG_BLK_SIZE, GFP_ATOMIC);
|
||||
if (!regs)
|
||||
return;
|
||||
@ -11205,7 +11213,8 @@ static void tg3_reset_task(struct work_struct *work)
|
||||
rtnl_lock();
|
||||
tg3_full_lock(tp, 0);
|
||||
|
||||
if (tp->pcierr_recovery || !netif_running(tp->dev)) {
|
||||
if (tp->pcierr_recovery || !netif_running(tp->dev) ||
|
||||
tp->pdev->error_state != pci_channel_io_normal) {
|
||||
tg3_flag_clear(tp, RESET_TASK_PENDING);
|
||||
tg3_full_unlock(tp);
|
||||
rtnl_unlock();
|
||||
|
@ -110,12 +110,18 @@ static struct workqueue_struct *i40e_wq;
|
||||
static void netdev_hw_addr_refcnt(struct i40e_mac_filter *f,
|
||||
struct net_device *netdev, int delta)
|
||||
{
|
||||
struct netdev_hw_addr_list *ha_list;
|
||||
struct netdev_hw_addr *ha;
|
||||
|
||||
if (!f || !netdev)
|
||||
return;
|
||||
|
||||
netdev_for_each_mc_addr(ha, netdev) {
|
||||
if (is_unicast_ether_addr(f->macaddr) || is_link_local_ether_addr(f->macaddr))
|
||||
ha_list = &netdev->uc;
|
||||
else
|
||||
ha_list = &netdev->mc;
|
||||
|
||||
netdev_hw_addr_list_for_each(ha, ha_list) {
|
||||
if (ether_addr_equal(ha->addr, f->macaddr)) {
|
||||
ha->refcount += delta;
|
||||
if (ha->refcount <= 0)
|
||||
@ -15710,6 +15716,9 @@ static void i40e_pci_error_reset_done(struct pci_dev *pdev)
|
||||
struct i40e_pf *pf = pci_get_drvdata(pdev);
|
||||
|
||||
i40e_reset_and_rebuild(pf, false, false);
|
||||
#ifdef CONFIG_PCI_IOV
|
||||
i40e_restore_all_vfs_msi_state(pdev);
|
||||
#endif /* CONFIG_PCI_IOV */
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -99,6 +99,32 @@ void i40e_vc_notify_reset(struct i40e_pf *pf)
|
||||
(u8 *)&pfe, sizeof(struct virtchnl_pf_event));
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PCI_IOV
|
||||
void i40e_restore_all_vfs_msi_state(struct pci_dev *pdev)
|
||||
{
|
||||
u16 vf_id;
|
||||
u16 pos;
|
||||
|
||||
/* Continue only if this is a PF */
|
||||
if (!pdev->is_physfn)
|
||||
return;
|
||||
|
||||
if (!pci_num_vf(pdev))
|
||||
return;
|
||||
|
||||
pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_SRIOV);
|
||||
if (pos) {
|
||||
struct pci_dev *vf_dev = NULL;
|
||||
|
||||
pci_read_config_word(pdev, pos + PCI_SRIOV_VF_DID, &vf_id);
|
||||
while ((vf_dev = pci_get_device(pdev->vendor, vf_id, vf_dev))) {
|
||||
if (vf_dev->is_virtfn && vf_dev->physfn == pdev)
|
||||
pci_restore_msi_state(vf_dev);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_PCI_IOV */
|
||||
|
||||
/**
|
||||
* i40e_vc_notify_vf_reset
|
||||
* @vf: pointer to the VF structure
|
||||
@ -3332,16 +3358,16 @@ static int i40e_validate_cloud_filter(struct i40e_vf *vf,
|
||||
bool found = false;
|
||||
int bkt;
|
||||
|
||||
if (!tc_filter->action) {
|
||||
if (tc_filter->action != VIRTCHNL_ACTION_TC_REDIRECT) {
|
||||
dev_info(&pf->pdev->dev,
|
||||
"VF %d: Currently ADq doesn't support Drop Action\n",
|
||||
vf->vf_id);
|
||||
"VF %d: ADQ doesn't support this action (%d)\n",
|
||||
vf->vf_id, tc_filter->action);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* action_meta is TC number here to which the filter is applied */
|
||||
if (!tc_filter->action_meta ||
|
||||
tc_filter->action_meta > I40E_MAX_VF_VSI) {
|
||||
tc_filter->action_meta > vf->num_tc) {
|
||||
dev_info(&pf->pdev->dev, "VF %d: Invalid TC number %u\n",
|
||||
vf->vf_id, tc_filter->action_meta);
|
||||
goto err;
|
||||
|
@ -141,5 +141,8 @@ int i40e_ndo_set_vf_spoofchk(struct net_device *netdev, int vf_id, bool enable);
|
||||
|
||||
void i40e_vc_notify_link_state(struct i40e_pf *pf);
|
||||
void i40e_vc_notify_reset(struct i40e_pf *pf);
|
||||
#ifdef CONFIG_PCI_IOV
|
||||
void i40e_restore_all_vfs_msi_state(struct pci_dev *pdev);
|
||||
#endif /* CONFIG_PCI_IOV */
|
||||
|
||||
#endif /* _I40E_VIRTCHNL_PF_H_ */
|
||||
|
@ -687,8 +687,8 @@ static void mlx5_fw_tracer_handle_traces(struct work_struct *work)
|
||||
get_block_timestamp(tracer, &tmp_trace_block[TRACES_PER_BLOCK - 1]);
|
||||
|
||||
while (block_timestamp > tracer->last_timestamp) {
|
||||
/* Check block override if its not the first block */
|
||||
if (!tracer->last_timestamp) {
|
||||
/* Check block override if it's not the first block */
|
||||
if (tracer->last_timestamp) {
|
||||
u64 *ts_event;
|
||||
/* To avoid block override be the HW in case of buffer
|
||||
* wraparound, the time stamp of the previous block
|
||||
|
@ -290,6 +290,9 @@ int mlx5e_tc_tun_create_header_ipv4(struct mlx5e_priv *priv,
|
||||
if (err)
|
||||
goto destroy_neigh_entry;
|
||||
|
||||
e->encap_size = ipv4_encap_size;
|
||||
e->encap_header = encap_header;
|
||||
|
||||
if (!(nud_state & NUD_VALID)) {
|
||||
neigh_event_send(n, NULL);
|
||||
/* the encap entry will be made valid on neigh update event
|
||||
@ -306,8 +309,6 @@ int mlx5e_tc_tun_create_header_ipv4(struct mlx5e_priv *priv,
|
||||
goto destroy_neigh_entry;
|
||||
}
|
||||
|
||||
e->encap_size = ipv4_encap_size;
|
||||
e->encap_header = encap_header;
|
||||
e->flags |= MLX5_ENCAP_ENTRY_VALID;
|
||||
mlx5e_rep_queue_neigh_stats_work(netdev_priv(out_dev));
|
||||
neigh_release(n);
|
||||
@ -407,6 +408,9 @@ int mlx5e_tc_tun_create_header_ipv6(struct mlx5e_priv *priv,
|
||||
if (err)
|
||||
goto destroy_neigh_entry;
|
||||
|
||||
e->encap_size = ipv6_encap_size;
|
||||
e->encap_header = encap_header;
|
||||
|
||||
if (!(nud_state & NUD_VALID)) {
|
||||
neigh_event_send(n, NULL);
|
||||
/* the encap entry will be made valid on neigh update event
|
||||
@ -424,8 +428,6 @@ int mlx5e_tc_tun_create_header_ipv6(struct mlx5e_priv *priv,
|
||||
goto destroy_neigh_entry;
|
||||
}
|
||||
|
||||
e->encap_size = ipv6_encap_size;
|
||||
e->encap_header = encap_header;
|
||||
e->flags |= MLX5_ENCAP_ENTRY_VALID;
|
||||
mlx5e_rep_queue_neigh_stats_work(netdev_priv(out_dev));
|
||||
neigh_release(n);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user