Merge Official Source

Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>
This commit is contained in:
Tianling Shen 2023-03-02 21:40:40 +08:00
commit db5e542439
No known key found for this signature in database
GPG Key ID: 6850B6345C862176
155 changed files with 5398 additions and 2143 deletions

View File

@ -295,6 +295,7 @@ menu "Target Images"
comment "Image Options"
source "target/linux/*/image/Config.in"
source "target/linux/*/*/image/Config.in"
config TARGET_KERNEL_PARTSIZE
int "Kernel partition size (in MiB)"

View File

@ -1,2 +1,2 @@
LINUX_VERSION-5.15 = .94
LINUX_KERNEL_HASH-5.15.94 = da9270dbe64ddf1db13c70470957ff6796eb996d867bb4aed7d14a70e1c65a72
LINUX_VERSION-5.15 = .96
LINUX_KERNEL_HASH-5.15.96 = 348d974c143fdef8517ec703fdaa24bade12a49047848be92cb9e3253b19ef98

View File

@ -122,14 +122,14 @@ define Package/grub2/install
-O i386-pc \
-c $(PKG_BUILD_DIR)/grub-early.cfg \
-o $(STAGING_DIR_IMAGE)/grub2/gpt-core.img \
at_keyboard biosdisk boot chain configfile fat linux ls part_gpt reboot search serial vga
at_keyboard biosdisk boot chain configfile fat linux ls part_gpt reboot search serial test vga
$(STAGING_DIR_HOST)/bin/grub-mkimage \
-d $(PKG_BUILD_DIR)/grub-core \
-p /boot/grub \
-O i386-pc \
-c ./files/grub-early.cfg \
-o $(STAGING_DIR_IMAGE)/grub2/generic-core.img \
at_keyboard biosdisk boot chain configfile ext2 linux ls part_msdos reboot search serial vga
at_keyboard biosdisk boot chain configfile ext2 linux ls part_msdos reboot search serial test vga
$(STAGING_DIR_HOST)/bin/grub-mkimage \
-d $(PKG_BUILD_DIR)/grub-core \
-p /boot/grub \
@ -154,7 +154,7 @@ define Package/grub2-efi/install
-O $(CONFIG_ARCH)-efi \
-c $(PKG_BUILD_DIR)/grub-early.cfg \
-o $(STAGING_DIR_IMAGE)/grub2/boot$(if $(CONFIG_x86_64),x64,ia32).efi \
at_keyboard boot chain configfile fat linux ls part_gpt reboot serial efi_gop efi_uga
at_keyboard boot chain configfile fat linux ls part_gpt reboot serial test efi_gop efi_uga
$(STAGING_DIR_HOST)/bin/grub-mkimage \
-d $(PKG_BUILD_DIR)/grub-core \
-p /boot/grub \

View File

@ -8,12 +8,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=kexec-tools
PKG_VERSION:=2.0.21
PKG_RELEASE:=2
PKG_VERSION:=2.0.26
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
PKG_SOURCE_URL:=@KERNEL/linux/utils/kernel/kexec
PKG_HASH:=e113142dee891638ad96e0f72cf9277b244477619470b30c41999d312e8e8702
PKG_HASH:=7fe36a064101cd5c515e41b2be393dce3ca88adce59d6ee668e0af7c0c4570cd
PKG_CONFIG_DEPENDS := CONFIG_KEXEC_ZLIB CONFIG_KEXEC_LZMA

View File

@ -1,52 +0,0 @@
From 9817ec81968a5eec7863902833fb77680544eae4 Mon Sep 17 00:00:00 2001
From: Alexander Egorenkov <egorenar-dev@posteo.net>
Date: Mon, 12 Apr 2021 13:18:05 +0200
Subject: [PATCH 1/1] arm: do not copy magic 4 bytes of appended DTB in zImage
If the passed zImage happens to have a DTB appended, then the magic 4 bytes
of the DTB are copied together with the kernel image. This leads to
failed kexec boots because the decompressor finds the aforementioned
DTB magic and falsely tries to replace the DTB passed in the register r2
with the non-existent appended one.
Signed-off-by: Alexander Egorenkov <egorenar-dev@posteo.net>
Signed-off-by: Simon Horman <horms@verge.net.au>
---
kexec/arch/arm/kexec-zImage-arm.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
--- a/kexec/arch/arm/kexec-zImage-arm.c
+++ b/kexec/arch/arm/kexec-zImage-arm.c
@@ -382,6 +382,7 @@ int zImage_arm_load(int argc, char **arg
unsigned int atag_offset = 0x1000; /* 4k offset from memory start */
unsigned int extra_size = 0x8000; /* TEXT_OFFSET */
const struct zimage_tag *tag;
+ size_t kernel_buf_size;
size_t kernel_mem_size;
const char *command_line;
char *modified_cmdline = NULL;
@@ -538,6 +539,15 @@ int zImage_arm_load(int argc, char **arg
}
/*
+ * Save the length of the compressed kernel image w/o the appended DTB.
+ * This will be required later on when the kernel image contained
+ * in the zImage will be loaded into a kernel memory segment.
+ * And we want to load ONLY the compressed kernel image from the zImage
+ * and discard the appended DTB.
+ */
+ kernel_buf_size = len;
+
+ /*
* Always extend the zImage by four bytes to ensure that an appended
* DTB image always sees an initialised value after _edata.
*/
@@ -759,7 +769,7 @@ int zImage_arm_load(int argc, char **arg
add_segment(info, dtb_buf, dtb_length, dtb_offset, dtb_length);
}
- add_segment(info, buf, len, kernel_base, kernel_mem_size);
+ add_segment(info, buf, kernel_buf_size, kernel_base, kernel_mem_size);
info->entry = (void*)kernel_base;

View File

@ -13,6 +13,7 @@ touch /etc/config/ubootenv
board=$(board_name)
case "$board" in
buffalo,ls220de|\
buffalo,ls421de)
ubootenv_add_uci_config "/dev/mtd3" "0x0" "0x10000"
;;

View File

@ -68,3 +68,13 @@ define Package/mt7922bt-firmware/install
$(1)/lib/firmware/mediatek
endef
$(eval $(call BuildPackage,mt7922bt-firmware))
Package/mt7986-wo-firmware = $(call Package/firmware-default,MT7986 offload firmware)
define Package/mt7986-wo-firmware/install
$(INSTALL_DIR) $(1)/lib/firmware/mediatek
$(INSTALL_DATA) \
$(PKG_BUILD_DIR)/mediatek/mt7986_wo_0.bin \
$(PKG_BUILD_DIR)/mediatek/mt7986_wo_1.bin \
$(1)/lib/firmware/mediatek
endef
$(eval $(call BuildPackage,mt7986-wo-firmware))

View File

@ -1,28 +0,0 @@
include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=hwmon-gsc
PKG_RELEASE:=1
include $(INCLUDE_DIR)/package.mk
define KernelPackage/hwmon-gsc
SUBMENU:=Hardware Monitoring Support
DEPENDS:=@TARGET_imx +kmod-hwmon-core +kmod-i2c-core
TITLE:=Driver for the Gateworks System Controller
AUTOLOAD:=$(call AutoLoad,60,gsc)
FILES:=$(PKG_BUILD_DIR)/gsc.ko
endef
define KernelPackage/hwmon-gsc/description
Kernel module for the Gateworks System Controller chips.
endef
define Build/Compile
$(KERNEL_MAKE) \
M="$(PKG_BUILD_DIR)" \
EXTRA_CFLAGS="$(BUILDFLAGS)" \
modules
endef
$(eval $(call KernelPackage,hwmon-gsc))

View File

@ -1 +0,0 @@
obj-m := gsc.o

View File

@ -1,308 +0,0 @@
/*
* A hwmon driver for the Gateworks System Controller
* Copyright (C) 2009 Gateworks Corporation
*
* Author: Chris Lang <clang@gateworks.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License,
* as published by the Free Software Foundation - version 2.
*/
#include <linux/module.h>
#include <linux/i2c.h>
#include <linux/hwmon.h>
#include <linux/hwmon-sysfs.h>
#include <linux/err.h>
#include <linux/slab.h>
#define DRV_VERSION "0.2"
enum chips { gsp };
/* AD7418 registers */
#define GSP_REG_TEMP_IN 0x00
#define GSP_REG_VIN 0x02
#define GSP_REG_3P3 0x05
#define GSP_REG_BAT 0x08
#define GSP_REG_5P0 0x0b
#define GSP_REG_CORE 0x0e
#define GSP_REG_CPU1 0x11
#define GSP_REG_CPU2 0x14
#define GSP_REG_DRAM 0x17
#define GSP_REG_EXT_BAT 0x1a
#define GSP_REG_IO1 0x1d
#define GSP_REG_IO2 0x20
#define GSP_REG_PCIE 0x23
#define GSP_REG_CURRENT 0x26
#define GSP_FAN_0 0x2C
#define GSP_FAN_1 0x2E
#define GSP_FAN_2 0x30
#define GSP_FAN_3 0x32
#define GSP_FAN_4 0x34
#define GSP_FAN_5 0x36
struct gsp_sensor_info {
const char* name;
int reg;
};
static const struct gsp_sensor_info gsp_sensors[] = {
{"temp", GSP_REG_TEMP_IN},
{"vin", GSP_REG_VIN},
{"3p3", GSP_REG_3P3},
{"bat", GSP_REG_BAT},
{"5p0", GSP_REG_5P0},
{"core", GSP_REG_CORE},
{"cpu1", GSP_REG_CPU1},
{"cpu2", GSP_REG_CPU2},
{"dram", GSP_REG_DRAM},
{"ext_bat", GSP_REG_EXT_BAT},
{"io1", GSP_REG_IO1},
{"io2", GSP_REG_IO2},
{"pci2", GSP_REG_PCIE},
{"current", GSP_REG_CURRENT},
{"fan_point0", GSP_FAN_0},
{"fan_point1", GSP_FAN_1},
{"fan_point2", GSP_FAN_2},
{"fan_point3", GSP_FAN_3},
{"fan_point4", GSP_FAN_4},
{"fan_point5", GSP_FAN_5},
};
struct gsp_data {
struct device *hwmon_dev;
struct attribute_group attrs;
enum chips type;
};
static int gsp_probe(struct i2c_client *client,
const struct i2c_device_id *id);
static int gsp_remove(struct i2c_client *client);
static const struct i2c_device_id gsp_id[] = {
{ "gsp", 0 },
{ }
};
MODULE_DEVICE_TABLE(i2c, gsp_id);
static struct i2c_driver gsp_driver = {
.driver = {
.name = "gsp",
},
.probe = gsp_probe,
.remove = gsp_remove,
.id_table = gsp_id,
};
/* All registers are word-sized, except for the configuration registers.
* AD7418 uses a high-byte first convention. Do NOT use those functions to
* access the configuration registers CONF and CONF2, as they are byte-sized.
*/
static inline int gsp_read(struct i2c_client *client, u8 reg)
{
unsigned int adc = 0;
if (reg == GSP_REG_TEMP_IN || reg > GSP_REG_CURRENT)
{
adc |= i2c_smbus_read_byte_data(client, reg);
adc |= i2c_smbus_read_byte_data(client, reg + 1) << 8;
return adc;
}
else
{
adc |= i2c_smbus_read_byte_data(client, reg);
adc |= i2c_smbus_read_byte_data(client, reg + 1) << 8;
adc |= i2c_smbus_read_byte_data(client, reg + 2) << 16;
return adc;
}
}
static inline int gsp_write(struct i2c_client *client, u8 reg, u16 value)
{
i2c_smbus_write_byte_data(client, reg, value & 0xff);
i2c_smbus_write_byte_data(client, reg + 1, ((value >> 8) & 0xff));
return 1;
}
static ssize_t show_adc(struct device *dev, struct device_attribute *devattr,
char *buf)
{
struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
struct i2c_client *client = to_i2c_client(dev);
return sprintf(buf, "%d\n", gsp_read(client, gsp_sensors[attr->index].reg));
}
static ssize_t show_label(struct device *dev,
struct device_attribute *devattr, char *buf)
{
struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
return sprintf(buf, "%s\n", gsp_sensors[attr->index].name);
}
static ssize_t store_fan(struct device *dev,
struct device_attribute *devattr, const char *buf, size_t count)
{
u16 val;
struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
struct i2c_client *client = to_i2c_client(dev);
val = simple_strtoul(buf, NULL, 10);
gsp_write(client, gsp_sensors[attr->index].reg, val);
return count;
}
static SENSOR_DEVICE_ATTR(temp0_input, S_IRUGO, show_adc, NULL, 0);
static SENSOR_DEVICE_ATTR(temp0_label, S_IRUGO, show_label, NULL, 0);
static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, show_adc, NULL, 1);
static SENSOR_DEVICE_ATTR(in0_label, S_IRUGO, show_label, NULL, 1);
static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, show_adc, NULL, 2);
static SENSOR_DEVICE_ATTR(in1_label, S_IRUGO, show_label, NULL, 2);
static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, show_adc, NULL, 3);
static SENSOR_DEVICE_ATTR(in2_label, S_IRUGO, show_label, NULL, 3);
static SENSOR_DEVICE_ATTR(in3_input, S_IRUGO, show_adc, NULL, 4);
static SENSOR_DEVICE_ATTR(in3_label, S_IRUGO, show_label, NULL, 4);
static SENSOR_DEVICE_ATTR(in4_input, S_IRUGO, show_adc, NULL, 5);
static SENSOR_DEVICE_ATTR(in4_label, S_IRUGO, show_label, NULL, 5);
static SENSOR_DEVICE_ATTR(in5_input, S_IRUGO, show_adc, NULL, 6);
static SENSOR_DEVICE_ATTR(in5_label, S_IRUGO, show_label, NULL, 6);
static SENSOR_DEVICE_ATTR(in6_input, S_IRUGO, show_adc, NULL, 7);
static SENSOR_DEVICE_ATTR(in6_label, S_IRUGO, show_label, NULL, 7);
static SENSOR_DEVICE_ATTR(in7_input, S_IRUGO, show_adc, NULL, 8);
static SENSOR_DEVICE_ATTR(in7_label, S_IRUGO, show_label, NULL, 8);
static SENSOR_DEVICE_ATTR(in8_input, S_IRUGO, show_adc, NULL, 9);
static SENSOR_DEVICE_ATTR(in8_label, S_IRUGO, show_label, NULL, 9);
static SENSOR_DEVICE_ATTR(in9_input, S_IRUGO, show_adc, NULL, 10);
static SENSOR_DEVICE_ATTR(in9_label, S_IRUGO, show_label, NULL, 10);
static SENSOR_DEVICE_ATTR(in10_input, S_IRUGO, show_adc, NULL, 11);
static SENSOR_DEVICE_ATTR(in10_label, S_IRUGO, show_label, NULL, 11);
static SENSOR_DEVICE_ATTR(in11_input, S_IRUGO, show_adc, NULL, 12);
static SENSOR_DEVICE_ATTR(in11_label, S_IRUGO, show_label, NULL, 12);
static SENSOR_DEVICE_ATTR(in12_input, S_IRUGO, show_adc, NULL, 13);
static SENSOR_DEVICE_ATTR(in12_label, S_IRUGO, show_label, NULL, 13);
static SENSOR_DEVICE_ATTR(fan0_point0, S_IRUGO | S_IWUSR, show_adc, store_fan, 14);
static SENSOR_DEVICE_ATTR(fan0_point1, S_IRUGO | S_IWUSR, show_adc, store_fan, 15);
static SENSOR_DEVICE_ATTR(fan0_point2, S_IRUGO | S_IWUSR, show_adc, store_fan, 16);
static SENSOR_DEVICE_ATTR(fan0_point3, S_IRUGO | S_IWUSR, show_adc, store_fan, 17);
static SENSOR_DEVICE_ATTR(fan0_point4, S_IRUGO | S_IWUSR, show_adc, store_fan, 18);
static SENSOR_DEVICE_ATTR(fan0_point5, S_IRUGO | S_IWUSR, show_adc, store_fan, 19);
static struct attribute *gsp_attributes[] = {
&sensor_dev_attr_temp0_input.dev_attr.attr,
&sensor_dev_attr_in0_input.dev_attr.attr,
&sensor_dev_attr_in1_input.dev_attr.attr,
&sensor_dev_attr_in2_input.dev_attr.attr,
&sensor_dev_attr_in3_input.dev_attr.attr,
&sensor_dev_attr_in4_input.dev_attr.attr,
&sensor_dev_attr_in5_input.dev_attr.attr,
&sensor_dev_attr_in6_input.dev_attr.attr,
&sensor_dev_attr_in7_input.dev_attr.attr,
&sensor_dev_attr_in8_input.dev_attr.attr,
&sensor_dev_attr_in9_input.dev_attr.attr,
&sensor_dev_attr_in10_input.dev_attr.attr,
&sensor_dev_attr_in11_input.dev_attr.attr,
&sensor_dev_attr_in12_input.dev_attr.attr,
&sensor_dev_attr_temp0_label.dev_attr.attr,
&sensor_dev_attr_in0_label.dev_attr.attr,
&sensor_dev_attr_in1_label.dev_attr.attr,
&sensor_dev_attr_in2_label.dev_attr.attr,
&sensor_dev_attr_in3_label.dev_attr.attr,
&sensor_dev_attr_in4_label.dev_attr.attr,
&sensor_dev_attr_in5_label.dev_attr.attr,
&sensor_dev_attr_in6_label.dev_attr.attr,
&sensor_dev_attr_in7_label.dev_attr.attr,
&sensor_dev_attr_in8_label.dev_attr.attr,
&sensor_dev_attr_in9_label.dev_attr.attr,
&sensor_dev_attr_in10_label.dev_attr.attr,
&sensor_dev_attr_in11_label.dev_attr.attr,
&sensor_dev_attr_in12_label.dev_attr.attr,
&sensor_dev_attr_fan0_point0.dev_attr.attr,
&sensor_dev_attr_fan0_point1.dev_attr.attr,
&sensor_dev_attr_fan0_point2.dev_attr.attr,
&sensor_dev_attr_fan0_point3.dev_attr.attr,
&sensor_dev_attr_fan0_point4.dev_attr.attr,
&sensor_dev_attr_fan0_point5.dev_attr.attr,
NULL
};
static int gsp_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
struct i2c_adapter *adapter = client->adapter;
struct gsp_data *data;
int err;
if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA |
I2C_FUNC_SMBUS_WORD_DATA)) {
err = -EOPNOTSUPP;
goto exit;
}
if (!(data = kzalloc(sizeof(struct gsp_data), GFP_KERNEL))) {
err = -ENOMEM;
goto exit;
}
i2c_set_clientdata(client, data);
data->type = id->driver_data;
switch (data->type) {
case 0:
data->attrs.attrs = gsp_attributes;
break;
}
dev_info(&client->dev, "%s chip found\n", client->name);
/* Register sysfs hooks */
if ((err = sysfs_create_group(&client->dev.kobj, &data->attrs)))
goto exit_free;
data->hwmon_dev = hwmon_device_register(&client->dev);
if (IS_ERR(data->hwmon_dev)) {
err = PTR_ERR(data->hwmon_dev);
goto exit_remove;
}
return 0;
exit_remove:
sysfs_remove_group(&client->dev.kobj, &data->attrs);
exit_free:
kfree(data);
exit:
return err;
}
static int gsp_remove(struct i2c_client *client)
{
struct gsp_data *data = i2c_get_clientdata(client);
hwmon_device_unregister(data->hwmon_dev);
sysfs_remove_group(&client->dev.kobj, &data->attrs);
kfree(data);
return 0;
}
static int __init gsp_init(void)
{
return i2c_add_driver(&gsp_driver);
}
static void __exit gsp_exit(void)
{
i2c_del_driver(&gsp_driver);
}
module_init(gsp_init);
module_exit(gsp_exit);
MODULE_AUTHOR("Chris Lang <clang@gateworks.com>");
MODULE_DESCRIPTION("GSC HWMON driver");
MODULE_LICENSE("GPL");
MODULE_VERSION(DRV_VERSION);

View File

@ -108,6 +108,25 @@ endef
$(eval $(call KernelPackage,hwmon-drivetemp))
define KernelPackage/hwmon-gsc
TITLE:=Gateworks System Controller support
KCONFIG:=CONFIG_MFD_GATEWORKS_GSC \
CONFIG_SENSORS_GSC
FILES:= \
$(LINUX_DIR)/drivers/mfd/gateworks-gsc.ko \
$(LINUX_DIR)/drivers/hwmon/gsc-hwmon.ko
AUTOLOAD:=$(call AutoLoad,20,gsc-hwmon,1)
$(call AddDepends/hwmon,+kmod-i2c-core)
endef
define KernelPackage/hwmon-gsc/description
Kernel module for Gateworks System Controller with temperature sensor,
ADCs, and FAN controller
endef
$(eval $(call KernelPackage,hwmon-gsc))
define KernelPackage/hwmon-gpiofan
TITLE:=Generic GPIO FAN support
KCONFIG:=CONFIG_SENSORS_GPIO_FAN

View File

@ -115,6 +115,23 @@ endef
$(eval $(call KernelPackage,ledtrig-pattern))
define KernelPackage/ledtrig-tty
SUBMENU:=$(LEDS_MENU)
TITLE:=LED Trigger for TTY devices
DEPENDS:=@LINUX_5_15
KCONFIG:=CONFIG_LEDS_TRIGGER_TTY
FILES:=$(LED_TRIGGER_DIR)/ledtrig-tty.ko
AUTOLOAD:=$(call AutoLoad,50,ledtrig-tty)
endef
define KernelPackage/ledtrig-tty/description
This allows LEDs to be controlled by activity on ttys which includes
serial devices like '/dev/ttyS0'.
endef
$(eval $(call KernelPackage,ledtrig-tty))
define KernelPackage/leds-apu
SUBMENU:=$(LEDS_MENU)
TITLE:=PC Engines APU1 LED support

View File

