sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftargetE/translations/zh_CN/networking/device_drivers/can/ctu/ctucanfd-drivermodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftargetE/translations/zh_TW/networking/device_drivers/can/ctu/ctucanfd-drivermodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftargetE/translations/it_IT/networking/device_drivers/can/ctu/ctucanfd-drivermodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftargetE/translations/ja_JP/networking/device_drivers/can/ctu/ctucanfd-drivermodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftargetE/translations/ko_KR/networking/device_drivers/can/ctu/ctucanfd-drivermodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftargetE/translations/sp_SP/networking/device_drivers/can/ctu/ctucanfd-drivermodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h)SPDX-License-Identifier: GPL-2.0-or-laterh]h)SPDX-License-Identifier: GPL-2.0-or-later}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhh_/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver.rsthKubhsection)}(hhh](htitle)}(hCTU CAN FD Driverh]hCTU CAN FD Driver}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh paragraph)}(h3Author: Martin Jerabek h](hAuthor: Martin Jerabek <}(hhhhhNhNubh reference)}(hmartin.jerabek01@gmail.comh]hmartin.jerabek01@gmail.com}(hhhhhNhNubah}(h]h ]h"]h$]h&]refuri!mailto:martin.jerabek01@gmail.comuh1hhhubh>}(hhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(hAbout CTU CAN FD IP Coreh]hAbout CTU CAN FD IP Core}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhK ubh)}(hX)`CTU CAN FD `_ is an open source soft core written in VHDL. It originated in 2015 as Ondrej Ille's project at the `Department of Measurement `_ of `FEE `_ at `CTU `_.h](h)}(hB`CTU CAN FD `_h]h CTU CAN FD}(hjhhhNhNubah}(h]h ]h"]h$]h&]name CTU CAN FDrefuri2https://gitlab.fel.cvut.cz/canbus/ctucanfd_ip_coreuh1hhjubhtarget)}(h5 h]h}(h] ctu-can-fdah ]h"] ctu can fdah$]h&]refurijuh1j referencedKhjubhf is an open source soft core written in VHDL. It originated in 2015 as Ondrej Ille’s project at the }(hjhhhNhNubh)}(h8`Department of Measurement `_h]hDepartment of Measurement}(hj*hhhNhNubah}(h]h ]h"]h$]h&]nameDepartment of Measurementjhttps://meas.fel.cvut.cz/uh1hhjubj)}(h h]h}(h]department-of-measurementah ]h"]department of measurementah$]h&]refurij:uh1jj%Khjubh of }(hjhhhNhNubh)}(h#`FEE `_h]hFEE}(hjLhhhNhNubah}(h]h ]h"]h$]h&]nameFEEjhttp://www.fel.cvut.cz/en/uh1hhjubj)}(h h]h}(h]feeah ]h"]feeah$]h&]refurij\uh1jj%Khjubh at }(hjhhhNhNubh)}(h`CTU `_h]hCTU}(hjnhhhNhNubah}(h]h ]h"]h$]h&]nameCTUjhttps://www.cvut.cz/enuh1hhjubj)}(h h]h}(h]ctuah ]h"]ctuah$]h&]refurij~uh1jj%Khjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(hXThe SocketCAN driver for Xilinx Zynq SoC based MicroZed board `Vivado integration `_ and Intel Cyclone V 5CSEMA4U23C6 based DE0-Nano-SoC Terasic board `QSys integration `_ has been developed as well as support for `PCIe integration `_ of the core.h](h>The SocketCAN driver for Xilinx Zynq SoC based MicroZed board }(hjhhhNhNubh)}(hS`Vivado integration `_h]hVivado integration}(hjhhhNhNubah}(h]h ]h"]h$]h&]nameVivado integrationj;https://gitlab.fel.cvut.cz/canbus/zynq/zynq-can-sja1000-topuh1hhjubj)}(h> h]h}(h]vivado-integrationah ]h"]vivado integrationah$]h&]refurijuh1jj%KhjubhC and Intel Cyclone V 5CSEMA4U23C6 based DE0-Nano-SoC Terasic board }(hjhhhNhNubh)}(hJ`QSys integration `_h]hQSys integration}(hjhhhNhNubah}(h]h ]h"]h$]h&]nameQSys integrationj4https://gitlab.fel.cvut.cz/canbus/intel-soc-ctucanfduh1hhjubj)}(h7 h]h}(h]qsys-integrationah ]h"]qsys integrationah$]h&]refurijuh1jj%Khjubh+ has been developed as well as support for }(hjhhhNhNubh)}(hE`PCIe integration `_h]hPCIe integration}(hjhhhNhNubah}(h]h ]h"]h$]h&]namePCIe integrationj/https://gitlab.fel.cvut.cz/canbus/pcie-ctucanfduh1hhjubj)}(h2 h]h}(h]pcie-integrationah ]h"]pcie integrationah$]h&]refurijuh1jj%Khjubh of the core.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hXIn the case of Zynq, the core is connected via the APB system bus, which does not have enumeration support, and the device must be specified in Device Tree. This kind of devices is called platform device in the kernel and is handled by a platform device driver.h]hXIn the case of Zynq, the core is connected via the APB system bus, which does not have enumeration support, and the device must be specified in Device Tree. This kind of devices is called platform device in the kernel and is handled by a platform device driver.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hXThe basic functional model of the CTU CAN FD peripheral has been accepted into QEMU mainline. See QEMU `CAN emulation support `_ for CAN FD buses, host connection and CTU CAN FD core emulation. The development version of emulation support can be cloned from ctu-canfd branch of QEMU local development `repository `_.h](hgThe basic functional model of the CTU CAN FD peripheral has been accepted into QEMU mainline. See QEMU }(hjhhhNhNubh)}(hS`CAN emulation support `_h]hCAN emulation support}(hj hhhNhNubah}(h]h ]h"]h$]h&]nameCAN emulation supportj8https://www.qemu.org/docs/master/system/devices/can.htmluh1hhjubj)}(h; h]h}(h]can-emulation-supportah ]h"]can emulation supportah$]h&]refurij0uh1jj%Khjubh for CAN FD buses, host connection and CTU CAN FD core emulation. The development version of emulation support can be cloned from ctu-canfd branch of QEMU local development }(hjhhhNhNubh)}(h=`repository `_h]h repository}(hjBhhhNhNubah}(h]h ]h"]h$]h&]name repositoryj-https://gitlab.fel.cvut.cz/canbus/qemu-canbusuh1hhjubj)}(h0 h]h}(h] repositoryah ]h"] repositoryah$]h&]refurijRuh1jj%Khjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubeh}(h]about-ctu-can-fd-ip-coreah ]h"]about ctu can fd ip coreah$]h&]uh1hhhhhhhhK ubh)}(hhh](h)}(hAbout SocketCANh]hAbout SocketCAN}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjrhhhhhK&ubh)}(hXSocketCAN is a standard common interface for CAN devices in the Linux kernel. As the name suggests, the bus is accessed via sockets, similarly to common network devices. The reasoning behind this is in depth described in `Linux SocketCAN `_. In short, it offers a natural way to implement and work with higher layer protocols over CAN, in the same way as, e.g., UDP/IP over Ethernet.h](hSocketCAN is a standard common interface for CAN devices in the Linux kernel. As the name suggests, the bus is accessed via sockets, similarly to common network devices. The reasoning behind this is in depth described in }(hjhhhNhNubh)}(hO`Linux SocketCAN `_h]hLinux SocketCAN}(hjhhhNhNubah}(h]h ]h"]h$]h&]nameLinux SocketCANj:https://www.kernel.org/doc/html/latest/networking/can.htmluh1hhjubj)}(h= h]h}(h]linux-socketcanah ]h"]linux socketcanah$]h&]refurijuh1jj%Khjubh. In short, it offers a natural way to implement and work with higher layer protocols over CAN, in the same way as, e.g., UDP/IP over Ethernet.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK(hjrhhubh)}(hhh](h)}(h Device probeh]h Device probe}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK1ubh)}(hXRBefore going into detail about the structure of a CAN bus device driver, let's reiterate how the kernel gets to know about the device at all. Some buses, like PCI or PCIe, support device enumeration. That is, when the system boots, it discovers all the devices on the bus and reads their configuration. The kernel identifies the device via its vendor ID and device ID, and if there is a driver registered for this identifier combination, its probe method is invoked to populate the driver's instance for the given hardware. A similar situation goes with USB, only it allows for device hot-plug.h]hXVBefore going into detail about the structure of a CAN bus device driver, let’s reiterate how the kernel gets to know about the device at all. Some buses, like PCI or PCIe, support device enumeration. That is, when the system boots, it discovers all the devices on the bus and reads their configuration. The kernel identifies the device via its vendor ID and device ID, and if there is a driver registered for this identifier combination, its probe method is invoked to populate the driver’s instance for the given hardware. A similar situation goes with USB, only it allows for device hot-plug.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK3hjhhubh)}(hX7The situation is different for peripherals which are directly embedded in the SoC and connected to an internal system bus (AXI, APB, Avalon, and others). These buses do not support enumeration, and thus the kernel has to learn about the devices from elsewhere. This is exactly what the Device Tree was made for.h]hX7The situation is different for peripherals which are directly embedded in the SoC and connected to an internal system bus (AXI, APB, Avalon, and others). These buses do not support enumeration, and thus the kernel has to learn about the devices from elsewhere. This is exactly what the Device Tree was made for.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK=hjhhubeh}(h] device-probeah ]h"] device probeah$]h&]uh1hhjrhhhhhK1ubh)}(hhh](h)}(h Device treeh]h Device tree}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKDubh)}(hAn entry in device tree states that a device exists in the system, how it is reachable (on which bus it resides) and its configuration – registers address, interrupts and so on. An example of such a device tree is given in .h]hAn entry in device tree states that a device exists in the system, how it is reachable (on which bus it resides) and its configuration – registers address, interrupts and so on. An example of such a device tree is given in .}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKFhjhhubh literal_block)}(hX}/ { /* ... */ amba: amba { #address-cells = <1>; #size-cells = <1>; compatible = "simple-bus"; CTU_CAN_FD_0: CTU_CAN_FD@43c30000 { compatible = "ctu,ctucanfd"; interrupt-parent = <&intc>; interrupts = <0 30 4>; clocks = <&clkc 15>; reg = <0x43c30000 0x10000>; }; }; };h]hX}/ { /* ... */ amba: amba { #address-cells = <1>; #size-cells = <1>; compatible = "simple-bus"; CTU_CAN_FD_0: CTU_CAN_FD@43c30000 { compatible = "ctu,ctucanfd"; interrupt-parent = <&intc>; interrupts = <0 30 4>; clocks = <&clkc 15>; reg = <0x43c30000 0x10000>; }; }; };}hj sbah}(h]h ]h"]h$]h&]hhuh1jhhhKMhjhhubj)}(h.. _sec:socketcan:drv:h]h}(h]h ]h"]h$]h&]refidsec-socketcan-drvuh1jhK_hjhhhhubeh}(h] device-treeah ]h"] device treeah$]h&]uh1hhjrhhhhhKDubh)}(hhh](h)}(hDriver structureh]hDriver structure}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hhhhhKbubh)}(hThe driver can be divided into two parts – platform-dependent device discovery and set up, and platform-independent CAN network device implementation.h]hThe driver can be divided into two parts – platform-dependent device discovery and set up, and platform-independent CAN network device implementation.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKdhj+hhubj)}(h.. _sec:socketcan:platdev:h]h}(h]h ]h"]h$]h&]j!sec-socketcan-platdevuh1jhKhhj+hhhhubh)}(hhh](h)}(hPlatform device driverh]hPlatform device driver}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUhhhhhKkubh)}(hXIn the case of Zynq, the core is connected via the AXI system bus, which does not have enumeration support, and the device must be specified in Device Tree. This kind of devices is called *platform device* in the kernel and is handled by a *platform device driver*\ [1]_.h](hIn the case of Zynq, the core is connected via the AXI system bus, which does not have enumeration support, and the device must be specified in Device Tree. This kind of devices is called }(hjfhhhNhNubhemphasis)}(h*platform device*h]hplatform device}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjfubh# in the kernel and is handled by a }(hjfhhhNhNubjo)}(h*platform device driver*h]hplatform device driver}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjfubh }(hjfhhhNhNubhfootnote_reference)}(h[1]_h]h1}(hjhhhNhNubah}(h]id1ah ]h"]h$]h&]j!id11docname1networking/device_drivers/can/ctu/ctucanfd-driveruh1jhjfresolvedKubh.}(hjfhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKmhjUhhubh)}(h7A platform device driver provides the following things:h]h7A platform device driver provides the following things:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKrhjUhhubh bullet_list)}(hhh](h list_item)}(hA *probe* function h]h)}(hA *probe* functionh](hA }(hjhhhNhNubjo)}(h*probe*h]hprobe}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjubh function}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKthjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hA *remove* function h]h)}(hA *remove* functionh](hA }(hjhhhNhNubjo)}(h*remove*h]hremove}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjubh function}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKvhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(h;A table of *compatible* devices that the driver can handle h]h)}(h:A table of *compatible* devices that the driver can handleh](h A table of }(hj hhhNhNubjo)}(h *compatible*h]h compatible}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jnhj ubh# devices that the driver can handle}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKxhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubeh}(h]h ]h"]h$]h&]bullet-uh1jhhhKthjUhhubh)}(hXThe *probe* function is called exactly once when the device appears (or the driver is loaded, whichever happens later). If there are more devices handled by the same driver, the *probe* function is called for each one of them. Its role is to allocate and initialize resources required for handling the device, as well as set up low-level functions for the platform-independent layer, e.g., *read_reg* and *write_reg*. After that, the driver registers the device to a higher layer, in our case as a *network device*.h](hThe }(hjNhhhNhNubjo)}(h*probe*h]hprobe}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjNubh function is called exactly once when the device appears (or the driver is loaded, whichever happens later). If there are more devices handled by the same driver, the }(hjNhhhNhNubjo)}(h*probe*h]hprobe}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjNubh function is called for each one of them. Its role is to allocate and initialize resources required for handling the device, as well as set up low-level functions for the platform-independent layer, e.g., }(hjNhhhNhNubjo)}(h *read_reg*h]hread_reg}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjNubh and }(hjNhhhNhNubjo)}(h *write_reg*h]h write_reg}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjNubhR. After that, the driver registers the device to a higher layer, in our case as a }(hjNhhhNhNubjo)}(h*network device*h]hnetwork device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjNubh.}(hjNhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKzhjUhhubh)}(hThe *remove* function is called when the device disappears, or the driver is about to be unloaded. It serves to free the resources allocated in *probe* and to unregister the device from higher layers.h](hThe }(hjhhhNhNubjo)}(h*remove*h]hremove}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjubh function is called when the device disappears, or the driver is about to be unloaded. It serves to free the resources allocated in }(hjhhhNhNubjo)}(h*probe*h]hprobe}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjubh1 and to unregister the device from higher layers.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjUhhubh)}(hFinally, the table of *compatible* devices states which devices the driver can handle. The Device Tree entry ``compatible`` is matched against the tables of all *platform drivers*.h](hFinally, the table of }(hjhhhNhNubjo)}(h *compatible*h]h compatible}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjubhK devices states which devices the driver can handle. The Device Tree entry }(hjhhhNhNubhliteral)}(h``compatible``h]h compatible}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh& is matched against the tables of all }(hjhhhNhNubjo)}(h*platform drivers*h]hplatform drivers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjUhhubj)}(hX\/* Match table for OF platform binding */ static const struct of_device_id ctucan_of_match[] = { { .compatible = "ctu,canfd-2", }, { .compatible = "ctu,ctucanfd", }, { /* end of list */ }, }; MODULE_DEVICE_TABLE(of, ctucan_of_match); static int ctucan_probe(struct platform_device *pdev); static int ctucan_remove(struct platform_device *pdev); static struct platform_driver ctucanfd_driver = { .probe = ctucan_probe, .remove = ctucan_remove, .driver = { .name = DRIVER_NAME, .of_match_table = ctucan_of_match, }, }; module_platform_driver(ctucanfd_driver);h]hX\/* Match table for OF platform binding */ static const struct of_device_id ctucan_of_match[] = { { .compatible = "ctu,canfd-2", }, { .compatible = "ctu,ctucanfd", }, { /* end of list */ }, }; MODULE_DEVICE_TABLE(of, ctucan_of_match); static int ctucan_probe(struct platform_device *pdev); static int ctucan_remove(struct platform_device *pdev); static struct platform_driver ctucanfd_driver = { .probe = ctucan_probe, .remove = ctucan_remove, .driver = { .name = DRIVER_NAME, .of_match_table = ctucan_of_match, }, }; module_platform_driver(ctucanfd_driver);}hj.sbah}(h]h ]h"]h$]h&]forcehighlight_args}hhlanguagecuh1jhhhKhjUhhubj)}(h.. _sec:socketcan:netdev:h]h}(h]h ]h"]h$]h&]j!sec-socketcan-netdevuh1jhKhjUhhhhubeh}(h](platform-device-driverjTeh ]h"](platform device driversec:socketcan:platdeveh$]h&]uh1hhj+hhhhhKkexpect_referenced_by_name}jRjJsexpect_referenced_by_id}jTjJsubh)}(hhh](h)}(hNetwork device driverh]hNetwork device driver}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYhhhhhKubh)}(h;Each network device must support at least these operations:h]h;Each network device must support at least these operations:}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjYhhubj)}(hhh](j)}(h"Bring the device up: ``ndo_open`` h]h)}(h!Bring the device up: ``ndo_open``h](hBring the device up: }(hjhhhNhNubj)}(h ``ndo_open``h]hndo_open}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhj{ubah}(h]h ]h"]h$]h&]uh1jhjxhhhhhNubj)}(h%Bring the device down: ``ndo_close`` h]h)}(h$Bring the device down: ``ndo_close``h](hBring the device down: }(hjhhhNhNubj)}(h ``ndo_close``h]h ndo_close}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjxhhhhhNubj)}(h3Submit TX frames to the device: ``ndo_start_xmit`` h]h)}(h2Submit TX frames to the device: ``ndo_start_xmit``h](h Submit TX frames to the device: }(hjhhhNhNubj)}(h``ndo_start_xmit``h]hndo_start_xmit}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjxhhhhhNubj)}(h>Signal TX completion and errors to the network subsystem: ISR h]h)}(h=Signal TX completion and errors to the network subsystem: ISRh]h=Signal TX completion and errors to the network subsystem: ISR}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjxhhhhhNubj)}(h8Submit RX frames to the network subsystem: ISR and NAPI h]h)}(h7Submit RX frames to the network subsystem: ISR and NAPIh]h7Submit RX frames to the network subsystem: ISR and NAPI}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjxhhhhhNubeh}(h]h ]h"]h$]h&]jLjMuh1jhhhKhjYhhubh)}(hXThere are two possible event sources: the device and the network subsystem. Device events are usually signaled via an interrupt, handled in an Interrupt Service Routine (ISR). Handlers for the events originating in the network subsystem are then specified in ``struct net_device_ops``.h](hXThere are two possible event sources: the device and the network subsystem. Device events are usually signaled via an interrupt, handled in an Interrupt Service Routine (ISR). Handlers for the events originating in the network subsystem are then specified in }(hj#hhhNhNubj)}(h``struct net_device_ops``h]hstruct net_device_ops}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh.}(hj#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjYhhubh)}(hXCWhen the device is brought up, e.g., by calling ``ip link set can0 up``, the driver’s function ``ndo_open`` is called. It should validate the interface configuration and configure and enable the device. The analogous opposite is ``ndo_close``, called when the device is being brought down, be it explicitly or implicitly.h](h0When the device is brought up, e.g., by calling }(hjChhhNhNubj)}(h``ip link set can0 up``h]hip link set can0 up}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubh, the driver’s function }(hjChhhNhNubj)}(h ``ndo_open``h]hndo_open}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubhz is called. It should validate the interface configuration and configure and enable the device. The analogous opposite is }(hjChhhNhNubj)}(h ``ndo_close``h]h ndo_close}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubhO, called when the device is being brought down, be it explicitly or implicitly.}(hjChhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjYhhubh)}(hXWhen the system should transmit a frame, it does so by calling ``ndo_start_xmit``, which enqueues the frame into the device. If the device HW queue (FIFO, mailboxes or whatever the implementation is) becomes full, the ``ndo_start_xmit`` implementation informs the network subsystem that it should stop the TX queue (via ``netif_stop_queue``). It is then re-enabled later in ISR when the device has some space available again and is able to enqueue another frame.h](h?When the system should transmit a frame, it does so by calling }(hjhhhNhNubj)}(h``ndo_start_xmit``h]hndo_start_xmit}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, which enqueues the frame into the device. If the device HW queue (FIFO, mailboxes or whatever the implementation is) becomes full, the }(hjhhhNhNubj)}(h``ndo_start_xmit``h]hndo_start_xmit}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhT implementation informs the network subsystem that it should stop the TX queue (via }(hjhhhNhNubj)}(h``netif_stop_queue``h]hnetif_stop_queue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhz). It is then re-enabled later in ISR when the device has some space available again and is able to enqueue another frame.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjYhhubh)}(h1All the device events are handled in ISR, namely:h]h1All the device events are handled in ISR, namely:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjYhhubhenumerated_list)}(hhh](j)}(hX**TX completion**. When the device successfully finishes transmitting a frame, the frame is echoed locally. On error, an informative error frame [2]_ is sent to the network subsystem instead. In both cases, the software TX queue is resumed so that more frames may be sent. h]h)}(hX**TX completion**. When the device successfully finishes transmitting a frame, the frame is echoed locally. On error, an informative error frame [2]_ is sent to the network subsystem instead. In both cases, the software TX queue is resumed so that more frames may be sent.h](hstrong)}(h**TX completion**h]h TX completion}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh. When the device successfully finishes transmitting a frame, the frame is echoed locally. On error, an informative error frame }(hjhhhNhNubj)}(h[2]_h]h2}(hjhhhNhNubah}(h]id2ah ]h"]h$]h&]j!id12jjuh1jhjjKubh{ is sent to the network subsystem instead. In both cases, the software TX queue is resumed so that more frames may be sent.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(h**Error condition**. If something goes wrong (e.g., the device goes bus-off or RX overrun happens), error counters are updated, and informative error frames are enqueued to SW RX queue. h]h)}(h**Error condition**. If something goes wrong (e.g., the device goes bus-off or RX overrun happens), error counters are updated, and informative error frames are enqueued to SW RX queue.h](j)}(h**Error condition**h]hError condition}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh. If something goes wrong (e.g., the device goes bus-off or RX overrun happens), error counters are updated, and informative error frames are enqueued to SW RX queue.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(h**RX buffer not empty**. In this case, read the RX frames and enqueue them to SW RX queue. Usually NAPI is used as a middle layer (see ). h]h)}(h**RX buffer not empty**. In this case, read the RX frames and enqueue them to SW RX queue. Usually NAPI is used as a middle layer (see ).h](j)}(h**RX buffer not empty**h]hRX buffer not empty}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubhr. In this case, read the RX frames and enqueue them to SW RX queue. Usually NAPI is used as a middle layer (see ).}(hjDhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj@ubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix.uh1jhjYhhhhhKubj)}(h.. _sec:socketcan:napi:h]h}(h]h ]h"]h$]h&]j!sec-socketcan-napiuh1jhKhjYhhhhubeh}(h](network-device-driverjKeh ]h"](network device driversec:socketcan:netdeveh$]h&]uh1hhj+hhhhhKjU}jjAsjW}jKjAsubeh}(h](driver-structurej"eh ]h"](driver structuresec:socketcan:drveh$]h&]uh1hhjrhhhhhKbjU}jjsjW}j"jsubh)}(hhh](h)}(hNAPIh]hNAPI}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hX4The frequency of incoming frames can be high and the overhead to invoke the interrupt service routine for each frame can cause significant system load. There are multiple mechanisms in the Linux kernel to deal with this situation. They evolved over the years of Linux kernel development and enhancements. For network devices, the current standard is NAPI – *the New API*. It is similar to classical top-half/bottom-half interrupt handling in that it only acknowledges the interrupt in the ISR and signals that the rest of the processing should be done in softirq context. On top of that, it offers the possibility to *poll* for new frames for a while. This has a potential to avoid the costly round of enabling interrupts, handling an incoming IRQ in ISR, re-enabling the softirq and switching context back to softirq.h](hXgThe frequency of incoming frames can be high and the overhead to invoke the interrupt service routine for each frame can cause significant system load. There are multiple mechanisms in the Linux kernel to deal with this situation. They evolved over the years of Linux kernel development and enhancements. For network devices, the current standard is NAPI – }(hjhhhNhNubjo)}(h *the New API*h]h the New API}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjubh. It is similar to classical top-half/bottom-half interrupt handling in that it only acknowledges the interrupt in the ISR and signals that the rest of the processing should be done in softirq context. On top of that, it offers the possibility to }(hjhhhNhNubjo)}(h*poll*h]hpoll}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjubh for new frames for a while. This has a potential to avoid the costly round of enabling interrupts, handling an incoming IRQ in ISR, re-enabling the softirq and switching context back to softirq.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hISee :ref:`Documentation/networking/napi.rst ` for more information.h](hSee }(hjhhhNhNubh)}(h/:ref:`Documentation/networking/napi.rst `h]hinline)}(hjh]h!Documentation/networking/napi.rst}(hjhhhNhNubah}(h]h ](xrefstdstd-refeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftyperef refexplicitrefwarn reftargetnapiuh1hhhhKhjubh for more information.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h](napij{eh ]h"](napisec:socketcan:napieh$]h&]uh1hhjrhhhhhKjU}jjqsjW}j{jqsubeh}(h]about-socketcanah ]h"]about socketcanah$]h&]uh1hhhhhhhhK&ubh)}(hhh](h)}(h#Integrating the core to Xilinx Zynqh]h#Integrating the core to Xilinx Zynq}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hXThe core interfaces a simple subset of the Avalon (search for Intel **Avalon Interface Specifications**) bus as it was originally used on Alterra FPGA chips, yet Xilinx natively interfaces with AXI (search for ARM **AMBA AXI and ACE Protocol Specification AXI3, AXI4, and AXI4-Lite, ACE and ACE-Lite**). The most obvious solution would be to use an Avalon/AXI bridge or implement some simple conversion entity. However, the core’s interface is half-duplex with no handshake signaling, whereas AXI is full duplex with two-way signaling. Moreover, even AXI-Lite slave interface is quite resource-intensive, and the flexibility and speed of AXI are not required for a CAN core.h](hDThe core interfaces a simple subset of the Avalon (search for Intel }(hj/hhhNhNubj)}(h#**Avalon Interface Specifications**h]hAvalon Interface Specifications}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubho) bus as it was originally used on Alterra FPGA chips, yet Xilinx natively interfaces with AXI (search for ARM }(hj/hhhNhNubj)}(hW**AMBA AXI and ACE Protocol Specification AXI3, AXI4, and AXI4-Lite, ACE and ACE-Lite**h]hSAMBA AXI and ACE Protocol Specification AXI3, AXI4, and AXI4-Lite, ACE and ACE-Lite}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubhXw). The most obvious solution would be to use an Avalon/AXI bridge or implement some simple conversion entity. However, the core’s interface is half-duplex with no handshake signaling, whereas AXI is full duplex with two-way signaling. Moreover, even AXI-Lite slave interface is quite resource-intensive, and the flexibility and speed of AXI are not required for a CAN core.}(hj/hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hXThus a much simpler bus was chosen – APB (Advanced Peripheral Bus) (search for ARM **AMBA APB Protocol Specification**). APB-AXI bridge is directly available in Xilinx Vivado, and the interface adaptor entity is just a few simple combinatorial assignments.h](hUThus a much simpler bus was chosen – APB (Advanced Peripheral Bus) (search for ARM }(hjahhhNhNubj)}(h#**AMBA APB Protocol Specification**h]hAMBA APB Protocol Specification}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubh). APB-AXI bridge is directly available in Xilinx Vivado, and the interface adaptor entity is just a few simple combinatorial assignments.}(hjahhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hFinally, to be able to include the core in a block diagram as a custom IP, the core, together with the APB interface, has been packaged as a Vivado component.h]hFinally, to be able to include the core in a block diagram as a custom IP, the core, together with the APB interface, has been packaged as a Vivado component.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]#integrating-the-core-to-xilinx-zynqah ]h"]#integrating the core to xilinx zynqah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hCTU CAN FD Driver designh]hCTU CAN FD Driver design}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hThe general structure of a CAN device driver has already been examined in . The next paragraphs provide a more detailed description of the CTU CAN FD core driver in particular.h]hThe general structure of a CAN device driver has already been examined in . The next paragraphs provide a more detailed description of the CTU CAN FD core driver in particular.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hhh](h)}(hLow-level driverh]hLow-level driver}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhM ubh)}(hXsThe core is not intended to be used solely with SocketCAN, and thus it is desirable to have an OS-independent low-level driver. This low-level driver can then be used in implementations of OS driver or directly either on bare metal or in a user-space application. Another advantage is that if the hardware slightly changes, only the low-level driver needs to be modified.h]hXsThe core is not intended to be used solely with SocketCAN, and thus it is desirable to have an OS-independent low-level driver. This low-level driver can then be used in implementations of OS driver or directly either on bare metal or in a user-space application. Another advantage is that if the hardware slightly changes, only the low-level driver needs to be modified.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hXThe code [3]_ is in part automatically generated and in part written manually by the core author, with contributions of the thesis’ author. The low-level driver supports operations such as: set bit timing, set controller mode, enable/disable, read RX frame, write TX frame, and so on.h](h The code }(hjhhhNhNubj)}(h[3]_h]h3}(hjhhhNhNubah}(h]id3ah ]h"]h$]h&]j!id13jjuh1jhjjKubhX is in part automatically generated and in part written manually by the core author, with contributions of the thesis’ author. The low-level driver supports operations such as: set bit timing, set controller mode, enable/disable, read RX frame, write TX frame, and so on.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]low-level-driverah ]h"]low-level driverah$]h&]uh1hhjhhhhhM ubh)}(hhh](h)}(hConfiguring bit timingh]hConfiguring bit timing}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hXOn CAN, each bit is divided into four segments: SYNC, PROP, PHASE1, and PHASE2. Their duration is expressed in multiples of a Time Quantum (details in `CAN Specification, Version 2.0 `_, chapter 8). When configuring bitrate, the durations of all the segments (and time quantum) must be computed from the bitrate and Sample Point. This is performed independently for both the Nominal bitrate and Data bitrate for CAN FD.h](hOn CAN, each bit is divided into four segments: SYNC, PROP, PHASE1, and PHASE2. Their duration is expressed in multiples of a Time Quantum (details in }(hj hhhNhNubh)}(hJ`CAN Specification, Version 2.0 `_h]hCAN Specification, Version 2.0}(hj hhhNhNubah}(h]h ]h"]h$]h&]nameCAN Specification, Version 2.0j&http://esd.cs.ucr.edu/webres/can20.pdfuh1hhj ubj)}(h) h]h}(h]can-specification-version-2-0ah ]h"]can specification, version 2.0ah$]h&]refurij( uh1jj%Khj ubh, chapter 8). When configuring bitrate, the durations of all the segments (and time quantum) must be computed from the bitrate and Sample Point. This is performed independently for both the Nominal bitrate and Data bitrate for CAN FD.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hXOSocketCAN is fairly flexible and offers either highly customized configuration by setting all the segment durations manually, or a convenient configuration by setting just the bitrate and sample point (and even that is chosen automatically per Bosch recommendation if not specified). However, each CAN controller may have different base clock frequency and different width of segment duration registers. The algorithm thus needs the minimum and maximum values for the durations (and clock prescaler) and tries to optimize the numbers to fit both the constraints and the requested parameters.h]hXOSocketCAN is fairly flexible and offers either highly customized configuration by setting all the segment durations manually, or a convenient configuration by setting just the bitrate and sample point (and even that is chosen automatically per Bosch recommendation if not specified). However, each CAN controller may have different base clock frequency and different width of segment duration registers. The algorithm thus needs the minimum and maximum values for the durations (and clock prescaler) and tries to optimize the numbers to fit both the constraints and the requested parameters.}(hj@ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM&hjhhubj)}(hXstruct can_bittiming_const { char name[16]; /* Name of the CAN controller hardware */ __u32 tseg1_min; /* Time segment 1 = prop_seg + phase_seg1 */ __u32 tseg1_max; __u32 tseg2_min; /* Time segment 2 = phase_seg2 */ __u32 tseg2_max; __u32 sjw_max; /* Synchronisation jump width */ __u32 brp_min; /* Bit-rate prescaler */ __u32 brp_max; __u32 brp_inc; };h]hXstruct can_bittiming_const { char name[16]; /* Name of the CAN controller hardware */ __u32 tseg1_min; /* Time segment 1 = prop_seg + phase_seg1 */ __u32 tseg1_max; __u32 tseg2_min; /* Time segment 2 = phase_seg2 */ __u32 tseg2_max; __u32 sjw_max; /* Synchronisation jump width */ __u32 brp_min; /* Bit-rate prescaler */ __u32 brp_max; __u32 brp_inc; };}hjN sbah}(h]h ]h"]h$]h&]forcehighlight_args}hhj?j@uh1jhhhM0hjhhubh)}(h[lst:can_bittiming_const]h]h[lst:can_bittiming_const]}(hj_ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM?hjhhubh)}(hX;A curious reader will notice that the durations of the segments PROP_SEG and PHASE_SEG1 are not determined separately but rather combined and then, by default, the resulting TSEG1 is evenly divided between PROP_SEG and PHASE_SEG1. In practice, this has virtually no consequences as the sample point is between PHASE_SEG1 and PHASE_SEG2. In CTU CAN FD, however, the duration registers ``PROP`` and ``PH1`` have different widths (6 and 7 bits, respectively), so the auto-computed values might overflow the shorter register and must thus be redistributed among the two [4]_.h](hXA curious reader will notice that the durations of the segments PROP_SEG and PHASE_SEG1 are not determined separately but rather combined and then, by default, the resulting TSEG1 is evenly divided between PROP_SEG and PHASE_SEG1. In practice, this has virtually no consequences as the sample point is between PHASE_SEG1 and PHASE_SEG2. In CTU CAN FD, however, the duration registers }(hjm hhhNhNubj)}(h``PROP``h]hPROP}(hju hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjm ubh and }(hjm hhhNhNubj)}(h``PH1``h]hPH1}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjm ubh have different widths (6 and 7 bits, respectively), so the auto-computed values might overflow the shorter register and must thus be redistributed among the two }(hjm hhhNhNubj)}(h[4]_h]h4}(hj hhhNhNubah}(h]id4ah ]h"]h$]h&]j!id14jjuh1jhjm jKubh.}(hjm hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMAhjhhubeh}(h]configuring-bit-timingah ]h"]configuring bit timingah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(h Handling RXh]h Handling RX}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhMLubh)}(hX?Frame reception is handled in NAPI queue, which is enabled from ISR when the RXNE (RX FIFO Not Empty) bit is set. Frames are read one by one until either no frame is left in the RX FIFO or the maximum work quota has been reached for the NAPI poll run (see ). Each frame is then passed to the network interface RX queue.h]hX?Frame reception is handled in NAPI queue, which is enabled from ISR when the RXNE (RX FIFO Not Empty) bit is set. Frames are read one by one until either no frame is left in the RX FIFO or the maximum work quota has been reached for the NAPI poll run (see ). Each frame is then passed to the network interface RX queue.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMNhj hhubh)}(hX?An incoming frame may be either a CAN 2.0 frame or a CAN FD frame. The way to distinguish between these two in the kernel is to allocate either ``struct can_frame`` or ``struct canfd_frame``, the two having different sizes. In the controller, the information about the frame type is stored in the first word of RX FIFO.h](hAn incoming frame may be either a CAN 2.0 frame or a CAN FD frame. The way to distinguish between these two in the kernel is to allocate either }(hj hhhNhNubj)}(h``struct can_frame``h]hstruct can_frame}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh or }(hj hhhNhNubj)}(h``struct canfd_frame``h]hstruct canfd_frame}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh, the two having different sizes. In the controller, the information about the frame type is stored in the first word of RX FIFO.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMThj hhubh)}(hX*This brings us a chicken-egg problem: we want to allocate the ``skb`` for the frame, and only if it succeeds, fetch the frame from FIFO; otherwise keep it there for later. But to be able to allocate the correct ``skb``, we have to fetch the first work of FIFO. There are several possible solutions:h](h>This brings us a chicken-egg problem: we want to allocate the }(hj hhhNhNubj)}(h``skb``h]hskb}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh for the frame, and only if it succeeds, fetch the frame from FIFO; otherwise keep it there for later. But to be able to allocate the correct }(hj hhhNhNubj)}(h``skb``h]hskb}(hj& hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhP, we have to fetch the first work of FIFO. There are several possible solutions:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMZhj hhubj)}(hhh](j)}(hRead the word, then allocate. If it fails, discard the rest of the frame. When the system is low on memory, the situation is bad anyway. h]h)}(hRead the word, then allocate. If it fails, discard the rest of the frame. When the system is low on memory, the situation is bad anyway.h]hRead the word, then allocate. If it fails, discard the rest of the frame. When the system is low on memory, the situation is bad anyway.}(hjE hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM`hjA ubah}(h]h ]h"]h$]h&]uh1jhj> hhhhhNubj)}(hAlways allocate ``skb`` big enough for an FD frame beforehand. Then tweak the ``skb`` internals to look like it has been allocated for the smaller CAN 2.0 frame. h]h)}(hAlways allocate ``skb`` big enough for an FD frame beforehand. Then tweak the ``skb`` internals to look like it has been allocated for the smaller CAN 2.0 frame.h](hAlways allocate }(hj] hhhNhNubj)}(h``skb``h]hskb}(hje hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj] ubh7 big enough for an FD frame beforehand. Then tweak the }(hj] hhhNhNubj)}(h``skb``h]hskb}(hjw hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj] ubhL internals to look like it has been allocated for the smaller CAN 2.0 frame.}(hj] hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMchjY ubah}(h]h ]h"]h$]h&]uh1jhj> hhhhhNubj)}(h@Add option to peek into the FIFO instead of consuming the word. h]h)}(h?Add option to peek into the FIFO instead of consuming the word.h]h?Add option to peek into the FIFO instead of consuming the word.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMghj ubah}(h]h ]h"]h$]h&]uh1jhj> hhhhhNubj)}(hIf the allocation fails, store the read word into driver’s data. On the next try, use the stored word instead of reading it again. h]h)}(hIf the allocation fails, store the read word into driver’s data. On the next try, use the stored word instead of reading it again.h]hIf the allocation fails, store the read word into driver’s data. On the next try, use the stored word instead of reading it again.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMihj ubah}(h]h ]h"]h$]h&]uh1jhj> hhhhhNubeh}(h]h ]h"]h$]h&]jljmjnhjojpuh1jhj hhhhhM`ubh)}(hXeOption 1 is simple enough, but not very satisfying if we could do better. Option 2 is not acceptable, as it would require modifying the private state of an integral kernel structure. The slightly higher memory consumption is just a virtual cherry on top of the “cake”. Option 3 requires non-trivial HW changes and is not ideal from the HW point of view.h]hXeOption 1 is simple enough, but not very satisfying if we could do better. Option 2 is not acceptable, as it would require modifying the private state of an integral kernel structure. The slightly higher memory consumption is just a virtual cherry on top of the “cake”. Option 3 requires non-trivial HW changes and is not ideal from the HW point of view.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMlhj hhubh)}(hXOption 4 seems like a good compromise, with its disadvantage being that a partial frame may stay in the FIFO for a prolonged time. Nonetheless, there may be just one owner of the RX FIFO, and thus no one else should see the partial frame (disregarding some exotic debugging scenarios). Basides, the driver resets the core on its initialization, so the partial frame cannot be “adopted” either. In the end, option 4 was selected [5]_.h](hXOption 4 seems like a good compromise, with its disadvantage being that a partial frame may stay in the FIFO for a prolonged time. Nonetheless, there may be just one owner of the RX FIFO, and thus no one else should see the partial frame (disregarding some exotic debugging scenarios). Basides, the driver resets the core on its initialization, so the partial frame cannot be “adopted” either. In the end, option 4 was selected }(hj hhhNhNubj)}(h[5]_h]h5}(hj hhhNhNubah}(h]id5ah ]h"]h$]h&]j!id15jjuh1jhj jKubh.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMshj hhubj)}(h .. _subsec:ctucanfd:rxtimestamp:h]h}(h]h ]h"]h$]h&]j!subsec-ctucanfd-rxtimestampuh1jhM{hj hhhhubh)}(hhh](h)}(hTimestamping RX framesh]hTimestamping RX frames}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhM~ubh)}(hXThe CTU CAN FD core reports the exact timestamp when the frame has been received. The timestamp is by default captured at the sample point of the last bit of EOF but is configurable to be captured at the SOF bit. The timestamp source is external to the core and may be up to 64 bits wide. At the time of writing, passing the timestamp from kernel to userspace is not yet implemented, but is planned in the future.h]hXThe CTU CAN FD core reports the exact timestamp when the frame has been received. The timestamp is by default captured at the sample point of the last bit of EOF but is configurable to be captured at the SOF bit. The timestamp source is external to the core and may be up to 64 bits wide. At the time of writing, passing the timestamp from kernel to userspace is not yet implemented, but is planned in the future.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj hhubeh}(h](timestamping-rx-framesj eh ]h"](timestamping rx framessubsec:ctucanfd:rxtimestampeh$]h&]uh1hhj hhhhhM~jU}j+ j sjW}j j subeh}(h] handling-rxah ]h"] handling rxah$]h&]uh1hhjhhhhhMLubh)}(hhh](h)}(h Handling TXh]h Handling TX}(hj; hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8 hhhhhMubh)}(hThe CTU CAN FD core has 4 independent TX buffers, each with its own state and priority. When the core wants to transmit, a TX buffer in Ready state with the highest priority is selected.h]hThe CTU CAN FD core has 4 independent TX buffers, each with its own state and priority. When the core wants to transmit, a TX buffer in Ready state with the highest priority is selected.}(hjI hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj8 hhubh)}(hX{The priorities are 3bit numbers in register TX_PRIORITY (nibble-aligned). This should be flexible enough for most use cases. SocketCAN, however, supports only one FIFO queue for outgoing frames [6]_. The buffer priorities may be used to simulate the FIFO behavior by assigning each buffer a distinct priority and *rotating* the priorities after a frame transmission is completed.h](hThe priorities are 3bit numbers in register TX_PRIORITY (nibble-aligned). This should be flexible enough for most use cases. SocketCAN, however, supports only one FIFO queue for outgoing frames }(hjW hhhNhNubj)}(h[6]_h]h6}(hj_ hhhNhNubah}(h]id6ah ]h"]h$]h&]j!id16jjuh1jhjW jKubhs. The buffer priorities may be used to simulate the FIFO behavior by assigning each buffer a distinct priority and }(hjW hhhNhNubjo)}(h *rotating*h]hrotating}(hjs hhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjW ubh8 the priorities after a frame transmission is completed.}(hjW hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj8 hhubh)}(hX`In addition to priority rotation, the SW must maintain head and tail pointers into the FIFO formed by the TX buffers to be able to determine which buffer should be used for next frame (``txb_head``) and which should be the first completed one (``txb_tail``). The actual buffer indices are (obviously) modulo 4 (number of TX buffers), but the pointers must be at least one bit wider to be able to distinguish between FIFO full and FIFO empty – in this situation, :math:`txb\_head \equiv txb\_tail\ (\textrm{mod}\ 4)`. An example of how the FIFO is maintained, together with priority rotation, is depicted inh](hIn addition to priority rotation, the SW must maintain head and tail pointers into the FIFO formed by the TX buffers to be able to determine which buffer should be used for next frame (}(hj hhhNhNubj)}(h ``txb_head``h]htxb_head}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh/) and which should be the first completed one (}(hj hhhNhNubj)}(h ``txb_tail``h]htxb_tail}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh). The actual buffer indices are (obviously) modulo 4 (number of TX buffers), but the pointers must be at least one bit wider to be able to distinguish between FIFO full and FIFO empty – in this situation, }(hj hhhNhNubhmath)}(h5:math:`txb\_head \equiv txb\_tail\ (\textrm{mod}\ 4)`h]h-txb\_head \equiv txb\_tail\ (\textrm{mod}\ 4)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh[. An example of how the FIFO is maintained, together with priority rotation, is depicted in}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj8 hhubh line_block)}(hhh]hh)}(hhh]h}(h]h ]h"]h$]h&]uh1hhj hhhhhKindentKubah}(h]h ]h"]h$]h&]uh1j hj8 hhhhhMubhtable)}(hhh]htgroup)}(hhh](hcolspec)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j hj ubj )}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j hj ubj )}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j hj ubj )}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j hj ubj )}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j hj ubhthead)}(hhh]hrow)}(hhh](hentry)}(hhh]h)}(hTXB#h]hTXB#}(hj4 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj1 ubah}(h]h ]h"]h$]h&]uh1j/ hj, ubj0 )}(hhh]h)}(h0h]h0}(hjK hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjH ubah}(h]h ]h"]h$]h&]uh1j/ hj, ubj0 )}(hhh]h)}(h1h]h1}(hjb hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj_ ubah}(h]h ]h"]h$]h&]uh1j/ hj, ubj0 )}(hhh]h)}(h2h]h2}(hjy hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjv ubah}(h]h ]h"]h$]h&]uh1j/ hj, ubj0 )}(hhh]h)}(h3h]h3}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1j/ hj, ubeh}(h]h ]h"]h$]h&]uh1j* hj' ubah}(h]h ]h"]h$]h&]uh1j% hj ubhtbody)}(hhh](j+ )}(hhh](j0 )}(hhh]h)}(hSeqh]hSeq}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1j/ hj ubj0 )}(hhh]h)}(hAh]hA}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1j/ hj ubj0 )}(hhh]h)}(hBh]hB}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1j/ hj ubj0 )}(hhh]h)}(hCh]hC}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1j/ hj ubj0 )}(hhh]h}(h]h ]h"]h$]h&]uh1j/ hj ubeh}(h]h ]h"]h$]h&]uh1j* hj ubj+ )}(hhh](j0 )}(hhh]h)}(hPrioh]hPrio}(hj) hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj& ubah}(h]h ]h"]h$]h&]uh1j/ hj# ubj0 )}(hhh]h)}(h7h]h7}(hj@ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj= ubah}(h]h ]h"]h$]h&]uh1j/ hj# ubj0 )}(hhh]h)}(h6h]h6}(hjW hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjT ubah}(h]h ]h"]h$]h&]uh1j/ hj# ubj0 )}(hhh]h)}(h5h]h5}(hjn hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjk ubah}(h]h ]h"]h$]h&]uh1j/ hj# ubj0 )}(hhh]h)}(h4h]h4}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1j/ hj# ubeh}(h]h ]h"]h$]h&]uh1j* hj ubj+ )}(hhh](j0 )}(hhh]h}(h]h ]h"]h$]h&]uh1j/ hj ubj0 )}(hhh]h}(h]h ]h"]h$]h&]uh1j/ hj ubj0 )}(hhh]h)}(hTh]hT}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1j/ hj ubj0 )}(hhh]h}(h]h ]h"]h$]h&]uh1j/ hj ubj0 )}(hhh]h)}(hHh]hH}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1j/ hj ubeh}(h]h ]h"]h$]h&]uh1j* hj ubeh}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]colsKuh1j hj ubah}(h]h ]h"]h$]h&]uh1j hj8 hhhhhNubj )}(hhh]j )}(hhh]h}(h]h ]h"]h$]h&]uh1hhjhhhhhKj Kubah}(h]h ]h"]h$]h&]uh1j hj8 hhhhhMubj )}(hhh]j )}(hhh](j )}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j hjubj )}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j hjubj )}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j hjubj )}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j hjubj )}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j hjubj& )}(hhh]j+ )}(hhh](j0 )}(hhh]h)}(hTXB#h]hTXB#}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjTubah}(h]h ]h"]h$]h&]uh1j/ hjQubj0 )}(hhh]h)}(hjM h]h0}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjkubah}(h]h ]h"]h$]h&]uh1j/ hjQubj0 )}(hhh]h)}(hjd h]h1}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1j/ hjQubj0 )}(hhh]h)}(hj{ h]h2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1j/ hjQubj0 )}(hhh]h)}(hj h]h3}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1j/ hjQubeh}(h]h ]h"]h$]h&]uh1j* hjNubah}(h]h ]h"]h$]h&]uh1j% hjubj )}(hhh](j+ )}(hhh](j0 )}(hhh]h)}(hSeqh]hSeq}(hjhhhNhNuba h}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1j/ hjubj0 )}(hhh]h}(h]h ]h"]h$]h&]uh1j/ hjubj0 )}(hhh]h)}(hj h]hB}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1j/ hjubj0 )}(hhh]h)}(hj h]hC}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1j/ hjubj0 )}(hhh]h}(h]h ]h"]h$]h&]uh1j/ hjubeh}(h]h ]h"]h$]h&]uh1j* hjubj+ )}(hhh](j0 )}(hhh]h)}(hPrioh]hPrio}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj3ubah}(h]h ]h"]h$]h&]uh1j/ hj0ubj0 )}(hhh]h)}(hj h]h4}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjJubah}(h]h ]h"]h$]h&]uh1j/ hj0ubj0 )}(hhh]h)}(hjB h]h7}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj`ubah}(h]h ]h"]h$]h&]uh1j/ hj0ubj0 )}(hhh]h)}(hjY h]h6}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjvubah}(h]h ]h"]h$]h&]uh1j/ hj0ubj0 )}(hhh]h)}(hjp h]h5}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1j/ hj0ubeh}(h]h ]h"]h$]h&]uh1j* hjubj+ )}(hhh](j0 )}(hhh]h}(h]h ]h"]h$]h&]uh1j/ hjubj0 )}(hhh]h}(h]h ]h"]h$]h&]uh1j/ hjubj0 )}(hhh]h)}(hj h]hT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1j/ hjubj0 )}(hhh]h}(h]h ]h"]h$]h&]uh1j/ hjubj0 )}(hhh]h)}(hj h]hH}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1j/ hjubeh}(h]h ]h"]h$]h&]uh1j* hjubeh}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]colsKuh1j hjubah}(h]h ]h"]h$]h&]uh1j hj8 hhhhhNubj )}(hhh]j )}(hhh]h}(h]h ]h"]h$]h&]uh1hhj hhhhhKj Kubah}(h]h ]h"]h$]h&]uh1j hj8 hhhhhMubj )}(hhh]j )}(hhh](j )}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j hj ubj )}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j hj ubj )}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j hj ubj )}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j hj ubj )}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j hj ubj )}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1j hj ubj& )}(hhh]j+ )}(hhh](j0 )}(hhh]h)}(hTXB#h]hTXB#}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjeubah}(h]h ]h"]h$]h&]uh1j/ hjbubj0 )}(hhh]h)}(hjM h]h0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj|ubah}(h]h ]h"]h$]h&]uh1j/ hjbubj0 )}(hhh]h)}(hjd h]h1}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1j/ hjbubj0 )}(hhh]h)}(hj{ h]h2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1j/ hjbubj0 )}(hhh]h)}(hj h]h3}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1j/ hjbubj0 )}(hhh]h)}(h0’h]h0’}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1j/ hjbubeh}(h]h ]h"]h$]h&]uh1j* hj_ubah}(h]h ]h"]h$]h&]uh1j% hj ubj )}(hhh](j+ )}(hhh](j0 )}(hhh]h)}(hSeqh]hSeq}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1j/ hjubj0 )}(hhh]h)}(hEh]hE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1j/ hjubj0 )}(hhh]h)}(hj h]hB}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj+ubah}(h]h ]h"]h$]h&]uh1j/ hjubj0 )}(hhh]h)}(hj h]hC}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjAubah}(h]h ]h"]h$]h&]uh1j/ hjubj0 )}(hhh]h)}(hDh]hD}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjWubah}(h]h ]h"]h$]h&]uh1j/ hjubj0 )}(hhh]h}(h]h ]h"]h$]h&]uh1j/ hjubeh}(h]h ]h"]h$]h&]uh1j* hjubj+ )}(hhh](j0 )}(hhh]h)}(hPrioh]hPrio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1j/ hj}ubj0 )}(hhh]h)}(hj h]h4}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1j/ hj}ubj0 )}(hhh]h)}(hjB h]h7}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1j/ hj}ubj0 )}(hhh]h)}(hjY h]h6}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1j/ hj}ubj0 )}(hhh]h)}(hjp h]h5}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1j/ hj}ubj0 )}(hhh]h}(h]h ]h"]h$]h&]uh1j/ hj}ubeh}(h]h ]h"]h$]h&]uh1j* hjubj+ )}(hhh](j0 )}(hhh]h}(h]h ]h"]h$]h&]uh1j/ hjubj0 )}(hhh]h}(h]h ]h"]h$]h&]uh1j/ hjubj0 )}(hhh]h)}(hj h]hT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1j/ hjubj0 )}(hhh]h}(h]h ]h"]h$]h&]uh1j/ hjubj0 )}(hhh]h}(h]h ]h"]h$]h&]uh1j/ hjubj0 )}(hhh]h)}(hj h]hH}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj;ubah}(h]h ]h"]h$]h&]uh1j/ hjubeh}(h]h ]h"]h$]h&]uh1j* hjubeh}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]colsKuh1j hjubah}(h]h ]h"]h$]h&]uh1j hj8 hhhhhNubj )}(hhh]j )}(hhh]h}(h]h ]h"]h$]h&]uh1hhjjhhhhhKj Kubah}(h]h ]h"]h$]h&]uh1j hj8 hhhhhMubkfigure kernel_figure)}(hhh]hfigure)}(hhh](himage)}(hZ.. kernel-figure:: fsm_txt_buffer_user.svg TX Buffer states with possible transitions h]h}(h]h ]h"]h$]h&]uri9networking/device_drivers/can/ctu/fsm_txt_buffer_user.svg candidates}*jsuh1jhjhhhKubhcaption)}(h*TX Buffer states with possible transitionsh]h*TX Buffer states with possible transitions}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhMhjubeh}(h]id18ah ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j}hj8 hhhhhNubj)}(h .. _subsec:ctucanfd:txtimestamp:h]h}(h]h ]h"]h$]h&]j!subsec-ctucanfd-txtimestampuh1jhMhj8 hhhhubh)}(hhh](h)}(hTimestamping TX framesh]hTimestamping TX frames}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hX*When submitting a frame to a TX buffer, one may specify the timestamp at which the frame should be transmitted. The frame transmission may start later, but not sooner. Note that the timestamp does not participate in buffer prioritization – that is decided solely by the mechanism described above.h]hX*When submitting a frame to a TX buffer, one may specify the timestamp at which the frame should be transmitted. The frame transmission may start later, but not sooner. Note that the timestamp does not participate in buffer prioritization – that is decided solely by the mechanism described above.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hSupport for time-based packet transmission was recently merged to Linux v4.19 `Time-based packet transmission `_, but it remains yet to be researched whether this functionality will be practical for CAN.h](hNSupport for time-based packet transmission was recently merged to Linux v4.19 }(hjhhhNhNubh)}(hD`Time-based packet transmission `_h]hTime-based packet transmission}(hjhhhNhNubah}(h]h ]h"]h$]h&]nameTime-based packet transmissionj https://lwn.net/Articles/748879/uh1hhjubj)}(h# h]h}(h]time-based-packet-transmissionah ]h"]time-based packet transmissionah$]h&]refurijuh1jj%Khjubh[, but it remains yet to be researched whether this functionality will be practical for CAN.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hXAlso similarly to retrieving the timestamp of RX frames, the core supports retrieving the timestamp of TX frames – that is the time when the frame was successfully delivered. The particulars are very similar to timestamping RX frames and are described in .h]hXAlso similarly to retrieving the timestamp of RX frames, the core supports retrieving the timestamp of TX frames – that is the time when the frame was successfully delivered. The particulars are very similar to timestamping RX frames and are described in .}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h](timestamping-tx-framesjeh ]h"](timestamping tx framessubsec:ctucanfd:txtimestampeh$]h&]uh1hhj8 hhhhhMjU}j#jsjW}jjsubeh}(h] handling-txah ]h"] handling txah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(hHandling RX buffer overrunh]hHandling RX buffer overrun}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hhhhhMubh)}(hXsWhen a received frame does no more fit into the hardware RX FIFO in its entirety, RX FIFO overrun flag (STATUS[DOR]) is set and Data Overrun Interrupt (DOI) is triggered. When servicing the interrupt, care must be taken first to clear the DOR flag (via COMMAND[CDO]) and after that clear the DOI interrupt flag. Otherwise, the interrupt would be immediately [7]_ rearmed.h](hXfWhen a received frame does no more fit into the hardware RX FIFO in its entirety, RX FIFO overrun flag (STATUS[DOR]) is set and Data Overrun Interrupt (DOI) is triggered. When servicing the interrupt, care must be taken first to clear the DOR flag (via COMMAND[CDO]) and after that clear the DOI interrupt flag. Otherwise, the interrupt would be immediately }(hjAhhhNhNubj)}(h[7]_h]h7}(hjIhhhNhNubah}(h]id7ah ]h"]h$]h&]j!id17jjuh1jhjAjKubh rearmed.}(hjAhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj0hhubh)}(hX**Note**: During development, it was discussed whether the internal HW pipelining cannot disrupt this clear sequence and whether an additional dummy cycle is necessary between clearing the flag and the interrupt. On the Avalon interface, it indeed proved to be the case, but APB being safe because it uses 2-cycle transactions. Essentially, the DOR flag would be cleared, but DOI register’s Preset input would still be high the cycle when the DOI clear request would also be applied (by setting the register’s Reset input high). As Set had higher priority than Reset, the DOI flag would not be reset. This has been already fixed by swapping the Set/Reset priority (see issue #187).h](j)}(h**Note**h]hNote}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubhX: During development, it was discussed whether the internal HW pipelining cannot disrupt this clear sequence and whether an additional dummy cycle is necessary between clearing the flag and the interrupt. On the Avalon interface, it indeed proved to be the case, but APB being safe because it uses 2-cycle transactions. Essentially, the DOR flag would be cleared, but DOI register’s Preset input would still be high the cycle when the DOI clear request would also be applied (by setting the register’s Reset input high). As Set had higher priority than Reset, the DOI flag would not be reset. This has been already fixed by swapping the Set/Reset priority (see issue #187).}(hjchhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj0hhubeh}(h]handling-rx-buffer-overrunah ]h"]handling rx buffer overrunah$]h&]uh1hhjhhhhhMubh)}(hhh](h)}(h.Reporting Error Passive and Bus Off conditionsh]h.Reporting Error Passive and Bus Off conditions}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhMubh)}(hXIt may be desirable to report when the node reaches *Error Passive*, *Error Warning*, and *Bus Off* conditions. The driver is notified about error state change by an interrupt (EPI, EWLI), and then proceeds to determine the core’s error state by reading its error counters.h](h4It may be desirable to report when the node reaches }(hjhhhNhNubjo)}(h*Error Passive*h]h Error Passive}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjubh, }(hjhhhNhNubjo)}(h*Error Warning*h]h Error Warning}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjubh, and }(hjhhhNhNubjo)}(h *Bus Off*h]hBus Off}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjubh conditions. The driver is notified about error state change by an interrupt (EPI, EWLI), and then proceeds to determine the core’s error state by reading its error counters.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hXThere is, however, a slight race condition here – there is a delay between the time when the state transition occurs (and the interrupt is triggered) and when the error counters are read. When EPI is received, the node may be either *Error Passive* or *Bus Off*. If the node goes *Bus Off*, it obviously remains in the state until it is reset. Otherwise, the node is *or was* *Error Passive*. However, it may happen that the read state is *Error Warning* or even *Error Active*. It may be unclear whether and what exactly to report in that case, but I personally entertain the idea that the past error condition should still be reported. Similarly, when EWLI is received but the state is later detected to be *Error Passive*, *Error Passive* should be reported.h](hThere is, however, a slight race condition here – there is a delay between the time when the state transition occurs (and the interrupt is triggered) and when the error counters are read. When EPI is received, the node may be either }(hjhhhNhNubjo)}(h*Error Passive*h]h Error Passive}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjubh or }(hjhhhNhNubjo)}(h *Bus Off*h]hBus Off}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjubh. If the node goes }(hjhhhNhNubjo)}(h *Bus Off*h]hBus Off}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjubhN, it obviously remains in the state until it is reset. Otherwise, the node is }(hjhhhNhNubjo)}(h*or was*h]hor was}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjubh }(hjhhhNhNubjo)}(h*Error Passive*h]h Error Passive}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjubh0. However, it may happen that the read state is }(hjhhhNhNubjo)}(h*Error Warning*h]h Error Warning}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjubh or even }(hjhhhNhNubjo)}(h*Error Active*h]h Error Active}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjubh. It may be unclear whether and what exactly to report in that case, but I personally entertain the idea that the past error condition should still be reported. Similarly, when EWLI is received but the state is later detected to be }(hjhhhNhNubjo)}(h*Error Passive*h]h Error Passive}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjubh, }(hjhhhNhNubjo)}(h*Error Passive*h]h Error Passive}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jnhjubh should be reported.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h].reporting-error-passive-and-bus-off-conditionsah ]h"].reporting error passive and bus off conditionsah$]h&]uh1hhjhhhhhMubeh}(h]ctu-can-fd-driver-designah ]h"]ctu can fd driver designah$]h&]uh1hhhhhhhhMubh)}(hhh](h)}(h#CTU CAN FD Driver Sources Referenceh]h#CTU CAN FD Driver Sources Reference}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhM ubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](single ctucan_probe_common (C function)c.ctucan_probe_commonhNtauh1jhjhhhNhNubhdesc)}(hhh](hdesc_signature)}(hint ctucan_probe_common (struct device *dev, void __iomem *addr, int irq, unsigned int ntxbufs, unsigned long can_clk_rate, int pm_enable_call, void (*set_drvdata_fnc)(struct device *dev, struct net_device *ndev))h]hdesc_signature_line)}(hint ctucan_probe_common(struct device *dev, void __iomem *addr, int irq, unsigned int ntxbufs, unsigned long can_clk_rate, int pm_enable_call, void (*set_drvdata_fnc)(struct device *dev, struct net_device *ndev))h](hdesc_sig_keyword_type)}(hinth]hint}(hjhhhNhNubah}(h]h ]ktah"]h$]h&]uh1jhjhhh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:523: ./drivers/net/can/ctucanfd/ctucanfd.hhKHubhdesc_sig_space)}(h h]h }(hjhhhNhNubah}(h]h ]wah"]h$]h&]uh1jhjhhhjhKHubh desc_name)}(hctucan_probe_commonh]h desc_sig_name)}(hctucan_probe_commonh]hctucan_probe_common}(hjhhhNhNubah}(h]h ]nah"]h$]h&]uh1jhjubah}(h]h ](sig-namedescnameeh"]h$]h&]hhuh1jhjhhhjhKHubhdesc_parameterlist)}(h(struct device *dev, void __iomem *addr, int irq, unsigned int ntxbufs, unsigned long can_clk_rate, int pm_enable_call, void (*set_drvdata_fnc)(struct device *dev, struct net_device *ndev))h](hdesc_parameter)}(hstruct device *devh](hdesc_sig_keyword)}(hstructh]hstruct}(hjhhhNhNubah}(h]h ]kah"]h$]h&]uh1jhjubj)}(h h]h }(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hdeviceh]hdevice}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&] refdomainj@reftype identifier reftargetjAmodnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]jZ ASTIdentifier)}jUjsbc.ctucan_probe_commonasbuh1hhjubj)}(h h]h }(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubhdesc_sig_punctuation)}(hjh]h*}(hjwhhhNhNubah}(h]h ]pah"]h$]h&]uh1juhjubj)}(hdevh]hdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubj)}(hvoid __iomem *addrh](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh__iomem}(hjhhhNhNubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjv)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubj)}(haddrh]haddr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubj)}(hint irqh](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hirqh]hirq}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubj)}(hunsigned int ntxbufsh](j)}(hunsignedh]hunsigned}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubj)}(h h]h }(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubj)}(hinth]hint}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubj)}(h h]h }(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubj)}(hntxbufsh]hntxbufs}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubj)}(hunsigned long can_clk_rateh](j)}(hunsignedh]hunsigned}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubj)}(hlongh]hlong}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubj)}(h can_clk_rateh]h can_clk_rate}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubj)}(hint pm_enable_callh](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hpm_enable_callh]hpm_enable_call}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubj)}(hDvoid (*set_drvdata_fnc)(struct device *dev, struct net_device *ndev)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjv)}(h(h]h(}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubjv)}(hjh]h*}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubj)}(hset_drvdata_fnch]hset_drvdata_fnc}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjv)}(h)h]h)}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubjv)}(hjh]h(}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubj)}(hj!h]hstruct}(hj^hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjubj)}(h h]h }(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hdeviceh]hdevice}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetj~modnameN classnameNjYj\)}j_]jcc.ctucan_probe_commonasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjv)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubj)}(hdevh]hdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjv)}(h,h]h,}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hj!h]hstruct}(hjhhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h net_deviceh]h net_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetjmodnameN classnameNjYj\)}j_]jcc.ctucan_probe_commonasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjv)}(hjh]h*}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubj)}(hndevh]hndev}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjv)}(hjEh]h)}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubeh}(h]h ]h"]h$]h&]hhuh1jhjhhhjhKHubeh}(h]h ]h"]h$]h&]hh add_permalinkuh1jsphinx_line_type declaratorhjhhhjhKHubah}(h]jah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1jhjhKHhjhhubh desc_content)}(hhh]h)}(h)Device type independent registration callh]h)Device type independent registration call}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:523: ./drivers/net/can/ctucanfd/ctucanfd.hhK9hjthhubah}(h]h ]h"]h$]h&]uh1jrhjhhhjhKHubeh}(h]h ](j@functioneh"]h$]h&]domainj@objtypejdesctypejnoindex noindexentrynocontentsentryuh1jhhhjhNhNubh container)}(hX**Parameters** ``struct device *dev`` Handle to the generic device structure ``void __iomem *addr`` Base address of CTU CAN FD core address ``int irq`` Interrupt number ``unsigned int ntxbufs`` Number of implemented Tx buffers ``unsigned long can_clk_rate`` Clock rate, if 0 then clock are taken from device node ``int pm_enable_call`` Whether pm_runtime_enable should be called ``void (*set_drvdata_fnc)(struct device *dev, struct net_device *ndev)`` Function to set network driver data for physical device **Description** This function does all the memory allocation and registration for the CAN device. **Return** 0 on success and failure value on errorh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:523: ./drivers/net/can/ctucanfd/ctucanfd.hhK=hjubhdefinition_list)}(hhh](hdefinition_list_item)}(h>``struct device *dev`` Handle to the generic device structure h](hterm)}(h``struct device *dev``h]j)}(hjh]hstruct device *dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:523: ./drivers/net/can/ctucanfd/ctucanfd.hhK>hjubh definition)}(hhh]h)}(h&Handle to the generic device structureh]h&Handle to the generic device structure}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK>hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhK>hjubj)}(h?``void __iomem *addr`` Base address of CTU CAN FD core address h](j)}(h``void __iomem *addr``h]j)}(hjh]hvoid __iomem *addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:523: ./drivers/net/can/ctucanfd/ctucanfd.hhK?hjubj)}(hhh]h)}(h'Base address of CTU CAN FD core addressh]h'Base address of CTU CAN FD core address}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK?hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhK?hjubj)}(h``int irq`` Interrupt number h](j)}(h ``int irq``h]j)}(hj:h]hint irq}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:523: ./drivers/net/can/ctucanfd/ctucanfd.hhK@hj4ubj)}(hhh]h)}(hInterrupt numberh]hInterrupt number}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjOhK@hjPubah}(h]h ]h"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]uh1jhjOhK@hjubj)}(h:``unsigned int ntxbufs`` Number of implemented Tx buffers h](j)}(h``unsigned int ntxbufs``h]j)}(hjsh]hunsigned int ntxbufs}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:523: ./drivers/net/can/ctucanfd/ctucanfd.hhKAhjmubj)}(hhh]h)}(h Number of implemented Tx buffersh]h Number of implemented Tx buffers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKAhjubah}(h]h ]h"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]uh1jhjhKAhjubj)}(hV``unsigned long can_clk_rate`` Clock rate, if 0 then clock are taken from device node h](j)}(h``unsigned long can_clk_rate``h]j)}(hjh]hunsigned long can_clk_rate}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:523: ./drivers/net/can/ctucanfd/ctucanfd.hhKBhjubj)}(hhh]h)}(h6Clock rate, if 0 then clock are taken from device nodeh]h6Clock rate, if 0 then clock are taken from device node}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKBhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKBhjubj)}(hB``int pm_enable_call`` Whether pm_runtime_enable should be called h](j)}(h``int pm_enable_call``h]j)}(hjh]hint pm_enable_call}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:523: ./drivers/net/can/ctucanfd/ctucanfd.hhKChjubj)}(hhh]h)}(h*Whether pm_runtime_enable should be calledh]h*Whether pm_runtime_enable should be called}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKChjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKChjubj)}(h``void (*set_drvdata_fnc)(struct device *dev, struct net_device *ndev)`` Function to set network driver data for physical device h](j)}(hH``void (*set_drvdata_fnc)(struct device *dev, struct net_device *ndev)``h]j)}(hjh]hDvoid (*set_drvdata_fnc)(struct device *dev, struct net_device *ndev)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:523: ./drivers/net/can/ctucanfd/ctucanfd.hhKDhjubj)}(hhh]h)}(h7Function to set network driver data for physical deviceh]h7Function to set network driver data for physical device}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hKDhj4ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj3hKDhjubeh}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]j)}(hjYh]h Description}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:523: ./drivers/net/can/ctucanfd/ctucanfd.hhKFhjubh)}(hQThis function does all the memory allocation and registration for the CAN device.h]hQThis function does all the memory allocation and registration for the CAN device.}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:523: ./drivers/net/can/ctucanfd/ctucanfd.hhK:hjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:523: ./drivers/net/can/ctucanfd/ctucanfd.hhK=hjubh)}(h'0 on success and failure value on errorh]h'0 on success and failure value on error}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:523: ./drivers/net/can/ctucanfd/ctucanfd.hhKFhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j ctucan_state_to_str (C function)c.ctucan_state_to_strhNtauh1jhjhhhNhNubj)}(hhh](j)}(h7const char * ctucan_state_to_str (enum can_state state)h]j)}(h5const char *ctucan_state_to_str(enum can_state state)h](j)}(hconsth]hconst}(hjhhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjhhh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chKubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKubj)}(hcharh]hchar}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKubjv)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjhhhjhKubj)}(hctucan_state_to_strh]j)}(hctucan_state_to_strh]hctucan_state_to_str}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](j j eh"]h$]h&]hhuh1jhjhhhjhKubj)}(h(enum can_state state)h]j)}(henum can_state stateh](j)}(henumh]henum}(hj+hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj'ubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubh)}(hhh]j)}(h can_stateh]h can_state}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetjLmodnameN classnameNjYj\)}j_]jb)}jUjsbc.ctucan_state_to_strasbuh1hhj'ubj)}(h h]h }(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj)}(hstateh]hstate}(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj#ubah}(h]h ]h"]h$]h&]hhuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhjhhhjhKubah}(h]jah ](jjjkeh"]h$]h&]jojp)jqhuh1jhjhKhjhhubjs)}(hhh]h)}(h8Converts CAN controller state code to corresponding texth]h8Converts CAN controller state code to corresponding text}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chKhjhhubah}(h]h ]h"]h$]h&]uh1jrhjhhhjhKubeh}(h]h ](j@functioneh"]h$]h&]jj@jjjjjjjuh1jhhhjhNhNubj)}(h**Parameters** ``enum can_state state`` CAN controller state code **Return** Pointer to string representation of the error stateh](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chKhjubj)}(hhh]j)}(h3``enum can_state state`` CAN controller state code h](j)}(h``enum can_state state``h]j)}(hjh]henum can_state state}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chKhjubj)}(hhh]h)}(hCAN controller state codeh]hCAN controller state code}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubh)}(h **Return**h]j)}(hjh]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chKhjubh)}(h3Pointer to string representation of the error stateh]h3Pointer to string representation of the error state}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chKhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jctucan_reset (C function)c.ctucan_resethNtauh1jhjhhhNhNubj)}(hhh](j)}(h*int ctucan_reset (struct net_device *ndev)h]j)}(h)int ctucan_reset(struct net_device *ndev)h](j)}(hinth]hint}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_hhh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chKubj)}(h h]h }(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_hhhjqhKubj)}(h ctucan_reseth]j)}(h ctucan_reseth]h ctucan_reset}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](j j eh"]h$]h&]hhuh1jhj_hhhjqhKubj)}(h(struct net_device *ndev)h]j)}(hstruct net_device *ndevh](j)}(hj!h]hstruct}(hjhhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h net_deviceh]h net_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetjmodnameN classnameNjYj\)}j_]jb)}jUjsbc.ctucan_resetasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjv)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubj)}(hndevh]hndev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubah}(h]h ]h"]h$]h&]hhuh1jhj_hhhjqhKubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhj[hhhjqhKubah}(h]jVah ](jjjkeh"]h$]h&]jojp)jqhuh1jhjqhKhjXhhubjs)}(hhh]h)}(h+Issues software reset request to CTU CAN FDh]h+Issues software reset request to CTU CAN FD}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chKhj hhubah}(h]h ]h"]h$]h&]uh1jrhjXhhhjqhKubeh}(h]h ](j@functioneh"]h$]h&]jj@jj;jj;jjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct net_device *ndev`` Pointer to net_device structure **Return** 0 for success, -``ETIMEDOUT`` if CAN controller does not leave reseth](h)}(h**Parameters**h]j)}(hjEh]h Parameters}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chKhj?ubj)}(hhh]j)}(h<``struct net_device *ndev`` Pointer to net_device structure h](j)}(h``struct net_device *ndev``h]j)}(hjdh]hstruct net_device *ndev}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chKhj^ubj)}(hhh]h)}(hPointer to net_device structureh]hPointer to net_device structure}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjyhKhjzubah}(h]h ]h"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]uh1jhjyhKhj[ubah}(h]h ]h"]h$]h&]uh1jhj?ubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chKhj?ubh)}(hD0 for success, -``ETIMEDOUT`` if CAN controller does not leave reseth](h0 for success, -}(hjhhhNhNubj)}(h ``ETIMEDOUT``h]h ETIMEDOUT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh' if CAN controller does not leave reset}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chKhj?ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jctucan_set_btr (C function)c.ctucan_set_btrhNtauh1jhjhhhNhNubj)}(hhh](j)}(hTint ctucan_set_btr (struct net_device *ndev, struct can_bittiming *bt, bool nominal)h]j)}(hSint ctucan_set_btr(struct net_device *ndev, struct can_bittiming *bt, bool nominal)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chKubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKubj)}(hctucan_set_btrh]j)}(hctucan_set_btrh]hctucan_set_btr}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](j j eh"]h$]h&]hhuh1jhjhhhjhKubj)}(hA(struct net_device *ndev, struct can_bittiming *bt, bool nominal)h](j)}(hstruct net_device *ndevh](j)}(hj!h]hstruct}(hj3hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj/ubj)}(h h]h }(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubh)}(hhh]j)}(h net_deviceh]h net_device}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetjSmodnameN classnameNjYj\)}j_]jb)}jUjsbc.ctucan_set_btrasbuh1hhj/ubj)}(h h]h }(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubjv)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj/ubj)}(hndevh]hndev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj+ubj)}(hstruct can_bittiming *bth](j)}(hj!h]hstruct}(hjhhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h can_bittimingh]h can_bittiming}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetjmodnameN classnameNjYj\)}j_]jmc.ctucan_set_btrasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjv)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjubj)}(hbth]hbt}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj+ubj)}(h bool nominalh](j)}(hboolh]hbool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hnominalh]hnominal}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj+ubeh}(h]h ]h"]h$]h&]hhuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhjhhhjhKubah}(h]jah ](jjjkeh"]h$]h&]jojp)jqhuh1jhjhKhjhhubjs)}(hhh]h)}(h%Sets CAN bus bit timing in CTU CAN FDh]h%Sets CAN bus bit timing in CTU CAN FD}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chKhjXhhubah}(h]h ]h"]h$]h&]uh1jrhjhhhjhKubeh}(h]h ](j@functioneh"]h$]h&]jj@jjsjjsjjjuh1jhhhjhNhNubj)}(hX **Parameters** ``struct net_device *ndev`` Pointer to net_device structure ``struct can_bittiming *bt`` Pointer to Bit timing structure ``bool nominal`` True - Nominal bit timing, False - Data bit timing **Return** 0 - OK, -``EPERM`` if controller is enabledh](h)}(h**Parameters**h]j)}(hj}h]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chKhjwubj)}(hhh](j)}(h<``struct net_device *ndev`` Pointer to net_device structure h](j)}(h``struct net_device *ndev``h]j)}(hjh]hstruct net_device *ndev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chKhjubj)}(hhh]h)}(hPointer to net_device structureh]hPointer to net_device structure}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h=``struct can_bittiming *bt`` Pointer to Bit timing structure h](j)}(h``struct can_bittiming *bt``h]j)}(hjh]hstruct can_bittiming *bt}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chKhjubj)}(hhh]h)}(hPointer to Bit timing structureh]hPointer to Bit timing structure}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(hD``bool nominal`` True - Nominal bit timing, False - Data bit timing h](j)}(h``bool nominal``h]j)}(hj h]h bool nominal}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chKhj ubj)}(hhh]h)}(h2True - Nominal bit timing, False - Data bit timingh]h2True - Nominal bit timing, False - Data bit timing}(hj' hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj# hKhj$ ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj# hKhjubeh}(h]h ]h"]h$]h&]uh1jhjwubh)}(h **Return**h]j)}(hjI h]hReturn}(hjK hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjG ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chKhjwubh)}(h+0 - OK, -``EPERM`` if controller is enabledh](h 0 - OK, -}(hj_ hhhNhNubj)}(h ``EPERM``h]hEPERM}(hjg hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ ubh if controller is enabled}(hj_ hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chKhjwubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!ctucan_set_bittiming (C function)c.ctucan_set_bittiminghNtauh1jhjhhhNhNubj)}(hhh](j)}(h2int ctucan_set_bittiming (struct net_device *ndev)h]j)}(h1int ctucan_set_bittiming(struct net_device *ndev)h](j)}(hinth]hint}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj hMubj)}(hctucan_set_bittimingh]j)}(hctucan_set_bittimingh]hctucan_set_bittiming}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj hhhj hMubj)}(h(struct net_device *ndev)h]j)}(hstruct net_device *ndevh](j)}(hj!h]hstruct}(hj hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j)}(h net_deviceh]h net_device}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetj modnameN classnameNjYj\)}j_]jb)}jUj sbc.ctucan_set_bittimingasbuh1hhj ubj)}(h h]h }(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjv)}(hjh]h*}(hj)!hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj ubj)}(hndevh]hndev}(hj6!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj ubah}(h]h ]h"]h$]h&]hhuh1jhj hhhj hMubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhj hhhj hMubah}(h]j ah ](jjjkeh"]h$]h&]jojp)jqhuh1jhj hMhj hhubjs)}(hhh]h)}(h"CAN set nominal bit timing routineh]h"CAN set nominal bit timing routine}(hj`!hhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chKhj]!hhubah}(h]h ]h"]h$]h&]uh1jrhj hhhj hMubeh}(h]h ](j@functioneh"]h$]h&]jj@jjx!jjx!jjjuh1jhhhjhNhNubj)}(h|**Parameters** ``struct net_device *ndev`` Pointer to net_device structure **Return** 0 on success, -``EPERM`` on errorh](h)}(h**Parameters**h]j)}(hj!h]h Parameters}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj|!ubj)}(hhh]j)}(h<``struct net_device *ndev`` Pointer to net_device structure h](j)}(h``struct net_device *ndev``h]j)}(hj!h]hstruct net_device *ndev}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj!ubj)}(hhh]h)}(hPointer to net_device structureh]hPointer to net_device structure}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hMhj!ubah}(h]h ]h"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]uh1jhj!hMhj!ubah}(h]h ]h"]h$]h&]uh1jhj|!ubh)}(h **Return**h]j)}(hj!h]hReturn}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj|!ubh)}(h!0 on success, -``EPERM`` on errorh](h0 on success, -}(hj!hhhNhNubj)}(h ``EPERM``h]hEPERM}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubh on error}(hj!hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj|!ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j&ctucan_set_data_bittiming (C function)c.ctucan_set_data_bittiminghNtauh1jhjhhhNhNubj)}(hhh](j)}(h7int ctucan_set_data_bittiming (struct net_device *ndev)h]j)}(h6int ctucan_set_data_bittiming(struct net_device *ndev)h](j)}(hinth]hint}(hj3"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/"hhh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMubj)}(h h]h }(hjB"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/"hhhjA"hMubj)}(hctucan_set_data_bittimingh]j)}(hctucan_set_data_bittimingh]hctucan_set_data_bittiming}(hjT"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjP"ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj/"hhhjA"hMubj)}(h(struct net_device *ndev)h]j)}(hstruct net_device *ndevh](j)}(hj!h]hstruct}(hjp"hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjl"ubj)}(h h]h }(hj}"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjl"ubh)}(hhh]j)}(h net_deviceh]h net_device}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetj"modnameN classnameNjYj\)}j_]jb)}jUjV"sbc.ctucan_set_data_bittimingasbuh1hhjl"ubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjl"ubjv)}(hjh]h*}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjl"ubj)}(hndevh]hndev}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjl"ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjh"ubah}(h]h ]h"]h$]h&]hhuh1jhj/"hhhjA"hMubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhj+"hhhjA"hMubah}(h]j&"ah ](jjjkeh"]h$]h&]jojp)jqhuh1jhjA"hMhj("hhubjs)}(hhh]h)}(hCAN set data bit timing routineh]hCAN set data bit timing routine}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj"hhubah}(h]h ]h"]h$]h&]uh1jrhj("hhhjA"hMubeh}(h]h ](j@functioneh"]h$]h&]jj@jj #jj #jjjuh1jhhhjhNhNubj)}(h|**Parameters** ``struct net_device *ndev`` Pointer to net_device structure **Return** 0 on success, -``EPERM`` on errorh](h)}(h**Parameters**h]j)}(hj#h]h Parameters}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj#ubj)}(hhh]j)}(h<``struct net_device *ndev`` Pointer to net_device structure h](j)}(h``struct net_device *ndev``h]j)}(hj4#h]hstruct net_device *ndev}(hj6#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2#ubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj.#ubj)}(hhh]h)}(hPointer to net_device structureh]hPointer to net_device structure}(hjM#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjI#hMhjJ#ubah}(h]h ]h"]h$]h&]uh1jhj.#ubeh}(h]h ]h"]h$]h&]uh1jhjI#hMhj+#ubah}(h]h ]h"]h$]h&]uh1jhj#ubh)}(h **Return**h]j)}(hjo#h]hReturn}(hjq#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjm#ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj#ubh)}(h!0 on success, -``EPERM`` on errorh](h0 on success, -}(hj#hhhNhNubj)}(h ``EPERM``h]hEPERM}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh on error}(hj#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj#ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j.ctucan_set_secondary_sample_point (C function)#c.ctucan_set_secondary_sample_pointhNtauh1jhjhhhNhNubj)}(hhh](j)}(h?int ctucan_set_secondary_sample_point (struct net_device *ndev)h]j)}(h>int ctucan_set_secondary_sample_point(struct net_device *ndev)h](j)}(hinth]hint}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#hhh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chM"ubj)}(h h]h }(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#hhhj#hM"ubj)}(h!ctucan_set_secondary_sample_pointh]j)}(h!ctucan_set_secondary_sample_pointh]h!ctucan_set_secondary_sample_point}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj#hhhj#hM"ubj)}(h(struct net_device *ndev)h]j)}(hstruct net_device *ndevh](j)}(hj!h]hstruct}(hj$hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj#ubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubh)}(hhh]j)}(h net_deviceh]h net_device}(hj!$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetj#$modnameN classnameNjYj\)}j_]jb)}jUj#sb#c.ctucan_set_secondary_sample_pointasbuh1hhj#ubj)}(h h]h }(hjA$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubjv)}(hjh]h*}(hjO$hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj#ubj)}(hndevh]hndev}(hj\$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj#ubah}(h]h ]h"]h$]h&]hhuh1jhj#hhhj#hM"ubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhj#hhhj#hM"ubah}(h]j#ah ](jjjkeh"]h$]h&]jojp)jqhuh1jhj#hM"hj#hhubjs)}(hhh]h)}(h)Sets secondary sample point in CTU CAN FDh]h)Sets secondary sample point in CTU CAN FD}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj$hhubah}(h]h ]h"]h$]h&]uh1jrhj#hhhj#hM"ubeh}(h]h ](j@functioneh"]h$]h&]jj@jj$jj$jjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct net_device *ndev`` Pointer to net_device structure **Return** 0 on success, -``EPERM`` if controller is enabledh](h)}(h**Parameters**h]j)}(hj$h]h Parameters}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chM!hj$ubj)}(hhh]j)}(h<``struct net_device *ndev`` Pointer to net_device structure h](j)}(h``struct net_device *ndev``h]j)}(hj$h]hstruct net_device *ndev}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj$ubj)}(hhh]h)}(hPointer to net_device structureh]hPointer to net_device structure}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hMhj$ubah}(h]h ]h"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]uh1jhj$hMhj$ubah}(h]h ]h"]h$]h&]uh1jhj$ubh)}(h **Return**h]j)}(hj%h]hReturn}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chM hj$ubh)}(h10 on success, -``EPERM`` if controller is enabledh](h0 on success, -}(hj%hhhNhNubj)}(h ``EPERM``h]hEPERM}(hj %hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubh if controller is enabled}(hj%hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chM hj$ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jctucan_set_mode (C function)c.ctucan_set_modehNtauh1jhjhhhNhNubj)}(hhh](j)}(hPvoid ctucan_set_mode (struct ctucan_priv *priv, const struct can_ctrlmode *mode)h]j)}(hOvoid ctucan_set_mode(struct ctucan_priv *priv, const struct can_ctrlmode *mode)h](j)}(hvoidh]hvoid}(hjY%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjU%hhh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMFubj)}(h h]h }(hjh%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjU%hhhjg%hMFubj)}(hctucan_set_modeh]j)}(hctucan_set_modeh]hctucan_set_mode}(hjz%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjv%ubah}(h]h ](j j eh"]h$]h&]hhuh1jhjU%hhhjg%hMFubj)}(h;(struct ctucan_priv *priv, const struct can_ctrlmode *mode)h](j)}(hstruct ctucan_priv *privh](j)}(hj!h]hstruct}(hj%hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj%ubj)}(h h]h }(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubh)}(hhh]j)}(h ctucan_privh]h ctucan_priv}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetj%modnameN classnameNjYj\)}j_]jb)}jUj|%sbc.ctucan_set_modeasbuh1hhj%ubj)}(h h]h }(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubjv)}(hjh]h*}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj%ubj)}(hprivh]hpriv}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj%ubj)}(hconst struct can_ctrlmode *modeh](j)}(hjh]hconst}(hj&hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj&ubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj)}(hj!h]hstruct}(hj#&hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj&ubj)}(h h]h }(hj0&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubh)}(hhh]j)}(h can_ctrlmodeh]h can_ctrlmode}(hjA&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>&ubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetjC&modnameN classnameNjYj\)}j_]j%c.ctucan_set_modeasbuh1hhj&ubj)}(h h]h }(hj_&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubjv)}(hjh]h*}(hjm&hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj&ubj)}(hmodeh]hmode}(hjz&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj%ubeh}(h]h ]h"]h$]h&]hhuh1jhjU%hhhjg%hMFubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhjQ%hhhjg%hMFubah}(h]jL%ah ](jjjkeh"]h$]h&]jojp)jqhuh1jhjg%hMFhjN%hhubjs)}(hhh]h)}(hSets CTU CAN FDs modeh]hSets CTU CAN FDs mode}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMBhj&hhubah}(h]h ]h"]h$]h&]uh1jrhjN%hhhjg%hMFubeh}(h]h ](j@functioneh"]h$]h&]jj@jj&jj&jjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct ctucan_priv *priv`` Pointer to private data ``const struct can_ctrlmode *mode`` Pointer to controller modes to be seth](h)}(h**Parameters**h]j)}(hj&h]h Parameters}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMFhj&ubj)}(hhh](j)}(h5``struct ctucan_priv *priv`` Pointer to private data h](j)}(h``struct ctucan_priv *priv``h]j)}(hj&h]hstruct ctucan_priv *priv}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMChj&ubj)}(hhh]h)}(hPointer to private datah]hPointer to private data}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj&hMChj&ubah}(h]h ]h"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]uh1jhj&hMChj&ubj)}(hI``const struct can_ctrlmode *mode`` Pointer to controller modes to be seth](j)}(h#``const struct can_ctrlmode *mode``h]j)}(hj'h]hconst struct can_ctrlmode *mode}(hj 'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMEhj'ubj)}(hhh]h)}(h%Pointer to controller modes to be seth]h%Pointer to controller modes to be set}(hj7'hhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMDhj4'ubah}(h]h ]h"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]uh1jhj3'hMEhj&ubeh}(h]h ]h"]h$]h&]uh1jhj&ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jctucan_chip_start (C function)c.ctucan_chip_starthNtauh1jhjhhhNhNubj)}(hhh](j)}(h/int ctucan_chip_start (struct net_device *ndev)h]j)}(h.int ctucan_chip_start(struct net_device *ndev)h](j)}(hinth]hint}(hjx'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjt'hhh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMwubj)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjt'hhhj'hMwubj)}(hctucan_chip_starth]j)}(hctucan_chip_starth]hctucan_chip_start}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ](j j eh"]h$]h&]hhuh1jhjt'hhhj'hMwubj)}(h(struct net_device *ndev)h]j)}(hstruct net_device *ndevh](j)}(hj!h]hstruct}(hj'hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj'ubj)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubh)}(hhh]j)}(h net_deviceh]h net_device}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetj'modnameN classnameNjYj\)}j_]jb)}jUj'sbc.ctucan_chip_startasbuh1hhj'ubj)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubjv)}(hjh]h*}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj'ubj)}(hndevh]hndev}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj'ubah}(h]h ]h"]h$]h&]hhuh1jhjt'hhhj'hMwubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhjp'hhhj'hMwubah}(h]jk'ah ](jjjkeh"]h$]h&]jojp)jqhuh1jhj'hMwhjm'hhubjs)}(hhh]h)}(hThis routine starts the driverh]hThis routine starts the driver}(hj8(hhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMmhj5(hhubah}(h]h ]h"]h$]h&]uh1jrhjm'hhhj'hMwubeh}(h]h ](j@functioneh"]h$]h&]jj@jjP(jjP(jjjuh1jhhhjhNhNubj)}(hXp**Parameters** ``struct net_device *ndev`` Pointer to net_device structure **Description** Routine expects that chip is in reset state. It setups initial Tx buffers for FIFO priorities, sets bittiming, enables interrupts, switches core to operational mode and changes controller state to ``CAN_STATE_STOPPED``. **Return** 0 on success and failure value on errorh](h)}(h**Parameters**h]j)}(hjZ(h]h Parameters}(hj\(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjX(ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMqhjT(ubj)}(hhh]j)}(h<``struct net_device *ndev`` Pointer to net_device structure h](j)}(h``struct net_device *ndev``h]j)}(hjy(h]hstruct net_device *ndev}(hj{(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjw(ubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMnhjs(ubj)}(hhh]h)}(hPointer to net_device structureh]hPointer to net_device structure}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hMnhj(ubah}(h]h ]h"]h$]h&]uh1jhjs(ubeh}(h]h ]h"]h$]h&]uh1jhj(hMnhjp(ubah}(h]h ]h"]h$]h&]uh1jhjT(ubh)}(h**Description**h]j)}(hj(h]h Description}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMphjT(ubh)}(hRoutine expects that chip is in reset state. It setups initial Tx buffers for FIFO priorities, sets bittiming, enables interrupts, switches core to operational mode and changes controller state to ``CAN_STATE_STOPPED``.h](hRoutine expects that chip is in reset state. It setups initial Tx buffers for FIFO priorities, sets bittiming, enables interrupts, switches core to operational mode and changes controller state to }(hj(hhhNhNubj)}(h``CAN_STATE_STOPPED``h]hCAN_STATE_STOPPED}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubh.}(hj(hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMphjT(ubh)}(h **Return**h]j)}(hj(h]hReturn}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMuhjT(ubh)}(h'0 on success and failure value on errorh]h'0 on success and failure value on error}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMuhjT(ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jctucan_do_set_mode (C function)c.ctucan_do_set_modehNtauh1jhjhhhNhNubj)}(hhh](j)}(hDint ctucan_do_set_mode (struct net_device *ndev, enum can_mode mode)h]j)}(hCint ctucan_do_set_mode(struct net_device *ndev, enum can_mode mode)h](j)}(hinth]hint}(hj2)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.)hhh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMubj)}(h h]h }(hjA)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.)hhhj@)hMubj)}(hctucan_do_set_modeh]j)}(hctucan_do_set_modeh]hctucan_do_set_mode}(hjS)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjO)ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj.)hhhj@)hMubj)}(h-(struct net_device *ndev, enum can_mode mode)h](j)}(hstruct net_device *ndevh](j)}(hj!h]hstruct}(hjo)hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjk)ubj)}(h h]h }(hj|)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjk)ubh)}(hhh]j)}(h net_deviceh]h net_device}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetj)modnameN classnameNjYj\)}j_]jb)}jUjU)sbc.ctucan_do_set_modeasbuh1hhjk)ubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjk)ubjv)}(hjh]h*}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjk)ubj)}(hndevh]hndev}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjk)ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjg)ubj)}(henum can_mode modeh](j)}(hj-h]henum}(hj)hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj)ubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubh)}(hhh]j)}(hcan_modeh]hcan_mode}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetj*modnameN classnameNjYj\)}j_]j)c.ctucan_do_set_modeasbuh1hhj)ubj)}(h h]h }(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(hmodeh]hmode}(hj+*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjg)ubeh}(h]h ]h"]h$]h&]hhuh1jhj.)hhhj@)hMubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhj*)hhhj@)hMubah}(h]j%)ah ](jjjkeh"]h$]h&]jojp)jqhuh1jhj@)hMhj')hhubjs)}(hhh]h)}(hSets mode of the driverh]hSets mode of the driver}(hjU*hhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjR*hhubah}(h]h ]h"]h$]h&]uh1jrhj')hhhj@)hMubeh}(h]h ](j@functioneh"]h$]h&]jj@jjm*jjm*jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct net_device *ndev`` Pointer to net_device structure ``enum can_mode mode`` Tells the mode of the driver **Description** This check the drivers state and calls the corresponding modes to set. **Return** 0 on success and failure value on errorh](h)}(h**Parameters**h]j)}(hjw*h]h Parameters}(hjy*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhju*ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjq*ubj)}(hhh](j)}(h<``struct net_device *ndev`` Pointer to net_device structure h](j)}(h``struct net_device *ndev``h]j)}(hj*h]hstruct net_device *ndev}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj*ubj)}(hhh]h)}(hPointer to net_device structureh]hPointer to net_device structure}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hMhj*ubah}(h]h ]h"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]uh1jhj*hMhj*ubj)}(h4``enum can_mode mode`` Tells the mode of the driver h](j)}(h``enum can_mode mode``h]j)}(hj*h]henum can_mode mode}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj*ubj)}(hhh]h)}(hTells the mode of the driverh]hTells the mode of the driver}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hMhj*ubah}(h]h ]h"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]uh1jhj*hMhj*ubeh}(h]h ]h"]h$]h&]uh1jhjq*ubh)}(h**Description**h]j)}(hj +h]h Description}(hj +hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjq*ubh)}(hFThis check the drivers state and calls the corresponding modes to set.h]hFThis check the drivers state and calls the corresponding modes to set.}(hj +hhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjq*ubh)}(h **Return**h]j)}(hj1+h]hReturn}(hj3+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/+ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjq*ubh)}(h'0 on success and failure value on errorh]h'0 on success and failure value on error}(hjG+hhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjq*ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!ctucan_get_tx_status (C function)c.ctucan_get_tx_statushNtauh1jhjhhhNhNubj)}(hhh](j)}(hOenum ctucan_txtb_status ctucan_get_tx_status (struct ctucan_priv *priv, u8 buf)h]j)}(hNenum ctucan_txtb_status ctucan_get_tx_status(struct ctucan_priv *priv, u8 buf)h](j)}(hj-h]henum}(hjv+hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjr+hhh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMubj)}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjr+hhhj+hMubh)}(hhh]j)}(hctucan_txtb_statush]hctucan_txtb_status}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetj+modnameN classnameNjYj\)}j_]jb)}jUctucan_get_tx_statussbc.ctucan_get_tx_statusasbuh1hhjr+hhhj+hMubj)}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjr+hhhj+hMubj)}(hctucan_get_tx_statush]j)}(hj+h]hctucan_get_tx_status}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubah}(h]h ](j j eh"]h$]h&]hhuh1jhjr+hhhj+hMubj)}(h"(struct ctucan_priv *priv, u8 buf)h](j)}(hstruct ctucan_priv *privh](j)}(hj!h]hstruct}(hj+hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj+ubj)}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubh)}(hhh]j)}(h ctucan_privh]h ctucan_priv}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetj,modnameN classnameNjYj\)}j_]j+c.ctucan_get_tx_statusasbuh1hhj+ubj)}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubjv)}(hjh]h*}(hj-,hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj+ubj)}(hprivh]hpriv}(hj:,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj+ubj)}(hu8 bufh](h)}(hhh]j)}(hu8h]hu8}(hjV,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjS,ubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetjX,modnameN classnameNjYj\)}j_]j+c.ctucan_get_tx_statusasbuh1hhjO,ubj)}(h h]h }(hjt,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjO,ubj)}(hbufh]hbuf}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjO,ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj+ubeh}(h]h ]h"]h$]h&]hhuh1jhjr+hhhj+hMubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhjn+hhhj+hMubah}(h]ji+ah ](jjjkeh"]h$]h&]jojp)jqhuh1jhj+hMhjk+hhubjs)}(hhh]h)}(hGets status of TXT bufferh]hGets status of TXT buffer}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj,hhubah}(h]h ]h"]h$]h&]uh1jrhjk+hhhj+hMubeh}(h]h ](j@functioneh"]h$]h&]jj@jj,jj,jjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct ctucan_priv *priv`` Pointer to private data ``u8 buf`` Buffer index (0-based) **Return** Status of TXT bufferh](h)}(h**Parameters**h]j)}(hj,h]h Parameters}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj,ubj)}(hhh](j)}(h5``struct ctucan_priv *priv`` Pointer to private data h](j)}(h``struct ctucan_priv *priv``h]j)}(hj,h]hstruct ctucan_priv *priv}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj,ubj)}(hhh]h)}(hPointer to private datah]hPointer to private data}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hMhj-ubah}(h]h ]h"]h$]h&]uh1jhj,ubeh}(h]h ]h"]h$]h&]uh1jhj-hMhj,ubj)}(h"``u8 buf`` Buffer index (0-based) h](j)}(h ``u8 buf``h]j)}(hj&-h]hu8 buf}(hj(-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$-ubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj -ubj)}(hhh]h)}(hBuffer index (0-based)h]hBuffer index (0-based)}(hj?-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;-hMhj<-ubah}(h]h ]h"]h$]h&]uh1jhj -ubeh}(h]h ]h"]h$]h&]uh1jhj;-hMhj,ubeh}(h]h ]h"]h$]h&]uh1jhj,ubh)}(h **Return**h]j)}(hja-h]hReturn}(hjc-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_-ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj,ubh)}(hStatus of TXT bufferh]hStatus of TXT buffer}(hjw-hhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj,ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j'ctucan_is_txt_buf_writable (C function)c.ctucan_is_txt_buf_writablehNtauh1jhjhhhNhNubj)}(hhh](j)}(hBbool ctucan_is_txt_buf_writable (struct ctucan_priv *priv, u8 buf)h]j)}(hAbool ctucan_is_txt_buf_writable(struct ctucan_priv *priv, u8 buf)h](j)}(hjh]hbool}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-hhh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMubj)}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-hhhj-hMubj)}(hctucan_is_txt_buf_writableh]j)}(hctucan_is_txt_buf_writableh]hctucan_is_txt_buf_writable}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj-hhhj-hMubj)}(h"(struct ctucan_priv *priv, u8 buf)h](j)}(hstruct ctucan_priv *privh](j)}(hj!h]hstruct}(hj-hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj-ubj)}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubh)}(hhh]j)}(h ctucan_privh]h ctucan_priv}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetj.modnameN classnameNjYj\)}j_]jb)}jUj-sbc.ctucan_is_txt_buf_writableasbuh1hhj-ubj)}(h h]h }(hj .hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubjv)}(hjh]h*}(hj..hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj-ubj)}(hprivh]hpriv}(hj;.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj-ubj)}(hu8 bufh](h)}(hhh]j)}(hu8h]hu8}(hjW.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjT.ubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetjY.modnameN classnameNjYj\)}j_]j.c.ctucan_is_txt_buf_writableasbuh1hhjP.ubj)}(h h]h }(hju.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjP.ubj)}(hbufh]hbuf}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjP.ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj-ubeh}(h]h ]h"]h$]h&]hhuh1jhj-hhhj-hMubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhj-hhhj-hMubah}(h]j-ah ](jjjkeh"]h$]h&]jojp)jqhuh1jhj-hMhj-hhubjs)}(hhh]h)}(h-Checks if frame can be inserted to TXT Bufferh]h-Checks if frame can be inserted to TXT Buffer}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj.hhubah}(h]h ]h"]h$]h&]uh1jrhj-hhhj-hMubeh}(h]h ](j@functioneh"]h$]h&]jj@jj.jj.jjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct ctucan_priv *priv`` Pointer to private data ``u8 buf`` Buffer index (0-based) **Return** True - Frame can be inserted to TXT Buffer, False - If attempted, frame will not be inserted to TXT Bufferh](h)}(h**Parameters**h]j)}(hj.h]h Parameters}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj.ubj)}(hhh](j)}(h5``struct ctucan_priv *priv`` Pointer to private data h](j)}(h``struct ctucan_priv *priv``h]j)}(hj.h]hstruct ctucan_priv *priv}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj.ubj)}(hhh]h)}(hPointer to private datah]hPointer to private data}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/hMhj/ubah}(h]h ]h"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]uh1jhj/hMhj.ubj)}(h"``u8 buf`` Buffer index (0-based) h](j)}(h ``u8 buf``h]j)}(hj'/h]hu8 buf}(hj)/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%/ubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj!/ubj)}(hhh]h)}(hBuffer index (0-based)h]hBuffer index (0-based)}(hj@/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhj5ubah}(h]h ]h"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]uh1jhj5hM?hj=5ubeh}(h]h ]h"]h$]h&]uh1jhj!5ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jctucan_start_xmit (C function)c.ctucan_start_xmithNtauh1jhjhhhNhNubj)}(hhh](j)}(hLnetdev_tx_t ctucan_start_xmit (struct sk_buff *skb, struct net_device *ndev)h]j)}(hKnetdev_tx_t ctucan_start_xmit(struct sk_buff *skb, struct net_device *ndev)h](h)}(hhh]j)}(h netdev_tx_th]h netdev_tx_t}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetj6modnameN classnameNjYj\)}j_]jb)}jUctucan_start_xmitsbc.ctucan_start_xmitasbuh1hhj6hhh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMSubj)}(h h]h }(hj76hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6hhhj66hMSubj)}(hctucan_start_xmith]j)}(hj36h]hctucan_start_xmit}(hjI6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjE6ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj6hhhj66hMSubj)}(h.(struct sk_buff *skb, struct net_device *ndev)h](j)}(hstruct sk_buff *skbh](j)}(hj!h]hstruct}(hjd6hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj`6ubj)}(h h]h }(hjq6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`6ubh)}(hhh]j)}(hsk_buffh]hsk_buff}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetj6modnameN classnameNjYj\)}j_]j16c.ctucan_start_xmitasbuh1hhj`6ubj)}(h h]h }(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`6ubjv)}(hjh]h*}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj`6ubj)}(hskbh]hskb}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`6ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj\6ubj)}(hstruct net_device *ndevh](j)}(hj!h]hstruct}(hj6hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj6ubj)}(h h]h }(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubh)}(hhh]j)}(h net_deviceh]h net_device}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetj6modnameN classnameNjYj\)}j_]j16c.ctucan_start_xmitasbuh1hhj6ubj)}(h h]h }(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubjv)}(hjh]h*}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj6ubj)}(hndevh]hndev}(hj+7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj\6ubeh}(h]h ]h"]h$]h&]hhuh1jhj6hhhj66hMSubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhj 6hhhj66hMSubah}(h]j6ah ](jjjkeh"]h$]h&]jojp)jqhuh1jhj66hMShj6hhubjs)}(hhh]h)}(hStarts the transmissionh]hStarts the transmission}(hjU7hhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMIhjR7hhubah}(h]h ]h"]h$]h&]uh1jrhj6hhhj66hMSubeh}(h]h ](j@functioneh"]h$]h&]jj@jjm7jjm7jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct sk_buff *skb`` sk_buff pointer that contains data to be Txed ``struct net_device *ndev`` Pointer to net_device structure **Description** Invoked from upper layers to initiate transmission. Uses the next available free TXT Buffer and populates its fields to start the transmission. **Return** ``NETDEV_TX_OK`` on success, ``NETDEV_TX_BUSY`` when no free TXT buffer is available, negative return values reserved for error casesh](h)}(h**Parameters**h]j)}(hjw7h]h Parameters}(hjy7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhju7ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMMhjq7ubj)}(hhh](j)}(hF``struct sk_buff *skb`` sk_buff pointer that contains data to be Txed h](j)}(h``struct sk_buff *skb``h]j)}(hj7h]hstruct sk_buff *skb}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMJhj7ubj)}(hhh]h)}(h-sk_buff pointer that contains data to be Txedh]h-sk_buff pointer that contains data to be Txed}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7hMJhj7ubah}(h]h ]h"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]uh1jhj7hMJhj7ubj)}(h<``struct net_device *ndev`` Pointer to net_device structure h](j)}(h``struct net_device *ndev``h]j)}(hj7h]hstruct net_device *ndev}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMKhj7ubj)}(hhh]h)}(hPointer to net_device structureh]hPointer to net_device structure}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7hMKhj7ubah}(h]h ]h"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]uh1jhj7hMKhj7ubeh}(h]h ]h"]h$]h&]uh1jhjq7ubh)}(h**Description**h]j)}(hj 8h]h Description}(hj 8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMMhjq7ubh)}(hInvoked from upper layers to initiate transmission. Uses the next available free TXT Buffer and populates its fields to start the transmission.h]hInvoked from upper layers to initiate transmission. Uses the next available free TXT Buffer and populates its fields to start the transmission.}(hj 8hhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMMhjq7ubh)}(h **Return**h]j)}(hj18h]hReturn}(hj38hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/8ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMPhjq7ubj)}(hhh]j)}(h``NETDEV_TX_OK`` on success, ``NETDEV_TX_BUSY`` when no free TXT buffer is available, negative return values reserved for error casesh](j)}(hU``NETDEV_TX_OK`` on success, ``NETDEV_TX_BUSY`` when no free TXT buffer is available,h](j)}(h``NETDEV_TX_OK``h]h NETDEV_TX_OK}(hjR8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjN8ubh on success, }(hjN8hhhNhNubj)}(h``NETDEV_TX_BUSY``h]hNETDEV_TX_BUSY}(hjd8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjN8ubh& when no free TXT buffer is available,}(hjN8hhhNhNubeh}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMPhjJ8ubj)}(hhh]h)}(h/negative return values reserved for error casesh]h/negative return values reserved for error cases}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMQhj}8ubah}(h]h ]h"]h$]h&]uh1jhjJ8ubeh}(h]h ]h"]h$]h&]uh1jhj|8hMPhjG8ubah}(h]h ]h"]h$]h&]uh1jhjq7ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!ctucan_read_rx_frame (C function)c.ctucan_read_rx_framehNtauh1jhjhhhNhNubj)}(hhh](j)}(hUvoid ctucan_read_rx_frame (struct ctucan_priv *priv, struct canfd_frame *cf, u32 ffw)h]j)}(hTvoid ctucan_read_rx_frame(struct ctucan_priv *priv, struct canfd_frame *cf, u32 ffw)h](j)}(hvoidh]hvoid}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8hhh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMubj)}(h h]h }(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8hhhj8hMubj)}(hctucan_read_rx_frameh]j)}(hctucan_read_rx_frameh]hctucan_read_rx_frame}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj8hhhj8hMubj)}(h;(struct ctucan_priv *priv, struct canfd_frame *cf, u32 ffw)h](j)}(hstruct ctucan_priv *privh](j)}(hj!h]hstruct}(hj8hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj8ubj)}(h h]h }(hj 9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubh)}(hhh]j)}(h ctucan_privh]h ctucan_priv}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetj9modnameN classnameNjYj\)}j_]jb)}jUj8sbc.ctucan_read_rx_frameasbuh1hhj8ubj)}(h h]h }(hj<9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubjv)}(hjh]h*}(hjJ9hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj8ubj)}(hprivh]hpriv}(hjW9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj8ubj)}(hstruct canfd_frame *cfh](j)}(hj!h]hstruct}(hjp9hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjl9ubj)}(h h]h }(hj}9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjl9ubh)}(hhh]j)}(h canfd_frameh]h canfd_frame}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetj9modnameN classnameNjYj\)}j_]j89c.ctucan_read_rx_frameasbuh1hhjl9ubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjl9ubjv)}(hjh]h*}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjl9ubj)}(hcfh]hcf}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjl9ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj8ubj)}(hu32 ffwh](h)}(hhh]j)}(hu32h]hu32}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetj9modnameN classnameNjYj\)}j_]j89c.ctucan_read_rx_frameasbuh1hhj9ubj)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj)}(hffwh]hffw}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj8ubeh}(h]h ]h"]h$]h&]hhuh1jhj8hhhj8hMubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhj8hhhj8hMubah}(h]j8ah ](jjjkeh"]h$]h&]jojp)jqhuh1jhj8hMhj8hhubjs)}(hhh]h)}(hReads frame from RX FIFOh]hReads frame from RX FIFO}(hj9:hhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj6:hhubah}(h]h ]h"]h$]h&]uh1jrhj8hhhj8hMubeh}(h]h ](j@functioneh"]h$]h&]jj@jjQ:jjQ:jjjuh1jhhhjhNhNubj)}(hX **Parameters** ``struct ctucan_priv *priv`` Pointer to CTU CAN FD's private data ``struct canfd_frame *cf`` Pointer to CAN frame struct ``u32 ffw`` Previously read frame format word **Note** Frame format word must be read separately and provided in 'ffw'.h](h)}(h**Parameters**h]j)}(hj[:h]h Parameters}(hj]:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjY:ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjU:ubj)}(hhh](j)}(hB``struct ctucan_priv *priv`` Pointer to CTU CAN FD's private data h](j)}(h``struct ctucan_priv *priv``h]j)}(hjz:h]hstruct ctucan_priv *priv}(hj|:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjx:ubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjt:ubj)}(hhh]h)}(h$Pointer to CTU CAN FD's private datah]h&Pointer to CTU CAN FD’s private data}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:hMhj:ubah}(h]h ]h"]h$]h&]uh1jhjt:ubeh}(h]h ]h"]h$]h&]uh1jhj:hMhjq:ubj)}(h7``struct canfd_frame *cf`` Pointer to CAN frame struct h](j)}(h``struct canfd_frame *cf``h]j)}(hj:h]hstruct canfd_frame *cf}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj:ubj)}(hhh]h)}(hPointer to CAN frame structh]hPointer to CAN frame struct}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:hMhj:ubah}(h]h ]h"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]uh1jhj:hMhjq:ubj)}(h.``u32 ffw`` Previously read frame format word h](j)}(h ``u32 ffw``h]j)}(hj:h]hu32 ffw}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj:ubj)}(hhh]h)}(h!Previously read frame format wordh]h!Previously read frame format word}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hMhj;ubah}(h]h ]h"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]uh1jhj;hMhjq:ubeh}(h]h ]h"]h$]h&]uh1jhjU:ubh)}(h**Note**h]j)}(hj';h]hNote}(hj);hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%;ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjU:ubh)}(h@Frame format word must be read separately and provided in 'ffw'.h]hDFrame format word must be read separately and provided in ‘ffw’.}(hj=;hhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjU:ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jctucan_rx (C function) c.ctucan_rxhNtauh1jhjhhhNhNubj)}(hhh](j)}(h'int ctucan_rx (struct net_device *ndev)h]j)}(h&int ctucan_rx(struct net_device *ndev)h](j)}(hinth]hint}(hjl;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjh;hhh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMubj)}(h h]h }(hj{;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjh;hhhjz;hMubj)}(h ctucan_rxh]j)}(h ctucan_rxh]h ctucan_rx}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubah}(h]h ](j j eh"]h$]h&]hhuh1jhjh;hhhjz;hMubj)}(h(struct net_device *ndev)h]j)}(hstruct net_device *ndevh](j)}(hj!h]hstruct}(hj;hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj;ubj)}(h h]h }(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubh)}(hhh]j)}(h net_deviceh]h net_device}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetj;modnameN classnameNjYj\)}j_]jb)}jUj;sb c.ctucan_rxasbuh1hhj;ubj)}(h h]h }(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubjv)}(hjh]h*}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj;ubj)}(hndevh]hndev}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj;ubah}(h]h ]h"]h$]h&]hhuh1jhjh;hhhjz;hMubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhjd;hhhjz;hMubah}(h]j_;ah ](jjjkeh"]h$]h&]jojp)jqhuh1jhjz;hMhja;hhubjs)}(hhh]h)}(h=Called from CAN ISR to complete the received frame processingh]h=Called from CAN ISR to complete the received frame processing}(hj,<hhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj)<hhubah}(h]h ]h"]h$]h&]uh1jrhja;hhhjz;hMubeh}(h]h ](j@functioneh"]h$]h&]jj@jjD<jjD<jjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct net_device *ndev`` Pointer to net_device structure **Description** This function is invoked from the CAN isr(poll) to process the Rx frames. It does minimal processing and invokes "netif_receive_skb" to complete further processing. **Return** 1 when frame is passed to the network layer, 0 when the first frame word is read but system is out of free SKBs temporally and left code to resolve SKB allocation later, -``EAGAIN`` in a case of empty Rx FIFO.h](h)}(h**Parameters**h]j)}(hjN<h]h Parameters}(hjP<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjL<ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjH<ubj)}(hhh]j)}(h<``struct net_device *ndev`` Pointer to net_device structure h](j)}(h``struct net_device *ndev``h]j)}(hjm<h]hstruct net_device *ndev}(hjo<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjk<ubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjg<ubj)}(hhh]h)}(hPointer to net_device structureh]hPointer to net_device structure}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hMhj<ubah}(h]h ]h"]h$]h&]uh1jhjg<ubeh}(h]h ]h"]h$]h&]uh1jhj<hMhjd<ubah}(h]h ]h"]h$]h&]uh1jhjH<ubh)}(h**Description**h]j)}(hj<h]h Description}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjH<ubh)}(hThis function is invoked from the CAN isr(poll) to process the Rx frames. It does minimal processing and invokes "netif_receive_skb" to complete further processing.h]hThis function is invoked from the CAN isr(poll) to process the Rx frames. It does minimal processing and invokes “netif_receive_skb” to complete further processing.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjH<ubh)}(h **Return**h]j)}(hj<h]hReturn}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjH<ubj)}(hhh]j)}(h1 when frame is passed to the network layer, 0 when the first frame word is read but system is out of free SKBs temporally and left code to resolve SKB allocation later, -``EAGAIN`` in a case of empty Rx FIFO.h](j)}(hT1 when frame is passed to the network layer, 0 when the first frame word is read buth]hT1 when frame is passed to the network layer, 0 when the first frame word is read but}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj<ubj)}(hhh]h)}(h|system is out of free SKBs temporally and left code to resolve SKB allocation later, -``EAGAIN`` in a case of empty Rx FIFO.h](hVsystem is out of free SKBs temporally and left code to resolve SKB allocation later, -}(hj<hhhNhNubj)}(h ``EAGAIN``h]hEAGAIN}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubh in a case of empty Rx FIFO.}(hj<hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj<hMhj<ubah}(h]h ]h"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]uh1jhj<hMhj<ubah}(h]h ]h"]h$]h&]uh1jhjH<ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j$ctucan_read_fault_state (C function)c.ctucan_read_fault_statehNtauh1jhjhhhNhNubj)}(hhh](j)}(hAenum can_state ctucan_read_fault_state (struct ctucan_priv *priv)h]j)}(h@enum can_state ctucan_read_fault_state(struct ctucan_priv *priv)h](j)}(hj-h]henum}(hjP=hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjL=hhh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMubj)}(h h]h }(hj^=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL=hhhj]=hMubh)}(hhh]j)}(h can_stateh]h can_state}(hjo=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjl=ubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetjq=modnameN classnameNjYj\)}j_]jb)}jUctucan_read_fault_statesbc.ctucan_read_fault_stateasbuh1hhjL=hhhj]=hMubj)}(h h]h }(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL=hhhj]=hMubj)}(hctucan_read_fault_stateh]j)}(hj=h]hctucan_read_fault_state}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ](j j eh"]h$]h&]hhuh1jhjL=hhhj]=hMubj)}(h(struct ctucan_priv *priv)h]j)}(hstruct ctucan_priv *privh](j)}(hj!h]hstruct}(hj=hhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj=ubj)}(h h]h }(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubh)}(hhh]j)}(h ctucan_privh]h ctucan_priv}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetj=modnameN classnameNjYj\)}j_]j=c.ctucan_read_fault_stateasbuh1hhj=ubj)}(h h]h }(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubjv)}(hjh]h*}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj=ubj)}(hprivh]hpriv}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj=ubah}(h]h ]h"]h$]h&]hhuh1jhjL=hhhj]=hMubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhjH=hhhj]=hMubah}(h]jC=ah ](jjjkeh"]h$]h&]jojp)jqhuh1jhj]=hMhjE=hhubjs)}(hhh]h)}(h*Reads CTU CAN FDs fault confinement state.h]h*Reads CTU CAN FDs fault confinement state.}(hj>>hhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj;>hhubah}(h]h ]h"]h$]h&]uh1jrhjE=hhhj]=hMubeh}(h]h ](j@functioneh"]h$]h&]jj@jjV>jjV>jjjuh1jhhhjhNhNubj)}(hy**Parameters** ``struct ctucan_priv *priv`` Pointer to private data **Return** Fault confinement state of controllerh](h)}(h**Parameters**h]j)}(hj`>h]h Parameters}(hjb>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^>ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjZ>ubj)}(hhh]j)}(h5``struct ctucan_priv *priv`` Pointer to private data h](j)}(h``struct ctucan_priv *priv``h]j)}(hj>h]hstruct ctucan_priv *priv}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}>ubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjy>ubj)}(hhh]h)}(hPointer to private datah]hPointer to private data}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hMhj>ubah}(h]h ]h"]h$]h&]uh1jhjy>ubeh}(h]h ]h"]h$]h&]uh1jhj>hMhjv>ubah}(h]h ]h"]h$]h&]uh1jhjZ>ubh)}(h **Return**h]j)}(hj>h]hReturn}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjZ>ubh)}(h%Fault confinement state of controllerh]h%Fault confinement state of controller}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjZ>ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jctucan_get_rec_tec (C function)c.ctucan_get_rec_techNtauh1jhjhhhNhNubj)}(hhh](j)}(hPvoid ctucan_get_rec_tec (struct ctucan_priv *priv, struct can_berr_counter *bec)h]j)}(hOvoid ctucan_get_rec_tec(struct ctucan_priv *priv, struct can_berr_counter *bec)h](j)}(hvoidh]hvoid}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>hhh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMubj)}(h h]h }(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>hhhj ?hMubj)}(hctucan_get_rec_tech]j)}(hctucan_get_rec_tech]hctucan_get_rec_tec}(hj ?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?ubah}(h]h ](j j eh"]h$]h&]hhuh1jhj>hhhj ?hMubj)}(h8(struct ctucan_priv *priv, struct can_berr_counter *bec)h](j)}(hstruct ctucan_priv *privh](j)}(hj!h]hstruct}(hjhhhj ?hMubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhj>hhhj ?hMubah}(h]j>ah ](jjjkeh"]h$]h&]jojp)jqhuh1jhj ?hMhj>hhubjs)}(hhh]h)}(h,Reads REC/TEC counter values from controllerh]h,Reads REC/TEC counter values from controller}(hj/@hhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chM hj,@hhubah}(h]h ]h"]h$]h&]uh1jrhj>hhhj ?hMubeh}(h]h ](j@functioneh"]h$]h&]jj@jjG@jjG@jjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct ctucan_priv *priv`` Pointer to private data ``struct can_berr_counter *bec`` Pointer to Error counter structureh](h)}(h**Parameters**h]j)}(hjQ@h]h Parameters}(hjS@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjO@ubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjK@ubj)}(hhh](j)}(h5``struct ctucan_priv *priv`` Pointer to private data h](j)}(h``struct ctucan_priv *priv``h]j)}(hjp@h]hstruct ctucan_priv *priv}(hjr@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjn@ubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chM hjj@ubj)}(hhh]h)}(hPointer to private datah]hPointer to private data}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hM hj@ubah}(h]h ]h"]h$]h&]uh1jhjj@ubeh}(h]h ]h"]h$]h&]uh1jhj@hM hjg@ubj)}(hC``struct can_berr_counter *bec`` Pointer to Error counter structureh](j)}(h ``struct can_berr_counter *bec``h]j)}(hj@h]hstruct can_berr_counter *bec}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj@ubj)}(hhh]h)}(h"Pointer to Error counter structureh]h"Pointer to Error counter structure}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj@ubah}(h]h ]h"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]uh1jhj@hMhjg@ubeh}(h]h ]h"]h$]h&]uh1jhjK@ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!ctucan_err_interrupt (C function)c.ctucan_err_interrupthNtauh1jhjhhhNhNubj)}(hhh](j)}(hCubj)}(h h]h }(hjOChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>Cubh)}(hhh]j)}(h napi_structh]h napi_struct}(hj`ChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]Cubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetjbCmodnameN classnameNjYj\)}j_]jb)}jUj(Csbc.ctucan_rx_pollasbuh1hhj>Cubj)}(h h]h }(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>Cubjv)}(hjh]h*}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj>Cubj)}(hnapih]hnapi}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>Cubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj:Cubj)}(h int quotah](j)}(hinth]hint}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(h h]h }(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(hquotah]hquota}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj:Cubeh}(h]h ]h"]h$]h&]hhuh1jhjChhhjChMubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhjBhhhjChMubah}(h]jBah ](jjjkeh"]h$]h&]jojp)jqhuh1jhjChMhjBhhubjs)}(hhh]h)}(h"Poll routine for rx packets (NAPI)h]h"Poll routine for rx packets (NAPI)}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjChhubah}(h]h ]h"]h$]h&]uh1jrhjBhhhjChMubeh}(h]h ](j@functioneh"]h$]h&]jj@jjDjjDjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``struct napi_struct *napi`` NAPI structure pointer ``int quota`` Max number of rx packets to be processed. **Description** This is the poll routine for rx part. It will process the packets maximux quota value. **Return** Number of packets receivedh](h)}(h**Parameters**h]j)}(hjDh]h Parameters}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjDubj)}(hhh](j)}(h4``struct napi_struct *napi`` NAPI structure pointer h](j)}(h``struct napi_struct *napi``h]j)}(hj;Dh]hstruct napi_struct *napi}(hj=DhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9Dubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj5Dubj)}(hhh]h)}(hNAPI structure pointerh]hNAPI structure pointer}(hjTDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjPDhMhjQDubah}(h]h ]h"]h$]h&]uh1jhj5Dubeh}(h]h ]h"]h$]h&]uh1jhjPDhMhj2Dubj)}(h8``int quota`` Max number of rx packets to be processed. h](j)}(h ``int quota``h]j)}(hjtDh]h int quota}(hjvDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrDubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjnDubj)}(hhh]h)}(h)Max number of rx packets to be processed.h]h)Max number of rx packets to be processed.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjDhMhjDubah}(h]h ]h"]h$]h&]uh1jhjnDubeh}(h]h ]h"]h$]h&]uh1jhjDhMhj2Dubeh}(h]h ]h"]h$]h&]uh1jhjDubh)}(h**Description**h]j)}(hjDh]h Description}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjDubh)}(hVThis is the poll routine for rx part. It will process the packets maximux quota value.h]hVThis is the poll routine for rx part. It will process the packets maximux quota value.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjDubh)}(h **Return**h]j)}(hjDh]hReturn}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjDubh)}(hNumber of packets receivedh]hNumber of packets received}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjDubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#ctucan_rotate_txb_prio (C function)c.ctucan_rotate_txb_priohNtauh1jhjhhhNhNubj)}(hhh](j)}(h5void ctucan_rotate_txb_prio (struct net_device *ndev)h]j)}(h4void ctucan_rotate_txb_prio(struct net_device *ndev)h](j)}(hvoidh]hvoid}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEhhh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMubj)}(h h]h }(hj*EhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEhhhj)EhMubj)}(hctucan_rotate_txb_prioh]j)}(hctucan_rotate_txb_prioh]hctucan_rotate_txb_prio}(hjEsbc.ctucan_rotate_txb_prioasbuh1hhjTEubj)}(h h]h }(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTEubjv)}(hjh]h*}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjTEubj)}(hndevh]hndev}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTEubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjPEubah}(h]h ]h"]h$]h&]hhuh1jhjEhhhj)EhMubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhjEhhhj)EhMubah}(h]jEah ](jjjkeh"]h$]h&]jojp)jqhuh1jhj)EhMhjEhhubjs)}(hhh]h)}(h!Rotates priorities of TXT Buffersh]h!Rotates priorities of TXT Buffers}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjEhhubah}(h]h ]h"]h$]h&]uh1jrhjEhhhj)EhMubeh}(h]h ](j@functioneh"]h$]h&]jj@jjEjjEjjjuh1jhhhjhNhNubj)}(h@**Parameters** ``struct net_device *ndev`` net_device pointerh](h)}(h**Parameters**h]j)}(hjEh]h Parameters}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjEubj)}(hhh]j)}(h.``struct net_device *ndev`` net_device pointerh](j)}(h``struct net_device *ndev``h]j)}(hjFh]hstruct net_device *ndev}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjFubj)}(hhh]h)}(hnet_device pointerh]hnet_device pointer}(hj5FhhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj2Fubah}(h]h ]h"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]uh1jhj1FhMhjFubah}(h]h ]h"]h$]h&]uh1jhjEubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j ctucan_tx_interrupt (C function)c.ctucan_tx_interrupthNtauh1jhjhhhNhNubj)}(hhh](j)}(h2void ctucan_tx_interrupt (struct net_device *ndev)h]j)}(h1void ctucan_tx_interrupt(struct net_device *ndev)h](j)}(hvoidh]hvoid}(hjvFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrFhhh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMubj)}(h h]h }(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrFhhhjFhMubj)}(hctucan_tx_interrupth]j)}(hctucan_tx_interrupth]hctucan_tx_interrupt}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubah}(h]h ](j j eh"]h$]h&]hhuh1jhjrFhhhjFhMubj)}(h(struct net_device *ndev)h]j)}(hstruct net_device *ndevh](j)}(hj!h]hstruct}(hjFhhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjFubj)}(h h]h }(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubh)}(hhh]j)}(h net_deviceh]h net_device}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetjFmodnameN classnameNjYj\)}j_]jb)}jUjFsbc.ctucan_tx_interruptasbuh1hhjFubj)}(h h]h }(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubjv)}(hjh]h*}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjFubj)}(hndevh]hndev}(hj GhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjFubah}(h]h ]h"]h$]h&]hhuh1jhjrFhhhjFhMubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhjnFhhhjFhMubah}(h]jiFah ](jjjkeh"]h$]h&]jojp)jqhuh1jhjFhMhjkFhhubjs)}(hhh]h)}(h Tx done Isrh]h Tx done Isr}(hj6GhhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj3Ghhubah}(h]h ]h"]h$]h&]uh1jrhjkFhhhjFhMubeh}(h]h ](j@functioneh"]h$]h&]jj@jjNGjjNGjjjuh1jhhhjhNhNubj)}(h@**Parameters** ``struct net_device *ndev`` net_device pointerh](h)}(h**Parameters**h]j)}(hjXGh]h Parameters}(hjZGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVGubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjRGubj)}(hhh]j)}(h.``struct net_device *ndev`` net_device pointerh](j)}(h``struct net_device *ndev``h]j)}(hjwGh]hstruct net_device *ndev}(hjyGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuGubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjqGubj)}(hhh]h)}(hnet_device pointerh]hnet_device pointer}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjGubah}(h]h ]h"]h$]h&]uh1jhjqGubeh}(h]h ]h"]h$]h&]uh1jhjGhMhjnGubah}(h]h ]h"]h$]h&]uh1jhjRGubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jctucan_interrupt (C function)c.ctucan_interrupthNtauh1jhjhhhNhNubj)}(hhh](j)}(h4irqreturn_t ctucan_interrupt (int irq, void *dev_id)h]j)}(h3irqreturn_t ctucan_interrupt(int irq, void *dev_id)h](h)}(hhh]j)}(h irqreturn_th]h irqreturn_t}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetjGmodnameN classnameNjYj\)}j_]jb)}jUctucan_interruptsbc.ctucan_interruptasbuh1hhjGhhh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMMubj)}(h h]h }(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGhhhjGhMMubj)}(hctucan_interrupth]j)}(hjGh]hctucan_interrupt}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubah}(h]h ](j j eh"]h$]h&]hhuh1jhjGhhhjGhMMubj)}(h(int irq, void *dev_id)h](j)}(hint irqh](j)}(hinth]hint}(hj#HhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj)}(h h]h }(hj1HhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj)}(hirqh]hirq}(hj?HhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjHubj)}(h void *dev_idh](j)}(hvoidh]hvoid}(hjXHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTHubj)}(h h]h }(hjfHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTHubjv)}(hjh]h*}(hjtHhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjTHubj)}(hdev_idh]hdev_id}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTHubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjHubeh}(h]h ]h"]h$]h&]hhuh1jhjGhhhjGhMMubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhjGhhhjGhMMubah}(h]jGah ](jjjkeh"]h$]h&]jojp)jqhuh1jhjGhMMhjGhhubjs)}(hhh]h)}(hCAN Isrh]hCAN Isr}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMChjHhhubah}(h]h ]h"]h$]h&]uh1jrhjGhhhjGhMMubeh}(h]h ](j@functioneh"]h$]h&]jj@jjHjjHjjjuh1jhhhjhNhNubj)}(hX**Parameters** ``int irq`` irq number ``void *dev_id`` device id pointer **Description** This is the CTU CAN FD ISR. It checks for the type of interrupt and invokes the corresponding ISR. **Return** IRQ_NONE - If CAN device is in sleep mode, IRQ_HANDLED otherwiseh](h)}(h**Parameters**h]j)}(hjHh]h Parameters}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMGhjHubj)}(hhh](j)}(h``int irq`` irq number h](j)}(h ``int irq``h]j)}(hjHh]hint irq}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMDhjHubj)}(hhh]h)}(h irq numberh]h irq number}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjIhMDhjIubah}(h]h ]h"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]uh1jhjIhMDhjHubj)}(h#``void *dev_id`` device id pointer h](j)}(h``void *dev_id``h]j)}(hj%Ih]h void *dev_id}(hj'IhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#Iubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMEhjIubj)}(hhh]h)}(hdevice id pointerh]hdevice id pointer}(hj>IhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:IhMEhj;Iubah}(h]h ]h"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]uh1jhj:IhMEhjHubeh}(h]h ]h"]h$]h&]uh1jhjHubh)}(h**Description**h]j)}(hj`Ih]h Description}(hjbIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^Iubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMGhjHubh)}(hbThis is the CTU CAN FD ISR. It checks for the type of interrupt and invokes the corresponding ISR.h]hbThis is the CTU CAN FD ISR. It checks for the type of interrupt and invokes the corresponding ISR.}(hjvIhhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMGhjHubh)}(h **Return**h]j)}(hjIh]hReturn}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMJhjHubh)}(h@IRQ_NONE - If CAN device is in sleep mode, IRQ_HANDLED otherwiseh]h@IRQ_NONE - If CAN device is in sleep mode, IRQ_HANDLED otherwise}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMJhjHubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jctucan_chip_stop (C function)c.ctucan_chip_stophNtauh1jhjhhhNhNubj)}(hhh](j)}(h/void ctucan_chip_stop (struct net_device *ndev)h]j)}(h.void ctucan_chip_stop(struct net_device *ndev)h](j)}(hvoidh]hvoid}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIhhh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMubj)}(h h]h }(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIhhhjIhMubj)}(hctucan_chip_stoph]j)}(hctucan_chip_stoph]hctucan_chip_stop}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubah}(h]h ](j j eh"]h$]h&]hhuh1jhjIhhhjIhMubj)}(h(struct net_device *ndev)h]j)}(hstruct net_device *ndevh](j)}(hj!h]hstruct}(hj JhhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjJubj)}(h h]h }(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubh)}(hhh]j)}(h net_deviceh]h net_device}(hj'JhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$Jubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetj)JmodnameN classnameNjYj\)}j_]jb)}jUjIsbc.ctucan_chip_stopasbuh1hhjJubj)}(h h]h }(hjGJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubjv)}(hjh]h*}(hjUJhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjJubj)}(hndevh]hndev}(hjbJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjJubah}(h]h ]h"]h$]h&]hhuh1jhjIhhhjIhMubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhjIhhhjIhMubah}(h]jIah ](jjjkeh"]h$]h&]jojp)jqhuh1jhjIhMhjIhhubjs)}(hhh]h)}(hDriver stop routineh]hDriver stop routine}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjJhhubah}(h]h ]h"]h$]h&]uh1jrhjIhhhjIhMubeh}(h]h ](j@functioneh"]h$]h&]jj@jjJjjJjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct net_device *ndev`` Pointer to net_device structure **Description** This is the drivers stop routine. It will disable the interrupts and disable the controller.h](h)}(h**Parameters**h]j)}(hjJh]h Parameters}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjJubj)}(hhh]j)}(h<``struct net_device *ndev`` Pointer to net_device structure h](j)}(h``struct net_device *ndev``h]j)}(hjJh]hstruct net_device *ndev}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjJubj)}(hhh]h)}(hPointer to net_device structureh]hPointer to net_device structure}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhMhjJubah}(h]h ]h"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]uh1jhjJhMhjJubah}(h]h ]h"]h$]h&]uh1jhjJubh)}(h**Description**h]j)}(hjKh]h Description}(hj KhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjJubh)}(h\This is the drivers stop routine. It will disable the interrupts and disable the controller.h]h\This is the drivers stop routine. It will disable the interrupts and disable the controller.}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjJubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jctucan_open (C function) c.ctucan_openhNtauh1jhjhhhNhNubj)}(hhh](j)}(h)int ctucan_open (struct net_device *ndev)h]j)}(h(int ctucan_open(struct net_device *ndev)h](j)}(hinth]hint}(hjMKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIKhhh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMubj)}(h h]h }(hj\KhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIKhhhj[KhMubj)}(h ctucan_openh]j)}(h ctucan_openh]h ctucan_open}(hjnKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjKubah}(h]h ](j j eh"]h$]h&]hhuh1jhjIKhhhj[KhMubj)}(h(struct net_device *ndev)h]j)}(hstruct net_device *ndevh](j)}(hj!h]hstruct}(hjKhhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjKubj)}(h h]h }(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubh)}(hhh]j)}(h net_deviceh]h net_device}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetjKmodnameN classnameNjYj\)}j_]jb)}jUjpKsb c.ctucan_openasbuh1hhjKubj)}(h h]h }(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubjv)}(hjh]h*}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjKubj)}(hndevh]hndev}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjKubah}(h]h ]h"]h$]h&]hhuh1jhjIKhhhj[KhMubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhjEKhhhj[KhMubah}(h]j@Kah ](jjjkeh"]h$]h&]jojp)jqhuh1jhj[KhMhjBKhhubjs)}(hhh]h)}(hDriver open routineh]hDriver open routine}(hj LhhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj Lhhubah}(h]h ]h"]h$]h&]uh1jrhjBKhhhj[KhMubeh}(h]h ](j@functioneh"]h$]h&]jj@jj%Ljj%Ljjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct net_device *ndev`` Pointer to net_device structure **Description** This is the driver open routine. **Return** 0 on success and failure value on errorh](h)}(h**Parameters**h]j)}(hj/Lh]h Parameters}(hj1LhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-Lubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj)Lubj)}(hhh]j)}(h<``struct net_device *ndev`` Pointer to net_device structure h](j)}(h``struct net_device *ndev``h]j)}(hjNLh]hstruct net_device *ndev}(hjPLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLLubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjHLubj)}(hhh]h)}(hPointer to net_device structureh]hPointer to net_device structure}(hjgLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjcLhMhjdLubah}(h]h ]h"]h$]h&]uh1jhjHLubeh}(h]h ]h"]h$]h&]uh1jhjcLhMhjELubah}(h]h ]h"]h$]h&]uh1jhj)Lubh)}(h**Description**h]j)}(hjLh]h Description}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj)Lubh)}(h This is the driver open routine.h]h This is the driver open routine.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj)Lubh)}(h **Return**h]j)}(hjLh]hReturn}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj)Lubh)}(h'0 on success and failure value on errorh]h'0 on success and failure value on error}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhj)Lubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jctucan_close (C function)c.ctucan_closehNtauh1jhjhhhNhNubj)}(hhh](j)}(h*int ctucan_close (struct net_device *ndev)h]j)}(h)int ctucan_close(struct net_device *ndev)h](j)}(hinth]hint}(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLhhh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMubj)}(h h]h }(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjLhhhjMhMubj)}(h ctucan_closeh]j)}(h ctucan_closeh]h ctucan_close}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMubah}(h]h ](j j eh"]h$]h&]hhuh1jhjLhhhjMhMubj)}(h(struct net_device *ndev)h]j)}(hstruct net_device *ndevh](j)}(hj!h]hstruct}(hj2MhhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj.Mubj)}(h h]h }(hj?MhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.Mubh)}(hhh]j)}(h net_deviceh]h net_device}(hjPMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjMMubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetjRMmodnameN classnameNjYj\)}j_]jb)}jUjMsbc.ctucan_closeasbuh1hhj.Mubj)}(h h]h }(hjpMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.Mubjv)}(hjh]h*}(hj~MhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj.Mubj)}(hndevh]hndev}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.Mubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj*Mubah}(h]h ]h"]h$]h&]hhuh1jhjLhhhjMhMubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhjLhhhjMhMubah}(h]jLah ](jjjkeh"]h$]h&]jojp)jqhuh1jhjMhMhjLhhubjs)}(hhh]h)}(hDriver close routineh]hDriver close routine}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjMhhubah}(h]h ]h"]h$]h&]uh1jrhjLhhhjMhMubeh}(h]h ](j@functioneh"]h$]h&]jj@jjMjjMjjjuh1jhhhjhNhNubj)}(hc**Parameters** ``struct net_device *ndev`` Pointer to net_device structure **Return** 0 alwaysh](h)}(h**Parameters**h]j)}(hjMh]h Parameters}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjMubj)}(hhh]j)}(h<``struct net_device *ndev`` Pointer to net_device structure h](j)}(h``struct net_device *ndev``h]j)}(hjMh]hstruct net_device *ndev}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjMubj)}(hhh]h)}(hPointer to net_device structureh]hPointer to net_device structure}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj NhMhj Nubah}(h]h ]h"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]uh1jhj NhMhjMubah}(h]h ]h"]h$]h&]uh1jhjMubh)}(h **Return**h]j)}(hj1Nh]hReturn}(hj3NhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/Nubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjMubh)}(h0 alwaysh]h0 always}(hjGNhhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMhjMubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j$ctucan_get_berr_counter (C function)c.ctucan_get_berr_counterhNtauh1jhjhhhNhNubj)}(hhh](j)}(hYint ctucan_get_berr_counter (const struct net_device *ndev, struct can_berr_counter *bec)h]j)}(hXint ctucan_get_berr_counter(const struct net_device *ndev, struct can_berr_counter *bec)h](j)}(hinth]hint}(hjvNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrNhhh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:526: ./drivers/net/can/ctucanfd/ctucanfd_base.chMubj)}(h h]h }(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjrNhhhjNhMubj)}(hctucan_get_berr_counterh]j)}(hctucan_get_berr_counterh]hctucan_get_berr_counter}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubah}(h]h ](j j eh"]h$]h&]hhuh1jhjrNhhhjNhMubj)}(h=(const struct net_device *ndev, struct can_berr_counter *bec)h](j)}(hconst struct net_device *ndevh](j)}(hjh]hconst}(hjNhhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjNubj)}(h h]h }(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubj)}(hj!h]hstruct}(hjNhhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjNubj)}(h h]h }(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubh)}(hhh]j)}(h net_deviceh]h net_device}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetjNmodnameN classnameNjYj\)}j_]jb)}jUjNsbc.ctucan_get_berr_counterasbuh1hhjNubj)}(h h]h }(hj OhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubjv)}(hjh]h*}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjNubj)}(hndevh]hndev}(hj'OhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjNubj)}(hstruct can_berr_counter *bech](j)}(hj!h]hstruct}(hj@OhhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjThis function frees all the resources allocated to the device.h]h>This function frees all the resources allocated to the device.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:529: ./drivers/net/can/ctucanfd/ctucanfd_pci.chKhj*Tubh)}(h **Return**h]j)}(hjTh]hReturn}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:529: ./drivers/net/can/ctucanfd/ctucanfd_pci.chKhj*Tubh)}(h0 alwaysh]h0 always}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:529: ./drivers/net/can/ctucanfd/ctucanfd_pci.chKhj*Tubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"ctucan_platform_probe (C function)c.ctucan_platform_probehNtauh1jhjhhhNhNubj)}(hhh](j)}(h8int ctucan_platform_probe (struct platform_device *pdev)h]j)}(h7int ctucan_platform_probe(struct platform_device *pdev)h](j)}(hinth]hint}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjThhh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:532: ./drivers/net/can/ctucanfd/ctucanfd_platform.chK0ubj)}(h h]h }(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjThhhjUhK0ubj)}(hctucan_platform_probeh]j)}(hctucan_platform_probeh]hctucan_platform_probe}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubah}(h]h ](j j eh"]h$]h&]hhuh1jhjThhhjUhK0ubj)}(h(struct platform_device *pdev)h]j)}(hstruct platform_device *pdevh](j)}(hj!h]hstruct}(hj3UhhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhj/Uubj)}(h h]h }(hj@UhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/Uubh)}(hhh]j)}(hplatform_deviceh]hplatform_device}(hjQUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNUubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetjSUmodnameN classnameNjYj\)}j_]jb)}jUjUsbc.ctucan_platform_probeasbuh1hhj/Uubj)}(h h]h }(hjqUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/Uubjv)}(hjh]h*}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhj/Uubj)}(hpdevh]hpdev}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/Uubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj+Uubah}(h]h ]h"]h$]h&]hhuh1jhjThhhjUhK0ubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhjThhhjUhK0ubah}(h]jTah ](jjjkeh"]h$]h&]jojp)jqhuh1jhjUhK0hjThhubjs)}(hhh]h)}(hPlatform registration callh]hPlatform registration call}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:532: ./drivers/net/can/ctucanfd/ctucanfd_platform.chK(hjUhhubah}(h]h ]h"]h$]h&]uh1jrhjThhhjUhK0ubeh}(h]h ](j@functioneh"]h$]h&]jj@jjUjjUjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct platform_device *pdev`` Handle to the platform device structure **Description** This function does all the memory allocation and registration for the CAN device. **Return** 0 on success and failure value on errorh](h)}(h**Parameters**h]j)}(hjUh]h Parameters}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:532: ./drivers/net/can/ctucanfd/ctucanfd_platform.chK,hjUubj)}(hhh]j)}(hI``struct platform_device *pdev`` Handle to the platform device structure h](j)}(h ``struct platform_device *pdev``h]j)}(hjUh]hstruct platform_device *pdev}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:532: ./drivers/net/can/ctucanfd/ctucanfd_platform.chK)hjUubj)}(hhh]h)}(h'Handle to the platform device structureh]h'Handle to the platform device structure}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj VhK)hj Vubah}(h]h ]h"]h$]h&]uh1jhjUubeh}(h]h ]h"]h$]h&]uh1jhj VhK)hjUubah}(h]h ]h"]h$]h&]uh1jhjUubh)}(h**Description**h]j)}(hj2Vh]h Description}(hj4VhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0Vubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:532: ./drivers/net/can/ctucanfd/ctucanfd_platform.chK+hjUubh)}(hQThis function does all the memory allocation and registration for the CAN device.h]hQThis function does all the memory allocation and registration for the CAN device.}(hjHVhhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:532: ./drivers/net/can/ctucanfd/ctucanfd_platform.chK+hjUubh)}(h **Return**h]j)}(hjYVh]hReturn}(hj[VhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWVubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:532: ./drivers/net/can/ctucanfd/ctucanfd_platform.chK.hjUubh)}(h'0 on success and failure value on errorh]h'0 on success and failure value on error}(hjoVhhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:532: ./drivers/net/can/ctucanfd/ctucanfd_platform.chK.hjUubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j#ctucan_platform_remove (C function)c.ctucan_platform_removehNtauh1jhjhhhNhNubj)}(hhh](j)}(h:void ctucan_platform_remove (struct platform_device *pdev)h]j)}(h9void ctucan_platform_remove(struct platform_device *pdev)h](j)}(hvoidh]hvoid}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVhhh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:532: ./drivers/net/can/ctucanfd/ctucanfd_platform.chKYubj)}(h h]h }(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVhhhjVhKYubj)}(hctucan_platform_removeh]j)}(hctucan_platform_removeh]hctucan_platform_remove}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubah}(h]h ](j j eh"]h$]h&]hhuh1jhjVhhhjVhKYubj)}(h(struct platform_device *pdev)h]j)}(hstruct platform_device *pdevh](j)}(hj!h]hstruct}(hjVhhhNhNubah}(h]h ]j*ah"]h$]h&]uh1jhjVubj)}(h h]h }(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubh)}(hhh]j)}(hplatform_deviceh]hplatform_device}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&] refdomainj@reftypejU reftargetjVmodnameN classnameNjYj\)}j_]jb)}jUjVsbc.ctucan_platform_removeasbuh1hhjVubj)}(h h]h }(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubjv)}(hjh]h*}(hj'WhhhNhNubah}(h]h ]jah"]h$]h&]uh1juhjVubj)}(hpdevh]hpdev}(hj4WhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjVubah}(h]h ]h"]h$]h&]hhuh1jhjVhhhjVhKYubeh}(h]h ]h"]h$]h&]hhjduh1jjejfhjVhhhjVhKYubah}(h]jVah ](jjjkeh"]h$]h&]jojp)jqhuh1jhjVhKYhjVhhubjs)}(hhh]h)}(h3Unregister the device after releasing the resourcesh]h3Unregister the device after releasing the resources}(hj^WhhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:532: ./drivers/net/can/ctucanfd/ctucanfd_platform.chKShj[Whhubah}(h]h ]h"]h$]h&]uh1jrhjVhhhjVhKYubeh}(h]h ](j@functioneh"]h$]h&]jj@jjvWjjvWjjjuh1jhhhjhNhNubj)}(h**Parameters** ``struct platform_device *pdev`` Handle to the platform device structure **Description** This function frees all the resources allocated to the device. **Return** 0 alwaysh](h)}(h**Parameters**h]j)}(hjWh]h Parameters}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~Wubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:532: ./drivers/net/can/ctucanfd/ctucanfd_platform.chKWhjzWubj)}(hhh]j)}(hI``struct platform_device *pdev`` Handle to the platform device structure h](j)}(h ``struct platform_device *pdev``h]j)}(hjWh]hstruct platform_device *pdev}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1jh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:532: ./drivers/net/can/ctucanfd/ctucanfd_platform.chKThjWubj)}(hhh]h)}(h'Handle to the platform device structureh]h'Handle to the platform device structure}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjWhKThjWubah}(h]h ]h"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]uh1jhjWhKThjWubah}(h]h ]h"]h$]h&]uh1jhjzWubh)}(h**Description**h]j)}(hjWh]h Description}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:532: ./drivers/net/can/ctucanfd/ctucanfd_platform.chKVhjzWubh)}(h>This function frees all the resources allocated to the device.h]h>This function frees all the resources allocated to the device.}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:532: ./drivers/net/can/ctucanfd/ctucanfd_platform.chKVhjzWubh)}(h **Return**h]j)}(hjXh]hReturn}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:532: ./drivers/net/can/ctucanfd/ctucanfd_platform.chKXhjzWubh)}(h0 alwaysh]h0 always}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hh/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/can/ctu/ctucanfd-driver:532: ./drivers/net/can/ctucanfd/ctucanfd_platform.chKWhjzWubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubeh}(h]#ctu-can-fd-driver-sources-referenceah ]h"]#ctu can fd driver sources referenceah$]h&]uh1hhhhhhhhM ubh)}(hhh](h)}(h8CTU CAN FD IP Core and Driver Development Acknowledgmenth]h8CTU CAN FD IP Core and Driver Development Acknowledgment}(hj8XhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5XhhhhhMubj)}(hhh](j)}(hOdrej Ille * started the project as student at Department of Measurement, FEE, CTU * invested great amount of personal time and enthusiasm to the project over years * worked on more funded tasks h](h)}(h"Odrej Ille h](h Odrej Ille <}(hjMXhhhNhNubh)}(hondrej.ille@gmail.comh]hondrej.ille@gmail.com}(hjUXhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:ondrej.ille@gmail.comuh1hhjMXubh>}(hjMXhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjIXubj)}(hhh](j)}(hEstarted the project as student at Department of Measurement, FEE, CTUh]h)}(hjtXh]hEstarted the project as student at Department of Measurement, FEE, CTU}(hjvXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjrXubah}(h]h ]h"]h$]h&]uh1jhjoXubj)}(hOinvested great amount of personal time and enthusiasm to the project over yearsh]h)}(hjXh]hOinvested great amount of personal time and enthusiasm to the project over years}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjXubah}(h]h ]h"]h$]h&]uh1jhjoXubj)}(hworked on more funded tasks h]h)}(hworked on more funded tasksh]hworked on more funded tasks}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjXubah}(h]h ]h"]h$]h&]uh1jhjoXubeh}(h]h ]h"]h$]h&]jLjuh1jhhhMhjIXubeh}(h]h ]h"]h$]h&]uh1jhjFXhhhNhNubj)}(hXU`Department of Measurement `_, `Faculty of Electrical Engineering `_, `Czech Technical University `_ * is the main investor into the project over many years * uses project in their CAN/CAN FD diagnostics framework for `Skoda Auto `_ h](h)}(h`Department of Measurement `_, `Faculty of Electrical Engineering `_, `Czech Technical University `_h](h)}(h8`Department of Measurement `_h]hDepartment of Measurement}(hjXhhhNhNubah}(h]h ]h"]h$]h&]nameDepartment of Measurementjhttps://meas.fel.cvut.cz/uh1hhjXubj)}(h h]h}(h]id8ah ]h"]h$]department of measurementah&]refurijXuh1jj%KhjXubh, }(hjXhhhNhNubh)}(hA`Faculty of Electrical Engineering `_h]h!Faculty of Electrical Engineering}(hjXhhhNhNubah}(h]h ]h"]h$]h&]name!Faculty of Electrical Engineeringjhttp://www.fel.cvut.cz/en/uh1hhjXubj)}(h h]h}(h]!faculty-of-electrical-engineeringah ]h"]!faculty of electrical engineeringah$]h&]refurijXuh1jj%KhjXubh, }hjXsbh)}(h6`Czech Technical University `_h]hCzech Technical University}(hjYhhhNhNubah}(h]h ]h"]h$]h&]nameCzech Technical Universityjhttps://www.cvut.cz/enuh1hhjXubj)}(h h]h}(h]czech-technical-universityah ]h"]czech technical universityah$]h&]refurij Yuh1jj%KhjXubeh}(h]h ]h"]h$]h&]uh1hhhhM hjXubj)}(hhh](j)}(h5is the main investor into the project over many yearsh]h)}(hj9Yh]h5is the main investor into the project over many years}(hj;YhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM$hj7Yubah}(h]h ]h"]h$]h&]uh1jhj4Yubj)}(hfuses project in their CAN/CAN FD diagnostics framework for `Skoda Auto `_ h]h)}(heuses project in their CAN/CAN FD diagnostics framework for `Skoda Auto `_h](h;uses project in their CAN/CAN FD diagnostics framework for }(hjRYhhhNhNubh)}(h*`Skoda Auto `_h]h Skoda Auto}(hjZYhhhNhNubah}(h]h ]h"]h$]h&]name Skoda Autojhttps://www.skoda-auto.cz/uh1hhjRYubj)}(h h]h}(h] skoda-autoah ]h"] skoda autoah$]h&]refurijjYuh1jj%KhjRYubeh}(h]h ]h"]h$]h&]uh1hhhhM%hjNYubah}(h]h ]h"]h$]h&]uh1jhj4Yubeh}(h]h ]h"]h$]h&]jLjuh1jhhhM$hjXubeh}(h]h ]h"]h$]h&]uh1jhjFXhhhNhNubj)}(h`Digiteq Automotive `_ * funding of the project CAN FD Open Cores Support Linux Kernel Based Systems * negotiated and paid CTU to allow public access to the project * provided additional funding of the work h](h)}(h<`Digiteq Automotive `_h](h)}(hjYh]hDigiteq Automotive}(hjYhhhNhNubah}(h]h ]h"]h$]h&]nameDigiteq Automotivej$https://www.digiteqautomotive.com/enuh1hhjYubj)}(h' h]h}(h]digiteq-automotiveah ]h"]digiteq automotiveah$]h&]refurijYuh1jj%KhjYubeh}(h]h ]h"]h$]h&]uh1hhhhM'hjYubj)}(hhh](j)}(hKfunding of the project CAN FD Open Cores Support Linux Kernel Based Systemsh]h)}(hjYh]hKfunding of the project CAN FD Open Cores Support Linux Kernel Based Systems}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM)hjYubah}(h]h ]h"]h$]h&]uh1jhjYubj)}(h=negotiated and paid CTU to allow public access to the projecth]h)}(hjYh]h=negotiated and paid CTU to allow public access to the project}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM*hjYubah}(h]h ]h"]h$]h&]uh1jhjYubj)}(h(provided additional funding of the work h]h)}(h'provided additional funding of the workh]h'provided additional funding of the work}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM+hjYubah}(h]h ]h"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]jLjuh1jhhhM)hjYubeh}(h]h ]h"]h$]h&]uh1jhjFXhhhNhNubj)}(hX`Department of Control Engineering `_, `Faculty of Electrical Engineering `_, `Czech Technical University `_ * solving the project CAN FD Open Cores Support Linux Kernel Based Systems * providing GitLab management * virtual servers and computational power for continuous integration * providing hardware for HIL continuous integration tests h](h)}(h`Department of Control Engineering `_, `Faculty of Electrical Engineering `_, `Czech Technical University `_h](h)}(hE`Department of Control Engineering `_h]h!Department of Control Engineering}(hjZhhhNhNubah}(h]h ]h"]h$]h&]name!Department of Control Engineeringjhttps://control.fel.cvut.cz/enuh1hhjZubj)}(h! h]h}(h]!department-of-control-engineeringah ]h"]!department of control engineeringah$]h&]refurij(Zuh1jj%KhjZubh, }(hjZhhhNhNubh)}(hA`Faculty of Electrical Engineering `_h]h!Faculty of Electrical Engineering}(hj:ZhhhNhNubah}(h]h ]h"]h$]h&]name!Faculty of Electrical Engineeringjhttp://www.fel.cvut.cz/en/uh1hhjZubj)}(h h]h}(h]id9ah ]h"]h$]!faculty of electrical engineeringah&]refurijJZuh1jj%KhjZubh, }hjZsbh)}(h6`Czech Technical University `_h]hCzech Technical University}(hj\ZhhhNhNubah}(h]h ]h"]h$]h&]nameCzech Technical Universityjhttps://www.cvut.cz/enuh1hhjZubj)}(h h]h}(h]id10ah ]h"]h$]czech technical universityah&]refurijlZuh1jj%KhjZubeh}(h]h ]h"]h$]h&]uh1hhhhM-hjZubj)}(hhh](j)}(hHsolving the project CAN FD Open Cores Support Linux Kernel Based Systemsh]h)}(hjZh]hHsolving the project CAN FD Open Cores Support Linux Kernel Based Systems}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM1hjZubah}(h]h ]h"]h$]h&]uh1jhjZubj)}(hproviding GitLab managementh]h)}(hjZh]hproviding GitLab management}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM2hjZubah}(h]h ]h"]h$]h&]uh1jhjZubj)}(hBvirtual servers and computational power for continuous integrationh]h)}(hjZh]hBvirtual servers and computational power for continuous integration}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM3hjZubah}(h]h ]h"]h$]h&]uh1jhjZubj)}(h8providing hardware for HIL continuous integration tests h]h)}(h7providing hardware for HIL continuous integration testsh]h7providing hardware for HIL continuous integration tests}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM4hjZubah}(h]h ]h"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]jLjuh1jhhhM1hjZubeh}(h]h ]h"]h$]h&]uh1jhjFXhhhNhNubj)}(hj`PiKRON Ltd. `_ * minor funding to initiate preparation of the project open-sourcing h](h)}(h#`PiKRON Ltd. `_h](h)}(hjZh]h PiKRON Ltd.}(hjZhhhNhNubah}(h]h ]h"]h$]h&]name PiKRON Ltd.jhttp://pikron.com/uh1hhjZubj)}(h h]h}(h] pikron-ltdah ]h"] pikron ltd.ah$]h&]refurij[uh1jj%KhjZubeh}(h]h ]h"]h$]h&]uh1hhhhM6hjZubj)}(hhh]j)}(hCminor funding to initiate preparation of the project open-sourcing h]h)}(hBminor funding to initiate preparation of the project open-sourcingh]hBminor funding to initiate preparation of the project open-sourcing}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM8hj[ubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]jLjuh1jhhhM8hjZubeh}(h]h ]h"]h$]h&]uh1jhjFXhhhNhNubj)}(hPetr Porazil * design of PCIe transceiver addon board and assembly of boards * design and assembly of MZ_APO baseboard for MicroZed/Zynq based system h](h)}(h!Petr Porazil h](hPetr Porazil <}(hjB[hhhNhNubh)}(hporazil@pikron.comh]hporazil@pikron.com}(hjJ[hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:porazil@pikron.comuh1hhjB[ubh>}(hjB[hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM:hj>[ubj)}(hhh](j)}(h=design of PCIe transceiver addon board and assembly of boardsh]h)}(hji[h]h=design of PCIe transceiver addon board and assembly of boards}(hjk[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM<hjg[ubah}(h]h ]h"]h$]h&]uh1jhjd[ubj)}(hGdesign and assembly of MZ_APO baseboard for MicroZed/Zynq based system h]h)}(hFdesign and assembly of MZ_APO baseboard for MicroZed/Zynq based systemh]hFdesign and assembly of MZ_APO baseboard for MicroZed/Zynq based system}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM=hj~[ubah}(h]h ]h"]h$]h&]uh1jhjd[ubeh}(h]h ]h"]h$]h&]jLjuh1jhhhM<hj>[ubeh}(h]h ]h"]h$]h&]uh1jhjFXhhhNhNubj)}(hX5Martin Jerabek * Linux driver development * continuous integration platform architect and GHDL updates * thesis `Open-source and Open-hardware CAN FD Protocol Support `_ h](h)}(h+Martin Jerabek h](hMartin Jerabek <}(hj[hhhNhNubh)}(hmartin.jerabek01@gmail.comh]hmartin.jerabek01@gmail.com}(hj[hhhNhNubah}(h]h ]h"]h$]h&]refuri!mailto:martin.jerabek01@gmail.comuh1hhj[ubh>}(hj[hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM?hj[ubj)}(hhh](j)}(hLinux driver developmenth]h)}(hj[h]hLinux driver development}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMAhj[ubah}(h]h ]h"]h$]h&]uh1jhj[ubj)}(h:continuous integration platform architect and GHDL updatesh]h)}(hj[h]h:continuous integration platform architect and GHDL updates}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMBhj[ubah}(h]h ]h"]h$]h&]uh1jhj[ubj)}(hthesis `Open-source and Open-hardware CAN FD Protocol Support `_ h]h)}(hthesis `Open-source and Open-hardware CAN FD Protocol Support `_h](hthesis }(hj[hhhNhNubh)}(h`Open-source and Open-hardware CAN FD Protocol Support `_h]h5Open-source and Open-hardware CAN FD Protocol Support}(hj\hhhNhNubah}(h]h ]h"]h$]h&]name5Open-source and Open-hardware CAN FD Protocol Supportjkhttps://dspace.cvut.cz/bitstream/handle/10467/80366/F3-DP-2019-Jerabek-Martin-Jerabek-thesis-2019-canfd.pdfuh1hhj[ubj)}(hn h]h}(h]5open-source-and-open-hardware-can-fd-protocol-supportah ]h"]5open-source and open-hardware can fd protocol supportah$]h&]refurij\uh1jj%Khj[ubeh}(h]h ]h"]h$]h&]uh1hhhhMChj[ubah}(h]h ]h"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]jLjuh1jhhhMAhj[ubeh}(h]h ]h"]h$]h&]uh1jhjFXhhhNhNubj)}(hqJiri Novak * project initiation, management and use at Department of Measurement, FEE, CTU h](h)}(hJiri Novak h](h Jiri Novak <}(hj?\hhhNhNubh)}(hjnovak@fel.cvut.czh]hjnovak@fel.cvut.cz}(hjG\hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:jnovak@fel.cvut.czuh1hhj?\ubh>}(hj?\hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMEhj;\ubj)}(hhh]j)}(hNproject initiation, management and use at Department of Measurement, FEE, CTU h]h)}(hMproject initiation, management and use at Department of Measurement, FEE, CTUh]hMproject initiation, management and use at Department of Measurement, FEE, CTU}(hjh\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMGhjd\ubah}(h]h ]h"]h$]h&]uh1jhja\ubah}(h]h ]h"]h$]h&]jLjuh1jhhhMGhj;\ubeh}(h]h ]h"]h$]h&]uh1jhjFXhhhNhNubj)}(hPavel Pisa * initiate open-sourcing, project coordination, management at Department of Control Engineering, FEE, CTU h](h)}(h"Pavel Pisa h](h Pavel Pisa <}(hj\hhhNhNubh)}(hpisa@cmp.felk.cvut.czh]hpisa@cmp.felk.cvut.cz}(hj\hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:pisa@cmp.felk.cvut.czuh1hhj\ubh>}(hj\hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMIhj\ubj)}(hhh]j)}(hhinitiate open-sourcing, project coordination, management at Department of Control Engineering, FEE, CTU h]h)}(hginitiate open-sourcing, project coordination, management at Department of Control Engineering, FEE, CTUh]hginitiate open-sourcing, project coordination, management at Department of Control Engineering, FEE, CTU}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMKhj\ubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]jLjuh1jhhhMKhj\ubeh}(h]h ]h"]h$]h&]uh1jhjFXhhhNhNubj)}(h%Jaroslav Beran h]h)}(h$Jaroslav Beranh](hJaroslav Beran<}(hj\hhhNhNubh)}(hjara.beran@gmail.comh]hjara.beran@gmail.com}(hj\hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:jara.beran@gmail.comuh1hhj\ubh>}(hj\hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMMhj\ubah}(h]h ]h"]h$]h&]uh1jhjFXhhhhhNubeh}(h]h ]h"]h$]h&]jLjuh1jhhhMhj5Xhhubh block_quote)}(hH* system integration for Intel SoC, core and driver testing and updates h]j)}(hhh]j)}(hFsystem integration for Intel SoC, core and driver testing and updates h]h)}(hEsystem integration for Intel SoC, core and driver testing and updatesh]hEsystem integration for Intel SoC, core and driver testing and updates}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMOhj]ubah}(h]h ]h"]h$]h&]uh1jhj ]ubah}(h]h ]h"]h$]h&]jLjuh1jhhhMOhj ]ubah}(h]h ]h"]h$]h&]uh1j]hhhMOhj5Xhhubj)}(hhh]j)}(h1Carsten Emde (`OSADL `_) h]h)}(h0Carsten Emde (`OSADL `_)h](hCarsten Emde (}(hj;]hhhNhNubh)}(h!`OSADL `_h]hOSADL}(hjC]hhhNhNubah}(h]h ]h"]h$]h&]nameOSADLjhttps://www.osadl.org/uh1hhj;]ubj)}(h h]h}(h]osadlah ]h"]osadlah$]h&]refurijS]uh1jj%Khj;]ubh)}(hj;]hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMQhj7]ubah}(h]h ]h"]h$]h&]uh1jhj4]hhhhhNubah}(h]h ]h"]h$]h&]jLjuh1jhhhMQhj5Xhhubj])}(h* provided OSADL expertise to discuss IP core licensing * pointed to possible deadlock for LGPL and CAN bus possible patent case which lead to relicense IP core design to BSD like license h]j)}(hhh](j)}(h5provided OSADL expertise to discuss IP core licensingh]h)}(hj]h]h5provided OSADL expertise to discuss IP core licensing}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMShj~]ubah}(h]h ]h"]h$]h&]uh1jhj{]ubj)}(hpointed to possible deadlock for LGPL and CAN bus possible patent case which lead to relicense IP core design to BSD like license h]h)}(hpointed to possible deadlock for LGPL and CAN bus possible patent case which lead to relicense IP core design to BSD like licenseh]hpointed to possible deadlock for LGPL and CAN bus possible patent case which lead to relicense IP core design to BSD like license}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMThj]ubah}(h]h ]h"]h$]h&]uh1jhj{]ubeh}(h]h ]h"]h$]h&]jLjuh1jhhhMShjw]ubah}(h]h ]h"]h$]h&]uh1j]hhhMShj5Xhhubj)}(hhh]j)}(hXReiner Zitzmann and Holger Zeltwanger (`CAN in Automation `_) h]h)}(hWReiner Zitzmann and Holger Zeltwanger (`CAN in Automation `_)h](h'Reiner Zitzmann and Holger Zeltwanger (}(hj]hhhNhNubh)}(h/`CAN in Automation `_h]hCAN in Automation}(hj]hhhNhNubah}(h]h ]h"]h$]h&]nameCAN in Automationjhttps://www.can-cia.org/uh1hhj]ubj)}(h h]h}(h]can-in-automationah ]h"]can in automationah$]h&]refurij]uh1jj%Khj]ubh)}(hj]hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMVhj]ubah}(h]h ]h"]h$]h&]uh1jhj]hhhhhNubah}(h]h ]h"]h$]h&]jLjuh1jhhhMVhj5Xhhubj])}(h* provided suggestions and help to inform community about the project and invited us to events focused on CAN bus future development directions h]j)}(hhh]j)}(hprovided suggestions and help to inform community about the project and invited us to events focused on CAN bus future development directions h]h)}(hprovided suggestions and help to inform community about the project and invited us to events focused on CAN bus future development directionsh]hprovided suggestions and help to inform community about the project and invited us to events focused on CAN bus future development directions}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMXhj^ubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]jLjuh1jhhhMXhj]ubah}(h]h ]h"]h$]h&]uh1j]hhhMXhj5Xhhubj)}(hhh]j)}(h Jan Charvat h]h)}(h Jan Charvath]h Jan Charvat}(hj.^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMZhj*^ubah}(h]h ]h"]h$]h&]uh1jhj'^hhhhhNubah}(h]h ]h"]h$]h&]jLjuh1jhhhMZhj5Xhhubj])}(hX * implemented CTU CAN FD functional model for QEMU which has been integrated into QEMU mainline (`docs/system/devices/can.rst `_) * Bachelor thesis Model of CAN FD Communication Controller for QEMU Emulator h]j)}(hhh](j)}(himplemented CTU CAN FD functional model for QEMU which has been integrated into QEMU mainline (`docs/system/devices/can.rst `_)h]h)}(hjQ^h](h_implemented CTU CAN FD functional model for QEMU which has been integrated into QEMU mainline (}(hjS^hhhNhNubh)}(hY`docs/system/devices/can.rst `_h]hdocs/system/devices/can.rst}(hjZ^hhhNhNubah}(h]h ]h"]h$]h&]namedocs/system/devices/can.rstj8https://www.qemu.org/docs/master/system/devices/can.htmluh1hhjS^ubj)}(h; h]h}(h]docs-system-devices-can-rstah ]h"]docs/system/devices/can.rstah$]h&]refurijj^uh1jj%KhjS^ubh)}(hjS^hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM\hjO^ubah}(h]h ]h"]h$]h&]uh1jhjL^ubj)}(hKBachelor thesis Model of CAN FD Communication Controller for QEMU Emulator h]h)}(hJBachelor thesis Model of CAN FD Communication Controller for QEMU Emulatorh]hJBachelor thesis Model of CAN FD Communication Controller for QEMU Emulator}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM]hj^ubah}(h]h ]h"]h$]h&]uh1jhjL^ubeh}(h]h ]h"]h$]h&]jLjuh1jhhhM\hjH^ubah}(h]h ]h"]h$]h&]uh1j]hhhM\hj5Xhhubeh}(h]8ctu-can-fd-ip-core-and-driver-development-acknowledgmentah ]h"]8ctu can fd ip core and driver development acknowledgmentah$]h&]uh1hhhhhhhhMubh)}(hhh](h)}(hNotesh]hNotes}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^hhhhhM`ubhfootnote)}(hKOther buses have their own specific driver interface to set up the device. h](hlabel)}(h1h]h1}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1j^hj^ubh)}(hJOther buses have their own specific driver interface to set up the device.h]hJOther buses have their own specific driver interface to set up the device.}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMdhj^ubeh}(h]jah ]h"]1ah$]h&]jajjuh1j^hhhMchj^hhjKubj^)}(hNot to be mistaken with CAN Error Frame. This is a ``can_frame`` with ``CAN_ERR_FLAG`` set and some error info in its ``data`` field. h](j^)}(h2h]h2}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1j^hj^ubh)}(hNot to be mistaken with CAN Error Frame. This is a ``can_frame`` with ``CAN_ERR_FLAG`` set and some error info in its ``data`` field.h](h3Not to be mistaken with CAN Error Frame. This is a }(hj_hhhNhNubj)}(h ``can_frame``h]h can_frame}(hj _hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubh with }(hj_hhhNhNubj)}(h``CAN_ERR_FLAG``h]h CAN_ERR_FLAG}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubh set and some error info in its }(hj_hhhNhNubj)}(h``data``h]hdata}(hj._hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubh field.}(hj_hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhhj^ubeh}(h]j ah ]h"]2ah$]h&]jajjuh1j^hhhMghj^hhjKubj^)}(h[Available in CTU CAN FD repository ``_ h](j^)}(h3h]h3}(hjQ_hhhNhNubah}(h]h ]h"]h$]h&]uh1j^hjM_ubh)}(hZAvailable in CTU CAN FD repository ``_h](h#Available in CTU CAN FD repository }(hj__hhhNhNubh)}(h7``_h]h2https://gitlab.fel.cvut.cz/canbus/ctucanfd_ip_core}(hjg_hhhNhNubah}(h]h ]h"]h$]h&]name2https://gitlab.fel.cvut.cz/canbus/ctucanfd_ip_corejjv_uh1hhj__ubj)}(h4h]h}(h]0https-gitlab-fel-cvut-cz-canbus-ctucanfd-ip-coreah ]h"]2https://gitlab.fel.cvut.cz/canbus/ctucanfd_ip_coreah$]h&]refurijv_uh1jj%Khj__ubeh}(h]h ]h"]h$]h&]uh1hhhhMlhjM_ubeh}(h]jah ]h"]3ah$]h&]jajjuh1j^hhhMkhj^hhjKubj^)}(hsAs is done in the low-level driver functions ``ctucan_hw_set_nom_bittiming`` and ``ctucan_hw_set_data_bittiming``. h](j^)}(h4h]h4}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1j^hj_ubh)}(hrAs is done in the low-level driver functions ``ctucan_hw_set_nom_bittiming`` and ``ctucan_hw_set_data_bittiming``.h](h-As is done in the low-level driver functions }(hj_hhhNhNubj)}(h``ctucan_hw_set_nom_bittiming``h]hctucan_hw_set_nom_bittiming}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubh and }(hj_hhhNhNubj)}(h ``ctucan_hw_set_data_bittiming``h]hctucan_hw_set_data_bittiming}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubh.}(hj_hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMphj_ubeh}(h]j ah ]h"]4ah$]h&]j ajjuh1j^hhhMohj^hhjKubj^)}(huAt the time of writing this thesis, option 1 is still being used and the modification is queued in gitlab issue #222 h](j^)}(h5h]h5}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1j^hj_ubh)}(htAt the time of writing this thesis, option 1 is still being used and the modification is queued in gitlab issue #222h]htAt the time of writing this thesis, option 1 is still being used and the modification is queued in gitlab issue #222}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMuhj_ubeh}(h]j ah ]h"]5ah$]h&]j ajjuh1j^hhhMthj^hhjKubj^)}(hStrictly speaking, multiple CAN TX queues are supported since v4.19 `can: enable multi-queue for SocketCAN devices `_ but no mainline driver is using them yet. h](j^)}(h6h]h6}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1j^hj`ubh)}(hStrictly speaking, multiple CAN TX queues are supported since v4.19 `can: enable multi-queue for SocketCAN devices `_ but no mainline driver is using them yet.h](hDStrictly speaking, multiple CAN TX queues are supported since v4.19 }(hj`hhhNhNubh)}(hb`can: enable multi-queue for SocketCAN devices `_h]h-can: enable multi-queue for SocketCAN devices}(hj`hhhNhNubah}(h]h ]h"]h$]h&]name-can: enable multi-queue for SocketCAN devicesj/https://lore.kernel.org/patchwork/patch/913526/uh1hhj`ubj)}(h2 h]h}(h],can-enable-multi-queue-for-socketcan-devicesah ]h"]-can: enable multi-queue for socketcan devicesah$]h&]refurij-`uh1jj%Khj`ubh* but no mainline driver is using them yet.}(hj`hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMyhj`ubeh}(h]jn ah ]h"]6ah$]h&]ji ajjuh1j^hhhMxhj^hhjKubj^)}(h!Or rather in the next clock cycleh](j^)}(h7h]h7}(hjP`hhhNhNubah}(h]h ]h"]h$]h&]uh1j^hjL`ubh)}(hjN`h]h!Or rather in the next clock cycle}(hj^`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM~hjL`ubeh}(h]jXah ]h"]7ah$]h&]jSajjuh1j^hhhM}hj^hhjKubeh}(h]notesah ]h"]notesah$]h&]uh1hhhhhhhhM`ubeh}(h]ctu-can-fd-driverah ]h"]ctu can fd driverah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksj/ footnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj`error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}(1]ja2]ja3]ja4]j a5]j a6]j_ a7]jIaurefids}(j"]jajT]jJajK]jAaj{]jqaj ]j aj]jaunameids}(j`j|`jojlj!jjDjAjfjcjjjjjjjjj:j7j\jYjjjjjjj(j%jj"jjjRjTjQjNjjKjj~jj{jj jjjjjjj j j2 j/ j5 j2 j+ j j* j' j-j*j#jj"jjjjjjjj2Xj/Xj^j^jYjYj*Yj'YjtYjqYjYjYj2Zj/Zj [j [j\j\j]]jZ]j]j]jt^jq^jw`jt`j^jjJ_j j_jj_j}_j_j j`j jI`jn j7`j4`jo`jXu nametypes}(j`joj!jDjfjjjjj:j\jjjj(jjjRjQjjjjjjjj j2 j5 j+ j* j-j#j"jjjj2Xj^jYj*YjtYjYj2Zj [j\j]]j]jt^jw`j^jJ_j_j_j_j`jI`j7`jo`uh}(j|`hjlhjjjAj;jcj]jjjjjjjjj7j1jYjSjjrjjjjj%jj"j+jj+jTjUjNjUjjjKjYj~jYjjj{jj jjjjjjjjjj jj/ j) j j j2 j j j j j j' j j*j8 ji j_ jjjjjjjj0jSjIjjj/XjjjjjjVj[jjj j j&"j+"j#j#jL%jQ%jk'jp'j%)j*)ji+jn+j-j-j/j/j3j3j6j 6j8j8j_;jd;jC=jH=j>j>j@j@jBjBjEjEjiFjnFjGjGjIjIj@KjEKjLjLjiNjnNjPjPjASjFSjTjTjVjVj^j5XjXjXjYjXj'Yj!YjqYjkYjYjYj/Zj)ZjQZjKZjsZjmZj [j[j\j\jZ]jT]j]j]jq^jk^jt`j^jj^j j^jjM_j}_jw_j j_j j_jn j`j4`j.`jXjL`jju footnote_refs}(j`]jaj`]jaj`]jaj`]j aj`]j aj`]j_ aj`]jIau citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes](j^j^jM_j_j_j`jL`e citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}j`KsRparse_messages](hsystem_message)}(hhh]h)}(h