Initial commit
Some checks failed
Build Kernel / Build all affected Kernels (push) Has been cancelled
Build all core packages / Build all core packages for selected target (push) Has been cancelled
Build and Push prebuilt tools container / Build and Push all prebuilt containers (push) Has been cancelled
Build Toolchains / Build Toolchains for each target (push) Has been cancelled
Build host tools / Build host tools for linux and macos based systems (push) Has been cancelled
Coverity scan build / Coverity x86/64 build (push) Has been cancelled
Some checks failed
Build Kernel / Build all affected Kernels (push) Has been cancelled
Build all core packages / Build all core packages for selected target (push) Has been cancelled
Build and Push prebuilt tools container / Build and Push all prebuilt containers (push) Has been cancelled
Build Toolchains / Build Toolchains for each target (push) Has been cancelled
Build host tools / Build host tools for linux and macos based systems (push) Has been cancelled
Coverity scan build / Coverity x86/64 build (push) Has been cancelled
This commit is contained in:
60
package/kernel/lantiq/ltq-vectoring/Makefile
Normal file
60
package/kernel/lantiq/ltq-vectoring/Makefile
Normal file
@@ -0,0 +1,60 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=ltq-vectoring
|
||||
PKG_RELEASE:=3
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://gitlab.com/prpl-foundation/intel/ppa_drv.git
|
||||
PKG_SOURCE_DATE:=2019-05-20
|
||||
PKG_SOURCE_VERSION:=4fa7ac30fcc8ec4eddae9debba5f4230981f469f
|
||||
PKG_MIRROR_HASH:=53ae72a929db598202a4e9c3df43b65fa0778cd165c1ec2ddf9361993795b930
|
||||
PKG_LICENSE:=GPL-2.0 BSD-2-Clause
|
||||
|
||||
MAKE_PATH:=src/vectoring
|
||||
PKG_EXTMOD_SUBDIRS:=$(MAKE_PATH)
|
||||
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define KernelPackage/ltq-vectoring
|
||||
SECTION:=sys
|
||||
CATEGORY:=Kernel modules
|
||||
SUBMENU:=Network Devices
|
||||
TITLE:=driver for sending vectoring error samples
|
||||
DEPENDS:=@TARGET_lantiq_xrx200
|
||||
FILES:=$(PKG_BUILD_DIR)/$(MAKE_PATH)/ltq_vectoring.ko
|
||||
AUTOLOAD:=$(call AutoLoad,49,ltq_vectoring)
|
||||
endef
|
||||
|
||||
define Package/ltq-vectoring/description
|
||||
This driver is responsible for sending error reports to the vectoring
|
||||
control entity, which is required for downstream vectoring to work.
|
||||
|
||||
The error reports are generated by the DSL firmware, and passed to this
|
||||
driver by the MEI driver.
|
||||
endef
|
||||
|
||||
define KernelPackage/ltq-vectoring-test
|
||||
SECTION:=sys
|
||||
CATEGORY:=Kernel modules
|
||||
SUBMENU:=Network Devices
|
||||
TITLE:=driver for testing the vectoring driver
|
||||
DEPENDS:=@TARGET_lantiq_xrx200 +kmod-ltq-vectoring
|
||||
FILES:=$(PKG_BUILD_DIR)/$(MAKE_PATH)/ltq_vectoring_test.ko
|
||||
endef
|
||||
|
||||
define Package/ltq-vectoring-test/description
|
||||
This allows to send dummy data to the vectoring error block callback.
|
||||
This is only needed for test and development purposes.
|
||||
endef
|
||||
|
||||
define Build/Configure
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
+$(KERNEL_MAKE) $(PKG_JOBS) \
|
||||
M="$(PKG_BUILD_DIR)/$(MAKE_PATH)" \
|
||||
modules
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,ltq-vectoring))
|
||||
$(eval $(call KernelPackage,ltq-vectoring-test))
|
||||
@@ -0,0 +1,95 @@
|
||||
--- a/src/vectoring/Makefile
|
||||
+++ b/src/vectoring/Makefile
|
||||
@@ -1,5 +1,5 @@
|
||||
-obj-$(CONFIG_PTM_VECTORING) += ifxmips_vectoring.o
|
||||
-obj-y += ifxmips_vectoring_stub.o
|
||||
-ifeq ($(CONFIG_DSL_MEI_CPE_DRV),)
|
||||
-obj-$(CONFIG_PTM_VECTORING) += ifxmips_vectoring_test.o
|
||||
-endif
|
||||
+obj-m += ltq_vectoring.o
|
||||
+ltq_vectoring-objs = ifxmips_vectoring.o ifxmips_vectoring_stub.o
|
||||
+
|
||||
+obj-m += ltq_vectoring_test.o
|
||||
+ltq_vectoring_test-objs = ifxmips_vectoring_test.o
|
||||
--- a/src/vectoring/ifxmips_vectoring.c
|
||||
+++ b/src/vectoring/ifxmips_vectoring.c
|
||||
@@ -30,9 +30,11 @@
|
||||
/*
|
||||
* Common Head File
|
||||
*/
|
||||
+#include <linux/version.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/etherdevice.h>
|
||||
+#include <linux/proc_fs.h>
|
||||
|
||||
/*
|
||||
* Chip Specific Head File
|
||||
@@ -239,7 +241,7 @@ static int netdev_event_handler(struct n
|
||||
&& event != NETDEV_UNREGISTER )
|
||||
return NOTIFY_DONE;
|
||||
|
||||
- netif = (struct net_device *)netdev;
|
||||
+ netif = netdev_notifier_info_to_dev(netdev);
|
||||
if ( strcmp(netif->name, "ptm0") != 0 )
|
||||
return NOTIFY_DONE;
|
||||
|
||||
@@ -356,6 +358,7 @@ static int proc_write_dbg(struct file *f
|
||||
return count;
|
||||
}
|
||||
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(5,6,0)
|
||||
static struct file_operations g_proc_file_vectoring_dbg_seq_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = proc_read_dbg_seq_open,
|
||||
@@ -364,6 +367,15 @@ static struct file_operations g_proc_fil
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
+#else
|
||||
+static struct proc_ops g_proc_file_vectoring_dbg_seq_fops = {
|
||||
+ .proc_open = proc_read_dbg_seq_open,
|
||||
+ .proc_read = seq_read,
|
||||
+ .proc_write = proc_write_dbg,
|
||||
+ .proc_lseek = seq_lseek,
|
||||
+ .proc_release = single_release,
|
||||
+};
|
||||
+#endif
|
||||
|
||||
static int proc_read_dbg_seq_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
--- a/src/vectoring/ifxmips_vectoring_test.c
|
||||
+++ b/src/vectoring/ifxmips_vectoring_test.c
|
||||
@@ -1,6 +1,8 @@
|
||||
+#include <linux/version.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/proc_fs.h>
|
||||
+#include <linux/seq_file.h>
|
||||
|
||||
#include "ifxmips_vectoring_stub.h"
|
||||
|
||||
@@ -82,6 +84,7 @@ static int proc_write_vectoring(struct f
|
||||
return count;
|
||||
}
|
||||
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(5,6,0)
|
||||
static struct file_operations g_proc_file_vectoring_seq_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = proc_read_vectoring_seq_open,
|
||||
@@ -90,6 +93,15 @@ static struct file_operations g_proc_fil
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
+#else
|
||||
+static struct proc_ops g_proc_file_vectoring_seq_fops = {
|
||||
+ .proc_open = proc_read_vectoring_seq_open,
|
||||
+ .proc_read = seq_read,
|
||||
+ .proc_write = proc_write_vectoring,
|
||||
+ .proc_lseek = seq_lseek,
|
||||
+ .proc_release = single_release,
|
||||
+};
|
||||
+#endif
|
||||
|
||||
static int proc_read_vectoring_seq_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
@@ -0,0 +1,73 @@
|
||||
--- a/src/vectoring/ifxmips_vectoring.c
|
||||
+++ b/src/vectoring/ifxmips_vectoring.c
|
||||
@@ -325,7 +325,7 @@ static int proc_write_dbg(struct file *f
|
||||
else
|
||||
printk(dbg_enable_mask_str[i] + 1);
|
||||
}
|
||||
- printk("] > /proc/vectoring\n");
|
||||
+ printk("] > /proc/driver/vectoring\n");
|
||||
}
|
||||
|
||||
if ( f_enable )
|
||||
@@ -433,11 +433,10 @@ static int __init vectoring_init(void)
|
||||
{
|
||||
struct proc_dir_entry *res;
|
||||
|
||||
- res = proc_create("vectoring",
|
||||
+ res = proc_create("driver/vectoring",
|
||||
S_IRUGO|S_IWUSR,
|
||||
0,
|
||||
&g_proc_file_vectoring_dbg_seq_fops);
|
||||
- printk("res = %p\n", res);
|
||||
|
||||
register_netdev_event_handler();
|
||||
g_ptm_net_dev = dev_get_by_name(&init_net, "ptm0");
|
||||
@@ -460,7 +459,7 @@ static void __exit vectoring_exit(void)
|
||||
|
||||
unregister_netdev_event_handler();
|
||||
|
||||
- remove_proc_entry("vectoring", NULL);
|
||||
+ remove_proc_entry("driver/vectoring", NULL);
|
||||
}
|
||||
|
||||
module_init(vectoring_init);
|
||||
--- a/src/vectoring/ifxmips_vectoring_test.c
|
||||
+++ b/src/vectoring/ifxmips_vectoring_test.c
|
||||
@@ -79,7 +79,7 @@ static int proc_write_vectoring(struct f
|
||||
}
|
||||
}
|
||||
else
|
||||
- printk("echo send <size> > /proc/eth/vectoring\n");
|
||||
+ printk("echo send <size> > /proc/driver/vectoring_test\n");
|
||||
|
||||
return count;
|
||||
}
|
||||
@@ -112,9 +112,7 @@ static __init void proc_file_create(void
|
||||
{
|
||||
struct proc_dir_entry *res;
|
||||
|
||||
-// g_proc_dir = proc_mkdir("eth", NULL);
|
||||
-
|
||||
- res = proc_create("eth/vectoring",
|
||||
+ res = proc_create("driver/vectoring_test",
|
||||
S_IRUGO|S_IWUSR,
|
||||
g_proc_dir,
|
||||
&g_proc_file_vectoring_seq_fops);
|
||||
@@ -122,10 +120,7 @@ static __init void proc_file_create(void
|
||||
|
||||
static __exit void proc_file_delete(void)
|
||||
{
|
||||
- remove_proc_entry("vectoring",
|
||||
- g_proc_dir);
|
||||
-
|
||||
- remove_proc_entry("eth", NULL);
|
||||
+ remove_proc_entry("driver/vectoring_test", NULL);
|
||||
}
|
||||
|
||||
|
||||
@@ -151,3 +146,5 @@ static void __exit vectoring_test_exit(v
|
||||
|
||||
module_init(vectoring_test_init);
|
||||
module_exit(vectoring_test_exit);
|
||||
+
|
||||
+MODULE_LICENSE("GPL");
|
||||
126
package/kernel/lantiq/ltq-vectoring/patches/200-compat.patch
Normal file
126
package/kernel/lantiq/ltq-vectoring/patches/200-compat.patch
Normal file
@@ -0,0 +1,126 @@
|
||||
--- a/src/vectoring/ifxmips_vectoring.c
|
||||
+++ b/src/vectoring/ifxmips_vectoring.c
|
||||
@@ -35,6 +35,8 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/proc_fs.h>
|
||||
+#include <linux/pkt_sched.h>
|
||||
+#include <linux/workqueue.h>
|
||||
|
||||
/*
|
||||
* Chip Specific Head File
|
||||
@@ -88,6 +90,7 @@ static void dump_skb(struct sk_buff *skb
|
||||
|
||||
static void ltq_vectoring_priority(uint32_t priority);
|
||||
|
||||
+static void xmit_work_handler(struct work_struct *);
|
||||
|
||||
/*
|
||||
* ####################################
|
||||
@@ -118,9 +121,13 @@ struct erb_head {
|
||||
|
||||
static struct notifier_block g_netdev_event_handler_nb = {0};
|
||||
static struct net_device *g_ptm_net_dev = NULL;
|
||||
-static uint32_t vector_prio = 0;
|
||||
+static uint32_t vector_prio = TC_PRIO_CONTROL;
|
||||
static int g_dbg_enable = 0;
|
||||
|
||||
+static struct workqueue_struct *vectoring_wq;
|
||||
+
|
||||
+DECLARE_WORK(xmit_work, xmit_work_handler);
|
||||
+struct sk_buff_head xmit_queue;
|
||||
|
||||
|
||||
/*
|
||||
@@ -129,9 +136,16 @@ static int g_dbg_enable = 0;
|
||||
* ####################################
|
||||
*/
|
||||
|
||||
+static void xmit_work_handler(__attribute__((unused)) struct work_struct *work) {
|
||||
+ struct sk_buff *skb;
|
||||
+
|
||||
+ while ((skb = skb_dequeue(&xmit_queue)) != NULL) {
|
||||
+ dev_queue_xmit(skb);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static int mei_dsm_cb_func(unsigned int *p_error_vector)
|
||||
{
|
||||
- int rc, ret;
|
||||
struct sk_buff *skb_list = NULL;
|
||||
struct sk_buff *skb;
|
||||
struct erb_head *erb;
|
||||
@@ -179,7 +193,6 @@ static int mei_dsm_cb_func(unsigned int
|
||||
}
|
||||
}
|
||||
|
||||
- rc = 0;
|
||||
sent_size = 0;
|
||||
segment_code = 0;
|
||||
while ( (skb = skb_list) != NULL ) {
|
||||
@@ -197,24 +210,23 @@ static int mei_dsm_cb_func(unsigned int
|
||||
segment_code |= 0xC0;
|
||||
((struct erb_head *)skb->data)->segment_code = segment_code;
|
||||
|
||||
- skb->cb[13] = 0x5A; /* magic number indicating forcing QId */
|
||||
- skb->cb[15] = 0x00; /* highest priority queue */
|
||||
- skb->priority = vector_prio;
|
||||
+ skb_reset_mac_header(skb);
|
||||
+ skb_set_network_header(skb, offsetof(struct erb_head, llc_header));
|
||||
+ skb->protocol = htons(ETH_P_802_2);
|
||||
+ skb->priority = vector_prio;
|
||||
skb->dev = g_ptm_net_dev;
|
||||
|
||||
dump_skb(skb, ~0, "vectoring TX", 0, 0, 1, 0);
|
||||
|
||||
- ret = g_ptm_net_dev->netdev_ops->ndo_start_xmit(skb, g_ptm_net_dev);
|
||||
- if ( rc == 0 )
|
||||
- rc = ret;
|
||||
+ skb_queue_tail(&xmit_queue, skb);
|
||||
+ queue_work(vectoring_wq, &xmit_work);
|
||||
|
||||
segment_code++;
|
||||
}
|
||||
|
||||
*p_error_vector = 0; /* notify DSL firmware that ERB is sent */
|
||||
|
||||
- ASSERT(rc == 0, "dev_queue_xmit fail - %d", rc);
|
||||
- return rc;
|
||||
+ return 0;
|
||||
}
|
||||
static void ltq_vectoring_priority(uint32_t priority)
|
||||
{
|
||||
@@ -242,7 +254,7 @@ static int netdev_event_handler(struct n
|
||||
return NOTIFY_DONE;
|
||||
|
||||
netif = netdev_notifier_info_to_dev(netdev);
|
||||
- if ( strcmp(netif->name, "ptm0") != 0 )
|
||||
+ if ( strcmp(netif->name, "dsl0") != 0 )
|
||||
return NOTIFY_DONE;
|
||||
|
||||
g_ptm_net_dev = event == NETDEV_REGISTER ? netif : NULL;
|
||||
@@ -438,8 +450,12 @@ static int __init vectoring_init(void)
|
||||
0,
|
||||
&g_proc_file_vectoring_dbg_seq_fops);
|
||||
|
||||
+ vectoring_wq = alloc_workqueue("vectoring", 0, 0);
|
||||
+
|
||||
+ skb_queue_head_init(&xmit_queue);
|
||||
+
|
||||
register_netdev_event_handler();
|
||||
- g_ptm_net_dev = dev_get_by_name(&init_net, "ptm0");
|
||||
+ g_ptm_net_dev = dev_get_by_name(&init_net, "dsl0");
|
||||
if ( g_ptm_net_dev != NULL )
|
||||
dev_put(g_ptm_net_dev);
|
||||
|
||||
@@ -459,6 +475,10 @@ static void __exit vectoring_exit(void)
|
||||
|
||||
unregister_netdev_event_handler();
|
||||
|
||||
+ flush_workqueue(vectoring_wq);
|
||||
+
|
||||
+ destroy_workqueue(vectoring_wq);
|
||||
+
|
||||
remove_proc_entry("driver/vectoring", NULL);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
--- a/src/vectoring/ifxmips_vectoring.c
|
||||
+++ b/src/vectoring/ifxmips_vectoring.c
|
||||
@@ -300,7 +300,7 @@ static int proc_write_dbg(struct file *f
|
||||
DBG_ENABLE_MASK_ALL
|
||||
};
|
||||
|
||||
- char str[2048];
|
||||
+ char *str;
|
||||
char *p;
|
||||
|
||||
int len, rlen;
|
||||
@@ -308,6 +308,10 @@ static int proc_write_dbg(struct file *f
|
||||
int f_enable = 0;
|
||||
int i;
|
||||
|
||||
+ str = kcalloc(2048, sizeof(*str), GFP_KERNEL);
|
||||
+ if (!str)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
len = count < sizeof(str) ? count : sizeof(str) - 1;
|
||||
rlen = len - copy_from_user(str, buf, len);
|
||||
while ( rlen && str[rlen - 1] <= ' ' )
|
||||
@@ -367,6 +371,8 @@ static int proc_write_dbg(struct file *f
|
||||
}
|
||||
}
|
||||
|
||||
+ kfree(str);
|
||||
+
|
||||
return count;
|
||||
}
|
||||
|
||||
--- a/src/vectoring/ifxmips_vectoring_test.c
|
||||
+++ b/src/vectoring/ifxmips_vectoring_test.c
|
||||
@@ -3,6 +3,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
+#include <linux/slab.h>
|
||||
|
||||
#include "ifxmips_vectoring_stub.h"
|
||||
|
||||
@@ -46,13 +47,17 @@ static int proc_write_vectoring(struct f
|
||||
{
|
||||
char *p;
|
||||
int len;
|
||||
- char local_buf[1024];
|
||||
+ char *local_buf;
|
||||
|
||||
unsigned long pkt_len;
|
||||
int ret;
|
||||
unsigned long sys_flag;
|
||||
unsigned long start, end;
|
||||
|
||||
+ local_buf = kcalloc(1024, sizeof(*local_buf), GFP_KERNEL);
|
||||
+ if (!local_buf)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
len = sizeof(local_buf) < count ? sizeof(local_buf) - 1 : count;
|
||||
len = len - copy_from_user(local_buf, buf, len);
|
||||
local_buf[len] = 0;
|
||||
@@ -81,6 +86,8 @@ static int proc_write_vectoring(struct f
|
||||
else
|
||||
printk("echo send <size> > /proc/driver/vectoring_test\n");
|
||||
|
||||
+ kfree(local_buf);
|
||||
+
|
||||
return count;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user