Merge 5.18-rc5 into tty-next
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 2 May 2022 12:56:14 +0000 (14:56 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 2 May 2022 12:56:14 +0000 (14:56 +0200)
We need the tty/serial fixes in here as well.

Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1  2 
MAINTAINERS
drivers/tty/n_gsm.c
drivers/tty/serial/8250/8250_pci.c
drivers/tty/serial/8250/8250_port.c
drivers/tty/serial/amba-pl011.c
drivers/tty/serial/imx.c
drivers/tty/serial/sc16is7xx.c

diff --combined MAINTAINERS
@@@ -201,6 -201,7 +201,7 @@@ F: include/net/ieee80211_radiotap.
  F:    include/net/iw_handler.h
  F:    include/net/wext.h
  F:    include/uapi/linux/nl80211.h
+ F:    include/uapi/linux/wireless.h
  F:    net/wireless/
  
  8169 10/100/1000 GIGABIT ETHERNET DRIVER
@@@ -2636,13 -2637,14 +2637,14 @@@ F:   sound/soc/rockchip
  N:    rockchip
  
  ARM/SAMSUNG S3C, S5P AND EXYNOS ARM ARCHITECTURES
- M:    Krzysztof Kozlowski <krzk@kernel.org>
+ M:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
  R:    Alim Akhtar <alim.akhtar@samsung.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  L:    linux-samsung-soc@vger.kernel.org
  S:    Maintained
  C:    irc://irc.libera.chat/linux-exynos
  Q:    https://patchwork.kernel.org/project/linux-samsung-soc/list/
+ B:    mailto:linux-samsung-soc@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux.git
  F:    Documentation/arm/samsung/
  F:    Documentation/devicetree/bindings/arm/samsung/
@@@ -3742,7 -3744,7 +3744,7 @@@ F:      include/linux/platform_data/b53.
  
  BROADCOM BCM2711/BCM2835 ARM ARCHITECTURE
  M:    Nicolas Saenz Julienne <nsaenz@kernel.org>
- L:    bcm-kernel-feedback-list@broadcom.com
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-rpi-kernel@lists.infradead.org (moderated for non-subscribers)
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
@@@ -3757,7 -3759,7 +3759,7 @@@ BROADCOM BCM281XX/BCM11XXX/BCM216XX AR
  M:    Florian Fainelli <f.fainelli@gmail.com>
  M:    Ray Jui <rjui@broadcom.com>
  M:    Scott Branden <sbranden@broadcom.com>
- M:    bcm-kernel-feedback-list@broadcom.com
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  S:    Maintained
  T:    git git://github.com/broadcom/mach-bcm
  F:    arch/arm/mach-bcm/
@@@ -3777,7 -3779,7 +3779,7 @@@ F:      arch/mips/include/asm/mach-bcm47xx/
  
  BROADCOM BCM4908 ETHERNET DRIVER
  M:    Rafał Miłecki <rafal@milecki.pl>
- M:    bcm-kernel-feedback-list@broadcom.com
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/net/brcm,bcm4908-enet.yaml
@@@ -3786,7 -3788,7 +3788,7 @@@ F:      drivers/net/ethernet/broadcom/unimac
  
  BROADCOM BCM4908 PINMUX DRIVER
  M:    Rafał Miłecki <rafal@milecki.pl>
- M:    bcm-kernel-feedback-list@broadcom.com
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-gpio@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/pinctrl/brcm,bcm4908-pinctrl.yaml
@@@ -3796,7 -3798,7 +3798,7 @@@ BROADCOM BCM5301X ARM ARCHITECTUR
  M:    Florian Fainelli <f.fainelli@gmail.com>
  M:    Hauke Mehrtens <hauke@hauke-m.de>
  M:    Rafał Miłecki <zajec5@gmail.com>
- M:    bcm-kernel-feedback-list@broadcom.com
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  F:    arch/arm/boot/dts/bcm470*
@@@ -3807,7 -3809,7 +3809,7 @@@ F:      arch/arm/mach-bcm/bcm_5301x.
  BROADCOM BCM53573 ARM ARCHITECTURE
  M:    Florian Fainelli <f.fainelli@gmail.com>
  M:    Rafał Miłecki <rafal@milecki.pl>
- L:    bcm-kernel-feedback-list@broadcom.com
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  F:    arch/arm/boot/dts/bcm47189*
@@@ -3815,7 -3817,7 +3817,7 @@@ F:      arch/arm/boot/dts/bcm53573
  
  BROADCOM BCM63XX ARM ARCHITECTURE
  M:    Florian Fainelli <f.fainelli@gmail.com>
- M:    bcm-kernel-feedback-list@broadcom.com
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  T:    git git://github.com/broadcom/stblinux.git
@@@ -3829,7 -3831,7 +3831,7 @@@ F:      drivers/usb/gadget/udc/bcm63xx_udc.
  
  BROADCOM BCM7XXX ARM ARCHITECTURE
  M:    Florian Fainelli <f.fainelli@gmail.com>
- M:    bcm-kernel-feedback-list@broadcom.com
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  T:    git git://github.com/broadcom/stblinux.git
@@@ -3847,21 -3849,21 +3849,21 @@@ N:   bcm712
  BROADCOM BDC DRIVER
  M:    Al Cooper <alcooperx@gmail.com>
  L:    linux-usb@vger.kernel.org
- L:    bcm-kernel-feedback-list@broadcom.com
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  S:    Maintained
  F:    Documentation/devicetree/bindings/usb/brcm,bdc.yaml
  F:    drivers/usb/gadget/udc/bdc/
  
  BROADCOM BMIPS CPUFREQ DRIVER
  M:    Markus Mayer <mmayer@broadcom.com>
- M:    bcm-kernel-feedback-list@broadcom.com
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-pm@vger.kernel.org
  S:    Maintained
  F:    drivers/cpufreq/bmips-cpufreq.c
  
  BROADCOM BMIPS MIPS ARCHITECTURE
  M:    Florian Fainelli <f.fainelli@gmail.com>
- L:    bcm-kernel-feedback-list@broadcom.com
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-mips@vger.kernel.org
  S:    Maintained
  T:    git git://github.com/broadcom/stblinux.git
@@@ -3912,7 -3914,9 +3914,9 @@@ BROADCOM BNXT_EN 50 GIGABIT ETHERNET DR
  M:    Michael Chan <michael.chan@broadcom.com>
  L:    netdev@vger.kernel.org
  S:    Supported
+ F:    drivers/firmware/broadcom/tee_bnxt_fw.c
  F:    drivers/net/ethernet/broadcom/bnxt/
+ F:    include/linux/firmware/broadcom/tee_bnxt_fw.h
  
  BROADCOM BRCM80211 IEEE802.11n WIRELESS DRIVER
  M:    Arend van Spriel <aspriel@gmail.com>
@@@ -3927,53 -3931,53 +3931,53 @@@ F:   drivers/net/wireless/broadcom/brcm80
  BROADCOM BRCMSTB GPIO DRIVER
  M:    Doug Berger <opendmb@gmail.com>
  M:    Florian Fainelli <f.fainelli@gmail.com>
- L:    bcm-kernel-feedback-list@broadcom.com
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  S:    Supported
  F:    Documentation/devicetree/bindings/gpio/brcm,brcmstb-gpio.yaml
  F:    drivers/gpio/gpio-brcmstb.c
  
  BROADCOM BRCMSTB I2C DRIVER
  M:    Kamal Dasu <kdasu.kdev@gmail.com>
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-i2c@vger.kernel.org
- L:    bcm-kernel-feedback-list@broadcom.com
  S:    Supported
  F:    Documentation/devicetree/bindings/i2c/brcm,brcmstb-i2c.yaml
  F:    drivers/i2c/busses/i2c-brcmstb.c
  
  BROADCOM BRCMSTB UART DRIVER
  M:    Al Cooper <alcooperx@gmail.com>
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-serial@vger.kernel.org
- L:    bcm-kernel-feedback-list@broadcom.com
  S:    Maintained
  F:    Documentation/devicetree/bindings/serial/brcm,bcm7271-uart.yaml
  F:    drivers/tty/serial/8250/8250_bcm7271.c
  
  BROADCOM BRCMSTB USB EHCI DRIVER
  M:    Al Cooper <alcooperx@gmail.com>
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-usb@vger.kernel.org
- L:    bcm-kernel-feedback-list@broadcom.com
  S:    Maintained
  F:    Documentation/devicetree/bindings/usb/brcm,bcm7445-ehci.yaml
  F:    drivers/usb/host/ehci-brcm.*
  
  BROADCOM BRCMSTB USB PIN MAP DRIVER
  M:    Al Cooper <alcooperx@gmail.com>
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-usb@vger.kernel.org
- L:    bcm-kernel-feedback-list@broadcom.com
  S:    Maintained
  F:    Documentation/devicetree/bindings/usb/brcm,usb-pinmap.yaml
  F:    drivers/usb/misc/brcmstb-usb-pinmap.c
  
  BROADCOM BRCMSTB USB2 and USB3 PHY DRIVER
  M:    Al Cooper <alcooperx@gmail.com>
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-kernel@vger.kernel.org
- L:    bcm-kernel-feedback-list@broadcom.com
  S:    Maintained
  F:    drivers/phy/broadcom/phy-brcm-usb*
  
  BROADCOM ETHERNET PHY DRIVERS
  M:    Florian Fainelli <f.fainelli@gmail.com>
- L:    bcm-kernel-feedback-list@broadcom.com
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    Documentation/devicetree/bindings/net/broadcom-bcm87xx.txt
@@@ -3984,7 -3988,7 +3988,7 @@@ F:      include/linux/brcmphy.
  BROADCOM GENET ETHERNET DRIVER
  M:    Doug Berger <opendmb@gmail.com>
  M:    Florian Fainelli <f.fainelli@gmail.com>
- L:    bcm-kernel-feedback-list@broadcom.com
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    Documentation/devicetree/bindings/net/brcm,bcmgenet.yaml
@@@ -3998,7 -4002,7 +4002,7 @@@ F:      include/linux/platform_data/mdio-bcm
  BROADCOM IPROC ARM ARCHITECTURE
  M:    Ray Jui <rjui@broadcom.com>
  M:    Scott Branden <sbranden@broadcom.com>
- M:    bcm-kernel-feedback-list@broadcom.com
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  T:    git git://github.com/broadcom/stblinux.git
@@@ -4026,7 -4030,7 +4030,7 @@@ N:      stingra
  
  BROADCOM IPROC GBIT ETHERNET DRIVER
  M:    Rafał Miłecki <rafal@milecki.pl>
- M:    bcm-kernel-feedback-list@broadcom.com
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/net/brcm,amac.yaml
@@@ -4035,7 -4039,7 +4039,7 @@@ F:      drivers/net/ethernet/broadcom/unimac
  
  BROADCOM KONA GPIO DRIVER
  M:    Ray Jui <rjui@broadcom.com>
- L:    bcm-kernel-feedback-list@broadcom.com
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  S:    Supported
  F:    Documentation/devicetree/bindings/gpio/brcm,kona-gpio.txt
  F:    drivers/gpio/gpio-bcm-kona.c
@@@ -4068,7 -4072,7 +4072,7 @@@ F:      drivers/firmware/broadcom/
  BROADCOM PMB (POWER MANAGEMENT BUS) DRIVER
  M:    Rafał Miłecki <rafal@milecki.pl>
  M:    Florian Fainelli <f.fainelli@gmail.com>
- M:    bcm-kernel-feedback-list@broadcom.com
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-pm@vger.kernel.org
  S:    Maintained
  T:    git git://github.com/broadcom/stblinux.git
@@@ -4084,7 -4088,7 +4088,7 @@@ F:      include/linux/bcma
  
  BROADCOM SPI DRIVER
  M:    Kamal Dasu <kdasu.kdev@gmail.com>
- M:    bcm-kernel-feedback-list@broadcom.com
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  S:    Maintained
  F:    Documentation/devicetree/bindings/spi/brcm,spi-bcm-qspi.yaml
  F:    drivers/spi/spi-bcm-qspi.*
@@@ -4093,7 -4097,7 +4097,7 @@@ F:      drivers/spi/spi-iproc-qspi.
  
  BROADCOM STB AVS CPUFREQ DRIVER
  M:    Markus Mayer <mmayer@broadcom.com>
- M:    bcm-kernel-feedback-list@broadcom.com
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-pm@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/cpufreq/brcm,stb-avs-cpu-freq.txt
@@@ -4101,7 -4105,7 +4105,7 @@@ F:      drivers/cpufreq/brcmstb
  
  BROADCOM STB AVS TMON DRIVER
  M:    Markus Mayer <mmayer@broadcom.com>
- M:    bcm-kernel-feedback-list@broadcom.com
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-pm@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/thermal/brcm,avs-tmon.yaml
@@@ -4109,7 -4113,7 +4113,7 @@@ F:      drivers/thermal/broadcom/brcmstb
  
  BROADCOM STB DPFE DRIVER
  M:    Markus Mayer <mmayer@broadcom.com>
- M:    bcm-kernel-feedback-list@broadcom.com
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  F:    Documentation/devicetree/bindings/memory-controllers/brcm,dpfe-cpu.yaml
@@@ -4118,8 -4122,8 +4122,8 @@@ F:      drivers/memory/brcmstb_dpfe.
  BROADCOM STB NAND FLASH DRIVER
  M:    Brian Norris <computersforpeace@gmail.com>
  M:    Kamal Dasu <kdasu.kdev@gmail.com>
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-mtd@lists.infradead.org
- L:    bcm-kernel-feedback-list@broadcom.com
  S:    Maintained
  F:    drivers/mtd/nand/raw/brcmnand/
  F:    include/linux/platform_data/brcmnand.h
@@@ -4128,7 -4132,7 +4132,7 @@@ BROADCOM STB PCIE DRIVE
  M:    Jim Quinlan <jim2101024@gmail.com>
  M:    Nicolas Saenz Julienne <nsaenz@kernel.org>
  M:    Florian Fainelli <f.fainelli@gmail.com>
- M:    bcm-kernel-feedback-list@broadcom.com
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-pci@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/pci/brcm,stb-pcie.yaml
@@@ -4136,7 -4140,7 +4140,7 @@@ F:      drivers/pci/controller/pcie-brcmstb.
  
  BROADCOM SYSTEMPORT ETHERNET DRIVER
  M:    Florian Fainelli <f.fainelli@gmail.com>
- L:    bcm-kernel-feedback-list@broadcom.com
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    drivers/net/ethernet/broadcom/bcmsysport.*
@@@ -4153,7 -4157,7 +4157,7 @@@ F:      drivers/net/ethernet/broadcom/tg3.
  
  BROADCOM VK DRIVER
  M:    Scott Branden <scott.branden@broadcom.com>
- L:    bcm-kernel-feedback-list@broadcom.com
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  S:    Supported
  F:    drivers/misc/bcm-vk/
  F:    include/uapi/linux/misc/bcm_vk.h
@@@ -9336,14 -9340,12 +9340,12 @@@ F:   drivers/pci/hotplug/rpaphp
  
  IBM Power SRIOV Virtual NIC Device Driver
  M:    Dany Madden <drt@linux.ibm.com>
- M:    Sukadev Bhattiprolu <sukadev@linux.ibm.com>
  R:    Thomas Falcon <tlfalcon@linux.ibm.com>
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    drivers/net/ethernet/ibm/ibmvnic.*
  
  IBM Power Virtual Accelerator Switchboard
- M:    Sukadev Bhattiprolu <sukadev@linux.ibm.com>
  L:    linuxppc-dev@lists.ozlabs.org
  S:    Supported
  F:    arch/powerpc/include/asm/vas.h
@@@ -10238,8 -10240,6 +10240,6 @@@ F:   drivers/net/ethernet/sgi/ioc3-eth.
  IOMAP FILESYSTEM LIBRARY
  M:    Christoph Hellwig <hch@infradead.org>
  M:    Darrick J. Wong <djwong@kernel.org>
- M:    linux-xfs@vger.kernel.org
- M:    linux-fsdevel@vger.kernel.org
  L:    linux-xfs@vger.kernel.org
  L:    linux-fsdevel@vger.kernel.org
  S:    Supported
@@@ -10370,6 -10370,7 +10370,7 @@@ F:   include/linux/isapnp.
  ISCSI
  M:    Lee Duncan <lduncan@suse.com>
  M:    Chris Leech <cleech@redhat.com>
+ M:    Mike Christie <michael.christie@oracle.com>
  L:    open-iscsi@googlegroups.com
  L:    linux-scsi@vger.kernel.org
  S:    Maintained
@@@ -10547,6 -10548,7 +10548,7 @@@ M:   Andrey Ryabinin <ryabinin.a.a@gmail.
  R:    Alexander Potapenko <glider@google.com>
  R:    Andrey Konovalov <andreyknvl@gmail.com>
  R:    Dmitry Vyukov <dvyukov@google.com>
+ R:    Vincenzo Frascino <vincenzo.frascino@arm.com>
  L:    kasan-dev@googlegroups.com
  S:    Maintained
  F:    Documentation/dev-tools/kasan.rst
@@@ -11906,7 -11908,7 +11908,7 @@@ F:   drivers/iio/proximity/mb1232.
  
  MAXIM MAX17040 FAMILY FUEL GAUGE DRIVERS
  R:    Iskren Chernev <iskren.chernev@gmail.com>
- R:    Krzysztof Kozlowski <krzk@kernel.org>
+ R:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
  R:    Marek Szyprowski <m.szyprowski@samsung.com>
  R:    Matheus Castello <matheus@castello.eng.br>
  L:    linux-pm@vger.kernel.org
@@@ -11916,7 -11918,7 +11918,7 @@@ F:   drivers/power/supply/max17040_batter
  
  MAXIM MAX17042 FAMILY FUEL GAUGE DRIVERS
  R:    Hans de Goede <hdegoede@redhat.com>
- R:    Krzysztof Kozlowski <krzk@kernel.org>
+ R:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
  R:    Marek Szyprowski <m.szyprowski@samsung.com>
  R:    Sebastian Krzyszkowiak <sebastian.krzyszkowiak@puri.sm>
  R:    Purism Kernel Team <kernel@puri.sm>
@@@ -11968,10 -11970,11 +11970,11 @@@ F:        Documentation/devicetree/bindings/po
  F:    drivers/power/supply/max77976_charger.c
  
  MAXIM MUIC CHARGER DRIVERS FOR EXYNOS BASED BOARDS
- M:    Krzysztof Kozlowski <krzk@kernel.org>
+ M:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
  M:    Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
  L:    linux-pm@vger.kernel.org
  S:    Supported
+ B:    mailto:linux-samsung-soc@vger.kernel.org
  F:    Documentation/devicetree/bindings/power/supply/maxim,max14577.yaml
  F:    Documentation/devicetree/bindings/power/supply/maxim,max77693.yaml
  F:    drivers/power/supply/max14577_charger.c
@@@ -11979,10 -11982,11 +11982,11 @@@ F:        drivers/power/supply/max77693_charge
  
  MAXIM PMIC AND MUIC DRIVERS FOR EXYNOS BASED BOARDS
  M:    Chanwoo Choi <cw00.choi@samsung.com>
- M:    Krzysztof Kozlowski <krzk@kernel.org>
+ M:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
  M:    Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
  L:    linux-kernel@vger.kernel.org
  S:    Supported
+ B:    mailto:linux-samsung-soc@vger.kernel.org
  F:    Documentation/devicetree/bindings/*/maxim,max14577.yaml
  F:    Documentation/devicetree/bindings/*/maxim,max77686.yaml
  F:    Documentation/devicetree/bindings/*/maxim,max77693.yaml
@@@ -12402,7 -12406,7 +12406,7 @@@ F:   drivers/mmc/host/mtk-sd.
  
  MEDIATEK MT76 WIRELESS LAN DRIVER
  M:    Felix Fietkau <nbd@nbd.name>
- M:    Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>
+ M:    Lorenzo Bianconi <lorenzo@kernel.org>
  M:    Ryder Lee <ryder.lee@mediatek.com>
  R:    Shayne Chen <shayne.chen@mediatek.com>
  R:    Sean Wang <sean.wang@mediatek.com>
@@@ -12673,9 -12677,10 +12677,10 @@@ F: mm/memblock.
  F:    tools/testing/memblock/
  
  MEMORY CONTROLLER DRIVERS
- M:    Krzysztof Kozlowski <krzk@kernel.org>
+ M:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
  L:    linux-kernel@vger.kernel.org
  S:    Maintained
+ B:    mailto:krzysztof.kozlowski@linaro.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux-mem-ctrl.git
  F:    Documentation/devicetree/bindings/memory-controllers/
  F:    drivers/memory/
@@@ -13296,7 -13301,7 +13301,7 @@@ F:   drivers/net/phy/motorcomm.
  MOXA SMARTIO/INDUSTIO/INTELLIO SERIAL CARD
  M:    Jiri Slaby <jirislaby@kernel.org>
  S:    Maintained
 -F:    Documentation/driver-api/serial/moxa-smartio.rst
 +F:    Documentation/driver-api/tty/moxa-smartio.rst
  F:    drivers/tty/mxser.*
  
  MR800 AVERMEDIA USB FM RADIO DRIVER
@@@ -13624,6 -13629,7 +13629,7 @@@ F:   net/core/drop_monitor.
  
  NETWORKING DRIVERS
  M:    "David S. Miller" <davem@davemloft.net>
+ M:    Eric Dumazet <edumazet@google.com>
  M:    Jakub Kicinski <kuba@kernel.org>
  M:    Paolo Abeni <pabeni@redhat.com>
  L:    netdev@vger.kernel.org
@@@ -13671,6 -13677,7 +13677,7 @@@ F:   tools/testing/selftests/drivers/net/
  
  NETWORKING [GENERAL]
  M:    "David S. Miller" <davem@davemloft.net>
+ M:    Eric Dumazet <edumazet@google.com>
  M:    Jakub Kicinski <kuba@kernel.org>
  M:    Paolo Abeni <pabeni@redhat.com>
  L:    netdev@vger.kernel.org
@@@ -13817,10 -13824,11 +13824,11 @@@ F:        include/uapi/linux/nexthop.
  F:    net/ipv4/nexthop.c
  
  NFC SUBSYSTEM
- M:    Krzysztof Kozlowski <krzk@kernel.org>
+ M:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
  L:    linux-nfc@lists.01.org (subscribers-only)
  L:    netdev@vger.kernel.org
  S:    Maintained
+ B:    mailto:linux-nfc@lists.01.org
  F:    Documentation/devicetree/bindings/net/nfc/
  F:    drivers/nfc/
  F:    include/linux/platform_data/nfcmrvl.h
@@@ -14134,7 -14142,7 +14142,7 @@@ F:   Documentation/devicetree/bindings/re
  F:    drivers/regulator/pf8x00-regulator.c
  
  NXP PTN5150A CC LOGIC AND EXTCON DRIVER
- M:    Krzysztof Kozlowski <krzk@kernel.org>
+ M:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
  L:    linux-kernel@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/extcon/extcon-ptn5150.yaml
@@@ -14687,7 -14695,7 +14695,7 @@@ F:   scripts/dtc
  
  OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS
  M:    Rob Herring <robh+dt@kernel.org>
- M:    Krzysztof Kozlowski <krzk+dt@kernel.org>
+ M:    Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>
  L:    devicetree@vger.kernel.org
  S:    Maintained
  C:    irc://irc.libera.chat/devicetree
@@@ -15599,7 -15607,7 +15607,7 @@@ F:   drivers/pinctrl/renesas
  
  PIN CONTROLLER - SAMSUNG
  M:    Tomasz Figa <tomasz.figa@gmail.com>
- M:    Krzysztof Kozlowski <krzk@kernel.org>
+ M:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
  M:    Sylwester Nawrocki <s.nawrocki@samsung.com>
  R:    Alim Akhtar <alim.akhtar@samsung.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -15607,6 -15615,7 +15615,7 @@@ L:   linux-samsung-soc@vger.kernel.or
  S:    Maintained
  C:    irc://irc.libera.chat/linux-exynos
  Q:    https://patchwork.kernel.org/project/linux-samsung-soc/list/
+ B:    mailto:linux-samsung-soc@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pinctrl/samsung.git
  F:    Documentation/devicetree/bindings/pinctrl/samsung,pinctrl*yaml
  F:    drivers/pinctrl/samsung/
@@@ -17274,7 -17283,7 +17283,7 @@@ W:   http://www.ibm.com/developerworks/li
  F:    drivers/s390/scsi/zfcp_*
  
  S3C ADC BATTERY DRIVER
- M:    Krzysztof Kozlowski <krzk@kernel.org>
+ M:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
  L:    linux-samsung-soc@vger.kernel.org
  S:    Odd Fixes
  F:    drivers/power/supply/s3c_adc_battery.c
@@@ -17319,15 -17328,16 +17328,16 @@@ F:        Documentation/admin-guide/LSM/SafeSe
  F:    security/safesetid/
  
  SAMSUNG AUDIO (ASoC) DRIVERS
- M:    Krzysztof Kozlowski <krzk@kernel.org>
+ M:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
  M:    Sylwester Nawrocki <s.nawrocki@samsung.com>
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
  S:    Supported
+ B:    mailto:linux-samsung-soc@vger.kernel.org
  F:    Documentation/devicetree/bindings/sound/samsung*
  F:    sound/soc/samsung/
  
  SAMSUNG EXYNOS PSEUDO RANDOM NUMBER GENERATOR (RNG) DRIVER
- M:    Krzysztof Kozlowski <krzk@kernel.org>
+ M:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
  L:    linux-crypto@vger.kernel.org
  L:    linux-samsung-soc@vger.kernel.org
  S:    Maintained
@@@ -17362,11 -17372,12 +17372,12 @@@ S:        Maintaine
  F:    drivers/platform/x86/samsung-laptop.c
  
  SAMSUNG MULTIFUNCTION PMIC DEVICE DRIVERS
- M:    Krzysztof Kozlowski <krzk@kernel.org>
+ M:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
  M:    Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
  L:    linux-kernel@vger.kernel.org
  L:    linux-samsung-soc@vger.kernel.org
  S:    Supported
+ B:    mailto:linux-samsung-soc@vger.kernel.org
  F:    Documentation/devicetree/bindings/clock/samsung,s2mps11.yaml
  F:    Documentation/devicetree/bindings/mfd/samsung,s2m*.yaml
  F:    Documentation/devicetree/bindings/mfd/samsung,s5m*.yaml
@@@ -17388,7 -17399,7 +17399,7 @@@ F:   drivers/media/platform/samsung/s3c-c
  F:    include/media/drv-intf/s3c_camif.h
  
  SAMSUNG S3FWRN5 NFC DRIVER
- M:    Krzysztof Kozlowski <krzk@kernel.org>
+ M:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
  M:    Krzysztof Opasiak <k.opasiak@samsung.com>
  L:    linux-nfc@lists.01.org (subscribers-only)
  S:    Maintained
@@@ -17410,7 -17421,7 +17421,7 @@@ S:   Supporte
  F:    drivers/media/i2c/s5k5baf.c
  
  SAMSUNG S5P Security SubSystem (SSS) DRIVER
- M:    Krzysztof Kozlowski <krzk@kernel.org>
+ M:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
  M:    Vladimir Zapolskiy <vz@mleia.com>
  L:    linux-crypto@vger.kernel.org
  L:    linux-samsung-soc@vger.kernel.org
@@@ -17445,7 -17456,7 +17456,7 @@@ F:   include/linux/clk/samsung.
  F:    include/linux/platform_data/clk-s3c2410.h
  
  SAMSUNG SPI DRIVERS
- M:    Krzysztof Kozlowski <krzk@kernel.org>
+ M:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
  M:    Andi Shyti <andi@etezian.org>
  L:    linux-spi@vger.kernel.org
  L:    linux-samsung-soc@vger.kernel.org
@@@ -17463,7 -17474,7 +17474,7 @@@ F:   drivers/net/ethernet/samsung/sxgbe
  
  SAMSUNG THERMAL DRIVER
  M:    Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
- M:    Krzysztof Kozlowski <krzk@kernel.org>
+ M:    Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
  L:    linux-pm@vger.kernel.org
  L:    linux-samsung-soc@vger.kernel.org
  S:    Maintained
@@@ -17647,8 -17658,8 +17658,8 @@@ K:   \bTIF_SECCOMP\
  
  SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) Broadcom BRCMSTB DRIVER
  M:    Al Cooper <alcooperx@gmail.com>
+ R:    Broadcom Kernel Team <bcm-kernel-feedback-list@broadcom.com>
  L:    linux-mmc@vger.kernel.org
- L:    bcm-kernel-feedback-list@broadcom.com
  S:    Maintained
  F:    drivers/mmc/host/sdhci-brcmstb*
  
@@@ -21227,10 -21238,8 +21238,8 @@@ S:  Maintaine
  F:    drivers/hid/hid-wiimote*
  
  WILOCITY WIL6210 WIRELESS DRIVER
- M:    Maya Erez <merez@codeaurora.org>
  L:    linux-wireless@vger.kernel.org
- L:    wil6210@qti.qualcomm.com
- S:    Supported
+ S:    Orphan
  W:    https://wireless.wiki.kernel.org/en/users/Drivers/wil6210
  F:    drivers/net/wireless/ath/wil6210/
  
@@@ -21434,6 -21443,15 +21443,15 @@@ F: arch/x86/include/asm/uv
  F:    arch/x86/kernel/apic/x2apic_uv_x.c
  F:    arch/x86/platform/uv/
  
+ X86 STACK UNWINDING
+ M:    Josh Poimboeuf <jpoimboe@redhat.com>
+ M:    Peter Zijlstra <peterz@infradead.org>
+ S:    Supported
+ F:    arch/x86/include/asm/unwind*.h
+ F:    arch/x86/kernel/dumpstack.c
+ F:    arch/x86/kernel/stacktrace.c
+ F:    arch/x86/kernel/unwind_*.c
  X86 VDSO
  M:    Andy Lutomirski <luto@kernel.org>
  L:    linux-kernel@vger.kernel.org
@@@ -21596,7 -21614,6 +21614,6 @@@ F:   drivers/xen/*swiotlb
  XFS FILESYSTEM
  C:    irc://irc.oftc.net/xfs
  M:    Darrick J. Wong <djwong@kernel.org>
- M:    linux-xfs@vger.kernel.org
  L:    linux-xfs@vger.kernel.org
  S:    Supported
  W:    http://xfs.org/
diff --combined drivers/tty/n_gsm.c
@@@ -73,6 -73,8 +73,8 @@@ module_param(debug, int, 0600)
   */
  #define MAX_MRU 1500
  #define MAX_MTU 1500
+ /* SOF, ADDR, CTRL, LEN1, LEN2, ..., FCS, EOF */
+ #define PROT_OVERHEAD 7
  #define       GSM_NET_TX_TIMEOUT (HZ*10)
  
  /*
@@@ -219,7 -221,6 +221,6 @@@ struct gsm_mux 
        int encoding;
        u8 control;
        u8 fcs;
-       u8 received_fcs;
        u8 *txframe;                    /* TX framing buffer */
  
        /* Method for the receiver side */
        int initiator;                  /* Did we initiate connection */
        bool dead;                      /* Has the mux been shut down */
        struct gsm_dlci *dlci[NUM_DLCI];
+       int old_c_iflag;                /* termios c_iflag value before attach */
        bool constipated;               /* Asked by remote to shut up */
  
        spinlock_t tx_lock;
@@@ -271,10 -273,6 +273,6 @@@ static DEFINE_SPINLOCK(gsm_mux_lock)
  
  static struct tty_driver *gsm_tty_driver;
  
- /* Save dlci open address */
- static int addr_open[256] = { 0 };
- /* Save dlci open count */
- static int addr_cnt;
  /*
   *    This section of the driver logic implements the GSM encodings
   *    both the basic and the 'advanced'. Reliable transport is not
@@@ -369,6 -367,7 +367,7 @@@ static const u8 gsm_fcs8[256] = 
  #define GOOD_FCS      0xCF
  
  static int gsmld_output(struct gsm_mux *gsm, u8 *data, int len);
+ static int gsm_modem_update(struct gsm_dlci *dlci, u8 brk);
  
  /**
   *    gsm_fcs_add     -       update FCS
@@@ -749,7 -748,7 +748,7 @@@ static void __gsm_data_queue(struct gsm
  
        *--dp = msg->ctrl;
        if (gsm->initiator)
 -              *--dp = (msg->addr << 2) | 2 | EA;
 +              *--dp = (msg->addr << 2) | CR | EA;
        else
                *--dp = (msg->addr << 2) | EA;
        *fcs = gsm_fcs_add_block(INIT_FCS, dp , msg->data - dp);
@@@ -832,7 -831,7 +831,7 @@@ static int gsm_dlci_data_output(struct 
                        break;
                case 2: /* Unstructed with modem bits.
                Always one byte as we never send inline break data */
-                       *dp++ = gsm_encode_modem(dlci);
+                       *dp++ = (gsm_encode_modem(dlci) << 1) | EA;
                        break;
                }
                WARN_ON(kfifo_out_locked(&dlci->fifo, dp , len, &dlci->lock) != len);
@@@ -916,6 -915,66 +915,66 @@@ static int gsm_dlci_data_output_framed(
        return size;
  }
  
+ /**
+  *    gsm_dlci_modem_output   -       try and push modem status out of a DLCI
+  *    @gsm: mux
+  *    @dlci: the DLCI to pull modem status from
+  *    @brk: break signal
+  *
+  *    Push an empty frame in to the transmit queue to update the modem status
+  *    bits and to transmit an optional break.
+  *
+  *    Caller must hold the tx_lock of the mux.
+  */
+ static int gsm_dlci_modem_output(struct gsm_mux *gsm, struct gsm_dlci *dlci,
+                                u8 brk)
+ {
+       u8 *dp = NULL;
+       struct gsm_msg *msg;
+       int size = 0;
+       /* for modem bits without break data */
+       switch (dlci->adaption) {
+       case 1: /* Unstructured */
+               break;
+       case 2: /* Unstructured with modem bits. */
+               size++;
+               if (brk > 0)
+                       size++;
+               break;
+       default:
+               pr_err("%s: unsupported adaption %d\n", __func__,
+                      dlci->adaption);
+               return -EINVAL;
+       }
+       msg = gsm_data_alloc(gsm, dlci->addr, size, gsm->ftype);
+       if (!msg) {
+               pr_err("%s: gsm_data_alloc error", __func__);
+               return -ENOMEM;
+       }
+       dp = msg->data;
+       switch (dlci->adaption) {
+       case 1: /* Unstructured */
+               break;
+       case 2: /* Unstructured with modem bits. */
+               if (brk == 0) {
+                       *dp++ = (gsm_encode_modem(dlci) << 1) | EA;
+               } else {
+                       *dp++ = gsm_encode_modem(dlci) << 1;
+                       *dp++ = (brk << 4) | 2 | EA; /* Length, Break, EA */
+               }
+               break;
+       default:
+               /* Handled above */
+               break;
+       }
+       __gsm_data_queue(dlci, msg);
+       return size;
+ }
  /**
   *    gsm_dlci_data_sweep             -       look for data to send
   *    @gsm: the GSM mux
@@@ -1093,7 -1152,6 +1152,6 @@@ static void gsm_control_modem(struct gs
  {
        unsigned int addr = 0;
        unsigned int modem = 0;
-       unsigned int brk = 0;
        struct gsm_dlci *dlci;
        int len = clen;
        int slen;
                        return;
        }
        len--;
-       if (len > 0) {
-               while (gsm_read_ea(&brk, *dp++) == 0) {
-                       len--;
-                       if (len == 0)
-                               return;
-               }
-               modem <<= 7;
-               modem |= (brk & 0x7f);
-       }
        tty = tty_port_tty_get(&dlci->port);
-       gsm_process_modem(tty, dlci, modem, slen);
+       gsm_process_modem(tty, dlci, modem, slen - len);
        if (tty) {
                tty_wakeup(tty);
                tty_kref_put(tty);
@@@ -1193,7 -1242,6 +1242,6 @@@ static void gsm_control_rls(struct gsm_
  }
  
  static void gsm_dlci_begin_close(struct gsm_dlci *dlci);
- static void gsm_dlci_close(struct gsm_dlci *dlci);
  
  /**
   *    gsm_control_message     -       DLCI 0 control processing
@@@ -1212,28 -1260,15 +1260,15 @@@ static void gsm_control_message(struct 
  {
        u8 buf[1];
        unsigned long flags;
-       struct gsm_dlci *dlci;
-       int i;
-       int address;
  
        switch (command) {
        case CMD_CLD: {
-               if (addr_cnt > 0) {
-                       for (i = 0; i < addr_cnt; i++) {
-                               address = addr_open[i];
-                               dlci = gsm->dlci[address];
-                               gsm_dlci_close(dlci);
-                               addr_open[i] = 0;
-                       }
-               }
+               struct gsm_dlci *dlci = gsm->dlci[0];
                /* Modem wishes to close down */
