Linux 5.7.2
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.7.2 kernel.
All users of the 5.7 kernel series must upgrade.
The updated 5.7.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.7.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 | 27 + 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 | 56 +++ 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/nvmem/qfprom.c | 14 drivers/staging/rtl8712/wifi.h | 9 drivers/tty/hvc/hvc_console.c | 23 - drivers/tty/serial/8250/Kconfig | 1 drivers/tty/vt/keyboard.c | 26 + drivers/usb/class/cdc-acm.c | 2 drivers/usb/musb/jz4740.c | 4 drivers/usb/musb/musb_core.c | 7 drivers/usb/musb/musb_debugfs.c | 10 drivers/usb/serial/ch341.c | 68 ++++ drivers/usb/serial/option.c | 4 drivers/usb/serial/qcserial.c | 1 drivers/usb/serial/usb_wwan.c | 4 include/linux/mod_devicetable.h | 2 kernel/events/uprobes.c | 16 - 32 files changed, 531 insertions(+), 110 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
Daniele Palmas (1):
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
Fabrice Gasnier (1):
iio: adc: stm32-adc: fix a wrong error message when probing interrupts
Greg Kroah-Hartman (1):
Linux 5.7.2
Jiri Slaby (1):
tty: hvc_console, fix crashes on parallel open/close
Johan Hovold (1):
USB: serial: ch341: fix lockup of devices with limited prescaler
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
Josh Triplett (1):
serial: 8250: Enable 16550A variants by default on non-x86
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
Paul Cercueil (1):
usb: musb: jz4740: Prevent lockup when CONFIG_SMP is set
Srinivas Kandagatla (1):
nvmem: qfprom: remove incorrect write support
Greg Kroah-Hartman
maintainerDocumentation/ABI/testing/sysfs-devices-system-cpu +1 -0
@@ -492,6 +492,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
@@ -4757,6 +4757,26 @@ the kernel will oops in either "warn" or "fatal" mode. + 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 = 7 -SUBLEVEL = 1 +SUBLEVEL = 2 EXTRAVERSION = NAME = Kleptomaniac Octopus
arch/x86/include/asm/cpu_device_id.h +24 -3
@@ -20,12 +20,14 @@#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_FEATURE - Base macro for CPU matching +* 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
@@ -37,15 +39,34 @@* into another macro at the usage site for good reasons, then please * start this local macro with X86_MATCH to allow easy grepping. */ -#define X86_MATCH_VENDOR_FAM_MODEL_FEATURE (_vendor, _family, _model, \ - _feature, _data) { \ +#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 \ } +/** +* X86_MATCH_VENDOR_FAM_MODEL_FEATURE - 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 +* @_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. +* +* The steppings arguments of X86_MATCH_VENDOR_FAM_MODEL_STEPPINGS_FEATURE() is +* set to wildcards. +*/ +#define X86_MATCH_VENDOR_FAM_MODEL_FEATURE (vendor, family, model, feature, data) \ + X86_MATCH_VENDOR_FAM_MODEL_STEPPINGS_FEATURE(vendor, family, model, \ + X86_STEPPING_ANY, feature, data) +/** * X86_MATCH_VENDOR_FAM_FEATURE - Macro for matching vendor, family and CPU feature * @vendor: The vendor name, e.g. INTEL, AMD, HYGON, ..., ANY
arch/x86/include/asm/cpufeatures.h +2 -0
@@ -362,6 +362,7 @@#define X86_FEATURE_AVX512_4FMAPS (18*32+ 3)/* AVX-512 Multiply Accumulation Single precision */ #define X86_FEATURE_FSRM (18*32+ 4)/* Fast Short Rep Mov */ #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 */
@@ -407,5 +408,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
@@ -128,6 +128,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 +45 -11
105 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
@@ -39,13 +39,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
@@ -562,6 +562,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);
@@ -570,6 +576,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,
@@ -580,6 +587,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; };/**
@@ -375,21 +377,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,
@@ -400,9 +396,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); }
@@ -420,11 +414,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,
@@ -817,6 +808,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 = {
@@ -824,6 +816,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 = {
@@ -831,6 +824,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
@@ -219,7 +219,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);
@@ -246,13 +245,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/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/serial/8250/Kconfig +1 -0
@@ -63,6 +63,7 @@ config SERIAL_8250_PNP config SERIAL_8250_16550A_VARIANTS bool "Support for variants of the 16550A serial port" depends on SERIAL_8250 + default !X86 help The 8250 driver can probe for many variants of the venerable 16550A serial port. Doing so takes additional time at boot.
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/jz4740.c +2 -2
@@ -30,11 +30,11 @@ static irqreturn_t jz4740_musb_interrupt(int irq, void *__hci)irqreturn_t retval =IRQ_NONE , retval_dma =IRQ_NONE ;struct musb *musb = __hci; -spin_lock_irqsave (&musb->lock, flags); -if (IS_ENABLED (CONFIG_USB_INVENTRA_DMA ) && musb->dma_controller) retval_dma =dma_controller_irq (irq, musb->dma_controller); +spin_lock_irqsave (&musb->lock, flags); + musb->int_usb =musb_readb (musb->mregs,MUSB_INTRUSB ); musb->int_tx =musb_readw (musb->mregs,MUSB_INTRTX ); musb->int_rx =musb_readw (musb->mregs,MUSB_INTRRX );
drivers/usb/musb/musb_core.c +7 -0
@@ -2877,6 +2877,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 +65 -3
113 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 +2 -0
@@ -663,6 +663,7 @@ struct x86_cpu_id {__u16 vendor;__u16 family;__u16 model; +__u16 steppings;__u16 feature;/* bit index */ kernel_ulong_t driver_data; };
@@ -671,6 +672,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 */ /*
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 ();