1. 13 Dec, 2022 3 commits
  2. 08 Dec, 2022 2 commits
  3. 22 Nov, 2022 1 commit
  4. 21 Nov, 2022 4 commits
    • Marcus Folkesson's avatar
      HID: hid-elan: use default remove for hid device · 163a7fbf
      Marcus Folkesson authored
      hid_device_remove() will call hid_hw_stop() as default .remove function
      if no function is specified.
      Signed-off-by: default avatarMarcus Folkesson <marcus.folkesson@gmail.com>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      163a7fbf
    • Marcus Folkesson's avatar
      HID: hid-alps: use default remove for hid device · 989f7cc9
      Marcus Folkesson authored
      hid_device_remove() will call hid_hw_stop() as default .remove function
      if no function is specified.
      Signed-off-by: default avatarMarcus Folkesson <marcus.folkesson@gmail.com>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      989f7cc9
    • ZhangPeng's avatar
      HID: core: fix shift-out-of-bounds in hid_report_raw_event · ec61b419
      ZhangPeng authored
      Syzbot reported shift-out-of-bounds in hid_report_raw_event.
      
      microsoft 0003:045E:07DA.0001: hid_field_extract() called with n (128) >
      32! (swapper/0)
      ======================================================================
      UBSAN: shift-out-of-bounds in drivers/hid/hid-core.c:1323:20
      shift exponent 127 is too large for 32-bit type 'int'
      CPU: 0 PID: 0 Comm: swapper/0 Not tainted
      6.1.0-rc4-syzkaller-00159-g4bbf3422 #0
      Hardware name: Google Compute Engine/Google Compute Engine, BIOS
      Google 10/26/2022
      Call Trace:
       <IRQ>
       __dump_stack lib/dump_stack.c:88 [inline]
       dump_stack_lvl+0x1e3/0x2cb lib/dump_stack.c:106
       ubsan_epilogue lib/ubsan.c:151 [inline]
       __ubsan_handle_shift_out_of_bounds+0x3a6/0x420 lib/ubsan.c:322
       snto32 drivers/hid/hid-core.c:1323 [inline]
       hid_input_fetch_field drivers/hid/hid-core.c:1572 [inline]
       hid_process_report drivers/hid/hid-core.c:1665 [inline]
       hid_report_raw_event+0xd56/0x18b0 drivers/hid/hid-core.c:1998
       hid_input_report+0x408/0x4f0 drivers/hid/hid-core.c:2066
       hid_irq_in+0x459/0x690 drivers/hid/usbhid/hid-core.c:284
       __usb_hcd_giveback_urb+0x369/0x530 drivers/usb/core/hcd.c:1671
       dummy_timer+0x86b/0x3110 drivers/usb/gadget/udc/dummy_hcd.c:1988
       call_timer_fn+0xf5/0x210 kernel/time/timer.c:1474
       expire_timers kernel/time/timer.c:1519 [inline]
       __run_timers+0x76a/0x980 kernel/time/timer.c:1790
       run_timer_softirq+0x63/0xf0 kernel/time/timer.c:1803
       __do_softirq+0x277/0x75b kernel/softirq.c:571
       __irq_exit_rcu+0xec/0x170 kernel/softirq.c:650
       irq_exit_rcu+0x5/0x20 kernel/softirq.c:662
       sysvec_apic_timer_interrupt+0x91/0xb0 arch/x86/kernel/apic/apic.c:1107
      ======================================================================
      
      If the size of the integer (unsigned n) is bigger than 32 in snto32(),
      shift exponent will be too large for 32-bit type 'int', resulting in a
      shift-out-of-bounds bug.
      Fix this by adding a check on the size of the integer (unsigned n) in
      snto32(). To add support for n greater than 32 bits, set n to 32, if n
      is greater than 32.
      
      Reported-by: syzbot+8b1641d2f14732407e23@syzkaller.appspotmail.com
      Fixes: dde5845a ("[PATCH] Generic HID layer - code split")
      Signed-off-by: default avatarZhangPeng <zhangpeng362@huawei.com>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      ec61b419
    • José Expósito's avatar
      HID: uclogic: Add HID_QUIRK_HIDINPUT_FORCE quirk · 3405a4be
      José Expósito authored
      Commit f7d8e387 ("HID: uclogic: Switch to Digitizer usage for
      styluses") changed the usage used in UCLogic from "Pen" to "Digitizer".
      
      However, the IS_INPUT_APPLICATION() macro evaluates to false for
      HID_DG_DIGITIZER causing issues with the XP-Pen Star G640 tablet.
      
      Add the HID_QUIRK_HIDINPUT_FORCE quirk to bypass the
      IS_INPUT_APPLICATION() check.
      Reported-by: default avatarTorge Matthies <openglfreak@googlemail.com>
      Reported-by: default avatarAlexander Zhang <alex@alexyzhang.dev>
      Tested-by: default avatarAlexander Zhang <alex@alexyzhang.dev>
      Signed-off-by: default avatarJosé Expósito <jose.exposito89@gmail.com>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      3405a4be
  5. 15 Nov, 2022 1 commit
  6. 14 Nov, 2022 4 commits
  7. 11 Nov, 2022 21 commits
    • Linus Torvalds's avatar
      Merge tag 'for-linus-2022111101' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid · 9c730fe1
      Linus Torvalds authored
      Pull HID fixes from Jiri Kosina:
      
       - fix for memory leak (on error path) in Hyper-V driver (Yang
         Yingliang)
      
       - regression fix for handling 3rd barrel switch emulation in Wacom
         driver (Jason Gerecke)
      
      * tag 'for-linus-2022111101' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid:
        HID: wacom: Fix logic used for 3rd barrel switch emulation
        HID: hyperv: fix possible memory leak in mousevsc_probe()
        HID: asus: Remove unused variable in asus_report_tool_width()
      9c730fe1
    • Linus Torvalds's avatar
      Merge tag 'sound-6.1-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound · 64b4aef1
      Linus Torvalds authored
      Pull sound fixes from Takashi Iwai:
       "Things look calming down, as this contains only a few small fixes:
      
         - Fix for a corner-case bug with SG-buffer page allocation helper
      
         - A regression fix for Roland USB-audio device probe
      
         - A potential memory leak fix at the error path
      
         - Handful quirks and device-specific fixes for HD- and USB-audio"
      
      * tag 'sound-6.1-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
        ALSA: hda: fix potential memleak in 'add_widget_node'
        ALSA: memalloc: Don't fall back for SG-buffer with IOMMU
        ALSA: usb-audio: add quirk to fix Hamedal C20 disconnect issue
        ALSA: hda/realtek: Add Positivo C6300 model quirk
        ALSA: usb-audio: Add DSD support for Accuphase DAC-60
        ALSA: usb-audio: Add quirk entry for M-Audio Micro
        ALSA: hda/hdmi - enable runtime pm for more AMD display audio
        ALSA: usb-audio: Remove redundant workaround for Roland quirk
        ALSA: usb-audio: Yet more regression for for the delayed card registration
        ALSA: hda/ca0132: add quirk for EVGA Z390 DARK
        ALSA: hda: clarify comments on SCF changes
        ALSA: arm: pxa: pxa2xx-ac97-lib: fix return value check of platform_get_irq()
        ALSA: hda/realtek: Add quirk for ASUS Zenbook using CS35L41
      64b4aef1
    • Linus Torvalds's avatar
      Merge tag 'drm-fixes-2022-11-11' of git://anongit.freedesktop.org/drm/drm · fd979ca6
      Linus Torvalds authored
      Pull drm fixes from Dave Airlie:
       "Weekly pull request for graphics, mostly amdgpu and i915, with a
        couple of fixes for vc4 and panfrost, panel quirks and a kconfig
        change for rcar-du. Nothing seems to be too strange at this stage.
      
        amdgpu:
         - Fix s/r in amdgpu_vram_mgr_new
         - SMU 13.0.4 update
         - GPUVM TLB race fix
         - DCN 3.1.4 fixes
         - DCN 3.2.x fixes
         - Vega10 fan fix
         - BACO fix for Beige Goby board
         - PSR fix
         - GPU VM PT locking fixes
      
        amdkfd:
         - CRIU fixes
      
        vc4:
         - HDMI fixes to vc4.
      
        panfrost:
         - Make panfrost's uapi header compile with C++.
         - Handle 1 gb boundary correctly in panfrost mmu code.
      
        panel:
         - Add rotation quirks for 2 panels.
      
        rcar-du:
         - DSI Kconfig fix
      
        i915:
         - Fix sg_table handling in map_dma_buf
         - Send PSR update also on invalidate
         - Do not set cache_dirty for DGFX
         - Restore userptr probe_range behaviour"
      
      * tag 'drm-fixes-2022-11-11' of git://anongit.freedesktop.org/drm/drm: (29 commits)
        drm/amd/display: only fill dirty rectangles when PSR is enabled
        drm/amdgpu: disable BACO on special BEIGE_GOBY card
        drm/amdgpu: Drop eviction lock when allocating PT BO
        drm/amdgpu: Unlock bo_list_mutex after error handling
        Revert "drm/amdgpu: Revert "drm/amdgpu: getting fan speed pwm for vega10 properly""
        drm/amd/display: Enforce minimum prefetch time for low memclk on DCN32
        drm/amd/display: Fix gpio port mapping issue
        drm/amd/display: Fix reg timeout in enc314_enable_fifo
        drm/amd/display: Fix FCLK deviation and tool compile issues
        drm/amd/display: Zeromem mypipe heap struct before using it
        drm/amd/display: Update SR watermarks for DCN314
        drm/amdgpu: workaround for TLB seq race
        drm/amdkfd: Fix error handling in criu_checkpoint
        drm/amdkfd: Fix error handling in kfd_criu_restore_events
        drm/amd/pm: update SMU IP v13.0.4 msg interface header
        drm: rcar-du: Fix Kconfig dependency between RCAR_DU and RCAR_MIPI_DSI
        drm/panfrost: Split io-pgtable requests properly
        drm/amdgpu: Fix the lpfn checking condition in drm buddy
        drm: panel-orientation-quirks: Add quirk for Acer Switch V 10 (SW5-017)
        drm: panel-orientation-quirks: Add quirk for Nanote UMPC-01
        ...
      fd979ca6
    • Michael Zaidman's avatar
      HID: ft260: fix 'cast to restricted' kernel CI bot warnings · fb5d783b
      Michael Zaidman authored
      Fix 'cast to restricted' sparse warnings reported by kernel test robot
      in https://lore.kernel.org/all/202211021607.ssjymlKi-lkp@intel.com/Reported-by: default avatarkernel test robot <lkp@intel.com>
      Signed-off-by: default avatarMichael Zaidman <michael.zaidman@gmail.com>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      fb5d783b
    • Michael Zaidman's avatar
      HID: ft260: missed NACK from busy device · 5afac727
      Michael Zaidman authored
      When writing into a slow device like an EEPROM chip, the
      controller may exit the busy state before the device releases
      the bus. In this case, the ft260_xfer_status returns success
      before the data transfer completion.
      
      The patch fixes it by returning from the ft260_xfer_status()
      with the "-EAGAIN" on both controller and bus busy status when
      appropriate.
      
      It does not apply to the i2c combined transactions when after
      the write IO, the controller keeps the bus busy until the read
      IO and then between reading IOs to ensure an atomic operation.
      Co-developed-by: default avatarGermain Hebert <germain.hebert@ca.abb.com>
      Signed-off-by: default avatarGermain Hebert <germain.hebert@ca.abb.com>
      Signed-off-by: default avatarMichael Zaidman <michael.zaidman@gmail.com>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      5afac727
    • Michael Zaidman's avatar
      HID: ft260: fix a NULL pointer dereference in ft260_i2c_write · c2500bdf
      Michael Zaidman authored
      The zero-length passed into the ft260_i2c_write() triggered the
      NULL pointer dereference in the debug message on data[0] access.
      Since the controller does not support a write of zero length,
      let's not allow it.
      
      Before:
      
      $ sudo i2ctransfer -y 13 w0@0x51
      Killed
      
      After:
      
      $ sudo i2ctransfer -y 13 w0@0x51
      Error: Sending messages failed: Invalid argument
      Reported-by: default avatarEnrik Berkhan <Enrik.Berkhan@inka.de>
      Signed-off-by: default avatarMichael Zaidman <michael.zaidman@gmail.com>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      c2500bdf
    • Michael Zaidman's avatar
      HID: ft260: wake up device from power saving mode · 4b3da685
      Michael Zaidman authored
      The FT260 can enter a power saving mode after being idle for longer
      than 5 seconds.
      
      When being woken up from power saving mode by an I2C write request,
      a possible NACK is not correctly reported by the controller. As a
      workaround, the driver will issue an I2C status report two times in
      ft260_xfer_status() after the chip has been idle for more than 5s.
      Co-developed-by: default avatarEnrik Berkhan <Enrik.Berkhan@inka.de>
      Signed-off-by: default avatarEnrik Berkhan <Enrik.Berkhan@inka.de>
      Signed-off-by: default avatarMichael Zaidman <michael.zaidman@gmail.com>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      4b3da685
    • Michael Zaidman's avatar
      HID: ft260: missed NACK from big i2c read · 728b117e
      Michael Zaidman authored
      The FT260 controller does not return NACK when performing a big
      read (of multiple hid reports size) from a non-existing device
      or from the device responding with NACK when it is not ready
      to serve the request. However, it responds correctly with NACK
      to a read of up to a single hid report size.
      
      To overcome this issue, we split the muli-report read request
      into a read of a single HID report of 60 bytes size and a
      multi-report read.
      
      Big read of 256 bytes with first read of 60 bytes:
      
      $ sudo ./i2cperf -d 2 -o 2 -s 256 -r 0-0xff 1 0x50 -S
      
      [  +5.633280] ft260_i2c_write_read: off 0x0 rlen 255 wlen 2
      [  +0.000006] ft260_i2c_write: rep 0xd0 addr 0x50 off 0 len 2 wlen 2 flag 0x2 d[0] 0x0
      [  +0.013205] ft260_xfer_status: bus_status 0x20, clock 100
      [  +0.000007] ft260_i2c_read: rep 0xc2 addr 0x50 len 255 rlen 60 flag 0x3
      [  +0.010932] ft260_raw_event: i2c resp: rep 0xde len 60
      [  +0.004733] ft260_xfer_status: bus_status 0x40, clock 100
      [  +0.000006] ft260_i2c_read: rep 0xc2 addr 0x50 len 195 rlen 128 flag 0x0
      [  +0.012572] ft260_raw_event: i2c resp: rep 0xde len 60
      [  +0.005789] ft260_raw_event: i2c resp: rep 0xde len 60
      [  +0.003189] ft260_raw_event: i2c resp: rep 0xd1 len 8
      [  +0.004092] ft260_xfer_status: bus_status 0x40, clock 100
      [  +0.000010] ft260_i2c_read: rep 0xc2 addr 0x50 len 67 rlen 67 flag 0x4
      [  +0.011688] ft260_raw_event: i2c resp: rep 0xde len 60
      [  +0.004700] ft260_raw_event: i2c resp: rep 0xd1 len 7
      [  +0.004858] ft260_xfer_status: bus_status 0x20, clock 100
      
      Read from non-existing device at address 8. The first 60 read responded
      with NACK.
      
      $ sudo ./i2cperf -d 2 -o 2 -s 256 -r 0-0xff 1 0x8 -S
      [Oct19 15:37] ft260_i2c_write_read: off 0x0 rlen 255 wlen 2
      [  +0.000007] ft260_i2c_write: rep 0xd0 addr 0x8 off 0 len 2 wlen 2 flag 0x2 d[0] 0x0
      [  +0.022820] ft260_xfer_status: bus_status 0x20, clock 100
      [  +0.000007] ft260_i2c_read: rep 0xc2 addr 0x8 len 255 rlen 60 flag 0x3
      [  +0.010658] ft260_raw_event: i2c resp: rep 0xde len 60
      [  +0.005965] ft260_xfer_status: bus_status 0x46, clock 100  <-- NACK
      [  +0.000009] ft260 0003:0403:6030.0004: i2c bus error: 0x46
      [  +0.007784] ft260_i2c_reset: done
      Co-developed-by: default avatarEnrik Berkhan <Enrik.Berkhan@inka.de>
      Signed-off-by: default avatarEnrik Berkhan <Enrik.Berkhan@inka.de>
      Signed-off-by: default avatarMichael Zaidman <michael.zaidman@gmail.com>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      728b117e
    • Michael Zaidman's avatar
      HID: ft260: remove SMBus Quick command support · 3b56ff48
      Michael Zaidman authored
      The i2cdetect uses the SMBus Quick command by default to scan devices
      on the I2C bus. The FT260 implements an I2C bus controller. The SMBus
      is derived from I2C, but there are several differences between the
      specifications of the two buses in the areas of timing, protocols,
      operation modes, and electrical characteristics.
      
      One of the differences is that the I2C devices allow the slave not
      to ACK its slave address, but SMBus requires it to always ACK it as
      a mechanism to detect a detachable device’s presence on the bus.
      Since FT260 is the I2C bus controller, it does not acknowledge the
      SMBus Quick write command, which sends a single bit to the device at
      the place of the RD/WR bit.
      
      The ft260 driver attempted to mimic the SMBus Quick Write functionality
      by writing a single byte as the SMBus Byte Write command does.
      
      Usually, one byte in the SMBus Quick Write will be fine. However, it may
      cause problems with devices with a control register at offset 0, like
      i2c muxes, for example, when scanned with the i2cdetect utility.
      
      The i2cdetect with the "-r" option uses the SMBus Read Byte command,
      which is a reasonable workaround. To prevent the I2C bus from locking
      at write-only devices (most notably clock chips at address 0x69), use
      the "-r" option in conjunction with scanning range parameters.
      
      This patch removes the SMBus Quick command support.
      
      $ sudo i2cdetect -y 13
      Warning: Can't use SMBus Quick Write command, will skip some addresses
           0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
      00:
      10:
      20:
      30: -- -- -- -- -- -- -- --
      40:
      50: 50 51 -- -- -- -- -- -- -- -- -- -- -- -- -- --
      60:
      70:
      
      $ sudo i2cdetect -y -r 13
           0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
      00:                         -- -- -- -- -- -- -- --
      10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      50: 50 51 -- -- -- -- -- -- -- -- -- -- -- -- -- --
      60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
      70: -- -- -- -- -- -- -- --
      Reported-by: default avatarVince Asbridge <VAsbridge@sanblaze.com>
      Reported-by: default avatarStephen Shirron <SShirron@sanblaze.com>
      Reported-by: default avatarEnrik Berkhan <Enrik.Berkhan@inka.de>
      Signed-off-by: default avatarMichael Zaidman <michael.zaidman@gmail.com>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      3b56ff48
    • Michael Zaidman's avatar
      HID: ft260: skip unexpected HID input reports · b7121e3c
      Michael Zaidman authored
      The FT260 is not supposed to generate unexpected HID reports. However,
      in theory, the unsolicited HID Input reports can be issued by a specially
      crafted malicious USB device masquerading as FT260 when the attacker has
      physical access to the USB port. In this case, the read_buf pointer points
      to the final data portion of the previous I2C Read transfer, and the memcpy
      invoked in the ft260_raw_event() will try copying the content of the
      unexpected report into the wrong location.
      
      This commit sets the Read buffer pointer to NULL on the I2C Read
      transaction completion and checks it in the ft260_raw_event() to detect
      and skip the unsolicited Input report.
      Reported-by: default avatarEnrik Berkhan <Enrik.Berkhan@inka.de>
      Signed-off-by: default avatarMichael Zaidman <michael.zaidman@gmail.com>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      b7121e3c
    • Michael Zaidman's avatar
      HID: ft260: do not populate /dev/hidraw device · 76e76e79
      Michael Zaidman authored
      Do not populate the /dev/hidraw on ft260 interfaces when the hid-ft260
      driver is loaded.
      
      $ sudo insmod hid-ft260.ko
      $ ls /dev/hidraw*
      /dev/hidraw0
      
      $ sudo rmmod hid-ft260.ko
      $ ls /dev/hidraw*
      /dev/hidraw0  /dev/hidraw1  /dev/hidraw2
      Reported-by: default avatarEnrik Berkhan <Enrik.Berkhan@inka.de>
      Signed-off-by: default avatarMichael Zaidman <michael.zaidman@gmail.com>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      76e76e79
    • Michael Zaidman's avatar
      HID: ft260: improve i2c large reads performance · 54410c14
      Michael Zaidman authored
      The patch increases the read buffer size to 180 bytes. It reduces
      the number of ft260_i2c_read() calls by three, improving the big
      reads performance.
      
      $ sudo i2ctransfer -y -f 13 w2@0x51 0x0 0x0 r180
      
      Before:
      
      [  +4.071878] ft260_i2c_write_read: off 0x0 rlen 180 wlen 2
      [  +0.000005] ft260_i2c_write: rep 0xd0 addr 0x51 off 0 len 2 wlen 2 flag 0x2 d[0] 0x0
      [  +0.001097] ft260_xfer_status: bus_status 0x41, clock 100
      [  +0.000175] ft260_xfer_status: bus_status 0x40, clock 100
      [  +0.000004] ft260_i2c_read: rep 0xc2 addr 0x51 len 180 rlen 60 flag 0x3
      [  +0.008579] ft260_raw_event: i2c resp: rep 0xde len 60
      [  +0.000208] ft260_xfer_status: bus_status 0x40, clock 100
      [  +0.000001] ft260_i2c_read: rep 0xc2 addr 0x51 len 120 rlen 60 flag 0x0
      [  +0.008794] ft260_raw_event: i2c resp: rep 0xde len 60
      [  +0.000181] ft260_xfer_status: bus_status 0x40, clock 100
      [  +0.000002] ft260_i2c_read: rep 0xc2 addr 0x51 len 60 rlen 60 flag 0x4
      [  +0.008817] ft260_raw_event: i2c resp: rep 0xde len 60
      [  +0.000223] ft260_xfer_status: bus_status 0x20, clock 100
      
      After:
      
      [ +11.611642] ft260_i2c_write_read: off 0x0 rlen 180 wlen 2
      [  +0.000005] ft260_i2c_write: rep 0xd0 addr 0x51 off 0 len 2 wlen 2 flag 0x2 d[0] 0x0
      [  +0.008001] ft260_xfer_status: bus_status 0x20, clock 100
      [  +0.000001] ft260_i2c_read: rep 0xc2 addr 0x51 len 180 rlen 180 flag 0x7
      [  +0.008994] ft260_raw_event: i2c resp: rep 0xde len 60
      [  +0.007987] ft260_raw_event: i2c resp: rep 0xde len 60
      [  +0.007992] ft260_raw_event: i2c resp: rep 0xde len 60
      [  +0.000206] ft260_xfer_status: bus_status 0x20, clock 100
      Suggested-by: default avatarEnrik Berkhan <Enrik.Berkhan@inka.de>
      Signed-off-by: default avatarMichael Zaidman <michael.zaidman@gmail.com>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      54410c14
    • Michael Zaidman's avatar
      HID: ft260: support i2c reads greater than HID report size · 0acb869f
      Michael Zaidman authored
      A random i2c read operation in EEPROM devices is implemented as a dummy
      write operation, followed by a current address read operation. The dummy
      write operation is used to load the target byte or word address (a.k.a
      offset) into the offset counter, from which the subsequent read operation
      then reads.
      
      To support longer than one HID report size random read, the ft260 driver
      issues multiple pairs of i2c write offset + read data transactions of HID
      report size so that the EEPROM device sees many i2c random read requests
      from different offsets.
      
      Two issues with the current implementation:
      - This approach suffers from extra overhead caused by writing offset
        requests.
      - Necessity to handle offset per HID report in big-endian representation
        as EEPROM devices expect. The current implementation does not do it and
        correctly handles the reads up to 60 bytes only.
      
      This patch addresses both issues by implementing more efficient approach.
      It issues a single i2c read request of up to the EEPROM page size and then
      waits for the data to arrive in multiple HID reports. For example, to read
      the 256 bytes from a 24LC512 chip, which has 128 bytes page size, the old
      method performs six ft260_i2c_write_read transactions while the new - two
      only.
      
      Before:
      
      $ sudo ./i2cperf -d 2 -o 2 -s 128 -r 0-0xff 13 0x51 -S
      
        Read block via i2ctransfer by chunks
        -------------------------------------------------------------------
        data rate(bps)  efficiency(%)  data size(B)  total IOs   IO size(B)
        -------------------------------------------------------------------
        40803           85             256           2           128
      
      Kernel log of a single 128 bytes read request:
      
      [  +2.376308] ft260_i2c_write_read: read_off 0x0 left_len 128 len 60
      [  +0.000002] ft260_i2c_write: rep 0xd0 addr 0x51 off 0 len 2 wlen 2 flag 0x2 d[0] 0x0
      [  +0.000707] ft260_xfer_status: bus_status 0x41, clock 100
      [  +0.000173] ft260_xfer_status: bus_status 0x40, clock 100
      [  +0.000001] ft260_i2c_read: rep 0xc2 addr 0x51 len 60
      [  +0.008660] ft260_raw_event: i2c resp: rep 0xde len 60
      [  +0.000156] ft260_xfer_status: bus_status 0x20, clock 100
      [  +0.000001] ft260_i2c_write_read: read_off 0x3c left_len 68 len 60
      [  +0.000001] ft260_i2c_write: rep 0xd0 addr 0x51 off 0 len 2 wlen 2 flag 0x2 d[0] 0x3c
      [  +0.001034] ft260_xfer_status: bus_status 0x41, clock 100
      [  +0.000191] ft260_xfer_status: bus_status 0x40, clock 100
      [  +0.000001] ft260_i2c_read: rep 0xc2 addr 0x51 len 60
      [  +0.008614] ft260_raw_event: i2c resp: rep 0xde len 60
      [  +0.000203] ft260_xfer_status: bus_status 0x20, clock 100
      [  +0.000001] ft260_i2c_write_read: read_off 0x78 left_len 8 len 8
      [  +0.000001] ft260_i2c_write: rep 0xd0 addr 0x51 off 0 len 2 wlen 2 flag 0x2 d[0] 0x78
      [  +0.000987] ft260_xfer_status: bus_status 0x41, clock 100
      [  +0.000192] ft260_xfer_status: bus_status 0x40, clock 100
      [  +0.000001] ft260_i2c_read: rep 0xc2 addr 0x51 len 8
      [  +0.002614] ft260_raw_event: i2c resp: rep 0xd1 len 8
      [  +0.000200] ft260_xfer_status: bus_status 0x20, clock 100
      
      After:
      
      $ sudo ./i2cperf -d 2 -o 2 -s 128 -r 0-0xff 13 0x51 -S
      
        Read block via i2ctransfer by chunks
        -------------------------------------------------------------------
        data rate(bps)  efficiency(%)  data size(B)  total IOs   IO size(B)
        -------------------------------------------------------------------
        43990           85             256           2           128
      
      Kernel log of a single 128 bytes read request:
      
      [  +1.464346] ft260_i2c_write_read: off 0x0 rlen 128 wlen 2
      [  +0.000002] ft260_i2c_write: rep 0xd0 addr 0x51 off 0 len 2 wlen 2 flag 0x2 d[0] 0x0
      [  +0.001653] ft260_xfer_status: bus_status 0x41, clock 100
      [  +0.000188] ft260_xfer_status: bus_status 0x40, clock 100
      [  +0.000002] ft260_i2c_read: rep 0xc2 addr 0x51 len 128 rlen 60 flag 0x3
      [  +0.008609] ft260_raw_event: i2c resp: rep 0xde len 60
      [  +0.000157] ft260_xfer_status: bus_status 0x40, clock 100
      [  +0.000002] ft260_i2c_read: rep 0xc2 addr 0x51 len 68 rlen 60 flag 0x0
      [  +0.008840] ft260_raw_event: i2c resp: rep 0xde len 60
      [  +0.000203] ft260_xfer_status: bus_status 0x40, clock 100
      [  +0.000002] ft260_i2c_read: rep 0xc2 addr 0x51 len 8 rlen 8 flag 0x4
      [  +0.002794] ft260_raw_event: i2c resp: rep 0xd1 len 8
      [  +0.000201] ft260_xfer_status: bus_status 0x20, clock 100
      Signed-off-by: default avatarMichael Zaidman <michael.zaidman@gmail.com>
      Tested-by: default avatarGuillaume Champagne <champagne.guillaume.c@gmail.com>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      0acb869f
    • Michael Zaidman's avatar
      HID: ft260: support i2c writes larger than HID report size · 1edfae51
      Michael Zaidman authored
      To support longer than one HID report size write, the driver splits a
      single i2c message data payload into multiple i2c messages of HID report
      size. However, it does not replicate the offset bytes within the EEPROM
      chip in every consequent HID report because it is not and should not be
      aware of the EEPROM type. It breaks the i2c write message integrity and
      causes the EEPROM device not to acknowledge the second HID report keeping
      the i2c bus busy until the ft260 controller reports failure.
      
      This patch preserves the i2c write message integrity by manipulating the
      i2c flag bits across multiple HID reports to be seen by the EEPROM device
      as a single i2c write transfer.
      
      Before:
      
      $ sudo ./i2cperf -f 2 -o 2 -s 64 -r 0-0xff 13 0x51 -S
      Error: Sending messages failed: Input/output error
      
      [  +3.667741] ft260_i2c_write: rep 0xde addr 0x51 off 0 len 60 d[0] 0x0
      [  +0.007330] ft260_hid_output_report_check_status: wait 6400 usec, len 64
      [  +0.000203] ft260_xfer_status: bus_status 0x40, clock 100
      [  +0.000001] ft260_i2c_write: rep 0xd1 addr 0x51 off 60 len 6 d[0] 0x0
      [  +0.002337] ft260_hid_output_report_check_status: wait 1000 usec, len 10
      [  +0.000157] ft260_xfer_status: bus_status 0x2e, clock 100
      [  +0.000241] ft260_i2c_reset: done
      [  +0.000003] ft260_i2c_write: failed to start transfer, ret -5
      
      After:
      
      $ sudo ./i2cperf -f 2 -o 2 -s 128 -r 0-0xff 13 0x51 -S
      
        Fill block with increment via i2ctransfer by chunks
        -------------------------------------------------------------------
        data rate(bps)  efficiency(%)  data size(B)  total IOs   IO size(B)
        -------------------------------------------------------------------
        71260           86             256           2           128
      Signed-off-by: default avatarMichael Zaidman <michael.zaidman@gmail.com>
      Tested-by: default avatarGuillaume Champagne <champagne.guillaume.c@gmail.com>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      1edfae51
    • Michael Zaidman's avatar
      HID: ft260: improve i2c write performance · 6fca5e3f
      Michael Zaidman authored
      The patch improves the I2C write performance by 20 - 30 percent by
      revising the sleep time in the ft260_hid_output_report_check_status()
      in the following ways:
      
      1. Reduce the wait time and start to poll earlier.
      
      Sending a large amount of data at a low I2C clock rate saturates the
      internal FT260 buffer and causes hiccups in status readiness, as shown
      below in the log fragment. Aligning the status check wait time to the
      worst case significantly reduces the write performance.
      
      [Oct22 10:28] ft260_i2c_write: rep 0xd8 addr 0x51 off 0 len 34 d[0] 0x0
      [  +0.005296] ft260_xfer_status: bus_status 0x20, clock 100
      [  +0.013460] ft260_i2c_write: rep 0xd8 addr 0x51 off 0 len 34 d[0] 0x0
      [  +0.003244] ft260_hid_output_report_check_status: wait 1920 usec, len 38
      [  +0.000190] ft260_xfer_status: bus_status 0x40, clock 100
      [  +0.015324] ft260_i2c_write: rep 0xd8 addr 0x51 off 0 len 34 d[0] 0x0
      [  +0.003491] ft260_hid_output_report_check_status: wait 1920 usec, len 38
      [  +0.000202] ft260_xfer_status: bus_status 0x40, clock 100
      [  +0.016047] ft260_i2c_write: rep 0xd8 addr 0x51 off 0 len 34 d[0] 0x0
      [  +0.002768] ft260_hid_output_report_check_status: wait 1920 usec, len 38
      [  +0.000150] ft260_xfer_status: bus_status 0x40, clock 100
      [  +0.011389] ft260_i2c_write: rep 0xd8 addr 0x51 off 0 len 34 d[0] 0x0
      [  +0.003467] ft260_hid_output_report_check_status: wait 1920 usec, len 38
      [  +0.000191] ft260_xfer_status: bus_status 0x41, clock 100
      [  +0.000172] ft260_xfer_status: bus_status 0x41, clock 100
      [  +0.000131] ft260_xfer_status: bus_status 0x41, clock 100
      [  +0.000241] ft260_xfer_status: bus_status 0x41, clock 100
      [  +0.000233] ft260_xfer_status: bus_status 0x41, clock 100
      [  +0.000190] ft260_xfer_status: bus_status 0x41, clock 100
      [  +0.000196] ft260_xfer_status: bus_status 0x40, clock 100
      [  +0.011314] ft260_i2c_write: rep 0xd8 addr 0x51 off 0 len 34 d[0] 0x0
      [  +0.003334] ft260_hid_output_report_check_status: wait 1920 usec, len 38
      [  +0.000227] ft260_xfer_status: bus_status 0x41, clock 100
      [  +0.000204] ft260_xfer_status: bus_status 0x41, clock 100
      [  +0.000198] ft260_xfer_status: bus_status 0x41, clock 100
      [  +0.000147] ft260_xfer_status: bus_status 0x40, clock 100
      [  +0.011060] ft260_i2c_write: rep 0xd8 addr 0x51 off 0 len 34 d[0] 0x0
      
        Before:
          $ sudo ./i2cperf -f 2 -o 2 -s 32 -r 0-0xff 13 0x51 -S
      
            Fill block with increment via i2ctransfer by chunks
            -------------------------------------------------------------------
            data rate(bps)  efficiency(%)  data size(B)  total IOs   IO size(B)
            -------------------------------------------------------------------
            40510           80             256           8           32
      
        After:
          $ sudo ./i2cperf -f 2 -o 2 -s 32 -r 0-0xff 13 0x51 -S
      
            Fill block with increment via i2ctransfer by chunks
            -------------------------------------------------------------------
            data rate(bps)  efficiency(%)  data size(B)  total IOs   IO size(B)
            -------------------------------------------------------------------
            52584           80             256           8           32
      
      2. Do not sleep if the estimated I2C transfer time is below 2 ms since
         the first xfer status query frequently takes around 1.5 ms, and the
         following status queries take about 200us on average. So we usually
         return from the routine after the first 1 - 3 status checks.
      
      [Oct22 11:14] ft260_i2c_write: rep 0xd4 addr 0x51 off 0 len 18 d[0] 0x0
      [  +0.004270] ft260_xfer_status: bus_status 0x20, clock 100
      [  +0.013889] ft260_i2c_write: rep 0xd4 addr 0x51 off 0 len 18 d[0] 0x0
      [  +0.000856] ft260_xfer_status: bus_status 0x41, clock 100
      [  +0.000138] ft260_xfer_status: bus_status 0x40, clock 100
      [  +0.013352] ft260_i2c_write: rep 0xd4 addr 0x51 off 0 len 18 d[0] 0x0
      [  +0.001501] ft260_xfer_status: bus_status 0x41, clock 100
      [  +0.000177] ft260_xfer_status: bus_status 0x40, clock 100
      [  +0.014477] ft260_i2c_write: rep 0xd4 addr 0x51 off 0 len 18 d[0] 0x0
      [  +0.001377] ft260_xfer_status: bus_status 0x41, clock 100
      [  +0.000233] ft260_xfer_status: bus_status 0x41, clock 100
      [  +0.000191] ft260_xfer_status: bus_status 0x40, clock 100
      [  +0.013197] ft260_i2c_write: rep 0xd4 addr 0x51 off 0 len 18 d[0] 0x0
      
        Before:
          $ sudo ./i2cperf -f 2 -o 2 -s 16 -r 0-0xff 13 0x51 -S
      
            Fill block with increment via i2ctransfer by chunks
            -------------------------------------------------------------------
            data rate(bps)  efficiency(%)  data size(B)  total IOs   IO size(B)
            -------------------------------------------------------------------
            28826           73             256           16          16
      
        After:
          $ sudo ./i2cperf -f 2 -o 2 -s 16 -r 0-0xff 13 0x51 -S
      
            Fill block with increment via i2ctransfer by chunks
            -------------------------------------------------------------------
            data rate(bps)  efficiency(%)  data size(B)  total IOs   IO size(B)
            -------------------------------------------------------------------
            45138           73             256           16          16
      Signed-off-by: default avatarMichael Zaidman <michael.zaidman@gmail.com>
      Tested-by: default avatarGuillaume Champagne <champagne.guillaume.c@gmail.com>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      6fca5e3f
    • Michael Zaidman's avatar
      HID: ft260: ft260_xfer_status routine cleanup · f45d50ed
      Michael Zaidman authored
      After clarifying with FTDI's support, it turned out that the error
      condition (bit 1) in byte 1 of the i2c status HID report is a status
      bit reflecting all error conditions. When bits 2, 3, or 4 are raised
      to 1, bit 1 is set to 1 also. Since the ft260_xfer_status routine tests
      the error condition bit and exits in the case of an error, the program
      flow never reaches the conditional expressions for 2, 3, and 4 bits when
      any of them indicates an error state. Though these expressions are never
      evaluated to true, they are checked several times per IO, increasing the
      ft260_xfer_status polling cycle duration.
      
      The patch removes the conditional expressions for 2, 3, and 4 bits in
      byte 1 of the i2c status HID report.
      Signed-off-by: default avatarMichael Zaidman <michael.zaidman@gmail.com>
      Tested-by: default avatarGuillaume Champagne <champagne.guillaume.c@gmail.com>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      f45d50ed
    • Linus Torvalds's avatar
      Merge tag 'net-6.1-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net · 4bbf3422
      Linus Torvalds authored
      Pull networking fixes from Jakub Kicinski:
       "Including fixes from netfilter, wifi, can and bpf.
      
        Current release - new code bugs:
      
         - can: af_can: can_exit(): add missing dev_remove_pack() of
           canxl_packet
      
        Previous releases - regressions:
      
         - bpf, sockmap: fix the sk->sk_forward_alloc warning
      
         - wifi: mac80211: fix general-protection-fault in
           ieee80211_subif_start_xmit()
      
         - can: af_can: fix NULL pointer dereference in can_rx_register()
      
         - can: dev: fix skb drop check, avoid o-o-b access
      
         - nfnetlink: fix potential dead lock in nfnetlink_rcv_msg()
      
        Previous releases - always broken:
      
         - bpf: fix wrong reg type conversion in release_reference()
      
         - gso: fix panic on frag_list with mixed head alloc types
      
         - wifi: brcmfmac: fix buffer overflow in brcmf_fweh_event_worker()
      
         - wifi: mac80211: set TWT Information Frame Disabled bit as 1
      
         - eth: macsec offload related fixes, make sure to clear the keys from
           memory
      
         - tun: fix memory leaks in the use of napi_get_frags
      
         - tun: call napi_schedule_prep() to ensure we own a napi
      
         - tcp: prohibit TCP_REPAIR_OPTIONS if data was already sent
      
         - ipv6: addrlabel: fix infoleak when sending struct ifaddrlblmsg to
           network
      
         - tipc: fix a msg->req tlv length check
      
         - sctp: clear out_curr if all frag chunks of current msg are pruned,
           avoid list corruption
      
         - mctp: fix an error handling path in mctp_init(), avoid leaks"
      
      * tag 'net-6.1-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (101 commits)
        eth: sp7021: drop free_netdev() from spl2sw_init_netdev()
        MAINTAINERS: Move Vivien to CREDITS
        net: macvlan: fix memory leaks of macvlan_common_newlink
        ethernet: tundra: free irq when alloc ring failed in tsi108_open()
        net: mv643xx_eth: disable napi when init rxq or txq failed in mv643xx_eth_open()
        ethernet: s2io: disable napi when start nic failed in s2io_card_up()
        net: atlantic: macsec: clear encryption keys from the stack
        net: phy: mscc: macsec: clear encryption keys when freeing a flow
        stmmac: dwmac-loongson: fix missing of_node_put() while module exiting
        stmmac: dwmac-loongson: fix missing pci_disable_device() in loongson_dwmac_probe()
        stmmac: dwmac-loongson: fix missing pci_disable_msi() while module exiting
        cxgb4vf: shut down the adapter when t4vf_update_port_info() failed in cxgb4vf_open()
        mctp: Fix an error handling path in mctp_init()
        stmmac: intel: Update PCH PTP clock rate from 200MHz to 204.8MHz
        net: cxgb3_main: disable napi when bind qsets failed in cxgb_up()
        net: cpsw: disable napi in cpsw_ndo_open()
        iavf: Fix VF driver counting VLAN 0 filters
        ice: Fix spurious interrupt during removal of trusted VF
        net/mlx5e: TC, Fix slab-out-of-bounds in parse_tc_actions
        net/mlx5e: E-Switch, Fix comparing termination table instance
        ...
      4bbf3422
    • Jakub Kicinski's avatar
      Merge tag 'mlx5-fixes-2022-11-09' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux · abd5ac18
      Jakub Kicinski authored
      Saeed Mahameed says:
      
      ====================
      mlx5 fixes 2022-11-02
      
      This series provides bug fixes to mlx5 driver.
      
      * tag 'mlx5-fixes-2022-11-09' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux:
        net/mlx5e: TC, Fix slab-out-of-bounds in parse_tc_actions
        net/mlx5e: E-Switch, Fix comparing termination table instance
        net/mlx5e: TC, Fix wrong rejection of packet-per-second policing
        net/mlx5e: Fix tc acts array not to be dependent on enum order
        net/mlx5e: Fix usage of DMA sync API
        net/mlx5e: Add missing sanity checks for max TX WQE size
        net/mlx5: fw_reset: Don't try to load device in case PCI isn't working
        net/mlx5: E-switch, Set to legacy mode if failed to change switchdev mode
        net/mlx5: Allow async trigger completion execution on single CPU systems
        net/mlx5: Bridge, verify LAG state when adding bond to bridge
      ====================
      
      Link: https://lore.kernel.org/r/20221109184050.108379-1-saeed@kernel.orgSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      abd5ac18
    • Jakub Kicinski's avatar
      Merge branch '100GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue · b3bbeba0
      Jakub Kicinski authored
      Tony Nguyen says:
      
      ====================
      Intel Wired LAN Driver Updates 2022-11-09 (ice, iavf)
      
      This series contains updates to ice and iavf drivers.
      
      Norbert stops disabling VF queues that are not enabled for ice driver.
      
      Michal stops accounting of VLAN 0 filter to match expectations of PF
      driver for iavf.
      
      * '100GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue:
        iavf: Fix VF driver counting VLAN 0 filters
        ice: Fix spurious interrupt during removal of trusted VF
      ====================
      
      Link: https://lore.kernel.org/r/20221110003744.201414-1-anthony.l.nguyen@intel.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      b3bbeba0
    • Wei Yongjun's avatar
      eth: sp7021: drop free_netdev() from spl2sw_init_netdev() · de91b319
      Wei Yongjun authored
      It's not necessary to free netdev allocated with devm_alloc_etherdev()
      and using free_netdev() leads to double free.
      
      Fixes: fd3040b9 ("net: ethernet: Add driver for Sunplus SP7021")
      Signed-off-by: default avatarWei Yongjun <weiyongjun1@huawei.com>
      Link: https://lore.kernel.org/r/20221109150116.2988194-1-weiyongjun@huaweicloud.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      de91b319
    • Dave Airlie's avatar
      Merge tag 'drm-intel-fixes-2022-11-10' of... · b7ffd9d9
      Dave Airlie authored
      Merge tag 'drm-intel-fixes-2022-11-10' of git://anongit.freedesktop.org/drm/drm-intel into drm-fixes
      
      - Fix sg_table handling in map_dma_buf (Matthew Auld)
      - Send PSR update also on invalidate (Jouni Högander)
      - Do not set cache_dirty for DGFX (Niranjana Vishwanathapura)
      - Restore userptr probe_range behaviour (Matthew Auld)
      Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
      From: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/Y2zCy5q85qE9W0J8@tursulin-desk
      b7ffd9d9
  8. 10 Nov, 2022 4 commits