From a9ac491913a422af1710396b05ef57e254464ab8 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Tue, 25 Feb 2020 21:48:09 +0100 Subject: [PATCH] 5.4-stable patches added patches: e1000e-use-rtnl_lock-to-prevent-race-conditions-between-net-and-pci-pm.patch thunderbolt-prevent-crash-if-non-active-nvmem-file-is-read.patch usb-misc-iowarrior-add-support-for-2-oemed-devices.patch usb-misc-iowarrior-add-support-for-the-100-device.patch usb-misc-iowarrior-add-support-for-the-28-and-28l-devices.patch --- ...ce-conditions-between-net-and-pci-pm.patch | 168 ++++++++++++++++++ queue-5.4/series | 5 + ...ash-if-non-active-nvmem-file-is-read.patch | 63 +++++++ ...rior-add-support-for-2-oemed-devices.patch | 87 +++++++++ ...rrior-add-support-for-the-100-device.patch | 67 +++++++ ...d-support-for-the-28-and-28l-devices.patch | 74 ++++++++ 6 files changed, 464 insertions(+) create mode 100644 queue-5.4/e1000e-use-rtnl_lock-to-prevent-race-conditions-between-net-and-pci-pm.patch create mode 100644 queue-5.4/thunderbolt-prevent-crash-if-non-active-nvmem-file-is-read.patch create mode 100644 queue-5.4/usb-misc-iowarrior-add-support-for-2-oemed-devices.patch create mode 100644 queue-5.4/usb-misc-iowarrior-add-support-for-the-100-device.patch create mode 100644 queue-5.4/usb-misc-iowarrior-add-support-for-the-28-and-28l-devices.patch diff --git a/queue-5.4/e1000e-use-rtnl_lock-to-prevent-race-conditions-between-net-and-pci-pm.patch b/queue-5.4/e1000e-use-rtnl_lock-to-prevent-race-conditions-between-net-and-pci-pm.patch new file mode 100644 index 00000000000..b52ec101640 --- /dev/null +++ b/queue-5.4/e1000e-use-rtnl_lock-to-prevent-race-conditions-between-net-and-pci-pm.patch @@ -0,0 +1,168 @@ +From a7023819404ac9bd2bb311a4fafd38515cfa71ec Mon Sep 17 00:00:00 2001 +From: Alexander Duyck +Date: Fri, 11 Oct 2019 08:34:52 -0700 +Subject: e1000e: Use rtnl_lock to prevent race conditions between net and pci/pm + +From: Alexander Duyck + +commit a7023819404ac9bd2bb311a4fafd38515cfa71ec upstream. + +This patch is meant to address possible race conditions that can exist +between network configuration and power management. A similar issue was +fixed for igb in commit 9474933caf21 ("igb: close/suspend race in +netif_device_detach"). + +In addition it consolidates the code so that the PCI error handling code +will essentially perform the power management freeze on the device prior to +attempting a reset, and will thaw the device afterwards if that is what it +is planning to do. Otherwise when we call close on the interface it should +see it is detached and not attempt to call the logic to down the interface +and free the IRQs again. + +From what I can tell the check that was adding the check for __E1000_DOWN +in e1000e_close was added when runtime power management was added. However +it should not be relevant for us as we perform a call to +pm_runtime_get_sync before we call e1000_down/free_irq so it should always +be back up before we call into this anyway. + +Reported-by: Morumuri Srivalli +Signed-off-by: Alexander Duyck +Tested-by: David Dai +Tested-by: Aaron Brown +Cc: Kai-Heng Feng +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/ethernet/intel/e1000e/netdev.c | 68 ++++++++++++++--------------- + 1 file changed, 35 insertions(+), 33 deletions(-) + +--- a/drivers/net/ethernet/intel/e1000e/netdev.c ++++ b/drivers/net/ethernet/intel/e1000e/netdev.c +@@ -4713,12 +4713,12 @@ int e1000e_close(struct net_device *netd + + pm_runtime_get_sync(&pdev->dev); + +- if (!test_bit(__E1000_DOWN, &adapter->state)) { ++ if (netif_device_present(netdev)) { + e1000e_down(adapter, true); + e1000_free_irq(adapter); + + /* Link status message must follow this format */ +- pr_info("%s NIC Link is Down\n", adapter->netdev->name); ++ pr_info("%s NIC Link is Down\n", netdev->name); + } + + napi_disable(&adapter->napi); +@@ -6309,10 +6309,14 @@ static int e1000e_pm_freeze(struct devic + { + struct net_device *netdev = dev_get_drvdata(dev); + struct e1000_adapter *adapter = netdev_priv(netdev); ++ bool present; + ++ rtnl_lock(); ++ ++ present = netif_device_present(netdev); + netif_device_detach(netdev); + +- if (netif_running(netdev)) { ++ if (present && netif_running(netdev)) { + int count = E1000_CHECK_RESET_COUNT; + + while (test_bit(__E1000_RESETTING, &adapter->state) && count--) +@@ -6324,6 +6328,8 @@ static int e1000e_pm_freeze(struct devic + e1000e_down(adapter, false); + e1000_free_irq(adapter); + } ++ rtnl_unlock(); ++ + e1000e_reset_interrupt_capability(adapter); + + /* Allow time for pending master requests to run */ +@@ -6571,6 +6577,30 @@ static void e1000e_disable_aspm_locked(s + __e1000e_disable_aspm(pdev, state, 1); + } + ++static int e1000e_pm_thaw(struct device *dev) ++{ ++ struct net_device *netdev = dev_get_drvdata(dev); ++ struct e1000_adapter *adapter = netdev_priv(netdev); ++ int rc = 0; ++ ++ e1000e_set_interrupt_capability(adapter); ++ ++ rtnl_lock(); ++ if (netif_running(netdev)) { ++ rc = e1000_request_irq(adapter); ++ if (rc) ++ goto err_irq; ++ ++ e1000e_up(adapter); ++ } ++ ++ netif_device_attach(netdev); ++err_irq: ++ rtnl_unlock(); ++ ++ return rc; ++} ++ + #ifdef CONFIG_PM + static int __e1000_resume(struct pci_dev *pdev) + { +@@ -6638,26 +6668,6 @@ static int __e1000_resume(struct pci_dev + } + + #ifdef CONFIG_PM_SLEEP +-static int e1000e_pm_thaw(struct device *dev) +-{ +- struct net_device *netdev = dev_get_drvdata(dev); +- struct e1000_adapter *adapter = netdev_priv(netdev); +- +- e1000e_set_interrupt_capability(adapter); +- if (netif_running(netdev)) { +- u32 err = e1000_request_irq(adapter); +- +- if (err) +- return err; +- +- e1000e_up(adapter); +- } +- +- netif_device_attach(netdev); +- +- return 0; +-} +- + static int e1000e_pm_suspend(struct device *dev) + { + struct pci_dev *pdev = to_pci_dev(dev); +@@ -6829,16 +6839,11 @@ static void e1000_netpoll(struct net_dev + static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev, + pci_channel_state_t state) + { +- struct net_device *netdev = pci_get_drvdata(pdev); +- struct e1000_adapter *adapter = netdev_priv(netdev); +- +- netif_device_detach(netdev); ++ e1000e_pm_freeze(&pdev->dev); + + if (state == pci_channel_io_perm_failure) + return PCI_ERS_RESULT_DISCONNECT; + +- if (netif_running(netdev)) +- e1000e_down(adapter, true); + pci_disable_device(pdev); + + /* Request a slot slot reset. */ +@@ -6904,10 +6909,7 @@ static void e1000_io_resume(struct pci_d + + e1000_init_manageability_pt(adapter); + +- if (netif_running(netdev)) +- e1000e_up(adapter); +- +- netif_device_attach(netdev); ++ e1000e_pm_thaw(&pdev->dev); + + /* If the controller has AMT, do not set DRV_LOAD until the interface + * is up. For all other cases, let the f/w know that the h/w is now diff --git a/queue-5.4/series b/queue-5.4/series index 48f1232f6c2..81b07b84b1a 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -8,3 +8,8 @@ tpm-initialize-crypto_id-of-allocated_banks-to-hash_algo__last.patch ecryptfs-fix-a-memory-leak-bug-in-parse_tag_1_packet.patch ecryptfs-fix-a-memory-leak-bug-in-ecryptfs_init_messaging.patch btrfs-handle-logged-extent-failure-properly.patch +thunderbolt-prevent-crash-if-non-active-nvmem-file-is-read.patch +usb-misc-iowarrior-add-support-for-2-oemed-devices.patch +usb-misc-iowarrior-add-support-for-the-28-and-28l-devices.patch +usb-misc-iowarrior-add-support-for-the-100-device.patch +e1000e-use-rtnl_lock-to-prevent-race-conditions-between-net-and-pci-pm.patch diff --git a/queue-5.4/thunderbolt-prevent-crash-if-non-active-nvmem-file-is-read.patch b/queue-5.4/thunderbolt-prevent-crash-if-non-active-nvmem-file-is-read.patch new file mode 100644 index 00000000000..01773c44581 --- /dev/null +++ b/queue-5.4/thunderbolt-prevent-crash-if-non-active-nvmem-file-is-read.patch @@ -0,0 +1,63 @@ +From 03cd45d2e219301880cabc357e3cf478a500080f Mon Sep 17 00:00:00 2001 +From: Mika Westerberg +Date: Thu, 13 Feb 2020 12:56:04 +0300 +Subject: thunderbolt: Prevent crash if non-active NVMem file is read + +From: Mika Westerberg + +commit 03cd45d2e219301880cabc357e3cf478a500080f upstream. + +The driver does not populate .reg_read callback for the non-active NVMem +because the file is supposed to be write-only. However, it turns out +NVMem subsystem does not yet support this and expects that the .reg_read +callback is provided. If user reads the binary attribute it triggers +NULL pointer dereference like this one: + + BUG: kernel NULL pointer dereference, address: 0000000000000000 + ... + Call Trace: + bin_attr_nvmem_read+0x64/0x80 + kernfs_fop_read+0xa7/0x180 + vfs_read+0xbd/0x170 + ksys_read+0x5a/0xd0 + do_syscall_64+0x43/0x150 + entry_SYSCALL_64_after_hwframe+0x44/0xa9 + +Fix this in the driver by providing .reg_read callback that always +returns an error. + +Reported-by: Nicholas Johnson +Fixes: e6b245ccd524 ("thunderbolt: Add support for host and device NVM firmware upgrade") +Signed-off-by: Mika Westerberg +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/r/20200213095604.1074-1-mika.westerberg@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/thunderbolt/switch.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +--- a/drivers/thunderbolt/switch.c ++++ b/drivers/thunderbolt/switch.c +@@ -274,6 +274,12 @@ out: + return ret; + } + ++static int tb_switch_nvm_no_read(void *priv, unsigned int offset, void *val, ++ size_t bytes) ++{ ++ return -EPERM; ++} ++ + static int tb_switch_nvm_write(void *priv, unsigned int offset, void *val, + size_t bytes) + { +@@ -319,6 +325,7 @@ static struct nvmem_device *register_nvm + config.read_only = true; + } else { + config.name = "nvm_non_active"; ++ config.reg_read = tb_switch_nvm_no_read; + config.reg_write = tb_switch_nvm_write; + config.root_only = true; + } diff --git a/queue-5.4/usb-misc-iowarrior-add-support-for-2-oemed-devices.patch b/queue-5.4/usb-misc-iowarrior-add-support-for-2-oemed-devices.patch new file mode 100644 index 00000000000..ea7c427c8de --- /dev/null +++ b/queue-5.4/usb-misc-iowarrior-add-support-for-2-oemed-devices.patch @@ -0,0 +1,87 @@ +From 461d8deb26a7d70254bc0391feb4fd8a95e674e8 Mon Sep 17 00:00:00 2001 +From: Greg Kroah-Hartman +Date: Tue, 11 Feb 2020 20:04:21 -0800 +Subject: USB: misc: iowarrior: add support for 2 OEMed devices + +From: Greg Kroah-Hartman + +commit 461d8deb26a7d70254bc0391feb4fd8a95e674e8 upstream. + +Add support for two OEM devices that are identical to existing +IO-Warrior devices, except for the USB device id. + +Cc: Christoph Jung +Cc: stable +Link: https://lore.kernel.org/r/20200212040422.2991-1-gregkh@linuxfoundation.org +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/misc/iowarrior.c | 15 +++++++++++++-- + 1 file changed, 13 insertions(+), 2 deletions(-) + +--- a/drivers/usb/misc/iowarrior.c ++++ b/drivers/usb/misc/iowarrior.c +@@ -34,6 +34,10 @@ + /* full speed iowarrior */ + #define USB_DEVICE_ID_CODEMERCS_IOW56 0x1503 + ++/* OEMed devices */ ++#define USB_DEVICE_ID_CODEMERCS_IOW24SAG 0x158a ++#define USB_DEVICE_ID_CODEMERCS_IOW56AM 0x158b ++ + /* Get a minor range for your devices from the usb maintainer */ + #ifdef CONFIG_USB_DYNAMIC_MINORS + #define IOWARRIOR_MINOR_BASE 0 +@@ -133,6 +137,8 @@ static const struct usb_device_id iowarr + {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOWPV1)}, + {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOWPV2)}, + {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW56)}, ++ {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW24SAG)}, ++ {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW56AM)}, + {} /* Terminating entry */ + }; + MODULE_DEVICE_TABLE(usb, iowarrior_ids); +@@ -357,6 +363,7 @@ static ssize_t iowarrior_write(struct fi + } + switch (dev->product_id) { + case USB_DEVICE_ID_CODEMERCS_IOW24: ++ case USB_DEVICE_ID_CODEMERCS_IOW24SAG: + case USB_DEVICE_ID_CODEMERCS_IOWPV1: + case USB_DEVICE_ID_CODEMERCS_IOWPV2: + case USB_DEVICE_ID_CODEMERCS_IOW40: +@@ -371,6 +378,7 @@ static ssize_t iowarrior_write(struct fi + goto exit; + break; + case USB_DEVICE_ID_CODEMERCS_IOW56: ++ case USB_DEVICE_ID_CODEMERCS_IOW56AM: + /* The IOW56 uses asynchronous IO and more urbs */ + if (atomic_read(&dev->write_busy) == MAX_WRITES_IN_FLIGHT) { + /* Wait until we are below the limit for submitted urbs */ +@@ -493,6 +501,7 @@ static long iowarrior_ioctl(struct file + switch (cmd) { + case IOW_WRITE: + if (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW24 || ++ dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW24SAG || + dev->product_id == USB_DEVICE_ID_CODEMERCS_IOWPV1 || + dev->product_id == USB_DEVICE_ID_CODEMERCS_IOWPV2 || + dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW40) { +@@ -767,7 +776,8 @@ static int iowarrior_probe(struct usb_in + goto error; + } + +- if (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56) { ++ if ((dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56) || ++ (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56AM)) { + res = usb_find_last_int_out_endpoint(iface_desc, + &dev->int_out_endpoint); + if (res) { +@@ -780,7 +790,8 @@ static int iowarrior_probe(struct usb_in + /* we have to check the report_size often, so remember it in the endianness suitable for our machine */ + dev->report_size = usb_endpoint_maxp(dev->int_in_endpoint); + if ((dev->interface->cur_altsetting->desc.bInterfaceNumber == 0) && +- (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56)) ++ ((dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56) || ++ (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56AM))) + /* IOWarrior56 has wMaxPacketSize different from report size */ + dev->report_size = 7; + diff --git a/queue-5.4/usb-misc-iowarrior-add-support-for-the-100-device.patch b/queue-5.4/usb-misc-iowarrior-add-support-for-the-100-device.patch new file mode 100644 index 00000000000..17f638d1b4b --- /dev/null +++ b/queue-5.4/usb-misc-iowarrior-add-support-for-the-100-device.patch @@ -0,0 +1,67 @@ +From bab5417f5f0118ce914bc5b2f8381e959e891155 Mon Sep 17 00:00:00 2001 +From: Greg Kroah-Hartman +Date: Fri, 14 Feb 2020 08:11:48 -0800 +Subject: USB: misc: iowarrior: add support for the 100 device + +From: Greg Kroah-Hartman + +commit bab5417f5f0118ce914bc5b2f8381e959e891155 upstream. + +Add a new device id for the 100 devie. It has 4 interfaces like the 28 +and 28L devices but a larger endpoint so more I/O pins. + +Cc: Christoph Jung +Cc: stable +Link: https://lore.kernel.org/r/20200214161148.GA3963518@kroah.com +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/misc/iowarrior.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +--- a/drivers/usb/misc/iowarrior.c ++++ b/drivers/usb/misc/iowarrior.c +@@ -36,6 +36,7 @@ + /* fuller speed iowarrior */ + #define USB_DEVICE_ID_CODEMERCS_IOW28 0x1504 + #define USB_DEVICE_ID_CODEMERCS_IOW28L 0x1505 ++#define USB_DEVICE_ID_CODEMERCS_IOW100 0x1506 + + /* OEMed devices */ + #define USB_DEVICE_ID_CODEMERCS_IOW24SAG 0x158a +@@ -144,6 +145,7 @@ static const struct usb_device_id iowarr + {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW56AM)}, + {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW28)}, + {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW28L)}, ++ {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW100)}, + {} /* Terminating entry */ + }; + MODULE_DEVICE_TABLE(usb, iowarrior_ids); +@@ -386,6 +388,7 @@ static ssize_t iowarrior_write(struct fi + case USB_DEVICE_ID_CODEMERCS_IOW56AM: + case USB_DEVICE_ID_CODEMERCS_IOW28: + case USB_DEVICE_ID_CODEMERCS_IOW28L: ++ case USB_DEVICE_ID_CODEMERCS_IOW100: + /* The IOW56 uses asynchronous IO and more urbs */ + if (atomic_read(&dev->write_busy) == MAX_WRITES_IN_FLIGHT) { + /* Wait until we are below the limit for submitted urbs */ +@@ -786,7 +789,8 @@ static int iowarrior_probe(struct usb_in + if ((dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56) || + (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56AM) || + (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW28) || +- (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW28L)) { ++ (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW28L) || ++ (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW100)) { + res = usb_find_last_int_out_endpoint(iface_desc, + &dev->int_out_endpoint); + if (res) { +@@ -802,7 +806,8 @@ static int iowarrior_probe(struct usb_in + ((dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56) || + (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56AM) || + (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW28) || +- (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW28L))) ++ (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW28L) || ++ (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW100))) + /* IOWarrior56 has wMaxPacketSize different from report size */ + dev->report_size = 7; + diff --git a/queue-5.4/usb-misc-iowarrior-add-support-for-the-28-and-28l-devices.patch b/queue-5.4/usb-misc-iowarrior-add-support-for-the-28-and-28l-devices.patch new file mode 100644 index 00000000000..165c4dd09c4 --- /dev/null +++ b/queue-5.4/usb-misc-iowarrior-add-support-for-the-28-and-28l-devices.patch @@ -0,0 +1,74 @@ +From 5f6f8da2d7b5a431d3f391d0d73ace8edfb42af7 Mon Sep 17 00:00:00 2001 +From: Greg Kroah-Hartman +Date: Tue, 11 Feb 2020 20:04:22 -0800 +Subject: USB: misc: iowarrior: add support for the 28 and 28L devices + +From: Greg Kroah-Hartman + +commit 5f6f8da2d7b5a431d3f391d0d73ace8edfb42af7 upstream. + +Add new device ids for the 28 and 28L devices. These have 4 interfaces +instead of 2, but the driver binds the same, so the driver changes are +minimal. + +Cc: Christoph Jung +Cc: stable +Link: https://lore.kernel.org/r/20200212040422.2991-2-gregkh@linuxfoundation.org +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/misc/iowarrior.c | 15 +++++++++++++-- + 1 file changed, 13 insertions(+), 2 deletions(-) + +--- a/drivers/usb/misc/iowarrior.c ++++ b/drivers/usb/misc/iowarrior.c +@@ -33,6 +33,9 @@ + #define USB_DEVICE_ID_CODEMERCS_IOWPV2 0x1512 + /* full speed iowarrior */ + #define USB_DEVICE_ID_CODEMERCS_IOW56 0x1503 ++/* fuller speed iowarrior */ ++#define USB_DEVICE_ID_CODEMERCS_IOW28 0x1504 ++#define USB_DEVICE_ID_CODEMERCS_IOW28L 0x1505 + + /* OEMed devices */ + #define USB_DEVICE_ID_CODEMERCS_IOW24SAG 0x158a +@@ -139,6 +142,8 @@ static const struct usb_device_id iowarr + {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW56)}, + {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW24SAG)}, + {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW56AM)}, ++ {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW28)}, ++ {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW28L)}, + {} /* Terminating entry */ + }; + MODULE_DEVICE_TABLE(usb, iowarrior_ids); +@@ -379,6 +384,8 @@ static ssize_t iowarrior_write(struct fi + break; + case USB_DEVICE_ID_CODEMERCS_IOW56: + case USB_DEVICE_ID_CODEMERCS_IOW56AM: ++ case USB_DEVICE_ID_CODEMERCS_IOW28: ++ case USB_DEVICE_ID_CODEMERCS_IOW28L: + /* The IOW56 uses asynchronous IO and more urbs */ + if (atomic_read(&dev->write_busy) == MAX_WRITES_IN_FLIGHT) { + /* Wait until we are below the limit for submitted urbs */ +@@ -777,7 +784,9 @@ static int iowarrior_probe(struct usb_in + } + + if ((dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56) || +- (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56AM)) { ++ (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56AM) || ++ (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW28) || ++ (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW28L)) { + res = usb_find_last_int_out_endpoint(iface_desc, + &dev->int_out_endpoint); + if (res) { +@@ -791,7 +800,9 @@ static int iowarrior_probe(struct usb_in + dev->report_size = usb_endpoint_maxp(dev->int_in_endpoint); + if ((dev->interface->cur_altsetting->desc.bInterfaceNumber == 0) && + ((dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56) || +- (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56AM))) ++ (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56AM) || ++ (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW28) || ++ (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW28L))) + /* IOWarrior56 has wMaxPacketSize different from report size */ + dev->report_size = 7; + -- 2.47.3