• Johan Hovold's avatar
    serial: qcom-geni: fix dma rx cancellation · 23ee4a25
    Johan Hovold authored
    Make sure to wait for the DMA transfer to complete when cancelling the
    rx command on stop_rx(). This specifically prevents the DMA completion
    interrupt from firing after rx has been restarted, something which can
    lead to an IOMMU fault and hosed rx when the interrupt handler unmaps
    the DMA buffer for the new command:
    
    	qcom_geni_serial 988000.serial: serial engine reports 0 RX bytes in!
    	arm-smmu 15000000.iommu: FSR    = 00000402 [Format=2 TF], SID=0x563
    	arm-smmu 15000000.iommu: FSYNR0 = 00210013 [S1CBNDX=33 WNR PLVL=3]
    	Bluetooth: hci0: command 0xfc00 tx timeout
    	Bluetooth: hci0: Reading QCA version information failed (-110)
    
    Also add the missing state machine reset which is needed in case
    cancellation fails.
    
    Fixes: 2aaa43c7 ("tty: serial: qcom-geni-serial: add support for serial engine DMA")
    Cc: stable@vger.kernel.org      # 6.3
    Cc: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
    Signed-off-by: default avatarJohan Hovold <johan+linaro@kernel.org>
    Link: https://lore.kernel.org/r/20241009145110.16847-5-johan+linaro@kernel.orgSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    23ee4a25
qcom_geni_serial.c 49.7 KB