summarylogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.SRCINFO20
-rw-r--r--0.patch (renamed from kernel_do_gettimeofday_fix.patch)2
-rw-r--r--1.patch (renamed from kernel_ioremap_nocache_fix.patch)2
-rw-r--r--2.patch73
-rw-r--r--3.patch22
-rw-r--r--4.patch112
-rw-r--r--5.patch263
-rw-r--r--PKGBUILD27
8 files changed, 505 insertions, 16 deletions
diff --git a/.SRCINFO b/.SRCINFO
index a5ce7f3ccae8..4bdecd1daf84 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,7 +1,7 @@
pkgbase = ixxat-socketcan
pkgdesc = SocketCAN driver for IXXAT USB-to-CAN v2
pkgver = 1.1.148.0
- pkgrel = 6
+ pkgrel = 7
url = https://www.ixxat.com/products/products-industrial/pc-interfaces/pc-can-interfaces/socketcan
install = ixxat-socketcan.install
arch = i686
@@ -10,11 +10,19 @@ pkgbase = ixxat-socketcan
makedepends = linux-headers
optdepends = can-utils: Linux-CAN / SocketCAN user space applications
source = https://cdn.hms-networks.com/docs/librariesprovider8/ixxat-english-new/pc-can-interfaces/linux-drivers/socketcan-linux.zip?sfvrsn=3eb48d7_8
- source = kernel_do_gettimeofday_fix.patch
- source = kernel_ioremap_nocache_fix.patch
- md5sums = 4875b7dcfddfb76279ec61477765dd04
- md5sums = 918f3a220153599c2a4c3fad7de86cc1
- md5sums = 25ef511b0f11a7d84ce9ffc6020293c3
+ source = 0.patch
+ source = 1.patch
+ source = 2.patch
+ source = 3.patch
+ source = 4.patch
+ source = 5.patch
+ sha256sums = 801558b4ef182548dfaa10a1cc65696f5c84caf6c8df98be8fa812c392b491a2
+ sha256sums = 30993ecc5f97187f92ffaa1606a9cd588e1d0b7ab636bca8ba5ced3eb70b41d5
+ sha256sums = 3389d2301e159e2c99452cd4a68a0050d30c74831edf51afedee7e46b3d005b6
+ sha256sums = a8828fa152b80120ec529f4a862936747697a94ad6a2009aabb2951b0784a579
+ sha256sums = 8eb368650f1b0e4340da7bd25dbd5b03843841cfb39bb7ec677eb11634fdabf1
+ sha256sums = 61ed6b5afdbb057318bd415c2d9b9ea4719d1ced8b1d3f0dfb9a80930f4c741d
+ sha256sums = e1cb2108dde3ed8c6498a1b501b46a93f1189fb715be2f0ac71a6b5080fdf64b
pkgname = ixxat-socketcan
diff --git a/kernel_do_gettimeofday_fix.patch b/0.patch
index bbfa646bd802..085910723528 100644
--- a/kernel_do_gettimeofday_fix.patch
+++ b/0.patch
@@ -1,4 +1,4 @@
-commit 06cf40760506f7aeda1daee7fe8e5e330915daaa
+commit fb0b2a02be266793f04f2cc1d5144ec9d94d0861
Author: Bruno Santos <brunomanuelsantos@tecnico.ulisboa.pt>
Date: Tue Jun 18 18:37:17 2019 +0200
diff --git a/kernel_ioremap_nocache_fix.patch b/1.patch
index 78e7125416dd..c900b123bf14 100644
--- a/kernel_ioremap_nocache_fix.patch
+++ b/1.patch
@@ -1,4 +1,4 @@
-commit 581f3d57fd2debe52b7647145334bfdd79212e7c
+commit f0a726b7fe5a76d51f81bfeeb92da5b8807d47f5
Author: Bruno Santos <brunomanuelsantos@tecnico.ulisboa.pt>
Date: Sun Jun 21 18:36:51 2020 +0100
diff --git a/2.patch b/2.patch
new file mode 100644
index 000000000000..a898fa5d48a8
--- /dev/null
+++ b/2.patch
@@ -0,0 +1,73 @@
+commit a05c12b1440010cc5462bb6ee8e7809709610852
+Author: Bruno Santos <brunomanuelsantos@tecnico.ulisboa.pt>
+Date: Thu May 20 22:54:17 2021 +0100
+
+ Remove unimplemented MODULE_SUPPORTED_DEVICE
+
+ Echoing the upstream commit 6417f03132a6952cd17ddd8eaddbac92b61b17e0
+
+diff --git a/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_active.c b/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_active.c
+index 1e698c8..16ed10d 100644
+--- a/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_active.c
++++ b/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_active.c
+@@ -40,8 +40,6 @@
+ #include "ififd.h"
+ #include "ixx_pci_core.h"
+
+-MODULE_SUPPORTED_DEVICE("IXXAT Automation GmbH CAN-IB2x0, CAN-IB4x0, CAN-IB6x0 and CAN-IB8x0 interfaces");
+-
+ #define IXX_FIRMWARE "ixx-can-ib-1.9.3.fw"
+
+ #define IXX_IFI_FIFOCMD 0x00
+diff --git a/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_fd_passive.c b/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_fd_passive.c
+index 7a3514f..def2ea6 100644
+--- a/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_fd_passive.c
++++ b/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_fd_passive.c
+@@ -35,8 +35,6 @@
+
+ #ifdef CANFD_CAPABLE
+
+-MODULE_SUPPORTED_DEVICE("IXXAT Automation GmbH CAN-IB5X0 and CAN-IB7X0 interfaces");
+-
+ /* IFI-CANFD internal clock (Hz) */
+ #define IFIFD_CANFD_CLOCK_HZ 80000000
+
+diff --git a/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_passive.c b/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_passive.c
+index fb08c03..2ff247b 100644
+--- a/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_passive.c
++++ b/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_passive.c
+@@ -33,8 +33,6 @@
+ #include "ifi.h"
+ #include "ixx_pci_core.h"
+
+-MODULE_SUPPORTED_DEVICE("IXXAT Automation GmbH CAN-IB1X0 and CAN-IB3X0 interfaces");
+-
+ /* IFI-CAN internal clock (Hz) */
+ #define IFI_CAN_CLOCK_HZ 40000000
+
+diff --git a/SocketCAN - Linux (V1.1.148.0)/usb-to-can_socketcan/ixx_usb_fd.c b/SocketCAN - Linux (V1.1.148.0)/usb-to-can_socketcan/ixx_usb_fd.c
+index db5c79e..83db4e2 100644
+--- a/SocketCAN - Linux (V1.1.148.0)/usb-to-can_socketcan/ixx_usb_fd.c
++++ b/SocketCAN - Linux (V1.1.148.0)/usb-to-can_socketcan/ixx_usb_fd.c
+@@ -33,8 +33,6 @@
+
+ #ifdef CANFD_CAPABLE
+
+-MODULE_SUPPORTED_DEVICE("IXXAT Automation GmbH USB-to-CAN FD");
+-
+ /* use ifi can fd clock due to internal bittiming calculations */
+ #define IFIFD_CRYSTAL_HZ 80000000
+
+diff --git a/SocketCAN - Linux (V1.1.148.0)/usb-to-can_socketcan/ixx_usb_v2.c b/SocketCAN - Linux (V1.1.148.0)/usb-to-can_socketcan/ixx_usb_v2.c
+index 3fe639c..10bae2a 100644
+--- a/SocketCAN - Linux (V1.1.148.0)/usb-to-can_socketcan/ixx_usb_v2.c
++++ b/SocketCAN - Linux (V1.1.148.0)/usb-to-can_socketcan/ixx_usb_v2.c
+@@ -31,8 +31,6 @@
+
+ #include "ixx_usb_core.h"
+
+-MODULE_SUPPORTED_DEVICE("IXXAT Automation GmbH USB-to-CAN V2");
+-
+ /* use sja 1000 clock due to internal bittiming calculations */
+ #define SJA1000_CRYSTAL_HZ 8000000
+
diff --git a/3.patch b/3.patch
new file mode 100644
index 000000000000..d56ee6bf3116
--- /dev/null
+++ b/3.patch
@@ -0,0 +1,22 @@
+commit 087687e986e89e19f7ccdb787a9d118faec5f307
+Author: Bruno Santos <brunomanuelsantos@tecnico.ulisboa.pt>
+Date: Thu May 20 22:56:26 2021 +0100
+
+ Remove deprecated and unused kmap_types.h
+
+ Fortunately this header was not actually used, so we can simply delete
+ the include. This header was removed upstream with commit
+ d7029e4549691ecaf1ead536d3322a00bda85659.
+
+diff --git a/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_active.c b/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_active.c
+index 16ed10d..00805dd 100644
+--- a/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_active.c
++++ b/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_active.c
+@@ -32,7 +32,6 @@
+ #include <linux/firmware.h>
+ #include <linux/time.h>
+
+-#include <asm-generic/kmap_types.h>
+ #include <asm-generic/errno.h>
+
+ #include <stdarg.h>
diff --git a/4.patch b/4.patch
new file mode 100644
index 000000000000..d73a713edb30
--- /dev/null
+++ b/4.patch
@@ -0,0 +1,112 @@
+commit b681682ec91bb594ecd35cfe79f4e8dfef95be1c
+Author: Bruno Santos <brunomanuelsantos@tecnico.ulisboa.pt>
+Date: Thu May 20 22:58:35 2021 +0100
+
+ Check the return value of mutex_lock_interruptible
+
+ These locks may fail yet the error was not caught. This also has the
+ benefit of suppressing some compilation warnings.
+
+diff --git a/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_active.c b/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_active.c
+index 00805dd..ebb5f13 100644
+--- a/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_active.c
++++ b/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_active.c
+@@ -466,7 +466,9 @@ static int ixx_act_ib_xxx_get_intf_caps(struct pci_dev *pdev,
+ intf_caps_res.dal_res.ret_size = 0;
+ intf_caps_res.dal_res.ret_code = 0xffffffff;
+
+- mutex_lock_interruptible(&intf->cmd_lock);
++ if (mutex_lock_interruptible(&intf->cmd_lock))
++ return err;
++
+ err = ixx_act_ib_xxx_send_cmd(intf, tx_cmd_fifo, &intf_caps_req.dal_req,
+ &intf_caps_res.dal_res);
+ if (err)
+@@ -564,7 +566,9 @@ static int ixx_act_ib_xxx_init_ctrl(struct ixx_pci_priv* priv)
+ ctrl_init_res.dal_res.ret_size = 0;
+ ctrl_init_res.dal_res.ret_code = 0xffffffff;
+
+- mutex_lock_interruptible(&intf->cmd_lock);
++ if (mutex_lock_interruptible(&intf->cmd_lock))
++ return err;
++
+ err = ixx_act_ib_xxx_send_cmd(intf, tx_cmd_fifo, &ctrl_init_req.dal_req,
+ &ctrl_init_res.dal_res);
+
+@@ -626,7 +630,9 @@ static int ixx_act_ib_xxx_start_ctrl(struct ixx_pci_priv* priv, u32 * time_ref)
+ ctrl_start_res.dal_res.ret_code = 0xffffffff;
+ ctrl_start_res.start_time = 0;
+
+- mutex_lock_interruptible(&priv->intf->cmd_lock);
++ if (mutex_lock_interruptible(&priv->intf->cmd_lock))
++ return err;
++
+ err = ixx_act_ib_xxx_send_cmd(intf, tx_cmd_fifo,
+ &ctrl_start_req.dal_req, &ctrl_start_res.dal_res);
+
+@@ -677,7 +683,9 @@ static int ixx_act_ib_xxx_stop_ctrl(struct ixx_pci_priv* priv)
+ ctrl_stop_res.dal_res.ret_size = 0;
+ ctrl_stop_res.dal_res.ret_code = 0xffffffff;
+
+- mutex_lock_interruptible(&priv->intf->cmd_lock);
++ if (mutex_lock_interruptible(&priv->intf->cmd_lock))
++ return err;
++
+ err = ixx_act_ib_xxx_send_cmd(intf, tx_cmd_fifo, &ctrl_stop_req.dal_req,
+ &ctrl_stop_res.dal_res);
+ if (err)
+@@ -726,7 +734,9 @@ static int ixx_act_ib_xxx_get_dev_info(struct ixx_pci_interface * intf,
+ dev_info_res.dal_res.ret_size = 0;
+ dev_info_res.dal_res.ret_code = 0xffffffff;
+
+- mutex_lock_interruptible(&intf->cmd_lock);
++ if (mutex_lock_interruptible(&intf->cmd_lock))
++ return err;
++
+ err = ixx_act_ib_xxx_send_cmd(intf, tx_cmd_fifo, &dev_info_req.dal_req,
+ &dev_info_res.dal_res);
+ if (err)
+@@ -1937,7 +1947,9 @@ static int ixx_act_ib_xxx_trigger_int(struct pci_dev *pdev,
+ trigger_res.dal_res.ret_size = 0;
+ trigger_res.dal_res.ret_code = 0xFFFFFFFF;
+
+- mutex_lock_interruptible(&intf->cmd_lock);
++ if (mutex_lock_interruptible(&intf->cmd_lock))
++ return err;
++
+ err = ixx_act_ib_xxx_send_cmd(intf, tx_cmd_fifo, &trigger_req.dal_req,
+ &trigger_res.dal_res);
+ if (err)
+@@ -1993,7 +2005,9 @@ static int ixx_act_ib_xxx_test_cmd(struct pci_dev *pdev,
+ bmg_request->data[index] = (u8) index + 1;
+ }
+
+- mutex_lock_interruptible(&intf->cmd_lock);
++ if (mutex_lock_interruptible(&intf->cmd_lock))
++ return err;
++
+ /* Execute command */
+ err = ixx_act_ib_xxx_send_cmd(intf, tx_cmd_fifo, &bmg_request->dal_req,
+ &bmg_response->dal_res);
+@@ -2061,7 +2075,9 @@ static int ixx_act_ib_xxx_test_dma(struct pci_dev *pdev,
+ read_res->dal_res.ret_size = 0;
+ read_res->dal_res.ret_code = 0xFFFFFFFF;
+
+- mutex_lock_interruptible(&intf->cmd_lock);
++ if (mutex_lock_interruptible(&intf->cmd_lock))
++ return err;
++
+ err = ixx_act_ib_xxx_send_cmd(intf, tx_cmd_fifo, &read_req.dal_req,
+ &read_res->dal_res);
+ if (err)
+@@ -2187,7 +2203,9 @@ static int ixx_act_ib_xxx_start_fw(struct pci_dev *pdev,
+ start_res.dal_res.ret_size = 0;
+ start_res.dal_res.ret_code = 0xFFFFFFFF;
+
+- mutex_lock_interruptible(&intf->cmd_lock);
++ if (mutex_lock_interruptible(&intf->cmd_lock))
++ return err;
++
+ err = ixx_act_ib_xxx_send_cmd(intf, tx_cmd_fifo, &start_req.dal_req,
+ &start_res.dal_res);
+ if (err)
diff --git a/5.patch b/5.patch
new file mode 100644
index 000000000000..059285dbe7b6
--- /dev/null
+++ b/5.patch
@@ -0,0 +1,263 @@
+commit c7374eeac3f1f341c6c6663c362c2aa2a5224163
+Author: Bruno Santos <brunomanuelsantos@tecnico.ulisboa.pt>
+Date: Thu May 20 23:09:49 2021 +0100
+
+ Fix for new CAN subsystem API
+
+ A number of commits upstream has been changing the API of the CAN
+ subsystem to allow for greater performance and to consolidate name
+ prefixes.
+
+ The relevant changes are:
+
+ 1. adding an `frame_len` parameter to several functions to cache the
+ last frame length. In fact more of these changes have been merged
+ already, but not merged in Arch's default kernel and so left out for
+ now. (1dcb6e57db833419483d0df2d956b1cc2a802683)
+
+ 2. The addition of a specialized function for releasing the echo skb's.
+ This one is actually old already (commit dated 2009), but at least
+ one case was obvious enough that it could use it.
+ (39e3ab6fded4d7e66e01a878f0cae23ddd480c3b)
+
+ 3. Renames and deprecations of functions.
+ (3ab4ce0d6fa8c93d41df4a74ec8d2c9198be2109,
+ cd1124e76d740327be5d8f9ce3785ce1119daf4b)
+
+ Thanks to Bart Verhagen for the report and early patch.
+
+diff --git a/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_core.c b/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_core.c
+index 7f019fb..731ecd6 100644
+--- a/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_core.c
++++ b/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_core.c
+@@ -298,7 +298,7 @@ int ixxat_pci_handle_frn(struct ixx_pci_priv *dev, u8 frn, u32 timestamp)
+ if (skb)
+ ixxat_pci_get_ts_tv(dev, timestamp,
+ &skb->tstamp);
+- can_get_echo_skb(dev->netdev, frn - 1);
++ can_get_echo_skb(dev->netdev, frn - 1, NULL);
+ dev->frn_read++;
+ result = 1;
+ netdev_dbg(dev->netdev, "can_get_echo_skb %d", frn - 1);
+@@ -320,7 +320,7 @@ int ixxat_pci_handle_frn(struct ixx_pci_priv *dev, u8 frn, u32 timestamp)
+ if (skb)
+ ixxat_pci_get_ts_tv(dev, timestamp,
+ &skb->tstamp);
+- can_get_echo_skb(dev->netdev, frn - 1);
++ can_get_echo_skb(dev->netdev, frn - 1, NULL);
+ dev->frn_read = expectedfrn;
+ result = 1;
+ } else if (frn > expectedfrn && frn >= dev->frn_write) {
+@@ -342,7 +342,7 @@ int ixxat_pci_handle_frn(struct ixx_pci_priv *dev, u8 frn, u32 timestamp)
+ if (skb)
+ ixxat_pci_get_ts_tv(dev, timestamp,
+ &skb->tstamp);
+- can_get_echo_skb(dev->netdev, frn - 1);
++ can_get_echo_skb(dev->netdev, frn - 1, NULL);
+ dev->frn_read++;
+ result = 1;
+ // netdev_dbg(dev->netdev, "can_get_echo_skb %d", frn - 1);
+@@ -357,7 +357,7 @@ int ixxat_pci_handle_frn(struct ixx_pci_priv *dev, u8 frn, u32 timestamp)
+ if (skb)
+ ixxat_pci_get_ts_tv(dev, timestamp,
+ &skb->tstamp);
+- can_get_echo_skb(dev->netdev, frn - 1);
++ can_get_echo_skb(dev->netdev, frn - 1, NULL);
+ dev->frn_read = expectedfrn;
+ result = 1;
+ } else if (frn < expectedfrn && frn >= dev->frn_write) {
+@@ -382,7 +382,7 @@ int ixxat_pci_handle_frn(struct ixx_pci_priv *dev, u8 frn, u32 timestamp)
+ if (skb)
+ ixxat_pci_get_ts_tv(dev, timestamp,
+ &skb->tstamp);
+- can_get_echo_skb(dev->netdev, frn - 1);
++ can_get_echo_skb(dev->netdev, frn - 1, NULL);
+ dev->frn_read = expectedfrn;
+ result = 1;
+ }
+diff --git a/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_active.c b/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_active.c
+index ebb5f13..94c5b10 100644
+--- a/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_active.c
++++ b/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_active.c
+@@ -882,7 +882,7 @@ static int ixx_act_ib_xxx_handle_srr_canfdmsg(struct ixx_pci_priv *priv,
+ ifi_reg_dlc = le32_to_cpu(ifi_base[IXX_IFI_DLC]);
+
+ priv->netdev->stats.tx_packets += 1;
+- priv->netdev->stats.tx_bytes += can_dlc2len(
++ priv->netdev->stats.tx_bytes += can_fd_dlc2len(
+ ifi_reg_dlc & IFIFD_RXFIFO_DLC);
+ frn = (ifi_reg_dlc & IFIFD_RXFIFO_FRN) >> IFIFD_RXFIFO_FRN_S;
+
+@@ -959,7 +959,7 @@ static int ixx_act_ib_xxx_handle_canfdmsg(struct ixx_pci_priv *priv,
+ raw_dlc = le32_to_cpu(ifi_base[IXX_IFI_DLC]);
+ raw_id = le32_to_cpu(ifi_base[IXX_IFI_ID]);
+
+- can_frame->len = can_dlc2len(
++ can_frame->len = can_fd_dlc2len(
+ (raw_dlc & IFIFD_RXFIFO_DLC) >> IFIFD_RXFIFO_DLC_S);
+
+ if (raw_id & IFIFD_RXFIFO_IDE) {
+@@ -1406,6 +1406,7 @@ static int ixx_act_ib_xxx_start_xmit(struct sk_buff *skb,
+ int i, j;
+ u32 write_index, read_index, obj_size;
+ unsigned long spin_flags;
++ size_t frame_len;
+
+ if (can_dropped_invalid_skb(netdev, skb)) {
+ netdev_dbg(netdev, "dropped invalid skb\n");
+@@ -1478,7 +1479,8 @@ static int ixx_act_ib_xxx_start_xmit(struct sk_buff *skb,
+ can_free_echo_skb(priv->netdev, priv->frn_write - 1);
+ }
+
+- can_put_echo_skb(skb, priv->netdev, priv->frn_write - 1);
++ frame_len = can_skb_get_frame_len(skb);
++ can_put_echo_skb(skb, priv->netdev, priv->frn_write - 1, frame_len);
+ can_dlc |= (priv->frn_write << IFI_R0_FRN_S) & IFI_R0_RD_FRN;
+
+ priv->frn_write++;
+@@ -1529,6 +1531,7 @@ static int ixx_act_ib_xxx_start_xmit_fd(struct sk_buff *skb,
+ int i, j;
+ u32 write_index, read_index, obj_size;
+ unsigned long spin_flags;
++ size_t frame_len;
+
+ if (can_dropped_invalid_skb(netdev, skb)) {
+ netdev_info(netdev, "dropped invalid skb\n");
+@@ -1576,7 +1579,7 @@ static int ixx_act_ib_xxx_start_xmit_fd(struct sk_buff *skb,
+ if (cf->can_id & CAN_RTR_FLAG)
+ can_dlc |= IFIFD_TXFIFO_RTR;
+ else {
+- can_dlc |= can_len2dlc(cf->len) & IFIFD_TXFIFO_DLC;
++ can_dlc |= can_fd_len2dlc(cf->len) & IFIFD_TXFIFO_DLC;
+ if (cf->len > 8) {
+ can_dlc |= IFIFD_TXFIFO_EDL;
+ }
+@@ -1610,7 +1613,8 @@ static int ixx_act_ib_xxx_start_xmit_fd(struct sk_buff *skb,
+ can_free_echo_skb(priv->netdev, priv->frn_write - 1);
+ }
+
+- can_put_echo_skb(skb, priv->netdev, priv->frn_write - 1);
++ frame_len = can_skb_get_frame_len(skb);
++ can_put_echo_skb(skb, priv->netdev, priv->frn_write - 1, frame_len);
+ can_dlc |= (priv->frn_write << IFIFD_TXFIFO_FRN_S)
+ & IFIFD_TXFIFO_FRN;
+
+diff --git a/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_fd_passive.c b/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_fd_passive.c
+index def2ea6..5b7b5b6 100644
+--- a/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_fd_passive.c
++++ b/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_fd_passive.c
+@@ -207,7 +207,7 @@ static int ixx_pas_ib_fd_xxx_handle_srr_canmsg(struct ixx_pci_priv *priv)
+ ioread32(priv->ifi_base + IFIFDREG_RX_FIFO_DLC));
+
+ priv->netdev->stats.tx_packets += 1;
+- priv->netdev->stats.tx_bytes += can_dlc2len(
++ priv->netdev->stats.tx_bytes += can_fd_dlc2len(
+ ifi_reg_dlc & IFIFD_RXFIFO_DLC);
+ frn = (ifi_reg_dlc & IFIFD_RXFIFO_FRN) >> IFIFD_RXFIFO_FRN_S;
+
+@@ -235,9 +235,8 @@ static int ixx_pas_ib_fd_xxx_handle_canmsg(struct ixx_pci_priv *priv)
+ raw_id = le32_to_cpu(ioread32(priv->ifi_base + IFIFDREG_RX_FIFO_ID));
+ raw_dlc = le32_to_cpu(ioread32(priv->ifi_base + IFIFDREG_RX_FIFO_DLC));
+
+- can_frame->len = can_dlc2len(
+- le32_to_cpu(
+- (raw_dlc & IFIFD_RXFIFO_DLC)
++ can_frame->len = can_fd_dlc2len(
++ le32_to_cpu((raw_dlc & IFIFD_RXFIFO_DLC)
+ >> IFIFD_RXFIFO_DLC_S));
+
+ if (raw_id & IFIFD_RXFIFO_IDE) {
+@@ -498,7 +497,7 @@ static int ixx_pas_ib_fd_xxx_start_xmit(struct sk_buff *skb,
+ if (cf->can_id & CAN_RTR_FLAG)
+ can_dlc |= IFIFD_TXFIFO_RTR;
+
+- can_dlc |= can_len2dlc(cf->len) & IFIFD_TXFIFO_DLC;
++ can_dlc |= can_fd_len2dlc(cf->len) & IFIFD_TXFIFO_DLC;
+
+ if (skb->len == CANFD_MTU) {
+ can_dlc |= IFIFD_TXFIFO_EDL;
+@@ -515,7 +514,8 @@ static int ixx_pas_ib_fd_xxx_start_xmit(struct sk_buff *skb,
+ can_free_echo_skb(priv->netdev, priv->frn_write - 1);
+ }
+
+- can_put_echo_skb(skb, priv->netdev, priv->frn_write - 1);
++ size_t frame_len = can_skb_get_frame_len(skb);
++ can_put_echo_skb(skb, priv->netdev, priv->frn_write - 1, frame_len);
+ can_dlc |= ((priv->frn_write << IFIFD_TXFIFO_FRN_S)
+ & IFIFD_TXFIFO_FRN);
+
+diff --git a/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_passive.c b/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_passive.c
+index 2ff247b..28887f4 100644
+--- a/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_passive.c
++++ b/SocketCAN - Linux (V1.1.148.0)/can-ibxxx_socketcan/ixx_pci_ib_passive.c
+@@ -602,7 +602,8 @@ static int ixx_pas_ib_xxx_start_xmit(struct sk_buff *skb,
+ can_free_echo_skb(priv->netdev, priv->frn_write - 1);
+ }
+
+- can_put_echo_skb(skb, priv->netdev, priv->frn_write - 1);
++ size_t frame_len = can_skb_get_frame_len(skb);
++ can_put_echo_skb(skb, priv->netdev, priv->frn_write - 1, frame_len);
+ can_dlc |= (priv->frn_write << IFI_R0_FRN_S) & IFI_R0_WR_FRN;
+
+ priv->frn_write++;
+diff --git a/SocketCAN - Linux (V1.1.148.0)/usb-to-can_socketcan/ixx_usb_core.c b/SocketCAN - Linux (V1.1.148.0)/usb-to-can_socketcan/ixx_usb_core.c
+index 696e5d4..3453cf3 100644
+--- a/SocketCAN - Linux (V1.1.148.0)/usb-to-can_socketcan/ixx_usb_core.c
++++ b/SocketCAN - Linux (V1.1.148.0)/usb-to-can_socketcan/ixx_usb_core.c
+@@ -239,7 +239,7 @@ static void ixxat_usb_write_bulk_callback(struct urb *urb)
+ }
+
+ /* should always release echo skb and corresponding context */
+- can_get_echo_skb(netdev, context->echo_index);
++ can_free_echo_skb(netdev, context->echo_index);
+ context->echo_index = IXXAT_USB_MAX_TX_URBS;
+
+ /* do wakeup tx queue in case of success only */
+@@ -261,6 +261,7 @@ static netdev_tx_t ixxat_usb_ndo_start_xmit(struct sk_buff *skb,
+ u8 *obuf;
+ int i, err;
+ size_t size = dev->adapter->tx_buffer_size;
++ size_t frame_len;
+
+ if (can_dropped_invalid_skb(netdev, skb))
+ return NETDEV_TX_OK;
+@@ -298,7 +299,8 @@ static netdev_tx_t ixxat_usb_ndo_start_xmit(struct sk_buff *skb,
+
+ usb_anchor_urb(urb, &dev->tx_submitted);
+
+- can_put_echo_skb(skb, netdev, context->echo_index);
++ frame_len = can_skb_get_frame_len(skb);
++ can_put_echo_skb(skb, netdev, context->echo_index, frame_len);
+
+ atomic_inc(&dev->active_tx_urbs);
+
+diff --git a/SocketCAN - Linux (V1.1.148.0)/usb-to-can_socketcan/ixx_usb_fd.c b/SocketCAN - Linux (V1.1.148.0)/usb-to-can_socketcan/ixx_usb_fd.c
+index 83db4e2..b0d09f6 100644
+--- a/SocketCAN - Linux (V1.1.148.0)/usb-to-can_socketcan/ixx_usb_fd.c
++++ b/SocketCAN - Linux (V1.1.148.0)/usb-to-can_socketcan/ixx_usb_fd.c
+@@ -620,13 +620,9 @@ static int ixx_usbfd_handle_canmsg(struct ixx_usb_device *dev,
+ can_frame->flags |= CANFD_ESI;
+
+ can_frame->len =
+- can_dlc2len(
+- get_canfd_dlc((flags & IXXAT_USBFD_MSG_FLAGS_DLC)
+- >> 16));
+- } else {
+- can_frame->len =
+- get_canfd_dlc((flags & IXXAT_USBFD_MSG_FLAGS_DLC)
+- >> 16);
++ can_fd_dlc2len((flags & IXXAT_USBFD_MSG_FLAGS_DLC) >> 16);
++ } else {
++ can_frame->len = (flags & IXXAT_USBFD_MSG_FLAGS_DLC) >> 16;
+ }
+
+ if (flags & IXXAT_USBFD_MSG_FLAGS_OVR) {
+@@ -894,7 +890,7 @@ static int ixx_usbfd_encode_msg(struct ixx_usb_device *dev, struct sk_buff *skb,
+ can_msg.flags |= IXXAT_USBFD_MSG_FLAGS_FDR;
+ }
+
+- can_msg.flags |= (can_len2dlc(cf->len) << 16) &
++ can_msg.flags |= (can_fd_len2dlc(cf->len) << 16) &
+ IXXAT_USBFD_MSG_FLAGS_DLC;
+
+ can_msg.flags = cpu_to_le32(can_msg.flags);
diff --git a/PKGBUILD b/PKGBUILD
index e7c758a14a17..85b0dcb253db 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -1,8 +1,9 @@
# Maintainer: Bruno Santos <brunomanuelsantos@tecnico.ulisboa.pt>
+# Patches taken from https://gitlab.com/bms-contrib/ixxat-socketcan
pkgname=ixxat-socketcan
pkgver=1.1.148.0
-pkgrel=6
+pkgrel=7
pkgdesc="SocketCAN driver for IXXAT USB-to-CAN v2"
arch=('i686' 'x86_64')
url="https://www.ixxat.com/products/products-industrial/pc-interfaces/pc-can-interfaces/socketcan"
@@ -11,17 +12,27 @@ makedepends=(linux-headers)
optdepends=('can-utils: Linux-CAN / SocketCAN user space applications')
install=$pkgname.install
source=('https://cdn.hms-networks.com/docs/librariesprovider8/ixxat-english-new/pc-can-interfaces/linux-drivers/socketcan-linux.zip?sfvrsn=3eb48d7_8'
- kernel_do_gettimeofday_fix.patch
- kernel_ioremap_nocache_fix.patch)
-md5sums=('4875b7dcfddfb76279ec61477765dd04'
- '918f3a220153599c2a4c3fad7de86cc1'
- '25ef511b0f11a7d84ce9ffc6020293c3')
+ 0.patch
+ 1.patch
+ 2.patch
+ 3.patch
+ 4.patch
+ 5.patch)
+sha256sums=('801558b4ef182548dfaa10a1cc65696f5c84caf6c8df98be8fa812c392b491a2'
+ '30993ecc5f97187f92ffaa1606a9cd588e1d0b7ab636bca8ba5ced3eb70b41d5'
+ '3389d2301e159e2c99452cd4a68a0050d30c74831edf51afedee7e46b3d005b6'
+ 'a8828fa152b80120ec529f4a862936747697a94ad6a2009aabb2951b0784a579'
+ '8eb368650f1b0e4340da7bd25dbd5b03843841cfb39bb7ec677eb11634fdabf1'
+ '61ed6b5afdbb057318bd415c2d9b9ea4719d1ced8b1d3f0dfb9a80930f4c741d'
+ 'e1cb2108dde3ed8c6498a1b501b46a93f1189fb715be2f0ac71a6b5080fdf64b')
_extramodules=$(uname -r)/extramodules
prepare() {
- patch -p1 -i kernel_do_gettimeofday_fix.patch
- patch -p1 -i kernel_ioremap_nocache_fix.patch
+ for patch in *.patch
+ do
+ patch -p1 -i $patch
+ done
}
build() {