@ -3,40 +3,92 @@ Date: Thu, 16 Feb 2023 11:07:30 +0100
Subject: [PATCH] wifi: mac80211: use mesh header cache to speed up mesh
forwarding
Use it to look up the next hop address + sta pointer + key and call
__ieee80211_mesh_xmit_fast to queue the tx frame.
Significantly reduces mesh forwarding path CPU usage and enables the
use of iTXQ.
direct use of iTXQ.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
---
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -2731,6 +2731,7 @@ ieee80211_rx_mesh_data(struct ieee80211_
struct ieee80211_hdr hdr = {
.frame_control = cpu_to_le16(fc)
};
+ struct mhdr_cache_entry *entry = NULL;
struct ieee80211_hdr *fwd_hdr;
struct ieee80211s_hdr *mesh_hdr;
struct ieee80211_tx_info *info;
@@ -2788,7 +2789,12 @@ ieee80211_rx_mesh_data(struct ieee80211_
return RX_DROP_MONITOR;
@@ -2720,6 +2720,65 @@ ieee80211_deliver_skb(struct ieee80211_r
}
}
- if (mesh_hdr->flags & MESH_FLAGS_AE) {
+ if ((mesh_hdr->flags & MESH_FLAGS_AE) == MESH_FLAGS_AE_A5_A6)
+ entry = mesh_get_cached_hdr(sdata, mesh_hdr->eaddr1);
+ else if (!(mesh_hdr->flags & MESH_FLAGS_AE))
+ entry = mesh_get_cached_hdr(sdata, eth->h_dest);
+#ifdef CPTCFG_MAC80211_MESH
+static bool
+ieee80211_rx_mesh_fast_forward(struct ieee80211_sub_if_data *sdata,
+ struct sk_buff *skb, int hdrlen)
+{
+ struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
+ struct ieee80211_mesh_fast_tx *entry = NULL;
+ struct ieee80211s_hdr *mesh_hdr;
+ struct tid_ampdu_tx *tid_tx;
+ struct sta_info *sta;
+ struct ethhdr eth;
+ u8 tid;
+
+ if (!entry && (mesh_hdr->flags & MESH_FLAGS_AE)) {
struct mesh_path *mppath;
char *proxied_addr;
bool update = false;
@@ -2862,11 +2868,23 @@ ieee80211_rx_mesh_data(struct ieee80211_
+ mesh_hdr = (struct ieee80211s_hdr *)(skb->data + sizeof(eth));
+ if ((mesh_hdr->flags & MESH_FLAGS_AE) == MESH_FLAGS_AE_A5_A6)
+ entry = mesh_fast_tx_get(sdata, mesh_hdr->eaddr1);
+ else if (!(mesh_hdr->flags & MESH_FLAGS_AE))
+ entry = mesh_fast_tx_get(sdata, skb->data);
+ if (!entry)
+ return false;
+
+ sta = rcu_dereference(entry->mpath->next_hop);
+ if (!sta)
+ return false;
+
+ if (skb_linearize(skb))
+ return false;
+
+ tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK;
+ tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]);
+ if (tid_tx) {
+ if (!test_bit(HT_AGG_STATE_OPERATIONAL, &tid_tx->state))
+ return false;
+
+ if (tid_tx->timeout)
+ tid_tx->last_tx = jiffies;
+ }
+
+ ieee80211_aggr_check(sdata, sta, skb);
+
+ if (ieee80211_get_8023_tunnel_proto(skb->data + hdrlen,
+ &skb->protocol))
+ hdrlen += ETH_ALEN;
+ else
+ skb->protocol = htons(skb->len - hdrlen);
+ skb_set_network_header(skb, hdrlen + 2);
+
+ skb->dev = sdata->dev;
+ memcpy(&eth, skb->data, ETH_HLEN - 2);
+ skb_pull(skb, sizeof(eth));
+ __ieee80211_xmit_fast(sdata, sta, &entry->fast_tx, skb, tid_tx,
+ eth.h_dest, eth.h_source);
+ IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_unicast);
+ IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_frames);
+
+ return true;
+}
+#endif
+
static ieee80211_rx_result
ieee80211_rx_mesh_data(struct ieee80211_sub_if_data *sdata, struct sta_info *sta,
struct sk_buff *skb)
@@ -2824,6 +2883,10 @@ ieee80211_rx_mesh_data(struct ieee80211_
skb_set_queue_mapping(skb, ieee802_1d_to_ac[skb->priority]);
+ if (!multicast &&
+ ieee80211_rx_mesh_fast_forward(sdata, skb, mesh_hdrlen))
+ return RX_QUEUED;
+
ieee80211_fill_mesh_addresses(&hdr, &hdr.frame_control,
eth->h_dest, eth->h_source);
hdrlen = ieee80211_hdrlen(hdr.frame_control);
@@ -2862,6 +2925,7 @@ ieee80211_rx_mesh_data(struct ieee80211_
info->control.flags |= IEEE80211_TX_INTCFL_NEED_TXPROCESSING;
info->control.vif = &sdata->vif;
info->control.jiffies = jiffies;
@ -44,23 +96,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
if (multicast) {
IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_mcast);
memcpy(fwd_hdr->addr2, sdata->vif.addr, ETH_ALEN);
/* update power mode indication when forwarding */
ieee80211_mps_set_frame_flags(sdata, NULL, fwd_hdr);
+ } else if (entry) {
+ struct ieee80211_hdr *ehdr = (struct ieee80211_hdr *)entry->hdr;
+
+ ether_addr_copy(fwd_hdr->addr1, ehdr->addr1);
+ ether_addr_copy(fwd_hdr->addr2, sdata->vif.addr);
+ IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_unicast);
+ IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_frames);
+ qos[0] = fwd_skb->priority;
+ qos[1] = ieee80211_get_qos_ctl(ehdr)[1];
+ __ieee80211_mesh_xmit_fast(sdata, entry, fwd_skb);
+ return RX_QUEUED;
} else if (!mesh_nexthop_lookup(sdata, fwd_skb)) {
/* mesh power mode flags updated in mesh_nexthop_lookup */
IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_unicast);
@@ -2883,7 +2901,6 @@ ieee80211_rx_mesh_data(struct ieee80211_
@@ -2883,7 +2947,6 @@ ieee80211_rx_mesh_data(struct ieee80211_
}
IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_frames);
@ -68,3 +104,29 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
ieee80211_add_pending_skb(local, fwd_skb);
rx_accept:
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -2018,6 +2018,8 @@ void __ieee80211_xmit_fast(struct ieee80
struct ieee80211_fast_tx *fast_tx,
struct sk_buff *skb, bool ampdu,
const u8 *da, const u8 *sa);
+void ieee80211_aggr_check(struct ieee80211_sub_if_data *sdata,
+ struct sta_info *sta, struct sk_buff *skb);
/* HT */
void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata,
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -1191,10 +1191,8 @@ static bool ieee80211_tx_prep_agg(struct
return queued;
}
-static void
-ieee80211_aggr_check(struct ieee80211_sub_if_data *sdata,
- struct sta_info *sta,
- struct sk_buff *skb)
+void ieee80211_aggr_check(struct ieee80211_sub_if_data *sdata,
+ struct sta_info *sta, struct sk_buff *skb)
{
struct rate_control_ref *ref = sdata->local->rate_ctrl;
u16 tid;

View File

@ -11,7 +11,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -2847,6 +2847,9 @@ ieee80211_rx_mesh_data(struct ieee80211_
@@ -2904,6 +2904,9 @@ ieee80211_rx_mesh_data(struct ieee80211_
if (skb_cow_head(fwd_skb, hdrlen - sizeof(struct ethhdr)))
return RX_DROP_UNUSABLE;
@ -21,7 +21,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
}
fwd_hdr = skb_push(fwd_skb, hdrlen - sizeof(struct ethhdr));
@@ -2861,7 +2864,7 @@ ieee80211_rx_mesh_data(struct ieee80211_
@@ -2918,7 +2921,7 @@ ieee80211_rx_mesh_data(struct ieee80211_
hdrlen += ETH_ALEN;
else
fwd_skb->protocol = htons(fwd_skb->len - hdrlen);

View File

@ -0,0 +1,52 @@
From: Felix Fietkau <nbd@nbd.name>
Date: Sun, 26 Feb 2023 20:30:20 +0100
Subject: [PATCH] wifi: mac80211: fix mesh path discovery based on unicast
packets
If a packet has reached its intended destination, it was bumped to the code
that accepts it, without first checking if a mesh_path needs to be created
based on the discovered source.
Fix this by moving the destination address check further down
Fixes: 986e43b19ae9 ("wifi: mac80211: fix receiving A-MSDU frames on mesh interfaces")
Signed-off-by: Felix Fietkau <nbd@nbd.name>
---
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -2824,17 +2824,6 @@ ieee80211_rx_mesh_data(struct ieee80211_
mesh_rmc_check(sdata, eth->h_source, mesh_hdr))
return RX_DROP_MONITOR;
- /* Frame has reached destination. Don't forward */
- if (ether_addr_equal(sdata->vif.addr, eth->h_dest))
- goto rx_accept;
-
- if (!ifmsh->mshcfg.dot11MeshForwarding) {
- if (is_multicast_ether_addr(eth->h_dest))
- goto rx_accept;
-
- return RX_DROP_MONITOR;
- }
-
/* forward packet */
if (sdata->crypto_tx_tailroom_needed_cnt)
tailroom = IEEE80211_ENCRYPT_TAILROOM;
@@ -2881,6 +2870,17 @@ ieee80211_rx_mesh_data(struct ieee80211_
rcu_read_unlock();
}
+ /* Frame has reached destination. Don't forward */
+ if (ether_addr_equal(sdata->vif.addr, eth->h_dest))
+ goto rx_accept;
+
+ if (!ifmsh->mshcfg.dot11MeshForwarding) {
+ if (is_multicast_ether_addr(eth->h_dest))
+ goto rx_accept;
+
+ return RX_DROP_MONITOR;
+ }
+
skb_set_queue_mapping(skb, ieee802_1d_to_ac[skb->priority]);
if (!multicast &&

View File

@ -0,0 +1,68 @@
From: Muna Sinada <quic_msinada@quicinc.com>
Date: Wed, 5 Oct 2022 14:54:45 -0700
Subject: [PATCH] wifi: mac80211: Add VHT MU-MIMO related flags in
ieee80211_bss_conf
Adding flags for SU Beamformer, SU Beamformee, MU Beamformer and
MU Beamformee for VHT. This is utilized to pass MU-MIMO
configurations from user space to driver in AP mode.
Signed-off-by: Muna Sinada <quic_msinada@quicinc.com>
Link: https://lore.kernel.org/r/1665006886-23874-1-git-send-email-quic_msinada@quicinc.com
[fixed indentation, removed redundant !!]
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -653,6 +653,14 @@ struct ieee80211_fils_discovery {
* write-protected by sdata_lock and local->mtx so holding either is fine
* for read access.
* @color_change_color: the bss color that will be used after the change.
+ * @vht_su_beamformer: in AP mode, does this BSS support operation as an VHT SU
+ * beamformer
+ * @vht_su_beamformee: in AP mode, does this BSS support operation as an VHT SU
+ * beamformee
+ * @vht_mu_beamformer: in AP mode, does this BSS support operation as an VHT MU
+ * beamformer
+ * @vht_mu_beamformee: in AP mode, does this BSS support operation as an VHT MU
+ * beamformee
*/
struct ieee80211_bss_conf {
const u8 *bssid;
@@ -726,6 +734,11 @@ struct ieee80211_bss_conf {
bool color_change_active;
u8 color_change_color;
+
+ bool vht_su_beamformer;
+ bool vht_su_beamformee;
+ bool vht_mu_beamformer;
+ bool vht_mu_beamformee;
};
/**
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -1251,6 +1251,21 @@ static int ieee80211_start_ap(struct wip
prev_beacon_int = link_conf->beacon_int;
link_conf->beacon_int = params->beacon_interval;
+ if (params->vht_cap) {
+ link_conf->vht_su_beamformer =
+ params->vht_cap->vht_cap_info &
+ cpu_to_le32(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE);
+ link_conf->vht_su_beamformee =
+ params->vht_cap->vht_cap_info &
+ cpu_to_le32(IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE);
+ link_conf->vht_mu_beamformer =
+ params->vht_cap->vht_cap_info &
+ cpu_to_le32(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE);
+ link_conf->vht_mu_beamformee =
+ params->vht_cap->vht_cap_info &
+ cpu_to_le32(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
+ }
+
if (params->he_cap && params->he_oper) {
link_conf->he_support = true;
link_conf->htc_trig_based_pkt_ext =

View File

@ -0,0 +1,68 @@
From: Muna Sinada <quic_msinada@quicinc.com>
Date: Wed, 5 Oct 2022 14:54:46 -0700
Subject: [PATCH] wifi: mac80211: Add HE MU-MIMO related flags in
ieee80211_bss_conf
Adding flags for SU Beamformer, SU Beamformee, MU Beamformer and Full
Bandwidth UL MU-MIMO for HE. This is utilized to pass MU-MIMO
configurations from user space to driver in AP mode.
Signed-off-by: Muna Sinada <quic_msinada@quicinc.com>
Link: https://lore.kernel.org/r/1665006886-23874-2-git-send-email-quic_msinada@quicinc.com
[fixed indentation, removed redundant !!]
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -661,6 +661,15 @@ struct ieee80211_fils_discovery {
* beamformer
* @vht_mu_beamformee: in AP mode, does this BSS support operation as an VHT MU
* beamformee
+ * @he_su_beamformer: in AP-mode, does this BSS support operation as an HE SU
+ * beamformer
+ * @he_su_beamformee: in AP-mode, does this BSS support operation as an HE SU
+ * beamformee
+ * @he_mu_beamformer: in AP-mode, does this BSS support operation as an HE MU
+ * beamformer
+ * @he_full_ul_mumimo: does this BSS support the reception (AP) or transmission
+ * (non-AP STA) of an HE TB PPDU on an RU that spans the entire PPDU
+ * bandwidth
*/
struct ieee80211_bss_conf {
const u8 *bssid;
@@ -739,6 +748,10 @@ struct ieee80211_bss_conf {
bool vht_su_beamformee;
bool vht_mu_beamformer;
bool vht_mu_beamformee;
+ bool he_su_beamformer;
+ bool he_su_beamformee;
+ bool he_mu_beamformer;
+ bool he_full_ul_mumimo;
};
/**
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -1280,6 +1280,21 @@ static int ieee80211_start_ap(struct wip
changed |= BSS_CHANGED_HE_BSS_COLOR;
}
+ if (params->he_cap) {
+ link_conf->he_su_beamformer =
+ params->he_cap->phy_cap_info[3] &
+ IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER;
+ link_conf->he_su_beamformee =
+ params->he_cap->phy_cap_info[4] &
+ IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE;
+ link_conf->he_mu_beamformer =
+ params->he_cap->phy_cap_info[4] &
+ IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER;
+ link_conf->he_full_ul_mumimo =
+ params->he_cap->phy_cap_info[2] &
+ IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO;
+ }
+
if (sdata->vif.type == NL80211_IFTYPE_AP &&
params->mbssid_config.tx_wdev) {
err = ieee80211_set_ap_mbssid_options(sdata,

View File

@ -0,0 +1,60 @@
From: Ryder Lee <ryder.lee@mediatek.com>
Date: Sat, 18 Feb 2023 01:50:05 +0800
Subject: [PATCH] wifi: mac80211: introduce
ieee80211_refresh_tx_agg_session_timer()
This allows low level drivers to refresh the tx agg session timer, based on
querying stats from the firmware usually. Especially for some mt76 devices
support .net_fill_forward_path would bypass mac80211, which leads to tx BA
session timeout for certain clients.
Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
---
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -5970,6 +5970,18 @@ void ieee80211_queue_delayed_work(struct
unsigned long delay);
/**
+ * ieee80211_refresh_tx_agg_session_timer - Refresh a tx agg session timer.
+ * @sta: the station for which to start a BA session
+ * @tid: the TID to BA on.
+ *
+ * This function allows low level driver to refresh tx agg session timer
+ * to maintain BA session, the session level will still be managed by the
+ * mac80211.
+ */
+void ieee80211_refresh_tx_agg_session_timer(struct ieee80211_sta *sta,
+ u16 tid);
+
+/**
* ieee80211_start_tx_ba_session - Start a tx Block Ack session.
* @sta: the station for which to start a BA session
* @tid: the TID to BA on.
--- a/net/mac80211/agg-tx.c
+++ b/net/mac80211/agg-tx.c
@@ -552,6 +552,23 @@ void ieee80211_tx_ba_session_handle_star
ieee80211_send_addba_with_timeout(sta, tid_tx);
}
+void ieee80211_refresh_tx_agg_session_timer(struct ieee80211_sta *pubsta,
+ u16 tid)
+{
+ struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
+ struct tid_ampdu_tx *tid_tx;
+
+ if (WARN_ON_ONCE(tid >= IEEE80211_NUM_TIDS))
+ return;
+
+ tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]);
+ if (!tid_tx)
+ return;
+
+ tid_tx->last_tx = jiffies;
+}
+EXPORT_SYMBOL(ieee80211_refresh_tx_agg_session_timer);
+
/*
* After accepting the AddBA Response we activated a timer,
* resetting it after each frame that we send.

View File

@ -0,0 +1,77 @@
From: Felix Fietkau <nbd@nbd.name>
Date: Thu, 2 Mar 2023 13:52:29 +0100
Subject: [PATCH] wifi: mac80211: add mesh fast-rx support
This helps bring down rx CPU usage by avoiding calls to the rx handlers in
the slow path. Supports forwarding and local rx, including A-MSDU.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
---
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -4572,6 +4572,12 @@ void ieee80211_check_fast_rx(struct sta_
}
break;
+ case NL80211_IFTYPE_MESH_POINT:
+ fastrx.expected_ds_bits = cpu_to_le16(IEEE80211_FCTL_FROMDS |
+ IEEE80211_FCTL_TODS);
+ fastrx.da_offs = offsetof(struct ieee80211_hdr, addr3);
+ fastrx.sa_offs = offsetof(struct ieee80211_hdr, addr4);
+ break;
default:
goto clear;
}
@@ -4780,6 +4786,7 @@ static bool ieee80211_invoke_fast_rx(str
struct sk_buff *skb = rx->skb;
struct ieee80211_hdr *hdr = (void *)skb->data;
struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
+ static ieee80211_rx_result res;
int orig_len = skb->len;
int hdrlen = ieee80211_hdrlen(hdr->frame_control);
int snap_offs = hdrlen;
@@ -4841,7 +4848,8 @@ static bool ieee80211_invoke_fast_rx(str
snap_offs += IEEE80211_CCMP_HDR_LEN;
}
- if (!(status->rx_flags & IEEE80211_RX_AMSDU)) {
+ if (!ieee80211_vif_is_mesh(&rx->sdata->vif) &&
+ !(status->rx_flags & IEEE80211_RX_AMSDU)) {
if (!pskb_may_pull(skb, snap_offs + sizeof(*payload)))
return false;
@@ -4880,13 +4888,29 @@ static bool ieee80211_invoke_fast_rx(str
/* do the header conversion - first grab the addresses */
ether_addr_copy(addrs.da, skb->data + fast_rx->da_offs);
ether_addr_copy(addrs.sa, skb->data + fast_rx->sa_offs);
- skb_postpull_rcsum(skb, skb->data + snap_offs,
- sizeof(rfc1042_header) + 2);
- /* remove the SNAP but leave the ethertype */
- skb_pull(skb, snap_offs + sizeof(rfc1042_header));
+ if (ieee80211_vif_is_mesh(&rx->sdata->vif)) {
+ skb_pull(skb, snap_offs - 2);
+ put_unaligned_be16(skb->len - 2, skb->data);
+ } else {
+ skb_postpull_rcsum(skb, skb->data + snap_offs,
+ sizeof(rfc1042_header) + 2);
+
+ /* remove the SNAP but leave the ethertype */
+ skb_pull(skb, snap_offs + sizeof(rfc1042_header));
+ }
/* push the addresses in front */
memcpy(skb_push(skb, sizeof(addrs)), &addrs, sizeof(addrs));
+ res = ieee80211_rx_mesh_data(rx->sdata, rx->sta, rx->skb);
+ switch (res) {
+ case RX_QUEUED:
+ return true;
+ case RX_CONTINUE:
+ break;
+ default:
+ goto drop;
+ }
+
ieee80211_rx_8023(rx, fast_rx, orig_len);
return true;

View File

@ -87,7 +87,7 @@
CFG80211_TESTMODE_DUMP(ieee80211_testmode_dump)
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -1536,6 +1536,7 @@ struct ieee80211_local {
@@ -1535,6 +1535,7 @@ struct ieee80211_local {
int dynamic_ps_forced_timeout;
int user_power_level; /* in dBm, for all interfaces */

View File

@ -8,9 +8,9 @@ PKG_LICENSE_FILES:=
PKG_SOURCE_URL:=https://github.com/openwrt/mt76
PKG_SOURCE_PROTO:=git
PKG_SOURCE_DATE:=2023-02-02
PKG_SOURCE_VERSION:=b2360d59747c6fed2b65bc1c3563c10593c83f3e
PKG_MIRROR_HASH:=f85f00fa8f549de348a115f92c4f0235e413ed924669aece390c7570882526dd
PKG_SOURCE_DATE:=2023-03-01
PKG_SOURCE_VERSION:=c32d6d849c43792abd8007e13e468b12d6d6e0b7
PKG_MIRROR_HASH:=b7004bc920ba44cef2f7868d94beb2d288ff9d399af624ce5dad972f953723c8
PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
PKG_USE_NINJA:=0

View File

@ -12,9 +12,9 @@ PKG_RELEASE:=1
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL=$(PROJECT_GIT)/project/fstools.git
PKG_MIRROR_HASH:=dbb3d721eb606606c2fc0875067449e5c882d22affaa8dc70367daff7c198152
PKG_SOURCE_DATE:=2023-02-15
PKG_SOURCE_VERSION:=12155d3881b9bdd44b8682970638dbfd9f55e2cb
PKG_MIRROR_HASH:=4ec370a1cdc9fa69131f1403b064d2e05d54ee865411917410d7540454265319
PKG_SOURCE_DATE:=2023-02-28
PKG_SOURCE_VERSION:=bfe882d5ff4eeebb8f57c8a0f9b9e767a57870d8
CMAKE_INSTALL:=1
PKG_LICENSE:=GPL-2.0

View File

@ -160,7 +160,6 @@
phy0: port8@8 {
reg = <8>;
label = "cpu";
ethernet = <&eth0>;
fixed-link {

View File

@ -99,7 +99,6 @@
port@5 {
reg = <5>;
label = "cpu";
ethernet = <&eth0>;
};
};

View File

@ -1,7 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
#include "ar9344.dtsi"
&spi {
status = "okay";
@ -55,9 +53,3 @@
};
};
};
&wmac {
status = "okay";
qca,no-eeprom;
};

View File

@ -0,0 +1,36 @@
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
#include "ar9344_mikrotik_routerboard.dtsi"
#include "ar9344_mikrotik_routerboard-16m-nor.dtsi"
/ {
model = "MikroTik RouterBOARD 911-2Hn/5Hn (Lite2/Lite5)";
compatible = "mikrotik,routerboard-911-lite", "qca,ar9344";
};
&leds {
pinctrl-names = "default";
pinctrl-0 = <&enable_gpio_20>;
lan {
label = "green:lan";
gpios = <&gpio 20 GPIO_ACTIVE_LOW>;
};
power {
label = "green:power";
gpios = <&gpio 11 GPIO_ACTIVE_HIGH>;
default-state = "on";
};
led_user: user {
label = "green:user";
gpios = <&gpio 3 GPIO_ACTIVE_LOW>;
};
};
&pinmux {
enable_gpio_20: pinmux_gpio_out_function5 {
pinctrl-single,bits = <0x14 0x0 0xff>;
};
};

View File

@ -1,91 +1,27 @@
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
#include "ar9344_mikrotik_routerboard.dtsi"
#include "ar9344_mikrotik_routerboard-16m-nor.dtsi"
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>
/ {
compatible = "mikrotik,routerboard-lhg-5nd", "qca,ar9344";
model = "MikroTik RouterBOARD LHG 5nD";
aliases {
led-boot = &led_user;
led-failsafe = &led_user;
led-running = &led_user;
led-upgrade = &led_user;
};
leds {
compatible = "gpio-leds";
power {
label = "blue:power";
gpios = <&gpio 11 GPIO_ACTIVE_HIGH>;
default-state = "on";
};
rssilow {
label = "green:rssilow";
gpios = <&gpio 13 GPIO_ACTIVE_LOW>;
};
rssimediumlow {
label = "green:rssimediumlow";
gpios = <&gpio 12 GPIO_ACTIVE_LOW>;
};
rssimedium {
label = "green:rssimedium";
gpios = <&gpio 4 GPIO_ACTIVE_LOW>;
};
rssimediumhigh {
label = "green:rssimediumhigh";
gpios = <&gpio 21 GPIO_ACTIVE_LOW>;
};
rssihigh {
label = "green:rssihigh";
gpios = <&gpio 18 GPIO_ACTIVE_LOW>;
};
led_user: user {
label = "white:user";
gpios = <&gpio 20 GPIO_ACTIVE_LOW>;
};
lan {
label = "green:lan";
gpios = <&gpio 14 GPIO_ACTIVE_LOW>;
};
};
keys {
compatible = "gpio-keys";
reset {
label = "reset";
linux,code = <KEY_RESTART>;
gpios = <&gpio 15 GPIO_ACTIVE_LOW>;
debounce-interval = <60>;
};
};
};
&eth0 {
status = "okay";
&leds {
power {
label = "blue:power";
gpios = <&gpio 11 GPIO_ACTIVE_HIGH>;
default-state = "on";
};
phy-handle = <&swphy0>;
led_user: user {
label = "white:user";
gpios = <&gpio 20 GPIO_ACTIVE_LOW>;
};
gmac-config {
device = <&gmac>;
switch-phy-swap = <1>;
lan {
label = "green:lan";
gpios = <&gpio 14 GPIO_ACTIVE_LOW>;
};
};
&eth1 {
status = "okay";
compatible = "syscon", "simple-mfd";
};

View File

@ -1,185 +0,0 @@
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
#include "ar9344.dtsi"
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>
/ {
compatible = "mikrotik,routerboard-sxt-5n", "qca,ar9344";
model = "MikroTik SXT 5N platform";
aliases {
led-boot = &led_user;
led-failsafe = &led_user;
led-running = &led_user;
led-upgrade = &led_user;
};
leds {
compatible = "gpio-leds";
power {
label = "green:power";
gpios = <&gpio 11 GPIO_ACTIVE_HIGH>;
default-state = "on";
};
rssilow {
label = "green:rssilow";
gpios = <&gpio 13 GPIO_ACTIVE_LOW>;
};
rssimediumlow {
label = "green:rssimediumlow";
gpios = <&gpio 12 GPIO_ACTIVE_LOW>;
};
rssimedium {
label = "green:rssimedium";
gpios = <&gpio 4 GPIO_ACTIVE_LOW>;
};
rssimediumhigh {
label = "green:rssimediumhigh";
gpios = <&gpio 21 GPIO_ACTIVE_LOW>;
};
rssihigh {
label = "green:rssihigh";
gpios = <&gpio 18 GPIO_ACTIVE_LOW>;
};
led_user: user {
label = "green:user";
gpios = <&gpio 3 GPIO_ACTIVE_LOW>;
};
};
keys {
compatible = "gpio-keys";
reset {
label = "reset";
linux,code = <KEY_RESTART>;
gpios = <&gpio 15 GPIO_ACTIVE_LOW>;
debounce-interval = <60>;
};
};
gpio-export {
compatible = "gpio-export";
gpio_nand_power {
gpio-export,name = "sxt5n:power:nand";
gpio-export,output = <0>;
gpios = <&gpio 14 GPIO_ACTIVE_LOW>;
};
};
beeper {
compatible = "gpio-beeper";
gpios = <&gpio 19 GPIO_ACTIVE_HIGH>;
};
};
&spi {
status = "okay";
flash@0 {
compatible = "jedec,spi-nor";
reg = <0>;
spi-max-frequency = <40000000>;
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
partition@0 {
label = "RouterBoot";
reg = <0x0 0x20000>;
compatible = "mikrotik,routerboot-partitions";
#address-cells = <1>;
#size-cells = <1>;
partition@0 {
label = "bootloader1";
reg = <0x0 0x0>;
read-only;
};
hard_config {
read-only;
};
bios {
size = <0x1000>;
read-only;
};
soft_config {
};
partition@10000 {
label = "bootloader2";
reg = <0x10000 0x10000>;
read-only;
};
};
};
};
};
&nand {
status = "okay";
nand-ecc-mode = "soft";
qca,nand-swap-dma;
qca,nand-scan-fixup;
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
partition@0 {
label = "booter";
reg = <0x0000000 0x0040000>;
read-only;
};
partition@40000 {
label = "kernel";
reg = <0x0040000 0x03c0000>;
};
partition@400000 {
label = "ubi";
reg = <0x0400000 0x7c00000>;
};
};
};
&eth0 {
status = "okay";
phy-handle = <&swphy0>;
gmac-config {
device = <&gmac>;
switch-phy-swap = <1>;
};
};
&eth1 {
status = "okay";
compatible = "syscon", "simple-mfd";
};
&wmac {
status = "okay";
qca,no-eeprom;
};

View File

@ -1,8 +1,114 @@
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
#include "ar9344_mikrotik_routerboard-sxt-5n.dtsi"
#include "ar9344_mikrotik_routerboard.dtsi"
/ {
compatible = "mikrotik,routerboard-sxt-5nd-r2", "qca,ar9344";
model = "MikroTik RouterBOARD SXT 5nD r2 (SXT Lite5)";
gpio-export {
compatible = "gpio-export";
gpio_nand_power {
gpio-export,name = "sxt5n:power:nand";
gpio-export,output = <0>;
gpios = <&gpio 14 GPIO_ACTIVE_LOW>;
};
};
beeper {
compatible = "gpio-beeper";
gpios = <&gpio 19 GPIO_ACTIVE_HIGH>;
};
};
&leds {
power {
label = "green:power";
gpios = <&gpio 11 GPIO_ACTIVE_HIGH>;
default-state = "on";
};
led_user: user {
label = "green:user";
gpios = <&gpio 3 GPIO_ACTIVE_LOW>;
};
};
&spi {
status = "okay";
flash@0 {
compatible = "jedec,spi-nor";
reg = <0>;
spi-max-frequency = <40000000>;
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
partition@0 {
label = "RouterBoot";
reg = <0x0 0x20000>;
compatible = "mikrotik,routerboot-partitions";
#address-cells = <1>;
#size-cells = <1>;
partition@0 {
label = "bootloader1";
reg = <0x0 0x0>;
read-only;
};
hard_config {
read-only;
};
bios {
size = <0x1000>;
read-only;
};
soft_config {
};
partition@10000 {
label = "bootloader2";
reg = <0x10000 0x10000>;
read-only;
};
};
};
};
};
&nand {
status = "okay";
nand-ecc-mode = "soft";
qca,nand-swap-dma;
qca,nand-scan-fixup;
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
partition@0 {
label = "booter";
reg = <0x0000000 0x0040000>;
read-only;
};
partition@40000 {
label = "kernel";
reg = <0x0040000 0x03c0000>;
};
partition@400000 {
label = "ubi";
reg = <0x0400000 0x7c00000>;
};
};
};

View File

@ -0,0 +1,78 @@
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
#include "ar9344.dtsi"
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>
/ {
aliases {
led-boot = &led_user;
led-failsafe = &led_user;
led-running = &led_user;
led-upgrade = &led_user;
};
keys {
compatible = "gpio-keys";
reset {
label = "reset";
linux,code = <KEY_RESTART>;
gpios = <&gpio 15 GPIO_ACTIVE_LOW>;
debounce-interval = <60>;
};
};
leds: leds {
compatible = "gpio-leds";
rssilow {
label = "green:rssilow";
gpios = <&gpio 13 GPIO_ACTIVE_LOW>;
};
rssimediumlow {
label = "green:rssimediumlow";
gpios = <&gpio 12 GPIO_ACTIVE_LOW>;
};
rssimedium {
label = "green:rssimedium";
gpios = <&gpio 4 GPIO_ACTIVE_LOW>;
};
rssimediumhigh {
label = "green:rssimediumhigh";
gpios = <&gpio 21 GPIO_ACTIVE_LOW>;
};
rssihigh {
label = "green:rssihigh";
gpios = <&gpio 18 GPIO_ACTIVE_LOW>;
};
};
};
&eth0 {
status = "okay";
phy-handle = <&swphy0>;
gmac-config {
device = <&gmac>;
switch-phy-swap = <1>;
};
};
&eth1 {
status = "okay";
compatible = "syscon", "simple-mfd";
};
&wmac {
status = "okay";
qca,no-eeprom;
};

View File

@ -2697,7 +2697,7 @@ define Device/teltonika_rut300
DEVICE_VENDOR := Teltonika
DEVICE_MODEL := RUT300
SUPPORTED_TELTONIKA_DEVICES := teltonika,rut30x
DEVICE_PACKAGES := -kmod-ath9k -uboot-envtools -wpad-basic-wolfssl kmod-usb2
DEVICE_PACKAGES := -kmod-ath9k -uboot-envtools -wpad-basic-openssl kmod-usb2
IMAGE_SIZE := 15552k
IMAGES += factory.bin
IMAGE/factory.bin = append-kernel | pad-to $$$$(BLOCKSIZE) | \

View File

@ -9,6 +9,16 @@ define Device/mikrotik_routerboard-493g
endef
TARGET_DEVICES += mikrotik_routerboard-493g
define Device/mikrotik_routerboard-911-lite
$(Device/mikrotik_nor)
SOC := ar9344
DEVICE_MODEL := RouterBOARD 911 Lite2/Lite5 (2Hn/5Hn)
DEVICE_PACKAGES += rssileds
IMAGE_SIZE := 16256k
SUPPORTED_DEVICES += rb-911-2hn rb-911-5hn
endef
TARGET_DEVICES += mikrotik_routerboard-911-lite
define Device/mikrotik_routerboard-912uag-2hpnd
$(Device/mikrotik_nand)
SOC := ar9342

View File

@ -6,6 +6,16 @@ board_config_update
board=$(board_name)
case "$board" in
mikrotik,routerboard-911-lite|\
mikrotik,routerboard-lhg-5nd)
ucidef_set_led_netdev "lan" "lan" "green:lan" "eth0"
ucidef_set_rssimon "wlan0" "200000" "1"
ucidef_set_led_rssi "rssilow" "rssilow" "green:rssilow" "wlan0" "1" "100"
ucidef_set_led_rssi "rssimediumlow" "rssimediumlow" "green:rssimediumlow" "wlan0" "20" "100"
ucidef_set_led_rssi "rssimedium" "rssimedium" "green:rssimedium" "wlan0" "40" "100"
ucidef_set_led_rssi "rssimediumhigh" "rssimediumhigh" "green:rssimediumhigh" "wlan0" "60" "100"
ucidef_set_led_rssi "rssihigh" "rssihigh" "green:rssihigh" "wlan0" "80" "100"
;;
mikrotik,routerboard-951ui-2nd|\
mikrotik,routerboard-952ui-5ac2nd)
ucidef_set_led_netdev "port1" "port1" "green:port1" "eth1"
@ -19,15 +29,6 @@ mikrotik,routerboard-mapl-2nd|\
mikrotik,routerboard-wap-2nd)
ucidef_set_led_netdev "lan" "lan" "green:lan" "eth0"
;;
mikrotik,routerboard-lhg-5nd)
ucidef_set_led_netdev "lan" "lan" "green:lan" "eth0"
ucidef_set_rssimon "wlan0" "200000" "1"
ucidef_set_led_rssi "rssilow" "rssilow" "green:rssilow" "wlan0" "1" "100"
ucidef_set_led_rssi "rssimediumlow" "rssimediumlow" "green:rssimediumlow" "wlan0" "20" "100"
ucidef_set_led_rssi "rssimedium" "rssimedium" "green:rssimedium" "wlan0" "40" "100"
ucidef_set_led_rssi "rssimediumhigh" "rssimediumhigh" "green:rssimediumhigh" "wlan0" "60" "100"
ucidef_set_led_rssi "rssihigh" "rssihigh" "green:rssihigh" "wlan0" "80" "100"
;;
mikrotik,routerboard-map-2nd)
ucidef_set_led_netdev "eth_1" "eth_1" "green:eth_1" "eth1"
ucidef_set_led_switch "eth_2" "eth_2" "green:eth_2" "switch0" "0x4"

View File

@ -14,6 +14,7 @@ ath79_setup_interfaces()
ucidef_add_switch "switch1" \
"0@eth1" "1:lan:4" "2:lan:1" "3:lan:2" "4:lan:3"
;;
mikrotik,routerboard-911-lite|\
mikrotik,routerboard-912uag-2hpnd|\
mikrotik,routerboard-lhg-2nd|\
mikrotik,routerboard-lhg-5nd|\
@ -52,6 +53,7 @@ ath79_setup_macs()
local mac_base="$(cat /sys/firmware/mikrotik/hard_config/mac_base)"
case "$board" in
mikrotik,routerboard-911-lite|\
mikrotik,routerboard-912uag-2hpnd|\
mikrotik,routerboard-lhg-2nd|\
mikrotik,routerboard-lhg-5nd|\

View File

@ -23,6 +23,7 @@ board=$(board_name)
case "$FIRMWARE" in
"ath9k-eeprom-ahb-18100000.wmac.bin")
case $board in
mikrotik,routerboard-911-lite|\
mikrotik,routerboard-912uag-2hpnd|\
mikrotik,routerboard-lhg-2nd|\
mikrotik,routerboard-lhg-5nd|\

View File

@ -258,7 +258,7 @@ SVN-Revision: 35130
#include <linux/uaccess.h>
#include <linux/ipv6.h>
#include <linux/icmpv6.h>
@@ -943,10 +944,10 @@ static void tcp_v6_send_response(const s
@@ -944,10 +945,10 @@ static void tcp_v6_send_response(const s
topt = (__be32 *)(t1 + 1);
if (tsecr) {

View File

@ -12,7 +12,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.org>
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3554,6 +3554,13 @@ N: bcm113*
@@ -3555,6 +3555,13 @@ N: bcm113*
N: bcm216*
N: kona

View File

@ -90,7 +90,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
+...
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3554,6 +3554,13 @@ N: bcm113*
@@ -3555,6 +3555,13 @@ N: bcm113*
N: bcm216*
N: kona

View File

@ -28,7 +28,7 @@ Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3562,7 +3562,7 @@ F: Documentation/devicetree/bindings/med
@@ -3563,7 +3563,7 @@ F: Documentation/devicetree/bindings/med
F: drivers/staging/media/rpivid
BROADCOM BCM2835 CAMERA DRIVER

View File

@ -31,7 +31,7 @@ Reported-by: kbuild test robot <lkp@intel.com>
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3566,7 +3566,7 @@ M: Raspberry Pi Kernel Maintenance <kern
@@ -3567,7 +3567,7 @@ M: Raspberry Pi Kernel Maintenance <kern
L: linux-media@vger.kernel.org
S: Maintained
F: drivers/media/platform/bcm2835/

View File

@ -25,7 +25,7 @@ Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -17529,6 +17529,14 @@ T: git git://linuxtv.org/media_tree.git
@@ -17530,6 +17530,14 @@ T: git git://linuxtv.org/media_tree.git
F: Documentation/devicetree/bindings/media/i2c/sony,imx412.yaml
F: drivers/media/i2c/imx412.c

View File

@ -35,7 +35,7 @@ Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3568,6 +3568,15 @@ S: Maintained
@@ -3569,6 +3569,15 @@ S: Maintained
F: drivers/media/platform/bcm2835/
F: Documentation/devicetree/bindings/media/brcm,bcm2835-unicam.yaml

View File

@ -132,7 +132,7 @@ Signed-off-by: David Plowman <david.plowman@raspberrypi.com>
+...
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -17543,6 +17543,7 @@ M: Raspberry Pi Kernel Maintenance <kern
@@ -17544,6 +17544,7 @@ M: Raspberry Pi Kernel Maintenance <kern
L: linux-media@vger.kernel.org
S: Maintained
T: git git://linuxtv.org/media_tree.git

View File

@ -132,7 +132,7 @@ Signed-off-by: Lee Jackson <info@arducam.com>
+...
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -17547,6 +17547,14 @@ F: Documentation/devicetree/bindings/med
@@ -17548,6 +17548,14 @@ F: Documentation/devicetree/bindings/med
F: Documentation/devicetree/bindings/media/i2c/imx477.yaml
F: drivers/media/i2c/imx477.c

View File

@ -26,7 +26,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -5742,13 +5742,13 @@ static const u32 hdmi_colorimetry_val[]
@@ -5743,13 +5743,13 @@ static const u32 hdmi_colorimetry_val[]
#undef ACE
/**
@ -43,7 +43,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
const struct drm_connector_state *conn_state)
{
u32 colorimetry_val;
@@ -5767,7 +5767,7 @@ drm_hdmi_avi_infoframe_colorspace(struct
@@ -5768,7 +5768,7 @@ drm_hdmi_avi_infoframe_colorspace(struct
frame->extended_colorimetry = (colorimetry_val >> 2) &
EXTENDED_COLORIMETRY_MASK;
}

View File

@ -63,7 +63,7 @@ Link: https://patchwork.freedesktop.org/patch/msgid/20220227124713.39766-6-noral
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -5980,6 +5980,14 @@ T: git git://anongit.freedesktop.org/drm
@@ -5981,6 +5981,14 @@ T: git git://anongit.freedesktop.org/drm
F: Documentation/devicetree/bindings/display/multi-inno,mi0283qt.txt
F: drivers/gpu/drm/tiny/mi0283qt.c

View File

@ -15,7 +15,7 @@ Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
--- a/arch/mips/bcm47xx/buttons.c
+++ b/arch/mips/bcm47xx/buttons.c
@@ -289,6 +289,12 @@ bcm47xx_buttons_linksys_wrt320n_v1[] __i
@@ -277,6 +277,12 @@ bcm47xx_buttons_linksys_wrt310nv1[] __in
};
static const struct gpio_keys_button
@ -28,9 +28,9 @@ Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
bcm47xx_buttons_linksys_wrt54g3gv2[] __initconst = {
BCM47XX_GPIO_KEY(5, KEY_WIMAX),
BCM47XX_GPIO_KEY(6, KEY_RESTART),
@@ -644,6 +650,9 @@ int __init bcm47xx_buttons_register(void
case BCM47XX_BOARD_LINKSYS_WRT320N_V1:
err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt320n_v1);
@@ -608,6 +614,9 @@ int __init bcm47xx_buttons_register(void
case BCM47XX_BOARD_LINKSYS_WRT310NV1:
err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt310nv1);
break;
+ case BCM47XX_BOARD_LINKSYS_WRT310NV2:
+ err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt310n_v2);

View File

@ -28,7 +28,7 @@ Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
{{BCM47XX_BOARD_LINKSYS_WRT610NV2, "Linksys WRT610N V2"}, "WRT610N", "2.0"},
--- a/arch/mips/bcm47xx/buttons.c
+++ b/arch/mips/bcm47xx/buttons.c
@@ -277,6 +277,12 @@ bcm47xx_buttons_linksys_wrt310nv1[] __in
@@ -283,6 +283,12 @@ bcm47xx_buttons_linksys_wrt310n_v2[] __i
};
static const struct gpio_keys_button
@ -41,9 +41,9 @@ Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
bcm47xx_buttons_linksys_wrt54g3gv2[] __initconst = {
BCM47XX_GPIO_KEY(5, KEY_WIMAX),
BCM47XX_GPIO_KEY(6, KEY_RESTART),
@@ -608,6 +614,9 @@ int __init bcm47xx_buttons_register(void
case BCM47XX_BOARD_LINKSYS_WRT310NV1:
err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt310nv1);
@@ -617,6 +623,9 @@ int __init bcm47xx_buttons_register(void
case BCM47XX_BOARD_LINKSYS_WRT310NV2:
err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt310n_v2);
break;
+ case BCM47XX_BOARD_LINKSYS_WRT320N_V1:
+ err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt320n_v1);

View File

@ -28,7 +28,7 @@ Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
bcm47xx_buttons_asus_rtn12[] __initconst = {
BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON),
BCM47XX_GPIO_KEY(1, KEY_RESTART),
@@ -502,6 +508,9 @@ int __init bcm47xx_buttons_register(void
@@ -490,6 +496,9 @@ int __init bcm47xx_buttons_register(void
int err;
switch (board) {
@ -55,7 +55,7 @@ Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
bcm47xx_leds_asus_rtn12[] __initconst = {
BCM47XX_GPIO_LED(2, "unk", "power", 1, LEDS_GPIO_DEFSTATE_ON),
BCM47XX_GPIO_LED(7, "unk", "wlan", 0, LEDS_GPIO_DEFSTATE_OFF),
@@ -571,6 +579,9 @@ void __init bcm47xx_leds_register(void)
@@ -563,6 +571,9 @@ void __init bcm47xx_leds_register(void)
enum bcm47xx_board board = bcm47xx_board_get();
switch (board) {

View File

@ -26,7 +26,7 @@ Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
{{BCM47XX_BOARD_NETGEAR_WGR614_V10, "Netgear WGR614 V10"}, "U12H139T01_NETGEAR"},
--- a/arch/mips/bcm47xx/buttons.c
+++ b/arch/mips/bcm47xx/buttons.c
@@ -398,6 +398,11 @@ bcm47xx_buttons_netgear_r6200_v1[] __ini
@@ -410,6 +410,11 @@ bcm47xx_buttons_netgear_r6200_v1[] __ini
};
static const struct gpio_keys_button
@ -38,7 +38,7 @@ Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
bcm47xx_buttons_netgear_wndr3400v1[] __initconst = {
BCM47XX_GPIO_KEY(4, KEY_RESTART),
BCM47XX_GPIO_KEY(6, KEY_WPS_BUTTON),
@@ -683,6 +688,9 @@ int __init bcm47xx_buttons_register(void
@@ -701,6 +706,9 @@ int __init bcm47xx_buttons_register(void
case BCM47XX_BOARD_NETGEAR_R6200_V1:
err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_r6200_v1);
break;

View File

@ -27,7 +27,7 @@ Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
{{BCM47XX_BOARD_NETGEAR_WNDR3400V2, "Netgear WNDR3400 V2"}, "U12H187T00_NETGEAR"},
--- a/arch/mips/bcm47xx/buttons.c
+++ b/arch/mips/bcm47xx/buttons.c
@@ -403,6 +403,12 @@ bcm47xx_buttons_netgear_r6300_v1[] __ini
@@ -415,6 +415,12 @@ bcm47xx_buttons_netgear_r6300_v1[] __ini
};
static const struct gpio_keys_button
@ -40,7 +40,7 @@ Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
bcm47xx_buttons_netgear_wndr3400v1[] __initconst = {
BCM47XX_GPIO_KEY(4, KEY_RESTART),
BCM47XX_GPIO_KEY(6, KEY_WPS_BUTTON),
@@ -691,6 +697,9 @@ int __init bcm47xx_buttons_register(void
@@ -709,6 +715,9 @@ int __init bcm47xx_buttons_register(void
case BCM47XX_BOARD_NETGEAR_R6300_V1:
err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_r6300_v1);
break;

View File

@ -36,7 +36,7 @@ Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
{{BCM47XX_BOARD_LINKSYS_WRT54G_TYPE_0708, "Linksys WRT54G/GS/GL"}, "0x0708", "42", "0x10"},
--- a/arch/mips/bcm47xx/buttons.c
+++ b/arch/mips/bcm47xx/buttons.c
@@ -448,6 +448,13 @@ bcm47xx_buttons_netgear_wnr3500lv1[] __i
@@ -460,6 +460,13 @@ bcm47xx_buttons_netgear_wnr3500lv1[] __i
};
static const struct gpio_keys_button
@ -50,7 +50,7 @@ Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
bcm47xx_buttons_netgear_wnr834bv2[] __initconst = {
BCM47XX_GPIO_KEY(6, KEY_RESTART),
};
@@ -718,6 +725,9 @@ int __init bcm47xx_buttons_register(void
@@ -736,6 +743,9 @@ int __init bcm47xx_buttons_register(void
case BCM47XX_BOARD_NETGEAR_WNR3500L:
err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wnr3500lv1);
break;
@ -62,7 +62,7 @@ Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
break;
--- a/arch/mips/bcm47xx/leds.c
+++ b/arch/mips/bcm47xx/leds.c
@@ -520,6 +520,14 @@ bcm47xx_leds_netgear_wnr3500lv1[] __init
@@ -528,6 +528,14 @@ bcm47xx_leds_netgear_wnr3500lv1[] __init
};
static const struct gpio_led
@ -77,7 +77,7 @@ Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
bcm47xx_leds_netgear_wnr834bv2[] __initconst = {
BCM47XX_GPIO_LED(2, "green", "power", 0, LEDS_GPIO_DEFSTATE_ON),
BCM47XX_GPIO_LED(3, "amber", "power", 0, LEDS_GPIO_DEFSTATE_OFF),
@@ -780,6 +788,9 @@ void __init bcm47xx_leds_register(void)
@@ -791,6 +799,9 @@ void __init bcm47xx_leds_register(void)
case BCM47XX_BOARD_NETGEAR_WNR3500L:
bcm47xx_set_pdata(bcm47xx_leds_netgear_wnr3500lv1);
break;

View File

@ -0,0 +1,65 @@
From fc605b914167de75432c3b5aae239fb191e84a31 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
Date: Wed, 8 Feb 2023 08:03:01 +0100
Subject: [PATCH] MIPS: BCM47XX: Add support for Linksys E2500 V3
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
It's a BCM5358 based home WiFi router. 16 MiB flash, 64 MiB RAM, BCM5325
switch, on-SoC 802.11n radio.
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
---
arch/mips/bcm47xx/board.c | 1 +
arch/mips/bcm47xx/buttons.c | 9 +++++++++
arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h | 1 +
3 files changed, 11 insertions(+)
--- a/arch/mips/bcm47xx/board.c
+++ b/arch/mips/bcm47xx/board.c
@@ -130,6 +130,7 @@ struct bcm47xx_board_type_list2 bcm47xx_
{{BCM47XX_BOARD_LINKSYS_E1000V21, "Linksys E1000 V2.1"}, "E1000", "2.1"},
{{BCM47XX_BOARD_LINKSYS_E1200V2, "Linksys E1200 V2"}, "E1200", "2.0"},
{{BCM47XX_BOARD_LINKSYS_E2000V1, "Linksys E2000 V1"}, "Linksys E2000", "1.0"},
+ {{BCM47XX_BOARD_LINKSYS_E2500V3, "Linksys E2500 V3"}, "E2500", "1.0"},
/* like WRT610N v2.0 */
{{BCM47XX_BOARD_LINKSYS_E3000V1, "Linksys E3000 V1"}, "E300", "1.0"},
{{BCM47XX_BOARD_LINKSYS_E3200V1, "Linksys E3200 V1"}, "E3200", "1.0"},
--- a/arch/mips/bcm47xx/buttons.c
+++ b/arch/mips/bcm47xx/buttons.c
@@ -223,6 +223,12 @@ bcm47xx_buttons_linksys_e2000v1[] __init
};
static const struct gpio_keys_button
+bcm47xx_buttons_linksys_e2500v3[] __initconst = {
+ BCM47XX_GPIO_KEY(9, KEY_WPS_BUTTON),
+ BCM47XX_GPIO_KEY(10, KEY_RESTART),
+};
+
+static const struct gpio_keys_button
bcm47xx_buttons_linksys_e3000v1[] __initconst = {
BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON),
BCM47XX_GPIO_KEY(6, KEY_RESTART),
@@ -617,6 +623,9 @@ int __init bcm47xx_buttons_register(void
case BCM47XX_BOARD_LINKSYS_E2000V1:
err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e2000v1);
break;
+ case BCM47XX_BOARD_LINKSYS_E2500V3:
+ err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e2500v3);
+ break;
case BCM47XX_BOARD_LINKSYS_E3000V1:
err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e3000v1);
break;
--- a/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h
+++ b/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h
@@ -61,6 +61,7 @@ enum bcm47xx_board {
BCM47XX_BOARD_LINKSYS_E1000V21,
BCM47XX_BOARD_LINKSYS_E1200V2,
BCM47XX_BOARD_LINKSYS_E2000V1,
+ BCM47XX_BOARD_LINKSYS_E2500V3,
BCM47XX_BOARD_LINKSYS_E3000V1,
BCM47XX_BOARD_LINKSYS_E3200V1,
BCM47XX_BOARD_LINKSYS_E4200V1,

View File

@ -0,0 +1,46 @@
From d61615c366a489646a1bfe5b33455f916762d5f4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
Date: Wed, 8 Feb 2023 10:16:37 +0100
Subject: [PATCH] net: bgmac: fix BCM5358 support by setting correct flags
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Code blocks handling BCMA_CHIP_ID_BCM5357 and BCMA_CHIP_ID_BCM53572 were
incorrectly unified. Chip package values are not unique and cannot be
checked independently. They are meaningful only in a context of a given
chip.
Packages BCM5358 and BCM47188 share the same value but then belong to
different chips. Code unification resulted in treating BCM5358 as
BCM47188 and broke its initialization.
Link: https://github.com/openwrt/openwrt/issues/8278
Fixes: cb1b0f90acfe ("net: ethernet: bgmac: unify code of the same family")
Cc: Jon Mason <jdmason@kudzu.us>
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Link: https://lore.kernel.org/r/20230208091637.16291-1-zajec5@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
---
drivers/net/ethernet/broadcom/bgmac-bcma.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
--- a/drivers/net/ethernet/broadcom/bgmac-bcma.c
+++ b/drivers/net/ethernet/broadcom/bgmac-bcma.c
@@ -240,12 +240,12 @@ static int bgmac_probe(struct bcma_devic
bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL1;
bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_PHY;
- if (ci->pkg == BCMA_PKG_ID_BCM47188 ||
- ci->pkg == BCMA_PKG_ID_BCM47186) {
+ if ((ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM47186) ||
+ (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == BCMA_PKG_ID_BCM47188)) {
bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII;
bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED;
}
- if (ci->pkg == BCMA_PKG_ID_BCM5358)
+ if (ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM5358)
bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_EPHYRMII;
break;
case BCMA_CHIP_ID_BCM53573:

View File

@ -0,0 +1,61 @@
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
Date: Mon, 27 Feb 2023 07:44:38 +0100
Subject: [PATCH] MIPS: BCM47XX: Add support for Huawei B593u-12
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
It's a BCM5358 based home router. One of very few bcm47xx devices with
cellular modems (here: LTE).
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
---
arch/mips/bcm47xx/board.c | 1 +
arch/mips/bcm47xx/leds.c | 8 ++++++++
arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h | 1 +
3 files changed, 10 insertions(+)
--- a/arch/mips/bcm47xx/board.c
+++ b/arch/mips/bcm47xx/board.c
@@ -193,6 +193,7 @@ struct bcm47xx_board_type_list1 bcm47xx_
/* boardtype, boardnum, boardrev */
static const
struct bcm47xx_board_type_list3 bcm47xx_board_list_board[] __initconst = {
+ {{BCM47XX_BOARD_HUAWEI_B593U_12, "Huawei B593u-12"}, "0x053d", "1234", "0x1301"},
{{BCM47XX_BOARD_HUAWEI_E970, "Huawei E970"}, "0x048e", "0x5347", "0x11"},
{{BCM47XX_BOARD_PHICOMM_M1, "Phicomm M1"}, "0x0590", "80", "0x1104"},
{{BCM47XX_BOARD_ZTE_H218N, "ZTE H218N"}, "0x053d", "1234", "0x1305"},
--- a/arch/mips/bcm47xx/leds.c
+++ b/arch/mips/bcm47xx/leds.c
@@ -223,6 +223,11 @@ bcm47xx_leds_dlink_dir330[] __initconst
/* Huawei */
static const struct gpio_led
+bcm47xx_leds_huawei_b593u_12[] __initconst = {
+ BCM47XX_GPIO_LED(5, "blue", "wlan", 0, LEDS_GPIO_DEFSTATE_OFF),
+};
+
+static const struct gpio_led
bcm47xx_leds_huawei_e970[] __initconst = {
BCM47XX_GPIO_LED(0, "unk", "wlan", 0, LEDS_GPIO_DEFSTATE_OFF),
};
@@ -672,6 +677,9 @@ void __init bcm47xx_leds_register(void)
bcm47xx_set_pdata(bcm47xx_leds_dlink_dir330);
break;
+ case BCM47XX_BOARD_HUAWEI_B593U_12:
+ bcm47xx_set_pdata(bcm47xx_leds_huawei_b593u_12);
+ break;
case BCM47XX_BOARD_HUAWEI_E970:
bcm47xx_set_pdata(bcm47xx_leds_huawei_e970);
break;
--- a/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h
+++ b/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h
@@ -53,6 +53,7 @@ enum bcm47xx_board {
BCM47XX_BOARD_DLINK_DIR130,
BCM47XX_BOARD_DLINK_DIR330,
+ BCM47XX_BOARD_HUAWEI_B593U_12,
BCM47XX_BOARD_HUAWEI_E970,
BCM47XX_BOARD_LINKSYS_E900V1,

View File

@ -0,0 +1,76 @@
From 327dabbd0111910a7d174b0b812d608d6b67bead Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
Date: Mon, 8 Aug 2022 23:05:25 +0200
Subject: [PATCH] bgmac: fix *initial* chip reset to support BCM5358
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
While bringing hardware up we should perform a full reset including the
switch bit (BGMAC_BCMA_IOCTL_SW_RESET aka SICF_SWRST). It's what
specification says and what reference driver does.
This seems to be critical for the BCM5358. Without this hardware doesn't
get initialized properly and doesn't seem to transmit or receive any
packets.
Originally bgmac was calling bgmac_chip_reset() before setting
"has_robosw" property which resulted in expected behaviour. That has
changed as a side effect of adding platform device support which
regressed BCM5358 support.
Fixes: f6a95a24957a ("net: ethernet: bgmac: Add platform device support")
Cc: Jon Mason <jdmason@kudzu.us>
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
---
drivers/net/ethernet/broadcom/bgmac.c | 8 ++++++--
drivers/net/ethernet/broadcom/bgmac.h | 2 ++
2 files changed, 8 insertions(+), 2 deletions(-)
--- a/drivers/net/ethernet/broadcom/bgmac.c
+++ b/drivers/net/ethernet/broadcom/bgmac.c
@@ -891,13 +891,13 @@ static void bgmac_chip_reset_idm_config(
if (iost & BGMAC_BCMA_IOST_ATTACHED) {
flags = BGMAC_BCMA_IOCTL_SW_CLKEN;
- if (!bgmac->has_robosw)
+ if (bgmac->in_init || !bgmac->has_robosw)
flags |= BGMAC_BCMA_IOCTL_SW_RESET;
}
bgmac_clk_enable(bgmac, flags);
}
- if (iost & BGMAC_BCMA_IOST_ATTACHED && !bgmac->has_robosw)
+ if (iost & BGMAC_BCMA_IOST_ATTACHED && (bgmac->in_init || !bgmac->has_robosw))
bgmac_idm_write(bgmac, BCMA_IOCTL,
bgmac_idm_read(bgmac, BCMA_IOCTL) &
~BGMAC_BCMA_IOCTL_SW_RESET);
@@ -1502,6 +1502,8 @@ int bgmac_enet_probe(struct bgmac *bgmac
struct net_device *net_dev = bgmac->net_dev;
int err;
+ bgmac->in_init = true;
+
bgmac_chip_intrs_off(bgmac);
net_dev->irq = bgmac->irq;
@@ -1562,6 +1564,8 @@ int bgmac_enet_probe(struct bgmac *bgmac
bgmac->b53_device = &bgmac_b53_dev;
}
+ bgmac->in_init = false;
+
err = register_netdev(bgmac->net_dev);
if (err) {
dev_err(bgmac->dev, "Cannot register net device\n");
--- a/drivers/net/ethernet/broadcom/bgmac.h
+++ b/drivers/net/ethernet/broadcom/bgmac.h
@@ -513,6 +513,8 @@ struct bgmac {
int irq;
u32 int_mask;
+ bool in_init;
+
/* Current MAC state */
int mac_speed;
int mac_duplex;

View File

@ -15,7 +15,7 @@ Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
--- a/arch/mips/bcm47xx/buttons.c
+++ b/arch/mips/bcm47xx/buttons.c
@@ -289,6 +289,12 @@ bcm47xx_buttons_linksys_wrt320n_v1[] __i
@@ -277,6 +277,12 @@ bcm47xx_buttons_linksys_wrt310nv1[] __in
};
static const struct gpio_keys_button
@ -28,9 +28,9 @@ Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
bcm47xx_buttons_linksys_wrt54g3gv2[] __initconst = {
BCM47XX_GPIO_KEY(5, KEY_WIMAX),
BCM47XX_GPIO_KEY(6, KEY_RESTART),
@@ -644,6 +650,9 @@ int __init bcm47xx_buttons_register(void
case BCM47XX_BOARD_LINKSYS_WRT320N_V1:
err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt320n_v1);
@@ -608,6 +614,9 @@ int __init bcm47xx_buttons_register(void
case BCM47XX_BOARD_LINKSYS_WRT310NV1:
err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt310nv1);
break;
+ case BCM47XX_BOARD_LINKSYS_WRT310NV2:
+ err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt310n_v2);

View File

@ -28,7 +28,7 @@ Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
{{BCM47XX_BOARD_LINKSYS_WRT610NV2, "Linksys WRT610N V2"}, "WRT610N", "2.0"},
--- a/arch/mips/bcm47xx/buttons.c
+++ b/arch/mips/bcm47xx/buttons.c
@@ -277,6 +277,12 @@ bcm47xx_buttons_linksys_wrt310nv1[] __in
@@ -283,6 +283,12 @@ bcm47xx_buttons_linksys_wrt310n_v2[] __i
};
static const struct gpio_keys_button
@ -41,9 +41,9 @@ Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
bcm47xx_buttons_linksys_wrt54g3gv2[] __initconst = {
BCM47XX_GPIO_KEY(5, KEY_WIMAX),
BCM47XX_GPIO_KEY(6, KEY_RESTART),
@@ -608,6 +614,9 @@ int __init bcm47xx_buttons_register(void
case BCM47XX_BOARD_LINKSYS_WRT310NV1:
err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt310nv1);
@@ -617,6 +623,9 @@ int __init bcm47xx_buttons_register(void
case BCM47XX_BOARD_LINKSYS_WRT310NV2:
err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt310n_v2);
break;
+ case BCM47XX_BOARD_LINKSYS_WRT320N_V1:
+ err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt320n_v1);

View File

@ -28,7 +28,7 @@ Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
bcm47xx_buttons_asus_rtn12[] __initconst = {
BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON),
BCM47XX_GPIO_KEY(1, KEY_RESTART),
@@ -502,6 +508,9 @@ int __init bcm47xx_buttons_register(void
@@ -490,6 +496,9 @@ int __init bcm47xx_buttons_register(void
int err;
switch (board) {
@ -55,7 +55,7 @@ Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
bcm47xx_leds_asus_rtn12[] __initconst = {
BCM47XX_GPIO_LED(2, "unk", "power", 1, LEDS_GPIO_DEFSTATE_ON),
BCM47XX_GPIO_LED(7, "unk", "wlan", 0, LEDS_GPIO_DEFSTATE_OFF),
@@ -571,6 +579,9 @@ void __init bcm47xx_leds_register(void)
@@ -563,6 +571,9 @@ void __init bcm47xx_leds_register(void)
enum bcm47xx_board board = bcm47xx_board_get();
switch (board) {

View File

@ -26,7 +26,7 @@ Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
{{BCM47XX_BOARD_NETGEAR_WGR614_V10, "Netgear WGR614 V10"}, "U12H139T01_NETGEAR"},
--- a/arch/mips/bcm47xx/buttons.c
+++ b/arch/mips/bcm47xx/buttons.c
@@ -398,6 +398,11 @@ bcm47xx_buttons_netgear_r6200_v1[] __ini
@@ -410,6 +410,11 @@ bcm47xx_buttons_netgear_r6200_v1[] __ini
};
static const struct gpio_keys_button
@ -38,7 +38,7 @@ Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
bcm47xx_buttons_netgear_wndr3400v1[] __initconst = {
BCM47XX_GPIO_KEY(4, KEY_RESTART),
BCM47XX_GPIO_KEY(6, KEY_WPS_BUTTON),
@@ -683,6 +688,9 @@ int __init bcm47xx_buttons_register(void
@@ -701,6 +706,9 @@ int __init bcm47xx_buttons_register(void
case BCM47XX_BOARD_NETGEAR_R6200_V1:
err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_r6200_v1);
break;

View File

@ -27,7 +27,7 @@ Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
{{BCM47XX_BOARD_NETGEAR_WNDR3400V2, "Netgear WNDR3400 V2"}, "U12H187T00_NETGEAR"},
--- a/arch/mips/bcm47xx/buttons.c
+++ b/arch/mips/bcm47xx/buttons.c
@@ -403,6 +403,12 @@ bcm47xx_buttons_netgear_r6300_v1[] __ini
@@ -415,6 +415,12 @@ bcm47xx_buttons_netgear_r6300_v1[] __ini
};
static const struct gpio_keys_button
@ -40,7 +40,7 @@ Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
bcm47xx_buttons_netgear_wndr3400v1[] __initconst = {
BCM47XX_GPIO_KEY(4, KEY_RESTART),
BCM47XX_GPIO_KEY(6, KEY_WPS_BUTTON),
@@ -691,6 +697,9 @@ int __init bcm47xx_buttons_register(void
@@ -709,6 +715,9 @@ int __init bcm47xx_buttons_register(void
case BCM47XX_BOARD_NETGEAR_R6300_V1:
err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_r6300_v1);
break;

View File

@ -36,7 +36,7 @@ Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
{{BCM47XX_BOARD_LINKSYS_WRT54G_TYPE_0708, "Linksys WRT54G/GS/GL"}, "0x0708", "42", "0x10"},
--- a/arch/mips/bcm47xx/buttons.c
+++ b/arch/mips/bcm47xx/buttons.c
@@ -448,6 +448,13 @@ bcm47xx_buttons_netgear_wnr3500lv1[] __i
@@ -460,6 +460,13 @@ bcm47xx_buttons_netgear_wnr3500lv1[] __i
};
static const struct gpio_keys_button
@ -50,7 +50,7 @@ Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
bcm47xx_buttons_netgear_wnr834bv2[] __initconst = {
BCM47XX_GPIO_KEY(6, KEY_RESTART),
};
@@ -718,6 +725,9 @@ int __init bcm47xx_buttons_register(void
@@ -736,6 +743,9 @@ int __init bcm47xx_buttons_register(void
case BCM47XX_BOARD_NETGEAR_WNR3500L:
err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wnr3500lv1);
break;
@ -62,7 +62,7 @@ Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
break;
--- a/arch/mips/bcm47xx/leds.c
+++ b/arch/mips/bcm47xx/leds.c
@@ -520,6 +520,14 @@ bcm47xx_leds_netgear_wnr3500lv1[] __init
@@ -528,6 +528,14 @@ bcm47xx_leds_netgear_wnr3500lv1[] __init
};
static const struct gpio_led
@ -77,7 +77,7 @@ Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
bcm47xx_leds_netgear_wnr834bv2[] __initconst = {
BCM47XX_GPIO_LED(2, "green", "power", 0, LEDS_GPIO_DEFSTATE_ON),
BCM47XX_GPIO_LED(3, "amber", "power", 0, LEDS_GPIO_DEFSTATE_OFF),
@@ -780,6 +788,9 @@ void __init bcm47xx_leds_register(void)
@@ -791,6 +799,9 @@ void __init bcm47xx_leds_register(void)
case BCM47XX_BOARD_NETGEAR_WNR3500L:
bcm47xx_set_pdata(bcm47xx_leds_netgear_wnr3500lv1);
break;

View File

@ -0,0 +1,65 @@
From fc605b914167de75432c3b5aae239fb191e84a31 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
Date: Wed, 8 Feb 2023 08:03:01 +0100
Subject: [PATCH] MIPS: BCM47XX: Add support for Linksys E2500 V3
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
It's a BCM5358 based home WiFi router. 16 MiB flash, 64 MiB RAM, BCM5325
switch, on-SoC 802.11n radio.
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
---
arch/mips/bcm47xx/board.c | 1 +
arch/mips/bcm47xx/buttons.c | 9 +++++++++
arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h | 1 +
3 files changed, 11 insertions(+)
--- a/arch/mips/bcm47xx/board.c
+++ b/arch/mips/bcm47xx/board.c
@@ -130,6 +130,7 @@ struct bcm47xx_board_type_list2 bcm47xx_
{{BCM47XX_BOARD_LINKSYS_E1000V21, "Linksys E1000 V2.1"}, "E1000", "2.1"},
{{BCM47XX_BOARD_LINKSYS_E1200V2, "Linksys E1200 V2"}, "E1200", "2.0"},
{{BCM47XX_BOARD_LINKSYS_E2000V1, "Linksys E2000 V1"}, "Linksys E2000", "1.0"},
+ {{BCM47XX_BOARD_LINKSYS_E2500V3, "Linksys E2500 V3"}, "E2500", "1.0"},
/* like WRT610N v2.0 */
{{BCM47XX_BOARD_LINKSYS_E3000V1, "Linksys E3000 V1"}, "E300", "1.0"},
{{BCM47XX_BOARD_LINKSYS_E3200V1, "Linksys E3200 V1"}, "E3200", "1.0"},
--- a/arch/mips/bcm47xx/buttons.c
+++ b/arch/mips/bcm47xx/buttons.c
@@ -223,6 +223,12 @@ bcm47xx_buttons_linksys_e2000v1[] __init
};
static const struct gpio_keys_button
+bcm47xx_buttons_linksys_e2500v3[] __initconst = {
+ BCM47XX_GPIO_KEY(9, KEY_WPS_BUTTON),
+ BCM47XX_GPIO_KEY(10, KEY_RESTART),
+};
+
+static const struct gpio_keys_button
bcm47xx_buttons_linksys_e3000v1[] __initconst = {
BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON),
BCM47XX_GPIO_KEY(6, KEY_RESTART),
@@ -617,6 +623,9 @@ int __init bcm47xx_buttons_register(void
case BCM47XX_BOARD_LINKSYS_E2000V1:
err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e2000v1);
break;
+ case BCM47XX_BOARD_LINKSYS_E2500V3:
+ err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e2500v3);
+ break;
case BCM47XX_BOARD_LINKSYS_E3000V1:
err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e3000v1);
break;
--- a/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h
+++ b/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h
@@ -61,6 +61,7 @@ enum bcm47xx_board {
BCM47XX_BOARD_LINKSYS_E1000V21,
BCM47XX_BOARD_LINKSYS_E1200V2,
BCM47XX_BOARD_LINKSYS_E2000V1,
+ BCM47XX_BOARD_LINKSYS_E2500V3,
BCM47XX_BOARD_LINKSYS_E3000V1,
BCM47XX_BOARD_LINKSYS_E3200V1,
BCM47XX_BOARD_LINKSYS_E4200V1,

View File

@ -20,7 +20,7 @@ Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3900,6 +3900,7 @@ L: linux-mtd@lists.infradead.org
@@ -3901,6 +3901,7 @@ L: linux-mtd@lists.infradead.org
L: bcm-kernel-feedback-list@broadcom.com
S: Maintained
F: drivers/mtd/nand/raw/brcmnand/

View File

@ -0,0 +1,61 @@
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
Date: Mon, 27 Feb 2023 07:44:38 +0100
Subject: [PATCH] MIPS: BCM47XX: Add support for Huawei B593u-12
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
It's a BCM5358 based home router. One of very few bcm47xx devices with
cellular modems (here: LTE).
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
---
arch/mips/bcm47xx/board.c | 1 +
arch/mips/bcm47xx/leds.c | 8 ++++++++
arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h | 1 +
3 files changed, 10 insertions(+)
--- a/arch/mips/bcm47xx/board.c
+++ b/arch/mips/bcm47xx/board.c
@@ -193,6 +193,7 @@ struct bcm47xx_board_type_list1 bcm47xx_
/* boardtype, boardnum, boardrev */
static const
struct bcm47xx_board_type_list3 bcm47xx_board_list_board[] __initconst = {
+ {{BCM47XX_BOARD_HUAWEI_B593U_12, "Huawei B593u-12"}, "0x053d", "1234", "0x1301"},
{{BCM47XX_BOARD_HUAWEI_E970, "Huawei E970"}, "0x048e", "0x5347", "0x11"},
{{BCM47XX_BOARD_PHICOMM_M1, "Phicomm M1"}, "0x0590", "80", "0x1104"},
{{BCM47XX_BOARD_ZTE_H218N, "ZTE H218N"}, "0x053d", "1234", "0x1305"},
--- a/arch/mips/bcm47xx/leds.c
+++ b/arch/mips/bcm47xx/leds.c
@@ -223,6 +223,11 @@ bcm47xx_leds_dlink_dir330[] __initconst
/* Huawei */
static const struct gpio_led
+bcm47xx_leds_huawei_b593u_12[] __initconst = {
+ BCM47XX_GPIO_LED(5, "blue", "wlan", 0, LEDS_GPIO_DEFSTATE_OFF),
+};
+
+static const struct gpio_led
bcm47xx_leds_huawei_e970[] __initconst = {
BCM47XX_GPIO_LED(0, "unk", "wlan", 0, LEDS_GPIO_DEFSTATE_OFF),
};
@@ -672,6 +677,9 @@ void __init bcm47xx_leds_register(void)
bcm47xx_set_pdata(bcm47xx_leds_dlink_dir330);
break;
+ case BCM47XX_BOARD_HUAWEI_B593U_12:
+ bcm47xx_set_pdata(bcm47xx_leds_huawei_b593u_12);
+ break;
case BCM47XX_BOARD_HUAWEI_E970:
bcm47xx_set_pdata(bcm47xx_leds_huawei_e970);
break;
--- a/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h
+++ b/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h
@@ -53,6 +53,7 @@ enum bcm47xx_board {
BCM47XX_BOARD_DLINK_DIR130,
BCM47XX_BOARD_DLINK_DIR330,
+ BCM47XX_BOARD_HUAWEI_B593U_12,
BCM47XX_BOARD_HUAWEI_E970,
BCM47XX_BOARD_LINKSYS_E900V1,

View File

@ -0,0 +1,76 @@
From 327dabbd0111910a7d174b0b812d608d6b67bead Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
Date: Mon, 8 Aug 2022 23:05:25 +0200
Subject: [PATCH] bgmac: fix *initial* chip reset to support BCM5358
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
While bringing hardware up we should perform a full reset including the
switch bit (BGMAC_BCMA_IOCTL_SW_RESET aka SICF_SWRST). It's what
specification says and what reference driver does.
This seems to be critical for the BCM5358. Without this hardware doesn't
get initialized properly and doesn't seem to transmit or receive any
packets.
Originally bgmac was calling bgmac_chip_reset() before setting
"has_robosw" property which resulted in expected behaviour. That has
changed as a side effect of adding platform device support which
regressed BCM5358 support.
Fixes: f6a95a24957a ("net: ethernet: bgmac: Add platform device support")
Cc: Jon Mason <jdmason@kudzu.us>
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
---
drivers/net/ethernet/broadcom/bgmac.c | 8 ++++++--
drivers/net/ethernet/broadcom/bgmac.h | 2 ++
2 files changed, 8 insertions(+), 2 deletions(-)
--- a/drivers/net/ethernet/broadcom/bgmac.c
+++ b/drivers/net/ethernet/broadcom/bgmac.c
@@ -891,13 +891,13 @@ static void bgmac_chip_reset_idm_config(
if (iost & BGMAC_BCMA_IOST_ATTACHED) {
flags = BGMAC_BCMA_IOCTL_SW_CLKEN;
- if (!bgmac->has_robosw)
+ if (bgmac->in_init || !bgmac->has_robosw)
flags |= BGMAC_BCMA_IOCTL_SW_RESET;
}
bgmac_clk_enable(bgmac, flags);
}
- if (iost & BGMAC_BCMA_IOST_ATTACHED && !bgmac->has_robosw)
+ if (iost & BGMAC_BCMA_IOST_ATTACHED && (bgmac->in_init || !bgmac->has_robosw))
bgmac_idm_write(bgmac, BCMA_IOCTL,
bgmac_idm_read(bgmac, BCMA_IOCTL) &
~BGMAC_BCMA_IOCTL_SW_RESET);
@@ -1502,6 +1502,8 @@ int bgmac_enet_probe(struct bgmac *bgmac
struct net_device *net_dev = bgmac->net_dev;
int err;
+ bgmac->in_init = true;
+
bgmac_chip_intrs_off(bgmac);
net_dev->irq = bgmac->irq;
@@ -1562,6 +1564,8 @@ int bgmac_enet_probe(struct bgmac *bgmac
bgmac->b53_device = &bgmac_b53_dev;
}
+ bgmac->in_init = false;
+
err = register_netdev(bgmac->net_dev);
if (err) {
dev_err(bgmac->dev, "Cannot register net device\n");
--- a/drivers/net/ethernet/broadcom/bgmac.h
+++ b/drivers/net/ethernet/broadcom/bgmac.h
@@ -475,6 +475,8 @@ struct bgmac {
int irq;
u32 int_mask;
+ bool in_init;
+
/* Current MAC state */
int mac_speed;
int mac_duplex;

View File

@ -95,7 +95,7 @@ Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+ };
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3572,6 +3572,13 @@ F: Documentation/devicetree/bindings/net
@@ -3573,6 +3573,13 @@ F: Documentation/devicetree/bindings/net
F: drivers/net/ethernet/broadcom/bcm4908_enet.*
F: drivers/net/ethernet/broadcom/unimac.h

View File

@ -23,7 +23,7 @@ Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3578,6 +3578,7 @@ M: bcm-kernel-feedback-list@broadcom.com
@@ -3579,6 +3579,7 @@ M: bcm-kernel-feedback-list@broadcom.com
L: linux-gpio@vger.kernel.org
S: Maintained
F: Documentation/devicetree/bindings/pinctrl/brcm,bcm4908-pinctrl.yaml

View File

@ -16,6 +16,9 @@ bcm53xx_setup_interfaces()
asus,rt-ac88u)
ucidef_set_interfaces_lan_wan "lan1 lan2 lan3 lan4 extsw" "wan"
;;
dlink,dwl-8610ap)
ucidef_set_interface_lan "eth0 eth1" "dhcp"
;;
linksys,panamera)
ucidef_set_interfaces_lan_wan "lan1 lan2 lan3 lan4 lan5 lan6 lan7 lan8 extsw" "wan"
;;

View File

@ -105,6 +105,22 @@ define Build/seama-nand
-i $@.entity
endef
define Build/dwl8610ap-image
mkdir -p $@.tmptar
# The DWL8610AP pretends to be a Broadcom reference design
echo "bcm953012er" > $@.tmptar/board
echo "LVL7" > $@.tmptar/model
# Something high beyond what D-Link has put out
echo "5.0.0.0" > $@.tmptar/version
# Create rootfs.bin, this is just a NAND image including everything
cp $@ $@.tmptar/rootfs.bin
# Hash the rootfs.bin
cat $@.tmptar/rootfs.bin | md5sum > $@.tmptar/rootfs.md5
cd $@.tmptar && tar -c -f $@.new *
rm -rf $@.tmptar
mv $@.new $@
endef
DEVICE_VARS += ASUS_PRODUCTID
DEVICE_VARS += BUFFALO_TAG_PLATFORM BUFFALO_TAG_VERSION BUFFALO_TAG_MINOR
DEVICE_VARS += SIGNATURE
@ -250,6 +266,15 @@ define Device/dlink_dir-885l
endef
TARGET_DEVICES += dlink_dir-885l
define Device/dlink_dwl-8610ap
DEVICE_VENDOR := D-Link
DEVICE_MODEL := DWL-8610AP
DEVICE_PACKAGES := $(B43)
IMAGES := factory.tar
IMAGE/factory.tar := append-ubi | trx-nand | dwl8610ap-image
endef
TARGET_DEVICES += dlink_dwl-8610ap
define Device/linksys_ea6300-v1
DEVICE_VENDOR := Linksys
DEVICE_MODEL := EA6300

View File

@ -400,7 +400,6 @@
port@8 {
reg = <8>;
label = "cpu";
phy-mode = "internal";
ethernet = <&ethernet>;

View File

@ -521,7 +521,6 @@
port@8 {
reg = <8>;
label = "cpu";
phy-mode = "internal";
ethernet = <&ethernet>;

View File

@ -418,7 +418,6 @@
port@8 {
reg = <8>;
label = "cpu";
phy-mode = "internal";
ethernet = <&ethernet>;

View File

@ -515,7 +515,6 @@
port@8 {
reg = <8>;
label = "cpu";
phy-mode = "internal";
ethernet = <&ethernet>;

View File

@ -529,7 +529,6 @@
port@8 {
reg = <8>;
label = "cpu";
phy-mode = "internal";
ethernet = <&ethernet>;

View File

@ -14,7 +14,7 @@ Signed-off-by: Johan Almbladh <johan.almbladh@anyfinetworks.com>
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3430,6 +3430,7 @@ S: Supported
@@ -3431,6 +3431,7 @@ S: Supported
F: arch/arm64/net/
BPF JIT for MIPS (32-BIT AND 64-BIT)

View File

@ -27,7 +27,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
static void stmmac_tx_timer_arm(struct stmmac_priv *priv, u32 queue);
static void stmmac_flush_tx_descriptors(struct stmmac_priv *priv, int queue);
@@ -1710,9 +1713,6 @@ static int __init_dma_rx_desc_rings(stru
@@ -1711,9 +1714,6 @@ static int __init_dma_rx_desc_rings(stru
return -ENOMEM;
}
@ -37,7 +37,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
/* Setup the chained descriptor addresses */
if (priv->mode == STMMAC_CHAIN_MODE) {
if (priv->extend_desc)
@@ -1818,12 +1818,6 @@ static int __init_dma_tx_desc_rings(stru
@@ -1819,12 +1819,6 @@ static int __init_dma_tx_desc_rings(stru
tx_q->tx_skbuff[i] = NULL;
}
@ -50,7 +50,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
return 0;
}
@@ -2692,10 +2686,7 @@ static void stmmac_tx_err(struct stmmac_
@@ -2693,10 +2687,7 @@ static void stmmac_tx_err(struct stmmac_
stmmac_stop_tx_dma(priv, chan);
dma_free_tx_skbufs(priv, chan);
stmmac_clear_tx_descriptors(priv, chan);
@ -62,7 +62,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
stmmac_init_tx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
tx_q->dma_tx_phy, chan);
stmmac_start_tx_dma(priv, chan);
@@ -3779,6 +3770,8 @@ static int stmmac_open(struct net_device
@@ -3780,6 +3771,8 @@ static int stmmac_open(struct net_device
}
}
@ -71,7 +71,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
ret = stmmac_hw_setup(dev, true);
if (ret < 0) {
netdev_err(priv->dev, "%s: Hw setup failed\n", __func__);
@@ -6422,6 +6415,7 @@ void stmmac_enable_rx_queue(struct stmma
@@ -6423,6 +6416,7 @@ void stmmac_enable_rx_queue(struct stmma
return;
}
@ -79,7 +79,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
stmmac_clear_rx_descriptors(priv, queue);
stmmac_init_rx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
@@ -6483,6 +6477,7 @@ void stmmac_enable_tx_queue(struct stmma
@@ -6484,6 +6478,7 @@ void stmmac_enable_tx_queue(struct stmma
return;
}
@ -87,7 +87,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
stmmac_clear_tx_descriptors(priv, queue);
stmmac_init_tx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
@@ -7405,6 +7400,25 @@ int stmmac_suspend(struct device *dev)
@@ -7406,6 +7401,25 @@ int stmmac_suspend(struct device *dev)
}
EXPORT_SYMBOL_GPL(stmmac_suspend);
@ -113,7 +113,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
/**
* stmmac_reset_queues_param - reset queue parameters
* @priv: device pointer
@@ -7415,22 +7429,11 @@ static void stmmac_reset_queues_param(st
@@ -7416,22 +7430,11 @@ static void stmmac_reset_queues_param(st
u32 tx_cnt = priv->plat->tx_queues_to_use;
u32 queue;

View File

@ -17,7 +17,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -3831,8 +3831,6 @@ static int stmmac_release(struct net_dev
@@ -3832,8 +3832,6 @@ static int stmmac_release(struct net_dev
struct stmmac_priv *priv = netdev_priv(dev);
u32 chan;
@ -26,7 +26,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
if (device_may_wakeup(priv->device))
phylink_speed_down(priv->phylink, false);
/* Stop and disconnect the PHY */
@@ -3844,6 +3842,8 @@ static int stmmac_release(struct net_dev
@@ -3845,6 +3843,8 @@ static int stmmac_release(struct net_dev
for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++)
hrtimer_cancel(&priv->tx_queue[chan].txtimer);

View File

@ -189,7 +189,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
if (tx_q->dirty_tx != tx_q->cur_tx)
return -EBUSY; /* still unfinished work */
@@ -1307,7 +1307,7 @@ static void stmmac_display_rx_rings(stru
@@ -1308,7 +1308,7 @@ static void stmmac_display_rx_rings(stru
/* Display RX rings */
for (queue = 0; queue < rx_cnt; queue++) {
@ -198,7 +198,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
pr_info("\tRX Queue %u rings\n", queue);
@@ -1320,7 +1320,7 @@ static void stmmac_display_rx_rings(stru
@@ -1321,7 +1321,7 @@ static void stmmac_display_rx_rings(stru
}
/* Display RX ring */
@ -207,7 +207,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
rx_q->dma_rx_phy, desc_size);
}
}
@@ -1334,7 +1334,7 @@ static void stmmac_display_tx_rings(stru
@@ -1335,7 +1335,7 @@ static void stmmac_display_tx_rings(stru
/* Display TX rings */
for (queue = 0; queue < tx_cnt; queue++) {
@ -216,7 +216,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
pr_info("\tTX Queue %d rings\n", queue);
@@ -1349,7 +1349,7 @@ static void stmmac_display_tx_rings(stru
@@ -1350,7 +1350,7 @@ static void stmmac_display_tx_rings(stru
desc_size = sizeof(struct dma_desc);
}
@ -225,7 +225,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
tx_q->dma_tx_phy, desc_size);
}
}
@@ -1390,21 +1390,21 @@ static int stmmac_set_bfsize(int mtu, in
@@ -1391,21 +1391,21 @@ static int stmmac_set_bfsize(int mtu, in
*/
static void stmmac_clear_rx_descriptors(struct stmmac_priv *priv, u32 queue)
{
@ -253,7 +253,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
}
/**
@@ -1416,12 +1416,12 @@ static void stmmac_clear_rx_descriptors(
@@ -1417,12 +1417,12 @@ static void stmmac_clear_rx_descriptors(
*/
static void stmmac_clear_tx_descriptors(struct stmmac_priv *priv, u32 queue)
{
@ -269,7 +269,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
struct dma_desc *p;
if (priv->extend_desc)
@@ -1469,7 +1469,7 @@ static void stmmac_clear_descriptors(str
@@ -1470,7 +1470,7 @@ static void stmmac_clear_descriptors(str
static int stmmac_init_rx_buffers(struct stmmac_priv *priv, struct dma_desc *p,
int i, gfp_t flags, u32 queue)
{
@ -278,7 +278,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
struct stmmac_rx_buffer *buf = &rx_q->buf_pool[i];
if (!buf->page) {
@@ -1494,7 +1494,7 @@ static int stmmac_init_rx_buffers(struct
@@ -1495,7 +1495,7 @@ static int stmmac_init_rx_buffers(struct
buf->addr = page_pool_get_dma_addr(buf->page) + buf->page_offset;
stmmac_set_desc_addr(priv, p, buf->addr);
@ -287,7 +287,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
stmmac_init_desc3(priv, p);
return 0;
@@ -1508,7 +1508,7 @@ static int stmmac_init_rx_buffers(struct
@@ -1509,7 +1509,7 @@ static int stmmac_init_rx_buffers(struct
*/
static void stmmac_free_rx_buffer(struct stmmac_priv *priv, u32 queue, int i)
{
@ -296,7 +296,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
struct stmmac_rx_buffer *buf = &rx_q->buf_pool[i];
if (buf->page)
@@ -1528,7 +1528,7 @@ static void stmmac_free_rx_buffer(struct
@@ -1529,7 +1529,7 @@ static void stmmac_free_rx_buffer(struct
*/
static void stmmac_free_tx_buffer(struct stmmac_priv *priv, u32 queue, int i)
{
@ -305,7 +305,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
if (tx_q->tx_skbuff_dma[i].buf &&
tx_q->tx_skbuff_dma[i].buf_type != STMMAC_TXBUF_T_XDP_TX) {
@@ -1573,17 +1573,17 @@ static void dma_free_rx_skbufs(struct st
@@ -1574,17 +1574,17 @@ static void dma_free_rx_skbufs(struct st
{
int i;
@ -326,7 +326,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
struct dma_desc *p;
int ret;
@@ -1610,10 +1610,10 @@ static int stmmac_alloc_rx_buffers(struc
@@ -1611,10 +1611,10 @@ static int stmmac_alloc_rx_buffers(struc
*/
static void dma_free_rx_xskbufs(struct stmmac_priv *priv, u32 queue)
{
@ -339,7 +339,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
struct stmmac_rx_buffer *buf = &rx_q->buf_pool[i];
if (!buf->xdp)
@@ -1626,10 +1626,10 @@ static void dma_free_rx_xskbufs(struct s
@@ -1627,10 +1627,10 @@ static void dma_free_rx_xskbufs(struct s
static int stmmac_alloc_rx_buffers_zc(struct stmmac_priv *priv, u32 queue)
{
@ -352,7 +352,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
struct stmmac_rx_buffer *buf;
dma_addr_t dma_addr;
struct dma_desc *p;
@@ -1672,7 +1672,7 @@ static struct xsk_buff_pool *stmmac_get_
@@ -1673,7 +1673,7 @@ static struct xsk_buff_pool *stmmac_get_
*/
static int __init_dma_rx_desc_rings(struct stmmac_priv *priv, u32 queue, gfp_t flags)
{
@ -361,7 +361,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
int ret;
netif_dbg(priv, probe, priv->dev,
@@ -1718,11 +1718,11 @@ static int __init_dma_rx_desc_rings(stru
@@ -1719,11 +1719,11 @@ static int __init_dma_rx_desc_rings(stru
if (priv->extend_desc)
stmmac_mode_init(priv, rx_q->dma_erx,
rx_q->dma_rx_phy,
@ -375,7 +375,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
}
return 0;
@@ -1749,7 +1749,7 @@ static int init_dma_rx_desc_rings(struct
@@ -1750,7 +1750,7 @@ static int init_dma_rx_desc_rings(struct
err_init_rx_buffers:
while (queue >= 0) {
@ -384,7 +384,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
if (rx_q->xsk_pool)
dma_free_rx_xskbufs(priv, queue);
@@ -1778,7 +1778,7 @@ err_init_rx_buffers:
@@ -1779,7 +1779,7 @@ err_init_rx_buffers:
*/
static int __init_dma_tx_desc_rings(struct stmmac_priv *priv, u32 queue)
{
@ -393,7 +393,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
int i;
netif_dbg(priv, probe, priv->dev,
@@ -1790,16 +1790,16 @@ static int __init_dma_tx_desc_rings(stru
@@ -1791,16 +1791,16 @@ static int __init_dma_tx_desc_rings(stru
if (priv->extend_desc)
stmmac_mode_init(priv, tx_q->dma_etx,
tx_q->dma_tx_phy,
@ -413,7 +413,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
struct dma_desc *p;
if (priv->extend_desc)
@@ -1869,12 +1869,12 @@ static int init_dma_desc_rings(struct ne
@@ -1870,12 +1870,12 @@ static int init_dma_desc_rings(struct ne
*/
static void dma_free_tx_skbufs(struct stmmac_priv *priv, u32 queue)
{
@ -428,7 +428,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
stmmac_free_tx_buffer(priv, queue, i);
if (tx_q->xsk_pool && tx_q->xsk_frames_done) {
@@ -1904,7 +1904,7 @@ static void stmmac_free_tx_skbufs(struct
@@ -1905,7 +1905,7 @@ static void stmmac_free_tx_skbufs(struct
*/
static void __free_dma_rx_desc_resources(struct stmmac_priv *priv, u32 queue)
{
@ -437,7 +437,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
/* Release the DMA RX socket buffers */
if (rx_q->xsk_pool)
@@ -1917,11 +1917,11 @@ static void __free_dma_rx_desc_resources
@@ -1918,11 +1918,11 @@ static void __free_dma_rx_desc_resources
/* Free DMA regions of consistent memory previously allocated */
if (!priv->extend_desc)
@ -451,7 +451,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
sizeof(struct dma_extended_desc),
rx_q->dma_erx, rx_q->dma_rx_phy);
@@ -1950,7 +1950,7 @@ static void free_dma_rx_desc_resources(s
@@ -1951,7 +1951,7 @@ static void free_dma_rx_desc_resources(s
*/
static void __free_dma_tx_desc_resources(struct stmmac_priv *priv, u32 queue)
{
@ -460,7 +460,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
size_t size;
void *addr;
@@ -1968,7 +1968,7 @@ static void __free_dma_tx_desc_resources
@@ -1969,7 +1969,7 @@ static void __free_dma_tx_desc_resources
addr = tx_q->dma_tx;
}
@ -469,7 +469,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
dma_free_coherent(priv->device, size, addr, tx_q->dma_tx_phy);
@@ -1997,7 +1997,7 @@ static void free_dma_tx_desc_resources(s
@@ -1998,7 +1998,7 @@ static void free_dma_tx_desc_resources(s
*/
static int __alloc_dma_rx_desc_resources(struct stmmac_priv *priv, u32 queue)
{
@ -478,7 +478,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
struct stmmac_channel *ch = &priv->channel[queue];
bool xdp_prog = stmmac_xdp_is_enabled(priv);
struct page_pool_params pp_params = { 0 };
@@ -2009,8 +2009,8 @@ static int __alloc_dma_rx_desc_resources
@@ -2010,8 +2010,8 @@ static int __alloc_dma_rx_desc_resources
rx_q->priv_data = priv;
pp_params.flags = PP_FLAG_DMA_MAP | PP_FLAG_DMA_SYNC_DEV;
@ -489,7 +489,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
pp_params.order = ilog2(num_pages);
pp_params.nid = dev_to_node(priv->device);
pp_params.dev = priv->device;
@@ -2025,7 +2025,7 @@ static int __alloc_dma_rx_desc_resources
@@ -2026,7 +2026,7 @@ static int __alloc_dma_rx_desc_resources
return ret;
}
@ -498,7 +498,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
sizeof(*rx_q->buf_pool),
GFP_KERNEL);
if (!rx_q->buf_pool)
@@ -2033,7 +2033,7 @@ static int __alloc_dma_rx_desc_resources
@@ -2034,7 +2034,7 @@ static int __alloc_dma_rx_desc_resources
if (priv->extend_desc) {
rx_q->dma_erx = dma_alloc_coherent(priv->device,
@ -507,7 +507,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
sizeof(struct dma_extended_desc),
&rx_q->dma_rx_phy,
GFP_KERNEL);
@@ -2042,7 +2042,7 @@ static int __alloc_dma_rx_desc_resources
@@ -2043,7 +2043,7 @@ static int __alloc_dma_rx_desc_resources
} else {
rx_q->dma_rx = dma_alloc_coherent(priv->device,
@ -516,7 +516,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
sizeof(struct dma_desc),
&rx_q->dma_rx_phy,
GFP_KERNEL);
@@ -2099,20 +2099,20 @@ err_dma:
@@ -2100,20 +2100,20 @@ err_dma:
*/
static int __alloc_dma_tx_desc_resources(struct stmmac_priv *priv, u32 queue)
{
@ -540,7 +540,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
sizeof(struct sk_buff *),
GFP_KERNEL);
if (!tx_q->tx_skbuff)
@@ -2125,7 +2125,7 @@ static int __alloc_dma_tx_desc_resources
@@ -2126,7 +2126,7 @@ static int __alloc_dma_tx_desc_resources
else
size = sizeof(struct dma_desc);
@ -549,7 +549,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
addr = dma_alloc_coherent(priv->device, size,
&tx_q->dma_tx_phy, GFP_KERNEL);
@@ -2369,7 +2369,7 @@ static void stmmac_dma_operation_mode(st
@@ -2370,7 +2370,7 @@ static void stmmac_dma_operation_mode(st
/* configure all channels */
for (chan = 0; chan < rx_channels_count; chan++) {
@ -558,7 +558,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
u32 buf_size;
qmode = priv->plat->rx_queues_cfg[chan].mode_to_use;
@@ -2384,7 +2384,7 @@ static void stmmac_dma_operation_mode(st
@@ -2385,7 +2385,7 @@ static void stmmac_dma_operation_mode(st
chan);
} else {
stmmac_set_dma_bfsize(priv, priv->ioaddr,
@ -567,7 +567,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
chan);
}
}
@@ -2400,7 +2400,7 @@ static void stmmac_dma_operation_mode(st
@@ -2401,7 +2401,7 @@ static void stmmac_dma_operation_mode(st
static bool stmmac_xdp_xmit_zc(struct stmmac_priv *priv, u32 queue, u32 budget)
{
struct netdev_queue *nq = netdev_get_tx_queue(priv->dev, queue);
@ -576,7 +576,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
struct xsk_buff_pool *pool = tx_q->xsk_pool;
unsigned int entry = tx_q->cur_tx;
struct dma_desc *tx_desc = NULL;
@@ -2475,7 +2475,7 @@ static bool stmmac_xdp_xmit_zc(struct st
@@ -2476,7 +2476,7 @@ static bool stmmac_xdp_xmit_zc(struct st
stmmac_enable_dma_transmission(priv, priv->ioaddr);
@ -585,7 +585,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
entry = tx_q->cur_tx;
}
@@ -2501,7 +2501,7 @@ static bool stmmac_xdp_xmit_zc(struct st
@@ -2502,7 +2502,7 @@ static bool stmmac_xdp_xmit_zc(struct st
*/
static int stmmac_tx_clean(struct stmmac_priv *priv, int budget, u32 queue)
{
@ -594,7 +594,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
unsigned int bytes_compl = 0, pkts_compl = 0;
unsigned int entry, xmits = 0, count = 0;
@@ -2514,7 +2514,7 @@ static int stmmac_tx_clean(struct stmmac
@@ -2515,7 +2515,7 @@ static int stmmac_tx_clean(struct stmmac
entry = tx_q->dirty_tx;
/* Try to clean all TX complete frame in 1 shot */
@ -603,7 +603,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
struct xdp_frame *xdpf;
struct sk_buff *skb;
struct dma_desc *p;
@@ -2614,7 +2614,7 @@ static int stmmac_tx_clean(struct stmmac
@@ -2615,7 +2615,7 @@ static int stmmac_tx_clean(struct stmmac
stmmac_release_tx_desc(priv, p, priv->mode);
@ -612,7 +612,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
}
tx_q->dirty_tx = entry;
@@ -2679,7 +2679,7 @@ static int stmmac_tx_clean(struct stmmac
@@ -2680,7 +2680,7 @@ static int stmmac_tx_clean(struct stmmac
*/
static void stmmac_tx_err(struct stmmac_priv *priv, u32 chan)
{
@ -621,7 +621,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
netif_tx_stop_queue(netdev_get_tx_queue(priv->dev, chan));
@@ -2746,8 +2746,8 @@ static int stmmac_napi_check(struct stmm
@@ -2747,8 +2747,8 @@ static int stmmac_napi_check(struct stmm
{
int status = stmmac_dma_interrupt_status(priv, priv->ioaddr,
&priv->xstats, chan, dir);
@ -632,7 +632,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
struct stmmac_channel *ch = &priv->channel[chan];
struct napi_struct *rx_napi;
struct napi_struct *tx_napi;
@@ -2923,7 +2923,7 @@ static int stmmac_init_dma_engine(struct
@@ -2924,7 +2924,7 @@ static int stmmac_init_dma_engine(struct
/* DMA RX Channel Configuration */
for (chan = 0; chan < rx_channels_count; chan++) {
@ -641,7 +641,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
stmmac_init_rx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
rx_q->dma_rx_phy, chan);
@@ -2937,7 +2937,7 @@ static int stmmac_init_dma_engine(struct
@@ -2938,7 +2938,7 @@ static int stmmac_init_dma_engine(struct
/* DMA TX Channel Configuration */
for (chan = 0; chan < tx_channels_count; chan++) {
@ -650,7 +650,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
stmmac_init_tx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
tx_q->dma_tx_phy, chan);
@@ -2952,7 +2952,7 @@ static int stmmac_init_dma_engine(struct
@@ -2953,7 +2953,7 @@ static int stmmac_init_dma_engine(struct
static void stmmac_tx_timer_arm(struct stmmac_priv *priv, u32 queue)
{
@ -659,7 +659,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
hrtimer_start(&tx_q->txtimer,
STMMAC_COAL_TIMER(priv->tx_coal_timer[queue]),
@@ -3002,7 +3002,7 @@ static void stmmac_init_coalesce(struct
@@ -3003,7 +3003,7 @@ static void stmmac_init_coalesce(struct
u32 chan;
for (chan = 0; chan < tx_channel_count; chan++) {
@ -668,7 +668,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
priv->tx_coal_frames[chan] = STMMAC_TX_FRAMES;
priv->tx_coal_timer[chan] = STMMAC_COAL_TX_TIMER;
@@ -3024,12 +3024,12 @@ static void stmmac_set_rings_length(stru
@@ -3025,12 +3025,12 @@ static void stmmac_set_rings_length(stru
/* set TX ring length */
for (chan = 0; chan < tx_channels_count; chan++)
stmmac_set_tx_ring_len(priv, priv->ioaddr,
@ -683,7 +683,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
}
/**
@@ -3364,7 +3364,7 @@ static int stmmac_hw_setup(struct net_de
@@ -3365,7 +3365,7 @@ static int stmmac_hw_setup(struct net_de
/* Enable TSO */
if (priv->tso) {
for (chan = 0; chan < tx_cnt; chan++) {
@ -692,7 +692,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
/* TSO and TBS cannot co-exist */
if (tx_q->tbs & STMMAC_TBS_AVAIL)
@@ -3386,7 +3386,7 @@ static int stmmac_hw_setup(struct net_de
@@ -3387,7 +3387,7 @@ static int stmmac_hw_setup(struct net_de
/* TBS */
for (chan = 0; chan < tx_cnt; chan++) {
@ -701,7 +701,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
int enable = tx_q->tbs & STMMAC_TBS_AVAIL;
stmmac_enable_tbs(priv, priv->ioaddr, enable, chan);
@@ -3430,7 +3430,7 @@ static void stmmac_free_irq(struct net_d
@@ -3431,7 +3431,7 @@ static void stmmac_free_irq(struct net_d
for (j = irq_idx - 1; j >= 0; j--) {
if (priv->tx_irq[j] > 0) {
irq_set_affinity_hint(priv->tx_irq[j], NULL);
@ -710,7 +710,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
}
}
irq_idx = priv->plat->rx_queues_to_use;
@@ -3439,7 +3439,7 @@ static void stmmac_free_irq(struct net_d
@@ -3440,7 +3440,7 @@ static void stmmac_free_irq(struct net_d
for (j = irq_idx - 1; j >= 0; j--) {
if (priv->rx_irq[j] > 0) {
irq_set_affinity_hint(priv->rx_irq[j], NULL);
@ -719,7 +719,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
}
}
@@ -3572,7 +3572,7 @@ static int stmmac_request_irq_multi_msi(
@@ -3573,7 +3573,7 @@ static int stmmac_request_irq_multi_msi(
sprintf(int_name, "%s:%s-%d", dev->name, "rx", i);
ret = request_irq(priv->rx_irq[i],
stmmac_msi_intr_rx,
@ -728,7 +728,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
if (unlikely(ret < 0)) {
netdev_err(priv->dev,
"%s: alloc rx-%d MSI %d (error: %d)\n",
@@ -3595,7 +3595,7 @@ static int stmmac_request_irq_multi_msi(
@@ -3596,7 +3596,7 @@ static int stmmac_request_irq_multi_msi(
sprintf(int_name, "%s:%s-%d", dev->name, "tx", i);
ret = request_irq(priv->tx_irq[i],
stmmac_msi_intr_tx,
@ -737,7 +737,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
if (unlikely(ret < 0)) {
netdev_err(priv->dev,
"%s: alloc tx-%d MSI %d (error: %d)\n",
@@ -3726,21 +3726,21 @@ static int stmmac_open(struct net_device
@@ -3727,21 +3727,21 @@ static int stmmac_open(struct net_device
bfsize = 0;
if (bfsize < BUF_SIZE_16KiB)
@ -766,7 +766,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
int tbs_en = priv->plat->tx_queues_cfg[chan].tbs_en;
/* Setup per-TXQ tbs flag before TX descriptor alloc */
@@ -3798,7 +3798,7 @@ irq_error:
@@ -3799,7 +3799,7 @@ irq_error:
phylink_stop(priv->phylink);
for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++)
@ -775,7 +775,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
stmmac_hw_teardown(dev);
init_error:
@@ -3840,7 +3840,7 @@ static int stmmac_release(struct net_dev
@@ -3841,7 +3841,7 @@ static int stmmac_release(struct net_dev
stmmac_disable_all_queues(priv);
for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++)
@ -784,7 +784,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
netif_tx_disable(dev);
@@ -3904,7 +3904,7 @@ static bool stmmac_vlan_insert(struct st
@@ -3905,7 +3905,7 @@ static bool stmmac_vlan_insert(struct st
return false;
stmmac_set_tx_owner(priv, p);
@ -793,7 +793,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
return true;
}
@@ -3922,7 +3922,7 @@ static bool stmmac_vlan_insert(struct st
@@ -3923,7 +3923,7 @@ static bool stmmac_vlan_insert(struct st
static void stmmac_tso_allocator(struct stmmac_priv *priv, dma_addr_t des,
int total_len, bool last_segment, u32 queue)
{
@ -802,7 +802,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
struct dma_desc *desc;
u32 buff_size;
int tmp_len;
@@ -3933,7 +3933,7 @@ static void stmmac_tso_allocator(struct
@@ -3934,7 +3934,7 @@ static void stmmac_tso_allocator(struct
dma_addr_t curr_addr;
tx_q->cur_tx = STMMAC_GET_ENTRY(tx_q->cur_tx,
@ -811,7 +811,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
WARN_ON(tx_q->tx_skbuff[tx_q->cur_tx]);
if (tx_q->tbs & STMMAC_TBS_AVAIL)
@@ -3961,7 +3961,7 @@ static void stmmac_tso_allocator(struct
@@ -3962,7 +3962,7 @@ static void stmmac_tso_allocator(struct
static void stmmac_flush_tx_descriptors(struct stmmac_priv *priv, int queue)
{
@ -820,7 +820,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
int desc_size;
if (likely(priv->extend_desc))
@@ -4023,7 +4023,7 @@ static netdev_tx_t stmmac_tso_xmit(struc
@@ -4024,7 +4024,7 @@ static netdev_tx_t stmmac_tso_xmit(struc
dma_addr_t des;
int i;
@ -829,7 +829,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
first_tx = tx_q->cur_tx;
/* Compute header lengths */
@@ -4063,7 +4063,7 @@ static netdev_tx_t stmmac_tso_xmit(struc
@@ -4064,7 +4064,7 @@ static netdev_tx_t stmmac_tso_xmit(struc
stmmac_set_mss(priv, mss_desc, mss);
tx_q->mss = mss;
tx_q->cur_tx = STMMAC_GET_ENTRY(tx_q->cur_tx,
@ -838,7 +838,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
WARN_ON(tx_q->tx_skbuff[tx_q->cur_tx]);
}
@@ -4175,7 +4175,7 @@ static netdev_tx_t stmmac_tso_xmit(struc
@@ -4176,7 +4176,7 @@ static netdev_tx_t stmmac_tso_xmit(struc
* ndo_start_xmit will fill this descriptor the next time it's
* called and stmmac_tx_clean may clean up to this descriptor.
*/
@ -847,7 +847,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
if (unlikely(stmmac_tx_avail(priv, queue) <= (MAX_SKB_FRAGS + 1))) {
netif_dbg(priv, hw, priv->dev, "%s: stop transmitted packets\n",
@@ -4263,7 +4263,7 @@ static netdev_tx_t stmmac_xmit(struct sk
@@ -4264,7 +4264,7 @@ static netdev_tx_t stmmac_xmit(struct sk
int entry, first_tx;
dma_addr_t des;
@ -856,7 +856,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
first_tx = tx_q->cur_tx;
if (priv->tx_path_in_lpi_mode && priv->eee_sw_timer_en)
@@ -4326,7 +4326,7 @@ static netdev_tx_t stmmac_xmit(struct sk
@@ -4327,7 +4327,7 @@ static netdev_tx_t stmmac_xmit(struct sk
int len = skb_frag_size(frag);
bool last_segment = (i == (nfrags - 1));
@ -865,7 +865,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
WARN_ON(tx_q->tx_skbuff[entry]);
if (likely(priv->extend_desc))
@@ -4397,7 +4397,7 @@ static netdev_tx_t stmmac_xmit(struct sk
@@ -4398,7 +4398,7 @@ static netdev_tx_t stmmac_xmit(struct sk
* ndo_start_xmit will fill this descriptor the next time it's
* called and stmmac_tx_clean may clean up to this descriptor.
*/
@ -874,7 +874,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
tx_q->cur_tx = entry;
if (netif_msg_pktdata(priv)) {
@@ -4512,7 +4512,7 @@ static void stmmac_rx_vlan(struct net_de
@@ -4513,7 +4513,7 @@ static void stmmac_rx_vlan(struct net_de
*/
static inline void stmmac_rx_refill(struct stmmac_priv *priv, u32 queue)
{
@ -883,7 +883,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
int dirty = stmmac_rx_dirty(priv, queue);
unsigned int entry = rx_q->dirty_rx;
@@ -4562,7 +4562,7 @@ static inline void stmmac_rx_refill(stru
@@ -4563,7 +4563,7 @@ static inline void stmmac_rx_refill(stru
dma_wmb();
stmmac_set_rx_owner(priv, p, use_rx_wd);
@ -892,7 +892,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
}
rx_q->dirty_rx = entry;
rx_q->rx_tail_addr = rx_q->dma_rx_phy +
@@ -4590,12 +4590,12 @@ static unsigned int stmmac_rx_buf1_len(s
@@ -4591,12 +4591,12 @@ static unsigned int stmmac_rx_buf1_len(s
/* First descriptor, not last descriptor and not split header */
if (status & rx_not_ls)
@ -907,7 +907,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
}
static unsigned int stmmac_rx_buf2_len(struct stmmac_priv *priv,
@@ -4611,7 +4611,7 @@ static unsigned int stmmac_rx_buf2_len(s
@@ -4612,7 +4612,7 @@ static unsigned int stmmac_rx_buf2_len(s
/* Not last descriptor */
if (status & rx_not_ls)
@ -916,7 +916,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
plen = stmmac_get_rx_frame_len(priv, p, coe);
@@ -4622,7 +4622,7 @@ static unsigned int stmmac_rx_buf2_len(s
@@ -4623,7 +4623,7 @@ static unsigned int stmmac_rx_buf2_len(s
static int stmmac_xdp_xmit_xdpf(struct stmmac_priv *priv, int queue,
struct xdp_frame *xdpf, bool dma_map)
{
@ -925,7 +925,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
unsigned int entry = tx_q->cur_tx;
struct dma_desc *tx_desc;
dma_addr_t dma_addr;
@@ -4685,7 +4685,7 @@ static int stmmac_xdp_xmit_xdpf(struct s
@@ -4686,7 +4686,7 @@ static int stmmac_xdp_xmit_xdpf(struct s
stmmac_enable_dma_transmission(priv, priv->ioaddr);
@ -934,7 +934,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
tx_q->cur_tx = entry;
return STMMAC_XDP_TX;
@@ -4859,7 +4859,7 @@ static void stmmac_dispatch_skb_zc(struc
@@ -4860,7 +4860,7 @@ static void stmmac_dispatch_skb_zc(struc
static bool stmmac_rx_refill_zc(struct stmmac_priv *priv, u32 queue, u32 budget)
{
@ -943,7 +943,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
unsigned int entry = rx_q->dirty_rx;
struct dma_desc *rx_desc = NULL;
bool ret = true;
@@ -4902,7 +4902,7 @@ static bool stmmac_rx_refill_zc(struct s
@@ -4903,7 +4903,7 @@ static bool stmmac_rx_refill_zc(struct s
dma_wmb();
stmmac_set_rx_owner(priv, rx_desc, use_rx_wd);
@ -952,7 +952,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
}
if (rx_desc) {
@@ -4917,7 +4917,7 @@ static bool stmmac_rx_refill_zc(struct s
@@ -4918,7 +4918,7 @@ static bool stmmac_rx_refill_zc(struct s
static int stmmac_rx_zc(struct stmmac_priv *priv, int limit, u32 queue)
{
@ -961,7 +961,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
unsigned int count = 0, error = 0, len = 0;
int dirty = stmmac_rx_dirty(priv, queue);
unsigned int next_entry = rx_q->cur_rx;
@@ -4939,7 +4939,7 @@ static int stmmac_rx_zc(struct stmmac_pr
@@ -4940,7 +4940,7 @@ static int stmmac_rx_zc(struct stmmac_pr
desc_size = sizeof(struct dma_desc);
}
@ -970,7 +970,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
rx_q->dma_rx_phy, desc_size);
}
while (count < limit) {
@@ -4986,7 +4986,7 @@ read_again:
@@ -4987,7 +4987,7 @@ read_again:
/* Prefetch the next RX descriptor */
rx_q->cur_rx = STMMAC_GET_ENTRY(rx_q->cur_rx,
@ -979,7 +979,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
next_entry = rx_q->cur_rx;
if (priv->extend_desc)
@@ -5107,7 +5107,7 @@ read_again:
@@ -5108,7 +5108,7 @@ read_again:
*/
static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue)
{
@ -988,7 +988,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
struct stmmac_channel *ch = &priv->channel[queue];
unsigned int count = 0, error = 0, len = 0;
int status = 0, coe = priv->hw->rx_csum;
@@ -5120,7 +5120,7 @@ static int stmmac_rx(struct stmmac_priv
@@ -5121,7 +5121,7 @@ static int stmmac_rx(struct stmmac_priv
int buf_sz;
dma_dir = page_pool_get_dma_dir(rx_q->page_pool);
@ -997,7 +997,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
if (netif_msg_rx_status(priv)) {
void *rx_head;
@@ -5134,7 +5134,7 @@ static int stmmac_rx(struct stmmac_priv
@@ -5135,7 +5135,7 @@ static int stmmac_rx(struct stmmac_priv
desc_size = sizeof(struct dma_desc);
}
@ -1006,7 +1006,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
rx_q->dma_rx_phy, desc_size);
}
while (count < limit) {
@@ -5178,7 +5178,7 @@ read_again:
@@ -5179,7 +5179,7 @@ read_again:
break;
rx_q->cur_rx = STMMAC_GET_ENTRY(rx_q->cur_rx,
@ -1015,7 +1015,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
next_entry = rx_q->cur_rx;
if (priv->extend_desc)
@@ -5312,7 +5312,7 @@ read_again:
@@ -5313,7 +5313,7 @@ read_again:
buf1_len, dma_dir);
skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
buf->page, buf->page_offset, buf1_len,
@ -1024,7 +1024,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
/* Data payload appended into SKB */
page_pool_release_page(rx_q->page_pool, buf->page);
@@ -5324,7 +5324,7 @@ read_again:
@@ -5325,7 +5325,7 @@ read_again:
buf2_len, dma_dir);
skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
buf->sec_page, 0, buf2_len,
@ -1033,7 +1033,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
/* Data payload appended into SKB */
page_pool_release_page(rx_q->page_pool, buf->sec_page);
@@ -5766,11 +5766,13 @@ static irqreturn_t stmmac_safety_interru
@@ -5767,11 +5767,13 @@ static irqreturn_t stmmac_safety_interru
static irqreturn_t stmmac_msi_intr_tx(int irq, void *data)
{
struct stmmac_tx_queue *tx_q = (struct stmmac_tx_queue *)data;
@ -1048,7 +1048,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
if (unlikely(!data)) {
netdev_err(priv->dev, "%s: invalid dev pointer\n", __func__);
@@ -5810,10 +5812,12 @@ static irqreturn_t stmmac_msi_intr_tx(in
@@ -5811,10 +5813,12 @@ static irqreturn_t stmmac_msi_intr_tx(in
static irqreturn_t stmmac_msi_intr_rx(int irq, void *data)
{
struct stmmac_rx_queue *rx_q = (struct stmmac_rx_queue *)data;
@ -1062,7 +1062,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
if (unlikely(!data)) {
netdev_err(priv->dev, "%s: invalid dev pointer\n", __func__);
@@ -5844,10 +5848,10 @@ static void stmmac_poll_controller(struc
@@ -5845,10 +5849,10 @@ static void stmmac_poll_controller(struc
if (priv->plat->multi_msi_en) {
for (i = 0; i < priv->plat->rx_queues_to_use; i++)
@ -1075,7 +1075,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
} else {
disable_irq(dev->irq);
stmmac_interrupt(dev->irq, dev);
@@ -6028,34 +6032,34 @@ static int stmmac_rings_status_show(stru
@@ -6029,34 +6033,34 @@ static int stmmac_rings_status_show(stru
return 0;
for (queue = 0; queue < rx_count; queue++) {
@ -1116,7 +1116,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
}
}
@@ -6396,7 +6400,7 @@ void stmmac_disable_rx_queue(struct stmm
@@ -6397,7 +6401,7 @@ void stmmac_disable_rx_queue(struct stmm
void stmmac_enable_rx_queue(struct stmmac_priv *priv, u32 queue)
{
@ -1125,7 +1125,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
struct stmmac_channel *ch = &priv->channel[queue];
unsigned long flags;
u32 buf_size;
@@ -6433,7 +6437,7 @@ void stmmac_enable_rx_queue(struct stmma
@@ -6434,7 +6438,7 @@ void stmmac_enable_rx_queue(struct stmma
rx_q->queue_index);
} else {
stmmac_set_dma_bfsize(priv, priv->ioaddr,
@ -1134,7 +1134,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
rx_q->queue_index);
}
@@ -6459,7 +6463,7 @@ void stmmac_disable_tx_queue(struct stmm
@@ -6460,7 +6464,7 @@ void stmmac_disable_tx_queue(struct stmm
void stmmac_enable_tx_queue(struct stmmac_priv *priv, u32 queue)
{
@ -1143,7 +1143,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
struct stmmac_channel *ch = &priv->channel[queue];
unsigned long flags;
int ret;
@@ -6509,7 +6513,7 @@ void stmmac_xdp_release(struct net_devic
@@ -6510,7 +6514,7 @@ void stmmac_xdp_release(struct net_devic
stmmac_disable_all_queues(priv);
for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++)
@ -1152,7 +1152,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
/* Free the IRQ lines */
stmmac_free_irq(dev, REQ_IRQ_ERR_ALL, 0);
@@ -6568,7 +6572,7 @@ int stmmac_xdp_open(struct net_device *d
@@ -6569,7 +6573,7 @@ int stmmac_xdp_open(struct net_device *d
/* DMA RX Channel Configuration */
for (chan = 0; chan < rx_cnt; chan++) {
@ -1161,7 +1161,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
stmmac_init_rx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
rx_q->dma_rx_phy, chan);
@@ -6586,7 +6590,7 @@ int stmmac_xdp_open(struct net_device *d
@@ -6587,7 +6591,7 @@ int stmmac_xdp_open(struct net_device *d
rx_q->queue_index);
} else {
stmmac_set_dma_bfsize(priv, priv->ioaddr,
@ -1170,7 +1170,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
rx_q->queue_index);
}
@@ -6595,7 +6599,7 @@ int stmmac_xdp_open(struct net_device *d
@@ -6596,7 +6600,7 @@ int stmmac_xdp_open(struct net_device *d
/* DMA TX Channel Configuration */
for (chan = 0; chan < tx_cnt; chan++) {
@ -1179,7 +1179,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
stmmac_init_tx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
tx_q->dma_tx_phy, chan);
@@ -6628,7 +6632,7 @@ int stmmac_xdp_open(struct net_device *d
@@ -6629,7 +6633,7 @@ int stmmac_xdp_open(struct net_device *d
irq_error:
for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++)
@ -1188,7 +1188,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
stmmac_hw_teardown(dev);
init_error:
@@ -6655,8 +6659,8 @@ int stmmac_xsk_wakeup(struct net_device
@@ -6656,8 +6660,8 @@ int stmmac_xsk_wakeup(struct net_device
queue >= priv->plat->tx_queues_to_use)
return -EINVAL;
@ -1199,7 +1199,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
ch = &priv->channel[queue];
if (!rx_q->xsk_pool && !tx_q->xsk_pool)
@@ -6912,8 +6916,8 @@ int stmmac_reinit_ringparam(struct net_d
@@ -6913,8 +6917,8 @@ int stmmac_reinit_ringparam(struct net_d
if (netif_running(dev))
stmmac_release(dev);
@ -1210,7 +1210,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
if (netif_running(dev))
ret = stmmac_open(dev);
@@ -7351,7 +7355,7 @@ int stmmac_suspend(struct device *dev)
@@ -7352,7 +7356,7 @@ int stmmac_suspend(struct device *dev)
stmmac_disable_all_queues(priv);
for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++)
@ -1219,7 +1219,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
if (priv->eee_enabled) {
priv->tx_path_in_lpi_mode = false;
@@ -7402,7 +7406,7 @@ EXPORT_SYMBOL_GPL(stmmac_suspend);
@@ -7403,7 +7407,7 @@ EXPORT_SYMBOL_GPL(stmmac_suspend);
static void stmmac_reset_rx_queue(struct stmmac_priv *priv, u32 queue)
{
@ -1228,7 +1228,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
rx_q->cur_rx = 0;
rx_q->dirty_rx = 0;
@@ -7410,7 +7414,7 @@ static void stmmac_reset_rx_queue(struct
@@ -7411,7 +7415,7 @@ static void stmmac_reset_rx_queue(struct
static void stmmac_reset_tx_queue(struct stmmac_priv *priv, u32 queue)
{

View File

@ -17,7 +17,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -1298,7 +1298,8 @@ static int stmmac_phy_setup(struct stmma
@@ -1299,7 +1299,8 @@ static int stmmac_phy_setup(struct stmma
return 0;
}
@ -27,7 +27,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
{
u32 rx_cnt = priv->plat->rx_queues_to_use;
unsigned int desc_size;
@@ -1307,7 +1308,7 @@ static void stmmac_display_rx_rings(stru
@@ -1308,7 +1309,7 @@ static void stmmac_display_rx_rings(stru
/* Display RX rings */
for (queue = 0; queue < rx_cnt; queue++) {
@ -36,7 +36,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
pr_info("\tRX Queue %u rings\n", queue);
@@ -1320,12 +1321,13 @@ static void stmmac_display_rx_rings(stru
@@ -1321,12 +1322,13 @@ static void stmmac_display_rx_rings(stru
}
/* Display RX ring */
@ -52,7 +52,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
{
u32 tx_cnt = priv->plat->tx_queues_to_use;
unsigned int desc_size;
@@ -1334,7 +1336,7 @@ static void stmmac_display_tx_rings(stru
@@ -1335,7 +1337,7 @@ static void stmmac_display_tx_rings(stru
/* Display TX rings */
for (queue = 0; queue < tx_cnt; queue++) {
@ -61,7 +61,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
pr_info("\tTX Queue %d rings\n", queue);
@@ -1349,18 +1351,19 @@ static void stmmac_display_tx_rings(stru
@@ -1350,18 +1352,19 @@ static void stmmac_display_tx_rings(stru
desc_size = sizeof(struct dma_desc);
}
@ -85,7 +85,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
}
static int stmmac_set_bfsize(int mtu, int bufsize)
@@ -1384,44 +1387,50 @@ static int stmmac_set_bfsize(int mtu, in
@@ -1385,44 +1388,50 @@ static int stmmac_set_bfsize(int mtu, in
/**
* stmmac_clear_rx_descriptors - clear RX descriptors
* @priv: driver private structure
@ -147,7 +147,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
struct dma_desc *p;
if (priv->extend_desc)
@@ -1438,10 +1447,12 @@ static void stmmac_clear_tx_descriptors(
@@ -1439,10 +1448,12 @@ static void stmmac_clear_tx_descriptors(
/**
* stmmac_clear_descriptors - clear descriptors
* @priv: driver private structure
@ -161,7 +161,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
{
u32 rx_queue_cnt = priv->plat->rx_queues_to_use;
u32 tx_queue_cnt = priv->plat->tx_queues_to_use;
@@ -1449,16 +1460,17 @@ static void stmmac_clear_descriptors(str
@@ -1450,16 +1461,17 @@ static void stmmac_clear_descriptors(str
/* Clear the RX descriptors */
for (queue = 0; queue < rx_queue_cnt; queue++)
@ -181,7 +181,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
* @p: descriptor pointer
* @i: descriptor index
* @flags: gfp flag
@@ -1466,10 +1478,12 @@ static void stmmac_clear_descriptors(str
@@ -1467,10 +1479,12 @@ static void stmmac_clear_descriptors(str
* Description: this function is called to allocate a receive buffer, perform
* the DMA mapping and init the descriptor.
*/
@ -196,7 +196,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
struct stmmac_rx_buffer *buf = &rx_q->buf_pool[i];
if (!buf->page) {
@@ -1494,7 +1508,7 @@ static int stmmac_init_rx_buffers(struct
@@ -1495,7 +1509,7 @@ static int stmmac_init_rx_buffers(struct
buf->addr = page_pool_get_dma_addr(buf->page) + buf->page_offset;
stmmac_set_desc_addr(priv, p, buf->addr);
@ -205,7 +205,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
stmmac_init_desc3(priv, p);
return 0;
@@ -1503,12 +1517,13 @@ static int stmmac_init_rx_buffers(struct
@@ -1504,12 +1518,13 @@ static int stmmac_init_rx_buffers(struct
/**
* stmmac_free_rx_buffer - free RX dma buffers
* @priv: private structure
@ -222,7 +222,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
struct stmmac_rx_buffer *buf = &rx_q->buf_pool[i];
if (buf->page)
@@ -1523,12 +1538,15 @@ static void stmmac_free_rx_buffer(struct
@@ -1524,12 +1539,15 @@ static void stmmac_free_rx_buffer(struct
/**
* stmmac_free_tx_buffer - free RX dma buffers
* @priv: private structure
@ -240,7 +240,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
if (tx_q->tx_skbuff_dma[i].buf &&
tx_q->tx_skbuff_dma[i].buf_type != STMMAC_TXBUF_T_XDP_TX) {
@@ -1567,23 +1585,28 @@ static void stmmac_free_tx_buffer(struct
@@ -1568,23 +1586,28 @@ static void stmmac_free_tx_buffer(struct
/**
* dma_free_rx_skbufs - free RX dma buffers
* @priv: private structure
@ -276,7 +276,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
struct dma_desc *p;
int ret;
@@ -1592,7 +1615,7 @@ static int stmmac_alloc_rx_buffers(struc
@@ -1593,7 +1616,7 @@ static int stmmac_alloc_rx_buffers(struc
else
p = rx_q->dma_rx + i;
@ -285,7 +285,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
queue);
if (ret)
return ret;
@@ -1606,14 +1629,17 @@ static int stmmac_alloc_rx_buffers(struc
@@ -1607,14 +1630,17 @@ static int stmmac_alloc_rx_buffers(struc
/**
* dma_free_rx_xskbufs - free RX dma buffers from XSK pool
* @priv: private structure
@ -306,7 +306,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
struct stmmac_rx_buffer *buf = &rx_q->buf_pool[i];
if (!buf->xdp)
@@ -1624,12 +1650,14 @@ static void dma_free_rx_xskbufs(struct s
@@ -1625,12 +1651,14 @@ static void dma_free_rx_xskbufs(struct s
}
}
@ -324,7 +324,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
struct stmmac_rx_buffer *buf;
dma_addr_t dma_addr;
struct dma_desc *p;
@@ -1664,22 +1692,25 @@ static struct xsk_buff_pool *stmmac_get_
@@ -1665,22 +1693,25 @@ static struct xsk_buff_pool *stmmac_get_
/**
* __init_dma_rx_desc_rings - init the RX descriptor ring (per queue)
* @priv: driver private structure
@ -353,7 +353,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
xdp_rxq_info_unreg_mem_model(&rx_q->xdp_rxq);
@@ -1706,9 +1737,9 @@ static int __init_dma_rx_desc_rings(stru
@@ -1707,9 +1738,9 @@ static int __init_dma_rx_desc_rings(stru
/* RX XDP ZC buffer pool may not be populated, e.g.
* xdpsock TX-only.
*/
@ -365,7 +365,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
if (ret < 0)
return -ENOMEM;
}
@@ -1718,17 +1749,19 @@ static int __init_dma_rx_desc_rings(stru
@@ -1719,17 +1750,19 @@ static int __init_dma_rx_desc_rings(stru
if (priv->extend_desc)
stmmac_mode_init(priv, rx_q->dma_erx,
rx_q->dma_rx_phy,
@ -388,7 +388,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
{
struct stmmac_priv *priv = netdev_priv(dev);
u32 rx_count = priv->plat->rx_queues_to_use;
@@ -1740,7 +1773,7 @@ static int init_dma_rx_desc_rings(struct
@@ -1741,7 +1774,7 @@ static int init_dma_rx_desc_rings(struct
"SKB addresses:\nskb\t\tskb data\tdma data\n");
for (queue = 0; queue < rx_count; queue++) {
@ -397,7 +397,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
if (ret)
goto err_init_rx_buffers;
}
@@ -1749,12 +1782,12 @@ static int init_dma_rx_desc_rings(struct
@@ -1750,12 +1783,12 @@ static int init_dma_rx_desc_rings(struct
err_init_rx_buffers:
while (queue >= 0) {
@ -413,7 +413,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
rx_q->buf_alloc_num = 0;
rx_q->xsk_pool = NULL;
@@ -1771,14 +1804,17 @@ err_init_rx_buffers:
@@ -1772,14 +1805,17 @@ err_init_rx_buffers:
/**
* __init_dma_tx_desc_rings - init the TX descriptor ring (per queue)
* @priv: driver private structure
@ -434,7 +434,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
int i;
netif_dbg(priv, probe, priv->dev,
@@ -1790,16 +1826,16 @@ static int __init_dma_tx_desc_rings(stru
@@ -1791,16 +1827,16 @@ static int __init_dma_tx_desc_rings(stru
if (priv->extend_desc)
stmmac_mode_init(priv, tx_q->dma_etx,
tx_q->dma_tx_phy,
@ -454,7 +454,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
struct dma_desc *p;
if (priv->extend_desc)
@@ -1821,7 +1857,8 @@ static int __init_dma_tx_desc_rings(stru
@@ -1822,7 +1858,8 @@ static int __init_dma_tx_desc_rings(stru
return 0;
}
@ -464,7 +464,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
{
struct stmmac_priv *priv = netdev_priv(dev);
u32 tx_queue_cnt;
@@ -1830,7 +1867,7 @@ static int init_dma_tx_desc_rings(struct
@@ -1831,7 +1868,7 @@ static int init_dma_tx_desc_rings(struct
tx_queue_cnt = priv->plat->tx_queues_to_use;
for (queue = 0; queue < tx_queue_cnt; queue++)
@ -473,7 +473,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
return 0;
}
@@ -1838,26 +1875,29 @@ static int init_dma_tx_desc_rings(struct
@@ -1839,26 +1876,29 @@ static int init_dma_tx_desc_rings(struct
/**
* init_dma_desc_rings - init the RX/TX descriptor rings
* @dev: net device structure
@ -508,7 +508,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
return ret;
}
@@ -1865,17 +1905,20 @@ static int init_dma_desc_rings(struct ne
@@ -1866,17 +1906,20 @@ static int init_dma_desc_rings(struct ne
/**
* dma_free_tx_skbufs - free TX dma buffers
* @priv: private structure
@ -533,7 +533,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
if (tx_q->xsk_pool && tx_q->xsk_frames_done) {
xsk_tx_completed(tx_q->xsk_pool, tx_q->xsk_frames_done);
@@ -1894,34 +1937,37 @@ static void stmmac_free_tx_skbufs(struct
@@ -1895,34 +1938,37 @@ static void stmmac_free_tx_skbufs(struct
u32 queue;
for (queue = 0; queue < tx_queue_cnt; queue++)
@ -578,7 +578,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
sizeof(struct dma_extended_desc),
rx_q->dma_erx, rx_q->dma_rx_phy);
@@ -1933,29 +1979,33 @@ static void __free_dma_rx_desc_resources
@@ -1934,29 +1980,33 @@ static void __free_dma_rx_desc_resources
page_pool_destroy(rx_q->page_pool);
}
@ -617,7 +617,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
if (priv->extend_desc) {
size = sizeof(struct dma_extended_desc);
@@ -1968,7 +2018,7 @@ static void __free_dma_tx_desc_resources
@@ -1969,7 +2019,7 @@ static void __free_dma_tx_desc_resources
addr = tx_q->dma_tx;
}
@ -626,7 +626,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
dma_free_coherent(priv->device, size, addr, tx_q->dma_tx_phy);
@@ -1976,28 +2026,32 @@ static void __free_dma_tx_desc_resources
@@ -1977,28 +2027,32 @@ static void __free_dma_tx_desc_resources
kfree(tx_q->tx_skbuff);
}
@ -663,7 +663,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
struct stmmac_channel *ch = &priv->channel[queue];
bool xdp_prog = stmmac_xdp_is_enabled(priv);
struct page_pool_params pp_params = { 0 };
@@ -2009,8 +2063,8 @@ static int __alloc_dma_rx_desc_resources
@@ -2010,8 +2064,8 @@ static int __alloc_dma_rx_desc_resources
rx_q->priv_data = priv;
pp_params.flags = PP_FLAG_DMA_MAP | PP_FLAG_DMA_SYNC_DEV;
@ -674,7 +674,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
pp_params.order = ilog2(num_pages);
pp_params.nid = dev_to_node(priv->device);
pp_params.dev = priv->device;
@@ -2025,7 +2079,7 @@ static int __alloc_dma_rx_desc_resources
@@ -2026,7 +2080,7 @@ static int __alloc_dma_rx_desc_resources
return ret;
}
@ -683,7 +683,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
sizeof(*rx_q->buf_pool),
GFP_KERNEL);
if (!rx_q->buf_pool)
@@ -2033,7 +2087,7 @@ static int __alloc_dma_rx_desc_resources
@@ -2034,7 +2088,7 @@ static int __alloc_dma_rx_desc_resources
if (priv->extend_desc) {
rx_q->dma_erx = dma_alloc_coherent(priv->device,
@ -692,7 +692,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
sizeof(struct dma_extended_desc),
&rx_q->dma_rx_phy,
GFP_KERNEL);
@@ -2042,7 +2096,7 @@ static int __alloc_dma_rx_desc_resources
@@ -2043,7 +2097,7 @@ static int __alloc_dma_rx_desc_resources
} else {
rx_q->dma_rx = dma_alloc_coherent(priv->device,
@ -701,7 +701,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
sizeof(struct dma_desc),
&rx_q->dma_rx_phy,
GFP_KERNEL);
@@ -2067,7 +2121,8 @@ static int __alloc_dma_rx_desc_resources
@@ -2068,7 +2122,8 @@ static int __alloc_dma_rx_desc_resources
return 0;
}
@ -711,7 +711,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
{
u32 rx_count = priv->plat->rx_queues_to_use;
u32 queue;
@@ -2075,7 +2130,7 @@ static int alloc_dma_rx_desc_resources(s
@@ -2076,7 +2131,7 @@ static int alloc_dma_rx_desc_resources(s
/* RX queues buffers and DMA */
for (queue = 0; queue < rx_count; queue++) {
@ -720,7 +720,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
if (ret)
goto err_dma;
}
@@ -2083,7 +2138,7 @@ static int alloc_dma_rx_desc_resources(s
@@ -2084,7 +2139,7 @@ static int alloc_dma_rx_desc_resources(s
return 0;
err_dma:
@ -729,7 +729,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
return ret;
}
@@ -2091,28 +2146,31 @@ err_dma:
@@ -2092,28 +2147,31 @@ err_dma:
/**
* __alloc_dma_tx_desc_resources - alloc TX resources (per queue).
* @priv: private structure
@ -765,7 +765,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
sizeof(struct sk_buff *),
GFP_KERNEL);
if (!tx_q->tx_skbuff)
@@ -2125,7 +2183,7 @@ static int __alloc_dma_tx_desc_resources
@@ -2126,7 +2184,7 @@ static int __alloc_dma_tx_desc_resources
else
size = sizeof(struct dma_desc);
@ -774,7 +774,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
addr = dma_alloc_coherent(priv->device, size,
&tx_q->dma_tx_phy, GFP_KERNEL);
@@ -2142,7 +2200,8 @@ static int __alloc_dma_tx_desc_resources
@@ -2143,7 +2201,8 @@ static int __alloc_dma_tx_desc_resources
return 0;
}
@ -784,7 +784,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
{
u32 tx_count = priv->plat->tx_queues_to_use;
u32 queue;
@@ -2150,7 +2209,7 @@ static int alloc_dma_tx_desc_resources(s
@@ -2151,7 +2210,7 @@ static int alloc_dma_tx_desc_resources(s
/* TX queues buffers and DMA */
for (queue = 0; queue < tx_count; queue++) {
@ -793,7 +793,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
if (ret)
goto err_dma;
}
@@ -2158,27 +2217,29 @@ static int alloc_dma_tx_desc_resources(s
@@ -2159,27 +2218,29 @@ static int alloc_dma_tx_desc_resources(s
return 0;
err_dma:
@ -827,7 +827,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
return ret;
}
@@ -2186,16 +2247,18 @@ static int alloc_dma_desc_resources(stru
@@ -2187,16 +2248,18 @@ static int alloc_dma_desc_resources(stru
/**
* free_dma_desc_resources - free dma desc resources
* @priv: private structure
@ -849,7 +849,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
}
/**
@@ -2684,8 +2747,8 @@ static void stmmac_tx_err(struct stmmac_
@@ -2685,8 +2748,8 @@ static void stmmac_tx_err(struct stmmac_
netif_tx_stop_queue(netdev_get_tx_queue(priv->dev, chan));
stmmac_stop_tx_dma(priv, chan);
@ -860,7 +860,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
stmmac_reset_tx_queue(priv, chan);
stmmac_init_tx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
tx_q->dma_tx_phy, chan);
@@ -3682,19 +3745,93 @@ static int stmmac_request_irq(struct net
@@ -3683,19 +3746,93 @@ static int stmmac_request_irq(struct net
}
/**
@ -957,7 +957,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
u32 chan;
int ret;
@@ -3721,45 +3858,10 @@ static int stmmac_open(struct net_device
@@ -3722,45 +3859,10 @@ static int stmmac_open(struct net_device
memset(&priv->xstats, 0, sizeof(struct stmmac_extra_stats));
priv->xstats.threshold = tc;
@ -1005,7 +1005,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
if (priv->plat->serdes_powerup) {
ret = priv->plat->serdes_powerup(dev, priv->plat->bsp_priv);
@@ -3802,14 +3904,28 @@ irq_error:
@@ -3803,14 +3905,28 @@ irq_error:
stmmac_hw_teardown(dev);
init_error:
@ -1036,7 +1036,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
static void stmmac_fpe_stop_wq(struct stmmac_priv *priv)
{
set_bit(__FPE_REMOVING, &priv->fpe_task_state);
@@ -3856,7 +3972,7 @@ static int stmmac_release(struct net_dev
@@ -3857,7 +3973,7 @@ static int stmmac_release(struct net_dev
stmmac_stop_all_dma(priv);
/* Release and free the Rx/Tx resources */
@ -1045,7 +1045,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
/* Disable the MAC Rx/Tx */
stmmac_mac_set(priv, priv->ioaddr, false);
@@ -6395,7 +6511,7 @@ void stmmac_disable_rx_queue(struct stmm
@@ -6396,7 +6512,7 @@ void stmmac_disable_rx_queue(struct stmm
spin_unlock_irqrestore(&ch->lock, flags);
stmmac_stop_rx_dma(priv, queue);
@ -1054,7 +1054,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
}
void stmmac_enable_rx_queue(struct stmmac_priv *priv, u32 queue)
@@ -6406,21 +6522,21 @@ void stmmac_enable_rx_queue(struct stmma
@@ -6407,21 +6523,21 @@ void stmmac_enable_rx_queue(struct stmma
u32 buf_size;
int ret;
@ -1080,7 +1080,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
stmmac_init_rx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
rx_q->dma_rx_phy, rx_q->queue_index);
@@ -6458,7 +6574,7 @@ void stmmac_disable_tx_queue(struct stmm
@@ -6459,7 +6575,7 @@ void stmmac_disable_tx_queue(struct stmm
spin_unlock_irqrestore(&ch->lock, flags);
stmmac_stop_tx_dma(priv, queue);
@ -1089,7 +1089,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
}
void stmmac_enable_tx_queue(struct stmmac_priv *priv, u32 queue)
@@ -6468,21 +6584,21 @@ void stmmac_enable_tx_queue(struct stmma
@@ -6469,21 +6585,21 @@ void stmmac_enable_tx_queue(struct stmma
unsigned long flags;
int ret;
@ -1115,7 +1115,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
stmmac_init_tx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
tx_q->dma_tx_phy, tx_q->queue_index);
@@ -6522,7 +6638,7 @@ void stmmac_xdp_release(struct net_devic
@@ -6523,7 +6639,7 @@ void stmmac_xdp_release(struct net_devic
stmmac_stop_all_dma(priv);
/* Release and free the Rx/Tx resources */
@ -1124,7 +1124,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
/* Disable the MAC Rx/Tx */
stmmac_mac_set(priv, priv->ioaddr, false);
@@ -6547,14 +6663,14 @@ int stmmac_xdp_open(struct net_device *d
@@ -6548,14 +6664,14 @@ int stmmac_xdp_open(struct net_device *d
u32 chan;
int ret;
@ -1141,7 +1141,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
if (ret < 0) {
netdev_err(dev, "%s: DMA descriptors initialization failed\n",
__func__);
@@ -6636,7 +6752,7 @@ irq_error:
@@ -6637,7 +6753,7 @@ irq_error:
stmmac_hw_teardown(dev);
init_error:
@ -1150,7 +1150,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
dma_desc_error:
return ret;
}
@@ -7497,7 +7613,7 @@ int stmmac_resume(struct device *dev)
@@ -7498,7 +7614,7 @@ int stmmac_resume(struct device *dev)
stmmac_reset_queues_param(priv);
stmmac_free_tx_skbufs(priv);

View File

@ -19,7 +19,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -5624,18 +5624,15 @@ static int stmmac_change_mtu(struct net_
@@ -5625,18 +5625,15 @@ static int stmmac_change_mtu(struct net_
{
struct stmmac_priv *priv = netdev_priv(dev);
int txfifosz = priv->plat->tx_fifo_size;
@ -40,7 +40,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
if (stmmac_xdp_is_enabled(priv) && new_mtu > ETH_DATA_LEN) {
netdev_dbg(priv->dev, "Jumbo frames not supported for XDP\n");
return -EINVAL;
@@ -5647,8 +5644,29 @@ static int stmmac_change_mtu(struct net_
@@ -5648,8 +5645,29 @@ static int stmmac_change_mtu(struct net_
if ((txfifosz < new_mtu) || (new_mtu > BUF_SIZE_16KiB))
return -EINVAL;

View File

@ -206,7 +206,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
}
return 0;
@@ -1139,9 +1141,33 @@ struct nvmem_device *devm_nvmem_device_g
@@ -1142,9 +1144,33 @@ struct nvmem_device *devm_nvmem_device_g
}
EXPORT_SYMBOL_GPL(devm_nvmem_device_get);
@ -240,7 +240,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
struct nvmem_cell *cell = ERR_PTR(-ENOENT);
struct nvmem_cell_lookup *lookup;
struct nvmem_device *nvmem;
@@ -1166,11 +1192,15 @@ nvmem_cell_get_from_lookup(struct device
@@ -1169,11 +1195,15 @@ nvmem_cell_get_from_lookup(struct device
break;
}
@ -259,7 +259,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
}
break;
}
@@ -1181,10 +1211,10 @@ nvmem_cell_get_from_lookup(struct device
@@ -1184,10 +1214,10 @@ nvmem_cell_get_from_lookup(struct device
}
#if IS_ENABLED(CONFIG_OF)
@ -273,7 +273,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
mutex_lock(&nvmem_mutex);
list_for_each_entry(iter, &nvmem->cells, node) {
@@ -1214,6 +1244,7 @@ struct nvmem_cell *of_nvmem_cell_get(str
@@ -1217,6 +1247,7 @@ struct nvmem_cell *of_nvmem_cell_get(str
{
struct device_node *cell_np, *nvmem_np;
struct nvmem_device *nvmem;
@ -281,7 +281,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
struct nvmem_cell *cell;
int index = 0;
@@ -1234,12 +1265,16 @@ struct nvmem_cell *of_nvmem_cell_get(str
@@ -1237,12 +1268,16 @@ struct nvmem_cell *of_nvmem_cell_get(str
if (IS_ERR(nvmem))
return ERR_CAST(nvmem);
@ -300,7 +300,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
return cell;
}
EXPORT_SYMBOL_GPL(of_nvmem_cell_get);
@@ -1345,13 +1380,17 @@ EXPORT_SYMBOL(devm_nvmem_cell_put);
@@ -1348,13 +1383,17 @@ EXPORT_SYMBOL(devm_nvmem_cell_put);
*/
void nvmem_cell_put(struct nvmem_cell *cell)
{
@ -320,7 +320,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
{
u8 *p, *b;
int i, extra, bit_offset = cell->bit_offset;
@@ -1385,8 +1424,8 @@ static void nvmem_shift_read_buffer_in_p
@@ -1388,8 +1427,8 @@ static void nvmem_shift_read_buffer_in_p
}
static int __nvmem_cell_read(struct nvmem_device *nvmem,
@ -331,7 +331,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
{
int rc;
@@ -1417,18 +1456,18 @@ static int __nvmem_cell_read(struct nvme
@@ -1420,18 +1459,18 @@ static int __nvmem_cell_read(struct nvme
*/
void *nvmem_cell_read(struct nvmem_cell *cell, size_t *len)
{
@ -353,7 +353,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
if (rc) {
kfree(buf);
return ERR_PTR(rc);
@@ -1438,7 +1477,7 @@ void *nvmem_cell_read(struct nvmem_cell
@@ -1441,7 +1480,7 @@ void *nvmem_cell_read(struct nvmem_cell
}
EXPORT_SYMBOL_GPL(nvmem_cell_read);
@ -362,7 +362,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
u8 *_buf, int len)
{
struct nvmem_device *nvmem = cell->nvmem;
@@ -1491,16 +1530,7 @@ err:
@@ -1494,16 +1533,7 @@ err:
return ERR_PTR(rc);
}
@ -380,7 +380,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
{
struct nvmem_device *nvmem = cell->nvmem;
int rc;
@@ -1526,6 +1556,21 @@ int nvmem_cell_write(struct nvmem_cell *
@@ -1529,6 +1559,21 @@ int nvmem_cell_write(struct nvmem_cell *
return len;
}
@ -402,7 +402,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
EXPORT_SYMBOL_GPL(nvmem_cell_write);
static int nvmem_cell_read_common(struct device *dev, const char *cell_id,
@@ -1628,7 +1673,7 @@ static const void *nvmem_cell_read_varia
@@ -1631,7 +1676,7 @@ static const void *nvmem_cell_read_varia
if (IS_ERR(cell))
return cell;
@ -411,7 +411,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
buf = nvmem_cell_read(cell, len);
nvmem_cell_put(cell);
if (IS_ERR(buf))
@@ -1724,18 +1769,18 @@ EXPORT_SYMBOL_GPL(nvmem_cell_read_variab
@@ -1727,18 +1772,18 @@ EXPORT_SYMBOL_GPL(nvmem_cell_read_variab
ssize_t nvmem_device_cell_read(struct nvmem_device *nvmem,
struct nvmem_cell_info *info, void *buf)
{
@ -433,7 +433,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
if (rc)
return rc;
@@ -1755,17 +1800,17 @@ EXPORT_SYMBOL_GPL(nvmem_device_cell_read
@@ -1758,17 +1803,17 @@ EXPORT_SYMBOL_GPL(nvmem_device_cell_read
int nvmem_device_cell_write(struct nvmem_device *nvmem,
struct nvmem_cell_info *info, void *buf)
{

View File

@ -30,7 +30,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
struct gpio_desc *wp_gpio;
void *priv;
};
@@ -797,6 +798,7 @@ struct nvmem_device *nvmem_register(cons
@@ -799,6 +800,7 @@ struct nvmem_device *nvmem_register(cons
nvmem->type = config->type;
nvmem->reg_read = config->reg_read;
nvmem->reg_write = config->reg_write;
@ -38,7 +38,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
nvmem->keepout = config->keepout;
nvmem->nkeepout = config->nkeepout;
if (config->of_node)
@@ -1438,6 +1440,13 @@ static int __nvmem_cell_read(struct nvme
@@ -1441,6 +1443,13 @@ static int __nvmem_cell_read(struct nvme
if (cell->bit_offset || cell->nbits)
nvmem_shift_read_buffer_in_place(cell, buf);

View File

@ -17,7 +17,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
@@ -940,28 +940,6 @@ struct nvmem_device *devm_nvmem_register
@@ -943,28 +943,6 @@ struct nvmem_device *devm_nvmem_register
}
EXPORT_SYMBOL_GPL(devm_nvmem_register);

View File

@ -16,7 +16,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
@@ -902,9 +902,9 @@ void nvmem_unregister(struct nvmem_devic
@@ -905,9 +905,9 @@ void nvmem_unregister(struct nvmem_devic
}
EXPORT_SYMBOL_GPL(nvmem_unregister);
@ -28,7 +28,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
}
/**
@@ -921,20 +921,16 @@ static void devm_nvmem_release(struct de
@@ -924,20 +924,16 @@ static void devm_nvmem_release(struct de
struct nvmem_device *devm_nvmem_register(struct device *dev,
const struct nvmem_config *config)
{

View File

@ -18,7 +18,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
@@ -898,7 +898,8 @@ static void nvmem_device_release(struct
@@ -901,7 +901,8 @@ static void nvmem_device_release(struct
*/
void nvmem_unregister(struct nvmem_device *nvmem)
{

View File

@ -19,7 +19,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -17953,6 +17953,11 @@ L: netdev@vger.kernel.org
@@ -17954,6 +17954,11 @@ L: netdev@vger.kernel.org
S: Maintained
F: drivers/net/ethernet/dlink/sundance.c

View File

@ -57,7 +57,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -12353,6 +12353,14 @@ S: Supported
@@ -12354,6 +12354,14 @@ S: Supported
F: Documentation/devicetree/bindings/mtd/atmel-nand.txt
F: drivers/mtd/nand/raw/atmel/*

View File

@ -1,47 +0,0 @@
From 5544e90c81261e82e02bbf7c6015a4b9c8c825ef Mon Sep 17 00:00:00 2001
From: Gaosheng Cui <cuigaosheng1@huawei.com>
Date: Fri, 16 Sep 2022 13:20:50 +0100
Subject: [PATCH] nvmem: core: add error handling for dev_set_name
The type of return value of dev_set_name is int, which may return
wrong result, so we add error handling for it to reclaim memory
of nvmem resource, and return early when an error occurs.
Signed-off-by: Gaosheng Cui <cuigaosheng1@huawei.com>
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Link: https://lore.kernel.org/r/20220916122100.170016-4-srinivas.kandagatla@linaro.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
drivers/nvmem/core.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
@@ -809,18 +809,24 @@ struct nvmem_device *nvmem_register(cons
switch (config->id) {
case NVMEM_DEVID_NONE:
- dev_set_name(&nvmem->dev, "%s", config->name);
+ rval = dev_set_name(&nvmem->dev, "%s", config->name);
break;
case NVMEM_DEVID_AUTO:
- dev_set_name(&nvmem->dev, "%s%d", config->name, nvmem->id);
+ rval = dev_set_name(&nvmem->dev, "%s%d", config->name, nvmem->id);
break;
default:
- dev_set_name(&nvmem->dev, "%s%d",
+ rval = dev_set_name(&nvmem->dev, "%s%d",
config->name ? : "nvmem",
config->name ? config->id : nvmem->id);
break;
}
+ if (rval) {
+ ida_free(&nvmem_ida, nvmem->id);
+ kfree(nvmem);
+ return ERR_PTR(rval);
+ }
+
nvmem->read_only = device_property_present(config->dev, "read-only") ||
config->read_only || !nvmem->reg_write;

View File

@ -21,7 +21,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
@@ -1240,16 +1240,21 @@ struct nvmem_cell *of_nvmem_cell_get(str
@@ -1237,16 +1237,21 @@ struct nvmem_cell *of_nvmem_cell_get(str
if (!cell_np)
return ERR_PTR(-ENOENT);

View File

@ -47,7 +47,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
};
static DEFINE_MUTEX(nvmem_mutex);
@@ -1125,7 +1126,8 @@ struct nvmem_device *devm_nvmem_device_g
@@ -1122,7 +1123,8 @@ struct nvmem_device *devm_nvmem_device_g
}
EXPORT_SYMBOL_GPL(devm_nvmem_device_get);
@ -57,7 +57,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
{
struct nvmem_cell *cell;
const char *name = NULL;
@@ -1144,6 +1146,7 @@ static struct nvmem_cell *nvmem_create_c
@@ -1141,6 +1143,7 @@ static struct nvmem_cell *nvmem_create_c
cell->id = name;
cell->entry = entry;
@ -65,7 +65,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
return cell;
}
@@ -1182,7 +1185,7 @@ nvmem_cell_get_from_lookup(struct device
@@ -1179,7 +1182,7 @@ nvmem_cell_get_from_lookup(struct device
__nvmem_device_put(nvmem);
cell = ERR_PTR(-ENOENT);
} else {
@ -74,7 +74,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
if (IS_ERR(cell))
__nvmem_device_put(nvmem);
}
@@ -1230,15 +1233,27 @@ struct nvmem_cell *of_nvmem_cell_get(str
@@ -1227,15 +1230,27 @@ struct nvmem_cell *of_nvmem_cell_get(str
struct nvmem_device *nvmem;
struct nvmem_cell_entry *cell_entry;
struct nvmem_cell *cell;
@ -105,7 +105,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
nvmem_np = of_get_parent(cell_np);
if (!nvmem_np) {
@@ -1260,7 +1275,7 @@ struct nvmem_cell *of_nvmem_cell_get(str
@@ -1257,7 +1272,7 @@ struct nvmem_cell *of_nvmem_cell_get(str
return ERR_PTR(-ENOENT);
}
@ -114,7 +114,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
if (IS_ERR(cell))
__nvmem_device_put(nvmem);
@@ -1413,8 +1428,8 @@ static void nvmem_shift_read_buffer_in_p
@@ -1410,8 +1425,8 @@ static void nvmem_shift_read_buffer_in_p
}
static int __nvmem_cell_read(struct nvmem_device *nvmem,
@ -125,7 +125,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
{
int rc;
@@ -1428,7 +1443,7 @@ static int __nvmem_cell_read(struct nvme
@@ -1425,7 +1440,7 @@ static int __nvmem_cell_read(struct nvme
nvmem_shift_read_buffer_in_place(cell, buf);
if (nvmem->cell_post_process) {
@ -134,7 +134,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
cell->offset, buf, cell->bytes);
if (rc)
return rc;
@@ -1463,7 +1478,7 @@ void *nvmem_cell_read(struct nvmem_cell
@@ -1460,7 +1475,7 @@ void *nvmem_cell_read(struct nvmem_cell
if (!buf)
return ERR_PTR(-ENOMEM);
@ -143,7 +143,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
if (rc) {
kfree(buf);
return ERR_PTR(rc);
@@ -1776,7 +1791,7 @@ ssize_t nvmem_device_cell_read(struct nv
@@ -1773,7 +1788,7 @@ ssize_t nvmem_device_cell_read(struct nv
if (rc)
return rc;

View File

@ -0,0 +1,98 @@
From a621c4fdc7e1ef6b9aabe083d57bf6a637fdaf76 Mon Sep 17 00:00:00 2001
From: Kuniyuki Iwashima <kuniyu@amazon.com>
Date: Mon, 27 Feb 2023 13:15:48 -0800
Subject: [PATCH] net: Remove WARN_ON_ONCE(sk->sk_forward_alloc) from
sk_stream_kill_queues().
commit 62ec33b44e0f7168ff2886520fec6fb62d03b5a3 upstream.
Christoph Paasch reported that commit b5fc29233d28 ("inet6: Remove
inet6_destroy_sock() in sk->sk_prot->destroy().") started triggering
WARN_ON_ONCE(sk->sk_forward_alloc) in sk_stream_kill_queues(). [0 - 2]
Also, we can reproduce it by a program in [3].
In the commit, we delay freeing ipv6_pinfo.pktoptions from sk->destroy()
to sk->sk_destruct(), so sk->sk_forward_alloc is no longer zero in
inet_csk_destroy_sock().
The same check has been in inet_sock_destruct() from at least v2.6,
we can just remove the WARN_ON_ONCE(). However, among the users of
sk_stream_kill_queues(), only CAIF is not calling inet_sock_destruct().
Thus, we add the same WARN_ON_ONCE() to caif_sock_destructor().
[0]: https://lore.kernel.org/netdev/39725AB4-88F1-41B3-B07F-949C5CAEFF4F@icloud.com/
[1]: https://github.com/multipath-tcp/mptcp_net-next/issues/341
[2]:
WARNING: CPU: 0 PID: 3232 at net/core/stream.c:212 sk_stream_kill_queues+0x2f9/0x3e0
Modules linked in:
CPU: 0 PID: 3232 Comm: syz-executor.0 Not tainted 6.2.0-rc5ab24eb4698afbe147b424149c529e2a43ec24eb5 #2
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014
RIP: 0010:sk_stream_kill_queues+0x2f9/0x3e0
Code: 03 0f b6 04 02 84 c0 74 08 3c 03 0f 8e ec 00 00 00 8b ab 08 01 00 00 e9 60 ff ff ff e8 d0 5f b6 fe 0f 0b eb 97 e8 c7 5f b6 fe <0f> 0b eb a0 e8 be 5f b6 fe 0f 0b e9 6a fe ff ff e8 02 07 e3 fe e9
RSP: 0018:ffff88810570fc68 EFLAGS: 00010293
RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
RDX: ffff888101f38f40 RSI: ffffffff8285e529 RDI: 0000000000000005
RBP: 0000000000000ce0 R08: 0000000000000005 R09: 0000000000000000
R10: 0000000000000ce0 R11: 0000000000000001 R12: ffff8881009e9488
R13: ffffffff84af2cc0 R14: 0000000000000000 R15: ffff8881009e9458
FS: 00007f7fdfbd5800(0000) GS:ffff88811b600000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 0000001b32923000 CR3: 00000001062fc006 CR4: 0000000000170ef0
Call Trace:
<TASK>
inet_csk_destroy_sock+0x1a1/0x320
__tcp_close+0xab6/0xe90
tcp_close+0x30/0xc0
inet_release+0xe9/0x1f0
inet6_release+0x4c/0x70
__sock_release+0xd2/0x280
sock_close+0x15/0x20
__fput+0x252/0xa20
task_work_run+0x169/0x250
exit_to_user_mode_prepare+0x113/0x120
syscall_exit_to_user_mode+0x1d/0x40
do_syscall_64+0x48/0x90
entry_SYSCALL_64_after_hwframe+0x72/0xdc
RIP: 0033:0x7f7fdf7ae28d
Code: c1 20 00 00 75 10 b8 03 00 00 00 0f 05 48 3d 01 f0 ff ff 73 31 c3 48 83 ec 08 e8 ee fb ff ff 48 89 04 24 b8 03 00 00 00 0f 05 <48> 8b 3c 24 48 89 c2 e8 37 fc ff ff 48 89 d0 48 83 c4 08 48 3d 01
RSP: 002b:00000000007dfbb0 EFLAGS: 00000293 ORIG_RAX: 0000000000000003
RAX: 0000000000000000 RBX: 0000000000000004 RCX: 00007f7fdf7ae28d
RDX: 0000000000000000 RSI: ffffffffffffffff RDI: 0000000000000003
RBP: 0000000000000000 R08: 000000007f338e0f R09: 0000000000000e0f
R10: 000000007f338e13 R11: 0000000000000293 R12: 00007f7fdefff000
R13: 00007f7fdefffcd8 R14: 00007f7fdefffce0 R15: 00007f7fdefffcd8
</TASK>
[3]: https://lore.kernel.org/netdev/20230208004245.83497-1-kuniyu@amazon.com/
Fixes: b5fc29233d28 ("inet6: Remove inet6_destroy_sock() in sk->sk_prot->destroy().")
Reported-by: syzbot <syzkaller@googlegroups.com>
Reported-by: Christoph Paasch <christophpaasch@icloud.com>
Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
---
net/caif/caif_socket.c | 1 +
net/core/stream.c | 1 -
2 files changed, 1 insertion(+), 1 deletion(-)
--- a/net/caif/caif_socket.c
+++ b/net/caif/caif_socket.c
@@ -1020,6 +1020,7 @@ static void caif_sock_destructor(struct
return;
}
sk_stream_kill_queues(&cf_sk->sk);
+ WARN_ON(sk->sk_forward_alloc);
caif_free_client(&cf_sk->layer);
}
--- a/net/core/stream.c
+++ b/net/core/stream.c
@@ -209,7 +209,6 @@ void sk_stream_kill_queues(struct sock *
sk_mem_reclaim(sk);
WARN_ON(sk->sk_wmem_queued);
- WARN_ON(sk->sk_forward_alloc);
/* It is _impossible_ for the backlog to contain anything
* when we get here. All user references to this socket

View File

@ -88,7 +88,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -2352,6 +2352,13 @@ config UNUSED_KSYMS_WHITELIST
@@ -2356,6 +2356,13 @@ config UNUSED_KSYMS_WHITELIST
one per line. The path can be absolute, or relative to the kernel
source tree.

View File

@ -10,7 +10,7 @@ Subject: [PATCH] Kconfig: add tristate for OID and ASNI string
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -2384,7 +2384,7 @@ config PADATA
@@ -2388,7 +2388,7 @@ config PADATA
bool
config ASN1

View File

@ -12,7 +12,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
--- a/net/dsa/tag_mtk.c
+++ b/net/dsa/tag_mtk.c
@@ -25,6 +25,14 @@ static struct sk_buff *mtk_tag_xmit(stru
@@ -25,6 +25,13 @@ static struct sk_buff *mtk_tag_xmit(stru
u8 xmit_tpid;
u8 *mtk_tag;
@ -21,8 +21,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
+ * corrupted. With tags enabled, we need to make sure that packets are
+ * at least 68 bytes (including FCS and tag).
+ */
+ if (__skb_put_padto(skb, ETH_ZLEN + MTK_HDR_LEN, false))
+ return NULL;
+ eth_skb_pad(skb);
+
/* Build the special tag after the MAC Source Address. If VLAN header
* is present, it's required that VLAN header and special tag is

View File

@ -13,7 +13,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -1443,6 +1443,17 @@ config SYSCTL_ARCH_UNALIGN_ALLOW
@@ -1447,6 +1447,17 @@ config SYSCTL_ARCH_UNALIGN_ALLOW
the unaligned access emulation.
see arch/parisc/kernel/unaligned.c for reference

View File

@ -12,7 +12,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
--- a/net/dsa/tag_mtk.c
+++ b/net/dsa/tag_mtk.c
@@ -25,6 +25,14 @@ static struct sk_buff *mtk_tag_xmit(stru
@@ -25,6 +25,13 @@ static struct sk_buff *mtk_tag_xmit(stru
u8 xmit_tpid;
u8 *mtk_tag;
@ -21,8 +21,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
+ * corrupted. With tags enabled, we need to make sure that packets are
+ * at least 68 bytes (including FCS and tag).
+ */
+ if (__skb_put_padto(skb, ETH_ZLEN + MTK_HDR_LEN, false))
+ return NULL;
+ eth_skb_pad(skb);
+
/* Build the special tag after the MAC Source Address. If VLAN header
* is present, it's required that VLAN header and special tag is

View File

@ -9,9 +9,9 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
--- a/net/dsa/tag_mtk.c
+++ b/net/dsa/tag_mtk.c
@@ -33,6 +33,8 @@ static struct sk_buff *mtk_tag_xmit(stru
if (__skb_put_padto(skb, ETH_ZLEN + MTK_HDR_LEN, false))
return NULL;
@@ -32,6 +32,8 @@ static struct sk_buff *mtk_tag_xmit(stru
*/
eth_skb_pad(skb);
+ skb_set_queue_mapping(skb, dp->index);
+

View File

@ -13,7 +13,7 @@ Signed-off-by: Imre Kaloz <kaloz@openwrt.org>
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -1810,6 +1810,15 @@ config EMBEDDED
@@ -1814,6 +1814,15 @@ config EMBEDDED
an embedded system so certain expert options are available
for configuration.

Some files were not shown because too many files have changed in this diff Show More