-               dlci = gsm->dlci[0];
                if (dlci) {
                        dlci->dead = true;
                        gsm->dead = true;
-                       gsm_dlci_close(dlci);
-                       addr_cnt = 0;
-                       gsm_response(gsm, 0, UA|PF);
+                       gsm_dlci_begin_close(dlci);
                }
                }
                break;
@@@ -1326,11 -1361,12 +1361,12 @@@ static void gsm_control_response(struc
  
  static void gsm_control_transmit(struct gsm_mux *gsm, struct gsm_control *ctrl)
  {
-       struct gsm_msg *msg = gsm_data_alloc(gsm, 0, ctrl->len + 1, gsm->ftype);
+       struct gsm_msg *msg = gsm_data_alloc(gsm, 0, ctrl->len + 2, gsm->ftype);
        if (msg == NULL)
                return;
-       msg->data[0] = (ctrl->cmd << 1) | 2 | EA;       /* command */
-       memcpy(msg->data + 1, ctrl->data, ctrl->len);
+       msg->data[0] = (ctrl->cmd << 1) | CR | EA;      /* command */
+       msg->data[1] = (ctrl->len << 1) | EA;
+       memcpy(msg->data + 2, ctrl->data, ctrl->len);
        gsm_data_queue(gsm->dlci[0], msg);
  }
  
@@@ -1353,7 -1389,6 +1389,6 @@@ static void gsm_control_retransmit(stru
        spin_lock_irqsave(&gsm->control_lock, flags);
        ctrl = gsm->pending_cmd;
        if (ctrl) {
-               gsm->cretries--;
                if (gsm->cretries == 0) {
                        gsm->pending_cmd = NULL;
                        ctrl->error = -ETIMEDOUT;
                        wake_up(&gsm->event);
                        return;
                }
+               gsm->cretries--;
                gsm_control_transmit(gsm, ctrl);
                mod_timer(&gsm->t2_timer, jiffies + gsm->t2 * HZ / 100);
        }
@@@ -1402,7 -1438,7 +1438,7 @@@ retry
  
        /* If DLCI0 is in ADM mode skip retries, it won't respond */
        if (gsm->dlci[0]->mode == DLCI_MODE_ADM)
-               gsm->cretries = 1;
+               gsm->cretries = 0;
        else
                gsm->cretries = gsm->n2;
  
@@@ -1450,20 -1486,22 +1486,22 @@@ static int gsm_control_wait(struct gsm_
  
  static void gsm_dlci_close(struct gsm_dlci *dlci)
  {
+       unsigned long flags;
        del_timer(&dlci->t1);
        if (debug & 8)
                pr_debug("DLCI %d goes closed.\n", dlci->addr);
        dlci->state = DLCI_CLOSED;
        if (dlci->addr != 0) {
                tty_port_tty_hangup(&dlci->port, false);
+               spin_lock_irqsave(&dlci->lock, flags);
                kfifo_reset(&dlci->fifo);
+               spin_unlock_irqrestore(&dlci->lock, flags);
                /* Ensure that gsmtty_open() can return. */
                tty_port_set_initialized(&dlci->port, 0);
                wake_up_interruptible(&dlci->port.open_wait);
        } else
                dlci->gsm->dead = true;
-       /* Unregister gsmtty driver,report gsmtty dev remove uevent for user */
-       tty_unregister_device(gsm_tty_driver, dlci->addr);
        wake_up(&dlci->gsm->event);
        /* A DLCI 0 close is a MUX termination so we need to kick that
           back to userspace somehow */
@@@ -1485,8 -1523,9 +1523,9 @@@ static void gsm_dlci_open(struct gsm_dl
        dlci->state = DLCI_OPEN;
        if (debug & 8)
                pr_debug("DLCI %d goes open.\n", dlci->addr);
-       /* Register gsmtty driver,report gsmtty dev add uevent for user */
-       tty_register_device(gsm_tty_driver, dlci->addr, NULL);
+       /* Send current modem state */
+       if (dlci->addr)
+               gsm_modem_update(dlci, 0);
        wake_up(&dlci->gsm->event);
  }
  
@@@ -1623,6 -1662,7 +1662,7 @@@ static void gsm_dlci_data(struct gsm_dl
                tty = tty_port_tty_get(port);
                if (tty) {
                        gsm_process_modem(tty, dlci, modem, slen);
+                       tty_wakeup(tty);
                        tty_kref_put(tty);
                }
                fallthrough;
@@@ -1793,19 -1833,7 +1833,7 @@@ static void gsm_queue(struct gsm_mux *g
        struct gsm_dlci *dlci;
        u8 cr;
        int address;
-       int i, j, k, address_tmp;
-       /* We have to sneak a look at the packet body to do the FCS.
-          A somewhat layering violation in the spec */
  
-       if ((gsm->control & ~PF) == UI)
-               gsm->fcs = gsm_fcs_add_block(gsm->fcs, gsm->buf, gsm->len);
-       if (gsm->encoding == 0) {
-               /* WARNING: gsm->received_fcs is used for
-               gsm->encoding = 0 only.
-               In this case it contain the last piece of data
-               required to generate final CRC */
-               gsm->fcs = gsm_fcs_add(gsm->fcs, gsm->received_fcs);
-       }
        if (gsm->fcs != GOOD_FCS) {
                gsm->bad_fcs++;
                if (debug & 4)
                else {
                        gsm_response(gsm, address, UA|PF);
                        gsm_dlci_open(dlci);
-                       /* Save dlci open address */
-                       if (address) {
-                               addr_open[addr_cnt] = address;
-                               addr_cnt++;
-                       }
                }
                break;
        case DISC|PF:
                        return;
                }
                /* Real close complete */
-               if (!address) {
-                       if (addr_cnt > 0) {
-                               for (i = 0; i < addr_cnt; i++) {
-                                       address = addr_open[i];
-                                       dlci = gsm->dlci[address];
-                                       gsm_dlci_close(dlci);
-                                       addr_open[i] = 0;
-                               }
-                       }
-                       dlci = gsm->dlci[0];
-                       gsm_dlci_close(dlci);
-                       addr_cnt = 0;
-                       gsm_response(gsm, 0, UA|PF);
-               } else {
-                       gsm_response(gsm, address, UA|PF);
-                       gsm_dlci_close(dlci);
-                       /* clear dlci address */
-                       for (j = 0; j < addr_cnt; j++) {
-                               address_tmp = addr_open[j];
-                               if (address_tmp == address) {
-                                       for (k = j; k < addr_cnt; k++)
-                                               addr_open[k] = addr_open[k+1];
-                                       addr_cnt--;
-                                       break;
-                               }
-                       }
-               }
+               gsm_response(gsm, address, UA|PF);
+               gsm_dlci_close(dlci);
                break;
-       case UA:
        case UA|PF:
                if (cr == 0 || dlci == NULL)
                        break;
        case UI|PF:
        case UIH:
        case UIH|PF:
 -#if 0
 -              if (cr)
 -                      goto invalid;
 -#endif
                if (dlci == NULL || dlci->state != DLCI_OPEN) {
                        gsm_command(gsm, address, DM|PF);
                        return;
@@@ -1989,19 -1990,25 +1986,25 @@@ static void gsm0_receive(struct gsm_mu
                break;
        case GSM_DATA:          /* Data */
                gsm->buf[gsm->count++] = c;
-               if (gsm->count == gsm->len)
+               if (gsm->count == gsm->len) {
+                       /* Calculate final FCS for UI frames over all data */
+                       if ((gsm->control & ~PF) != UIH) {
+                               gsm->fcs = gsm_fcs_add_block(gsm->fcs, gsm->buf,
+                                                            gsm->count);
+                       }
                        gsm->state = GSM_FCS;
+               }
                break;
        case GSM_FCS:           /* FCS follows the packet */
-               gsm->received_fcs = c;
-               gsm_queue(gsm);
+               gsm->fcs = gsm_fcs_add(gsm->fcs, c);
                gsm->state = GSM_SSOF;
                break;
        case GSM_SSOF:
-               if (c == GSM0_SOF) {
-                       gsm->state = GSM_SEARCH;
-                       break;
-               }
+               gsm->state = GSM_SEARCH;
+               if (c == GSM0_SOF)
+                       gsm_queue(gsm);
+               else
+                       gsm->bad_size++;
                break;
        default:
                pr_debug("%s: unhandled state: %d\n", __func__, gsm->state);
  
  static void gsm1_receive(struct gsm_mux *gsm, unsigned char c)
  {
+       /* handle XON/XOFF */
+       if ((c & ISO_IEC_646_MASK) == XON) {
+               gsm->constipated = true;
+               return;
+       } else if ((c & ISO_IEC_646_MASK) == XOFF) {
+               gsm->constipated = false;
+               /* Kick the link in case it is idling */
+               gsm_data_kick(gsm, NULL);
+               return;
+       }
        if (c == GSM1_SOF) {
-               /* EOF is only valid in frame if we have got to the data state
-                  and received at least one byte (the FCS) */
-               if (gsm->state == GSM_DATA && gsm->count) {
-                       /* Extract the FCS */
+               /* EOF is only valid in frame if we have got to the data state */
+               if (gsm->state == GSM_DATA) {
+                       if (gsm->count < 1) {
+                               /* Missing FSC */
+                               gsm->malformed++;
+                               gsm->state = GSM_START;
+                               return;
+                       }
+                       /* Remove the FCS from data */
                        gsm->count--;
+                       if ((gsm->control & ~PF) != UIH) {
+                               /* Calculate final FCS for UI frames over all
+                                * data but FCS
+                                */
+                               gsm->fcs = gsm_fcs_add_block(gsm->fcs, gsm->buf,
+                                                            gsm->count);
+                       }
+                       /* Add the FCS itself to test against GOOD_FCS */
                        gsm->fcs = gsm_fcs_add(gsm->fcs, gsm->buf[gsm->count]);
                        gsm->len = gsm->count;
                        gsm_queue(gsm);
                }
                /* Any partial frame was a runt so go back to start */
                if (gsm->state != GSM_START) {
-                       gsm->malformed++;
+                       if (gsm->state != GSM_SEARCH)
+                               gsm->malformed++;
                        gsm->state = GSM_START;
                }
                /* A SOF in GSM_START means we are still reading idling or
@@@ -2102,74 -2133,43 +2129,43 @@@ static void gsm_error(struct gsm_mux *g
        gsm->io_error++;
  }
  
- static int gsm_disconnect(struct gsm_mux *gsm)
- {
-       struct gsm_dlci *dlci = gsm->dlci[0];
-       struct gsm_control *gc;
-       if (!dlci)
-               return 0;
-       /* In theory disconnecting DLCI 0 is sufficient but for some
-          modems this is apparently not the case. */
-       gc = gsm_control_send(gsm, CMD_CLD, NULL, 0);
-       if (gc)
-               gsm_control_wait(gsm, gc);
-       del_timer_sync(&gsm->t2_timer);
-       /* Now we are sure T2 has stopped */
-       gsm_dlci_begin_close(dlci);
-       wait_event_interruptible(gsm->event,
-                               dlci->state == DLCI_CLOSED);
-       if (signal_pending(current))
-               return -EINTR;
-       return 0;
- }
  /**
   *    gsm_cleanup_mux         -       generic GSM protocol cleanup
   *    @gsm: our mux
+  *    @disc: disconnect link?
   *
   *    Clean up the bits of the mux which are the same for all framing
   *    protocols. Remove the mux from the mux table, stop all the timers
   *    and then shut down each device hanging up the channels as we go.
   */
  
- static void gsm_cleanup_mux(struct gsm_mux *gsm)
+ static void gsm_cleanup_mux(struct gsm_mux *gsm, bool disc)
  {
        int i;
        struct gsm_dlci *dlci = gsm->dlci[0];
        struct gsm_msg *txq, *ntxq;
  
        gsm->dead = true;
+       mutex_lock(&gsm->mutex);
  
-       spin_lock(&gsm_mux_lock);
-       for (i = 0; i < MAX_MUX; i++) {
-               if (gsm_mux[i] == gsm) {
-                       gsm_mux[i] = NULL;
-                       break;
+       if (dlci) {
+               if (disc && dlci->state != DLCI_CLOSED) {
+                       gsm_dlci_begin_close(dlci);
+                       wait_event(gsm->event, dlci->state == DLCI_CLOSED);
                }
+               dlci->dead = true;
        }
-       spin_unlock(&gsm_mux_lock);
-       /* open failed before registering => nothing to do */
-       if (i == MAX_MUX)
-               return;
  
+       /* Finish outstanding timers, making sure they are done */
        del_timer_sync(&gsm->t2_timer);
-       /* Now we are sure T2 has stopped */
-       if (dlci)
-               dlci->dead = true;
  
-       /* Free up any link layer users */
-       mutex_lock(&gsm->mutex);
-       for (i = 0; i < NUM_DLCI; i++)
+       /* Free up any link layer users and finally the control channel */
+       for (i = NUM_DLCI - 1; i >= 0; i--)
                if (gsm->dlci[i])
                        gsm_dlci_release(gsm->dlci[i]);
        mutex_unlock(&gsm->mutex);
        /* Now wipe the queues */
+       tty_ldisc_flush(gsm->tty);
        list_for_each_entry_safe(txq, ntxq, &gsm->tx_list, list)
                kfree(txq);
        INIT_LIST_HEAD(&gsm->tx_list);
  static int gsm_activate_mux(struct gsm_mux *gsm)
  {
        struct gsm_dlci *dlci;
-       int i = 0;
  
        timer_setup(&gsm->t2_timer, gsm_control_retransmit, 0);
        init_waitqueue_head(&gsm->event);
        else
                gsm->receive = gsm1_receive;
  
-       spin_lock(&gsm_mux_lock);
-       for (i = 0; i < MAX_MUX; i++) {
-               if (gsm_mux[i] == NULL) {
-                       gsm->num = i;
-                       gsm_mux[i] = gsm;
-                       break;
-               }
-       }
-       spin_unlock(&gsm_mux_lock);
-       if (i == MAX_MUX)
-               return -EBUSY;
        dlci = gsm_dlci_alloc(gsm, 0);
        if (dlci == NULL)
                return -ENOMEM;
   */
  static void gsm_free_mux(struct gsm_mux *gsm)
  {
+       int i;
+       for (i = 0; i < MAX_MUX; i++) {
+               if (gsm == gsm_mux[i]) {
+                       gsm_mux[i] = NULL;
+                       break;
+               }
+       }
+       mutex_destroy(&gsm->mutex);
        kfree(gsm->txframe);
        kfree(gsm->buf);
        kfree(gsm);
@@@ -2245,12 -2241,20 +2237,20 @@@ static void gsm_free_muxr(struct kref *
  
  static inline void mux_get(struct gsm_mux *gsm)
  {
+       unsigned long flags;
+       spin_lock_irqsave(&gsm_mux_lock, flags);
        kref_get(&gsm->ref);
+       spin_unlock_irqrestore(&gsm_mux_lock, flags);
  }
  
  static inline void mux_put(struct gsm_mux *gsm)
  {
+       unsigned long flags;
+       spin_lock_irqsave(&gsm_mux_lock, flags);
        kref_put(&gsm->ref, gsm_free_muxr);
+       spin_unlock_irqrestore(&gsm_mux_lock, flags);
  }
  
  static inline unsigned int mux_num_to_base(struct gsm_mux *gsm)
@@@ -2271,6 -2275,7 +2271,7 @@@ static inline unsigned int mux_line_to_
  
  static struct gsm_mux *gsm_alloc_mux(void)
  {
+       int i;
        struct gsm_mux *gsm = kzalloc(sizeof(struct gsm_mux), GFP_KERNEL);
        if (gsm == NULL)
                return NULL;
                kfree(gsm);
                return NULL;
        }
-       gsm->txframe = kmalloc(2 * MAX_MRU + 2, GFP_KERNEL);
+       gsm->txframe = kmalloc(2 * (MAX_MTU + PROT_OVERHEAD - 1), GFP_KERNEL);
        if (gsm->txframe == NULL) {
                kfree(gsm->buf);
                kfree(gsm);
        gsm->mtu = 64;
        gsm->dead = true;       /* Avoid early tty opens */
  
+       /* Store the instance to the mux array or abort if no space is
+        * available.
+        */
+       spin_lock(&gsm_mux_lock);
+       for (i = 0; i < MAX_MUX; i++) {
+               if (!gsm_mux[i]) {
+                       gsm_mux[i] = gsm;
+                       gsm->num = i;
+                       break;
+               }
+       }
+       spin_unlock(&gsm_mux_lock);
+       if (i == MAX_MUX) {
+               mutex_destroy(&gsm->mutex);
+               kfree(gsm->txframe);
+               kfree(gsm->buf);
+               kfree(gsm);
+               return NULL;
+       }
        return gsm;
  }
  
@@@ -2335,7 -2360,7 +2356,7 @@@ static int gsm_config(struct gsm_mux *g
        /* Check the MRU/MTU range looks sane */
        if (c->mru > MAX_MRU || c->mtu > MAX_MTU || c->mru < 8 || c->mtu < 8)
                return -EINVAL;
-       if (c->n2 < 3)
+       if (c->n2 > 255)
                return -EINVAL;
        if (c->encapsulation > 1)       /* Basic, advanced, no I */
                return -EINVAL;
  
        /*
         * Close down what is needed, restart and initiate the new
-        * configuration
+        * configuration. On the first time there is no DLCI[0]
+        * and closing or cleaning up is not necessary.
         */
-       if (gsm->initiator && (need_close || need_restart)) {
-               int ret;
-               ret = gsm_disconnect(gsm);
-               if (ret)
-                       return ret;
-       }
-       if (need_restart)
-               gsm_cleanup_mux(gsm);
+       if (need_close || need_restart)
+               gsm_cleanup_mux(gsm, true);
  
        gsm->initiator = c->initiator;
        gsm->mru = c->mru;
@@@ -2446,25 -2463,26 +2459,26 @@@ static int gsmld_attach_gsm(struct tty_
        int ret, i;
  
        gsm->tty = tty_kref_get(tty);
+       /* Turn off tty XON/XOFF handling to handle it explicitly. */
+       gsm->old_c_iflag = tty->termios.c_iflag;
+       tty->termios.c_iflag &= (IXON | IXOFF);
        ret =  gsm_activate_mux(gsm);
        if (ret != 0)
                tty_kref_put(gsm->tty);
        else {
                /* Don't register device 0 - this is the control channel and not
                   a usable tty interface */
-               if (gsm->initiator) {
-                       base = mux_num_to_base(gsm); /* Base for this MUX */
-                       for (i = 1; i < NUM_DLCI; i++) {
-                               struct device *dev;
+               base = mux_num_to_base(gsm); /* Base for this MUX */
+               for (i = 1; i < NUM_DLCI; i++) {
+                       struct device *dev;
  
-                               dev = tty_register_device(gsm_tty_driver,
+                       dev = tty_register_device(gsm_tty_driver,
                                                        base + i, NULL);
-                               if (IS_ERR(dev)) {
-                                       for (i--; i >= 1; i--)
-                                               tty_unregister_device(gsm_tty_driver,
-                                                                       base + i);
-                                       return PTR_ERR(dev);
-                               }
+                       if (IS_ERR(dev)) {
+                               for (i--; i >= 1; i--)
+                                       tty_unregister_device(gsm_tty_driver,
+                                                               base + i);
+                               return PTR_ERR(dev);
                        }
                }
        }
@@@ -2486,11 -2504,10 +2500,10 @@@ static void gsmld_detach_gsm(struct tty
        int i;
  
        WARN_ON(tty != gsm->tty);
-       if (gsm->initiator) {
-               for (i = 1; i < NUM_DLCI; i++)
-                       tty_unregister_device(gsm_tty_driver, base + i);
-       }
-       gsm_cleanup_mux(gsm);
+       for (i = 1; i < NUM_DLCI; i++)
+               tty_unregister_device(gsm_tty_driver, base + i);
+       /* Restore tty XON/XOFF handling. */
+       gsm->tty->termios.c_iflag = gsm->old_c_iflag;
        tty_kref_put(gsm->tty);
        gsm->tty = NULL;
  }
@@@ -2555,6 -2572,12 +2568,12 @@@ static void gsmld_close(struct tty_stru
  {
        struct gsm_mux *gsm = tty->disc_data;
  
+       /* The ldisc locks and closes the port before calling our close. This
+        * means we have no way to do a proper disconnect. We will not bother
+        * to do one.
+        */
+       gsm_cleanup_mux(gsm, false);
        gsmld_detach_gsm(tty, gsm);
  
        gsmld_flush_buffer(tty);
@@@ -2593,7 -2616,7 +2612,7 @@@ static int gsmld_open(struct tty_struc
  
        ret = gsmld_attach_gsm(tty, gsm);
        if (ret != 0) {
-               gsm_cleanup_mux(gsm);
+               gsm_cleanup_mux(gsm, false);
                mux_put(gsm);
        }
        return ret;
@@@ -2950,26 -2973,78 +2969,78 @@@ static struct tty_ldisc_ops tty_ldisc_p
  
  #define TX_SIZE               512
  
- static int gsmtty_modem_update(struct gsm_dlci *dlci, u8 brk)
+ /**
+  *    gsm_modem_upd_via_data  -       send modem bits via convergence layer
+  *    @dlci: channel
+  *    @brk: break signal
+  *
+  *    Send an empty frame to signal mobile state changes and to transmit the
+  *    break signal for adaption 2.
+  */
+ static void gsm_modem_upd_via_data(struct gsm_dlci *dlci, u8 brk)
  {
-       u8 modembits[5];
+       struct gsm_mux *gsm = dlci->gsm;
+       unsigned long flags;
+       if (dlci->state != DLCI_OPEN || dlci->adaption != 2)
+               return;
+       spin_lock_irqsave(&gsm->tx_lock, flags);
+       gsm_dlci_modem_output(gsm, dlci, brk);
+       spin_unlock_irqrestore(&gsm->tx_lock, flags);
+ }
+ /**
+  *    gsm_modem_upd_via_msc   -       send modem bits via control frame
+  *    @dlci: channel
+  *    @brk: break signal
+  */
+ static int gsm_modem_upd_via_msc(struct gsm_dlci *dlci, u8 brk)
+ {
+       u8 modembits[3];
        struct gsm_control *ctrl;
        int len = 2;
  
-       if (brk)
-               len++;
+       if (dlci->gsm->encoding != 0)
+               return 0;
  
-       modembits[0] = len << 1 | EA;           /* Data bytes */
-       modembits[1] = dlci->addr << 2 | 3;     /* DLCI, EA, 1 */
-       modembits[2] = gsm_encode_modem(dlci) << 1 | EA;
-       if (brk)
-               modembits[3] = brk << 4 | 2 | EA;       /* Valid, EA */
-       ctrl = gsm_control_send(dlci->gsm, CMD_MSC, modembits, len + 1);
+       modembits[0] = (dlci->addr << 2) | 2 | EA;  /* DLCI, Valid, EA */
+       if (!brk) {
+               modembits[1] = (gsm_encode_modem(dlci) << 1) | EA;
+       } else {
+               modembits[1] = gsm_encode_modem(dlci) << 1;
+               modembits[2] = (brk << 4) | 2 | EA; /* Length, Break, EA */
+               len++;
+       }
+       ctrl = gsm_control_send(dlci->gsm, CMD_MSC, modembits, len);
        if (ctrl == NULL)
                return -ENOMEM;
        return gsm_control_wait(dlci->gsm, ctrl);
  }
  
+ /**
+  *    gsm_modem_update        -       send modem status line state
+  *    @dlci: channel
+  *    @brk: break signal
+  */
+ static int gsm_modem_update(struct gsm_dlci *dlci, u8 brk)
+ {
+       if (dlci->adaption == 2) {
+               /* Send convergence layer type 2 empty data frame. */
+               gsm_modem_upd_via_data(dlci, brk);
+               return 0;
+       } else if (dlci->gsm->encoding == 0) {
+               /* Send as MSC control message. */
+               return gsm_modem_upd_via_msc(dlci, brk);
+       }
+       /* Modem status lines are not supported. */
+       return -EPROTONOSUPPORT;
+ }
  static int gsm_carrier_raised(struct tty_port *port)
  {
        struct gsm_dlci *dlci = container_of(port, struct gsm_dlci, port);
@@@ -3002,7 -3077,7 +3073,7 @@@ static void gsm_dtr_rts(struct tty_por
                modem_tx &= ~(TIOCM_DTR | TIOCM_RTS);
        if (modem_tx != dlci->modem_tx) {
                dlci->modem_tx = modem_tx;
-               gsmtty_modem_update(dlci, 0);
+               gsm_modem_update(dlci, 0);
        }
  }
  
@@@ -3151,13 -3226,17 +3222,17 @@@ static unsigned int gsmtty_chars_in_buf
  static void gsmtty_flush_buffer(struct tty_struct *tty)
  {
        struct gsm_dlci *dlci = tty->driver_data;
+       unsigned long flags;
        if (dlci->state == DLCI_CLOSED)
                return;
        /* Caution needed: If we implement reliable transport classes
           then the data being transmitted can't simply be junked once
           it has first hit the stack. Until then we can just blow it
           away */
+       spin_lock_irqsave(&dlci->lock, flags);
        kfifo_reset(&dlci->fifo);
+       spin_unlock_irqrestore(&dlci->lock, flags);
        /* Need to unhook this DLCI from the transmit queue logic */
  }
  
@@@ -3189,7 -3268,7 +3264,7 @@@ static int gsmtty_tiocmset(struct tty_s
  
        if (modem_tx != dlci->modem_tx) {
                dlci->modem_tx = modem_tx;
-               return gsmtty_modem_update(dlci, 0);
+               return gsm_modem_update(dlci, 0);
        }
        return 0;
  }
@@@ -3250,7 -3329,7 +3325,7 @@@ static void gsmtty_throttle(struct tty_
                dlci->modem_tx &= ~TIOCM_RTS;
        dlci->throttled = true;
        /* Send an MSC with RTS cleared */
-       gsmtty_modem_update(dlci, 0);
+       gsm_modem_update(dlci, 0);
  }
  
  static void gsmtty_unthrottle(struct tty_struct *tty)
                dlci->modem_tx |= TIOCM_RTS;
        dlci->throttled = false;
        /* Send an MSC with RTS set */
-       gsmtty_modem_update(dlci, 0);
+       gsm_modem_update(dlci, 0);
  }
  
  static int gsmtty_break_ctl(struct tty_struct *tty, int state)
                if (encode > 0x0F)
                        encode = 0x0F;  /* Best effort */
        }
-       return gsmtty_modem_update(dlci, encode);
+       return gsm_modem_update(dlci, encode);
  }
  
  static void gsmtty_cleanup(struct tty_struct *tty)
@@@ -2667,7 -2667,7 +2667,7 @@@ enum pci_board_num_t 
        pbn_panacom2,
        pbn_panacom4,
        pbn_plx_romulus,
-       pbn_endrun_2_4000000,
+       pbn_endrun_2_3906250,
        pbn_oxsemi,
        pbn_oxsemi_1_3906250,
        pbn_oxsemi_2_3906250,
@@@ -3195,10 -3195,10 +3195,10 @@@ static struct pciserial_board pci_board
        * signal now many ports are available
        * 2 port 952 Uart support
        */
-       [pbn_endrun_2_4000000] = {
+       [pbn_endrun_2_3906250] = {
                .flags          = FL_BASE0,
                .num_ports      = 2,
-               .base_baud      = 4000000,
+               .base_baud      = 3906250,
                .uart_offset    = 0x200,
                .first_offset   = 0x1000,
        },
        },
  };
  
 +#define REPORT_CONFIG(option) \
 +      (IS_ENABLED(CONFIG_##option) ? 0 : (kernel_ulong_t)&#option)
 +#define REPORT_8250_CONFIG(option) \
 +      (IS_ENABLED(CONFIG_SERIAL_8250_##option) ? \
 +       0 : (kernel_ulong_t)&"SERIAL_8250_"#option)
 +
  static const struct pci_device_id blacklist[] = {
        /* softmodems */
        { PCI_VDEVICE(AL, 0x5457), }, /* ALi Corporation M5457 AC'97 Modem */
        { PCI_DEVICE(0x1543, 0x3052), }, /* Si3052-based modem, default IDs */
  
        /* multi-io cards handled by parport_serial */
 -      { PCI_DEVICE(0x4348, 0x7053), }, /* WCH CH353 2S1P */
 -      { PCI_DEVICE(0x4348, 0x5053), }, /* WCH CH353 1S1P */
 -      { PCI_DEVICE(0x1c00, 0x3250), }, /* WCH CH382 2S1P */
 +      /* WCH CH353 2S1P */
 +      { PCI_DEVICE(0x4348, 0x7053), 0, 0, REPORT_CONFIG(PARPORT_SERIAL), },
 +      /* WCH CH353 1S1P */
 +      { PCI_DEVICE(0x4348, 0x5053), 0, 0, REPORT_CONFIG(PARPORT_SERIAL), },
 +      /* WCH CH382 2S1P */
 +      { PCI_DEVICE(0x1c00, 0x3250), 0, 0, REPORT_CONFIG(PARPORT_SERIAL), },
  
        /* Intel platforms with MID UART */
 -      { PCI_VDEVICE(INTEL, 0x081b), },
 -      { PCI_VDEVICE(INTEL, 0x081c), },
 -      { PCI_VDEVICE(INTEL, 0x081d), },
 -      { PCI_VDEVICE(INTEL, 0x1191), },
 -      { PCI_VDEVICE(INTEL, 0x18d8), },
 -      { PCI_VDEVICE(INTEL, 0x19d8), },
 +      { PCI_VDEVICE(INTEL, 0x081b), REPORT_8250_CONFIG(MID), },
 +      { PCI_VDEVICE(INTEL, 0x081c), REPORT_8250_CONFIG(MID), },
 +      { PCI_VDEVICE(INTEL, 0x081d), REPORT_8250_CONFIG(MID), },
 +      { PCI_VDEVICE(INTEL, 0x1191), REPORT_8250_CONFIG(MID), },
 +      { PCI_VDEVICE(INTEL, 0x18d8), REPORT_8250_CONFIG(MID), },
 +      { PCI_VDEVICE(INTEL, 0x19d8), REPORT_8250_CONFIG(MID), },
  
        /* Intel platforms with DesignWare UART */
 -      { PCI_VDEVICE(INTEL, 0x0936), },
 -      { PCI_VDEVICE(INTEL, 0x0f0a), },
 -      { PCI_VDEVICE(INTEL, 0x0f0c), },
 -      { PCI_VDEVICE(INTEL, 0x228a), },
 -      { PCI_VDEVICE(INTEL, 0x228c), },
 -      { PCI_VDEVICE(INTEL, 0x4b96), },
 -      { PCI_VDEVICE(INTEL, 0x4b97), },
 -      { PCI_VDEVICE(INTEL, 0x4b98), },
 -      { PCI_VDEVICE(INTEL, 0x4b99), },
 -      { PCI_VDEVICE(INTEL, 0x4b9a), },
 -      { PCI_VDEVICE(INTEL, 0x4b9b), },
 -      { PCI_VDEVICE(INTEL, 0x9ce3), },
 -      { PCI_VDEVICE(INTEL, 0x9ce4), },
 +      { PCI_VDEVICE(INTEL, 0x0936), REPORT_8250_CONFIG(LPSS), },
 +      { PCI_VDEVICE(INTEL, 0x0f0a), REPORT_8250_CONFIG(LPSS), },
 +      { PCI_VDEVICE(INTEL, 0x0f0c), REPORT_8250_CONFIG(LPSS), },
 +      { PCI_VDEVICE(INTEL, 0x228a), REPORT_8250_CONFIG(LPSS), },
 +      { PCI_VDEVICE(INTEL, 0x228c), REPORT_8250_CONFIG(LPSS), },
 +      { PCI_VDEVICE(INTEL, 0x4b96), REPORT_8250_CONFIG(LPSS), },
 +      { PCI_VDEVICE(INTEL, 0x4b97), REPORT_8250_CONFIG(LPSS), },
 +      { PCI_VDEVICE(INTEL, 0x4b98), REPORT_8250_CONFIG(LPSS), },
 +      { PCI_VDEVICE(INTEL, 0x4b99), REPORT_8250_CONFIG(LPSS), },
 +      { PCI_VDEVICE(INTEL, 0x4b9a), REPORT_8250_CONFIG(LPSS), },
 +      { PCI_VDEVICE(INTEL, 0x4b9b), REPORT_8250_CONFIG(LPSS), },
 +      { PCI_VDEVICE(INTEL, 0x9ce3), REPORT_8250_CONFIG(LPSS), },
 +      { PCI_VDEVICE(INTEL, 0x9ce4), REPORT_8250_CONFIG(LPSS), },
  
        /* Exar devices */
 -      { PCI_VDEVICE(EXAR, PCI_ANY_ID), },
 -      { PCI_VDEVICE(COMMTECH, PCI_ANY_ID), },
 +      { PCI_VDEVICE(EXAR, PCI_ANY_ID), REPORT_8250_CONFIG(EXAR), },
 +      { PCI_VDEVICE(COMMTECH, PCI_ANY_ID), REPORT_8250_CONFIG(EXAR), },
  
        /* Pericom devices */
 -      { PCI_VDEVICE(PERICOM, PCI_ANY_ID), },
 -      { PCI_VDEVICE(ACCESSIO, PCI_ANY_ID), },
 +      { PCI_VDEVICE(PERICOM, PCI_ANY_ID), REPORT_8250_CONFIG(PERICOM), },
 +      { PCI_VDEVICE(ACCESSIO, PCI_ANY_ID), REPORT_8250_CONFIG(PERICOM), },
  
        /* End of the black list */
        { }
@@@ -3849,12 -3840,8 +3849,12 @@@ pciserial_init_one(struct pci_dev *dev
        board = &pci_boards[ent->driver_data];
  
        exclude = pci_match_id(blacklist, dev);
 -      if (exclude)
 +      if (exclude) {
 +              if (exclude->driver_data)
 +                      pci_warn(dev, "ignoring port, enable %s to handle\n",
 +                               (const char *)exclude->driver_data);
                return -ENODEV;
 +      }
  
        rc = pcim_enable_device(dev);
        pci_save_state(dev);
@@@ -4128,7 -4115,7 +4128,7 @@@ static const struct pci_device_id seria
        */
        {       PCI_VENDOR_ID_ENDRUN, PCI_DEVICE_ID_ENDRUN_1588,
                PCI_ANY_ID, PCI_ANY_ID, 0, 0,
-               pbn_endrun_2_4000000 },
+               pbn_endrun_2_3906250 },
        /*
         * Quatech cards. These actually have configurable clocks but for
         * now we just use the default.
@@@ -263,7 -263,7 +263,7 @@@ static const struct serial8250_config u
                .tx_loadsz      = 63,
                .fcr            = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10 |
                                  UART_FCR7_64BYTE,
 -              .flags          = UART_CAP_FIFO,
 +              .flags          = UART_CAP_FIFO | UART_CAP_NOTEMT,
        },
        [PORT_RT2880] = {
                .name           = "Palmchip BK-3103",
@@@ -1504,19 -1504,18 +1504,19 @@@ static void start_hrtimer_ms(struct hrt
        hrtimer_start(hrt, ms_to_ktime(msec), HRTIMER_MODE_REL);
  }
  
 -static void __stop_tx_rs485(struct uart_8250_port *p)
 +static void __stop_tx_rs485(struct uart_8250_port *p, u64 stop_delay)
  {
        struct uart_8250_em485 *em485 = p->em485;
  
 +      stop_delay += (u64)p->port.rs485.delay_rts_after_send * NSEC_PER_MSEC;
 +
        /*
         * rs485_stop_tx() is going to set RTS according to config
         * AND flush RX FIFO if required.
         */
 -      if (p->port.rs485.delay_rts_after_send > 0) {
 +      if (stop_delay > 0) {
                em485->active_timer = &em485->stop_tx_timer;
 -              start_hrtimer_ms(&em485->stop_tx_timer,
 -                                 p->port.rs485.delay_rts_after_send);
 +              hrtimer_start(&em485->stop_tx_timer, ns_to_ktime(stop_delay), HRTIMER_MODE_REL);
        } else {
                p->rs485_stop_tx(p);
                em485->active_timer = NULL;
@@@ -1536,32 -1535,16 +1536,32 @@@ static inline void __stop_tx(struct uar
  
        if (em485) {
                unsigned char lsr = serial_in(p, UART_LSR);
 +              u64 stop_delay = 0;
 +
 +              if (!(lsr & UART_LSR_THRE))
 +                      return;
                /*
                 * To provide required timeing and allow FIFO transfer,
                 * __stop_tx_rs485() must be called only when both FIFO and
 -               * shift register are empty. It is for device driver to enable
 -               * interrupt on TEMT.
 +               * shift register are empty. The device driver should either
 +               * enable interrupt on TEMT or set UART_CAP_NOTEMT that will
 +               * enlarge stop_tx_timer by the tx time of one frame to cover
 +               * for emptying of the shift register.
                 */
 -              if ((lsr & BOTH_EMPTY) != BOTH_EMPTY)
 -                      return;
 +              if (!(lsr & UART_LSR_TEMT)) {
 +                      if (!(p->capabilities & UART_CAP_NOTEMT))
 +                              return;
 +                      /*
 +                       * RTS might get deasserted too early with the normal
 +                       * frame timing formula. It seems to suggest THRE might
 +                       * get asserted already during tx of the stop bit
 +                       * rather than after it is fully sent.
 +                       * Roughly estimate 1 extra bit here with / 7.
 +                       */
 +                      stop_delay = p->port.frame_time + DIV_ROUND_UP(p->port.frame_time, 7);
 +              }
  
 -              __stop_tx_rs485(p);
 +              __stop_tx_rs485(p, stop_delay);
        }
        __do_stop_tx(p);
  }
@@@ -1692,11 -1675,11 +1692,11 @@@ static void serial8250_start_tx(struct 
        struct uart_8250_port *up = up_to_u8250p(port);
        struct uart_8250_em485 *em485 = up->em485;
  
-       serial8250_rpm_get_tx(up);
        if (!port->x_char && uart_circ_empty(&port->state->xmit))
                return;
  
+       serial8250_rpm_get_tx(up);
        if (em485 &&
            em485->active_timer == &em485->start_tx_timer)
                return;
@@@ -1965,12 -1948,9 +1965,12 @@@ int serial8250_handle_irq(struct uart_p
                        status = serial8250_rx_chars(up, status);
        }
        serial8250_modem_status(up);
 -      if ((!up->dma || up->dma->tx_err) && (status & UART_LSR_THRE) &&
 -              (up->ier & UART_IER_THRI))
 -              serial8250_tx_chars(up);
 +      if ((status & UART_LSR_THRE) && (up->ier & UART_IER_THRI)) {
 +              if (!up->dma || up->dma->tx_err)
 +                      serial8250_tx_chars(up);
 +              else
 +                      __stop_tx(up);
 +      }
  
        uart_unlock_and_check_sysrq_irqrestore(port, flags);
  
@@@ -2097,7 -2077,10 +2097,7 @@@ static void serial8250_break_ctl(struc
        serial8250_rpm_put(up);
  }
  
 -/*
 - *    Wait for transmitter & holding register to empty
 - */
 -static void wait_for_xmitr(struct uart_8250_port *up, int bits)
 +static void wait_for_lsr(struct uart_8250_port *up, int bits)
  {
        unsigned int status, tmout = 10000;
  
                udelay(1);
                touch_nmi_watchdog();
        }
 +}
 +
 +/*
 + *    Wait for transmitter & holding register to empty
 + */
 +static void wait_for_xmitr(struct uart_8250_port *up, int bits)
 +{
 +      unsigned int tmout;
 +
 +      wait_for_lsr(up, bits);
  
        /* Wait up to 1s for flow control if necessary */
        if (up->port.flags & UPF_CONS_FLOW) {
@@@ -3356,38 -3329,9 +3356,38 @@@ static void serial8250_console_restore(
  
        serial8250_set_divisor(port, baud, quot, frac);
        serial_port_out(port, UART_LCR, up->lcr);
-       serial8250_out_MCR(up, UART_MCR_DTR | UART_MCR_RTS);
+       serial8250_out_MCR(up, up->mcr | UART_MCR_DTR | UART_MCR_RTS);
  }
  
 +/*
 + * Print a string to the serial port using the device FIFO
 + *
 + * It sends fifosize bytes and then waits for the fifo
 + * to get empty.
 + */
 +static void serial8250_console_fifo_write(struct uart_8250_port *up,
 +                                        const char *s, unsigned int count)
 +{
 +      int i;
 +      const char *end = s + count;
 +      unsigned int fifosize = up->tx_loadsz;
 +      bool cr_sent = false;
 +
 +      while (s != end) {
 +              wait_for_lsr(up, UART_LSR_THRE);
 +
 +              for (i = 0; i < fifosize && s != end; ++i) {
 +                      if (*s == '\n' && !cr_sent) {
 +                              serial_out(up, UART_TX, '\r');
 +                              cr_sent = true;
 +                      } else {
 +                              serial_out(up, UART_TX, *s++);
 +                              cr_sent = false;
 +                      }
 +              }
 +      }
 +}
 +
  /*
   *    Print a string to the serial port trying not to disturb
   *    any possible real use of the port...
@@@ -3403,7 -3347,7 +3403,7 @@@ void serial8250_console_write(struct ua
        struct uart_8250_em485 *em485 = up->em485;
        struct uart_port *port = &up->port;
        unsigned long flags;
 -      unsigned int ier;
 +      unsigned int ier, use_fifo;
        int locked = 1;
  
        touch_nmi_watchdog();
                mdelay(port->rs485.delay_rts_before_send);
        }
  
 -      uart_console_write(port, s, count, serial8250_console_putchar);
 +      use_fifo = (up->capabilities & UART_CAP_FIFO) &&
 +              /*
 +               * BCM283x requires to check the fifo
 +               * after each byte.
 +               */
 +              !(up->capabilities & UART_CAP_MINI) &&
 +              /*
 +               * tx_loadsz contains the transmit fifo size
 +               */
 +              up->tx_loadsz > 1 &&
 +              (up->fcr & UART_FCR_ENABLE_FIFO) &&
 +              port->state &&
 +              test_bit(TTY_PORT_INITIALIZED, &port->state->port.iflags) &&
 +              /*
 +               * After we put a data in the fifo, the controller will send
 +               * it regardless of the CTS state. Therefore, only use fifo
 +               * if we don't use control flow.
 +               */
 +              !(up->port.flags & UPF_CONS_FLOW);
 +
 +      if (likely(use_fifo))
 +              serial8250_console_fifo_write(up, s, count);
 +      else
 +              uart_console_write(port, s, count, serial8250_console_putchar);
  
        /*
         *      Finally, wait for transmitter to become empty
@@@ -1255,13 -1255,18 +1255,18 @@@ static inline bool pl011_dma_rx_running
  
  static void pl011_rs485_tx_stop(struct uart_amba_port *uap)
  {
+       /*
+        * To be on the safe side only time out after twice as many iterations
+        * as fifo size.
+        */
+       const int MAX_TX_DRAIN_ITERS = uap->port.fifosize * 2;
        struct uart_port *port = &uap->port;
        int i = 0;
        u32 cr;
  
        /* Wait until hardware tx queue is empty */
        while (!pl011_tx_empty(port)) {
-               if (i == port->fifosize) {
+               if (i > MAX_TX_DRAIN_ITERS) {
                        dev_warn(port->dev,
                                 "timeout while draining hardware tx queue\n");
                        break;
@@@ -2052,7 -2057,7 +2057,7 @@@ pl011_set_termios(struct uart_port *por
         * with the given baud rate. We use this as the poll interval when we
         * wait for the tx queue to empty.
         */
-       uap->rs485_tx_drain_interval = (bits * 1000 * 1000) / baud;
+       uap->rs485_tx_drain_interval = DIV_ROUND_UP(bits * 1000 * 1000, baud);
  
        pl011_setup_status_masks(port, termios);
  
@@@ -2170,11 -2175,25 +2175,11 @@@ static int pl011_rs485_config(struct ua
        struct uart_amba_port *uap =
                container_of(port, struct uart_amba_port, port);
  
 -      /* pick sane settings if the user hasn't */
 -      if (!(rs485->flags & SER_RS485_RTS_ON_SEND) ==
 -          !(rs485->flags & SER_RS485_RTS_AFTER_SEND)) {
 -              rs485->flags |= SER_RS485_RTS_ON_SEND;
 -              rs485->flags &= ~SER_RS485_RTS_AFTER_SEND;
 -      }
 -      /* clamp the delays to [0, 100ms] */
 -      rs485->delay_rts_before_send = min(rs485->delay_rts_before_send, 100U);
 -      rs485->delay_rts_after_send = min(rs485->delay_rts_after_send, 100U);
 -      memset(rs485->padding, 0, sizeof(rs485->padding));
 -
        if (port->rs485.flags & SER_RS485_ENABLED)
                pl011_rs485_tx_stop(uap);
  
 -      /* Set new configuration */
 -      port->rs485 = *rs485;
 -
        /* Make sure auto RTS is disabled */
 -      if (port->rs485.flags & SER_RS485_ENABLED) {
 +      if (rs485->flags & SER_RS485_ENABLED) {
                u32 cr = pl011_read(uap, REG_CR);
  
                cr &= ~UART011_CR_RTSEN;
diff --combined drivers/tty/serial/imx.c
@@@ -1448,7 -1448,7 +1448,7 @@@ static int imx_uart_startup(struct uart
        imx_uart_writel(sport, ucr1, UCR1);
  
        ucr4 = imx_uart_readl(sport, UCR4) & ~(UCR4_OREN | UCR4_INVR);
-       if (!sport->dma_is_enabled)
+       if (!dma_is_inited)
                ucr4 |= UCR4_OREN;
        if (sport->inverted_rx)
                ucr4 |= UCR4_INVR;
@@@ -1937,6 -1937,8 +1937,6 @@@ static int imx_uart_rs485_config(struc
            rs485conf->flags & SER_RS485_RX_DURING_TX)
                imx_uart_start_rx(port);
  
 -      port->rs485 = *rs485conf;
 -
        return 0;
  }
  
@@@ -1134,6 -1134,16 +1134,6 @@@ static int sc16is7xx_config_rs485(struc
        struct sc16is7xx_one *one = to_sc16is7xx_one(port, port);
  
        if (rs485->flags & SER_RS485_ENABLED) {
 -              bool rts_during_rx, rts_during_tx;
 -
 -              rts_during_rx = rs485->flags & SER_RS485_RTS_AFTER_SEND;
 -              rts_during_tx = rs485->flags & SER_RS485_RTS_ON_SEND;
 -
 -              if (rts_during_rx == rts_during_tx)
 -                      dev_err(port->dev,
 -                              "unsupported RTS signalling on_send:%d after_send:%d - exactly one of RS485 RTS flags should be set\n",
 -                              rts_during_tx, rts_during_rx);
 -
                /*
                 * RTS signal is handled by HW, it's timing can't be influenced.
                 * However, it's sometimes useful to delay TX even without RTS
@@@ -1228,12 -1238,10 +1228,10 @@@ static void sc16is7xx_shutdown(struct u
  
        /* Disable all interrupts */
        sc16is7xx_port_write(port, SC16IS7XX_IER_REG, 0);
-       /* Disable TX/RX, clear auto RS485 and RTS invert */
+       /* Disable TX/RX */
        sc16is7xx_port_update(port, SC16IS7XX_EFCR_REG,
                              SC16IS7XX_EFCR_RXDISABLE_BIT |
-                             SC16IS7XX_EFCR_TXDISABLE_BIT |
-                             SC16IS7XX_EFCR_AUTO_RS485_BIT |
-                             SC16IS7XX_EFCR_RTS_INVERT_BIT,
+                             SC16IS7XX_EFCR_TXDISABLE_BIT,
                              SC16IS7XX_EFCR_RXDISABLE_BIT |
                              SC16IS7XX_EFCR_TXDISABLE_BIT);