Linux 5.4.46
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.4.46 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/ABI/testing/sysfs-devices-system-cpu | 1 Documentation/admin-guide/hw-vuln/index.rst | 1 Documentation/admin-guide/hw-vuln/special-register-buffer-data-sampling.rst | 149 ++++++++++ Documentation/admin-guide/kernel-parameters.txt | 20 + Makefile | 2 arch/x86/include/asm/cpu_device_id.h | 30 ++ arch/x86/include/asm/cpufeatures.h | 2 arch/x86/include/asm/msr-index.h | 4 arch/x86/kernel/cpu/bugs.c | 106 +++++++ arch/x86/kernel/cpu/common.c | 63 +++- arch/x86/kernel/cpu/cpu.h | 1 arch/x86/kernel/cpu/match.c | 7 drivers/base/cpu.c | 8 drivers/iio/adc/stm32-adc-core.c | 34 -- drivers/iio/chemical/pms7003.c | 17 - drivers/iio/chemical/sps30.c | 9 drivers/iio/light/vcnl4000.c | 6 drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 6 drivers/net/ethernet/mellanox/mlx5/core/main.c | 18 + drivers/net/ethernet/netronome/nfp/flower/offload.c | 3 drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 3 drivers/net/usb/qmi_wwan.c | 1 drivers/nfc/st21nfca/dep.c | 4 drivers/nvmem/qfprom.c | 14 drivers/staging/rtl8712/wifi.h | 9 drivers/tty/hvc/hvc_console.c | 23 - drivers/tty/vt/keyboard.c | 26 + drivers/usb/class/cdc-acm.c | 2 drivers/usb/musb/musb_core.c | 7 drivers/usb/musb/musb_debugfs.c | 10 drivers/usb/serial/ch341.c | 53 +++ drivers/usb/serial/option.c | 4 drivers/usb/serial/qcserial.c | 1 drivers/usb/serial/usb_wwan.c | 4 include/linux/mod_devicetable.h | 6 include/linux/virtio_net.h | 25 + kernel/events/uprobes.c | 16 - net/ipv4/devinet.c | 1 net/l2tp/l2tp_core.c | 3 net/l2tp/l2tp_ip.c | 29 + net/l2tp/l2tp_ip6.c | 30 +- net/vmw_vsock/af_vsock.c | 2 42 files changed, 626 insertions(+), 134 deletions(-)
Bin Liu (2):
USB: serial: usb_wwan: do not resubmit rx urb on fatal errors
usb: musb: start session in resume for host port
Chuhong Yuan (1):
NFC: st21nfca: add missed kfree_skb() in an error path
Daniele Palmas (2):
net: usb: qmi_wwan: add Telit LE910C1-EUX composition
USB: serial: option: add Telit LE910C1-EUX compositions
Dinghao Liu (1):
usb: musb: Fix runtime PM imbalance on error
Dmitry Torokhov (1):
vt: keyboard: avoid signed integer overflow in k_ascii
Eric Dumazet (3):
l2tp: add sk_family checks to l2tp_validate_socket
l2tp: do not use inet_hash()/inet_unhash()
net: be more gentle about silly gso requests coming from user
Fabrice Gasnier (1):
iio: adc: stm32-adc: fix a wrong error message when probing interrupts
Fugang Duan (1):
net: stmmac: enable timestamp snapshot for required PTP packets in dwmac v5.10a
Greg Kroah-Hartman (2):
Revert "net/mlx5: Annotate mutex destroy for root ns" Linux 5.4.46
Heinrich Kuhn (1):
nfp: flower: fix used time of merge flow statistics
Jiri Slaby (1):
tty: hvc_console, fix crashes on parallel open/close
Jonathan Cameron (2):
iio:chemical:sps30: Fix timestamp alignment iio:chemical:pms7003: Fix timestamp alignment and prevent data leak.
Josh Poimboeuf (1):
x86/speculation: Add Ivy Bridge to affected list
Mark Bloch (1):
net/mlx5: Fix crash upon suspend/resume
Mark Gross (4):
x86/cpu: Add a steppings field to struct x86_cpu_id
x86/cpu: Add 'table' argument to cpu_matches()
x86/speculation: Add Special Register Buffer Data Sampling (SRBDS) mitigation x86/speculation: Add SRBDS vulnerability and mitigation documentation
Mathieu Othacehe (1):
iio: vcnl4000: Fix i2c swapped word reading.
Matt Jolly (1):
USB: serial: qcserial: add DW5816e QDL support
Michael Hanselmann (1):
USB: serial: ch341: add basis for quirk detection
Oleg Nesterov (1):
uprobes: ensure that uprobe->offset and ->ref_ctr_offset are properly aligned
Oliver Neukum (1):
CDC-ACM: heed quirk also in error handling
Pascal Terjan (1):
staging: rtl8712: Fix IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK
Srinivas Kandagatla (1):
nvmem: qfprom: remove incorrect write support
Stefano Garzarella (1):
vsock: fix timeout in vsock_accept()
Tony W Wang-oc (1):
x86/speculation/spectre_v2: Exclude Zhaoxin CPUs from SPECTRE_V2
Willem de Bruijn (1):
net: check untrusted gso_size at kernel entry
Yang Yingliang (1):
devinet: fix memleak in inetdev_init()
Greg Kroah-Hartman
maintainerDocumentation/ABI/testing/sysfs-devices-system-cpu +1 -0
@@ -486,6 +486,7 @@ What: /sys/devices/system/cpu/vulnerabilities /sys/devices/system/cpu/vulnerabilities/spec_store_bypass /sys/devices/system/cpu/vulnerabilities/l1tf /sys/devices/system/cpu/vulnerabilities/mds + /sys/devices/system/cpu/vulnerabilities/srbds /sys/devices/system/cpu/vulnerabilities/tsx_async_abort /sys/devices/system/cpu/vulnerabilities/itlb_multihit Date: January 2018
Documentation/admin-guide/hw-vuln/index.rst +1 -0
@@ -14,3 +14,4 @@ are configurable at compile, boot or run time. mds tsx_async_abort multihit.rst + special-register-buffer-data-sampling.rst
Documentation/admin-guide/hw-vuln/special-register-buffer-data-sampling.rst new file +149 -0
149 lines not on this page · raw message
Documentation/admin-guide/kernel-parameters.txt +20 -0
@@ -4579,6 +4579,26 @@ spia_pedr= spia_peddr= + srbds= [X86,INTEL] + Control the Special Register Buffer Data Sampling + (SRBDS) mitigation. + + Certain CPUs are vulnerable to an MDS-like + exploit which can leak bits from the random + number generator. + + By default, this issue is mitigated by + microcode. However, the microcode fix can cause + the RDRAND and RDSEED instructions to become + much slower. Among other effects, this will + result in reduced throughput from /dev/urandom. + + The microcode mitigation can be disabled with + the following option: + + off: Disable mitigation and remove + performance impact to RDRAND and RDSEED + srcutree.counter_wrap_check [KNL] Specifies how frequently to check for grace-period sequence counter wrap for the
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 4 -SUBLEVEL = 45 +SUBLEVEL = 46 EXTRAVERSION = NAME = Kleptomaniac Octopus
arch/x86/include/asm/cpu_device_id.h +30 -0
@@ -9,6 +9,36 @@#include <linux/mod_devicetable.h> +#define X86_CENTAUR_FAM6_C7_D 0xd +#define X86_CENTAUR_FAM6_NANO 0xf + +#define X86_STEPPINGS (mins, maxs) GENMASK(maxs, mins) + +/** +* X86_MATCH_VENDOR_FAM_MODEL_STEPPINGS_FEATURE - Base macro for CPU matching +* @_vendor: The vendor name, e.g. INTEL, AMD, HYGON, ..., ANY +* The name is expanded to X86_VENDOR_@_vendor +* @_family: The family number or X86_FAMILY_ANY +* @_model: The model number, model constant or X86_MODEL_ANY +* @_steppings: Bitmask for steppings, stepping constant or X86_STEPPING_ANY +* @_feature: A X86_FEATURE bit or X86_FEATURE_ANY +* @_data: Driver specific data or NULL. The internal storage +* format is unsigned long. The supplied value, pointer +* etc. is casted to unsigned long internally. +* +* Backport version to keep the SRBDS pile consistant. No shorter variants +* required for this. +*/ +#define X86_MATCH_VENDOR_FAM_MODEL_STEPPINGS_FEATURE (_vendor, _family, _model, \ + _steppings, _feature, _data) { \ + .vendor = X86_VENDOR_##_vendor, \ + .family = _family, \ + .model = _model, \ + .steppings = _steppings, \ + .feature = _feature, \ + .driver_data = (unsigned long) _data \ +} +/* * Match specific microcode revisions. *
arch/x86/include/asm/cpufeatures.h +2 -0
@@ -357,6 +357,7 @@#define X86_FEATURE_AVX512_4VNNIW (18*32+ 2)/* AVX-512 Neural Network Instructions */ #define X86_FEATURE_AVX512_4FMAPS (18*32+ 3)/* AVX-512 Multiply Accumulation Single precision */ #define X86_FEATURE_AVX512_VP2INTERSECT (18*32+ 8)/* AVX-512 Intersect for D/Q */ +#define X86_FEATURE_SRBDS_CTRL (18*32+ 9)/* "" SRBDS mitigation MSR available */ #define X86_FEATURE_MD_CLEAR (18*32+10)/* VERW clears CPU buffers */ #define X86_FEATURE_TSX_FORCE_ABORT (18*32+13)/* "" TSX_FORCE_ABORT */ #define X86_FEATURE_PCONFIG (18*32+18)/* Intel PCONFIG */
@@ -401,5 +402,6 @@#define X86_BUG_SWAPGS X86_BUG(21)/* CPU is affected by speculation through SWAPGS */ #define X86_BUG_TAA X86_BUG(22)/* CPU is affected by TSX Async Abort(TAA) */ #define X86_BUG_ITLB_MULTIHIT X86_BUG(23)/* CPU may incur MCE during certain page attribute changes */ +#define X86_BUG_SRBDS X86_BUG(24)/* CPU may leak RNG bits if not mitigated */ #endif /* _ASM_X86_CPUFEATURES_H */
arch/x86/include/asm/msr-index.h +4 -0
@@ -119,6 +119,10 @@#define TSX_CTRL_RTM_DISABLE BIT(0)/* Disable RTM feature */ #define TSX_CTRL_CPUID_CLEAR BIT(1)/* Disable TSX enumeration */ +/* SRBDS support */ +#define MSR_IA32_MCU_OPT_CTRL 0x00000123 +#define RNGDS_MITG_DIS BIT(0) +#define MSR_IA32_SYSENTER_CS 0x00000174#define MSR_IA32_SYSENTER_ESP 0x00000175#define MSR_IA32_SYSENTER_EIP 0x00000176
arch/x86/kernel/cpu/bugs.c +106 -0
140 lines not on this page · raw message
arch/x86/kernel/cpu/common.c +52 -11
119 lines not on this page · raw message
arch/x86/kernel/cpu/cpu.h +1 -0
@@ -77,6 +77,7 @@ extern void detect_ht(struct cpuinfo_x86 *c);unsigned int aperfmperf_get_khz (int cpu);extern void x86_spec_ctrl_setup_ap (void ); +extern void update_srbds_msr (void );extern u64 x86_read_arch_cap_msr (void );
arch/x86/kernel/cpu/match.c +6 -1
@@ -34,13 +34,18 @@ const struct x86_cpu_id *x86_match_cpu(const struct x86_cpu_id *match)const struct x86_cpu_id *m;struct cpuinfo_x86 *c = &boot_cpu_data; -for (m = match; m->vendor | m->family | m->model | m->feature; m++) { +for (m = match; + m->vendor | m->family | m->model | m->steppings | m->feature; + m++) {if (m->vendor !=X86_VENDOR_ANY && c->x86_vendor != m->vendor)continue ;if (m->family !=X86_FAMILY_ANY && c->x86 != m->family)continue ;if (m->model !=X86_MODEL_ANY && c->x86_model != m->model)continue ; +if (m->steppings !=X86_STEPPING_ANY && + !(BIT (c->x86_stepping) & m->steppings)) +continue ;if (m->feature !=X86_FEATURE_ANY && !cpu_has (c, m->feature))continue ;return m;
drivers/base/cpu.c +8 -0
@@ -567,6 +567,12 @@ ssize_t __weak cpu_show_itlb_multihit(struct device *dev,return sprintf (buf,"Not affected\n" ); } +ssize_t __weak cpu_show_srbds (struct device *dev, +struct device_attribute *attr,char *buf) +{ +return sprintf (buf,"Not affected\n" ); +} + static DEVICE_ATTR(meltdown, 0444, cpu_show_meltdown, NULL); static DEVICE_ATTR(spectre_v1, 0444, cpu_show_spectre_v1, NULL); static DEVICE_ATTR(spectre_v2, 0444, cpu_show_spectre_v2, NULL);
@@ -575,6 +581,7 @@ static DEVICE_ATTR(l1tf, 0444, cpu_show_l1tf, NULL); static DEVICE_ATTR(mds, 0444, cpu_show_mds, NULL); static DEVICE_ATTR(tsx_async_abort, 0444, cpu_show_tsx_async_abort, NULL); static DEVICE_ATTR(itlb_multihit, 0444, cpu_show_itlb_multihit, NULL); +static DEVICE_ATTR(srbds, 0444, cpu_show_srbds, NULL);static struct attribute *cpu_root_vulnerabilities_attrs[] = { &dev_attr_meltdown.attr,
@@ -585,6 +592,7 @@ static struct attribute *cpu_root_vulnerabilities_attrs[] = { &dev_attr_mds.attr, &dev_attr_tsx_async_abort.attr, &dev_attr_itlb_multihit.attr, + &dev_attr_srbds.attr, NULL };
drivers/iio/adc/stm32-adc-core.c +14 -20
@@ -65,12 +65,14 @@ struct stm32_adc_priv;* @clk_sel: clock selection routine * @max_clk_rate_hz: maximum analog clock rate (Hz, from datasheet) * @has_syscfg: SYSCFG capability flags +* @num_irqs: number of interrupt lines */ struct stm32_adc_priv_cfg {const struct stm32_adc_common_regs *regs;int (*clk_sel)(struct platform_device *,struct stm32_adc_priv *);u32 max_clk_rate_hz;unsigned int has_syscfg; +unsigned int num_irqs; };/**
@@ -372,21 +374,15 @@ static int stm32_adc_irq_probe(struct platform_device *pdev,struct device_node *np = pdev->dev.of_node;unsigned int i; -for (i =0 ; i <STM32_ADC_MAX_ADCS ; i++) { +/* +* Interrupt(s) must be provided, depending on the compatible: +* - stm32f4/h7 shares a common interrupt line. +* - stm32mp1, has one line per ADC +*/ +for (i =0 ; i < priv->cfg->num_irqs; i++) { priv->irq[i] =platform_get_irq (pdev, i); -if (priv->irq[i] <0 ) { -/* -* At least one interrupt must be provided, make others -* optional: -* - stm32f4/h7 shares a common interrupt. -* - stm32mp1, has one line per ADC (either for ADC1, -* ADC2 or both). -*/ -if (i && priv->irq[i] == -ENXIO ) -continue ; - +if (priv->irq[i] <0 )return priv->irq[i]; - } } priv->domain = irq_domain_add_simple(np, STM32_ADC_MAX_ADCS, 0,
@@ -397,9 +393,7 @@ static int stm32_adc_irq_probe(struct platform_device *pdev,return -ENOMEM ; } -for (i =0 ; i <STM32_ADC_MAX_ADCS ; i++) { -if (priv->irq[i] <0 ) -continue ; +for (i =0 ; i < priv->cfg->num_irqs; i++) {irq_set_chained_handler (priv->irq[i], stm32_adc_irq_handler);irq_set_handler_data (priv->irq[i], priv); }
@@ -417,11 +411,8 @@ static void stm32_adc_irq_remove(struct platform_device *pdev,irq_dispose_mapping (irq_find_mapping (priv->domain, hwirq));irq_domain_remove (priv->domain); -for (i =0 ; i <STM32_ADC_MAX_ADCS ; i++) { -if (priv->irq[i] <0 ) -continue ; +for (i =0 ; i < priv->cfg->num_irqs; i++)irq_set_chained_handler (priv->irq[i],NULL ); - } } static int stm32_adc_core_switches_supply_en(struct stm32_adc_priv *priv,
@@ -803,6 +794,7 @@ static const struct stm32_adc_priv_cfg stm32f4_adc_priv_cfg = { .regs = &stm32f4_adc_common_regs, .clk_sel = stm32f4_adc_clk_sel, .max_clk_rate_hz = 36000000, + .num_irqs = 1, };static const struct stm32_adc_priv_cfg stm32h7_adc_priv_cfg = {
@@ -810,6 +802,7 @@ static const struct stm32_adc_priv_cfg stm32h7_adc_priv_cfg = { .clk_sel = stm32h7_adc_clk_sel, .max_clk_rate_hz = 36000000, .has_syscfg = HAS_VBOOSTER, + .num_irqs = 1, };static const struct stm32_adc_priv_cfg stm32mp1_adc_priv_cfg = {
@@ -817,6 +810,7 @@ static const struct stm32_adc_priv_cfg stm32mp1_adc_priv_cfg = { .clk_sel = stm32h7_adc_clk_sel, .max_clk_rate_hz = 40000000, .has_syscfg = HAS_VBOOSTER | HAS_ANASWVDD, + .num_irqs = 2, };static const struct of_device_id stm32_adc_of_match[] = {
drivers/iio/chemical/pms7003.c +12 -5
@@ -73,6 +73,11 @@ struct pms7003_state {struct pms7003_frame frame;struct completion frame_ready;struct mutex lock;/* must be held whenever state gets touched */ +/* Used to construct scan to push to the IIO buffer */ +struct { +u16 data[3 ];/* PM1, PM2P5, PM10 */ +s64 ts; + } scan; };static int pms7003_do_cmd (struct pms7003_state *state,enum pms7003_cmd cmd)
@@ -104,7 +109,6 @@ static irqreturn_t pms7003_trigger_handler(int irq, void *p)struct iio_dev *indio_dev = pf->indio_dev;struct pms7003_state *state =iio_priv (indio_dev);struct pms7003_frame *frame = &state->frame; -u16 data[3 +1 +4 ];/* PM1, PM2P5, PM10, padding, timestamp */ int ret;mutex_lock (&state->lock);
@@ -114,12 +118,15 @@ static irqreturn_t pms7003_trigger_handler(int irq, void *p) goto err; } - data[PM1 ] =pms7003_get_pm (frame->data +PMS7003_PM1_OFFSET ); - data[PM2P5 ] =pms7003_get_pm (frame->data +PMS7003_PM2P5_OFFSET ); - data[PM10 ] =pms7003_get_pm (frame->data +PMS7003_PM10_OFFSET ); + state->scan.data[PM1 ] = +pms7003_get_pm (frame->data +PMS7003_PM1_OFFSET ); + state->scan.data[PM2P5 ] = +pms7003_get_pm (frame->data +PMS7003_PM2P5_OFFSET ); + state->scan.data[PM10 ] = +pms7003_get_pm (frame->data +PMS7003_PM10_OFFSET );mutex_unlock (&state->lock); -iio_push_to_buffers_with_timestamp (indio_dev, data, +iio_push_to_buffers_with_timestamp (indio_dev, &state->scan,iio_get_time_ns (indio_dev)); err:iio_trigger_notify_done (indio_dev->trig);
drivers/iio/chemical/sps30.c +6 -3
@@ -230,15 +230,18 @@ static irqreturn_t sps30_trigger_handler(int irq, void *p)struct iio_dev *indio_dev = pf->indio_dev;struct sps30_state *state =iio_priv (indio_dev);int ret; -s32 data[4 +2 ];/* PM1, PM2P5, PM4, PM10, timestamp */ +struct { +s32 data[4 ];/* PM1, PM2P5, PM4, PM10 */ +s64 ts; + } scan;mutex_lock (&state->lock); - ret =sps30_do_meas (state, data,4 ); + ret =sps30_do_meas (state, scan.data,ARRAY_SIZE (scan.data));mutex_unlock (&state->lock);if (ret) goto err; -iio_push_to_buffers_with_timestamp (indio_dev, data, +iio_push_to_buffers_with_timestamp (indio_dev, &scan,iio_get_time_ns (indio_dev)); err:iio_trigger_notify_done (indio_dev->trig);
drivers/iio/light/vcnl4000.c +2 -4
@@ -193,7 +193,6 @@ static int vcnl4000_measure(struct vcnl4000_data *data, u8 req_mask, u8 rdy_mask, u8 data_reg, int *val) { int tries = 20; -__be16 buf;int ret;mutex_lock (&data->vcnl4000_lock);
@@ -220,13 +219,12 @@ static int vcnl4000_measure(struct vcnl4000_data *data, u8 req_mask, goto fail; } - ret =i2c_smbus_read_i2c_block_data (data->client, - data_reg,sizeof (buf), (u8 *) &buf); + ret =i2c_smbus_read_word_swapped (data->client, data_reg);if (ret <0 ) goto fail;mutex_unlock (&data->vcnl4000_lock); - *val =be16_to_cpu (buf); + *val = ret;return 0 ;
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +0 -6
@@ -417,12 +417,6 @@ static void del_sw_ns(struct fs_node *node)static void del_sw_prio (struct fs_node *node) { -struct mlx5_flow_root_namespace *root_ns; -struct mlx5_flow_namespace *ns; - -fs_get_obj (ns, node); - root_ns = container_of(ns, struct mlx5_flow_root_namespace, ns); -mutex_destroy (&root_ns->chain_lock);kfree (node); }
drivers/net/ethernet/mellanox/mlx5/core/main.c +18 -0
@@ -1554,6 +1554,22 @@ static void shutdown(struct pci_dev *pdev)mlx5_pci_disable_device (dev); } +static int mlx5_suspend (struct pci_dev *pdev,pm_message_t state) +{ +struct mlx5_core_dev *dev =pci_get_drvdata (pdev); + +mlx5_unload_one (dev, false); + +return 0 ; +} + +static int mlx5_resume (struct pci_dev *pdev) +{ +struct mlx5_core_dev *dev =pci_get_drvdata (pdev); + +return mlx5_load_one (dev, false); +} +static const struct pci_device_id mlx5_core_pci_table[] = { {PCI_VDEVICE (MELLANOX ,PCI_DEVICE_ID_MELLANOX_CONNECTIB ) }, {PCI_VDEVICE (MELLANOX ,0x1012 ),MLX5_PCI_DEV_IS_VF },/* Connect-IB VF */
@@ -1597,6 +1613,8 @@ static struct pci_driver mlx5_core_driver = { .id_table = mlx5_core_pci_table, .probe = init_one, .remove = remove_one, + .suspend = mlx5_suspend, + .resume = mlx5_resume, .shutdown = shutdown, .err_handler = &mlx5_err_handler, .sriov_configure = mlx5_core_sriov_configure,
drivers/net/ethernet/netronome/nfp/flower/offload.c +2 -1
@@ -1368,7 +1368,8 @@ __nfp_flower_update_merge_stats(struct nfp_app *app, ctx_id =be32_to_cpu (sub_flow->meta.host_ctx_id); priv->stats[ctx_id].pkts += pkts; priv->stats[ctx_id].bytes += bytes; -max_t (u64, priv->stats[ctx_id].used, used); + priv->stats[ctx_id].used =max_t (u64, used, + priv->stats[ctx_id].used); } }
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +2 -1
@@ -630,7 +630,8 @@ static int stmmac_hwtstamp_set(struct net_device *dev, struct ifreq *ifr) config.rx_filter =HWTSTAMP_FILTER_PTP_V2_EVENT ; ptp_v2 =PTP_TCR_TSVER2ENA ; snap_type_sel =PTP_TCR_SNAPTYPSEL_1 ; - ts_event_en =PTP_TCR_TSEVNTENA ; +if (priv->synopsys_id !=DWMAC_CORE_5_10 ) + ts_event_en =PTP_TCR_TSEVNTENA ; ptp_over_ipv4_udp =PTP_TCR_TSIPV4ENA ; ptp_over_ipv6_udp =PTP_TCR_TSIPV6ENA ; ptp_over_ethernet =PTP_TCR_TSIPENA ;
drivers/net/usb/qmi_wwan.c +1 -0
@@ -1324,6 +1324,7 @@ static const struct usb_device_id products[] = { {QMI_FIXED_INTF(0x1bbb, 0x0203, 2)}, /* Alcatel L800MA */ {QMI_FIXED_INTF(0x2357, 0x0201, 4)}, /* TP-LINK HSUPA Modem MA180 */ {QMI_FIXED_INTF(0x2357, 0x9000, 4)}, /* TP-LINK MA260 */ + {QMI_QUIRK_SET_DTR(0x1bc7, 0x1031, 3)}, /* Telit LE910C1-EUX */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1040, 2)}, /* Telit LE922A */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1050, 2)}, /* Telit FN980 */ {QMI_FIXED_INTF(0x1bc7, 0x1100, 3)}, /* Telit ME910 */
drivers/nfc/st21nfca/dep.c +3 -1
@@ -173,8 +173,10 @@ static int st21nfca_tm_send_atr_res(struct nfc_hci_dev *hdev,memcpy (atr_res->gbi, atr_req->gbi, gb_len); r =nfc_set_remote_general_bytes (hdev->ndev, atr_res->gbi, gb_len); -if (r <0 ) +if (r <0 ) { +kfree_skb (skb);return r; + } } info->dep_info.curr_nfc_dep_pni =0 ;
drivers/nvmem/qfprom.c +0 -14
@@ -27,25 +27,11 @@ static int qfprom_reg_read(void *context,return 0 ; } -static int qfprom_reg_write (void *context, -unsigned int reg,void *_val,size_t bytes) -{ -struct qfprom_priv *priv = context; -u8 *val = _val; -int i =0 , words = bytes; - -while (words--) -writeb (*val++, priv->base + reg + i++); - -return 0 ; -} -static struct nvmem_config econfig = { .name ="qfprom" , .stride =1 , .word_size =1 , .reg_read = qfprom_reg_read, - .reg_write = qfprom_reg_write, };static int qfprom_probe (struct platform_device *pdev)
drivers/staging/rtl8712/wifi.h +1 -8
@@ -440,7 +440,7 @@ static inline unsigned char *get_hdr_bssid(unsigned char *pframe)/* block-ack parameters */ #define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002#define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C -#define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFA0 +#define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFC0#define IEEE80211_DELBA_PARAM_TID_MASK 0xF000#define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800
@@ -532,13 +532,6 @@ struct ieee80211_ht_addt_info {#define IEEE80211_HT_IE_NON_GF_STA_PRSNT 0x0004#define IEEE80211_HT_IE_NON_HT_STA_PRSNT 0x0010 -/* block-ack parameters */ -#define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002 -#define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C -#define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFA0 -#define IEEE80211_DELBA_PARAM_TID_MASK 0xF000 -#define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800 -/* * A-PMDU buffer sizes * According to IEEE802.11n spec size varies from 8K to 64K (in powers of 2)
drivers/tty/hvc/hvc_console.c +8 -15
@@ -371,15 +371,14 @@ static int hvc_open(struct tty_struct *tty, struct file * filp)* tty fields and return the kref reference. */ if (rc) { -tty_port_tty_set (&hp->port,NULL ); - tty->driver_data =NULL ; -tty_port_put (&hp->port);printk (KERN_ERR "hvc_open: request_irq failed with rc %d.\n" , rc); - }else + }else {/* We are ready... raise DTR/RTS */ if (C_BAUD (tty))if (hp->ops->dtr_rts) hp->ops->dtr_rts (hp,1 ); +tty_port_set_initialized (&hp->port, true); + }/* Force wakeup of the polling thread */ hvc_kick ();
@@ -389,22 +388,12 @@ static int hvc_open(struct tty_struct *tty, struct file * filp)static void hvc_close (struct tty_struct *tty,struct file * filp) { -struct hvc_struct *hp; +struct hvc_struct *hp = tty->driver_data;unsigned long flags;if (tty_hung_up_p (filp))return ; -/* -* No driver_data means that this close was issued after a failed -* hvc_open by the tty layer's release_dev() function and we can just -* exit cleanly because the kref reference wasn't made. -*/ -if (!tty->driver_data) -return ; - - hp = tty->driver_data; -spin_lock_irqsave (&hp->port.lock, flags);if (--hp->port.count ==0 ) {
@@ -412,6 +401,9 @@ static void hvc_close(struct tty_struct *tty, struct file * filp)/* We are done with the tty pointer now. */ tty_port_tty_set (&hp->port,NULL ); +if (!tty_port_initialized (&hp->port)) +return ; +if (C_HUPCL (tty))if (hp->ops->dtr_rts) hp->ops->dtr_rts (hp,0 );
@@ -428,6 +420,7 @@ static void hvc_close(struct tty_struct *tty, struct file * filp)* waking periodically to check chars_in_buffer(). */ tty_wait_until_sent (tty,HVC_CLOSE_WAIT ); +tty_port_set_initialized (&hp->port, false); }else {if (hp->port.count <0 ) printk(KERN_ERR "hvc_close %X: oops, count is %d\n",
drivers/tty/vt/keyboard.c +16 -10
@@ -127,7 +127,11 @@ static DEFINE_SPINLOCK(func_buf_lock); /* guard 'func_buf' and friends */static unsigned long key_down[BITS_TO_LONGS (KEY_CNT )];/* keyboard key bitmap */ static unsigned char shift_down[NR_SHIFT ];/* shift state counters.. */ static bool dead_key_next; -static int npadch =-1 ;/* -1 or number assembled on pad */ + +/* Handles a number being assembled on the number pad */ +static bool npadch_active; +static unsigned int npadch_value; +static unsigned int diacr;static char rep;/* flag telling character repeat */
@@ -845,12 +849,12 @@ static void k_shift(struct vc_data *vc, unsigned char value, char up_flag) shift_state &= ~(1 << value);/* kludge */ -if (up_flag && shift_state != old_state && npadch !=-1 ) { +if (up_flag && shift_state != old_state && npadch_active) {if (kbd->kbdmode ==VC_UNICODE ) -to_utf8 (vc, npadch); +to_utf8 (vc, npadch_value);else -put_queue (vc, npadch &0xff ); - npadch =-1 ; +put_queue (vc, npadch_value &0xff ); + npadch_active = false; } }
@@ -868,7 +872,7 @@ static void k_meta(struct vc_data *vc, unsigned char value, char up_flag)static void k_ascii (struct vc_data *vc,unsigned char value,char up_flag) { -int base; +unsigned int base;if (up_flag)return ;
@@ -882,10 +886,12 @@ static void k_ascii(struct vc_data *vc, unsigned char value, char up_flag) base =16 ; } -if (npadch ==-1 ) - npadch = value; -else - npadch = npadch * base + value; +if (!npadch_active) { + npadch_value =0 ; + npadch_active = true; + } + + npadch_value = npadch_value * base + value; }static void k_lock (struct vc_data *vc,unsigned char value,char up_flag)
drivers/usb/class/cdc-acm.c +1 -1
@@ -584,7 +584,7 @@ static void acm_softint(struct work_struct *work) }if (test_and_clear_bit (ACM_ERROR_DELAY , &acm->flags)) { -for (i =0 ; i <ACM_NR ; i++) +for (i =0 ; i < acm->rx_buflimit; i++)if (test_and_clear_bit (i, &acm->urbs_in_error_delay))acm_submit_read_urb (acm, i,GFP_NOIO ); }
drivers/usb/musb/musb_core.c +7 -0
@@ -2721,6 +2721,13 @@ static int musb_resume(struct device *dev)musb_enable_interrupts (musb);musb_platform_enable (musb); +/* session might be disabled in suspend */ +if (musb->port_mode ==MUSB_HOST && + !(musb->ops->quirks &MUSB_PRESERVE_SESSION )) { + devctl |=MUSB_DEVCTL_SESSION ; +musb_writeb (musb->mregs,MUSB_DEVCTL , devctl); + } +spin_lock_irqsave (&musb->lock, flags); error =musb_run_resume_work (musb);if (error)
drivers/usb/musb/musb_debugfs.c +5 -5
@@ -168,6 +168,11 @@ static ssize_t musb_test_mode_write(struct file *file,u8 test;char buf[24 ]; +memset (buf,0x00 ,sizeof (buf)); + +if (copy_from_user (buf, ubuf,min_t (size_t,sizeof (buf) -1 , count))) +return -EFAULT ; +pm_runtime_get_sync (musb->controller); test =musb_readb (musb->mregs,MUSB_TESTMODE );if (test) {
@@ -176,11 +181,6 @@ static ssize_t musb_test_mode_write(struct file *file, goto ret; } -memset (buf,0x00 ,sizeof (buf)); - -if (copy_from_user (buf, ubuf,min_t (size_t,sizeof (buf) -1 , count))) -return -EFAULT ; -if (strstarts (buf,"force host full-speed" )) test =MUSB_TEST_FORCE_HOST |MUSB_TEST_FORCE_FS ;
drivers/usb/serial/ch341.c +53 -0
71 lines not on this page · raw message
drivers/usb/serial/option.c +4 -0
@@ -1157,6 +1157,10 @@ static const struct usb_device_id option_ids[] = { { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_SINGLE) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_DE910_DUAL) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UE910_V2) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1031, 0xff), /* Telit LE910C1-EUX */ + .driver_info = NCTRL(0) | RSVD(3) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1033, 0xff), /* Telit LE910C1-EUX (ECM) */ + .driver_info = NCTRL(0) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE922_USBCFG0), .driver_info = RSVD(0) | RSVD(1) | NCTRL(2) | RSVD(3) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE922_USBCFG1),
drivers/usb/serial/qcserial.c +1 -0
@@ -173,6 +173,7 @@ static const struct usb_device_id id_table[] = { {DEVICE_SWI(0x413c, 0x81b3)}, /* Dell Wireless 5809e Gobi(TM) 4G LTE Mobile Broadband Card (rev3) */ {DEVICE_SWI(0x413c, 0x81b5)}, /* Dell Wireless 5811e QDL */ {DEVICE_SWI(0x413c, 0x81b6)}, /* Dell Wireless 5811e QDL */ + {DEVICE_SWI(0x413c, 0x81cb)}, /* Dell Wireless 5816e QDL */ {DEVICE_SWI(0x413c, 0x81cc)}, /* Dell Wireless 5816e */ {DEVICE_SWI(0x413c, 0x81cf)}, /* Dell Wireless 5819 */ {DEVICE_SWI(0x413c, 0x81d0)}, /* Dell Wireless 5819 */
drivers/usb/serial/usb_wwan.c +4 -0
@@ -270,6 +270,10 @@ static void usb_wwan_indat_callback(struct urb *urb)if (status) {dev_dbg (dev,"%s: nonzero status: %d on endpoint %02x.\n" , __func__, status, endpoint); + +/* don't resubmit on fatal errors */ +if (status == -ESHUTDOWN || status == -ENOENT ) +return ; }else {if (urb->actual_length) { tty_insert_flip_string(&port->port, data,
include/linux/mod_devicetable.h +6 -0
@@ -657,6 +657,10 @@ struct mips_cdmm_device_id {/* * MODULE_DEVICE_TABLE expects this struct to be called x86cpu_device_id. * Although gcc seems to ignore this error, clang fails without this define. +* +* Note: The ordering of the struct is different from upstream because the +* static initializers in kernels < 5.7 still use C89 style while upstream +* has been converted to proper C99 initializers. */ #define x86cpu_device_id x86_cpu_idstruct x86_cpu_id {
@@ -665,6 +669,7 @@ struct x86_cpu_id {__u16 model;__u16 feature;/* bit index */ kernel_ulong_t driver_data; +__u16 steppings; };#define X86_FEATURE_MATCH (x) \
@@ -673,6 +678,7 @@ struct x86_cpu_id {#define X86_VENDOR_ANY 0xffff#define X86_FAMILY_ANY 0#define X86_MODEL_ANY 0 +#define X86_STEPPING_ANY 0#define X86_FEATURE_ANY 0/* Same as FPU, you can't test for that */ /*
include/linux/virtio_net.h +18 -7
@@ -31,6 +31,7 @@ static inline int virtio_net_hdr_to_skb(struct sk_buff *skb, {unsigned int gso_type =0 ;unsigned int thlen =0 ; +unsigned int p_off =0 ;unsigned int ip_proto;if (hdr->gso_type !=VIRTIO_NET_HDR_GSO_NONE ) {
@@ -68,7 +69,8 @@ static inline int virtio_net_hdr_to_skb(struct sk_buff *skb,if (!skb_partial_csum_set (skb, start, off))return -EINVAL ; -if (skb_transport_offset (skb) + thlen >skb_headlen (skb)) + p_off =skb_transport_offset (skb) + thlen; +if (p_off >skb_headlen (skb))return -EINVAL ; }else {/* gso packets without NEEDS_CSUM do not set transport_offset.
@@ -92,23 +94,32 @@ static inline int virtio_net_hdr_to_skb(struct sk_buff *skb,return -EINVAL ; } -if (keys.control.thoff + thlen >skb_headlen (skb) || + p_off = keys.control.thoff + thlen; +if (p_off >skb_headlen (skb) || keys.basic.ip_proto != ip_proto)return -EINVAL ;skb_set_transport_header (skb, keys.control.thoff); + }else if (gso_type) { + p_off = thlen; +if (p_off >skb_headlen (skb)) +return -EINVAL ; } }if (hdr->gso_type !=VIRTIO_NET_HDR_GSO_NONE ) {u16 gso_size =__virtio16_to_cpu (little_endian, hdr->gso_size); +struct skb_shared_info *shinfo =skb_shinfo (skb); -skb_shinfo (skb)->gso_size = gso_size; -skb_shinfo (skb)->gso_type = gso_type; +/* Too small packets are not really GSO ones. */ +if (skb->len - p_off > gso_size) { + shinfo->gso_size = gso_size; + shinfo->gso_type = gso_type; -/* Header must be checked, and gso_segs computed. */ -skb_shinfo (skb)->gso_type |=SKB_GSO_DODGY ; -skb_shinfo (skb)->gso_segs =0 ; +/* Header must be checked, and gso_segs computed. */ + shinfo->gso_type |=SKB_GSO_DODGY ; + shinfo->gso_segs =0 ; + } }return 0 ;
kernel/events/uprobes.c +12 -4
@@ -867,10 +867,6 @@ static int prepare_uprobe(struct uprobe *uprobe, struct file *file,if (ret) goto out; -/* uprobe_write_opcode() assumes we don't cross page boundary */ -BUG_ON ((uprobe->offset & ~PAGE_MASK ) + -UPROBE_SWBP_INSN_SIZE >PAGE_SIZE ); -smp_wmb ();/* pairs with the smp_rmb() in handle_swbp() */ set_bit (UPROBE_COPY_INSN , &uprobe->flags);
@@ -1166,6 +1162,15 @@ static int __uprobe_register(struct inode *inode, loff_t offset,if (offset >i_size_read (inode))return -EINVAL ; +/* +* This ensures that copy_from_page(), copy_to_page() and +* __update_ref_ctr() can't cross page boundary. +*/ +if (!IS_ALIGNED (offset,UPROBE_SWBP_INSN_SIZE )) +return -EINVAL ; +if (!IS_ALIGNED (ref_ctr_offset,sizeof (short ))) +return -EINVAL ; + retry: uprobe =alloc_uprobe (inode, offset, ref_ctr_offset);if (!uprobe)
@@ -2014,6 +2019,9 @@ static int is_trap_at_addr(struct mm_struct *mm, unsigned long vaddr)uprobe_opcode_t opcode;int result; +if (WARN_ON_ONCE (!IS_ALIGNED (vaddr,UPROBE_SWBP_INSN_SIZE ))) +return -EINVAL ; +pagefault_disable (); result =__get_user (opcode, (uprobe_opcode_t __user *)vaddr);pagefault_enable ();
net/ipv4/devinet.c +1 -0
@@ -276,6 +276,7 @@ static struct in_device *inetdev_init(struct net_device *dev) err =devinet_sysctl_register (in_dev);if (err) { in_dev->dead =1 ; +neigh_parms_release (&arp_tbl, in_dev->arp_parms);in_dev_put (in_dev); in_dev =NULL ; goto out;
net/l2tp/l2tp_core.c +3 -0
@@ -1460,6 +1460,9 @@ static int l2tp_validate_socket(const struct sock *sk, const struct net *net,if (sk->sk_type !=SOCK_DGRAM )return -EPROTONOSUPPORT ; +if (sk->sk_family !=PF_INET && sk->sk_family !=PF_INET6 ) +return -EPROTONOSUPPORT ; +if ((encap ==L2TP_ENCAPTYPE_UDP && sk->sk_protocol !=IPPROTO_UDP ) || (encap ==L2TP_ENCAPTYPE_IP && sk->sk_protocol !=IPPROTO_L2TP ))return -EPROTONOSUPPORT ;
net/l2tp/l2tp_ip.c +22 -7
@@ -20,7 +20,6 @@#include <net/icmp.h> #include <net/udp.h> #include <net/inet_common.h> -#include <net/inet_hashtables.h> #include <net/tcp_states.h> #include <net/protocol.h> #include <net/xfrm.h>
@@ -209,15 +208,31 @@ static int l2tp_ip_recv(struct sk_buff *skb)return 0 ; } -static int l2tp_ip_open (struct sock *sk) +static int l2tp_ip_hash (struct sock *sk) { -/* Prevent autobind. We don't have ports. */ -inet_sk (sk)->inet_num =IPPROTO_L2TP ; +if (sk_unhashed (sk)) { +write_lock_bh (&l2tp_ip_lock); +sk_add_node (sk, &l2tp_ip_table); +write_unlock_bh (&l2tp_ip_lock); + } +return 0 ; +} +static void l2tp_ip_unhash (struct sock *sk) +{ +if (sk_unhashed (sk)) +return ;write_lock_bh (&l2tp_ip_lock); -sk_add_node (sk, &l2tp_ip_table); +sk_del_node_init (sk);write_unlock_bh (&l2tp_ip_lock); +} + +static int l2tp_ip_open (struct sock *sk) +{ +/* Prevent autobind. We don't have ports. */ +inet_sk (sk)->inet_num =IPPROTO_L2TP ; +l2tp_ip_hash (sk);return 0 ; }
@@ -594,8 +609,8 @@ static struct proto l2tp_ip_prot = { .sendmsg = l2tp_ip_sendmsg, .recvmsg = l2tp_ip_recvmsg, .backlog_rcv = l2tp_ip_backlog_recv, - .hash = inet_hash, - .unhash = inet_unhash, + .hash = l2tp_ip_hash, + .unhash = l2tp_ip_unhash, .obj_size =sizeof (struct l2tp_ip_sock ), #ifdef CONFIG_COMPAT .compat_setsockopt = compat_ip_setsockopt,
net/l2tp/l2tp_ip6.c +22 -8
@@ -20,8 +20,6 @@#include <net/icmp.h> #include <net/udp.h> #include <net/inet_common.h> -#include <net/inet_hashtables.h> -#include <net/inet6_hashtables.h> #include <net/tcp_states.h> #include <net/protocol.h> #include <net/xfrm.h>
@@ -222,15 +220,31 @@ static int l2tp_ip6_recv(struct sk_buff *skb)return 0 ; } -static int l2tp_ip6_open (struct sock *sk) +static int l2tp_ip6_hash (struct sock *sk) { -/* Prevent autobind. We don't have ports. */ -inet_sk (sk)->inet_num =IPPROTO_L2TP ; +if (sk_unhashed (sk)) { +write_lock_bh (&l2tp_ip6_lock); +sk_add_node (sk, &l2tp_ip6_table); +write_unlock_bh (&l2tp_ip6_lock); + } +return 0 ; +} +static void l2tp_ip6_unhash (struct sock *sk) +{ +if (sk_unhashed (sk)) +return ;write_lock_bh (&l2tp_ip6_lock); -sk_add_node (sk, &l2tp_ip6_table); +sk_del_node_init (sk);write_unlock_bh (&l2tp_ip6_lock); +} + +static int l2tp_ip6_open (struct sock *sk) +{ +/* Prevent autobind. We don't have ports. */ +inet_sk (sk)->inet_num =IPPROTO_L2TP ; +l2tp_ip6_hash (sk);return 0 ; }
@@ -728,8 +742,8 @@ static struct proto l2tp_ip6_prot = { .sendmsg = l2tp_ip6_sendmsg, .recvmsg = l2tp_ip6_recvmsg, .backlog_rcv = l2tp_ip6_backlog_recv, - .hash = inet6_hash, - .unhash = inet_unhash, + .hash = l2tp_ip6_hash, + .unhash = l2tp_ip6_unhash, .obj_size =sizeof (struct l2tp_ip6_sock ), #ifdef CONFIG_COMPAT .compat_setsockopt = compat_ipv6_setsockopt,
net/vmw_vsock/af_vsock.c +1 -1
@@ -1275,7 +1275,7 @@ static int vsock_accept(struct socket *sock, struct socket *newsock, int flags,/* Wait for children sockets to appear; these are the new sockets * created upon connection establishment. */ - timeout =sock_sndtimeo (listener, flags &O_NONBLOCK ); + timeout =sock_rcvtimeo (listener, flags &O_NONBLOCK );prepare_to_wait (sk_sleep (listener), &wait,TASK_INTERRUPTIBLE ); while ((connected = vsock_dequeue_accept(listener)) == NULL &&