Linux 5.4.165
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.4.165 kernel.
All users of the 5.4 kernel series must upgrade.
The updated 5.4.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.4.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Documentation/devicetree/bindings/net/ethernet-phy.yaml | 8 Makefile | 2 arch/x86/Kconfig | 1 arch/x86/platform/efi/quirks.c | 3 block/ioprio.c | 3 drivers/android/binder.c | 21 drivers/ata/libata-core.c | 2 drivers/clk/qcom/clk-regmap-mux.c | 2 drivers/clk/qcom/common.c | 12 drivers/clk/qcom/common.h | 2 drivers/gpu/drm/drm_syncobj.c | 11 drivers/hid/Kconfig | 10 drivers/hid/hid-asus.c | 2 drivers/hid/hid-bigbenff.c | 2 drivers/hid/hid-chicony.c | 8 drivers/hid/hid-corsair.c | 7 drivers/hid/hid-elan.c | 2 drivers/hid/hid-elo.c | 3 drivers/hid/hid-google-hammer.c | 2 drivers/hid/hid-holtek-kbd.c | 9 drivers/hid/hid-holtek-mouse.c | 9 drivers/hid/hid-ids.h | 2 drivers/hid/hid-lg.c | 10 drivers/hid/hid-logitech-dj.c | 2 drivers/hid/hid-prodikeys.c | 10 drivers/hid/hid-quirks.c | 1 drivers/hid/hid-roccat-arvo.c | 3 drivers/hid/hid-roccat-isku.c | 3 drivers/hid/hid-roccat-kone.c | 3 drivers/hid/hid-roccat-koneplus.c | 3 drivers/hid/hid-roccat-konepure.c | 3 drivers/hid/hid-roccat-kovaplus.c | 3 drivers/hid/hid-roccat-lua.c | 3 drivers/hid/hid-roccat-pyra.c | 3 drivers/hid/hid-roccat-ryos.c | 3 drivers/hid/hid-roccat-savu.c | 3 drivers/hid/hid-samsung.c | 3 drivers/hid/hid-u2fzero.c | 2 drivers/hid/hid-uclogic-core.c | 3 drivers/hid/hid-uclogic-params.c | 3 drivers/hid/wacom_sys.c | 19 drivers/iio/accel/kxcjk-1013.c | 5 drivers/iio/accel/kxsd9.c | 6 drivers/iio/accel/mma8452.c | 2 drivers/iio/adc/ad7768-1.c | 2 drivers/iio/adc/at91-sama5d2_adc.c | 3 drivers/iio/adc/axp20x_adc.c | 18 drivers/iio/adc/dln2-adc.c | 21 drivers/iio/gyro/itg3200_buffer.c | 2 drivers/iio/industrialio-trigger.c | 1 drivers/iio/light/ltr501.c | 2 drivers/iio/light/stk3310.c | 6 drivers/iio/trigger/stm32-timer-trigger.c | 2 drivers/infiniband/hw/hfi1/init.c | 2 drivers/irqchip/irq-armada-370-xp.c | 16 drivers/irqchip/irq-gic-v3-its.c | 2 drivers/irqchip/irq-nvic.c | 2 drivers/misc/fastrpc.c | 10 drivers/mtd/nand/raw/fsmc_nand.c | 36 drivers/net/bonding/bond_alb.c | 14 drivers/net/can/kvaser_pciefd.c | 8 drivers/net/can/m_can/m_can.c | 14 drivers/net/can/pch_can.c | 2 drivers/net/can/sja1000/ems_pcmcia.c | 7 drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c | 101 + drivers/net/ethernet/altera/altera_tse_main.c | 9 drivers/net/ethernet/freescale/fec.h | 3 drivers/net/ethernet/freescale/fec_main.c | 2 drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 75 - drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h | 2 drivers/net/ethernet/intel/iavf/iavf_ethtool.c | 43 drivers/net/ethernet/intel/iavf/iavf_main.c | 1 drivers/net/ethernet/intel/ice/ice_main.c | 3 drivers/net/ethernet/netronome/nfp/nfpcore/nfp_cppcore.c | 4 drivers/net/ethernet/qlogic/qede/qede_fp.c | 7 drivers/net/ethernet/qlogic/qla3xxx.c | 19 drivers/net/usb/cdc_ncm.c | 2 drivers/net/vrf.c | 8 drivers/tty/serial/serial-tegra.c | 4 drivers/usb/core/config.c | 6 drivers/usb/gadget/composite.c | 14 drivers/usb/gadget/legacy/dbgp.c | 15 drivers/usb/gadget/legacy/inode.c | 16 drivers/usb/host/xhci-hub.c | 1 drivers/usb/host/xhci-ring.c | 1 drivers/usb/host/xhci.c | 26 fs/aio.c | 184 ++ fs/btrfs/extent_io.c | 6 fs/btrfs/root-tree.c | 3 fs/nfsd/nfs4recover.c | 1 fs/nfsd/nfsctl.c | 14 fs/ntfs/dir.c | 2 fs/ntfs/inode.c | 27 fs/ntfs/inode.h | 4 fs/ntfs/mft.c | 4 fs/signalfd.c | 12 fs/tracefs/inode.c | 76 + include/linux/hid.h | 5 include/linux/wait.h | 26 include/net/bond_alb.h | 2 include/uapi/asm-generic/poll.h | 2 kernel/bpf/verifier.c | 2 kernel/sched/wait.c | 7 mm/backing-dev.c | 7 net/core/neighbour.c | 3 net/ipv4/udp.c | 2 net/ipv6/seg6_iptunnel.c | 8 net/nfc/netlink.c | 6 sound/core/control_compat.c | 3 sound/core/oss/pcm_oss.c | 37 sound/pci/hda/patch_realtek.c | 40 sound/soc/qcom/qdsp6/q6routing.c | 8 tools/build/Makefile.feature | 1 tools/build/feature/Makefile | 4 tools/build/feature/test-all.c | 5 tools/build/feature/test-libpython-version.c | 11 tools/perf/Makefile.config | 2 tools/testing/selftests/bpf/verifier/xdp_direct_packet_access.c | 632 +++++++++- tools/testing/selftests/net/fib_tests.sh | 59 tools/testing/selftests/netfilter/Makefile | 3 tools/testing/selftests/netfilter/conntrack_vrf.sh | 241 +++ 121 files changed, 1810 insertions(+), 390 deletions(-)
Alan Young (1):
ALSA: ctl: Fix copy of updated id with element read/write
Alexander Stein (1):
dt-bindings: net: Reintroduce PHY no lane swap binding
Alexander Sverdlin (1):
nfsd: Fix nsfd startup race (again)
Alyssa Ross (1):
iio: trigger: stm32-timer: fix MODULE_ALIAS
Andrea Mayer (1):
seg6: fix the iif in the IPv6 socket control block
Arnaldo Carvalho de Melo (1):
tools build: Remove needless libpython-version feature check that breaks test-all fast path
Bas Nieuwenhuizen (1):
drm/syncobj: Deal with signalled fences in drm_syncobj_find_fence.
Benjamin Tissoires (1):
HID: bigbenff: prevent null pointer dereference
Brian Silverman (1):
can: m_can: Disable and ignore ELO interrupt
Dan Carpenter (3):
can: sja1000: fix use after free in ems_pcmcia_add_card()
net: altera: set a couple error code in probe() net/qla3xxx: fix an error code in ql_adapter_up()
Davidlohr Bueso (1):
block: fix ioprio_get(IOPRIO_WHO_PGRP) vs setuid(2)
Dmitry Baryshkov (1):
clk: qcom: regmap-mux: fix parent clock lookup
Eric Biggers (5):
wait: add wake_up_pollfree()
binder: use wake_up_pollfree()
signalfd: use wake_up_pollfree()
aio: keep poll requests on waitqueue until completed
aio: fix use-after-free due to missing POLLFREE handling
Eric Dumazet (2):
bonding: make tx_rebalance_counter an atomic net, neigh: clear whole pneigh_entry at alloc time
Evgeny Boger (1):
iio: adc: axp20x_adc: fix charging current reporting on AXP22x
Florian Westphal (1):
selftests: netfilter: add a vrf+conntrack testcase
Greg Kroah-Hartman (9):
HID: add hid_is_usb() function to make it simpler for USB detection
HID: add USB_HID dependancy to hid-prodikeys
HID: add USB_HID dependancy to hid-chicony
HID: add USB_HID dependancy on some USB HID drivers
HID: wacom: fix problems when device is not a valid USB device
HID: check for valid USB device for many HID drivers
USB: gadget: detect too-big endpoint 0 requests
USB: gadget: zero allocate endpoint 0 buffers
Linux 5.4.165
Gwendal Grignou (1):
iio: at91-sama5d2: Fix incorrect sign extension
Hannes Reinecke (1):
libata: add horkage for ASMedia 1092
Hans de Goede (1):
HID: quirks: Add quirk for the Microsoft Surface 3 type-cover
Herve Codina (2):
mtd: rawnand: fsmc: Take instruction delay into account
mtd: rawnand: fsmc: Fix timing computation
Jesse Brandeburg (1):
ice: ignore dropped packets during init
Jeya R (1):
misc: fastrpc: fix improper packet size calculation
Jianglei Nie (1):
nfp: Fix memory leak in nfp_cpp_area_cache_add()
Jianguo Wu (1):
udp: using datalen to cap max gso segments
Jimmy Assarsson (2):
can: kvaser_usb: get CAN clock frequency from device
can: kvaser_pciefd: kvaser_pciefd_rx_error_frame(): increase correct stats->{rx,tx}_errors counter
Joakim Zhang (1):
net: fec: only clear interrupt of handling queue in fec_enet_rx_queue()
Josef Bacik (1):
btrfs: clear extent buffer uptodate when we fail to write it
Kai-Heng Feng (1):
xhci: Remove CONFIG_USB_DEFAULT_PERSIST to prevent xHCI from runtime suspending
Kailang Yang (1):
ALSA: hda/realtek - Add headset Mic support for Lenovo ALC897 platform
Karen Sornek (1):
i40e: Fix failed opcode appearing if handling messages from VF
Krzysztof Kozlowski (1):
nfc: fix potential NULL pointer deref in nfc_genl_dump_ses_done
Lars-Peter Clausen (8):
iio: trigger: Fix reference counting
iio: stk3310: Don't return error code in interrupt handler
iio: mma8452: Fix trigger reference couting
iio: ltr501: Don't return error code in trigger handler
iio: kxsd9: Don't return error code in trigger handler
iio: itg3200: Call iio_trigger_notify_done() on error
iio: dln2: Check return value of devm_iio_trigger_register()
iio: ad7768-1: Call iio_trigger_notify_done() on error
Lee Jones (1):
net: cdc_ncm: Allow for dwNtbOutMaxSize to be unset or zero
Luca Stefani (1):
ntfs: fix ntfs_test_inode and ntfs_init_locked_inode function type
Manish Chopra (1):
qede: validate non LSO skb length
Manjong Lee (1):
mm: bdi: initialize bdi_min_ratio when bdi is unregistered
Mateusz Palczewski (1):
i40e: Fix pre-set max number of queues for VF
Mathias Nyman (1):
xhci: avoid race between disable slot command and host runtime suspend
Maxim Mikityanskiy (2):
bpf: Fix the off-by-two error in range markings
bpf: Add selftests to cover packet access corner cases
Michal Maloszewski (1):
iavf: Fix reporting when setting descriptor count
Mike Marciniszyn (1):
IB/hfi1: Correct guard on eager buffer deallocation
Mitch Williams (1):
iavf: restore MSI state on reset
Nicolas Dichtel (1):
vrf: don't run conntrack on vrf with !dflt qdisc
Noralf Trønnes (1):
iio: dln2-adc: Fix lockdep complaint
Pali Rohár (2):
irqchip/armada-370-xp: Fix return value of armada_370_xp_msi_alloc() irqchip/armada-370-xp: Fix support for Multi-MSI interrupts
Patrik John (1):
serial: tegra: Change lower tolerance baud rate limit for tegra20 and tegra30
Pavel Hofman (2):
usb: core: config: fix validation of wMaxPacketValue entries
usb: core: config: using bit mask instead of individual bits
Peilin Ye (1):
selftests/fib_tests: Rework fib_rp_filter_test()
Qu Wenruo (1):
btrfs: replace the BUG_ON in btrfs_del_root_ref with proper error handling
Srinivas Kandagatla (1):
ASoC: qdsp6: q6routing: Fix return value from msm_routing_put_audio_mixer
Steven Rostedt (VMware) (2):
tracefs: Have new files inherit the ownership of their parent
tracefs: Set all files to the same group ownership as the mount option
Takashi Iwai (3):
ALSA: pcm: oss: Fix negative period/buffer sizes
ALSA: pcm: oss: Limit the period size to 16MB
ALSA: pcm: oss: Handle missing errors in snd_pcm_oss_change_params*()
Tom Lendacky (1):
x86/sme: Explicitly map new EFI memmap table as encrypted
Vincent Mailhol (1):
can: pch_can: pch_can_rx_normal: fix use after free
Vladimir Murzin (1):
irqchip: nvic: Fix offset for Interrupt Priority Offsets
Wudi Wang (1):
irqchip/irq-gic-v3-its.c: Force synchronisation when issuing INVALL
Yang Yingliang (1):
iio: accel: kxcjk-1013: Fix possible memory leak in probe and remove
xiazhengqiao (1):
HID: google: add eel USB id
Greg Kroah-Hartman
maintainerDocumentation/devicetree/bindings/net/ethernet-phy.yaml +8 -0
@@ -87,6 +87,14 @@ properties: compensate for the board being designed with the lanes swapped. + enet-phy-lane-no-swap: + $ref: /schemas/types.yaml#/definitions/flag + description: + If set, indicates that PHY will disable swap of the + TX/RX lanes. This property allows the PHY to work correcly after + e.g. wrong bootstrap configuration caused by issues in PCB + layout design. + eee-broken-100tx: $ref: /schemas/types.yaml#definitions/flag description:
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 4 -SUBLEVEL = 164 +SUBLEVEL = 165 EXTRAVERSION = NAME = Kleptomaniac Octopus
arch/x86/Kconfig +1 -0
@@ -1990,6 +1990,7 @@ config EFI depends on ACPI select UCS2_STRING select EFI_RUNTIME_WRAPPERS + select ARCH_USE_MEMREMAP_PROT ---help--- This enables the kernel to use EFI runtime services that are available (such as the EFI variable services).
arch/x86/platform/efi/quirks.c +2 -1
@@ -279,7 +279,8 @@ void __init efi_arch_mem_reserve(phys_addr_t addr, u64 size)return ; } - new =early_memremap (new_phys, new_size); + new =early_memremap_prot (new_phys, new_size, +pgprot_val (pgprot_encrypted (FIXMAP_PAGE_NORMAL )));if (!new) {pr_err ("Failed to map new boot services memmap\n" );return ;
block/ioprio.c +3 -0
@@ -207,6 +207,7 @@ SYSCALL_DEFINE2(ioprio_get, int, which, int, who) pgrp =task_pgrp (current); else pgrp =find_vpid (who); +read_lock (&tasklist_lock); do_each_pid_thread(pgrp, PIDTYPE_PGID, p) { tmpio =get_task_ioprio (p);if (tmpio <0 )
@@ -216,6 +217,8 @@ SYSCALL_DEFINE2(ioprio_get, int, which, int, who)else ret =ioprio_best (ret, tmpio); }while_each_pid_thread (pgrp,PIDTYPE_PGID , p); +read_unlock (&tasklist_lock); +break ;case IOPRIO_WHO_USER : uid =make_kuid (current_user_ns (), who);
drivers/android/binder.c +9 -12
@@ -4788,23 +4788,20 @@ static int binder_thread_release(struct binder_proc *proc,__release (&t->lock);/* -* If this thread used poll, make sure we remove the waitqueue -* from any epoll data structures holding it with POLLFREE. -* waitqueue_active() is safe to use here because we're holding -* the inner lock. +* If this thread used poll, make sure we remove the waitqueue from any +* poll data structures holding it. */ -if ((thread->looper &BINDER_LOOPER_STATE_POLL ) && -waitqueue_active (&thread->wait)) { -wake_up_poll (&thread->wait,EPOLLHUP |POLLFREE ); - } +if (thread->looper &BINDER_LOOPER_STATE_POLL ) +wake_up_pollfree (&thread->wait);binder_inner_proc_unlock (thread->proc);/* -* This is needed to avoid races between wake_up_poll() above and -* and ep_remove_waitqueue() called for other reasons (eg the epoll file -* descriptor being closed); ep_remove_waitqueue() holds an RCU read -* lock, so we can be sure it's done after calling synchronize_rcu(). +* This is needed to avoid races between wake_up_pollfree() above and +* someone else removing the last entry from the queue for other reasons +* (e.g. ep_remove_wait_queue() being called due to an epoll file +* descriptor being closed). Such other users hold an RCU read lock, so +* we can be sure they're done after we call synchronize_rcu(). */ if (thread->looper &BINDER_LOOPER_STATE_POLL )synchronize_rcu ();
drivers/ata/libata-core.c +2 -0
@@ -4437,6 +4437,8 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { { "VRFDFC22048UCHC-TE*", NULL, ATA_HORKAGE_NODMA },/* Odd clown on sil3726/4726 PMPs */ { "Config Disk", NULL, ATA_HORKAGE_DISABLE }, +/* Similar story with ASMedia 1092 */ + { "ASMT109x- Config", NULL, ATA_HORKAGE_DISABLE },/* Weird ATAPI devices */ { "TORiSAN DVD-ROM DRD-N216", NULL, ATA_HORKAGE_MAX_SEC_128 },
drivers/clk/qcom/clk-regmap-mux.c +1 -1
@@ -28,7 +28,7 @@ static u8 mux_get_parent(struct clk_hw *hw) val &= mask;if (mux->parent_map) -return qcom_find_src_index (hw, mux->parent_map, val); +return qcom_find_cfg_index (hw, mux->parent_map, val);return val; }
drivers/clk/qcom/common.c +12 -0
@@ -69,6 +69,18 @@ int qcom_find_src_index(struct clk_hw *hw, const struct parent_map *map, u8 src) }EXPORT_SYMBOL_GPL (qcom_find_src_index); +int qcom_find_cfg_index (struct clk_hw *hw,const struct parent_map *map,u8 cfg) +{ +int i, num_parents =clk_hw_get_num_parents (hw); + +for (i =0 ; i < num_parents; i++) +if (cfg == map[i].cfg) +return i; + +return -ENOENT ; +} +EXPORT_SYMBOL_GPL (qcom_find_cfg_index); +struct regmap *qcom_cc_map (struct platform_device *pdev,const struct qcom_cc_desc *desc) {
drivers/clk/qcom/common.h +2 -0
@@ -49,6 +49,8 @@ extern void qcom_pll_set_fsm_mode(struct regmap *m, u32 reg, u8 bias_count, u8 lock_count);extern int qcom_find_src_index (struct clk_hw *hw,const struct parent_map *map,u8 src); +extern int qcom_find_cfg_index (struct clk_hw *hw,const struct parent_map *map, +u8 cfg);extern int qcom_cc_register_board_clk (struct device *dev,const char *path,const char *name,unsigned long rate);
drivers/gpu/drm/drm_syncobj.c +10 -1
@@ -329,8 +329,17 @@ int drm_syncobj_find_fence(struct drm_file *file_private,if (*fence) { ret =dma_fence_chain_find_seqno (fence, point); -if (!ret) +if (!ret) { +/* If the requested seqno is already signaled +* drm_syncobj_find_fence may return a NULL +* fence. To make sure the recipient gets +* signalled, use a new fence instead. +*/ +if (!*fence) + *fence =dma_fence_get_stub (); + goto out; + }dma_fence_put (*fence); }else { ret = -EINVAL ;
drivers/hid/Kconfig +5 -5
@@ -206,14 +206,14 @@ config HID_CHERRY config HID_CHICONY tristate "Chicony devices" - depends on HID + depends on USB_HID default !EXPERT ---help--- Support for Chicony Tactical pad and special keys on Chicony keyboards. config HID_CORSAIR tristate "Corsair devices" - depends on HID && USB && LEDS_CLASS + depends on USB_HID && LEDS_CLASS ---help--- Support for Corsair devices that are not fully compliant with the HID standard.
@@ -244,7 +244,7 @@ config HID_MACALLY config HID_PRODIKEYS tristate "Prodikeys PC-MIDI Keyboard support" - depends on HID && SND + depends on USB_HID && SND select SND_RAWMIDI ---help--- Support for Prodikeys PC-MIDI Keyboard device support.
@@ -524,7 +524,7 @@ config HID_LENOVO config HID_LOGITECH tristate "Logitech devices" - depends on HID + depends on USB_HID default !EXPERT ---help--- Support for Logitech devices that are not fully compliant with HID standard.
@@ -871,7 +871,7 @@ config HID_SAITEK config HID_SAMSUNG tristate "Samsung InfraRed remote control or keyboards" - depends on HID + depends on USB_HID ---help--- Support for Samsung InfraRed remote control or keyboards.
drivers/hid/hid-asus.c +1 -1
@@ -849,7 +849,7 @@ static int asus_probe(struct hid_device *hdev, const struct hid_device_id *id)if (drvdata->quirks &QUIRK_IS_MULTITOUCH ) drvdata->tp = &asus_i2c_tp; -if (drvdata->quirks &QUIRK_T100_KEYBOARD ) { +if ((drvdata->quirks &QUIRK_T100_KEYBOARD ) &&hid_is_usb (hdev)) {struct usb_interface *intf =to_usb_interface (hdev->dev.parent);if (intf->altsetting->desc.bInterfaceNumber ==T100_TPAD_INTF ) {
drivers/hid/hid-bigbenff.c +1 -1
@@ -191,7 +191,7 @@ static void bigben_worker(struct work_struct *work) struct bigben_device, worker);struct hid_field *report_field = bigben->report->field[0 ]; -if (bigben->removed) +if (bigben->removed || !report_field)return ;if (bigben->work_led) {
drivers/hid/hid-chicony.c +6 -2
@@ -58,8 +58,12 @@ static int ch_input_mapping(struct hid_device *hdev, struct hid_input *hi,static __u8 *ch_switch12_report_fixup (struct hid_device *hdev,__u8 *rdesc,unsigned int *rsize) { -struct usb_interface *intf =to_usb_interface (hdev->dev.parent); - +struct usb_interface *intf; + +if (!hid_is_usb (hdev)) +return rdesc; + + intf =to_usb_interface (hdev->dev.parent);if (intf->cur_altsetting->desc.bInterfaceNumber ==1 ) {/* Change usage maximum and logical maximum from 0x7fff to * 0x2fff, so they don't exceed HID_MAX_USAGES */
drivers/hid/hid-corsair.c +6 -1
@@ -553,7 +553,12 @@ static int corsair_probe(struct hid_device *dev, const struct hid_device_id *id)int ret;unsigned long quirks = id->driver_data;struct corsair_drvdata *drvdata; -struct usb_interface *usbif =to_usb_interface (dev->dev.parent); +struct usb_interface *usbif; + +if (!hid_is_usb (dev)) +return -EINVAL ; + + usbif =to_usb_interface (dev->dev.parent); drvdata =devm_kzalloc (&dev->dev,sizeof (struct corsair_drvdata ),GFP_KERNEL );
drivers/hid/hid-elan.c +1 -1
@@ -50,7 +50,7 @@ struct elan_drvdata {static int is_not_elan_touchpad (struct hid_device *hdev) { -if (hdev->bus ==BUS_USB ) { +if (hid_is_usb (hdev)) {struct usb_interface *intf =to_usb_interface (hdev->dev.parent); return (intf->altsetting->desc.bInterfaceNumber !=
drivers/hid/hid-elo.c +3 -0
@@ -229,6 +229,9 @@ static int elo_probe(struct hid_device *hdev, const struct hid_device_id *id)struct elo_priv *priv;int ret; +if (!hid_is_usb (hdev)) +return -EINVAL ; + priv =kzalloc (sizeof (*priv),GFP_KERNEL );if (!priv)return -ENOMEM ;
drivers/hid/hid-google-hammer.c +2 -0
@@ -469,6 +469,8 @@ static int hammer_probe(struct hid_device *hdev,static const struct hid_device_id hammer_devices[] = { {HID_DEVICE (BUS_USB ,HID_GROUP_GENERIC ,USB_VENDOR_ID_GOOGLE ,USB_DEVICE_ID_GOOGLE_DON ) }, + {HID_DEVICE (BUS_USB ,HID_GROUP_GENERIC , +USB_VENDOR_ID_GOOGLE ,USB_DEVICE_ID_GOOGLE_EEL ) }, {HID_DEVICE (BUS_USB ,HID_GROUP_GENERIC ,USB_VENDOR_ID_GOOGLE ,USB_DEVICE_ID_GOOGLE_HAMMER ) }, { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
drivers/hid/hid-holtek-kbd.c +7 -2
@@ -140,12 +140,17 @@ static int holtek_kbd_input_event(struct input_dev *dev, unsigned int type,static int holtek_kbd_probe (struct hid_device *hdev,const struct hid_device_id *id) { -struct usb_interface *intf =to_usb_interface (hdev->dev.parent); -int ret =hid_parse (hdev); +struct usb_interface *intf; +int ret; + +if (!hid_is_usb (hdev)) +return -EINVAL ; + ret =hid_parse (hdev);if (!ret) ret =hid_hw_start (hdev,HID_CONNECT_DEFAULT ); + intf =to_usb_interface (hdev->dev.parent);if (!ret && intf->cur_altsetting->desc.bInterfaceNumber ==1 ) {struct hid_input *hidinput;list_for_each_entry (hidinput, &hdev->inputs, list) {
drivers/hid/hid-holtek-mouse.c +9 -0
@@ -62,6 +62,14 @@ static __u8 *holtek_mouse_report_fixup(struct hid_device *hdev, __u8 *rdesc,return rdesc; } +static int holtek_mouse_probe (struct hid_device *hdev, +const struct hid_device_id *id) +{ +if (!hid_is_usb (hdev)) +return -EINVAL ; +return 0 ; +} +static const struct hid_device_id holtek_mouse_devices[] = { {HID_USB_DEVICE (USB_VENDOR_ID_HOLTEK_ALT ,USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A067 ) },
@@ -83,6 +91,7 @@ static struct hid_driver holtek_mouse_driver = { .name = "holtek_mouse", .id_table = holtek_mouse_devices, .report_fixup = holtek_mouse_report_fixup, + .probe = holtek_mouse_probe, };module_hid_driver (holtek_mouse_driver);
drivers/hid/hid-ids.h +2 -0
@@ -489,6 +489,7 @@#define USB_DEVICE_ID_GOOGLE_MAGNEMITE 0x503d#define USB_DEVICE_ID_GOOGLE_MOONBALL 0x5044#define USB_DEVICE_ID_GOOGLE_DON 0x5050 +#define USB_DEVICE_ID_GOOGLE_EEL 0x5057#define USB_VENDOR_ID_GOTOP 0x08f2#define USB_DEVICE_ID_SUPER_Q2 0x007f
@@ -858,6 +859,7 @@#define USB_DEVICE_ID_MS_TOUCH_COVER_2 0x07a7#define USB_DEVICE_ID_MS_TYPE_COVER_2 0x07a9#define USB_DEVICE_ID_MS_POWER_COVER 0x07da +#define USB_DEVICE_ID_MS_SURFACE3_COVER 0x07de#define USB_DEVICE_ID_MS_XBOX_ONE_S_CONTROLLER 0x02fd#define USB_DEVICE_ID_MS_PIXART_MOUSE 0x00cb#define USB_DEVICE_ID_8BITDO_SN30_PRO_PLUS 0x02e0
drivers/hid/hid-lg.c +8 -2
@@ -769,12 +769,18 @@ static int lg_raw_event(struct hid_device *hdev, struct hid_report *report,static int lg_probe (struct hid_device *hdev,const struct hid_device_id *id) { -struct usb_interface *iface =to_usb_interface (hdev->dev.parent); -__u8 iface_num = iface->cur_altsetting->desc.bInterfaceNumber; +struct usb_interface *iface; +__u8 iface_num;unsigned int connect_mask =HID_CONNECT_DEFAULT ;struct lg_drv_data *drv_data;int ret; +if (!hid_is_usb (hdev)) +return -EINVAL ; + + iface =to_usb_interface (hdev->dev.parent); + iface_num = iface->cur_altsetting->desc.bInterfaceNumber; +/* G29 only work with the 1st interface */ if ((hdev->product ==USB_DEVICE_ID_LOGITECH_G29_WHEEL ) && (iface_num !=0 )) {
drivers/hid/hid-logitech-dj.c +1 -1
@@ -1686,7 +1686,7 @@ static int logi_dj_probe(struct hid_device *hdev,case recvr_type_27mhz: no_dj_interfaces =2 ;break ;case recvr_type_bluetooth: no_dj_interfaces =2 ;break ; } -if (hid_is_using_ll_driver (hdev, &usb_hid_driver)) { +if (hid_is_usb (hdev)) { intf =to_usb_interface (hdev->dev.parent);if (intf && intf->altsetting->desc.bInterfaceNumber >= no_dj_interfaces) {
drivers/hid/hid-prodikeys.c +8 -2
@@ -798,12 +798,18 @@ static int pk_raw_event(struct hid_device *hdev, struct hid_report *report,static int pk_probe (struct hid_device *hdev,const struct hid_device_id *id) {int ret; -struct usb_interface *intf =to_usb_interface (hdev->dev.parent); -unsigned short ifnum = intf->cur_altsetting->desc.bInterfaceNumber; +struct usb_interface *intf; +unsigned short ifnum;unsigned long quirks = id->driver_data;struct pk_device *pk;struct pcmidi_snd *pm =NULL ; +if (!hid_is_usb (hdev)) +return -EINVAL ; + + intf =to_usb_interface (hdev->dev.parent); + ifnum = intf->cur_altsetting->desc.bInterfaceNumber; + pk =kzalloc (sizeof (*pk),GFP_KERNEL );if (pk ==NULL ) {hid_err (hdev,"can't alloc descriptor\n" );
drivers/hid/hid-quirks.c +1 -0
@@ -124,6 +124,7 @@ static const struct hid_device_id hid_quirks[] = { { HID_USB_DEVICE(USB_VENDOR_ID_MCS, USB_DEVICE_ID_MCS_GAMEPADBLOCK), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PIXART_MOUSE), HID_QUIRK_ALWAYS_POLL }, { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_POWER_COVER), HID_QUIRK_NO_INIT_REPORTS }, + { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE3_COVER), HID_QUIRK_NO_INIT_REPORTS }, { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_PRO_2), HID_QUIRK_NO_INIT_REPORTS }, { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TOUCH_COVER_2), HID_QUIRK_NO_INIT_REPORTS }, { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_2), HID_QUIRK_NO_INIT_REPORTS },
drivers/hid/hid-roccat-arvo.c +3 -0
@@ -344,6 +344,9 @@ static int arvo_probe(struct hid_device *hdev, {int retval; +if (!hid_is_usb (hdev)) +return -EINVAL ; + retval =hid_parse (hdev);if (retval) {hid_err (hdev,"parse failed\n" );
drivers/hid/hid-roccat-isku.c +3 -0
@@ -324,6 +324,9 @@ static int isku_probe(struct hid_device *hdev, {int retval; +if (!hid_is_usb (hdev)) +return -EINVAL ; + retval =hid_parse (hdev);if (retval) {hid_err (hdev,"parse failed\n" );
drivers/hid/hid-roccat-kone.c +3 -0
@@ -749,6 +749,9 @@ static int kone_probe(struct hid_device *hdev, const struct hid_device_id *id) {int retval; +if (!hid_is_usb (hdev)) +return -EINVAL ; + retval =hid_parse (hdev);if (retval) {hid_err (hdev,"parse failed\n" );
drivers/hid/hid-roccat-koneplus.c +3 -0
@@ -431,6 +431,9 @@ static int koneplus_probe(struct hid_device *hdev, {int retval; +if (!hid_is_usb (hdev)) +return -EINVAL ; + retval =hid_parse (hdev);if (retval) {hid_err (hdev,"parse failed\n" );
drivers/hid/hid-roccat-konepure.c +3 -0
@@ -133,6 +133,9 @@ static int konepure_probe(struct hid_device *hdev, {int retval; +if (!hid_is_usb (hdev)) +return -EINVAL ; + retval =hid_parse (hdev);if (retval) {hid_err (hdev,"parse failed\n" );
drivers/hid/hid-roccat-kovaplus.c +3 -0
@@ -501,6 +501,9 @@ static int kovaplus_probe(struct hid_device *hdev, {int retval; +if (!hid_is_usb (hdev)) +return -EINVAL ; + retval =hid_parse (hdev);if (retval) {hid_err (hdev,"parse failed\n" );
drivers/hid/hid-roccat-lua.c +3 -0
@@ -160,6 +160,9 @@ static int lua_probe(struct hid_device *hdev, {int retval; +if (!hid_is_usb (hdev)) +return -EINVAL ; + retval =hid_parse (hdev);if (retval) {hid_err (hdev,"parse failed\n" );
drivers/hid/hid-roccat-pyra.c +3 -0
@@ -449,6 +449,9 @@ static int pyra_probe(struct hid_device *hdev, const struct hid_device_id *id) {int retval; +if (!hid_is_usb (hdev)) +return -EINVAL ; + retval =hid_parse (hdev);if (retval) {hid_err (hdev,"parse failed\n" );
drivers/hid/hid-roccat-ryos.c +3 -0
@@ -141,6 +141,9 @@ static int ryos_probe(struct hid_device *hdev, {int retval; +if (!hid_is_usb (hdev)) +return -EINVAL ; + retval =hid_parse (hdev);if (retval) {hid_err (hdev,"parse failed\n" );
drivers/hid/hid-roccat-savu.c +3 -0
@@ -113,6 +113,9 @@ static int savu_probe(struct hid_device *hdev, {int retval; +if (!hid_is_usb (hdev)) +return -EINVAL ; + retval =hid_parse (hdev);if (retval) {hid_err (hdev,"parse failed\n" );
drivers/hid/hid-samsung.c +3 -0
@@ -152,6 +152,9 @@ static int samsung_probe(struct hid_device *hdev,int ret;unsigned int cmask =HID_CONNECT_DEFAULT ; +if (!hid_is_usb (hdev)) +return -EINVAL ; + ret =hid_parse (hdev);if (ret) {hid_err (hdev,"parse failed\n" );
drivers/hid/hid-u2fzero.c +1 -1
@@ -290,7 +290,7 @@ static int u2fzero_probe(struct hid_device *hdev,unsigned int minor;int ret; -if (!hid_is_using_ll_driver (hdev, &usb_hid_driver)) +if (!hid_is_usb (hdev))return -EINVAL ; dev =devm_kzalloc (&hdev->dev,sizeof (*dev),GFP_KERNEL );
drivers/hid/hid-uclogic-core.c +3 -0
@@ -164,6 +164,9 @@ static int uclogic_probe(struct hid_device *hdev,struct uclogic_drvdata *drvdata =NULL ;bool params_initialized = false; +if (!hid_is_usb (hdev)) +return -EINVAL ; +/* * libinput requires the pad interface to be on a different node * than the pen, so use QUIRK_MULTI_INPUT for all tablets.
drivers/hid/hid-uclogic-params.c +1 -2
@@ -841,8 +841,7 @@ int uclogic_params_init(struct uclogic_params *params,struct uclogic_params p = {0 , };/* Check arguments */ -if (params ==NULL || hdev ==NULL || - !hid_is_using_ll_driver (hdev, &usb_hid_driver)) { +if (params ==NULL || hdev ==NULL || !hid_is_usb (hdev)) { rc = -EINVAL ; goto cleanup; }
drivers/hid/wacom_sys.c +13 -6
@@ -726,7 +726,7 @@ static void wacom_retrieve_hid_descriptor(struct hid_device *hdev,* Skip the query for this type and modify defaults based on * interface number. */ -if (features->type ==WIRELESS ) { +if (features->type ==WIRELESS && intf) {if (intf->cur_altsetting->desc.bInterfaceNumber ==0 ) features->device_type =WACOM_DEVICETYPE_WL_MONITOR ;else
@@ -2217,7 +2217,7 @@ static void wacom_update_name(struct wacom *wacom, const char *suffix)if ((features->type ==HID_GENERIC ) && !strcmp ("Wacom HID" , features->name)) {char *product_name = wacom->hdev->name; -if (hid_is_using_ll_driver (wacom->hdev, &usb_hid_driver)) { +if (hid_is_usb (wacom->hdev)) {struct usb_interface *intf =to_usb_interface (wacom->hdev->dev.parent);struct usb_device *dev =interface_to_usbdev (intf); product_name = dev->product;
@@ -2448,6 +2448,9 @@ static void wacom_wireless_work(struct work_struct *work)wacom_destroy_battery (wacom); +if (!usbdev) +return ; +/* Stylus interface */ hdev1 =usb_get_intfdata (usbdev->config->interface[1 ]); wacom1 =hid_get_drvdata (hdev1);
@@ -2727,8 +2730,6 @@ static void wacom_mode_change_work(struct work_struct *work)static int wacom_probe (struct hid_device *hdev,const struct hid_device_id *id) { -struct usb_interface *intf =to_usb_interface (hdev->dev.parent); -struct usb_device *dev =interface_to_usbdev (intf);struct wacom *wacom;struct wacom_wac *wacom_wac;struct wacom_features *features;
@@ -2763,8 +2764,14 @@ static int wacom_probe(struct hid_device *hdev, wacom_wac->hid_data.inputmode =-1 ; wacom_wac->mode_report =-1 ; - wacom->usbdev = dev; - wacom->intf = intf; +if (hid_is_usb (hdev)) { +struct usb_interface *intf =to_usb_interface (hdev->dev.parent); +struct usb_device *dev =interface_to_usbdev (intf); + + wacom->usbdev = dev; + wacom->intf = intf; + } +mutex_init (&wacom->lock);INIT_DELAYED_WORK (&wacom->init_work, wacom_init_work);INIT_WORK (&wacom->wireless_work, wacom_wireless_work);
drivers/iio/accel/kxcjk-1013.c +2 -3
@@ -1415,8 +1415,7 @@ static int kxcjk1013_probe(struct i2c_client *client,return 0 ; err_buffer_cleanup: -if (data->dready_trig) -iio_triggered_buffer_cleanup (indio_dev); +iio_triggered_buffer_cleanup (indio_dev); err_trigger_unregister:if (data->dready_trig)iio_trigger_unregister (data->dready_trig);
@@ -1439,8 +1438,8 @@ static int kxcjk1013_remove(struct i2c_client *client)pm_runtime_set_suspended (&client->dev);pm_runtime_put_noidle (&client->dev); +iio_triggered_buffer_cleanup (indio_dev);if (data->dready_trig) { -iio_triggered_buffer_cleanup (indio_dev);iio_trigger_unregister (data->dready_trig);iio_trigger_unregister (data->motion_trig); }
drivers/iio/accel/kxsd9.c +3 -3
@@ -224,14 +224,14 @@ static irqreturn_t kxsd9_trigger_handler(int irq, void *p) hw_values.chan, sizeof(hw_values.chan));if (ret) { -dev_err (st->dev, -"error reading data\n" ); -return ret; +dev_err (st->dev,"error reading data: %d\n" , ret); + goto out; }iio_push_to_buffers_with_timestamp (indio_dev, &hw_values,iio_get_time_ns (indio_dev)); +out:iio_trigger_notify_done (indio_dev->trig);return IRQ_HANDLED ;
drivers/iio/accel/mma8452.c +1 -1
@@ -1473,7 +1473,7 @@ static int mma8452_trigger_setup(struct iio_dev *indio_dev)if (ret)return ret; - indio_dev->trig = trig; + indio_dev->trig =iio_trigger_get (trig);return 0 ; }
drivers/iio/adc/ad7768-1.c +1 -1
@@ -470,8 +470,8 @@ static irqreturn_t ad7768_trigger_handler(int irq, void *p)iio_push_to_buffers_with_timestamp (indio_dev, &st->data.scan,iio_get_time_ns (indio_dev)); -iio_trigger_notify_done (indio_dev->trig); err_unlock: +iio_trigger_notify_done (indio_dev->trig);mutex_unlock (&st->lock);return IRQ_HANDLED ;
drivers/iio/adc/at91-sama5d2_adc.c +2 -1
@@ -1369,7 +1369,8 @@ static int at91_adc_read_info_raw(struct iio_dev *indio_dev, *val = st->conversion_value; ret =at91_adc_adjust_val_osr (st, val);if (chan->scan_type.sign =='s' ) - *val =sign_extend32 (*val,11 ); + *val =sign_extend32 (*val, + chan->scan_type.realbits -1 ); st->conversion_done = false; }
drivers/iio/adc/axp20x_adc.c +3 -15
@@ -251,19 +251,8 @@ static int axp22x_adc_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val) { struct axp20x_adc_iio *info = iio_priv(indio_dev); -int size; -/* -* N.B.: Unlike the Chinese datasheets tell, the charging current is -* stored on 12 bits, not 13 bits. Only discharging current is on 13 -* bits. -*/ -if (chan->type ==IIO_CURRENT && chan->channel ==AXP22X_BATT_DISCHRG_I ) - size =13 ; -else - size =12 ; - - *val =axp20x_read_variable_width (info->regmap, chan->address, size); + *val =axp20x_read_variable_width (info->regmap, chan->address,12 );if (*val <0 )return *val;
@@ -386,9 +375,8 @@ static int axp22x_adc_scale(struct iio_chan_spec const *chan, int *val,return IIO_VAL_INT_PLUS_MICRO ;case IIO_CURRENT : - *val =0 ; - *val2 =500000 ; -return IIO_VAL_INT_PLUS_MICRO ; + *val =1 ; +return IIO_VAL_INT ;case IIO_TEMP : *val =100 ;
drivers/iio/adc/dln2-adc.c +12 -9
@@ -248,7 +248,6 @@ static int dln2_adc_set_chan_period(struct dln2_adc *dln2,static int dln2_adc_read (struct dln2_adc *dln2,unsigned int channel) {int ret, i; -struct iio_dev *indio_dev =platform_get_drvdata (dln2->pdev);u16 conflict;__le16 value;int olen =sizeof (value);
@@ -257,13 +256,9 @@ static int dln2_adc_read(struct dln2_adc *dln2, unsigned int channel) .chan = channel, }; - ret =iio_device_claim_direct_mode (indio_dev); -if (ret <0 ) -return ret; - ret =dln2_adc_set_chan_enabled (dln2, channel, true);if (ret <0 ) - goto release_direct; +return ret; ret =dln2_adc_set_port_enabled (dln2, true, &conflict);if (ret <0 ) {
@@ -300,8 +295,6 @@ static int dln2_adc_read(struct dln2_adc *dln2, unsigned int channel)dln2_adc_set_port_enabled (dln2, false,NULL ); disable_chan:dln2_adc_set_chan_enabled (dln2, channel, false); -release_direct: -iio_device_release_direct_mode (indio_dev);return ret; }
@@ -337,10 +330,16 @@ static int dln2_adc_read_raw(struct iio_dev *indio_dev,switch (mask) {case IIO_CHAN_INFO_RAW : + ret =iio_device_claim_direct_mode (indio_dev); +if (ret <0 ) +return ret; +mutex_lock (&dln2->mutex); ret =dln2_adc_read (dln2, chan->channel);mutex_unlock (&dln2->mutex); +iio_device_release_direct_mode (indio_dev); +if (ret <0 )return ret;
@@ -666,7 +665,11 @@ static int dln2_adc_probe(struct platform_device *pdev)return -ENOMEM ; }iio_trigger_set_drvdata (dln2->trig, dln2); -devm_iio_trigger_register (dev, dln2->trig); + ret =devm_iio_trigger_register (dev, dln2->trig); +if (ret) { +dev_err (dev,"failed to register trigger: %d\n" , ret); +return ret; + }iio_trigger_set_immutable (indio_dev, dln2->trig); ret = devm_iio_triggered_buffer_setup(dev, indio_dev, NULL,
drivers/iio/gyro/itg3200_buffer.c +1 -1
@@ -61,9 +61,9 @@ static irqreturn_t itg3200_trigger_handler(int irq, void *p)iio_push_to_buffers_with_timestamp (indio_dev, &scan, pf->timestamp); +error_ret:iio_trigger_notify_done (indio_dev->trig); -error_ret:return IRQ_HANDLED ; }
drivers/iio/industrialio-trigger.c +0 -1
@@ -549,7 +549,6 @@ static struct iio_trigger *viio_trigger_alloc(const char *fmt, va_list vargs)irq_modify_status (trig->subirq_base + i,IRQ_NOREQUEST |IRQ_NOAUTOEN ,IRQ_NOPROBE ); } -get_device (&trig->dev);return trig;
drivers/iio/light/ltr501.c +1 -1
@@ -1272,7 +1272,7 @@ static irqreturn_t ltr501_trigger_handler(int irq, void *p) ret =regmap_bulk_read (data->regmap,LTR501_ALS_DATA1 , (u8 *)als_buf,sizeof (als_buf));if (ret <0 ) -return ret; + goto done;if (test_bit (0 , indio_dev->active_scan_mask)) scan.channels[j++] =le16_to_cpu (als_buf[1 ]);if (test_bit (1 , indio_dev->active_scan_mask))
drivers/iio/light/stk3310.c +3 -3
@@ -544,9 +544,8 @@ static irqreturn_t stk3310_irq_event_handler(int irq, void *private)mutex_lock (&data->lock); ret =regmap_field_read (data->reg_flag_nf, &dir);if (ret <0 ) { -dev_err (&data->client->dev,"register read failed\n" ); -mutex_unlock (&data->lock); -return ret; +dev_err (&data->client->dev,"register read failed: %d\n" , ret); + goto out; } event = IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, 1, IIO_EV_TYPE_THRESH,
@@ -558,6 +557,7 @@ static irqreturn_t stk3310_irq_event_handler(int irq, void *private) ret =regmap_field_write (data->reg_flag_psint,0 );if (ret <0 )dev_err (&data->client->dev,"failed to reset interrupts\n" ); +out:mutex_unlock (&data->lock);return IRQ_HANDLED ;
drivers/iio/trigger/stm32-timer-trigger.c +1 -1
@@ -800,6 +800,6 @@ static struct platform_driver stm32_timer_trigger_driver = { };module_platform_driver (stm32_timer_trigger_driver); -MODULE_ALIAS ("platform: stm32-timer-trigger" ); +MODULE_ALIAS ("platform:stm32-timer-trigger" );MODULE_DESCRIPTION ("STMicroelectronics STM32 Timer Trigger driver" );MODULE_LICENSE ("GPL v2" );
drivers/infiniband/hw/hfi1/init.c +1 -1
@@ -1175,7 +1175,7 @@ void hfi1_free_ctxtdata(struct hfi1_devdata *dd, struct hfi1_ctxtdata *rcd) rcd->egrbufs.rcvtids =NULL ;for (e =0 ; e < rcd->egrbufs.alloced; e++) { -if (rcd->egrbufs.buffers[e].dma) +if (rcd->egrbufs.buffers[e].addr) dma_free_coherent(&dd->pcidev->dev, rcd->egrbufs.buffers[e].len, rcd->egrbufs.buffers[e].addr,
drivers/irqchip/irq-armada-370-xp.c +6 -10
@@ -232,16 +232,12 @@ static int armada_370_xp_msi_alloc(struct irq_domain *domain, unsigned int virq,int hwirq, i;mutex_lock (&msi_used_lock); + hwirq =bitmap_find_free_region (msi_used,PCI_MSI_DOORBELL_NR , +order_base_2 (nr_irqs)); +mutex_unlock (&msi_used_lock); - hwirq =bitmap_find_next_zero_area (msi_used,PCI_MSI_DOORBELL_NR , -0 , nr_irqs,0 ); -if (hwirq >=PCI_MSI_DOORBELL_NR ) { -mutex_unlock (&msi_used_lock); +if (hwirq <0 )return -ENOSPC ; - } - -bitmap_set (msi_used, hwirq, nr_irqs); -mutex_unlock (&msi_used_lock);for (i =0 ; i < nr_irqs; i++) { irq_domain_set_info(domain, virq + i, hwirq + i,
@@ -250,7 +246,7 @@ static int armada_370_xp_msi_alloc(struct irq_domain *domain, unsigned int virq, NULL, NULL); } -return hwirq; +return 0 ; } static void armada_370_xp_msi_free(struct irq_domain *domain,
@@ -259,7 +255,7 @@ static void armada_370_xp_msi_free(struct irq_domain *domain,struct irq_data *d =irq_domain_get_irq_data (domain, virq);mutex_lock (&msi_used_lock); -bitmap_clear (msi_used, d->hwirq, nr_irqs); +bitmap_release_region (msi_used, d->hwirq,order_base_2 (nr_irqs));mutex_unlock (&msi_used_lock); }
drivers/irqchip/irq-gic-v3-its.c +1 -1
@@ -574,7 +574,7 @@ static struct its_collection *its_build_invall_cmd(struct its_node *its,its_fixup_cmd (cmd); -return NULL ; +return desc->its_invall_cmd.col; } static struct its_vpe *its_build_vinvall_cmd(struct its_node *its,
drivers/irqchip/irq-nvic.c +1 -1
@@ -26,7 +26,7 @@#define NVIC_ISER 0x000#define NVIC_ICER 0x080 -#define NVIC_IPR 0x300 +#define NVIC_IPR 0x400#define NVIC_MAX_BANKS 16/*
drivers/misc/fastrpc.c +6 -4
@@ -693,16 +693,18 @@ static int fastrpc_get_meta_size(struct fastrpc_invoke_ctx *ctx)static u64 fastrpc_get_payload_size (struct fastrpc_invoke_ctx *ctx,int metalen) {u64 size =0 ; -int i; +int oix; size =ALIGN (metalen,FASTRPC_ALIGN ); -for (i =0 ; i < ctx->nscalars; i++) { +for (oix =0 ; oix < ctx->nbufs; oix++) { +int i = ctx->olaps[oix].raix; +if (ctx->args[i].fd ==0 || ctx->args[i].fd ==-1 ) { -if (ctx->olaps[i].offset ==0 ) +if (ctx->olaps[oix].offset ==0 ) size =ALIGN (size,FASTRPC_ALIGN ); - size += (ctx->olaps[i].mend - ctx->olaps[i].mstart); + size += (ctx->olaps[oix].mend - ctx->olaps[oix].mstart); } }
drivers/mtd/nand/raw/fsmc_nand.c +28 -8
@@ -15,6 +15,7 @@#include <linux/clk.h> #include <linux/completion.h> +#include <linux/delay.h> #include <linux/dmaengine.h> #include <linux/dma-direction.h> #include <linux/dma-mapping.h>
@@ -93,6 +94,14 @@#define FSMC_BUSY_WAIT_TIMEOUT (1 * HZ) +/* +* According to SPEAr300 Reference Manual (RM0082) +* TOUDEL = 7ns (Output delay from the flip-flops to the board) +* TINDEL = 5ns (Input delay from the board to the flipflop) +*/ +#define TOUTDEL 7000 +#define TINDEL 5000 +struct fsmc_nand_timings {u8 tclr;u8 tar;
@@ -277,7 +286,7 @@ static int fsmc_calc_timings(struct fsmc_nand_data *host, {unsigned long hclk =clk_get_rate (host->clk);unsigned long hclkn =NSEC_PER_SEC / hclk; -u32 thiz, thold, twait, tset; +u32 thiz, thold, twait, tset, twait_min;if (sdrt->tRC_min <30000 )return -EOPNOTSUPP ;
@@ -309,13 +318,6 @@ static int fsmc_calc_timings(struct fsmc_nand_data *host,else if (tims->thold >FSMC_THOLD_MASK ) tims->thold =FSMC_THOLD_MASK ; - twait =max (sdrt->tRP_min, sdrt->tWP_min); - tims->twait =DIV_ROUND_UP (twait /1000 , hclkn) -1 ; -if (tims->twait ==0 ) - tims->twait =1 ; -else if (tims->twait >FSMC_TWAIT_MASK ) - tims->twait =FSMC_TWAIT_MASK ; - tset =max (sdrt->tCS_min - sdrt->tWP_min, sdrt->tCEA_max - sdrt->tREA_max); tims->tset =DIV_ROUND_UP (tset /1000 , hclkn) -1 ;
@@ -324,6 +326,21 @@ static int fsmc_calc_timings(struct fsmc_nand_data *host,else if (tims->tset >FSMC_TSET_MASK ) tims->tset =FSMC_TSET_MASK ; +/* +* According to SPEAr300 Reference Manual (RM0082) which gives more +* information related to FSMSC timings than the SPEAr600 one (RM0305), +* twait >= tCEA - (tset * TCLK) + TOUTDEL + TINDEL +*/ + twait_min = sdrt->tCEA_max - ((tims->tset +1 ) * hclkn *1000 ) + +TOUTDEL +TINDEL ; + twait =max3 (sdrt->tRP_min, sdrt->tWP_min, twait_min); + + tims->twait =DIV_ROUND_UP (twait /1000 , hclkn) -1 ; +if (tims->twait ==0 ) + tims->twait =1 ; +else if (tims->twait >FSMC_TWAIT_MASK ) + tims->twait =FSMC_TWAIT_MASK ; +return 0 ; }
@@ -650,6 +667,9 @@ static int fsmc_exec_op(struct nand_chip *chip, const struct nand_operation *op, instr->ctx.waitrdy.timeout_ms);break ; } + +if (instr->delay_ns) +ndelay (instr->delay_ns); }return ret;
drivers/net/bonding/bond_alb.c +8 -6
@@ -1514,14 +1514,14 @@ void bond_alb_monitor(struct work_struct *work)struct slave *slave;if (!bond_has_slaves (bond)) { - bond_info->tx_rebalance_counter =0 ; +atomic_set (&bond_info->tx_rebalance_counter,0 ); bond_info->lp_counter =0 ; goto re_arm; }rcu_read_lock (); - bond_info->tx_rebalance_counter++; +atomic_inc (&bond_info->tx_rebalance_counter); bond_info->lp_counter++;/* send learning packets */
@@ -1543,7 +1543,7 @@ void bond_alb_monitor(struct work_struct *work) }/* rebalance tx traffic */ -if (bond_info->tx_rebalance_counter >=BOND_TLB_REBALANCE_TICKS ) { +if (atomic_read (&bond_info->tx_rebalance_counter) >=BOND_TLB_REBALANCE_TICKS ) {bond_for_each_slave_rcu (bond, slave, iter) {tlb_clear_slave (bond, slave,1 );if (slave ==rcu_access_pointer (bond->curr_active_slave)) {
@@ -1553,7 +1553,7 @@ void bond_alb_monitor(struct work_struct *work) bond_info->unbalanced_load =0 ; } } - bond_info->tx_rebalance_counter =0 ; +atomic_set (&bond_info->tx_rebalance_counter,0 ); }if (bond_info->rlb_enabled) {
@@ -1623,7 +1623,8 @@ int bond_alb_init_slave(struct bonding *bond, struct slave *slave)tlb_init_slave (slave);/* order a rebalance ASAP */ - bond->alb_info.tx_rebalance_counter =BOND_TLB_REBALANCE_TICKS ; +atomic_set (&bond->alb_info.tx_rebalance_counter, +BOND_TLB_REBALANCE_TICKS );if (bond->alb_info.rlb_enabled) bond->alb_info.rlb_rebalance =1 ;
@@ -1660,7 +1661,8 @@ void bond_alb_handle_link_change(struct bonding *bond, struct slave *slave, charrlb_clear_slave (bond, slave); }else if (link ==BOND_LINK_UP ) {/* order a rebalance ASAP */ - bond_info->tx_rebalance_counter =BOND_TLB_REBALANCE_TICKS ; +atomic_set (&bond_info->tx_rebalance_counter, +BOND_TLB_REBALANCE_TICKS );if (bond->alb_info.rlb_enabled) { bond->alb_info.rlb_rebalance =1 ;/* If the updelay module parameter is smaller than the
drivers/net/can/kvaser_pciefd.c +7 -1
@@ -248,6 +248,9 @@ MODULE_DESCRIPTION("CAN driver for Kvaser CAN/PCIe devices");#define KVASER_PCIEFD_SPACK_EWLR BIT(23)#define KVASER_PCIEFD_SPACK_EPLR BIT(24) +/* Kvaser KCAN_EPACK second word */ +#define KVASER_PCIEFD_EPACK_DIR_TX BIT(0) +struct kvaser_pciefd ;struct kvaser_pciefd_can {
@@ -1283,7 +1286,10 @@ static int kvaser_pciefd_rx_error_frame(struct kvaser_pciefd_can *can, can->err_rep_cnt++; can->can.can_stats.bus_error++; - stats->rx_errors++; +if (p->header[1 ] &KVASER_PCIEFD_EPACK_DIR_TX ) + stats->tx_errors++; +else + stats->rx_errors++; can->bec.txerr = bec.txerr; can->bec.rxerr = bec.rxerr;
drivers/net/can/m_can/m_can.c +6 -8
@@ -206,15 +206,15 @@ enum m_can_reg {/* Interrupts for version 3.0.x */ #define IR_ERR_LEC_30X (IR_STE | IR_FOE | IR_ACKE | IR_BE | IR_CRCE) -#define IR_ERR_BUS_30X (IR_ERR_LEC_30X | IR_WDI | IR_ELO | IR_BEU | \ - IR_BEC | IR_TOO | IR_MRAF | IR_TSW | IR_TEFL | \ - IR_RF1L | IR_RF0L) +#define IR_ERR_BUS_30X (IR_ERR_LEC_30X | IR_WDI | IR_BEU | IR_BEC | \ + IR_TOO | IR_MRAF | IR_TSW | IR_TEFL | IR_RF1L | \ + IR_RF0L)#define IR_ERR_ALL_30X (IR_ERR_STATE | IR_ERR_BUS_30X)/* Interrupts for version >= 3.1.x */ #define IR_ERR_LEC_31X (IR_PED | IR_PEA) -#define IR_ERR_BUS_31X (IR_ERR_LEC_31X | IR_WDI | IR_ELO | IR_BEU | \ - IR_BEC | IR_TOO | IR_MRAF | IR_TSW | IR_TEFL | \ - IR_RF1L | IR_RF0L) +#define IR_ERR_BUS_31X (IR_ERR_LEC_31X | IR_WDI | IR_BEU | IR_BEC | \ + IR_TOO | IR_MRAF | IR_TSW | IR_TEFL | IR_RF1L | \ + IR_RF0L)#define IR_ERR_ALL_31X (IR_ERR_STATE | IR_ERR_BUS_31X)/* Interrupt Line Select (ILS) */
@@ -751,8 +751,6 @@ static void m_can_handle_other_err(struct net_device *dev, u32 irqstatus) {if (irqstatus &IR_WDI )netdev_err (dev,"Message RAM Watchdog event due to missing READY\n" ); -if (irqstatus &IR_ELO ) -netdev_err (dev,"Error Logging Overflow\n" );if (irqstatus &IR_BEU )netdev_err (dev,"Bit Error Uncorrected\n" );if (irqstatus &IR_BEC )
drivers/net/can/pch_can.c +1 -1
@@ -692,11 +692,11 @@ static int pch_can_rx_normal(struct net_device *ndev, u32 obj_num, int quota) cf->data[i +1 ] = data_reg >>8 ; } -netif_receive_skb (skb); rcv_pkts++; stats->rx_packets++; quota--; stats->rx_bytes += cf->can_dlc; +netif_receive_skb (skb);pch_fifo_thresh (priv, obj_num); obj_num++;
drivers/net/can/sja1000/ems_pcmcia.c +6 -1
@@ -235,7 +235,12 @@ static int ems_pcmcia_add_card(struct pcmcia_device *pdev, unsigned long base)free_sja1000dev (dev); } - err =request_irq (dev->irq, &ems_pcmcia_interrupt,IRQF_SHARED , +if (!card->channels) { + err = -ENODEV ; + goto failure_cleanup; + } + + err =request_irq (pdev->irq, &ems_pcmcia_interrupt,IRQF_SHARED ,DRV_NAME , card);if (!err)return 0 ;
drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c +73 -28
150 lines not on this page · raw message
drivers/net/ethernet/altera/altera_tse_main.c +6 -3
@@ -1431,16 +1431,19 @@ static int altera_tse_probe(struct platform_device *pdev) priv->rxdescmem_busaddr = dma_res->start; }else { + ret = -ENODEV ; goto err_free_netdev; } -if (!dma_set_mask (priv->device,DMA_BIT_MASK (priv->dmaops->dmamask))) +if (!dma_set_mask (priv->device,DMA_BIT_MASK (priv->dmaops->dmamask))) {dma_set_coherent_mask (priv->device,DMA_BIT_MASK (priv->dmaops->dmamask)); -else if (!dma_set_mask (priv->device,DMA_BIT_MASK (32 ))) + }else if (!dma_set_mask (priv->device,DMA_BIT_MASK (32 ))) {dma_set_coherent_mask (priv->device,DMA_BIT_MASK (32 )); -else + }else { + ret = -EIO ; goto err_free_netdev; + }/* MAC address space */ ret = request_and_map(pdev, "control_port", &control_port,
drivers/net/ethernet/freescale/fec.h +3 -0
@@ -373,6 +373,9 @@ struct bufdesc_ex {#define FEC_ENET_WAKEUP ((uint)0x00020000)/* Wakeup request */ #define FEC_ENET_TXF (FEC_ENET_TXF_0 | FEC_ENET_TXF_1 | FEC_ENET_TXF_2)#define FEC_ENET_RXF (FEC_ENET_RXF_0 | FEC_ENET_RXF_1 | FEC_ENET_RXF_2) +#define FEC_ENET_RXF_GET (X ) (((X) == 0) ? FEC_ENET_RXF_0 : \ + (((X) == 1) ? FEC_ENET_RXF_1 : \ + FEC_ENET_RXF_2))#define FEC_ENET_TS_AVAIL ((uint)0x00010000)#define FEC_ENET_TS_TIMER ((uint)0x00008000)
drivers/net/ethernet/freescale/fec_main.c +1 -1
@@ -1444,7 +1444,7 @@ fec_enet_rx_queue(struct net_device *ndev, int budget, u16 queue_id)break ; pkt_received++; -writel (FEC_ENET_RXF , fep->hwp +FEC_IEVENT ); +writel (FEC_ENET_RXF_GET (queue_id), fep->hwp +FEC_IEVENT );/* Check for errors. */ status ^=BD_ENET_RX_LAST ;
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +48 -27
209 lines not on this page · raw message
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h +2 -0
@@ -19,6 +19,8 @@#define I40E_MAX_VF_PROMISC_FLAGS 3 +#define I40E_VF_STATE_WAIT_COUNT 20 +/* Various queue ctrls */ enum i40e_queue_ctrl {I40E_QUEUE_CTRL_UNKNOWN =0 ,
drivers/net/ethernet/intel/iavf/iavf_ethtool.c +32 -11
55 lines not on this page · raw message
drivers/net/ethernet/intel/iavf/iavf_main.c +1 -0
@@ -2151,6 +2151,7 @@ static void iavf_reset_task(struct work_struct *work) }pci_set_master (adapter->pdev); +pci_restore_msi_state (adapter->pdev);if (i ==IAVF_RESET_WAIT_COUNT ) { dev_err(&adapter->pdev->dev, "Reset never finished (%x)\n",
drivers/net/ethernet/intel/ice/ice_main.c +3 -0
@@ -3561,6 +3561,9 @@ static int ice_up_complete(struct ice_vsi *vsi)netif_carrier_on (vsi->netdev); } +/* clear this now, and the first stats read will be used as baseline */ + vsi->stat_offsets_loaded = false; +ice_service_task_schedule (pf);return 0 ;
drivers/net/ethernet/netronome/nfp/nfpcore/nfp_cppcore.c +3 -1
@@ -803,8 +803,10 @@ int nfp_cpp_area_cache_add(struct nfp_cpp *cpp, size_t size)return -ENOMEM ; cache =kzalloc (sizeof (*cache),GFP_KERNEL ); -if (!cache) +if (!cache) { +nfp_cpp_area_free (area);return -ENOMEM ; + } cache->id =0 ; cache->addr =0 ;
drivers/net/ethernet/qlogic/qede/qede_fp.c +7 -0
@@ -1597,6 +1597,13 @@ netdev_tx_t qede_start_xmit(struct sk_buff *skb, struct net_device *ndev) data_split = true; } }else { +if (unlikely (skb->len >ETH_TX_MAX_NON_LSO_PKT_LEN )) { +DP_ERR (edev,"Unexpected non LSO skb length = 0x%x\n" , skb->len); +qede_free_failed_tx_pkt (txq, first_bd,0 , false); +qede_update_tx_producer (txq); +return NETDEV_TX_OK ; + } + val |= ((skb->len Ð_TX_DATA_1ST_BD_PKT_LEN_MASK ) <<ETH_TX_DATA_1ST_BD_PKT_LEN_SHIFT ); }
drivers/net/ethernet/qlogic/qla3xxx.c +9 -10
@@ -3495,20 +3495,19 @@ static int ql_adapter_up(struct ql3_adapter *qdev)spin_lock_irqsave (&qdev->hw_lock, hw_flags); - err =ql_wait_for_drvr_lock (qdev); -if (err) { - err =ql_adapter_initialize (qdev); -if (err) { -netdev_err (ndev,"Unable to initialize adapter\n" ); - goto err_init; - } -netdev_err (ndev,"Releasing driver lock\n" ); -ql_sem_unlock (qdev,QL_DRVR_SEM_MASK ); - }else { +if (!ql_wait_for_drvr_lock (qdev)) {netdev_err (ndev,"Could not acquire driver lock\n" ); + err = -ENODEV ; goto err_lock; } + err =ql_adapter_initialize (qdev); +if (err) { +netdev_err (ndev,"Unable to initialize adapter\n" ); + goto err_init; + } +ql_sem_unlock (qdev,QL_DRVR_SEM_MASK ); +spin_unlock_irqrestore (&qdev->hw_lock, hw_flags);set_bit (QL_ADAPTER_UP , &qdev->flags);
drivers/net/usb/cdc_ncm.c +2 -0
@@ -177,6 +177,8 @@ static u32 cdc_ncm_check_tx_max(struct usbnet *dev, u32 new_tx)/* clamp new_tx to sane values */ min = ctx->max_datagram_size + ctx->max_ndp_size +sizeof (struct usb_cdc_ncm_nth16 ); max =min_t (u32,CDC_NCM_NTB_MAX_SIZE_TX ,le32_to_cpu (ctx->ncm_parm.dwNtbOutMaxSize)); +if (max ==0 ) + max =CDC_NCM_NTB_MAX_SIZE_TX ;/* dwNtbOutMaxSize not set */ /* some devices set dwNtbOutMaxSize too low for the above default */ min =min (min, max);
drivers/net/vrf.c +4 -4
@@ -495,8 +495,6 @@ static struct sk_buff *vrf_ip6_out_direct(struct net_device *vrf_dev, skb->dev = vrf_dev; -vrf_nf_set_untracked (skb); - err =nf_hook (NFPROTO_IPV6 ,NF_INET_LOCAL_OUT , net, sk, skb,NULL , vrf_dev, vrf_ip6_out_direct_finish);
@@ -517,6 +515,8 @@ static struct sk_buff *vrf_ip6_out(struct net_device *vrf_dev,if (rt6_need_strict (&ipv6_hdr (skb)->daddr))return skb; +vrf_nf_set_untracked (skb); +if (qdisc_tx_is_default (vrf_dev) ||IP6CB (skb)->flags &IP6SKB_XFRM_TRANSFORMED )return vrf_ip6_out_direct (vrf_dev, sk, skb);
@@ -732,8 +732,6 @@ static struct sk_buff *vrf_ip_out_direct(struct net_device *vrf_dev, skb->dev = vrf_dev; -vrf_nf_set_untracked (skb); - err =nf_hook (NFPROTO_IPV4 ,NF_INET_LOCAL_OUT , net, sk, skb,NULL , vrf_dev, vrf_ip_out_direct_finish);
@@ -755,6 +753,8 @@ static struct sk_buff *vrf_ip_out(struct net_device *vrf_dev, ipv4_is_lbcast(ip_hdr(skb)->daddr))return skb; +vrf_nf_set_untracked (skb); +if (qdisc_tx_is_default (vrf_dev) ||IPCB (skb)->flags &IPSKB_XFRM_TRANSFORMED )return vrf_ip_out_direct (vrf_dev, sk, skb);
drivers/tty/serial/serial-tegra.c +2 -2
@@ -1494,7 +1494,7 @@ static struct tegra_uart_chip_data tegra20_uart_chip_data = { .fifo_mode_enable_status = false, .uart_max_port = 5, .max_dma_burst_bytes = 4, - .error_tolerance_low_range = 0, + .error_tolerance_low_range = -4, .error_tolerance_high_range = 4, };
@@ -1505,7 +1505,7 @@ static struct tegra_uart_chip_data tegra30_uart_chip_data = { .fifo_mode_enable_status = false, .uart_max_port = 5, .max_dma_burst_bytes = 4, - .error_tolerance_low_range = 0, + .error_tolerance_low_range = -4, .error_tolerance_high_range = 4, };
drivers/usb/core/config.c +3 -3
@@ -409,7 +409,7 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno,* the USB-2 spec requires such endpoints to have wMaxPacketSize = 0 * (see the end of section 5.6.3), so don't warn about them. */ - maxp =usb_endpoint_maxp (&endpoint->desc); + maxp =le16_to_cpu (endpoint->desc.wMaxPacketSize);if (maxp ==0 && !(usb_endpoint_xfer_isoc (d) && asnum ==0 )) {dev_warn (ddev,"config %d interface %d altsetting %d endpoint 0x%X has invalid wMaxPacketSize 0\n" , cfgno, inum, asnum, d->bEndpointAddress);
@@ -425,9 +425,9 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno, maxpacket_maxes = full_speed_maxpacket_maxes;break ;case USB_SPEED_HIGH : -/* Bits 12..11 are allowed only for HS periodic endpoints */ +/* Multiple-transactions bits are allowed only for HS periodic endpoints */ if (usb_endpoint_xfer_int (d) ||usb_endpoint_xfer_isoc (d)) { - i = maxp & (BIT (12 ) |BIT (11 )); + i = maxp &USB_EP_MAXP_MULT_MASK ; maxp &= ~i; }/* fallthrough */
drivers/usb/gadget/composite.c +13 -1
@@ -1648,6 +1648,18 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)struct usb_function *f =NULL ;u8 endp; +if (w_length >USB_COMP_EP0_BUFSIZ ) { +if (ctrl->bRequestType ==USB_DIR_OUT ) { + goto done; + }else { +/* Cast away the const, we are going to overwrite on purpose. */ +__le16 *temp = (__le16 *)&ctrl->wLength; + + *temp =cpu_to_le16 (USB_COMP_EP0_BUFSIZ ); + w_length =USB_COMP_EP0_BUFSIZ ; + } + } +/* partial re-init of the response message; the function or the * gadget might need to intercept e.g. a control-OUT completion * when we delegate to it.
@@ -2161,7 +2173,7 @@ int composite_dev_prepare(struct usb_composite_driver *composite,if (!cdev->req)return -ENOMEM ; - cdev->req->buf =kmalloc (USB_COMP_EP0_BUFSIZ ,GFP_KERNEL ); + cdev->req->buf =kzalloc (USB_COMP_EP0_BUFSIZ ,GFP_KERNEL );if (!cdev->req->buf) goto fail;
drivers/usb/gadget/legacy/dbgp.c +14 -1
@@ -137,7 +137,7 @@ static int dbgp_enable_ep_req(struct usb_ep *ep) goto fail_1; } - req->buf =kmalloc (DBGP_REQ_LEN ,GFP_KERNEL ); + req->buf =kzalloc (DBGP_REQ_LEN ,GFP_KERNEL );if (!req->buf) { err = -ENOMEM ; stp =2 ;
@@ -345,6 +345,19 @@ static int dbgp_setup(struct usb_gadget *gadget,void *data =NULL ;u16 len =0 ; +if (length >DBGP_REQ_LEN ) { +if (ctrl->bRequestType ==USB_DIR_OUT ) { +return err; + }else { +/* Cast away the const, we are going to overwrite on purpose. */ +__le16 *temp = (__le16 *)&ctrl->wLength; + + *temp =cpu_to_le16 (DBGP_REQ_LEN ); + length =DBGP_REQ_LEN ; + } + } + +if (request ==USB_REQ_GET_DESCRIPTOR ) {switch (value>>8 ) {case USB_DT_DEVICE :
drivers/usb/gadget/legacy/inode.c +15 -1
@@ -110,6 +110,8 @@ enum ep0_state {/* enough for the whole queue: most events invalidate others */ #define N_EVENT 5 +#define RBUF_SIZE 256 +struct dev_data {spinlock_t lock;refcount_t count;
@@ -144,7 +146,7 @@ struct dev_data {struct dentry *dentry;/* except this scratch i/o buffer for ep0 */ -u8 rbuf [256 ]; +u8 rbuf[RBUF_SIZE ]; };static inline void get_dev (struct dev_data *data)
@@ -1333,6 +1335,18 @@ gadgetfs_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)u16 w_value =le16_to_cpu (ctrl->wValue);u16 w_length =le16_to_cpu (ctrl->wLength); +if (w_length >RBUF_SIZE ) { +if (ctrl->bRequestType ==USB_DIR_OUT ) { +return value; + }else { +/* Cast away the const, we are going to overwrite on purpose. */ +__le16 *temp = (__le16 *)&ctrl->wLength; + + *temp =cpu_to_le16 (RBUF_SIZE ); + w_length =RBUF_SIZE ; + } + } +spin_lock (&dev->lock); dev->setup_abort =0 ;if (dev->state ==STATE_DEV_UNCONNECTED ) {
drivers/usb/host/xhci-hub.c +1 -0
@@ -629,6 +629,7 @@ static int xhci_enter_test_mode(struct xhci_hcd *xhci,continue ; retval =xhci_disable_slot (xhci, i); +xhci_free_virt_device (xhci, i);if (retval)xhci_err (xhci,"Failed to disable slot %d, %d. Enter test mode anyway\n" , i, retval);
drivers/usb/host/xhci-ring.c +0 -1
@@ -1265,7 +1265,6 @@ static void xhci_handle_cmd_disable_slot(struct xhci_hcd *xhci, int slot_id)if (xhci->quirks &XHCI_EP_LIMIT_QUIRK )/* Delete default control endpoint resources */ xhci_free_device_endpoint_resources (xhci, virt_dev, true); -xhci_free_virt_device (xhci, slot_id); } static void xhci_handle_cmd_config_ep(struct xhci_hcd *xhci, int slot_id,
drivers/usb/host/xhci.c +15 -11
@@ -3889,7 +3889,6 @@ static void xhci_free_dev(struct usb_hcd *hcd, struct usb_device *udev)struct xhci_slot_ctx *slot_ctx;int i, ret; -#ifndef CONFIG_USB_DEFAULT_PERSIST /* * We called pm_runtime_get_noresume when the device was attached. * Decrement the counter here to allow controller to runtime suspend
@@ -3897,7 +3896,6 @@ static void xhci_free_dev(struct usb_hcd *hcd, struct usb_device *udev)*/ if (xhci->quirks &XHCI_RESET_ON_RESUME )pm_runtime_put_noidle (hcd->self.controller); -#endif ret =xhci_check_args (hcd, udev,NULL ,0 , true, __func__);/* If the host is halted due to driver unload, we still need to free the
@@ -3916,9 +3914,8 @@ static void xhci_free_dev(struct usb_hcd *hcd, struct usb_device *udev)del_timer_sync (&virt_dev->eps[i].stop_cmd_timer); } virt_dev->udev =NULL ; - ret =xhci_disable_slot (xhci, udev->slot_id); -if (ret) -xhci_free_virt_device (xhci, udev->slot_id); +xhci_disable_slot (xhci, udev->slot_id); +xhci_free_virt_device (xhci, udev->slot_id); }int xhci_disable_slot (struct xhci_hcd *xhci,u32 slot_id)
@@ -3928,7 +3925,7 @@ int xhci_disable_slot(struct xhci_hcd *xhci, u32 slot_id)u32 state;int ret =0 ; - command =xhci_alloc_command (xhci, false,GFP_KERNEL ); + command =xhci_alloc_command (xhci, true,GFP_KERNEL );if (!command)return -ENOMEM ;
@@ -3953,6 +3950,15 @@ int xhci_disable_slot(struct xhci_hcd *xhci, u32 slot_id) }xhci_ring_cmd_db (xhci);spin_unlock_irqrestore (&xhci->lock, flags); + +wait_for_completion (command->completion); + +if (command->status !=COMP_SUCCESS ) +xhci_warn (xhci,"Unsuccessful disable slot %u command, status %d\n" , + slot_id, command->status); + +xhci_free_command (xhci, command); +return ret; }
@@ -4049,23 +4055,20 @@ int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev)xhci_debugfs_create_slot (xhci, slot_id); -#ifndef CONFIG_USB_DEFAULT_PERSIST /* * If resetting upon resume, we can't put the controller into runtime * suspend if there is a device attached. */ if (xhci->quirks &XHCI_RESET_ON_RESUME )pm_runtime_get_noresume (hcd->self.controller); -#endif /* Is this a LS or FS device under a HS hub? */ /* Hub or peripherial? */ return 1 ; disable_slot: - ret =xhci_disable_slot (xhci, udev->slot_id); -if (ret) -xhci_free_virt_device (xhci, udev->slot_id); +xhci_disable_slot (xhci, udev->slot_id); +xhci_free_virt_device (xhci, udev->slot_id);return 0 ; }
@@ -4195,6 +4198,7 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev,mutex_unlock (&xhci->mutex); ret =xhci_disable_slot (xhci, udev->slot_id); +xhci_free_virt_device (xhci, udev->slot_id);if (!ret)xhci_alloc_dev (hcd, udev);kfree (command->completion);
fs/aio.c +151 -33
271 lines not on this page · raw message
fs/btrfs/extent_io.c +6 -0
@@ -3754,6 +3754,12 @@ static void set_btree_ioerr(struct page *page)if (test_and_set_bit (EXTENT_BUFFER_WRITE_ERR , &eb->bflags))return ; +/* +* A read may stumble upon this buffer later, make sure that it gets an +* error and knows there was an error. +*/ +clear_bit (EXTENT_BUFFER_UPTODATE , &eb->bflags); +/* * If we error out, we should add back the dirty_metadata_bytes * to make it consistent.
fs/btrfs/root-tree.c +2 -1
@@ -371,7 +371,8 @@ int btrfs_del_root_ref(struct btrfs_trans_handle *trans, u64 root_id, key.offset = ref_id; again: ret =btrfs_search_slot (trans, tree_root, &key, path,-1 ,1 ); -BUG_ON (ret <0 ); +if (ret <0 ) + goto out;if (ret ==0 ) { leaf = path->nodes[0 ]; ref = btrfs_item_ptr(leaf, path->slots[0],
fs/nfsd/nfs4recover.c +1 -0
@@ -2177,6 +2177,7 @@ static struct notifier_block nfsd4_cld_block = {int register_cld_notifier (void ) { +WARN_ON (!nfsd_net_id);return rpc_pipefs_notifier_register (&nfsd4_cld_block); }
fs/nfsd/nfsctl.c +7 -7
@@ -1526,12 +1526,9 @@ static int __init init_nfsd(void)int retval;printk (KERN_INFO "Installing knfsd (copyright (C) 1996 [email protected]).\n" ); - retval =register_cld_notifier (); -if (retval) -return retval; retval =nfsd4_init_slabs ();if (retval) - goto out_unregister_notifier; +return retval; retval =nfsd4_init_pnfs ();if (retval) goto out_free_slabs;
@@ -1549,9 +1546,14 @@ static int __init init_nfsd(void) goto out_free_exports; retval =register_pernet_subsys (&nfsd_net_ops);if (retval <0 ) + goto out_free_filesystem; + retval =register_cld_notifier (); +if (retval) goto out_free_all;return 0 ; out_free_all: +unregister_pernet_subsys (&nfsd_net_ops); +out_free_filesystem:unregister_filesystem (&nfsd_fs_type); out_free_exports:remove_proc_entry ("fs/nfs/exports" ,NULL );
@@ -1565,13 +1567,12 @@ static int __init init_nfsd(void)nfsd4_exit_pnfs (); out_free_slabs:nfsd4_free_slabs (); -out_unregister_notifier: -unregister_cld_notifier ();return retval; } static void __exit exit_nfsd(void) { +unregister_cld_notifier ();unregister_pernet_subsys (&nfsd_net_ops);nfsd_drc_slab_free ();remove_proc_entry ("fs/nfs/exports" ,NULL );
@@ -1582,7 +1583,6 @@ static void __exit exit_nfsd(void)nfsd4_exit_pnfs ();nfsd_fault_inject_cleanup ();unregister_filesystem (&nfsd_fs_type); -unregister_cld_notifier (); }MODULE_AUTHOR ("Olaf Kirch <[email protected]>" );
fs/ntfs/dir.c +1 -1
@@ -1503,7 +1503,7 @@ static int ntfs_dir_fsync(struct file *filp, loff_t start, loff_t end, na.type =AT_BITMAP ; na.name =I30 ; na.name_len =4 ; - bmp_vi =ilookup5 (vi->i_sb, vi->i_ino, (test_t )ntfs_test_inode, &na); + bmp_vi =ilookup5 (vi->i_sb, vi->i_ino, ntfs_test_inode, &na);if (bmp_vi) {write_inode_now (bmp_vi, !datasync);iput (bmp_vi);
fs/ntfs/inode.c +14 -13
@@ -30,10 +30,10 @@/** * ntfs_test_inode - compare two (possibly fake) inodes for equality * @vi: vfs inode which to test -* @na: ntfs attribute which is being tested with +* @data: data which is being tested with * * Compare the ntfs attribute embedded in the ntfs specific part of the vfs -* inode @vi for equality with the ntfs attribute @na. +* inode @vi for equality with the ntfs attribute @data. * * If searching for the normal file/directory inode, set @na->type to AT_UNUSED. * @na->name and @na->name_len are then ignored.
@@ -43,8 +43,9 @@* NOTE: This function runs with the inode_hash_lock spin lock held so it is not * allowed to sleep. */ -int ntfs_test_inode (struct inode *vi,ntfs_attr *na) +int ntfs_test_inode (struct inode *vi,void *data) { +ntfs_attr *na = (ntfs_attr *)data;ntfs_inode *ni;if (vi->i_ino != na->mft_no)
@@ -72,9 +73,9 @@ int ntfs_test_inode(struct inode *vi, ntfs_attr *na)/** * ntfs_init_locked_inode - initialize an inode * @vi: vfs inode to initialize -* @na: ntfs attribute which to initialize @vi to +* @data: data which to initialize @vi to * -* Initialize the vfs inode @vi with the values from the ntfs attribute @na in +* Initialize the vfs inode @vi with the values from the ntfs attribute @data in * order to enable ntfs_test_inode() to do its work. * * If initializing the normal file/directory inode, set @na->type to AT_UNUSED.
@@ -87,8 +88,9 @@ int ntfs_test_inode(struct inode *vi, ntfs_attr *na)* NOTE: This function runs with the inode->i_lock spin lock held so it is not * allowed to sleep. (Hence the GFP_ATOMIC allocation.) */ -static int ntfs_init_locked_inode (struct inode *vi,ntfs_attr *na) +static int ntfs_init_locked_inode (struct inode *vi,void *data) { +ntfs_attr *na = (ntfs_attr *)data;ntfs_inode *ni =NTFS_I (vi); vi->i_ino = na->mft_no;
@@ -131,7 +133,6 @@ static int ntfs_init_locked_inode(struct inode *vi, ntfs_attr *na)return 0 ; } -typedef int (*set_t )(struct inode *,void *);static int ntfs_read_locked_inode (struct inode *vi);static int ntfs_read_locked_attr_inode (struct inode *base_vi,struct inode *vi); static int ntfs_read_locked_index_inode(struct inode *base_vi,
@@ -164,8 +165,8 @@ struct inode *ntfs_iget(struct super_block *sb, unsigned long mft_no) na.name =NULL ; na.name_len =0 ; - vi =iget5_locked (sb, mft_no, (test_t )ntfs_test_inode, - (set_t )ntfs_init_locked_inode, &na); + vi =iget5_locked (sb, mft_no, ntfs_test_inode, + ntfs_init_locked_inode, &na);if (unlikely (!vi))return ERR_PTR (-ENOMEM );
@@ -225,8 +226,8 @@ struct inode *ntfs_attr_iget(struct inode *base_vi, ATTR_TYPE type, na.name = name; na.name_len = name_len; - vi =iget5_locked (base_vi->i_sb, na.mft_no, (test_t )ntfs_test_inode, - (set_t )ntfs_init_locked_inode, &na); + vi =iget5_locked (base_vi->i_sb, na.mft_no, ntfs_test_inode, + ntfs_init_locked_inode, &na);if (unlikely (!vi))return ERR_PTR (-ENOMEM );
@@ -280,8 +281,8 @@ struct inode *ntfs_index_iget(struct inode *base_vi, ntfschar *name, na.name = name; na.name_len = name_len; - vi =iget5_locked (base_vi->i_sb, na.mft_no, (test_t )ntfs_test_inode, - (set_t )ntfs_init_locked_inode, &na); + vi =iget5_locked (base_vi->i_sb, na.mft_no, ntfs_test_inode, + ntfs_init_locked_inode, &na);if (unlikely (!vi))return ERR_PTR (-ENOMEM );
fs/ntfs/inode.h +1 -3
@@ -253,9 +253,7 @@ typedef struct {ATTR_TYPE type; } ntfs_attr; -typedef int (*test_t )(struct inode *,void *); - -extern int ntfs_test_inode (struct inode *vi,ntfs_attr *na); +extern int ntfs_test_inode (struct inode *vi,void *data);extern struct inode *ntfs_iget (struct super_block *sb,unsigned long mft_no); extern struct inode *ntfs_attr_iget(struct inode *base_vi, ATTR_TYPE type,
fs/ntfs/mft.c +2 -2
@@ -958,7 +958,7 @@ bool ntfs_may_write_mft_record(ntfs_volume *vol, const unsigned long mft_no,* dirty code path of the inode dirty code path when writing * $MFT occurs. */ - vi =ilookup5_nowait (sb, mft_no, (test_t )ntfs_test_inode, &na); + vi =ilookup5_nowait (sb, mft_no, ntfs_test_inode, &na); }if (vi) {ntfs_debug ("Base inode 0x%lx is in icache." , mft_no);
@@ -1019,7 +1019,7 @@ bool ntfs_may_write_mft_record(ntfs_volume *vol, const unsigned long mft_no, vi =igrab (mft_vi);BUG_ON (vi != mft_vi); }else - vi =ilookup5_nowait (sb, na.mft_no, (test_t )ntfs_test_inode, + vi =ilookup5_nowait (sb, na.mft_no, ntfs_test_inode, &na);if (!vi) {/*
fs/signalfd.c +1 -11
@@ -35,17 +35,7 @@void signalfd_cleanup (struct sighand_struct *sighand) { -wait_queue_head_t *wqh = &sighand->signalfd_wqh; -/* -* The lockless check can race with remove_wait_queue() in progress, -* but in this case its caller should run under rcu_read_lock() and -* sighand_cachep is SLAB_TYPESAFE_BY_RCU, we can safely return. -*/ -if (likely (!waitqueue_active (wqh))) -return ; - -/* wait_queue_entry_t->func(POLLFREE) should do remove_wait_queue() */ -wake_up_poll (wqh,EPOLLHUP |POLLFREE ); +wake_up_pollfree (&sighand->signalfd_wqh); }struct signalfd_ctx {
fs/tracefs/inode.c +76 -0
100 lines not on this page · raw message
include/linux/hid.h +5 -0
@@ -831,6 +831,11 @@ static inline bool hid_is_using_ll_driver(struct hid_device *hdev,return hdev->ll_driver == driver; } +static inline bool hid_is_usb (struct hid_device *hdev) +{ +return hid_is_using_ll_driver (hdev, &usb_hid_driver); +} +#define PM_HINT_FULLON 1<<5#define PM_HINT_NORMAL 1<<1
include/linux/wait.h +26 -0
@@ -204,6 +204,7 @@ void __wake_up_locked_key_bookmark(struct wait_queue_head *wq_head,void __wake_up_sync_key (struct wait_queue_head *wq_head,unsigned int mode,int nr,void *key);void __wake_up_locked (struct wait_queue_head *wq_head,unsigned int mode,int nr);void __wake_up_sync (struct wait_queue_head *wq_head,unsigned int mode,int nr); +void __wake_up_pollfree (struct wait_queue_head *wq_head);#define wake_up (x) __wake_up(x, TASK_NORMAL, 1, NULL)#define wake_up_nr (x, nr) __wake_up(x, TASK_NORMAL, nr, NULL)
@@ -230,6 +231,31 @@ void __wake_up_sync(struct wait_queue_head *wq_head, unsigned int mode, int nr);#define wake_up_interruptible_sync_poll (x, m) \ __wake_up_sync_key((x), TASK_INTERRUPTIBLE, 1, poll_to_key(m)) +/** +* wake_up_pollfree - signal that a polled waitqueue is going away +* @wq_head: the wait queue head +* +* In the very rare cases where a ->poll() implementation uses a waitqueue whose +* lifetime is tied to a task rather than to the 'struct file' being polled, +* this function must be called before the waitqueue is freed so that +* non-blocking polls (e.g. epoll) are notified that the queue is going away. +* +* The caller must also RCU-delay the freeing of the wait_queue_head, e.g. via +* an explicit synchronize_rcu() or call_rcu(), or via SLAB_TYPESAFE_BY_RCU. +*/ +static inline void wake_up_pollfree (struct wait_queue_head *wq_head) +{ +/* +* For performance reasons, we don't always take the queue lock here. +* Therefore, we might race with someone removing the last entry from +* the queue, and proceed while they still hold the queue lock. +* However, rcu_read_lock() is required to be held in such cases, so we +* can safely proceed with an RCU-delayed free. +*/ +if (waitqueue_active (wq_head)) +__wake_up_pollfree (wq_head); +} +#define ___wait_cond_timeout (condition) \ ({ \ bool __cond = (condition); \
include/net/bond_alb.h +1 -1
@@ -126,7 +126,7 @@ struct tlb_slave_info {struct alb_bond_info {struct tlb_client_info *tx_hashtbl;/* Dynamically allocated */ u32 unbalanced_load; -int tx_rebalance_counter; +atomic_t tx_rebalance_counter;int lp_counter;/* -------- rlb parameters -------- */ int rlb_enabled;
include/uapi/asm-generic/poll.h +1 -1
@@ -29,7 +29,7 @@#define POLLRDHUP 0x2000#endif -#define POLLFREE (__force __poll_t)0x4000/* currently only for epoll */ +#define POLLFREE (__force __poll_t)0x4000#define POLL_BUSY_LOOP (__force __poll_t)0x8000
kernel/bpf/verifier.c +1 -1
@@ -5372,7 +5372,7 @@ static void find_good_pkt_pointers(struct bpf_verifier_state *vstate, new_range = dst_reg->off;if (range_right_open) - new_range--; + new_range++;/* Examples for register markings: *
kernel/sched/wait.c +7 -0
@@ -206,6 +206,13 @@ void __wake_up_sync(struct wait_queue_head *wq_head, unsigned int mode, int nr_e }EXPORT_SYMBOL_GPL (__wake_up_sync);/* For internal use only */ +void __wake_up_pollfree (struct wait_queue_head *wq_head) +{ +__wake_up (wq_head,TASK_NORMAL ,0 ,poll_to_key (EPOLLHUP |POLLFREE )); +/* POLLFREE must have cleared the queue. */ +WARN_ON_ONCE (waitqueue_active (wq_head)); +} +/* * Note: we use "set_current_state()" _after_ the wait-queue add, * because we need a memory barrier there on SMP, so that any
mm/backing-dev.c +7 -0
@@ -1013,6 +1013,13 @@ void bdi_unregister(struct backing_dev_info *bdi)wb_shutdown (&bdi->wb);cgwb_bdi_unregister (bdi); +/* +* If this BDI's min ratio has been set, use bdi_set_min_ratio() to +* update the global bdi_min_ratio. +*/ +if (bdi->min_ratio) +bdi_set_min_ratio (bdi,0 ); +if (bdi->dev) {bdi_debug_unregister (bdi);device_unregister (bdi->dev);
net/core/neighbour.c +1 -2
@@ -734,11 +734,10 @@ struct pneigh_entry * pneigh_lookup(struct neigh_table *tbl,ASSERT_RTNL (); - n =kmalloc (sizeof (*n) + key_len,GFP_KERNEL ); + n =kzalloc (sizeof (*n) + key_len,GFP_KERNEL );if (!n) goto out; - n->protocol =0 ;write_pnet (&n->net, net);memcpy (n->key, pkey, key_len); n->dev = dev;
net/ipv4/udp.c +1 -1
@@ -845,7 +845,7 @@ static int udp_send_skb(struct sk_buff *skb, struct flowi4 *fl4,kfree_skb (skb);return -EINVAL ; } -if (skb->len > cork->gso_size *UDP_MAX_SEGMENTS ) { +if (datalen > cork->gso_size *UDP_MAX_SEGMENTS ) {kfree_skb (skb);return -EINVAL ; }
net/ipv6/seg6_iptunnel.c +8 -0
@@ -143,6 +143,14 @@ int seg6_do_srh_encap(struct sk_buff *skb, struct ipv6_sr_hdr *osrh, int proto) hdr->hop_limit =ip6_dst_hoplimit (skb_dst (skb));memset (IP6CB (skb),0 ,sizeof (*IP6CB (skb))); + +/* the control block has been erased, so we have to set the +* iif once again. +* We read the receiving interface index directly from the +* skb->skb_iif as it is done in the IPv4 receiving path (i.e.: +* ip_rcv_core(...)). +*/ +IP6CB (skb)->iif = skb->skb_iif; } hdr->nexthdr =NEXTHDR_ROUTING ;
net/nfc/netlink.c +4 -2
@@ -1400,8 +1400,10 @@ static int nfc_genl_dump_ses_done(struct netlink_callback *cb) {struct class_dev_iter *iter = (struct class_dev_iter *) cb->args[0 ]; -nfc_device_iter_exit (iter); -kfree (iter); +if (iter) { +nfc_device_iter_exit (iter); +kfree (iter); + }return 0 ; }
sound/core/control_compat.c +3 -0
@@ -266,6 +266,7 @@ static int copy_ctl_value_to_user(void __user *userdata,struct snd_ctl_elem_value *data, int type, int count) { + struct snd_ctl_elem_value32 __user *data32 = userdata;int i, size; if (type == SNDRV_CTL_ELEM_TYPE_BOOLEAN ||
@@ -282,6 +283,8 @@ static int copy_ctl_value_to_user(void __user *userdata,if (copy_to_user (valuep, data->value.bytes.data, size))return -EFAULT ; } +if (copy_to_user (&data32->id, &data->id,sizeof (data32->id))) +return -EFAULT ;return 0 ; }
sound/core/oss/pcm_oss.c +25 -12
@@ -147,7 +147,7 @@ snd_pcm_hw_param_value_min(const struct snd_pcm_hw_params *params,* * Return the maximum value for field PAR. */ -static unsigned int +static int snd_pcm_hw_param_value_max (const struct snd_pcm_hw_params *params,snd_pcm_hw_param_t var,int *dir) {
@@ -682,18 +682,24 @@ static int snd_pcm_oss_period_size(struct snd_pcm_substream *substream,struct snd_pcm_hw_params *oss_params, struct snd_pcm_hw_params *slave_params) { - size_t s; -size_t oss_buffer_size, oss_period_size, oss_periods; -size_t min_period_size, max_period_size; + ssize_t s; +ssize_t oss_buffer_size; +ssize_t oss_period_size, oss_periods; +ssize_t min_period_size, max_period_size;struct snd_pcm_runtime *runtime = substream->runtime;size_t oss_frame_size; oss_frame_size =snd_pcm_format_physical_width (params_format (oss_params)) *params_channels (oss_params) /8 ; + oss_buffer_size =snd_pcm_hw_param_value_max (slave_params, +SNDRV_PCM_HW_PARAM_BUFFER_SIZE , +NULL ); +if (oss_buffer_size <=0 ) +return -EINVAL ; oss_buffer_size =snd_pcm_plug_client_size (substream, -snd_pcm_hw_param_value_max (slave_params,SNDRV_PCM_HW_PARAM_BUFFER_SIZE ,NULL )) * oss_frame_size; -if (!oss_buffer_size) + oss_buffer_size * oss_frame_size); +if (oss_buffer_size <=0 )return -EINVAL ; oss_buffer_size =rounddown_pow_of_two (oss_buffer_size);if (atomic_read (&substream->mmap_count)) {
@@ -730,7 +736,7 @@ static int snd_pcm_oss_period_size(struct snd_pcm_substream *substream, min_period_size =snd_pcm_plug_client_size (substream,snd_pcm_hw_param_value_min (slave_params,SNDRV_PCM_HW_PARAM_PERIOD_SIZE ,NULL )); -if (min_period_size) { +if (min_period_size >0 ) { min_period_size *= oss_frame_size; min_period_size =roundup_pow_of_two (min_period_size);if (oss_period_size < min_period_size)
@@ -739,7 +745,7 @@ static int snd_pcm_oss_period_size(struct snd_pcm_substream *substream, max_period_size =snd_pcm_plug_client_size (substream,snd_pcm_hw_param_value_max (slave_params,SNDRV_PCM_HW_PARAM_PERIOD_SIZE ,NULL )); -if (max_period_size) { +if (max_period_size >0 ) { max_period_size *= oss_frame_size; max_period_size =rounddown_pow_of_two (max_period_size);if (oss_period_size > max_period_size)
@@ -752,7 +758,7 @@ static int snd_pcm_oss_period_size(struct snd_pcm_substream *substream, oss_periods = substream->oss.setup.periods; s =snd_pcm_hw_param_value_max (slave_params,SNDRV_PCM_HW_PARAM_PERIODS ,NULL ); -if (runtime->oss.maxfrags && s > runtime->oss.maxfrags) +if (s >0 && runtime->oss.maxfrags && s > runtime->oss.maxfrags) s = runtime->oss.maxfrags;if (oss_periods > s) oss_periods = s;
@@ -878,8 +884,15 @@ static int snd_pcm_oss_change_params_locked(struct snd_pcm_substream *substream) err = -EINVAL ; goto failure; } -choose_rate (substream, sparams, runtime->oss.rate); -snd_pcm_hw_param_near (substream, sparams,SNDRV_PCM_HW_PARAM_CHANNELS , runtime->oss.channels,NULL ); + + err =choose_rate (substream, sparams, runtime->oss.rate); +if (err <0 ) + goto failure; + err =snd_pcm_hw_param_near (substream, sparams, +SNDRV_PCM_HW_PARAM_CHANNELS , + runtime->oss.channels,NULL ); +if (err <0 ) + goto failure; format =snd_pcm_oss_format_from (runtime->oss.format);
@@ -1946,7 +1959,7 @@ static int snd_pcm_oss_set_fragment1(struct snd_pcm_substream *substream, unsignif (runtime->oss.subdivision || runtime->oss.fragshift)return -EINVAL ; fragshift = val &0xffff ; -if (fragshift >=31 ) +if (fragshift >=25 )/* should be large enough */ return -EINVAL ; runtime->oss.fragshift = fragshift; runtime->oss.maxfrags = (val >>16 ) &0xffff ;
sound/pci/hda/patch_realtek.c +40 -0
@@ -9620,6 +9620,27 @@ static void alc671_fixup_hp_headset_mic2(struct hda_codec *codec, } } +static void alc897_hp_automute_hook (struct hda_codec *codec, +struct hda_jack_callback *jack) +{ +struct alc_spec *spec = codec->spec; +int vref; + +snd_hda_gen_hp_automute (codec, jack); + vref = spec->gen.hp_jack_present ? (PIN_HP |AC_PINCTL_VREF_100 ) :PIN_HP ; +snd_hda_codec_write (codec,0x1b ,0 ,AC_VERB_SET_PIN_WIDGET_CONTROL , + vref); +} + +static void alc897_fixup_lenovo_headset_mic (struct hda_codec *codec, +const struct hda_fixup *fix,int action) +{ +struct alc_spec *spec = codec->spec; +if (action ==HDA_FIXUP_ACT_PRE_PROBE ) { + spec->gen.hp_automute_hook = alc897_hp_automute_hook; + } +} +static const struct coef_fw alc668_coefs[] = {WRITE_COEF (0x01 ,0xbebe ),WRITE_COEF (0x02 ,0xaaaa ),WRITE_COEF (0x03 ,0x0 ),WRITE_COEF (0x04 ,0x0180 ),WRITE_COEF (0x06 ,0x0 ),WRITE_COEF (0x07 ,0x0f80 ),
@@ -9700,6 +9721,8 @@ enum {ALC668_FIXUP_ASUS_NO_HEADSET_MIC ,ALC668_FIXUP_HEADSET_MIC ,ALC668_FIXUP_MIC_DET_COEF , +ALC897_FIXUP_LENOVO_HEADSET_MIC , + ALC897_FIXUP_HEADSET_MIC_PIN, }; static const struct hda_fixup alc662_fixups[] = {
@@ -10106,6 +10129,19 @@ static const struct hda_fixup alc662_fixups[] = { {} }, }, + [ALC897_FIXUP_LENOVO_HEADSET_MIC ] = { + .type =HDA_FIXUP_FUNC , + .v.func = alc897_fixup_lenovo_headset_mic, + }, + [ALC897_FIXUP_HEADSET_MIC_PIN ] = { + .type =HDA_FIXUP_PINS , + .v.pins = (const struct hda_pintbl []) { + {0x1a ,0x03a11050 }, + { } + }, + .chained = true, + .chain_id =ALC897_FIXUP_LENOVO_HEADSET_MIC + }, };static const struct snd_pci_quirk alc662_fixup_tbl[] = {
@@ -10150,6 +10186,10 @@ static const struct snd_pci_quirk alc662_fixup_tbl[] = {SND_PCI_QUIRK (0x144d ,0xc051 ,"Samsung R720" ,ALC662_FIXUP_IDEAPAD ),SND_PCI_QUIRK (0x14cd ,0x5003 ,"USI" ,ALC662_FIXUP_USI_HEADSET_MODE ),SND_PCI_QUIRK (0x17aa ,0x1036 ,"Lenovo P520" ,ALC662_FIXUP_LENOVO_MULTI_CODECS ), +SND_PCI_QUIRK (0x17aa ,0x32ca ,"Lenovo ThinkCentre M80" ,ALC897_FIXUP_HEADSET_MIC_PIN ), +SND_PCI_QUIRK (0x17aa ,0x32cb ,"Lenovo ThinkCentre M70" ,ALC897_FIXUP_HEADSET_MIC_PIN ), +SND_PCI_QUIRK (0x17aa ,0x32cf ,"Lenovo ThinkCentre M950" ,ALC897_FIXUP_HEADSET_MIC_PIN ), +SND_PCI_QUIRK (0x17aa ,0x32f7 ,"Lenovo ThinkCentre M90" ,ALC897_FIXUP_HEADSET_MIC_PIN ),SND_PCI_QUIRK (0x17aa ,0x38af ,"Lenovo Ideapad Y550P" ,ALC662_FIXUP_IDEAPAD ),SND_PCI_QUIRK (0x17aa ,0x3a0d ,"Lenovo Ideapad Y550" ,ALC662_FIXUP_IDEAPAD ), SND_PCI_QUIRK(0x1849, 0x5892, "ASRock B150M", ALC892_FIXUP_ASROCK_MOBO),
sound/soc/qcom/qdsp6/q6routing.c +5 -3
@@ -440,14 +440,16 @@ static int msm_routing_put_audio_mixer(struct snd_kcontrol *kcontrol,struct session_data *session = &data->sessions[session_id];if (ucontrol->value.integer.value[0 ]) { +if (session->port_id == be_id) +return 0 ; + session->port_id = be_id;snd_soc_dapm_mixer_update_power (dapm, kcontrol,1 , update); }else { -if (session->port_id == be_id) { - session->port_id =-1 ; +if (session->port_id ==-1 || session->port_id != be_id)return 0 ; - } + session->port_id =-1 ;snd_soc_dapm_mixer_update_power (dapm, kcontrol,0 , update); }
tools/build/Makefile.feature +0 -1
@@ -52,7 +52,6 @@ FEATURE_TESTS_BASIC := \ numa_num_possible_cpus \ libperl \ libpython \ - libpython-version \ libslang \ libslang-include-subdir \ libcrypto \
tools/build/feature/Makefile +0 -4
@@ -30,7 +30,6 @@ FILES= \ test-numa_num_possible_cpus.bin \ test-libperl.bin \ test-libpython.bin \ - test-libpython-version.bin \ test-libslang.bin \ test-libslang-include-subdir.bin \ test-libcrypto.bin \
@@ -214,9 +213,6 @@ $(OUTPUT)test-libperl.bin: $(OUTPUT)test-libpython.bin: $(BUILD) $(FLAGS_PYTHON_EMBED) -$(OUTPUT)test-libpython-version.bin: - $(BUILD) - $(OUTPUT)test-libbfd.bin: $(BUILD) -DPACKAGE='"perf"' -lbfd -ldl
tools/build/feature/test-all.c +0 -5
@@ -14,10 +14,6 @@# include "test-libpython.c" #undef main -#define main main_test_libpython_version -# include "test-libpython-version.c" -#undef main -#define main main_test_libperl# include "test-libperl.c" #undef main
@@ -193,7 +189,6 @@int main (int argc,char *argv[]) {main_test_libpython (); -main_test_libpython_version ();main_test_libperl ();main_test_hello ();main_test_libelf ();
tools/build/feature/test-libpython-version.c deleted +0 -11
@@ -1,11 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -#include <Python.h> - -#if PY_VERSION_HEX >=0x03000000 -#error -#endif - -int main (void ) -{ -return 0 ; -}
tools/perf/Makefile.config +0 -2
@@ -247,8 +247,6 @@ endif FEATURE_CHECK_CFLAGS-libpython := $(PYTHON_EMBED_CCOPTS) FEATURE_CHECK_LDFLAGS-libpython := $(PYTHON_EMBED_LDOPTS) -FEATURE_CHECK_CFLAGS-libpython-version := $(PYTHON_EMBED_CCOPTS) -FEATURE_CHECK_LDFLAGS-libpython-version := $(PYTHON_EMBED_LDOPTS) FEATURE_CHECK_LDFLAGS-libaio = -lrt
tools/testing/selftests/bpf/verifier/xdp_direct_packet_access.c +600 -32
234 lines not on this page · raw message
tools/testing/selftests/net/fib_tests.sh +49 -10
59 lines not on this page · raw message
tools/testing/selftests/netfilter/Makefile +2 -1
Lines of this file are not shown. View the raw message.
tools/testing/selftests/netfilter/conntrack_vrf.sh new file +241 -0
241 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Part of the diff is not shown here. View the raw message.