Compare commits

..

4 Commits

Author SHA1 Message Date
chgabriel79 b871a0370e
Merge b00c957824 into 1bdb4bbb50 2025-06-03 10:57:44 +02:00
Kyle Schwarz 1bdb4bbb50 3.1.1 2025-05-23 10:21:24 -04:00
Kyle Schwarz 8b5d92d61d Update copyright 2025-05-23 10:18:09 -04:00
Kyle Schwarz 8618f2e75e Fix Ethernet interfaces 2025-05-23 10:17:41 -04:00
3 changed files with 23 additions and 27 deletions

View File

@ -1,3 +1,7 @@
v3.1.1
Update copyright
Fix Ethernet interfaces
v3.0.4
Update copyright
Add Fedora package requirements to README

View File

@ -1,4 +1,4 @@
Version 3.0.4
Version 3.1.1
This is the kernel object portion of the Intrepid Control Systems SocketCAN support. For SocketCAN to work with Intrepid devices you will need to have this kernel object loaded on your system. Once the module is built and loaded run [icsscand](https://github.com/intrepidcs/icsscand) to turn on SocketCAN support.

View File

@ -1,7 +1,7 @@
/*
* intrepid.c - Netdevice driver for Intrepid CAN/Ethernet devices
*
* Copyright (c) 2016-2024 Intrepid Control Systems, Inc.
* Copyright (c) 2016-2025 Intrepid Control Systems, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
@ -58,7 +58,7 @@
#define KO_DESC "Netdevice driver for Intrepid CAN/Ethernet devices"
#define KO_MAJOR 3
#define KO_MINOR 1
#define KO_PATCH 0
#define KO_PATCH 1
#define KO_VERSION str(KO_MAJOR) "." str(KO_MINOR) "." str(KO_PATCH)
#define KO_VERSION_INT (KO_MAJOR << 16) | (KO_MINOR << 8) | KO_PATCH
@ -70,6 +70,7 @@ MODULE_DESCRIPTION(KO_DESC);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Paul Hollinsky <phollinsky@intrepidcs.com>");
MODULE_AUTHOR("Jeffrey Quesnelle <jeffq@intrepidcs.com>");
MODULE_AUTHOR("Kyle Schwarz <kschwarz@intrepidcs.com>");
MODULE_VERSION(KO_VERSION);
#define INTREPID_DEVICE_NAME "intrepid_netdevice"
@ -350,7 +351,7 @@ static netdev_tx_t intrepid_ETH_netdevice_xmit(struct sk_buff *skb, struct net_d
intrepid_unpause_all_queues();
}
msg.length = skb->len - ETH_HLEN;
msg.length = skb->len;
msg.netid = dev->base_addr;
msg.type = ICSNEO_NETWORK_TYPE_ETHERNET;
@ -368,7 +369,7 @@ static netdev_tx_t intrepid_ETH_netdevice_xmit(struct sk_buff *skb, struct net_d
/* Copy the message into the usermode box */
memcpy(tx_boxes[current_tx_box] + tx_box_bytes[current_tx_box], &msg, sizeof(neomessage_eth_t));
tx_box_bytes[current_tx_box] += sizeof(neomessage_eth_t);
memcpy(tx_boxes[current_tx_box] + tx_box_bytes[current_tx_box], skb->data, skb->len - ETH_HLEN);
memcpy(tx_boxes[current_tx_box] + tx_box_bytes[current_tx_box], skb->data, skb->len);
tx_box_bytes[current_tx_box] += msg.length;
tx_box_count[current_tx_box]++;
@ -847,7 +848,6 @@ static bool handle_CAN_transmit_receipt(
}
static bool handle_ETH_transmit_receipt(
struct net_device *device,
const neomessage_eth_t *msg,
const uint8_t *data,
struct net_device_stats *stats)
@ -933,7 +933,8 @@ static int intrepid_add_eth_if(struct intrepid_netdevice **result, const char *r
}
dev->base_addr = i;
dev->flags = IFF_ECHO;
dev->flags |= IFF_BROADCAST | IFF_MULTICAST | IFF_RUNNING;
dev->operstate = IF_OPER_UP;
#if KERNEL_CHECKS_MTU_RANGE
dev->min_mtu = ETH_MIN_MTU;
dev->max_mtu = ETH_MAX_MTU;
@ -952,6 +953,8 @@ static int intrepid_add_eth_if(struct intrepid_netdevice **result, const char *r
}
}
#endif
eth_hw_addr_random(dev);
ics = netdev_priv(dev);
ics->dev = dev;
ics->is_stopped = 0;
@ -982,27 +985,20 @@ static int intrepid_fill_eth_frame_from_neomessage(
struct net_device_stats *stats,
const neomessage_eth_t *msg,
const uint8_t *data,
struct sk_buff *skb,
struct net_device *device)
struct sk_buff *skb)
{
struct ethhdr *eth;
if (unlikely(msg->length > (ETH_FRAME_LEN + ETH_FCS_LEN))) {
stats->rx_dropped++;
pr_warn("intrepid: Dropping message on %s, invalid message length %ld", device->name, msg->length);
return 1;
return -1;
}
if (unlikely(skb == NULL)) {
stats->rx_dropped++;
pr_warn("intrepid: Dropping message on %s, skb allocation failed", device->name);
return 1;
return -1;
}
skb_reset_mac_header(skb);
eth = skb_put(skb, sizeof(struct ethhdr));
*eth = *(struct ethhdr*)data;
skb->protocol = htons(ETH_P_802_3);
skb_put_data(skb, data + ETH_HLEN, msg->length);
skb_put_data(skb, data, msg->length);
skb->protocol = eth_type_trans(skb, skb->dev);
stats->rx_bytes += msg->length;
stats->rx_packets++;
@ -1070,20 +1066,16 @@ static struct sk_buff *intrepid_skb_from_neomessage(
case ICSNEO_NETWORK_TYPE_ETHERNET:
{
const neomessage_eth_t *msg = (const neomessage_eth_t*)msg_generic;
if (handle_ETH_transmit_receipt(device, msg, data, stats))
if (handle_ETH_transmit_receipt(msg, data, stats))
goto out;
skb = netdev_alloc_skb(device, ETH_DATA_LEN);
skb = netdev_alloc_skb_ip_align(device, msg->length);
if (unlikely(skb == NULL)) {
stats->rx_dropped++;
pr_warn("intrepid: Dropping message on %s, skb allocation failed", device->name);
goto out;
}
ret = intrepid_fill_eth_frame_from_neomessage(
stats,
msg,
data,
skb,
device);
ret = intrepid_fill_eth_frame_from_neomessage(stats, msg, data, skb);
}
break;
default: