mirror of
https://github.com/hanwckf/immortalwrt-mt798x.git
synced 2025-01-08 10:23:47 +08:00
Merge Official Source
This commit is contained in:
commit
1286d86cd3
@ -274,7 +274,7 @@ menu "Target Images"
|
||||
|
||||
config TARGET_ROOTFS_PARTSIZE
|
||||
int "Root filesystem partition size (in MB)"
|
||||
depends on USES_ROOTFS_PART || TARGET_ROOTFS_EXT4FS || TARGET_omap || TARGET_rb532 || TARGET_sunxi || TARGET_uml
|
||||
depends on USES_ROOTFS_PART || TARGET_ROOTFS_EXT4FS || TARGET_omap || TARGET_sunxi || TARGET_uml
|
||||
default 160
|
||||
help
|
||||
Select the root filesystem partition size.
|
||||
|
@ -44,7 +44,7 @@ config KERNEL_DEBUG_FS
|
||||
write to these files. Many common debugging facilities, such as
|
||||
ftrace, require the existence of debugfs.
|
||||
|
||||
# remove KERNEL_MIPS_FPU_EMULATOR after kernel 4.14 and 4.14 are gone
|
||||
# remove KERNEL_MIPS_FPU_EMULATOR after kernel 4.19 is gone
|
||||
config KERNEL_MIPS_FPU_EMULATOR
|
||||
bool "Compile the kernel with MIPS FPU Emulator"
|
||||
default y
|
||||
@ -1133,18 +1133,10 @@ config KERNEL_SECURITY_SELINUX_DEVELOP
|
||||
bool "NSA SELinux Development Support"
|
||||
depends on KERNEL_SECURITY_SELINUX
|
||||
|
||||
choice
|
||||
prompt "First legacy 'major LSM' to be initialized"
|
||||
config KERNEL_LSM
|
||||
string
|
||||
default "lockdown,yama,loadpin,safesetid,integrity,selinux"
|
||||
depends on KERNEL_SECURITY_SELINUX
|
||||
default KERNEL_DEFAULT_SECURITY_SELINUX
|
||||
|
||||
config KERNEL_DEFAULT_SECURITY_SELINUX
|
||||
bool "SELinux"
|
||||
|
||||
config KERNEL_DEFAULT_SECURITY_DAC
|
||||
bool "Unix Discretionary Access Controls"
|
||||
|
||||
endchoice
|
||||
|
||||
config KERNEL_EXT4_FS_SECURITY
|
||||
bool "Ext4 Security Labels"
|
||||
|
@ -6,11 +6,9 @@ ifdef CONFIG_TESTING_KERNEL
|
||||
KERNEL_PATCHVER:=$(KERNEL_TESTING_PATCHVER)
|
||||
endif
|
||||
|
||||
LINUX_VERSION-4.14 = .193
|
||||
LINUX_VERSION-4.19 = .138
|
||||
LINUX_VERSION-5.4 = .61
|
||||
|
||||
LINUX_KERNEL_HASH-4.14.193 = 0b0fb41d4430e1a42738b341cbfd2f41951aa5cd02acabbd53f076119c8b9f03
|
||||
LINUX_KERNEL_HASH-4.19.138 = d15c27d05f6c527269b75b30cc72972748e55720e7e00ad8abbaa4fe3b1d5e02
|
||||
LINUX_KERNEL_HASH-5.4.61 = 86f13d050f6389c5a1727fa81510ee8eceac795297bc584f443354609617fea4
|
||||
|
||||
|
@ -171,8 +171,7 @@ $(eval $(if $(NF_KMOD),$(call nf_add,NF_REJECT6,CONFIG_NF_REJECT_IPV6, $(P_V6)nf
|
||||
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NF_IPT6,CONFIG_IP6_NF_IPTABLES, $(P_V6)ip6_tables),))
|
||||
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NF_CONNTRACK,CONFIG_NF_DEFRAG_IPV6, $(P_V6)nf_defrag_ipv6, ge 4.19),))
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NF_CONNTRACK6,CONFIG_NF_DEFRAG_IPV6, $(P_V6)nf_defrag_ipv6, lt 4.19),))
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NF_CONNTRACK,CONFIG_NF_DEFRAG_IPV6, $(P_V6)nf_defrag_ipv6),))
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NF_CONNTRACK6,CONFIG_NF_CONNTRACK_IPV6, $(P_V6)nf_conntrack_ipv6),))
|
||||
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,IPT_IPV6,CONFIG_IP6_NF_FILTER, $(P_V6)ip6table_filter),))
|
||||
@ -201,10 +200,7 @@ $(eval $(call nf_add,IPT_IPV6_EXTRA,CONFIG_IP6_NF_MATCH_RT, $(P_V6)ip6t_rt))
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NF_NAT,CONFIG_NF_NAT, $(P_XT)nf_nat),))
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NF_NAT,CONFIG_NF_NAT_REDIRECT, $(P_XT)nf_nat_redirect),))
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NF_NAT,CONFIG_NF_NAT_IPV4, $(P_V4)nf_nat_ipv4),))
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NF_NAT,CONFIG_NF_NAT_MASQUERADE_IPV4, $(P_V4)nf_nat_masquerade_ipv4, lt 4.18),))
|
||||
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NF_NAT6,CONFIG_NF_NAT_IPV6, $(P_V6)nf_nat_ipv6),))
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NF_NAT6,CONFIG_NF_NAT_MASQUERADE_IPV6, $(P_V6)nf_nat_masquerade_ipv6, lt 4.18),))
|
||||
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,IPT_NAT,CONFIG_NETFILTER_XT_NAT, $(P_XT)xt_nat),))
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,IPT_NAT,CONFIG_IP_NF_NAT, $(P_V4)iptable_nat),))
|
||||
@ -278,8 +274,8 @@ $(eval $(call nf_add,IPT_TPROXY,CONFIG_NETFILTER_XT_MATCH_SOCKET, $(P_XT)xt_sock
|
||||
$(eval $(call nf_add,IPT_TPROXY,CONFIG_NF_SOCKET_IPV4, $(P_V4)nf_socket_ipv4))
|
||||
$(eval $(call nf_add,IPT_TPROXY,CONFIG_NF_SOCKET_IPV6, $(P_V6)nf_socket_ipv6))
|
||||
$(eval $(call nf_add,IPT_TPROXY,CONFIG_NETFILTER_XT_TARGET_TPROXY, $(P_XT)xt_TPROXY))
|
||||
$(eval $(call nf_add,IPT_TPROXY,CONFIG_NF_TPROXY_IPV4, $(P_V4)nf_tproxy_ipv4, ge 4.18))
|
||||
$(eval $(call nf_add,IPT_TPROXY,CONFIG_NF_TPROXY_IPV6, $(P_V6)nf_tproxy_ipv6, ge 4.18))
|
||||
$(eval $(call nf_add,IPT_TPROXY,CONFIG_NF_TPROXY_IPV4, $(P_V4)nf_tproxy_ipv4))
|
||||
$(eval $(call nf_add,IPT_TPROXY,CONFIG_NF_TPROXY_IPV6, $(P_V6)nf_tproxy_ipv6))
|
||||
|
||||
# led
|
||||
$(eval $(call nf_add,IPT_LED,CONFIG_NETFILTER_XT_TARGET_LED, $(P_XT)xt_LED))
|
||||
@ -349,10 +345,7 @@ $(eval $(call nf_add,EBTABLES_WATCHERS,CONFIG_BRIDGE_EBT_NFQUEUE, $(P_EBT)ebt_nf
|
||||
|
||||
# nftables
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NF_TABLES, $(P_XT)nf_tables),))
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NF_TABLES_INET, $(P_XT)nf_tables_inet, lt 4.17),))
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NF_TABLES_IPV4, $(P_V4)nf_tables_ipv4, lt 4.17),))
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NF_TABLES_IPV6, $(P_V6)nf_tables_ipv6, lt 4.17),))
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NF_TABLES_SET, $(P_XT)nf_tables_set, ge 4.18),))
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NF_TABLES_SET, $(P_XT)nf_tables_set),))
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NFT_CHAIN_ROUTE_IPV4, $(P_V4)nft_chain_route_ipv4),))
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NFT_CHAIN_ROUTE_IPV6, $(P_V6)nft_chain_route_ipv6),))
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NFT_COUNTER, $(P_XT)nft_counter),))
|
||||
@ -368,12 +361,7 @@ $(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NFT_QUOTA, $(P_XT)nft_quota
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NFT_REDIR, $(P_XT)nft_redir),))
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NFT_REJECT, $(P_XT)nft_reject $(P_V4)nft_reject_ipv4 $(P_V6)nft_reject_ipv6),))
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NFT_REJECT_INET, $(P_XT)nft_reject_inet),))
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NFT_SET_HASH, $(P_XT)nft_set_hash, lt 4.18),))
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NFT_CORE,CONFIG_NFT_SET_RBTREE, $(P_XT)nft_set_rbtree, lt 4.18),))
|
||||
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NFT_ARP,CONFIG_NF_TABLES_ARP, $(P_V4)nf_tables_arp, lt 4.17),))
|
||||
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NFT_BRIDGE,CONFIG_NF_TABLES_BRIDGE, $(P_EBT)nf_tables_bridge, lt 4.17),))
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NFT_BRIDGE,CONFIG_NFT_BRIDGE_META, $(P_EBT)nft_meta_bridge),))
|
||||
$(eval $(if $(NF_KMOD),$(call nf_add,NFT_BRIDGE,CONFIG_NFT_BRIDGE_REJECT, $(P_EBT)nft_reject_bridge),))
|
||||
|
||||
|
@ -13,10 +13,38 @@ __target_inc=1
|
||||
DEVICE_TYPE?=router
|
||||
|
||||
# Default packages - the really basic set
|
||||
DEFAULT_PACKAGES:=base-files libc libgcc busybox dropbear mtd uci opkg netifd fstools uclient-fetch logd urandom-seed urngd \
|
||||
coreutils kmod-nf-nathelper kmod-nf-nathelper-extra kmod-ipt-raw wget libustream-openssl ca-certificates \
|
||||
default-settings luci luci-lib-base luci-compat luci-lib-fs luci-lib-ipkg luci-proto-relay \
|
||||
luci-app-cpufreq luci-app-turboacc
|
||||
DEFAULT_PACKAGES:=\
|
||||
base-files \
|
||||
busybox \
|
||||
ca-bundle \
|
||||
ca-certificates \
|
||||
coreutils \
|
||||
default-settings \
|
||||
dropbear \
|
||||
fstools \
|
||||
kmod-ipt-raw \
|
||||
kmod-nf-nathelper \
|
||||
kmod-nf-nathelper-extra \
|
||||
libc \
|
||||
libgcc \
|
||||
libustream-wolfssl \
|
||||
logd \
|
||||
luci \
|
||||
luci-app-cpufreq \
|
||||
luci-app-turboacc \
|
||||
luci-compat \
|
||||
luci-lib-base \
|
||||
luci-lib-fs \
|
||||
luci-lib-ipkg \
|
||||
luci-proto-relay \
|
||||
mtd \
|
||||
netifd \
|
||||
opkg \
|
||||
uci \
|
||||
uclient-fetch \
|
||||
urandom-seed \
|
||||
urngd \
|
||||
wget
|
||||
# For the basic set
|
||||
DEFAULT_PACKAGES.basic:=
|
||||
# For nas targets
|
||||
@ -26,7 +54,16 @@ DEFAULT_PACKAGES.nas:=\
|
||||
lsblk \
|
||||
mdadm
|
||||
# For router targets
|
||||
DEFAULT_PACKAGES.router:=dnsmasq-full iptables ip6tables ppp ppp-mod-pppoe firewall odhcpd-ipv6only odhcp6c
|
||||
DEFAULT_PACKAGES.router:=\
|
||||
dnsmasq-full \
|
||||
firewall \
|
||||
ip6tables \
|
||||
iptables \
|
||||
kmod-ipt-offload \
|
||||
odhcp6c \
|
||||
odhcpd-ipv6only \
|
||||
ppp \
|
||||
ppp-mod-pppoe
|
||||
|
||||
ifneq ($(DUMP),)
|
||||
all: dumpinfo
|
||||
|
@ -255,7 +255,7 @@ network_find_wan() { __network_wan "$1" "0.0.0.0" "$2"; }
|
||||
|
||||
# find the logical interface which holds the current IPv6 default route
|
||||
# 1: destination variable
|
||||
# 2: consider inactive dafault routes if "true" (optional)
|
||||
# 2: consider inactive default routes if "true" (optional)
|
||||
network_find_wan6() { __network_wan "$1" "::" "$2"; }
|
||||
|
||||
# test whether the given logical interface is running
|
||||
|
@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk
|
||||
PKG_NAME:=uboot-envtools
|
||||
PKG_DISTNAME:=u-boot
|
||||
PKG_VERSION:=2020.04
|
||||
PKG_RELEASE:=1
|
||||
PKG_RELEASE:=2
|
||||
|
||||
PKG_SOURCE:=$(PKG_DISTNAME)-$(PKG_VERSION).tar.bz2
|
||||
PKG_SOURCE_URL:= \
|
||||
|
@ -33,6 +33,11 @@ xiaomi,miwifi-nano|\
|
||||
zbtlink,zbt-wg2626)
|
||||
ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x1000" "0x10000"
|
||||
;;
|
||||
hootoo,ht-tm05)
|
||||
idx="$(find_mtd_index u-boot-env)"
|
||||
[ -n "$idx" ] && \
|
||||
ubootenv_add_uci_config "/dev/mtd$idx" "0x4000" "0x1000" "0x1000"
|
||||
;;
|
||||
linksys,ea7300-v1|\
|
||||
linksys,ea7500-v2|\
|
||||
xiaomi,mi-router-ac2100|\
|
||||
|
@ -1,47 +0,0 @@
|
||||
#
|
||||
# Copyright (C) 2008 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=i2c-gpio-custom
|
||||
PKG_RELEASE:=3
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define KernelPackage/i2c-gpio-custom
|
||||
SUBMENU:=I2C support
|
||||
TITLE:=Custom GPIO-based I2C device
|
||||
DEPENDS:=@GPIO_SUPPORT +kmod-i2c-core +kmod-i2c-gpio @LINUX_4_14
|
||||
FILES:=$(PKG_BUILD_DIR)/i2c-gpio-custom.ko
|
||||
KCONFIG:=
|
||||
endef
|
||||
|
||||
define KernelPackage/i2c-gpio-custom/description
|
||||
Kernel module for register a custom i2c-gpio platform device.
|
||||
endef
|
||||
|
||||
EXTRA_KCONFIG:= \
|
||||
CONFIG_I2C_GPIO_CUSTOM=m
|
||||
|
||||
EXTRA_CFLAGS:= \
|
||||
$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(EXTRA_KCONFIG)))) \
|
||||
$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(EXTRA_KCONFIG)))) \
|
||||
|
||||
MAKE_OPTS:= \
|
||||
$(KERNEL_MAKE_FLAGS) \
|
||||
M="$(PKG_BUILD_DIR)" \
|
||||
EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \
|
||||
$(EXTRA_KCONFIG)
|
||||
|
||||
define Build/Compile
|
||||
$(MAKE) -C "$(LINUX_DIR)" \
|
||||
$(MAKE_OPTS) \
|
||||
modules
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,i2c-gpio-custom))
|
@ -1,10 +0,0 @@
|
||||
config I2C_GPIO_CUSTOM
|
||||
tristate "Custom GPIO-based I2C driver"
|
||||
depends on GENERIC_GPIO
|
||||
select I2C_GPIO
|
||||
help
|
||||
This is an I2C driver to register 1 to 4 custom I2C buses using
|
||||
GPIO lines.
|
||||
|
||||
This support is also available as a module. If so, the module
|
||||
will be called i2c-gpio-custom.
|
@ -1 +0,0 @@
|
||||
obj-${CONFIG_I2C_GPIO_CUSTOM} += i2c-gpio-custom.o
|
@ -1,207 +0,0 @@
|
||||
/*
|
||||
* Custom GPIO-based I2C driver
|
||||
*
|
||||
* Copyright (C) 2007-2008 Gabor Juhos <juhosg@openwrt.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* ---------------------------------------------------------------------------
|
||||
*
|
||||
* The behaviour of this driver can be altered by setting some parameters
|
||||
* from the insmod command line.
|
||||
*
|
||||
* The following parameters are adjustable:
|
||||
*
|
||||
* bus0 These four arguments can be arrays of
|
||||
* bus1 1-8 unsigned integers as follows:
|
||||
* bus2
|
||||
* bus3 <id>,<sda>,<scl>,<udelay>,<timeout>,<sda_od>,<scl_od>,<scl_oo>
|
||||
*
|
||||
* where:
|
||||
*
|
||||
* <id> ID to used as device_id for the corresponding bus (required)
|
||||
* <sda> GPIO pin ID to used for SDA (required)
|
||||
* <scl> GPIO pin ID to used for SCL (required)
|
||||
* <udelay> signal toggle delay.
|
||||
* <timeout> clock stretching timeout.
|
||||
* <sda_od> SDA is configured as open drain.
|
||||
* <scl_od> SCL is configured as open drain.
|
||||
* <scl_oo> SCL output drivers cannot be turned off.
|
||||
*
|
||||
* See include/i2c-gpio.h for more information about the parameters.
|
||||
*
|
||||
* If this driver is built into the kernel, you can use the following kernel
|
||||
* command line parameters, with the same values as the corresponding module
|
||||
* parameters listed above:
|
||||
*
|
||||
* i2c-gpio-custom.bus0
|
||||
* i2c-gpio-custom.bus1
|
||||
* i2c-gpio-custom.bus2
|
||||
* i2c-gpio-custom.bus3
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <linux/version.h>
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 18, 0)
|
||||
#include <linux/i2c-gpio.h>
|
||||
#else
|
||||
#include <linux/platform_data/i2c-gpio.h>
|
||||
#endif
|
||||
|
||||
#define DRV_NAME "i2c-gpio-custom"
|
||||
#define DRV_DESC "Custom GPIO-based I2C driver"
|
||||
#define DRV_VERSION "0.1.2"
|
||||
|
||||
#define PFX DRV_NAME ": "
|
||||
|
||||
#define BUS_PARAM_ID 0
|
||||
#define BUS_PARAM_SDA 1
|
||||
#define BUS_PARAM_SCL 2
|
||||
#define BUS_PARAM_UDELAY 3
|
||||
#define BUS_PARAM_TIMEOUT 4
|
||||
#define BUS_PARAM_SDA_OD 5
|
||||
#define BUS_PARAM_SCL_OD 6
|
||||
#define BUS_PARAM_SCL_OO 7
|
||||
|
||||
#define BUS_PARAM_REQUIRED 3
|
||||
#define BUS_PARAM_COUNT 8
|
||||
#define BUS_COUNT_MAX 4
|
||||
|
||||
static unsigned int bus0[BUS_PARAM_COUNT] __initdata;
|
||||
static unsigned int bus1[BUS_PARAM_COUNT] __initdata;
|
||||
static unsigned int bus2[BUS_PARAM_COUNT] __initdata;
|
||||
static unsigned int bus3[BUS_PARAM_COUNT] __initdata;
|
||||
|
||||
static unsigned int bus_nump[BUS_COUNT_MAX] __initdata;
|
||||
|
||||
#define BUS_PARM_DESC \
|
||||
" config -> id,sda,scl[,udelay,timeout,sda_od,scl_od,scl_oo]"
|
||||
|
||||
module_param_array(bus0, uint, &bus_nump[0], 0);
|
||||
MODULE_PARM_DESC(bus0, "bus0" BUS_PARM_DESC);
|
||||
module_param_array(bus1, uint, &bus_nump[1], 0);
|
||||
MODULE_PARM_DESC(bus1, "bus1" BUS_PARM_DESC);
|
||||
module_param_array(bus2, uint, &bus_nump[2], 0);
|
||||
MODULE_PARM_DESC(bus2, "bus2" BUS_PARM_DESC);
|
||||
module_param_array(bus3, uint, &bus_nump[3], 0);
|
||||
MODULE_PARM_DESC(bus3, "bus3" BUS_PARM_DESC);
|
||||
|
||||
static struct platform_device *devices[BUS_COUNT_MAX];
|
||||
static unsigned int nr_devices;
|
||||
|
||||
static void i2c_gpio_custom_cleanup(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < nr_devices; i++)
|
||||
if (devices[i])
|
||||
platform_device_unregister(devices[i]);
|
||||
}
|
||||
|
||||
static int __init i2c_gpio_custom_add_one(unsigned int id, unsigned int *params)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
struct i2c_gpio_platform_data pdata;
|
||||
int err;
|
||||
|
||||
if (!bus_nump[id])
|
||||
return 0;
|
||||
|
||||
if (bus_nump[id] < BUS_PARAM_REQUIRED) {
|
||||
printk(KERN_ERR PFX "not enough parameters for bus%d\n", id);
|
||||
err = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
pdev = platform_device_alloc("i2c-gpio", params[BUS_PARAM_ID]);
|
||||
if (!pdev) {
|
||||
err = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
|
||||
pdata.sda_pin = params[BUS_PARAM_SDA];
|
||||
pdata.scl_pin = params[BUS_PARAM_SCL];
|
||||
pdata.udelay = params[BUS_PARAM_UDELAY];
|
||||
pdata.timeout = params[BUS_PARAM_TIMEOUT];
|
||||
pdata.sda_is_open_drain = params[BUS_PARAM_SDA_OD] != 0;
|
||||
pdata.scl_is_open_drain = params[BUS_PARAM_SCL_OD] != 0;
|
||||
pdata.scl_is_output_only = params[BUS_PARAM_SCL_OO] != 0;
|
||||
|
||||
err = platform_device_add_data(pdev, &pdata, sizeof(pdata));
|
||||
if (err)
|
||||
goto err_put;
|
||||
|
||||
err = platform_device_add(pdev);
|
||||
if (err)
|
||||
goto err_put;
|
||||
|
||||
devices[nr_devices++] = pdev;
|
||||
return 0;
|
||||
|
||||
err_put:
|
||||
platform_device_put(pdev);
|
||||
err:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __init i2c_gpio_custom_probe(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
printk(KERN_INFO DRV_DESC " version " DRV_VERSION "\n");
|
||||
|
||||
err = i2c_gpio_custom_add_one(0, bus0);
|
||||
if (err)
|
||||
goto err;
|
||||
|
||||
err = i2c_gpio_custom_add_one(1, bus1);
|
||||
if (err)
|
||||
goto err;
|
||||
|
||||
err = i2c_gpio_custom_add_one(2, bus2);
|
||||
if (err)
|
||||
goto err;
|
||||
|
||||
err = i2c_gpio_custom_add_one(3, bus3);
|
||||
if (err)
|
||||
goto err;
|
||||
|
||||
if (!nr_devices) {
|
||||
printk(KERN_ERR PFX "no bus parameter(s) specified\n");
|
||||
err = -ENODEV;
|
||||
goto err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
i2c_gpio_custom_cleanup();
|
||||
return err;
|
||||
}
|
||||
|
||||
#ifdef MODULE
|
||||
static int __init i2c_gpio_custom_init(void)
|
||||
{
|
||||
return i2c_gpio_custom_probe();
|
||||
}
|
||||
module_init(i2c_gpio_custom_init);
|
||||
|
||||
static void __exit i2c_gpio_custom_exit(void)
|
||||
{
|
||||
i2c_gpio_custom_cleanup();
|
||||
}
|
||||
module_exit(i2c_gpio_custom_exit);
|
||||
#else
|
||||
subsys_initcall(i2c_gpio_custom_probe);
|
||||
#endif /* MODULE*/
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org >");
|
||||
MODULE_DESCRIPTION(DRV_DESC);
|
||||
MODULE_VERSION(DRV_VERSION);
|
@ -1,54 +0,0 @@
|
||||
#
|
||||
# Copyright (C) 2016 LEDE
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=sched-cake-oot
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL:=https://github.com/dtaht/sch_cake.git
|
||||
PKG_SOURCE_DATE:=2020-07-24
|
||||
PKG_SOURCE_VERSION:=48979385757f3408c3427b3ebbf5963efdada5aa
|
||||
PKG_MIRROR_HASH:=0e8ed53f55e28ad0c30f20293c16988876bae8d6f70f5629a43cf2ce1e49fc51
|
||||
PKG_MAINTAINER:=Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define KernelPackage/sched-cake-oot
|
||||
SUBMENU:=Network Support
|
||||
TITLE:=OOT Cake fq_codel/blue derived shaper
|
||||
URL:=https://github.com/dtaht/sch_cake
|
||||
FILES:=$(PKG_BUILD_DIR)/sch_cake.ko
|
||||
AUTOLOAD:=$(call AutoLoad,75,sch_cake)
|
||||
DEPENDS:=@LINUX_4_14 +kmod-sched-core +kmod-ipt-conntrack
|
||||
endef
|
||||
|
||||
define KernelPackage/sched-cake-oot/description
|
||||
O(ut) O(f) T(ree) Common Applications Kept Enhanced fq_codel/blue derived shaper
|
||||
endef
|
||||
|
||||
define KernelPackage/sched-cake-virtual
|
||||
SUBMENU:=Network Support
|
||||
TITLE:=Virtual package for sched-cake
|
||||
URL:=https://github.com/dtaht/sch_cake
|
||||
DEPENDS:=+!LINUX_4_14:kmod-sched-cake +LINUX_4_14:kmod-sched-cake-oot
|
||||
endef
|
||||
|
||||
define KernelPackage/sched-cake-virtual/description
|
||||
Virtual package for resolving sch_cake dependencies
|
||||
endef
|
||||
|
||||
include $(INCLUDE_DIR)/kernel-defaults.mk
|
||||
|
||||
define Build/Compile
|
||||
$(KERNEL_MAKE) M="$(PKG_BUILD_DIR)" modules
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,sched-cake-oot))
|
||||
$(eval $(call KernelPackage,sched-cake-virtual))
|
@ -248,8 +248,7 @@ define KernelPackage/can-usb-kvaser
|
||||
TITLE:=Kvaser CAN/USB interface
|
||||
KCONFIG:=CONFIG_CAN_KVASER_USB
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/drivers/net/can/usb/kvaser_usb.ko@lt4.19 \
|
||||
$(LINUX_DIR)/drivers/net/can/usb/kvaser_usb/kvaser_usb.ko@ge4.19
|
||||
$(LINUX_DIR)/drivers/net/can/usb/kvaser_usb/kvaser_usb.ko
|
||||
AUTOLOAD:=$(call AutoProbe,kvaser_usb)
|
||||
$(call AddDepends/can,+kmod-usb-core)
|
||||
endef
|
||||
|
@ -377,7 +377,7 @@ $(eval $(call KernelPackage,crypto-hw-padlock))
|
||||
|
||||
define KernelPackage/crypto-hw-safexcel
|
||||
TITLE:= MVEBU SafeXcel Crypto Engine module
|
||||
DEPENDS:=@!LINUX_4_14 @(TARGET_mvebu_cortexa53||TARGET_mvebu_cortexa72) +eip197-mini-firmware \
|
||||
DEPENDS:=@(TARGET_mvebu_cortexa53||TARGET_mvebu_cortexa72) +eip197-mini-firmware \
|
||||
+kmod-crypto-authenc +kmod-crypto-md5 +kmod-crypto-hmac +kmod-crypto-sha256 +kmod-crypto-sha512
|
||||
KCONFIG:= \
|
||||
CONFIG_CRYPTO_HW=y \
|
||||
@ -549,10 +549,8 @@ ifndef CONFIG_TARGET_x86_64
|
||||
$(LINUX_DIR)/arch/x86/crypto/twofish-i586.ko \
|
||||
$(LINUX_DIR)/arch/x86/crypto/serpent-sse2-i586.ko \
|
||||
$(LINUX_DIR)/arch/x86/crypto/glue_helper.ko \
|
||||
$(LINUX_DIR)/crypto/ablk_helper.ko@lt4.17 \
|
||||
$(LINUX_DIR)/crypto/cryptd.ko \
|
||||
$(LINUX_DIR)/crypto/lrw.ko@lt4.17 \
|
||||
$(LINUX_DIR)/crypto/crypto_simd.ko@ge4.17
|
||||
$(LINUX_DIR)/crypto/crypto_simd.ko
|
||||
AUTOLOAD+= $(call AutoLoad,10,cryptd glue_helper \
|
||||
serpent-sse2-i586 twofish-i586 blowfish_generic)
|
||||
endef
|
||||
@ -571,8 +569,7 @@ define KernelPackage/crypto-misc/x86/64
|
||||
$(LINUX_DIR)/arch/x86/crypto/twofish-avx-x86_64.ko \
|
||||
$(LINUX_DIR)/arch/x86/crypto/serpent-avx-x86_64.ko \
|
||||
$(LINUX_DIR)/arch/x86/crypto/camellia-aesni-avx2.ko \
|
||||
$(LINUX_DIR)/arch/x86/crypto/serpent-avx2.ko \
|
||||
$(LINUX_DIR)/crypto/ablk_helper.ko@lt4.17
|
||||
$(LINUX_DIR)/arch/x86/crypto/serpent-avx2.ko
|
||||
AUTOLOAD+= $(call AutoLoad,10,camellia-x86_64 \
|
||||
camellia-aesni-avx-x86_64 camellia-aesni-avx2 cast5-avx-x86_64 \
|
||||
cast6-avx-x86_64 twofish-x86_64 twofish-x86_64-3way \
|
||||
|
@ -53,8 +53,7 @@ define KernelPackage/fs-autofs4
|
||||
CONFIG_AUTOFS4_FS \
|
||||
CONFIG_AUTOFS_FS
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/fs/autofs4/autofs4.ko@lt4.18 \
|
||||
$(LINUX_DIR)/fs/autofs/autofs4.ko@ge4.18
|
||||
$(LINUX_DIR)/fs/autofs/autofs4.ko
|
||||
AUTOLOAD:=$(call AutoLoad,30,autofs4)
|
||||
endef
|
||||
|
||||
@ -206,7 +205,7 @@ $(eval $(call KernelPackage,fs-ext4))
|
||||
define KernelPackage/fs-f2fs
|
||||
SUBMENU:=$(FS_MENU)
|
||||
TITLE:=F2FS filesystem support
|
||||
DEPENDS:= +kmod-crypto-hash +kmod-crypto-crc32 +LINUX_5_4:kmod-nls-base
|
||||
DEPENDS:= +kmod-crypto-hash +kmod-crypto-crc32 +!LINUX_4_19:kmod-nls-base
|
||||
KCONFIG:= \
|
||||
CONFIG_F2FS_FS \
|
||||
CONFIG_F2FS_STAT_FS=y \
|
||||
|
@ -159,7 +159,7 @@ $(eval $(call KernelPackage,iio-dht11))
|
||||
define KernelPackage/iio-bme680
|
||||
SUBMENU:=$(IIO_MENU)
|
||||
TITLE:=BME680 gas/humidity/pressure/temperature sensor
|
||||
DEPENDS:=@!LINUX_4_14 +kmod-iio-core +kmod-regmap-core
|
||||
DEPENDS:=+kmod-iio-core +kmod-regmap-core
|
||||
KCONFIG:=CONFIG_BME680
|
||||
FILES:=$(LINUX_DIR)/drivers/iio/chemical/bme680_core.ko
|
||||
endef
|
||||
@ -414,7 +414,7 @@ $(eval $(call KernelPackage,iio-lsm6dsx-spi))
|
||||
|
||||
define KernelPackage/iio-sps30
|
||||
SUBMENU:=$(IIO_MENU)
|
||||
DEPENDS:=@!LINUX_4_14 +kmod-i2c-core +kmod-iio-core +kmod-industrialio-triggered-buffer +kmod-lib-crc8
|
||||
DEPENDS:=+kmod-i2c-core +kmod-iio-core +kmod-industrialio-triggered-buffer +kmod-lib-crc8
|
||||
TITLE:=Sensirion SPS30 particulate matter sensor
|
||||
KCONFIG:=CONFIG_SPS30
|
||||
FILES:=$(LINUX_DIR)/drivers/iio/chemical/sps30.ko
|
||||
|
@ -141,7 +141,7 @@ $(eval $(call KernelPackage,mii))
|
||||
define KernelPackage/mdio-gpio
|
||||
SUBMENU:=$(NETWORK_DEVICES_MENU)
|
||||
TITLE:= Supports GPIO lib-based MDIO busses
|
||||
DEPENDS:=+kmod-libphy @GPIO_SUPPORT +(TARGET_armvirt||TARGET_bcm27xx_bcm2708||TARGET_samsung||TARGET_tegra):kmod-of-mdio
|
||||
DEPENDS:=+kmod-libphy @GPIO_SUPPORT +(TARGET_armvirt||TARGET_bcm27xx_bcm2708||TARGET_tegra):kmod-of-mdio
|
||||
KCONFIG:= \
|
||||
CONFIG_MDIO_BITBANG \
|
||||
CONFIG_MDIO_GPIO
|
||||
@ -336,7 +336,7 @@ $(eval $(call KernelPackage,switch-rtl8306))
|
||||
define KernelPackage/switch-rtl8366-smi
|
||||
SUBMENU:=$(NETWORK_DEVICES_MENU)
|
||||
TITLE:=Realtek RTL8366 SMI switch interface support
|
||||
DEPENDS:=@GPIO_SUPPORT +kmod-swconfig +(TARGET_armvirt||TARGET_bcm27xx_bcm2708||TARGET_samsung||TARGET_tegra):kmod-of-mdio
|
||||
DEPENDS:=@GPIO_SUPPORT +kmod-swconfig +(TARGET_armvirt||TARGET_bcm27xx_bcm2708||TARGET_tegra):kmod-of-mdio
|
||||
KCONFIG:=CONFIG_RTL8366_SMI
|
||||
FILES:=$(LINUX_DIR)/drivers/net/phy/rtl8366_smi.ko
|
||||
AUTOLOAD:=$(call AutoLoad,42,rtl8366_smi,1)
|
||||
@ -557,7 +557,7 @@ $(eval $(call KernelPackage,8139cp))
|
||||
define KernelPackage/r8169
|
||||
SUBMENU:=$(NETWORK_DEVICES_MENU)
|
||||
TITLE:=RealTek RTL-8169 PCI Gigabit Ethernet Adapter kernel support
|
||||
DEPENDS:=@PCI_SUPPORT +kmod-mii +r8169-firmware +!LINUX_4_14:kmod-phy-realtek
|
||||
DEPENDS:=@PCI_SUPPORT +kmod-mii +r8169-firmware +kmod-phy-realtek
|
||||
KCONFIG:=CONFIG_R8169 \
|
||||
CONFIG_R8169_NAPI=y \
|
||||
CONFIG_R8169_VLAN=n
|
||||
@ -682,7 +682,7 @@ $(eval $(call KernelPackage,igbvf))
|
||||
define KernelPackage/ixgbe
|
||||
SUBMENU:=$(NETWORK_DEVICES_MENU)
|
||||
TITLE:=Intel(R) 82598/82599 PCI-Express 10 Gigabit Ethernet support
|
||||
DEPENDS:=@PCI_SUPPORT +kmod-mdio +kmod-ptp +kmod-hwmon-core +LINUX_5_4:kmod-libphy
|
||||
DEPENDS:=@PCI_SUPPORT +kmod-mdio +kmod-ptp +kmod-hwmon-core +!LINUX_4_19:kmod-libphy
|
||||
KCONFIG:=CONFIG_IXGBE \
|
||||
CONFIG_IXGBE_VXLAN=n \
|
||||
CONFIG_IXGBE_HWMON=y \
|
||||
@ -720,7 +720,7 @@ $(eval $(call KernelPackage,ixgbevf))
|
||||
define KernelPackage/i40e
|
||||
SUBMENU:=$(NETWORK_DEVICES_MENU)
|
||||
TITLE:=Intel(R) Ethernet Controller XL710 Family support
|
||||
DEPENDS:=@PCI_SUPPORT +kmod-mdio +kmod-ptp +kmod-hwmon-core +LINUX_5_4:kmod-libphy
|
||||
DEPENDS:=@PCI_SUPPORT +kmod-mdio +kmod-ptp +kmod-hwmon-core +!LINUX_4_19:kmod-libphy
|
||||
KCONFIG:=CONFIG_I40E \
|
||||
CONFIG_I40E_VXLAN=n \
|
||||
CONFIG_I40E_HWMON=y \
|
||||
@ -867,7 +867,7 @@ $(eval $(call KernelPackage,hfcmulti))
|
||||
define KernelPackage/gigaset
|
||||
SUBMENU:=$(NETWORK_DEVICES_MENU)
|
||||
TITLE:=Siemens Gigaset support for isdn4linux
|
||||
DEPENDS:=@USB_SUPPORT +kmod-isdn4linux +kmod-lib-crc-ccitt +kmod-usb-core @!LINUX_5_4
|
||||
DEPENDS:=@USB_SUPPORT +kmod-isdn4linux +kmod-lib-crc-ccitt +kmod-usb-core @LINUX_4_19
|
||||
URL:=http://gigaset307x.sourceforge.net/
|
||||
KCONFIG:= \
|
||||
CONFIG_ISDN_DRV_GIGASET \
|
||||
|
@ -368,7 +368,7 @@ IPVS_MODULES:= \
|
||||
define KernelPackage/nf-ipvs
|
||||
SUBMENU:=Netfilter Extensions
|
||||
TITLE:=IP Virtual Server modules
|
||||
DEPENDS:=@IPV6 +kmod-lib-crc32c +kmod-ipt-conntrack +kmod-nf-conntrack +LINUX_4_14:kmod-nf-conntrack6
|
||||
DEPENDS:=@IPV6 +kmod-lib-crc32c +kmod-ipt-conntrack +kmod-nf-conntrack
|
||||
KCONFIG:= \
|
||||
CONFIG_IP_VS \
|
||||
CONFIG_IP_VS_IPV6=y \
|
||||
@ -627,7 +627,7 @@ define KernelPackage/nf-nathelper-extra
|
||||
KCONFIG:=$(KCONFIG_NF_NATHELPER_EXTRA)
|
||||
FILES:=$(foreach mod,$(NF_NATHELPER_EXTRA-m),$(LINUX_DIR)/net/$(mod).ko)
|
||||
AUTOLOAD:=$(call AutoProbe,$(notdir $(NF_NATHELPER_EXTRA-m)))
|
||||
DEPENDS:=+kmod-nf-nat +kmod-lib-textsearch +kmod-ipt-raw +!LINUX_4_14:kmod-asn1-decoder
|
||||
DEPENDS:=+kmod-nf-nat +kmod-lib-textsearch +kmod-ipt-raw +kmod-asn1-decoder
|
||||
endef
|
||||
|
||||
define KernelPackage/nf-nathelper-extra/description
|
||||
@ -1137,7 +1137,7 @@ $(eval $(call KernelPackage,ipt-rpfilter))
|
||||
define KernelPackage/nft-core
|
||||
SUBMENU:=$(NF_MENU)
|
||||
TITLE:=Netfilter nf_tables support
|
||||
DEPENDS:=+kmod-nfnetlink +kmod-nf-reject +IPV6:kmod-nf-reject6 +IPV6:kmod-nf-conntrack6 +LINUX_5_4:kmod-nf-nat
|
||||
DEPENDS:=+kmod-nfnetlink +kmod-nf-reject +IPV6:kmod-nf-reject6 +IPV6:kmod-nf-conntrack6 +!LINUX_4_19:kmod-nf-nat
|
||||
FILES:=$(foreach mod,$(NFT_CORE-m),$(LINUX_DIR)/net/$(mod).ko)
|
||||
AUTOLOAD:=$(call AutoProbe,$(notdir $(NFT_CORE-m)))
|
||||
KCONFIG:= \
|
||||
@ -1233,7 +1233,6 @@ define KernelPackage/nft-netdev
|
||||
CONFIG_NFT_DUP_NETDEV \
|
||||
CONFIG_NFT_FWD_NETDEV
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/net/netfilter/nf_tables_netdev.ko@lt4.17 \
|
||||
$(LINUX_DIR)/net/netfilter/nf_dup_netdev.ko \
|
||||
$(LINUX_DIR)/net/netfilter/nft_dup_netdev.ko \
|
||||
$(LINUX_DIR)/net/netfilter/nft_fwd_netdev.ko
|
||||
|
@ -399,7 +399,7 @@ $(eval $(call KernelPackage,ip6-vti))
|
||||
define KernelPackage/xfrm-interface
|
||||
SUBMENU:=$(NETWORK_SUPPORT_MENU)
|
||||
TITLE:=IPsec XFRM Interface
|
||||
DEPENDS:=+kmod-ipsec4 +IPV6:kmod-ipsec6 @!LINUX_4_14
|
||||
DEPENDS:=+kmod-ipsec4 +IPV6:kmod-ipsec6
|
||||
KCONFIG:=CONFIG_XFRM_INTERFACE
|
||||
FILES:=$(LINUX_DIR)/net/xfrm/xfrm_interface.ko
|
||||
AUTOLOAD:=$(call AutoProbe,xfrm_interface)
|
||||
@ -788,7 +788,7 @@ $(eval $(call KernelPackage,sched-core))
|
||||
define KernelPackage/sched-cake
|
||||
SUBMENU:=$(NETWORK_SUPPORT_MENU)
|
||||
TITLE:=Cake fq_codel/blue derived shaper
|
||||
DEPENDS:=@!LINUX_4_14 +kmod-sched-core
|
||||
DEPENDS:=+kmod-sched-core
|
||||
KCONFIG:=CONFIG_NET_SCH_CAKE
|
||||
FILES:=$(LINUX_DIR)/net/sched/sch_cake.ko
|
||||
AUTOLOAD:=$(call AutoProbe,sch_cake)
|
||||
@ -1155,7 +1155,7 @@ $(eval $(call KernelPackage,rxrpc))
|
||||
define KernelPackage/mpls
|
||||
SUBMENU:=$(NETWORK_SUPPORT_MENU)
|
||||
TITLE:=MPLS support
|
||||
DEPENDS:=+!LINUX_4_14:kmod-iptunnel
|
||||
DEPENDS:=+kmod-iptunnel
|
||||
KCONFIG:= \
|
||||
CONFIG_MPLS=y \
|
||||
CONFIG_LWTUNNEL=y \
|
||||
|
@ -139,7 +139,7 @@ $(eval $(call KernelPackage,dma-buf))
|
||||
define KernelPackage/nvmem
|
||||
SUBMENU:=$(OTHER_MENU)
|
||||
TITLE:=Non Volatile Memory support
|
||||
DEPENDS:=@!LINUX_5_4
|
||||
DEPENDS:=@LINUX_4_19
|
||||
KCONFIG:=CONFIG_NVMEM
|
||||
HIDDEN:=1
|
||||
FILES:=$(LINUX_DIR)/drivers/nvmem/nvmem_core.ko
|
||||
@ -170,7 +170,7 @@ define KernelPackage/eeprom-at24
|
||||
SUBMENU:=$(OTHER_MENU)
|
||||
TITLE:=EEPROM AT24 support
|
||||
KCONFIG:=CONFIG_EEPROM_AT24
|
||||
DEPENDS:=+kmod-i2c-core +!LINUX_5_4:kmod-nvmem +!LINUX_4_14:kmod-regmap-i2c
|
||||
DEPENDS:=+kmod-i2c-core +LINUX_4_19:kmod-nvmem +kmod-regmap-i2c
|
||||
FILES:=$(LINUX_DIR)/drivers/misc/eeprom/at24.ko
|
||||
AUTOLOAD:=$(call AutoProbe,at24)
|
||||
endef
|
||||
@ -186,7 +186,7 @@ define KernelPackage/eeprom-at25
|
||||
SUBMENU:=$(OTHER_MENU)
|
||||
TITLE:=EEPROM AT25 support
|
||||
KCONFIG:=CONFIG_EEPROM_AT25
|
||||
DEPENDS:=+!LINUX_5_4:kmod-nvmem
|
||||
DEPENDS:=+LINUX_4_19:kmod-nvmem
|
||||
FILES:=$(LINUX_DIR)/drivers/misc/eeprom/at25.ko
|
||||
AUTOLOAD:=$(call AutoProbe,at25)
|
||||
endef
|
||||
@ -265,7 +265,7 @@ $(eval $(call KernelPackage,gpio-nxp-74hc164))
|
||||
|
||||
define KernelPackage/gpio-pca953x
|
||||
SUBMENU:=$(OTHER_MENU)
|
||||
DEPENDS:=@GPIO_SUPPORT +kmod-i2c-core +LINUX_5_4:kmod-regmap-i2c
|
||||
DEPENDS:=@GPIO_SUPPORT +kmod-i2c-core +!LINUX_4_19:kmod-regmap-i2c
|
||||
TITLE:=PCA95xx, TCA64xx, and MAX7310 I/O ports
|
||||
KCONFIG:=CONFIG_GPIO_PCA953X
|
||||
FILES:=$(LINUX_DIR)/drivers/gpio/gpio-pca953x.ko
|
||||
@ -651,7 +651,7 @@ define KernelPackage/rtc-pcf2123
|
||||
SUBMENU:=$(OTHER_MENU)
|
||||
TITLE:=Philips PCF2123 RTC support
|
||||
DEFAULT:=m if ALL_KMODS && RTC_SUPPORT
|
||||
DEPENDS:=+LINUX_5_4:kmod-regmap-spi
|
||||
DEPENDS:=+!LINUX_4_19:kmod-regmap-spi
|
||||
KCONFIG:=CONFIG_RTC_DRV_PCF2123 \
|
||||
CONFIG_RTC_CLASS=y
|
||||
FILES:=$(LINUX_DIR)/drivers/rtc/rtc-pcf2123.ko
|
||||
@ -1022,26 +1022,10 @@ endef
|
||||
$(eval $(call KernelPackage,ptp))
|
||||
|
||||
|
||||
define KernelPackage/ptp-gianfar
|
||||
SUBMENU:=$(OTHER_MENU)
|
||||
TITLE:=Freescale Gianfar PTP support
|
||||
DEPENDS:=@TARGET_mpc85xx +kmod-ptp @LINUX_4_14
|
||||
KCONFIG:=CONFIG_PTP_1588_CLOCK_GIANFAR
|
||||
FILES:=$(LINUX_DIR)/drivers/net/ethernet/freescale/gianfar_ptp.ko
|
||||
AUTOLOAD:=$(call AutoProbe,gianfar_ptp)
|
||||
endef
|
||||
|
||||
define KernelPackage/ptp-gianfar/description
|
||||
Kernel module for IEEE 1588 support for Freescale
|
||||
Gianfar Ethernet drivers
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,ptp-gianfar))
|
||||
|
||||
define KernelPackage/ptp-qoriq
|
||||
SUBMENU:=$(OTHER_MENU)
|
||||
TITLE:=Freescale QorIQ PTP support
|
||||
DEPENDS:=@TARGET_mpc85xx +kmod-ptp @!LINUX_4_14
|
||||
DEPENDS:=@TARGET_mpc85xx +kmod-ptp
|
||||
KCONFIG:=CONFIG_PTP_1588_CLOCK_QORIQ
|
||||
FILES:=$(LINUX_DIR)/drivers/ptp/ptp-qoriq.ko
|
||||
AUTOLOAD:=$(call AutoProbe,ptp-qoriq)
|
||||
@ -1069,22 +1053,6 @@ endef
|
||||
$(eval $(call KernelPackage,random-core))
|
||||
|
||||
|
||||
define KernelPackage/random-tpm
|
||||
SUBMENU:=$(OTHER_MENU)
|
||||
TITLE:=Hardware Random Number Generator TPM support
|
||||
KCONFIG:=CONFIG_HW_RANDOM_TPM
|
||||
FILES:=$(LINUX_DIR)/drivers/char/hw_random/tpm-rng.ko
|
||||
DEPENDS:= +kmod-random-core +kmod-tpm @LINUX_4_14
|
||||
AUTOLOAD:=$(call AutoProbe,tpm-rng)
|
||||
endef
|
||||
|
||||
define KernelPackage/random-tpm/description
|
||||
Kernel module for the Random Number Generator
|
||||
in the Trusted Platform Module.
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,random-tpm))
|
||||
|
||||
define KernelPackage/thermal
|
||||
SUBMENU:=$(OTHER_MENU)
|
||||
TITLE:=Generic Thermal sysfs driver
|
||||
@ -1201,7 +1169,7 @@ $(eval $(call KernelPackage,bmp085-spi))
|
||||
define KernelPackage/tpm
|
||||
SUBMENU:=$(OTHER_MENU)
|
||||
TITLE:=TPM Hardware Support
|
||||
DEPENDS:= +!LINUX_4_14:kmod-random-core
|
||||
DEPENDS:= +kmod-random-core
|
||||
KCONFIG:= CONFIG_TCG_TPM
|
||||
FILES:= $(LINUX_DIR)/drivers/char/tpm/tpm.ko
|
||||
AUTOLOAD:=$(call AutoLoad,10,tpm,1)
|
||||
|
@ -458,27 +458,9 @@ endef
|
||||
$(eval $(call KernelPackage,usb-dwc3))
|
||||
|
||||
|
||||
define KernelPackage/usb-dwc3-of-simple
|
||||
TITLE:=DWC3 USB simple OF driver
|
||||
DEPENDS:=@LINUX_4_14 @(TARGET_ipq40xx||TARGET_ipq806x) +kmod-usb-dwc3
|
||||
KCONFIG:= CONFIG_USB_DWC3_OF_SIMPLE
|
||||
FILES:= $(LINUX_DIR)/drivers/usb/dwc3/dwc3-of-simple.ko
|
||||
AUTOLOAD:=$(call AutoLoad,53,dwc3-of-simple,1)
|
||||
$(call AddDepends/usb)
|
||||
endef
|
||||
|
||||
define KernelPackage/usb-dwc3-of-simple/description
|
||||
This driver provides generic platform glue for the integrated DesignWare
|
||||
USB3 IP Core.
|
||||
endef
|
||||
|
||||
|
||||
$(eval $(call KernelPackage,usb-dwc3-of-simple))
|
||||
|
||||
|
||||
define KernelPackage/usb-dwc3-qcom
|
||||
TITLE:=DWC3 Qualcomm USB driver
|
||||
DEPENDS:=@(!LINUX_4_14) @(TARGET_ipq40xx||TARGET_ipq806x) +kmod-usb-dwc3
|
||||
DEPENDS:=@(TARGET_ipq40xx||TARGET_ipq806x) +kmod-usb-dwc3
|
||||
KCONFIG:= CONFIG_USB_DWC3_QCOM
|
||||
FILES:= $(LINUX_DIR)/drivers/usb/dwc3/dwc3-qcom.ko
|
||||
AUTOLOAD:=$(call AutoLoad,53,dwc3-qcom,1)
|
||||
@ -1603,7 +1585,7 @@ define KernelPackage/usb-chipidea
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/drivers/extcon/extcon-core.ko \
|
||||
$(LINUX_DIR)/drivers/usb/chipidea/ci_hdrc.ko \
|
||||
$(LINUX_DIR)/drivers/usb/common/ulpi.ko@ge4.18 \
|
||||
$(LINUX_DIR)/drivers/usb/common/ulpi.ko \
|
||||
$(LINUX_DIR)/drivers/usb/roles/roles.ko@ge5.0
|
||||
AUTOLOAD:=$(call AutoLoad,39,ci_hdrc,1)
|
||||
$(call AddDepends/usb)
|
||||
|
@ -229,7 +229,7 @@ define KernelPackage/drm
|
||||
KCONFIG:=CONFIG_DRM
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/drivers/gpu/drm/drm.ko \
|
||||
$(LINUX_DIR)/drivers/gpu/drm/drm_panel_orientation_quirks.ko@ge4.15
|
||||
$(LINUX_DIR)/drivers/gpu/drm/drm_panel_orientation_quirks.ko
|
||||
AUTOLOAD:=$(call AutoLoad,05,drm)
|
||||
endef
|
||||
|
||||
@ -284,7 +284,7 @@ define KernelPackage/drm-amdgpu
|
||||
CONFIG_DRM_AMD_DC=y \
|
||||
CONFIG_DEBUG_KERNEL_DC=n
|
||||
FILES:=$(LINUX_DIR)/drivers/gpu/drm/amd/amdgpu/amdgpu.ko \
|
||||
$(LINUX_DIR)/drivers/gpu/drm/scheduler/gpu-sched.ko@ge4.15 \
|
||||
$(LINUX_DIR)/drivers/gpu/drm/scheduler/gpu-sched.ko \
|
||||
$(LINUX_DIR)/drivers/gpu/drm/amd/lib/chash.ko@lt5.3
|
||||
AUTOLOAD:=$(call AutoProbe,amdgpu)
|
||||
endef
|
||||
@ -439,14 +439,10 @@ define KernelPackage/video-videobuf2
|
||||
CONFIG_VIDEOBUF2_MEMOPS \
|
||||
CONFIG_VIDEOBUF2_VMALLOC
|
||||
FILES:= \
|
||||
$(LINUX_DIR)/drivers/media/$(V4L2_DIR)/videobuf2-core.ko@lt4.16 \
|
||||
$(LINUX_DIR)/drivers/media/$(V4L2_DIR)/videobuf2-v4l2.ko@lt4.16 \
|
||||
$(LINUX_DIR)/drivers/media/$(V4L2_DIR)/videobuf2-memops.ko@lt4.16 \
|
||||
$(LINUX_DIR)/drivers/media/$(V4L2_DIR)/videobuf2-vmalloc.ko@lt4.16 \
|
||||
$(LINUX_DIR)/drivers/media/common/videobuf2/videobuf2-common.ko@ge4.16 \
|
||||
$(LINUX_DIR)/drivers/media/common/videobuf2/videobuf2-v4l2.ko@ge4.16 \
|
||||
$(LINUX_DIR)/drivers/media/common/videobuf2/videobuf2-memops.ko@ge4.16 \
|
||||
$(LINUX_DIR)/drivers/media/common/videobuf2/videobuf2-vmalloc.ko@ge4.16
|
||||
$(LINUX_DIR)/drivers/media/common/videobuf2/videobuf2-common.ko \
|
||||
$(LINUX_DIR)/drivers/media/common/videobuf2/videobuf2-v4l2.ko \
|
||||
$(LINUX_DIR)/drivers/media/common/videobuf2/videobuf2-memops.ko \
|
||||
$(LINUX_DIR)/drivers/media/common/videobuf2/videobuf2-vmalloc.ko
|
||||
AUTOLOAD:=$(call AutoLoad,65,videobuf2-core videobuf-v4l2 videobuf2-memops videobuf2-vmalloc)
|
||||
$(call AddDepends/video)
|
||||
endef
|
||||
@ -511,7 +507,7 @@ $(eval $(call KernelPackage,video-uvc))
|
||||
define KernelPackage/video-gspca-core
|
||||
MENU:=1
|
||||
TITLE:=GSPCA webcam core support framework
|
||||
DEPENDS:=@USB_SUPPORT +kmod-usb-core +kmod-input-core +!LINUX_4_14:kmod-video-videobuf2
|
||||
DEPENDS:=@USB_SUPPORT +kmod-usb-core +kmod-input-core +kmod-video-videobuf2
|
||||
KCONFIG:=CONFIG_USB_GSPCA
|
||||
FILES:=$(LINUX_DIR)/drivers/media/$(V4L2_USB_DIR)/gspca/gspca_main.ko
|
||||
AUTOLOAD:=$(call AutoProbe,gspca_main)
|
||||
|
@ -55,11 +55,7 @@ config-$(call config_package,ath9k-htc) += ATH9K_HTC
|
||||
config-$(call config_package,ath10k) += ATH10K ATH10K_PCI
|
||||
|
||||
config-$(call config_package,ath5k) += ATH5K
|
||||
ifdef CONFIG_TARGET_ath25
|
||||
config-y += ATH5K_AHB
|
||||
else
|
||||
config-y += ATH5K_PCI
|
||||
endif
|
||||
config-y += ATH5K_PCI
|
||||
|
||||
config-$(call config_package,ath6kl) += ATH6KL
|
||||
config-$(call config_package,ath6kl-sdio) += ATH6KL_SDIO
|
||||
@ -121,7 +117,7 @@ endef
|
||||
define KernelPackage/ath
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Atheros common driver part
|
||||
DEPENDS+= @PCI_SUPPORT||USB_SUPPORT||TARGET_ath79||TARGET_ath25 +kmod-mac80211
|
||||
DEPENDS+= @PCI_SUPPORT||USB_SUPPORT||TARGET_ath79 +kmod-mac80211
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath.ko
|
||||
MENU:=1
|
||||
endef
|
||||
@ -134,7 +130,7 @@ define KernelPackage/ath5k
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Atheros 5xxx wireless cards support
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath5k
|
||||
DEPENDS+= @(PCI_SUPPORT||TARGET_ath25) +kmod-ath +@DRIVER_11W_SUPPORT
|
||||
DEPENDS+= @PCI_SUPPORT +kmod-ath +@DRIVER_11W_SUPPORT
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath5k/ath5k.ko
|
||||
AUTOLOAD:=$(call AutoProbe,ath5k)
|
||||
endef
|
||||
|
@ -1,15 +0,0 @@
|
||||
--- a/net/mac80211/tx.c
|
||||
+++ b/net/mac80211/tx.c
|
||||
@@ -4136,6 +4136,12 @@ out:
|
||||
netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
|
||||
struct net_device *dev)
|
||||
{
|
||||
+#if defined(sk_pacing_shift) || LINUX_VERSION_IS_GEQ(4,15,0)
|
||||
+ if (skb->sk && sk_fullsock(skb->sk) &&
|
||||
+ skb->sk->sk_pacing_shift != 6)
|
||||
+ skb->sk->sk_pacing_shift = 6;
|
||||
+#endif
|
||||
+
|
||||
if (unlikely(ieee80211_multicast_to_unicast(skb, dev))) {
|
||||
struct sk_buff_head queue;
|
||||
|
@ -35,7 +35,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
unsigned long last_ack;
|
||||
--- a/net/mac80211/status.c
|
||||
+++ b/net/mac80211/status.c
|
||||
@@ -749,12 +749,16 @@ static void ieee80211_report_used_skb(st
|
||||
@@ -757,12 +757,16 @@ static void ieee80211_report_used_skb(st
|
||||
* - current throughput (higher value for higher tpt)?
|
||||
*/
|
||||
#define STA_LOST_PKT_THRESHOLD 50
|
||||
@ -52,7 +52,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
/* If driver relies on its own algorithm for station kickout, skip
|
||||
* mac80211 packet loss mechanism.
|
||||
*/
|
||||
@@ -767,21 +771,20 @@ static void ieee80211_lost_packet(struct
|
||||
@@ -775,21 +779,20 @@ static void ieee80211_lost_packet(struct
|
||||
return;
|
||||
|
||||
sta->status_stats.lost_packets++;
|
||||
@ -81,7 +81,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
return;
|
||||
|
||||
cfg80211_cqm_pktloss_notify(sta->sdata->dev, sta->sta.addr,
|
||||
@@ -1034,9 +1037,7 @@ static void __ieee80211_tx_status(struct
|
||||
@@ -1042,9 +1045,7 @@ static void __ieee80211_tx_status(struct
|
||||
sta->status_stats.lost_packets = 0;
|
||||
|
||||
/* Track when last TDLS packet was ACKed */
|
||||
@ -92,7 +92,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
} else if (noack_success) {
|
||||
/* nothing to do here, do not account as lost */
|
||||
} else {
|
||||
@@ -1169,9 +1170,8 @@ void ieee80211_tx_status_ext(struct ieee
|
||||
@@ -1177,9 +1178,8 @@ void ieee80211_tx_status_ext(struct ieee
|
||||
if (sta->status_stats.lost_packets)
|
||||
sta->status_stats.lost_packets = 0;
|
||||
|
||||
@ -104,7 +104,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
} else if (test_sta_flag(sta, WLAN_STA_PS_STA)) {
|
||||
return;
|
||||
} else if (noack_success) {
|
||||
@@ -1260,8 +1260,7 @@ void ieee80211_tx_status_8023(struct iee
|
||||
@@ -1268,8 +1268,7 @@ void ieee80211_tx_status_8023(struct iee
|
||||
if (sta->status_stats.lost_packets)
|
||||
sta->status_stats.lost_packets = 0;
|
||||
|
||||
|
@ -637,7 +637,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
--- a/net/mac80211/tx.c
|
||||
+++ b/net/mac80211/tx.c
|
||||
@@ -4270,11 +4270,6 @@ netdev_tx_t ieee80211_subif_start_xmit_8
|
||||
@@ -4264,11 +4264,6 @@ netdev_tx_t ieee80211_subif_start_xmit_8
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
struct sta_info *sta;
|
||||
|
||||
|
@ -198,7 +198,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
goto encap_out;
|
||||
|
||||
if (info->control.flags & IEEE80211_TX_CTRL_FAST_XMIT) {
|
||||
@@ -4253,7 +4253,7 @@ static void ieee80211_8023_xmit(struct i
|
||||
@@ -4247,7 +4247,7 @@ static void ieee80211_8023_xmit(struct i
|
||||
sdata = container_of(sdata->bss,
|
||||
struct ieee80211_sub_if_data, u.ap);
|
||||
|
||||
@ -207,7 +207,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
info->control.vif = &sdata->vif;
|
||||
|
||||
ieee80211_tx_8023(sdata, skb, skb->len, sta, false);
|
||||
@@ -4357,7 +4357,7 @@ static bool ieee80211_tx_pending_skb(str
|
||||
@@ -4351,7 +4351,7 @@ static bool ieee80211_tx_pending_skb(str
|
||||
|
||||
sdata = vif_to_sdata(info->control.vif);
|
||||
|
||||
@ -216,7 +216,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
|
||||
if (unlikely(!chanctx_conf)) {
|
||||
dev_kfree_skb(skb);
|
||||
@@ -4365,7 +4365,7 @@ static bool ieee80211_tx_pending_skb(str
|
||||
@@ -4359,7 +4359,7 @@ static bool ieee80211_tx_pending_skb(str
|
||||
}
|
||||
info->band = chanctx_conf->def.chan->band;
|
||||
result = ieee80211_tx(sdata, NULL, skb, true, 0);
|
||||
|
@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
--- a/net/mac80211/tx.c
|
||||
+++ b/net/mac80211/tx.c
|
||||
@@ -4206,6 +4206,12 @@ static void ieee80211_8023_xmit(struct i
|
||||
@@ -4200,6 +4200,12 @@ static void ieee80211_8023_xmit(struct i
|
||||
if (is_zero_ether_addr(ra))
|
||||
goto out_free;
|
||||
|
||||
|
@ -11,7 +11,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
--- a/net/mac80211/tx.c
|
||||
+++ b/net/mac80211/tx.c
|
||||
@@ -4195,6 +4195,8 @@ static void ieee80211_8023_xmit(struct i
|
||||
@@ -4189,6 +4189,8 @@ static void ieee80211_8023_xmit(struct i
|
||||
bool authorized = false;
|
||||
bool multicast;
|
||||
unsigned char *ra = ehdr->h_dest;
|
||||
@ -20,7 +20,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
if (IS_ERR(sta) || (sta && !sta->uploaded))
|
||||
sta = NULL;
|
||||
@@ -4232,6 +4234,22 @@ static void ieee80211_8023_xmit(struct i
|
||||
@@ -4226,6 +4228,22 @@ static void ieee80211_8023_xmit(struct i
|
||||
|
||||
memset(info, 0, sizeof(*info));
|
||||
|
||||
|
@ -34,7 +34,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
enabled = false;
|
||||
--- a/net/mac80211/tx.c
|
||||
+++ b/net/mac80211/tx.c
|
||||
@@ -4190,88 +4190,47 @@ static void ieee80211_8023_xmit(struct i
|
||||
@@ -4184,88 +4184,47 @@ static void ieee80211_8023_xmit(struct i
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||
@ -137,7 +137,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
|
||||
sdata = container_of(sdata->bss,
|
||||
@@ -4292,6 +4251,7 @@ netdev_tx_t ieee80211_subif_start_xmit_8
|
||||
@@ -4286,6 +4245,7 @@ netdev_tx_t ieee80211_subif_start_xmit_8
|
||||
struct net_device *dev)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
@ -145,7 +145,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
struct sta_info *sta;
|
||||
|
||||
if (unlikely(skb->len < ETH_HLEN)) {
|
||||
@@ -4303,6 +4263,10 @@ netdev_tx_t ieee80211_subif_start_xmit_8
|
||||
@@ -4297,6 +4257,10 @@ netdev_tx_t ieee80211_subif_start_xmit_8
|
||||
|
||||
if (ieee80211_lookup_ra_sta(sdata, skb, &sta))
|
||||
kfree_skb(skb);
|
||||
|
@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
--- a/net/mac80211/tx.c
|
||||
+++ b/net/mac80211/tx.c
|
||||
@@ -4191,6 +4191,7 @@ static void ieee80211_8023_xmit(struct i
|
||||
@@ -4185,6 +4185,7 @@ static void ieee80211_8023_xmit(struct i
|
||||
{
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
@ -18,7 +18,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
struct tid_ampdu_tx *tid_tx;
|
||||
u8 tid;
|
||||
|
||||
@@ -4239,6 +4240,10 @@ static void ieee80211_8023_xmit(struct i
|
||||
@@ -4233,6 +4234,10 @@ static void ieee80211_8023_xmit(struct i
|
||||
info->flags |= IEEE80211_TX_CTL_HW_80211_ENCAP;
|
||||
info->control.vif = &sdata->vif;
|
||||
|
||||
|
@ -0,0 +1,49 @@
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Thu, 27 Aug 2020 12:44:36 +0200
|
||||
Subject: [PATCH] mac80211: extend AQL aggregation estimation to HE and fix
|
||||
unit mismatch
|
||||
|
||||
The unit of the return value of ieee80211_get_rate_duration is nanoseconds, not
|
||||
milliseconds. Adjust the duration checks to account for that.
|
||||
For higher data rates, allow larger estimated aggregation sizes, and add some
|
||||
values for HE as well, which can use much larger aggregates.
|
||||
Since small packets with high data rates can now lead to duration values too
|
||||
small for info->tx_time_est, return a minimum of 4us.
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
---
|
||||
|
||||
--- a/net/mac80211/airtime.c
|
||||
+++ b/net/mac80211/airtime.c
|
||||
@@ -668,20 +668,26 @@ u32 ieee80211_calc_expected_tx_airtime(s
|
||||
* This will not be very accurate, but much better than simply
|
||||
* assuming un-aggregated tx in all cases.
|
||||
*/
|
||||
- if (duration > 400) /* <= VHT20 MCS2 1S */
|
||||
+ if (duration > 400 * 1024) /* <= VHT20 MCS2 1S */
|
||||
agg_shift = 1;
|
||||
- else if (duration > 250) /* <= VHT20 MCS3 1S or MCS1 2S */
|
||||
+ else if (duration > 250 * 1024) /* <= VHT20 MCS3 1S or MCS1 2S */
|
||||
agg_shift = 2;
|
||||
- else if (duration > 150) /* <= VHT20 MCS5 1S or MCS3 2S */
|
||||
+ else if (duration > 150 * 1024) /* <= VHT20 MCS5 1S or MCS2 2S */
|
||||
agg_shift = 3;
|
||||
- else
|
||||
+ else if (duration > 70 * 1024) /* <= VHT20 MCS5 2S */
|
||||
agg_shift = 4;
|
||||
+ else if (stat.encoding != RX_ENC_HE ||
|
||||
+ duration > 20 * 1024) /* <= HE40 MCS6 2S */
|
||||
+ agg_shift = 5;
|
||||
+ else
|
||||
+ agg_shift = 6;
|
||||
|
||||
duration *= len;
|
||||
duration /= AVG_PKT_SIZE;
|
||||
duration /= 1024;
|
||||
+ duration += (overhead >> agg_shift);
|
||||
|
||||
- return duration + (overhead >> agg_shift);
|
||||
+ return max_t(u32, duration, 4);
|
||||
}
|
||||
|
||||
if (!conf)
|
@ -0,0 +1,23 @@
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Thu, 27 Aug 2020 12:47:48 +0200
|
||||
Subject: [PATCH] mac80211: add AQL support for VHT160 tx rates
|
||||
|
||||
When converting from struct ieee80211_tx_rate to ieee80211_rx_status,
|
||||
there was one check missing to fill in the bandwidth for 160 MHz
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
---
|
||||
|
||||
--- a/net/mac80211/airtime.c
|
||||
+++ b/net/mac80211/airtime.c
|
||||
@@ -560,7 +560,9 @@ static int ieee80211_fill_rx_status(stru
|
||||
if (rate->idx < 0 || !rate->count)
|
||||
return -1;
|
||||
|
||||
- if (rate->flags & IEEE80211_TX_RC_80_MHZ_WIDTH)
|
||||
+ if (rate->flags & IEEE80211_TX_RC_160_MHZ_WIDTH)
|
||||
+ stat->bw = RATE_INFO_BW_160;
|
||||
+ else if (rate->flags & IEEE80211_TX_RC_80_MHZ_WIDTH)
|
||||
stat->bw = RATE_INFO_BW_80;
|
||||
else if (rate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
|
||||
stat->bw = RATE_INFO_BW_40;
|
@ -1,47 +0,0 @@
|
||||
#
|
||||
# Copyright (C) 2008 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=spi-gpio-custom
|
||||
PKG_RELEASE:=1
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define KernelPackage/spi-gpio-custom
|
||||
SUBMENU:=SPI Support
|
||||
TITLE:=Custom GPIO-based SPI device
|
||||
DEPENDS:=@GPIO_SUPPORT +kmod-spi-bitbang +kmod-spi-gpio +kmod-spi-dev @LINUX_4_14
|
||||
FILES:=$(PKG_BUILD_DIR)/spi-gpio-custom.ko
|
||||
KCONFIG:=
|
||||
endef
|
||||
|
||||
define KernelPackage/spi-gpio-custom/description
|
||||
Kernel module for register a custom spi-gpio platform device.
|
||||
endef
|
||||
|
||||
EXTRA_KCONFIG:= \
|
||||
CONFIG_SPI_GPIO_CUSTOM=m
|
||||
|
||||
EXTRA_CFLAGS:= \
|
||||
$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(EXTRA_KCONFIG)))) \
|
||||
$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(EXTRA_KCONFIG)))) \
|
||||
|
||||
MAKE_OPTS:= \
|
||||
$(KERNEL_MAKE_FLAGS) \
|
||||
M="$(PKG_BUILD_DIR)" \
|
||||
EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \
|
||||
$(EXTRA_KCONFIG)
|
||||
|
||||
define Build/Compile
|
||||
$(MAKE) -C "$(LINUX_DIR)" \
|
||||
$(MAKE_OPTS) \
|
||||
modules
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,spi-gpio-custom))
|
@ -1,14 +0,0 @@
|
||||
config SPI_GPIO_CUSTOM
|
||||
tristate "Custom GPIO-based SPI driver"
|
||||
depends on GENERIC_GPIO
|
||||
select SPI_GPIO
|
||||
help
|
||||
This is an SPI driver to register 1 to 4 custom SPI buses using
|
||||
GPIO lines. Each bus can have up to 8 slaves.
|
||||
The devices will be exposed to userspace as /dev/spidevX.X
|
||||
|
||||
This module is maily intended to interface microcontrollers
|
||||
and other SPI devices without a specific kernel driver.
|
||||
|
||||
This support is also available as a module. If so, the module
|
||||
will be called spi-gpio-custom.
|
@ -1 +0,0 @@
|
||||
obj-${CONFIG_SPI_GPIO_CUSTOM} += spi-gpio-custom.o
|
@ -1,365 +0,0 @@
|
||||
/*
|
||||
* Custom GPIO-based SPI driver
|
||||
*
|
||||
* Copyright (C) 2013 Marco Burato <zmaster.adsl@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* Based on i2c-gpio-custom by:
|
||||
* Copyright (C) 2007-2008 Gabor Juhos <juhosg@openwrt.org>
|
||||
* ---------------------------------------------------------------------------
|
||||
*
|
||||
* The behaviour of this driver can be altered by setting some parameters
|
||||
* from the insmod command line.
|
||||
*
|
||||
* The following parameters are adjustable:
|
||||
*
|
||||
* bus0 These four arguments can be arrays of
|
||||
* bus1 1-8 unsigned integers as follows:
|
||||
* bus2
|
||||
* bus3 <id>,<sck>,<mosi>,<miso>,<mode1>,<maxfreq1>,<cs1>,...
|
||||
*
|
||||
* where:
|
||||
*
|
||||
* <id> ID to used as device_id for the corresponding bus (required)
|
||||
* <sck> GPIO pin ID to be used for bus SCK (required)
|
||||
* <mosi> GPIO pin ID to be used for bus MOSI (required*)
|
||||
* <miso> GPIO pin ID to be used for bus MISO (required*)
|
||||
* <modeX> Mode configuration for slave X in the bus (required)
|
||||
* (see /include/linux/spi/spi.h)
|
||||
* <maxfreqX> Maximum clock frequency in Hz for slave X in the bus (required)
|
||||
* <csX> GPIO pin ID to be used for slave X CS (required**)
|
||||
*
|
||||
* Notes:
|
||||
* * If a signal is not used (for example there is no MISO) you need
|
||||
* to set the GPIO pin ID for that signal to an invalid value.
|
||||
* ** If you only have 1 slave in the bus with no CS, you can omit the
|
||||
* <cs1> param or set it to an invalid GPIO id to disable it. When
|
||||
* you have 2 or more slaves, they must all have a valid CS.
|
||||
*
|
||||
* If this driver is built into the kernel, you can use the following kernel
|
||||
* command line parameters, with the same values as the corresponding module
|
||||
* parameters listed above:
|
||||
*
|
||||
* spi-gpio-custom.bus0
|
||||
* spi-gpio-custom.bus1
|
||||
* spi-gpio-custom.bus2
|
||||
* spi-gpio-custom.bus3
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/spi_gpio.h>
|
||||
|
||||
#define DRV_NAME "spi-gpio-custom"
|
||||
#define DRV_DESC "Custom GPIO-based SPI driver"
|
||||
#define DRV_VERSION "0.1"
|
||||
|
||||
#define PFX DRV_NAME ": "
|
||||
|
||||
#define BUS_PARAM_ID 0
|
||||
#define BUS_PARAM_SCK 1
|
||||
#define BUS_PARAM_MOSI 2
|
||||
#define BUS_PARAM_MISO 3
|
||||
#define BUS_PARAM_MODE1 4
|
||||
#define BUS_PARAM_MAXFREQ1 5
|
||||
#define BUS_PARAM_CS1 6
|
||||
|
||||
#define BUS_SLAVE_COUNT_MAX 8
|
||||
#define BUS_PARAM_REQUIRED 6
|
||||
#define BUS_PARAM_PER_SLAVE 3
|
||||
#define BUS_PARAM_COUNT (4+BUS_PARAM_PER_SLAVE*BUS_SLAVE_COUNT_MAX)
|
||||
#define BUS_COUNT_MAX 4
|
||||
|
||||
static unsigned int bus0[BUS_PARAM_COUNT] __initdata;
|
||||
static unsigned int bus1[BUS_PARAM_COUNT] __initdata;
|
||||
static unsigned int bus2[BUS_PARAM_COUNT] __initdata;
|
||||
static unsigned int bus3[BUS_PARAM_COUNT] __initdata;
|
||||
|
||||
static unsigned int bus_nump[BUS_COUNT_MAX] __initdata;
|
||||
|
||||
#define BUS_PARM_DESC \
|
||||
" config -> id,sck,mosi,miso,mode1,maxfreq1[,cs1,mode2,maxfreq2,cs2,...]"
|
||||
|
||||
module_param_array(bus0, uint, &bus_nump[0], 0);
|
||||
MODULE_PARM_DESC(bus0, "bus0" BUS_PARM_DESC);
|
||||
module_param_array(bus1, uint, &bus_nump[1], 0);
|
||||
MODULE_PARM_DESC(bus1, "bus1" BUS_PARM_DESC);
|
||||
module_param_array(bus2, uint, &bus_nump[2], 0);
|
||||
MODULE_PARM_DESC(bus2, "bus2" BUS_PARM_DESC);
|
||||
module_param_array(bus3, uint, &bus_nump[3], 0);
|
||||
MODULE_PARM_DESC(bus3, "bus3" BUS_PARM_DESC);
|
||||
|
||||
static struct platform_device *devices[BUS_COUNT_MAX];
|
||||
static unsigned int nr_devices;
|
||||
|
||||
static void spi_gpio_custom_cleanup(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < nr_devices; i++)
|
||||
if (devices[i])
|
||||
platform_device_unregister(devices[i]);
|
||||
}
|
||||
|
||||
static int __init spi_gpio_custom_get_slave_mode(unsigned int id,
|
||||
unsigned int *params,
|
||||
int slave_index)
|
||||
{
|
||||
int param_index;
|
||||
|
||||
param_index = BUS_PARAM_MODE1+slave_index*BUS_PARAM_PER_SLAVE;
|
||||
if (param_index >= bus_nump[id])
|
||||
return -1;
|
||||
|
||||
return params[param_index];
|
||||
}
|
||||
static int __init spi_gpio_custom_get_slave_maxfreq(unsigned int id,
|
||||
unsigned int *params,
|
||||
int slave_index)
|
||||
{
|
||||
int param_index;
|
||||
|
||||
param_index = BUS_PARAM_MAXFREQ1+slave_index*BUS_PARAM_PER_SLAVE;
|
||||
if (param_index >= bus_nump[id])
|
||||
return -1;
|
||||
|
||||
return params[param_index];
|
||||
}
|
||||
static int __init spi_gpio_custom_get_slave_cs(unsigned int id,
|
||||
unsigned int *params,
|
||||
int slave_index)
|
||||
{
|
||||
int param_index;
|
||||
|
||||
param_index = BUS_PARAM_CS1+slave_index*BUS_PARAM_PER_SLAVE;
|
||||
if (param_index >= bus_nump[id])
|
||||
return -1;
|
||||
if (!gpio_is_valid(params[param_index]))
|
||||
return -1;
|
||||
|
||||
return params[param_index];
|
||||
}
|
||||
|
||||
static int __init spi_gpio_custom_check_params(unsigned int id, unsigned int *params)
|
||||
{
|
||||
int i;
|
||||
struct spi_master *master;
|
||||
|
||||
if (bus_nump[id] < BUS_PARAM_REQUIRED) {
|
||||
printk(KERN_ERR PFX "not enough values for parameter bus%d\n",
|
||||
id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (bus_nump[id] > (1+BUS_PARAM_CS1)) {
|
||||
/* more than 1 device: check CS GPIOs */
|
||||
for (i = 0; i < BUS_SLAVE_COUNT_MAX; i++) {
|
||||
/* no more slaves? */
|
||||
if (spi_gpio_custom_get_slave_mode(id, params, i) < 0)
|
||||
break;
|
||||
|
||||
if (spi_gpio_custom_get_slave_cs(id, params, i) < 0) {
|
||||
printk(KERN_ERR PFX "invalid/missing CS gpio for slave %d on bus %d\n",
|
||||
i, params[BUS_PARAM_ID]);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!gpio_is_valid(params[BUS_PARAM_SCK])) {
|
||||
printk(KERN_ERR PFX "invalid SCK gpio for bus %d\n",
|
||||
params[BUS_PARAM_ID]);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
master = spi_busnum_to_master(params[BUS_PARAM_ID]);
|
||||
if (master) {
|
||||
spi_master_put(master);
|
||||
printk(KERN_ERR PFX "bus %d already exists\n",
|
||||
params[BUS_PARAM_ID]);
|
||||
return -EEXIST;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init spi_gpio_custom_add_one(unsigned int id, unsigned int *params)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
struct spi_gpio_platform_data pdata;
|
||||
int i;
|
||||
int num_cs;
|
||||
int err;
|
||||
struct spi_master *master;
|
||||
struct spi_device *slave;
|
||||
struct spi_board_info slave_info;
|
||||
int mode, maxfreq, cs;
|
||||
|
||||
|
||||
if (!bus_nump[id])
|
||||
return 0;
|
||||
|
||||
err = spi_gpio_custom_check_params(id, params);
|
||||
if (err)
|
||||
goto err;
|
||||
|
||||
/* Create BUS device node */
|
||||
|
||||
pdev = platform_device_alloc("spi_gpio", params[BUS_PARAM_ID]);
|
||||
if (!pdev) {
|
||||
err = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
|
||||
num_cs = 0;
|
||||
for (i = 0; i < BUS_SLAVE_COUNT_MAX; i++) {
|
||||
/* no more slaves? */
|
||||
if (spi_gpio_custom_get_slave_mode(id, params, i) < 0)
|
||||
break;
|
||||
|
||||
if (spi_gpio_custom_get_slave_cs(id, params, i) >= 0)
|
||||
num_cs++;
|
||||
}
|
||||
if (num_cs == 0) {
|
||||
/*
|
||||
* Even if no CS is used, spi modules expect
|
||||
* at least 1 (unused)
|
||||
*/
|
||||
num_cs = 1;
|
||||
}
|
||||
|
||||
pdata.sck = params[BUS_PARAM_SCK];
|
||||
pdata.mosi = gpio_is_valid(params[BUS_PARAM_MOSI])
|
||||
? params[BUS_PARAM_MOSI]
|
||||
: SPI_GPIO_NO_MOSI;
|
||||
pdata.miso = gpio_is_valid(params[BUS_PARAM_MISO])
|
||||
? params[BUS_PARAM_MISO]
|
||||
: SPI_GPIO_NO_MISO;
|
||||
pdata.num_chipselect = num_cs;
|
||||
|
||||
err = platform_device_add_data(pdev, &pdata, sizeof(pdata));
|
||||
if (err) {
|
||||
platform_device_put(pdev);
|
||||
goto err;
|
||||
}
|
||||
|
||||
err = platform_device_add(pdev);
|
||||
if (err) {
|
||||
printk(KERN_ERR PFX "platform_device_add failed with return code %d\n",
|
||||
err);
|
||||
platform_device_put(pdev);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* Register SLAVE devices */
|
||||
|
||||
for (i = 0; i < BUS_SLAVE_COUNT_MAX; i++) {
|
||||
mode = spi_gpio_custom_get_slave_mode(id, params, i);
|
||||
maxfreq = spi_gpio_custom_get_slave_maxfreq(id, params, i);
|
||||
cs = spi_gpio_custom_get_slave_cs(id, params, i);
|
||||
|
||||
/* no more slaves? */
|
||||
if (mode < 0)
|
||||
break;
|
||||
|
||||
memset(&slave_info, 0, sizeof(slave_info));
|
||||
strcpy(slave_info.modalias, "spidev");
|
||||
slave_info.controller_data = (void *)((cs >= 0)
|
||||
? cs
|
||||
: SPI_GPIO_NO_CHIPSELECT);
|
||||
slave_info.max_speed_hz = maxfreq;
|
||||
slave_info.bus_num = params[BUS_PARAM_ID];
|
||||
slave_info.chip_select = i;
|
||||
slave_info.mode = mode;
|
||||
|
||||
master = spi_busnum_to_master(params[BUS_PARAM_ID]);
|
||||
if (!master) {
|
||||
printk(KERN_ERR PFX "unable to get master for bus %d\n",
|
||||
params[BUS_PARAM_ID]);
|
||||
err = -EINVAL;
|
||||
goto err_unregister;
|
||||
}
|
||||
slave = spi_new_device(master, &slave_info);
|
||||
spi_master_put(master);
|
||||
if (!slave) {
|
||||
printk(KERN_ERR PFX "unable to create slave %d for bus %d\n",
|
||||
i, params[BUS_PARAM_ID]);
|
||||
/* Will most likely fail due to unsupported mode bits */
|
||||
err = -EINVAL;
|
||||
goto err_unregister;
|
||||
}
|
||||
}
|
||||
|
||||
devices[nr_devices++] = pdev;
|
||||
|
||||
return 0;
|
||||
|
||||
err_unregister:
|
||||
platform_device_unregister(pdev);
|
||||
err:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __init spi_gpio_custom_probe(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
printk(KERN_INFO DRV_DESC " version " DRV_VERSION "\n");
|
||||
|
||||
err = spi_gpio_custom_add_one(0, bus0);
|
||||
if (err)
|
||||
goto err;
|
||||
|
||||
err = spi_gpio_custom_add_one(1, bus1);
|
||||
if (err)
|
||||
goto err;
|
||||
|
||||
err = spi_gpio_custom_add_one(2, bus2);
|
||||
if (err)
|
||||
goto err;
|
||||
|
||||
err = spi_gpio_custom_add_one(3, bus3);
|
||||
if (err)
|
||||
goto err;
|
||||
|
||||
if (!nr_devices) {
|
||||
printk(KERN_ERR PFX "no bus parameter(s) specified\n");
|
||||
err = -ENODEV;
|
||||
goto err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
spi_gpio_custom_cleanup();
|
||||
return err;
|
||||
}
|
||||
|
||||
#ifdef MODULE
|
||||
static int __init spi_gpio_custom_init(void)
|
||||
{
|
||||
return spi_gpio_custom_probe();
|
||||
}
|
||||
module_init(spi_gpio_custom_init);
|
||||
|
||||
static void __exit spi_gpio_custom_exit(void)
|
||||
{
|
||||
spi_gpio_custom_cleanup();
|
||||
}
|
||||
module_exit(spi_gpio_custom_exit);
|
||||
#else
|
||||
subsys_initcall(spi_gpio_custom_probe);
|
||||
#endif /* MODULE*/
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_AUTHOR("Marco Burato <zmaster.adsl@gmail.com>");
|
||||
MODULE_DESCRIPTION(DRV_DESC);
|
||||
MODULE_VERSION(DRV_VERSION);
|
@ -1,48 +0,0 @@
|
||||
#
|
||||
# Copyright (C) 2008-2012 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=w1-gpio-custom
|
||||
PKG_RELEASE:=4
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define KernelPackage/w1-gpio-custom
|
||||
SUBMENU:=W1 support
|
||||
TITLE:=Custom GPIO-based 1-wire device
|
||||
DEPENDS:=kmod-w1 +kmod-w1-master-gpio @LINUX_4_14
|
||||
FILES:=$(PKG_BUILD_DIR)/w1-gpio-custom.ko
|
||||
KCONFIG:=
|
||||
endef
|
||||
|
||||
define KernelPackage/w1-gpio-custom/description
|
||||
Kernel module to register a custom w1-gpio platform device.
|
||||
endef
|
||||
|
||||
EXTRA_KCONFIG:= \
|
||||
CONFIG_W1_MASTER_GPIO_CUSTOM=m
|
||||
|
||||
EXTRA_CFLAGS:= \
|
||||
$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(EXTRA_KCONFIG)))) \
|
||||
$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(EXTRA_KCONFIG))))
|
||||
|
||||
MAKE_OPTS:= \
|
||||
$(KERNEL_MAKE_FLAGS) \
|
||||
M="$(PKG_BUILD_DIR)" \
|
||||
EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \
|
||||
$(EXTRA_KCONFIG)
|
||||
|
||||
define Build/Compile
|
||||
$(MAKE) -C "$(LINUX_DIR)" \
|
||||
$(MAKE_OPTS) \
|
||||
modules
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,w1-gpio-custom))
|
||||
|
@ -1,4 +0,0 @@
|
||||
config W1_MASTER_GPIO_CUSTOM
|
||||
tristate "Custom GPIO-based W1 driver"
|
||||
depends on GENERIC_GPIO
|
||||
select W1_GPIO
|
@ -1 +0,0 @@
|
||||
obj-${CONFIG_W1_MASTER_GPIO_CUSTOM} += w1-gpio-custom.o
|
@ -1,190 +0,0 @@
|
||||
/*
|
||||
* Custom GPIO-based W1 driver
|
||||
*
|
||||
* Copyright (C) 2007 Gabor Juhos <juhosg at openwrt.org>
|
||||
* Copyright (C) 2008 Bifferos <bifferos at yahoo.co.uk>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* ---------------------------------------------------------------------------
|
||||
*
|
||||
* The behaviour of this driver can be altered by setting some parameters
|
||||
* from the insmod command line.
|
||||
*
|
||||
* The following parameters are adjustable:
|
||||
*
|
||||
* bus0 These four arguments must be arrays of
|
||||
* bus1 3 unsigned integers as follows:
|
||||
* bus2
|
||||
* bus3 <id>,<pin>,<od>
|
||||
*
|
||||
* where:
|
||||
*
|
||||
* <id> ID to used as device_id for the corresponding bus (required)
|
||||
* <sda> GPIO pin ID of data pin (required)
|
||||
* <od> Pin is configured as open drain.
|
||||
*
|
||||
* See include/w1-gpio.h for more information about the parameters.
|
||||
*
|
||||
* If this driver is built into the kernel, you can use the following kernel
|
||||
* command line parameters, with the same values as the corresponding module
|
||||
* parameters listed above:
|
||||
*
|
||||
* w1-gpio-custom.bus0
|
||||
* w1-gpio-custom.bus1
|
||||
* w1-gpio-custom.bus2
|
||||
* w1-gpio-custom.bus3
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <linux/w1-gpio.h>
|
||||
|
||||
#define DRV_NAME "w1-gpio-custom"
|
||||
#define DRV_DESC "Custom GPIO-based W1 driver"
|
||||
#define DRV_VERSION "0.1.2"
|
||||
|
||||
#define PFX DRV_NAME ": "
|
||||
|
||||
#define BUS_PARAM_ID 0
|
||||
#define BUS_PARAM_PIN 1
|
||||
#define BUS_PARAM_OD 2
|
||||
|
||||
#define BUS_PARAM_REQUIRED 3
|
||||
#define BUS_PARAM_COUNT 3
|
||||
#define BUS_COUNT_MAX 4
|
||||
|
||||
static unsigned int bus0[BUS_PARAM_COUNT] __initdata;
|
||||
static unsigned int bus1[BUS_PARAM_COUNT] __initdata;
|
||||
static unsigned int bus2[BUS_PARAM_COUNT] __initdata;
|
||||
static unsigned int bus3[BUS_PARAM_COUNT] __initdata;
|
||||
|
||||
static unsigned int bus_nump[BUS_COUNT_MAX] __initdata;
|
||||
|
||||
#define BUS_PARM_DESC " config -> id,pin,od"
|
||||
|
||||
module_param_array(bus0, uint, &bus_nump[0], 0);
|
||||
MODULE_PARM_DESC(bus0, "bus0" BUS_PARM_DESC);
|
||||
module_param_array(bus1, uint, &bus_nump[1], 0);
|
||||
MODULE_PARM_DESC(bus1, "bus1" BUS_PARM_DESC);
|
||||
module_param_array(bus2, uint, &bus_nump[2], 0);
|
||||
MODULE_PARM_DESC(bus2, "bus2" BUS_PARM_DESC);
|
||||
module_param_array(bus3, uint, &bus_nump[3], 0);
|
||||
MODULE_PARM_DESC(bus3, "bus3" BUS_PARM_DESC);
|
||||
|
||||
static struct platform_device *devices[BUS_COUNT_MAX];
|
||||
static unsigned int nr_devices;
|
||||
|
||||
static void w1_gpio_custom_cleanup(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < nr_devices; i++)
|
||||
if (devices[i])
|
||||
platform_device_unregister(devices[i]);
|
||||
}
|
||||
|
||||
static int __init w1_gpio_custom_add_one(unsigned int id, unsigned int *params)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
struct w1_gpio_platform_data pdata;
|
||||
int err;
|
||||
|
||||
if (!bus_nump[id])
|
||||
return 0;
|
||||
|
||||
if (bus_nump[id] < BUS_PARAM_REQUIRED) {
|
||||
printk(KERN_ERR PFX "not enough parameters for bus%d\n", id);
|
||||
err = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
pdev = platform_device_alloc("w1-gpio", params[BUS_PARAM_ID]);
|
||||
if (!pdev) {
|
||||
err = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
|
||||
pdata.pin = params[BUS_PARAM_PIN];
|
||||
pdata.is_open_drain = params[BUS_PARAM_OD] ? 1 : 0;
|
||||
pdata.enable_external_pullup = NULL;
|
||||
pdata.ext_pullup_enable_pin = -EINVAL;
|
||||
|
||||
err = platform_device_add_data(pdev, &pdata, sizeof(pdata));
|
||||
if (err)
|
||||
goto err_put;
|
||||
|
||||
err = platform_device_add(pdev);
|
||||
if (err)
|
||||
goto err_put;
|
||||
|
||||
devices[nr_devices++] = pdev;
|
||||
return 0;
|
||||
|
||||
err_put:
|
||||
platform_device_put(pdev);
|
||||
err:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __init w1_gpio_custom_probe(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
nr_devices = 0;
|
||||
printk(KERN_INFO DRV_DESC " version " DRV_VERSION "\n");
|
||||
|
||||
err = w1_gpio_custom_add_one(0, bus0);
|
||||
if (err)
|
||||
goto err;
|
||||
|
||||
err = w1_gpio_custom_add_one(1, bus1);
|
||||
if (err)
|
||||
goto err;
|
||||
|
||||
err = w1_gpio_custom_add_one(2, bus2);
|
||||
if (err)
|
||||
goto err;
|
||||
|
||||
err = w1_gpio_custom_add_one(3, bus3);
|
||||
if (err)
|
||||
goto err;
|
||||
|
||||
if (!nr_devices) {
|
||||
printk(KERN_ERR PFX "no bus parameter(s) specified\n");
|
||||
err = -ENODEV;
|
||||
goto err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
w1_gpio_custom_cleanup();
|
||||
return err;
|
||||
}
|
||||
|
||||
#ifdef MODULE
|
||||
static int __init w1_gpio_custom_init(void)
|
||||
{
|
||||
return w1_gpio_custom_probe();
|
||||
}
|
||||
module_init(w1_gpio_custom_init);
|
||||
|
||||
static void __exit w1_gpio_custom_exit(void)
|
||||
{
|
||||
w1_gpio_custom_cleanup();
|
||||
}
|
||||
module_exit(w1_gpio_custom_exit);
|
||||
#else
|
||||
subsys_initcall(w1_gpio_custom_probe);
|
||||
#endif /* MODULE*/
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_AUTHOR("Bifferos <bifferos at yahoo.co.uk >");
|
||||
MODULE_DESCRIPTION(DRV_DESC);
|
||||
MODULE_VERSION(DRV_VERSION);
|
@ -14,6 +14,7 @@ PKG_SOURCE:=$(PKG_SOURCE_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=http://people.redhat.com/sgrubb/audit
|
||||
PKG_HASH:=0e5d4103646e00f8d1981e1cd2faea7a2ae28e854c31a803e907a383c5e2ecb7
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_NAME)-$(PKG_VERSION)
|
||||
HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/$(PKG_SOURCE_NAME)-$(PKG_VERSION)
|
||||
PKG_MAINTAINER:=Thomas Petazzoni <thomas.petazzoni@bootlin.com>
|
||||
PKG_LICENSE:=GPL-2.0
|
||||
PKG_LICENSE_FILES:=COPYING
|
||||
@ -50,28 +51,42 @@ CONFIGURE_ARGS += \
|
||||
--without-python3 \
|
||||
--disable-zos-remote
|
||||
|
||||
HOST_CONFIGURE_ARGS += \
|
||||
--without-python \
|
||||
--without-python3 \
|
||||
--disable-zos-remote \
|
||||
--without-libcap-ng
|
||||
|
||||
ifeq ($(ARCH),aarch64)
|
||||
CONFIGURE_ARGS += --with-aarch64
|
||||
else ifeq ($(ARCH),arm)
|
||||
CONFIGURE_ARGS += --with-arm
|
||||
endif
|
||||
|
||||
HOST_CONFIGURE_ARGS += \
|
||||
--without-libcap-ng \
|
||||
--disable-systemd \
|
||||
--without-python \
|
||||
--without-python3 \
|
||||
--disable-zos-remote
|
||||
|
||||
MAKE_PATH:=lib
|
||||
|
||||
# Host/Compile/default doesn't include $(MAKE_PATH), override to use,
|
||||
# so we avoid building and installing unnecessary parts on the host.
|
||||
define Host/Compile
|
||||
+$(HOST_MAKE_VARS) $(MAKE) $(HOST_JOBS) -C $(HOST_BUILD_DIR)/$(MAKE_PATH) $(HOST_MAKE_FLAGS) all
|
||||
endef
|
||||
|
||||
define Host/Install
|
||||
+$(HOST_MAKE_VARS) $(MAKE) $(HOST_JOBS) -C $(HOST_BUILD_DIR)/lib $(HOST_MAKE_FLAGS) install
|
||||
+$(HOST_MAKE_VARS) $(MAKE) $(HOST_JOBS) -C $(HOST_BUILD_DIR)/init.d $(HOST_MAKE_FLAGS) install
|
||||
endef
|
||||
|
||||
# We can't use the default, as the default passes $(MAKE_ARGS), which
|
||||
# overrides CC, CFLAGS, etc. and defeats the *_FOR_BUILD definitions
|
||||
# passed in CONFIGURE_VARS
|
||||
define Build/Compile
|
||||
$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)/$(MAKE_PATH)/lib
|
||||
$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)/$(MAKE_PATH)
|
||||
endef
|
||||
|
||||
define Build/Install
|
||||
$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)/$(MAKE_PATH)/lib $(MAKE_INSTALL_FLAGS) install
|
||||
$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)/$(MAKE_PATH)/init.d $(MAKE_INSTALL_FLAGS) install
|
||||
$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)/lib $(MAKE_INSTALL_FLAGS) install
|
||||
$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)/init.d $(MAKE_INSTALL_FLAGS) install
|
||||
endef
|
||||
|
||||
define Build/InstallDev
|
||||
@ -90,4 +105,5 @@ define Package/libaudit/install
|
||||
$(CP) $(PKG_INSTALL_DIR)/etc/libaudit.conf $(1)/etc/
|
||||
endef
|
||||
|
||||
$(eval $(call HostBuild))
|
||||
$(eval $(call BuildPackage,libaudit))
|
||||
|
@ -18,7 +18,7 @@ PKG_LICENSE_FILES:=COPYING
|
||||
PKG_CPE_ID:=cpe:/a:selinuxproject:libsemanage
|
||||
|
||||
|
||||
HOST_BUILD_DEPENDS:=audit/host libselinux/host bzip2/host
|
||||
HOST_BUILD_DEPENDS:=libaudit/host libselinux/host bzip2/host
|
||||
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
@ -8,13 +8,13 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=mbedtls
|
||||
PKG_VERSION:=2.16.7
|
||||
PKG_VERSION:=2.16.8
|
||||
PKG_RELEASE:=1
|
||||
PKG_USE_MIPS16:=0
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://codeload.github.com/ARMmbed/mbedtls/tar.gz/v$(PKG_VERSION)?
|
||||
PKG_HASH:=c95b11557ee97d2bdfd48cd57cf9b648a6cddd2ca879e3c35c4e7525f2871992
|
||||
PKG_HASH:=fe9e3b15c3375943bdfebbbb20dd6b4f1147b3b5d926248bd835d73247407430
|
||||
|
||||
PKG_BUILD_PARALLEL:=1
|
||||
PKG_LICENSE:=GPL-2.0-or-later
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/include/mbedtls/config.h
|
||||
+++ b/include/mbedtls/config.h
|
||||
@@ -658,14 +658,14 @@
|
||||
@@ -692,14 +692,14 @@
|
||||
*
|
||||
* Enable Output Feedback mode (OFB) for symmetric ciphers.
|
||||
*/
|
||||
@ -17,7 +17,7 @@
|
||||
|
||||
/**
|
||||
* \def MBEDTLS_CIPHER_NULL_CIPHER
|
||||
@@ -782,19 +782,19 @@
|
||||
@@ -816,19 +816,19 @@
|
||||
*
|
||||
* Comment macros to disable the curve and functions for it
|
||||
*/
|
||||
@ -46,7 +46,7 @@
|
||||
|
||||
/**
|
||||
* \def MBEDTLS_ECP_NIST_OPTIM
|
||||
@@ -918,7 +918,7 @@
|
||||
@@ -952,7 +952,7 @@
|
||||
* See dhm.h for more details.
|
||||
*
|
||||
*/
|
||||
@ -55,7 +55,7 @@
|
||||
|
||||
/**
|
||||
* \def MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED
|
||||
@@ -938,7 +938,7 @@
|
||||
@@ -972,7 +972,7 @@
|
||||
* MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA
|
||||
* MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA
|
||||
*/
|
||||
@ -64,7 +64,7 @@
|
||||
|
||||
/**
|
||||
* \def MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED
|
||||
@@ -963,7 +963,7 @@
|
||||
@@ -997,7 +997,7 @@
|
||||
* MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA
|
||||
* MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA
|
||||
*/
|
||||
@ -73,7 +73,7 @@
|
||||
|
||||
/**
|
||||
* \def MBEDTLS_KEY_EXCHANGE_RSA_ENABLED
|
||||
@@ -1097,7 +1097,7 @@
|
||||
@@ -1131,7 +1131,7 @@
|
||||
* MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256
|
||||
* MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384
|
||||
*/
|
||||
@ -82,7 +82,7 @@
|
||||
|
||||
/**
|
||||
* \def MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED
|
||||
@@ -1121,7 +1121,7 @@
|
||||
@@ -1155,7 +1155,7 @@
|
||||
* MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256
|
||||
* MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384
|
||||
*/
|
||||
@ -91,7 +91,7 @@
|
||||
|
||||
/**
|
||||
* \def MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED
|
||||
@@ -1225,7 +1225,7 @@
|
||||
@@ -1259,7 +1259,7 @@
|
||||
* This option is only useful if both MBEDTLS_SHA256_C and
|
||||
* MBEDTLS_SHA512_C are defined. Otherwise the available hash module is used.
|
||||
*/
|
||||
@ -100,7 +100,7 @@
|
||||
|
||||
/**
|
||||
* \def MBEDTLS_ENTROPY_NV_SEED
|
||||
@@ -1320,14 +1320,14 @@
|
||||
@@ -1354,14 +1354,14 @@
|
||||
* Uncomment this macro to disable the use of CRT in RSA.
|
||||
*
|
||||
*/
|
||||
@ -117,7 +117,7 @@
|
||||
|
||||
/**
|
||||
* \def MBEDTLS_SHA256_SMALLER
|
||||
@@ -1481,7 +1481,7 @@
|
||||
@@ -1515,7 +1515,7 @@
|
||||
* configuration of this extension).
|
||||
*
|
||||
*/
|
||||
@ -126,7 +126,7 @@
|
||||
|
||||
/**
|
||||
* \def MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO
|
||||
@@ -1656,7 +1656,7 @@
|
||||
@@ -1690,7 +1690,7 @@
|
||||
*
|
||||
* Comment this macro to disable support for SSL session tickets
|
||||
*/
|
||||
@ -135,7 +135,7 @@
|
||||
|
||||
/**
|
||||
* \def MBEDTLS_SSL_EXPORT_KEYS
|
||||
@@ -1686,7 +1686,7 @@
|
||||
@@ -1720,7 +1720,7 @@
|
||||
*
|
||||
* Comment this macro to disable support for truncated HMAC in SSL
|
||||
*/
|
||||
@ -144,7 +144,7 @@
|
||||
|
||||
/**
|
||||
* \def MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT
|
||||
@@ -1745,7 +1745,7 @@
|
||||
@@ -1779,7 +1779,7 @@
|
||||
*
|
||||
* Comment this to disable run-time checking and save ROM space
|
||||
*/
|
||||
@ -153,7 +153,7 @@
|
||||
|
||||
/**
|
||||
* \def MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3
|
||||
@@ -2075,7 +2075,7 @@
|
||||
@@ -2109,7 +2109,7 @@
|
||||
* MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256
|
||||
* MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256
|
||||
*/
|
||||
@ -162,7 +162,7 @@
|
||||
|
||||
/**
|
||||
* \def MBEDTLS_ARIA_C
|
||||
@@ -2141,7 +2141,7 @@
|
||||
@@ -2175,7 +2175,7 @@
|
||||
* This module enables the AES-CCM ciphersuites, if other requisites are
|
||||
* enabled as well.
|
||||
*/
|
||||
@ -171,7 +171,7 @@
|
||||
|
||||
/**
|
||||
* \def MBEDTLS_CERTS_C
|
||||
@@ -2153,7 +2153,7 @@
|
||||
@@ -2187,7 +2187,7 @@
|
||||
*
|
||||
* This module is used for testing (ssl_client/server).
|
||||
*/
|
||||
@ -180,7 +180,7 @@
|
||||
|
||||
/**
|
||||
* \def MBEDTLS_CHACHA20_C
|
||||
@@ -2261,7 +2261,7 @@
|
||||
@@ -2295,7 +2295,7 @@
|
||||
* \warning DES is considered a weak cipher and its use constitutes a
|
||||
* security risk. We recommend considering stronger ciphers instead.
|
||||
*/
|
||||
@ -189,7 +189,7 @@
|
||||
|
||||
/**
|
||||
* \def MBEDTLS_DHM_C
|
||||
@@ -2424,7 +2424,7 @@
|
||||
@@ -2458,7 +2458,7 @@
|
||||
* This module adds support for the Hashed Message Authentication Code
|
||||
* (HMAC)-based key derivation function (HKDF).
|
||||
*/
|
||||
@ -198,7 +198,7 @@
|
||||
|
||||
/**
|
||||
* \def MBEDTLS_HMAC_DRBG_C
|
||||
@@ -2734,7 +2734,7 @@
|
||||
@@ -2768,7 +2768,7 @@
|
||||
*
|
||||
* This module enables abstraction of common (libc) functions.
|
||||
*/
|
||||
@ -207,7 +207,7 @@
|
||||
|
||||
/**
|
||||
* \def MBEDTLS_POLY1305_C
|
||||
@@ -2755,7 +2755,7 @@
|
||||
@@ -2789,7 +2789,7 @@
|
||||
* Caller: library/md.c
|
||||
*
|
||||
*/
|
||||
@ -216,7 +216,7 @@
|
||||
|
||||
/**
|
||||
* \def MBEDTLS_RSA_C
|
||||
@@ -2862,7 +2862,7 @@
|
||||
@@ -2896,7 +2896,7 @@
|
||||
*
|
||||
* Requires: MBEDTLS_CIPHER_C
|
||||
*/
|
||||
@ -225,7 +225,7 @@
|
||||
|
||||
/**
|
||||
* \def MBEDTLS_SSL_CLI_C
|
||||
@@ -2962,7 +2962,7 @@
|
||||
@@ -2996,7 +2996,7 @@
|
||||
*
|
||||
* This module provides run-time version information.
|
||||
*/
|
||||
@ -234,7 +234,7 @@
|
||||
|
||||
/**
|
||||
* \def MBEDTLS_X509_USE_C
|
||||
@@ -3072,7 +3072,7 @@
|
||||
@@ -3106,7 +3106,7 @@
|
||||
* Module: library/xtea.c
|
||||
* Caller:
|
||||
*/
|
||||
|
@ -68,6 +68,9 @@ CONFIG_VARIANT:=$(LOCAL_VARIANT)
|
||||
ifeq ($(LOCAL_VARIANT),mesh)
|
||||
CONFIG_VARIANT:=full
|
||||
endif
|
||||
ifeq ($(LOCAL_VARIANT),hs20)
|
||||
CONFIG_VARIANT:=full
|
||||
endif
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
@ -108,6 +111,10 @@ ifeq ($(SSL_VARIANT),openssl)
|
||||
ifeq ($(LOCAL_VARIANT),full)
|
||||
DRIVER_MAKEOPTS += CONFIG_OWE=y CONFIG_SUITEB192=y CONFIG_AP=y CONFIG_MESH=y
|
||||
endif
|
||||
ifeq ($(LOCAL_VARIANT),hs20)
|
||||
DRIVER_MAKEOPTS += CONFIG_OWE=y CONFIG_SUITEB192=y CONFIG_AP=y CONFIG_MESH=y CONFIG_DPP=y CONFIG_HS20=y CONFIG_INTERWORKING=y
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
ifeq ($(SSL_VARIANT),wolfssl)
|
||||
@ -168,6 +175,15 @@ endef
|
||||
|
||||
Package/hostapd-openssl/description = $(Package/hostapd/description)
|
||||
|
||||
define Package/hostapd-hs20
|
||||
$(call Package/hostapd/Default,$(1))
|
||||
TITLE+= (OpenSSL with Hotspot 2.0)
|
||||
VARIANT:=hs20-openssl
|
||||
DEPENDS+=+libopenssl
|
||||
endef
|
||||
|
||||
Package/hostapd-hs20/description = $(Package/hostapd/description)
|
||||
|
||||
define Package/hostapd-wolfssl
|
||||
$(call Package/hostapd/Default,$(1))
|
||||
TITLE+= (wolfSSL full)
|
||||
@ -453,7 +469,9 @@ define Build/Configure
|
||||
$(if $(wildcard ./files/hostapd-$(CONFIG_VARIANT).config), \
|
||||
$(CP) ./files/hostapd-$(CONFIG_VARIANT).config $(PKG_BUILD_DIR)/hostapd/.config \
|
||||
)
|
||||
$(CP) ./files/wpa_supplicant-$(CONFIG_VARIANT).config $(PKG_BUILD_DIR)/wpa_supplicant/.config
|
||||
$(if $(wildcard ./files/wpa_supplicant-$(CONFIG_VARIANT).config), \
|
||||
$(CP) ./files/wpa_supplicant-$(CONFIG_VARIANT).config $(PKG_BUILD_DIR)/wpa_supplicant/.config
|
||||
)
|
||||
endef
|
||||
|
||||
TARGET_CPPFLAGS := \
|
||||
@ -567,6 +585,7 @@ define Package/hostapd/install
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/hostapd/hostapd $(1)/usr/sbin/
|
||||
endef
|
||||
Package/hostapd-basic/install = $(Package/hostapd/install)
|
||||
Package/hostapd-hs20/install = $(Package/hostapd/install)
|
||||
Package/hostapd-mini/install = $(Package/hostapd/install)
|
||||
Package/hostapd-openssl/install = $(Package/hostapd/install)
|
||||
Package/hostapd-wolfssl/install = $(Package/hostapd/install)
|
||||
@ -635,6 +654,7 @@ endif
|
||||
|
||||
$(eval $(call BuildPackage,hostapd))
|
||||
$(eval $(call BuildPackage,hostapd-basic))
|
||||
$(eval $(call BuildPackage,hostapd-hs20))
|
||||
$(eval $(call BuildPackage,hostapd-mini))
|
||||
$(eval $(call BuildPackage,hostapd-openssl))
|
||||
$(eval $(call BuildPackage,hostapd-wolfssl))
|
||||
|
@ -12,9 +12,9 @@ PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_URL=$(PROJECT_GIT)/project/fstools.git
|
||||
PKG_MIRROR_HASH:=7ff4fae22bf518db200f0c4dd73bc32970678e39e3acc6e8dc98b65319c379cd
|
||||
PKG_SOURCE_DATE:=2020-06-17
|
||||
PKG_SOURCE_VERSION:=d34ea8eb1e12259a315cdef7aa0cd3ceaea68e00
|
||||
PKG_MIRROR_HASH:=04cc533f567e8a928a1c13dedcad781e73dfc796db8e83ac1218b47412ce01bd
|
||||
PKG_SOURCE_DATE:=2020-07-11
|
||||
PKG_SOURCE_VERSION:=5345343828df944ae247d91cc77182f87559bc9a
|
||||
CMAKE_INSTALL:=1
|
||||
|
||||
PKG_LICENSE:=GPL-2.0
|
||||
|
@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=refpolicy
|
||||
PKG_VERSION:=2.20200229
|
||||
PKG_RELEASE:=1
|
||||
PKG_RELEASE:=2
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
|
||||
PKG_SOURCE_URL:=https://github.com/SELinuxProject/refpolicy/releases/download/RELEASE_2_20200229
|
||||
|
12
package/system/refpolicy/patches/100-no-docs.patch
Normal file
12
package/system/refpolicy/patches/100-no-docs.patch
Normal file
@ -0,0 +1,12 @@
|
||||
Index: refpolicy-2.20200229/Makefile
|
||||
===================================================================
|
||||
--- refpolicy-2.20200229.orig/Makefile
|
||||
+++ refpolicy-2.20200229/Makefile
|
||||
@@ -648,6 +648,6 @@ ifneq ($(generated_fc),)
|
||||
endif
|
||||
endif
|
||||
|
||||
-.PHONY: install-src install-appconfig install-headers generate xml conf html bare tags
|
||||
+.PHONY: install-src install-appconfig install-headers generate conf bare tags
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .c
|
@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=policycoreutils
|
||||
PKG_VERSION:=3.1
|
||||
PKG_RELEASE:=1
|
||||
PKG_RELEASE:=2
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://github.com/SELinuxProject/selinux/releases/download/20200710
|
||||
@ -22,6 +22,7 @@ PKG_LICENSE:=GPL-2.0-or-later
|
||||
PKG_LICENSE_FILES:=COPYING
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
include $(INCLUDE_DIR)/nls.mk
|
||||
|
||||
define Package/policycoreutils
|
||||
SECTION:=utils
|
||||
|
@ -12,9 +12,9 @@ PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE_URL=$(PROJECT_GIT)/project/ugps.git
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_DATE:=2020-05-29
|
||||
PKG_SOURCE_VERSION:=0c54380e3d8920100fcfd41f0a1fe9872eb37d0e
|
||||
PKG_MIRROR_HASH:=cf7e5af73f9feabf643f988c040fd3783dc44c6f4b1ecada0957d4ee3d67c14e
|
||||
PKG_SOURCE_DATE:=2020-08-29
|
||||
PKG_SOURCE_VERSION:=511a5b3c84fa715ef0305cf26c98619c12a4867a
|
||||
PKG_MIRROR_HASH:=551d57b4c18da4c4695fa2f7a959c25a03be35d14cf872785e7db740f12366e2
|
||||
|
||||
PKG_MAINTAINER:=John Crispin <john@phrozen.org>
|
||||
PKG_LICENSE:=GPL-2.0+
|
||||
|
8
rules.mk
8
rules.mk
@ -264,7 +264,13 @@ endif
|
||||
|
||||
BUILD_KEY=$(TOPDIR)/key-build
|
||||
|
||||
FAKEROOT:=$(STAGING_DIR_HOST)/bin/fakeroot -l $(STAGING_DIR_HOST)/lib/libfakeroot.so -f $(STAGING_DIR_HOST)/bin/faked
|
||||
ifeq ($(HOST_OS),Darwin)
|
||||
FAKEROOT_SO:=$(STAGING_DIR_HOST)/lib/libfakeroot.dylib
|
||||
else
|
||||
FAKEROOT_SO:=$(STAGING_DIR_HOST)/lib/libfakeroot.so
|
||||
endif
|
||||
FAKEROOT:=$(STAGING_DIR_HOST)/bin/fakeroot -l $(FAKEROOT_SO) -f $(STAGING_DIR_HOST)/bin/faked
|
||||
|
||||
TARGET_CC:=$(TARGET_CROSS)gcc
|
||||
TARGET_CXX:=$(TARGET_CROSS)g++
|
||||
KPATCH:=$(SCRIPT_DIR)/patch-kernel.sh
|
||||
|
@ -1,200 +0,0 @@
|
||||
# CONFIG_16KSTACKS is not set
|
||||
CONFIG_ARC=y
|
||||
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
||||
# CONFIG_ARCH_HAS_GCOV_PROFILE_ALL is not set
|
||||
CONFIG_ARCH_HAS_SG_CHAIN=y
|
||||
# CONFIG_ARCH_HAS_STRICT_KERNEL_RWX is not set
|
||||
# CONFIG_ARCH_HAS_STRICT_MODULE_RWX is not set
|
||||
# CONFIG_ARCH_OPTIONAL_KERNEL_RWX is not set
|
||||
# CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT is not set
|
||||
CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
|
||||
# CONFIG_ARCH_WANTS_THP_SWAP is not set
|
||||
CONFIG_ARC_BUILTIN_DTB_NAME=""
|
||||
CONFIG_ARC_CACHE=y
|
||||
CONFIG_ARC_CACHE_LINE_SHIFT=5
|
||||
CONFIG_ARC_CACHE_PAGES=y
|
||||
# CONFIG_ARC_CACHE_VIPT_ALIASING is not set
|
||||
# CONFIG_ARC_CANT_LLSC is not set
|
||||
# CONFIG_ARC_COMPACT_IRQ_LEVELS is not set
|
||||
# CONFIG_ARC_CPU_750D is not set
|
||||
CONFIG_ARC_CPU_770=y
|
||||
CONFIG_ARC_CURR_IN_REG=y
|
||||
CONFIG_ARC_DBG=y
|
||||
# CONFIG_ARC_DBG_TLB_PARANOIA is not set
|
||||
CONFIG_ARC_DW2_UNWIND=y
|
||||
CONFIG_ARC_EMUL_UNALIGNED=y
|
||||
# CONFIG_ARC_FPU_SAVE_RESTORE is not set
|
||||
CONFIG_ARC_HAS_DCACHE=y
|
||||
# CONFIG_ARC_HAS_DCCM is not set
|
||||
CONFIG_ARC_HAS_ICACHE=y
|
||||
# CONFIG_ARC_HAS_ICCM is not set
|
||||
CONFIG_ARC_HAS_LLSC=y
|
||||
CONFIG_ARC_HAS_SWAPE=y
|
||||
CONFIG_ARC_KVADDR_SIZE=256
|
||||
# CONFIG_ARC_METAWARE_HLINK is not set
|
||||
# CONFIG_ARC_MMU_V1 is not set
|
||||
# CONFIG_ARC_MMU_V2 is not set
|
||||
CONFIG_ARC_MMU_V3=y
|
||||
# CONFIG_ARC_PAGE_SIZE_16K is not set
|
||||
# CONFIG_ARC_PAGE_SIZE_4K is not set
|
||||
CONFIG_ARC_PAGE_SIZE_8K=y
|
||||
CONFIG_ARC_PLAT_AXS10X=y
|
||||
# CONFIG_ARC_PLAT_EZNPS is not set
|
||||
# CONFIG_ARC_PLAT_TB10X is not set
|
||||
# CONFIG_ARC_SOC_HSDK is not set
|
||||
CONFIG_ARC_TIMERS=y
|
||||
CONFIG_ARC_UBOOT_SUPPORT=y
|
||||
CONFIG_AXS101=y
|
||||
CONFIG_CLKDEV_LOOKUP=y
|
||||
CONFIG_CLONE_BACKWARDS=y
|
||||
CONFIG_COMMON_CLK=y
|
||||
# CONFIG_CPU_BIG_ENDIAN is not set
|
||||
CONFIG_CPU_NO_EFFICIENT_FFS=y
|
||||
CONFIG_CRC16=y
|
||||
CONFIG_CRYPTO_CRC32C=y
|
||||
CONFIG_CRYPTO_HASH=y
|
||||
CONFIG_CRYPTO_HASH2=y
|
||||
CONFIG_CRYPTO_RNG2=y
|
||||
CONFIG_CRYPTO_WORKQUEUE=y
|
||||
# CONFIG_DMA_NOOP_OPS is not set
|
||||
# CONFIG_DMA_VIRT_OPS is not set
|
||||
# CONFIG_DRM_LIB_RANDOM is not set
|
||||
CONFIG_DTC=y
|
||||
CONFIG_DWMAC_ANARION=y
|
||||
# CONFIG_DWMAC_DWC_QOS_ETH is not set
|
||||
CONFIG_DWMAC_GENERIC=y
|
||||
CONFIG_DW_APB_ICTL=y
|
||||
CONFIG_EXPORTFS=y
|
||||
CONFIG_EXT4_FS=y
|
||||
# CONFIG_EZNPS_GIC is not set
|
||||
CONFIG_FIXED_PHY=y
|
||||
CONFIG_FS_MBCACHE=y
|
||||
CONFIG_FUTEX_PI=y
|
||||
CONFIG_GENERIC_ATOMIC64=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_CSUM=y
|
||||
CONFIG_GENERIC_FIND_FIRST_BIT=y
|
||||
CONFIG_GENERIC_IO=y
|
||||
CONFIG_GENERIC_IRQ_CHIP=y
|
||||
CONFIG_GENERIC_IRQ_SHOW=y
|
||||
CONFIG_GENERIC_PCI_IOMAP=y
|
||||
CONFIG_GENERIC_SMP_IDLE_THREAD=y
|
||||
CONFIG_GPIOLIB=y
|
||||
CONFIG_GPIO_DWAPB=y
|
||||
CONFIG_GPIO_GENERIC=y
|
||||
# CONFIG_GRO_CELLS is not set
|
||||
CONFIG_HANDLE_DOMAIN_IRQ=y
|
||||
CONFIG_HAS_DMA=y
|
||||
CONFIG_HAS_IOMEM=y
|
||||
# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set
|
||||
# CONFIG_HAVE_ARCH_BITREVERSE is not set
|
||||
CONFIG_HAVE_ARCH_KGDB=y
|
||||
CONFIG_HAVE_ARCH_TRACEHOOK=y
|
||||
# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
|
||||
CONFIG_HAVE_CLK=y
|
||||
CONFIG_HAVE_CLK_PREPARE=y
|
||||
CONFIG_HAVE_DEBUG_STACKOVERFLOW=y
|
||||
CONFIG_HAVE_FUTEX_CMPXCHG=y
|
||||
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
|
||||
CONFIG_HAVE_IOREMAP_PROT=y
|
||||
CONFIG_HAVE_MEMBLOCK=y
|
||||
CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
|
||||
CONFIG_HAVE_NET_DSA=y
|
||||
CONFIG_HAVE_OPROFILE=y
|
||||
CONFIG_HAVE_PERF_EVENTS=y
|
||||
CONFIG_HZ_PERIODIC=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_IRQCHIP=y
|
||||
CONFIG_IRQ_DOMAIN=y
|
||||
CONFIG_IRQ_WORK=y
|
||||
CONFIG_ISA_ARCOMPACT=y
|
||||
# CONFIG_ISA_ARCV2 is not set
|
||||
CONFIG_JBD2=y
|
||||
CONFIG_KALLSYMS=y
|
||||
CONFIG_KERNEL_GZIP=y
|
||||
CONFIG_LIBFDT=y
|
||||
CONFIG_LINUX_LINK_BASE=0x80000000
|
||||
CONFIG_LINUX_RAM_BASE=0x80000000
|
||||
CONFIG_MDIO_BUS=y
|
||||
CONFIG_MDIO_DEVICE=y
|
||||
CONFIG_MFD_SYSCON=y
|
||||
CONFIG_MIGHT_HAVE_PCI=y
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_BLOCK=y
|
||||
CONFIG_MMC_DW=y
|
||||
# CONFIG_MMC_DW_EXYNOS is not set
|
||||
# CONFIG_MMC_DW_K3 is not set
|
||||
CONFIG_MMC_DW_PLTFM=y
|
||||
CONFIG_MMC_SDHCI=y
|
||||
CONFIG_MMC_SDHCI_PLTFM=y
|
||||
CONFIG_MODULES_USE_ELF_RELA=y
|
||||
CONFIG_NATIONAL_PHY=y
|
||||
CONFIG_NEED_PER_CPU_KM=y
|
||||
# CONFIG_NET_CADENCE is not set
|
||||
CONFIG_NET_PTP_CLASSIFY=y
|
||||
# CONFIG_NET_VENDOR_ARC is not set
|
||||
# CONFIG_NET_VENDOR_BROADCOM is not set
|
||||
# CONFIG_NET_VENDOR_INTEL is not set
|
||||
# CONFIG_NET_VENDOR_MARVELL is not set
|
||||
# CONFIG_NET_VENDOR_MICREL is not set
|
||||
# CONFIG_NET_VENDOR_NATSEMI is not set
|
||||
# CONFIG_NET_VENDOR_QUALCOMM is not set
|
||||
# CONFIG_NET_VENDOR_ROCKER is not set
|
||||
# CONFIG_NET_VENDOR_SAMSUNG is not set
|
||||
# CONFIG_NET_VENDOR_SEEQ is not set
|
||||
# CONFIG_NET_VENDOR_VIA is not set
|
||||
# CONFIG_NET_VENDOR_WIZNET is not set
|
||||
CONFIG_NO_BOOTMEM=y
|
||||
CONFIG_NO_IOPORT_MAP=y
|
||||
CONFIG_OF=y
|
||||
CONFIG_OF_ADDRESS=y
|
||||
CONFIG_OF_EARLY_FLATTREE=y
|
||||
CONFIG_OF_FLATTREE=y
|
||||
CONFIG_OF_GPIO=y
|
||||
CONFIG_OF_IRQ=y
|
||||
CONFIG_OF_MDIO=y
|
||||
CONFIG_OF_NET=y
|
||||
CONFIG_OF_RESERVED_MEM=y
|
||||
# CONFIG_PCI_SYSCALL is not set
|
||||
CONFIG_PERF_USE_VMALLOC=y
|
||||
CONFIG_PGTABLE_LEVELS=2
|
||||
CONFIG_PHYLIB=y
|
||||
CONFIG_PPS=y
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_PREEMPT_COUNT=y
|
||||
# CONFIG_PREEMPT_NONE is not set
|
||||
CONFIG_PREEMPT_RCU=y
|
||||
CONFIG_PTP_1588_CLOCK=y
|
||||
CONFIG_RATIONAL=y
|
||||
# CONFIG_RCU_BOOST is not set
|
||||
CONFIG_RCU_NEED_SEGCBLIST=y
|
||||
CONFIG_RCU_STALL_COMMON=y
|
||||
CONFIG_REGMAP=y
|
||||
CONFIG_REGMAP_MMIO=y
|
||||
CONFIG_RESET_CONTROLLER=y
|
||||
# CONFIG_SCHED_INFO is not set
|
||||
# CONFIG_SCSI_DMA is not set
|
||||
CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y
|
||||
CONFIG_SERIAL_8250_DW=y
|
||||
# CONFIG_SERIAL_8250_FSL is not set
|
||||
CONFIG_SERIAL_8250_NR_UARTS=4
|
||||
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
|
||||
CONFIG_SERIAL_ARC=y
|
||||
CONFIG_SERIAL_ARC_CONSOLE=y
|
||||
CONFIG_SERIAL_ARC_NR_PORTS=1
|
||||
CONFIG_SERIAL_OF_PLATFORM=y
|
||||
CONFIG_SRCU=y
|
||||
CONFIG_STACKTRACE=y
|
||||
CONFIG_STMMAC_ETH=y
|
||||
CONFIG_STMMAC_PLATFORM=y
|
||||
CONFIG_SWPHY=y
|
||||
CONFIG_SYSCTL_ARCH_UNALIGN_ALLOW=y
|
||||
CONFIG_SYSCTL_ARCH_UNALIGN_NO_WARN=y
|
||||
CONFIG_TASKS_RCU=y
|
||||
CONFIG_THIN_ARCHIVES=y
|
||||
CONFIG_TICK_CPU_ACCOUNTING=y
|
||||
CONFIG_TIMER_OF=y
|
||||
CONFIG_TIMER_PROBE=y
|
||||
CONFIG_TREE_SRCU=y
|
||||
CONFIG_UNINLINE_SPIN_UNLOCK=y
|
||||
CONFIG_USB_SUPPORT=y
|
@ -1,31 +0,0 @@
|
||||
From 0031b9011cb2b2b1de4dbb4f9620303aec760db4 Mon Sep 17 00:00:00 2001
|
||||
From: Alexey Brodkin <abrodkin@synopsys.com>
|
||||
Date: Wed, 27 Jul 2016 11:33:14 +0300
|
||||
Subject: [PATCH] stmmac: Disable frame filtering completely
|
||||
|
||||
For some [still unknown] reason in ARC SDP boards
|
||||
DW GMAC doesn't enter promiscuous mode if eth0 gets
|
||||
added to the br-lan interface before Ethernet PHY finishes
|
||||
autonegotiation (PHY gets reset on DW GMAC start).
|
||||
|
||||
As a work-around we completely disable frame filtering
|
||||
in GMAC hardware which gives us working bridge that consists
|
||||
of eth0 and wlan0 (USB Wi-Fi dongle). I.e. we finally have
|
||||
working "Dumb AP" setup made of ARC AXS10x boards.
|
||||
|
||||
Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
|
||||
---
|
||||
drivers/net/ethernet/stmicro/stmmac/common.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/ethernet/stmicro/stmmac/common.h
|
||||
+++ b/drivers/net/ethernet/stmicro/stmmac/common.h
|
||||
@@ -46,7 +46,7 @@
|
||||
#define STMMAC_GET_ENTRY(x, size) ((x + 1) & (size - 1))
|
||||
|
||||
#undef FRAME_FILTER_DEBUG
|
||||
-/* #define FRAME_FILTER_DEBUG */
|
||||
+#define FRAME_FILTER_DEBUG
|
||||
|
||||
/* Extra statistic and debug information exposed by ethtool */
|
||||
struct stmmac_extra_stats {
|
@ -1,24 +0,0 @@
|
||||
#
|
||||
# Copyright (C) 2006-2013 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
ARCH:=mips
|
||||
BOARD:=ath25
|
||||
BOARDNAME:=Atheros AR231x/AR5312
|
||||
FEATURES:=squashfs low_mem small_flash
|
||||
|
||||
KERNEL_PATCHVER:=4.14
|
||||
|
||||
define Target/Description
|
||||
Build firmware images for Atheros SoC boards
|
||||
endef
|
||||
|
||||
include $(INCLUDE_DIR)/target.mk
|
||||
|
||||
DEFAULT_PACKAGES += wpad-basic-wolfssl kmod-ath5k swconfig kmod-gpio-button-hotplug
|
||||
|
||||
$(eval $(call BuildTarget))
|
@ -1,13 +0,0 @@
|
||||
#!/bin/sh
|
||||
# Copyright 2012-2015 OpenWrt.org
|
||||
#
|
||||
|
||||
. /lib/functions/uci-defaults.sh
|
||||
|
||||
board_config_update
|
||||
|
||||
ucidef_set_led_netdev "wlan" "wlan" "wlan" "wlan0"
|
||||
|
||||
board_config_flush
|
||||
|
||||
exit 0
|
@ -1,28 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
. /lib/functions/uci-defaults.sh
|
||||
|
||||
board_config_update
|
||||
|
||||
if [ -e "/sys/bus/mdio_bus/drivers/IC+ IP175C/0:00" -o \
|
||||
-e "/sys/bus/mdio_bus/drivers/IC+ IP17xx/0:00" ] && \
|
||||
[ -x /sbin/swconfig ];
|
||||
then
|
||||
ucidef_add_switch "eth0" \
|
||||
"0:lan" "1:lan" "2:lan" "3:lan" "4:wan" "5@eth0"
|
||||
|
||||
elif [ -e "/sys/bus/mdio_bus/drivers/Infineon ADM6996/0:00" -o \
|
||||
-e "/sys/bus/mdio_bus/drivers/Marvell 88E6060/0:10" ];
|
||||
then
|
||||
ucidef_set_interfaces_lan_wan "eth0.1" "eth0.2"
|
||||
|
||||
elif [ -d /sys/class/net/eth1 ]; then
|
||||
ucidef_set_interfaces_lan_wan "eth0" "eth1"
|
||||
|
||||
else
|
||||
ucidef_set_interface_lan "eth0"
|
||||
fi
|
||||
|
||||
board_config_flush
|
||||
|
||||
exit 0
|
@ -1,34 +0,0 @@
|
||||
# reset button only supported on ar5315+ at the moment
|
||||
preinit_ip() {
|
||||
if [ -z "$pi_ifname" ]; then
|
||||
grep -q 'Atheros AR231[567]' /proc/cpuinfo && {
|
||||
if [ -e "/sys/bus/mdio_bus/drivers/Infineon ADM6996/0:00" -o \
|
||||
-e "/sys/bus/mdio_bus/drivers/Marvell 88E6060/0:10" ]; then
|
||||
vconfig set_name_type DEV_PLUS_VID_NO_PAD
|
||||
ip link set eth0 up
|
||||
vconfig add eth0 1
|
||||
ifname=eth0.1
|
||||
else
|
||||
ifname=eth0
|
||||
fi
|
||||
pi_ifname=$ifname
|
||||
}
|
||||
fi
|
||||
[ -n "$pi_ifname" ] && grep -q "$pi_ifname" /proc/net/dev && {
|
||||
ip addr add $pi_ip/$pi_netmask broadcast $pi_broadcast dev $pi_ifname
|
||||
ip link set $pi_ifname up
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# reset button only supported on ar5315+ at the moment
|
||||
|
||||
preinit_ip_deconfig() {
|
||||
if [ -e "/sys/bus/mdio_bus/drivers/Infineon ADM6996/0:00" -o \
|
||||
-e "/sys/bus/mdio_bus/drivers/Marvell 88E6060/0:10" ]; then
|
||||
vconfig rem eth0.1 2>/dev/null
|
||||
ip link set $pi_ifname down
|
||||
elif [ -n "$pi_ifname" ]; then
|
||||
ip -4 addr flush dev $pi_ifname
|
||||
fi
|
||||
}
|
@ -1,76 +0,0 @@
|
||||
CI_BLKSZ=65536
|
||||
CI_LDADR=0x80041000
|
||||
|
||||
platform_find_partitions() {
|
||||
local first dev size erasesize name
|
||||
while read dev size erasesize name; do
|
||||
name=${name#'"'}; name=${name%'"'}
|
||||
case "$name" in
|
||||
vmlinux.bin.l7|kernel|linux|rootfs)
|
||||
if [ -z "$first" ]; then
|
||||
first="$name"
|
||||
else
|
||||
echo "$erasesize:$first:$name"
|
||||
break
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
done < /proc/mtd
|
||||
}
|
||||
|
||||
platform_find_kernelpart() {
|
||||
local part
|
||||
for part in "${1%:*}" "${1#*:}"; do
|
||||
case "$part" in
|
||||
vmlinux.bin.l7|kernel|linux)
|
||||
echo "$part"
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
platform_check_image() {
|
||||
[ "$#" -gt 1 ] && return 1
|
||||
|
||||
case "$(get_magic_word "$1")" in
|
||||
# Combined Image
|
||||
4349)
|
||||
local md5_img=$(dd if="$1" bs=2 skip=9 count=16 2>/dev/null)
|
||||
local md5_chk=$(dd if="$1" bs=$CI_BLKSZ skip=1 2>/dev/null | md5sum -); md5_chk="${md5_chk%% *}"
|
||||
|
||||
if [ -n "$md5_img" -a -n "$md5_chk" ] && [ "$md5_img" = "$md5_chk" ]; then
|
||||
return 0
|
||||
else
|
||||
echo "Invalid image. Contents do not match checksum (image:$md5_img calculated:$md5_chk)"
|
||||
return 1
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
echo "Invalid image. Use combined .img files on this platform"
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
platform_do_upgrade() {
|
||||
local partitions=$(platform_find_partitions)
|
||||
local kernelpart=$(platform_find_kernelpart "${partitions#*:}")
|
||||
local erase_size=$((0x${partitions%%:*})); partitions="${partitions#*:}"
|
||||
local kern_length=0x$(dd if="$1" bs=2 skip=1 count=4 2>/dev/null)
|
||||
local kern_blocks=$(($kern_length / $CI_BLKSZ))
|
||||
local root_blocks=$((0x$(dd if="$1" bs=2 skip=5 count=4 2>/dev/null) / $CI_BLKSZ))
|
||||
|
||||
if [ -n "$partitions" ] && [ -n "$kernelpart" ] && \
|
||||
[ ${kern_blocks:-0} -gt 0 ] && \
|
||||
[ ${root_blocks:-0} -gt ${kern_blocks:-0} ] && \
|
||||
[ ${erase_size:-0} -gt 0 ];
|
||||
then
|
||||
local append=""
|
||||
[ -f "$UPGRADE_BACKUP" ] && append="-j $UPGRADE_BACKUP"
|
||||
|
||||
( dd if="$1" bs=$CI_BLKSZ skip=1 count=$kern_blocks 2>/dev/null; \
|
||||
dd if="$1" bs=$CI_BLKSZ skip=$((1+$kern_blocks)) count=$root_blocks 2>/dev/null ) | \
|
||||
mtd -r $append -F$kernelpart:$kern_length:$CI_LDADR,rootfs write - $partitions
|
||||
fi
|
||||
}
|
@ -1,170 +0,0 @@
|
||||
CONFIG_ADM6996_PHY=y
|
||||
CONFIG_AR2315_WDT=y
|
||||
CONFIG_AR8216_PHY=y
|
||||
CONFIG_ARCH_BINFMT_ELF_STATE=y
|
||||
CONFIG_ARCH_CLOCKSOURCE_DATA=y
|
||||
CONFIG_ARCH_DISCARD_MEMBLOCK=y
|
||||
CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
|
||||
# CONFIG_ARCH_HAS_GCOV_PROFILE_ALL is not set
|
||||
# CONFIG_ARCH_HAS_SG_CHAIN is not set
|
||||
# CONFIG_ARCH_HAS_STRICT_KERNEL_RWX is not set
|
||||
# CONFIG_ARCH_HAS_STRICT_MODULE_RWX is not set
|
||||
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
||||
CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
|
||||
CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y
|
||||
CONFIG_ARCH_MMAP_RND_BITS_MAX=15
|
||||
CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=15
|
||||
# CONFIG_ARCH_OPTIONAL_KERNEL_RWX is not set
|
||||
# CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT is not set
|
||||
CONFIG_ARCH_SUPPORTS_UPROBES=y
|
||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||
CONFIG_ARCH_USE_BUILTIN_BSWAP=y
|
||||
CONFIG_ARCH_USE_QUEUED_RWLOCKS=y
|
||||
CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y
|
||||
CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
|
||||
CONFIG_ATH25=y
|
||||
CONFIG_BLK_MQ_PCI=y
|
||||
CONFIG_CEVT_R4K=y
|
||||
CONFIG_CLONE_BACKWARDS=y
|
||||
CONFIG_CMDLINE="console=ttyS0,9600 rootfstype=squashfs,jffs2"
|
||||
CONFIG_CMDLINE_BOOL=y
|
||||
# CONFIG_CMDLINE_OVERRIDE is not set
|
||||
CONFIG_CPU_BIG_ENDIAN=y
|
||||
CONFIG_CPU_GENERIC_DUMP_TLB=y
|
||||
CONFIG_CPU_HAS_PREFETCH=y
|
||||
CONFIG_CPU_HAS_SYNC=y
|
||||
CONFIG_CPU_MIPS32=y
|
||||
CONFIG_CPU_MIPS32_R1=y
|
||||
CONFIG_CPU_MIPSR1=y
|
||||
CONFIG_CPU_NEEDS_NO_SMARTMIPS_OR_MICROMIPS=y
|
||||
CONFIG_CPU_R4K_CACHE_TLB=y
|
||||
CONFIG_CPU_R4K_FPU=y
|
||||
CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
|
||||
CONFIG_CPU_SUPPORTS_HIGHMEM=y
|
||||
CONFIG_CRYPTO_RNG2=y
|
||||
CONFIG_CRYPTO_WORKQUEUE=y
|
||||
CONFIG_CSRC_R4K=y
|
||||
CONFIG_DMA_NONCOHERENT=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_ETHERNET_PACKET_MANGLE=y
|
||||
CONFIG_GENERIC_ATOMIC64=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_CMOS_UPDATE=y
|
||||
CONFIG_GENERIC_CPU_AUTOPROBE=y
|
||||
CONFIG_GENERIC_IO=y
|
||||
CONFIG_GENERIC_IRQ_CHIP=y
|
||||
CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y
|
||||
CONFIG_GENERIC_IRQ_SHOW=y
|
||||
CONFIG_GENERIC_PCI_IOMAP=y
|
||||
CONFIG_GENERIC_SCHED_CLOCK=y
|
||||
CONFIG_GENERIC_SMP_IDLE_THREAD=y
|
||||
CONFIG_GENERIC_TIME_VSYSCALL=y
|
||||
CONFIG_GPIOLIB=y
|
||||
CONFIG_GPIO_AR2315=y
|
||||
CONFIG_GPIO_AR5312=y
|
||||
# CONFIG_GRO_CELLS is not set
|
||||
CONFIG_HANDLE_DOMAIN_IRQ=y
|
||||
CONFIG_HARDWARE_WATCHPOINTS=y
|
||||
CONFIG_HAS_DMA=y
|
||||
CONFIG_HAS_IOMEM=y
|
||||
CONFIG_HAS_IOPORT_MAP=y
|
||||
# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set
|
||||
# CONFIG_HAVE_ARCH_BITREVERSE is not set
|
||||
CONFIG_HAVE_ARCH_JUMP_LABEL=y
|
||||
CONFIG_HAVE_ARCH_KGDB=y
|
||||
CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
|
||||
CONFIG_HAVE_ARCH_TRACEHOOK=y
|
||||
# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
|
||||
CONFIG_HAVE_CBPF_JIT=y
|
||||
CONFIG_HAVE_CC_STACKPROTECTOR=y
|
||||
CONFIG_HAVE_CONTEXT_TRACKING=y
|
||||
CONFIG_HAVE_COPY_THREAD_TLS=y
|
||||
CONFIG_HAVE_C_RECORDMCOUNT=y
|
||||
CONFIG_HAVE_DEBUG_KMEMLEAK=y
|
||||
CONFIG_HAVE_DEBUG_STACKOVERFLOW=y
|
||||
CONFIG_HAVE_DMA_API_DEBUG=y
|
||||
CONFIG_HAVE_DMA_CONTIGUOUS=y
|
||||
CONFIG_HAVE_DYNAMIC_FTRACE=y
|
||||
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
|
||||
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
|
||||
CONFIG_HAVE_FUNCTION_TRACER=y
|
||||
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
|
||||
CONFIG_HAVE_IDE=y
|
||||
CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y
|
||||
CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
|
||||
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
|
||||
CONFIG_HAVE_MEMBLOCK=y
|
||||
CONFIG_HAVE_MEMBLOCK_NODE_MAP=y
|
||||
CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
|
||||
CONFIG_HAVE_NET_DSA=y
|
||||
CONFIG_HAVE_OPROFILE=y
|
||||
CONFIG_HAVE_PERF_EVENTS=y
|
||||
CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
|
||||
CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
|
||||
CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
|
||||
CONFIG_HW_HAS_PCI=y
|
||||
CONFIG_HW_RANDOM=y
|
||||
CONFIG_HZ_PERIODIC=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_IP17XX_PHY=y
|
||||
CONFIG_IRQ_DOMAIN=y
|
||||
CONFIG_IRQ_FORCED_THREADING=y
|
||||
CONFIG_IRQ_MIPS_CPU=y
|
||||
CONFIG_IRQ_WORK=y
|
||||
CONFIG_LEDS_GPIO=y
|
||||
CONFIG_MDIO_BUS=y
|
||||
CONFIG_MDIO_DEVICE=y
|
||||
CONFIG_MIPS=y
|
||||
CONFIG_MIPS_ASID_BITS=8
|
||||
CONFIG_MIPS_ASID_SHIFT=0
|
||||
CONFIG_MIPS_CLOCK_VSYSCALL=y
|
||||
# CONFIG_MIPS_CMDLINE_BUILTIN_EXTEND is not set
|
||||
CONFIG_MIPS_CMDLINE_FROM_BOOTLOADER=y
|
||||
# CONFIG_MIPS_HUGE_TLB_SUPPORT is not set
|
||||
CONFIG_MIPS_L1_CACHE_SHIFT=5
|
||||
# CONFIG_MIPS_MACHINE is not set
|
||||
CONFIG_MODULES_USE_ELF_REL=y
|
||||
CONFIG_MTD_AR2315=y
|
||||
CONFIG_MTD_CFI_ADV_OPTIONS=y
|
||||
# CONFIG_MTD_CFI_GEOMETRY is not set
|
||||
# CONFIG_MTD_CFI_INTELEXT is not set
|
||||
CONFIG_MTD_MYLOADER_PARTS=y
|
||||
CONFIG_MTD_PHYSMAP=y
|
||||
CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-3
|
||||
CONFIG_MTD_REDBOOT_PARTS=y
|
||||
CONFIG_MVSWITCH_PHY=y
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
CONFIG_NEED_PER_CPU_KM=y
|
||||
CONFIG_NET_AR231X=y
|
||||
CONFIG_NO_GENERIC_PCI_IOPORT_MAP=y
|
||||
# CONFIG_NO_IOPORT_MAP is not set
|
||||
# CONFIG_OF is not set
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_AR2315=y
|
||||
CONFIG_PCI_DISABLE_COMMON_QUIRKS=y
|
||||
CONFIG_PCI_DOMAINS=y
|
||||
CONFIG_PCI_DRIVERS_LEGACY=y
|
||||
CONFIG_PERF_USE_VMALLOC=y
|
||||
CONFIG_PGTABLE_LEVELS=2
|
||||
CONFIG_PHYLIB=y
|
||||
# CONFIG_RCU_NEED_SEGCBLIST is not set
|
||||
# CONFIG_RCU_STALL_COMMON is not set
|
||||
# CONFIG_SCHED_INFO is not set
|
||||
# CONFIG_SCSI_DMA is not set
|
||||
# CONFIG_SERIAL_8250_FSL is not set
|
||||
CONFIG_SERIAL_8250_NR_UARTS=1
|
||||
CONFIG_SERIAL_8250_RUNTIME_UARTS=1
|
||||
CONFIG_SOC_AR2315=y
|
||||
CONFIG_SOC_AR5312=y
|
||||
CONFIG_SRCU=y
|
||||
# CONFIG_SWAP is not set
|
||||
CONFIG_SWCONFIG=y
|
||||
CONFIG_SYSCTL_EXCEPTION_TRACE=y
|
||||
CONFIG_SYS_HAS_CPU_MIPS32_R1=y
|
||||
CONFIG_SYS_HAS_EARLY_PRINTK=y
|
||||
CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
|
||||
CONFIG_SYS_SUPPORTS_ARBIT_HZ=y
|
||||
CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y
|
||||
CONFIG_TICK_CPU_ACCOUNTING=y
|
||||
CONFIG_TINY_SRCU=y
|
||||
CONFIG_USB_SUPPORT=y
|
@ -1,115 +0,0 @@
|
||||
#
|
||||
# Copyright (C) 2006-2010 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/image.mk
|
||||
|
||||
define Build/mkfwimage
|
||||
$(STAGING_DIR_HOST)/bin/mkfwimage \
|
||||
-B $(1).$(VERSION_DIST).$(REVISION) \
|
||||
-k $(IMAGE_KERNEL) \
|
||||
-r $(IMAGE_ROOTFS) \
|
||||
-o $@.new && \
|
||||
mv $@.new $@
|
||||
endef
|
||||
|
||||
define Build/combined-image
|
||||
-sh $(TOPDIR)/scripts/combined-image.sh \
|
||||
"$(IMAGE_KERNEL)" \
|
||||
"$(IMAGE_ROOTFS)" \
|
||||
"$@.new" && \
|
||||
mv $@.new $@
|
||||
endef
|
||||
|
||||
define Build/mkmylofw
|
||||
$(STAGING_DIR_HOST)/bin/mkmylofw -B $(1) \
|
||||
-p0x020000:0x130000:ah:0x80041000:linux:$(IMAGE_KERNEL) \
|
||||
-p0x150000:0x2a0000:::rootfs:$(IMAGE_ROOTFS) \
|
||||
$@.new && \
|
||||
mv $@.new $@
|
||||
endef
|
||||
|
||||
define Build/gzip-kernel
|
||||
gzip -9n -c $@ > $@.gz
|
||||
dd if=$@.gz of=$@ bs=65536 conv=sync
|
||||
endef
|
||||
|
||||
define Build/lzma-kernel
|
||||
$(STAGING_DIR_HOST)/bin/lzma e $@ $@.l7
|
||||
dd if=$@.l7 of=$@ bs=65536 conv=sync
|
||||
endef
|
||||
|
||||
define Build/copy-kernel
|
||||
rm -f $@ $@.elf
|
||||
cp $< $@
|
||||
cp $< $@.elf
|
||||
endef
|
||||
|
||||
define Build/elf-kernel
|
||||
cp $(IMAGE_KERNEL).elf $@
|
||||
endef
|
||||
|
||||
|
||||
define Device/Default
|
||||
PROFILES = Default $$(DEVICE_NAME)
|
||||
KERNEL := copy-kernel | lzma-kernel
|
||||
IMAGES := sysupgrade.bin
|
||||
FILESYSTEMS := squashfs
|
||||
endef
|
||||
|
||||
define Device/generic
|
||||
DEVICE_VENDOR := Atheros
|
||||
DEVICE_MODEL := Generic AR2xxx board
|
||||
IMAGES := kernel.lzma kernel.elf kernel.gz rootfs.bin sysupgrade.bin
|
||||
IMAGE/kernel.gz := elf-kernel | gzip-kernel
|
||||
IMAGE/kernel.elf := elf-kernel
|
||||
IMAGE/kernel.lzma := elf-kernel | lzma-kernel
|
||||
IMAGE/rootfs.bin := append-rootfs | pad-rootfs | pad-to 128k
|
||||
IMAGE/sysupgrade.bin := append-rootfs | pad-rootfs | pad-to 128k | combined-image
|
||||
IMAGE_NAME = $$(IMAGE_PREFIX)-$$(if $$(findstring kernel,$$(2)),,$$(1)-)$$(2)
|
||||
endef
|
||||
TARGET_DEVICES += generic
|
||||
|
||||
define Device/ubnt2-pico2
|
||||
DEVICE_VENDOR := Ubiquiti
|
||||
DEVICE_MODEL := XS2-8
|
||||
IMAGE/sysupgrade.bin := append-rootfs | pad-rootfs | pad-to 128k | mkfwimage XS2-8 -v XS2.ar2316
|
||||
endef
|
||||
TARGET_DEVICES += ubnt2-pico2
|
||||
|
||||
define Device/ubnt2
|
||||
DEVICE_VENDOR := Ubiquiti
|
||||
DEVICE_MODEL := XS2
|
||||
IMAGE/sysupgrade.bin := append-rootfs | pad-rootfs | pad-to 128k | mkfwimage XS2 -v XS2.ar2316
|
||||
endef
|
||||
TARGET_DEVICES += ubnt2
|
||||
|
||||
define Device/ubnt5
|
||||
DEVICE_VENDOR := Ubiquiti
|
||||
DEVICE_MODEL := XS5
|
||||
IMAGE/sysupgrade.bin := append-rootfs | pad-rootfs | pad-to 128k | mkfwimage XS5 -v XS5.ar2313
|
||||
endef
|
||||
TARGET_DEVICES += ubnt5
|
||||
|
||||
define Device/np25g
|
||||
DEVICE_VENDOR := Compex
|
||||
DEVICE_MODEL := NP25G
|
||||
KERNEL := kernel-bin | gzip-kernel
|
||||
IMAGE/sysupgrade.bin := append-rootfs | pad-rootfs | pad-to 128k | mkmylofw np25g
|
||||
BROKEN := y
|
||||
endef
|
||||
TARGET_DEVICES += np25g
|
||||
|
||||
define Device/wpe53g
|
||||
DEVICE_VENDOR := Compex
|
||||
DEVICE_MODEL := WPE53G
|
||||
KERNEL := kernel-bin | gzip-kernel
|
||||
IMAGE/sysupgrade.bin := append-rootfs | pad-rootfs | pad-to 128k | mkmylofw wpe53g
|
||||
BROKEN := y
|
||||
endef
|
||||
TARGET_DEVICES += wpe53g
|
||||
|
||||
$(eval $(call BuildImage))
|
@ -1,212 +0,0 @@
|
||||
--- a/arch/mips/ath25/Kconfig
|
||||
+++ b/arch/mips/ath25/Kconfig
|
||||
@@ -2,6 +2,7 @@
|
||||
config SOC_AR5312
|
||||
bool "Atheros AR5312/AR2312+ SoC support"
|
||||
depends on ATH25
|
||||
+ select GPIO_AR5312
|
||||
default y
|
||||
|
||||
config SOC_AR2315
|
||||
--- a/arch/mips/ath25/ar5312.c
|
||||
+++ b/arch/mips/ath25/ar5312.c
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/reboot.h>
|
||||
+#include <linux/gpio.h>
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/reboot.h>
|
||||
#include <asm/time.h>
|
||||
@@ -180,6 +181,22 @@ static struct platform_device ar5312_phy
|
||||
.num_resources = 1,
|
||||
};
|
||||
|
||||
+static struct resource ar5312_gpio_res[] = {
|
||||
+ {
|
||||
+ .name = "ar5312-gpio",
|
||||
+ .flags = IORESOURCE_MEM,
|
||||
+ .start = AR5312_GPIO_BASE,
|
||||
+ .end = AR5312_GPIO_BASE + AR5312_GPIO_SIZE - 1,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static struct platform_device ar5312_gpio = {
|
||||
+ .name = "ar5312-gpio",
|
||||
+ .id = -1,
|
||||
+ .resource = ar5312_gpio_res,
|
||||
+ .num_resources = ARRAY_SIZE(ar5312_gpio_res),
|
||||
+};
|
||||
+
|
||||
static void __init ar5312_flash_init(void)
|
||||
{
|
||||
void __iomem *flashctl_base;
|
||||
@@ -247,6 +264,8 @@ void __init ar5312_init_devices(void)
|
||||
|
||||
platform_device_register(&ar5312_physmap_flash);
|
||||
|
||||
+ platform_device_register(&ar5312_gpio);
|
||||
+
|
||||
switch (ath25_soc) {
|
||||
case ATH25_SOC_AR5312:
|
||||
if (!ath25_board.radio)
|
||||
--- a/drivers/gpio/Kconfig
|
||||
+++ b/drivers/gpio/Kconfig
|
||||
@@ -105,6 +105,13 @@ config GPIO_AMDPT
|
||||
driver for GPIO functionality on Promontory IOHub
|
||||
Require ACPI ASL code to enumerate as a platform device.
|
||||
|
||||
+config GPIO_AR5312
|
||||
+ bool "AR5312 SoC GPIO support"
|
||||
+ default y if SOC_AR5312
|
||||
+ depends on SOC_AR5312
|
||||
+ help
|
||||
+ Say yes here to enable GPIO support for Atheros AR5312/AR2312+ SoCs.
|
||||
+
|
||||
config GPIO_ASPEED
|
||||
tristate "Aspeed GPIO support"
|
||||
depends on (ARCH_ASPEED || COMPILE_TEST) && OF_GPIO
|
||||
--- a/drivers/gpio/Makefile
|
||||
+++ b/drivers/gpio/Makefile
|
||||
@@ -29,6 +29,7 @@ obj-$(CONFIG_GPIO_ALTERA) += gpio-alte
|
||||
obj-$(CONFIG_GPIO_ALTERA_A10SR) += gpio-altera-a10sr.o
|
||||
obj-$(CONFIG_GPIO_AMD8111) += gpio-amd8111.o
|
||||
obj-$(CONFIG_GPIO_AMDPT) += gpio-amdpt.o
|
||||
+obj-$(CONFIG_GPIO_AR5312) += gpio-ar5312.o
|
||||
obj-$(CONFIG_GPIO_ARIZONA) += gpio-arizona.o
|
||||
obj-$(CONFIG_GPIO_ATH79) += gpio-ath79.o
|
||||
obj-$(CONFIG_GPIO_ASPEED) += gpio-aspeed.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/gpio/gpio-ar5312.c
|
||||
@@ -0,0 +1,121 @@
|
||||
+/*
|
||||
+ * This file is subject to the terms and conditions of the GNU General Public
|
||||
+ * License. See the file "COPYING" in the main directory of this archive
|
||||
+ * for more details.
|
||||
+ *
|
||||
+ * Copyright (C) 2003 Atheros Communications, Inc., All Rights Reserved.
|
||||
+ * Copyright (C) 2006 FON Technology, SL.
|
||||
+ * Copyright (C) 2006 Imre Kaloz <kaloz@openwrt.org>
|
||||
+ * Copyright (C) 2006-2009 Felix Fietkau <nbd@nbd.name>
|
||||
+ * Copyright (C) 2012 Alexandros C. Couloumbis <alex@ozo.com>
|
||||
+ */
|
||||
+
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/gpio.h>
|
||||
+
|
||||
+#define DRIVER_NAME "ar5312-gpio"
|
||||
+
|
||||
+#define AR5312_GPIO_DO 0x00 /* output register */
|
||||
+#define AR5312_GPIO_DI 0x04 /* intput register */
|
||||
+#define AR5312_GPIO_CR 0x08 /* control register */
|
||||
+
|
||||
+#define AR5312_GPIO_CR_M(x) (1 << (x)) /* mask for i/o */
|
||||
+#define AR5312_GPIO_CR_O(x) (0 << (x)) /* mask for output */
|
||||
+#define AR5312_GPIO_CR_I(x) (1 << (x)) /* mask for input */
|
||||
+#define AR5312_GPIO_CR_INT(x) (1 << ((x)+8)) /* mask for interrupt */
|
||||
+#define AR5312_GPIO_CR_UART(x) (1 << ((x)+16)) /* uart multiplex */
|
||||
+
|
||||
+#define AR5312_GPIO_NUM 8
|
||||
+
|
||||
+static void __iomem *ar5312_mem;
|
||||
+
|
||||
+static inline u32 ar5312_gpio_reg_read(unsigned reg)
|
||||
+{
|
||||
+ return __raw_readl(ar5312_mem + reg);
|
||||
+}
|
||||
+
|
||||
+static inline void ar5312_gpio_reg_write(unsigned reg, u32 val)
|
||||
+{
|
||||
+ __raw_writel(val, ar5312_mem + reg);
|
||||
+}
|
||||
+
|
||||
+static inline void ar5312_gpio_reg_mask(unsigned reg, u32 mask, u32 val)
|
||||
+{
|
||||
+ ar5312_gpio_reg_write(reg, (ar5312_gpio_reg_read(reg) & ~mask) | val);
|
||||
+}
|
||||
+
|
||||
+static int ar5312_gpio_get_val(struct gpio_chip *chip, unsigned gpio)
|
||||
+{
|
||||
+ return (ar5312_gpio_reg_read(AR5312_GPIO_DI) >> gpio) & 1;
|
||||
+}
|
||||
+
|
||||
+static void ar5312_gpio_set_val(struct gpio_chip *chip, unsigned gpio, int val)
|
||||
+{
|
||||
+ u32 reg = ar5312_gpio_reg_read(AR5312_GPIO_DO);
|
||||
+
|
||||
+ reg = val ? reg | (1 << gpio) : reg & ~(1 << gpio);
|
||||
+ ar5312_gpio_reg_write(AR5312_GPIO_DO, reg);
|
||||
+}
|
||||
+
|
||||
+static int ar5312_gpio_dir_in(struct gpio_chip *chip, unsigned gpio)
|
||||
+{
|
||||
+ ar5312_gpio_reg_mask(AR5312_GPIO_CR, 0, 1 << gpio);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int ar5312_gpio_dir_out(struct gpio_chip *chip, unsigned gpio, int val)
|
||||
+{
|
||||
+ ar5312_gpio_reg_mask(AR5312_GPIO_CR, 1 << gpio, 0);
|
||||
+ ar5312_gpio_set_val(chip, gpio, val);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct gpio_chip ar5312_gpio_chip = {
|
||||
+ .label = DRIVER_NAME,
|
||||
+ .direction_input = ar5312_gpio_dir_in,
|
||||
+ .direction_output = ar5312_gpio_dir_out,
|
||||
+ .set = ar5312_gpio_set_val,
|
||||
+ .get = ar5312_gpio_get_val,
|
||||
+ .base = 0,
|
||||
+ .ngpio = AR5312_GPIO_NUM,
|
||||
+};
|
||||
+
|
||||
+static int ar5312_gpio_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ struct resource *res;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (ar5312_mem)
|
||||
+ return -EBUSY;
|
||||
+
|
||||
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
+ ar5312_mem = devm_ioremap_resource(dev, res);
|
||||
+ if (IS_ERR(ar5312_mem))
|
||||
+ return PTR_ERR(ar5312_mem);
|
||||
+
|
||||
+ ar5312_gpio_chip.parent = dev;
|
||||
+ ret = gpiochip_add(&ar5312_gpio_chip);
|
||||
+ if (ret) {
|
||||
+ dev_err(dev, "failed to add gpiochip\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct platform_driver ar5312_gpio_driver = {
|
||||
+ .probe = ar5312_gpio_probe,
|
||||
+ .driver = {
|
||||
+ .name = DRIVER_NAME,
|
||||
+ .owner = THIS_MODULE,
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
+static int __init ar5312_gpio_init(void)
|
||||
+{
|
||||
+ return platform_driver_register(&ar5312_gpio_driver);
|
||||
+}
|
||||
+subsys_initcall(ar5312_gpio_init);
|
||||
--- a/arch/mips/Kconfig
|
||||
+++ b/arch/mips/Kconfig
|
||||
@@ -175,6 +175,7 @@ config ATH25
|
||||
select CEVT_R4K
|
||||
select CSRC_R4K
|
||||
select DMA_NONCOHERENT
|
||||
+ select GPIOLIB
|
||||
select IRQ_MIPS_CPU
|
||||
select IRQ_DOMAIN
|
||||
select SYS_HAS_CPU_MIPS32_R1
|
@ -1,363 +0,0 @@
|
||||
--- a/arch/mips/ath25/Kconfig
|
||||
+++ b/arch/mips/ath25/Kconfig
|
||||
@@ -8,6 +8,7 @@ config SOC_AR5312
|
||||
config SOC_AR2315
|
||||
bool "Atheros AR2315+ SoC support"
|
||||
depends on ATH25
|
||||
+ select GPIO_AR2315
|
||||
default y
|
||||
|
||||
config PCI_AR2315
|
||||
--- a/arch/mips/ath25/ar2315.c
|
||||
+++ b/arch/mips/ath25/ar2315.c
|
||||
@@ -21,6 +21,8 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/reboot.h>
|
||||
+#include <linux/delay.h>
|
||||
+#include <linux/gpio.h>
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/reboot.h>
|
||||
#include <asm/time.h>
|
||||
@@ -167,11 +169,42 @@ void __init ar2315_arch_init_irq(void)
|
||||
ar2315_misc_irq_domain = domain;
|
||||
}
|
||||
|
||||
+static struct resource ar2315_gpio_res[] = {
|
||||
+ {
|
||||
+ .name = "ar2315-gpio",
|
||||
+ .flags = IORESOURCE_MEM,
|
||||
+ .start = AR2315_RST_BASE + AR2315_GPIO,
|
||||
+ .end = AR2315_RST_BASE + AR2315_GPIO + 0x10 - 1,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "ar2315-gpio",
|
||||
+ .flags = IORESOURCE_IRQ,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "ar2315-gpio-irq-base",
|
||||
+ .flags = IORESOURCE_IRQ,
|
||||
+ .start = AR231X_GPIO_IRQ_BASE,
|
||||
+ .end = AR231X_GPIO_IRQ_BASE,
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
+static struct platform_device ar2315_gpio = {
|
||||
+ .id = -1,
|
||||
+ .name = "ar2315-gpio",
|
||||
+ .resource = ar2315_gpio_res,
|
||||
+ .num_resources = ARRAY_SIZE(ar2315_gpio_res)
|
||||
+};
|
||||
+
|
||||
void __init ar2315_init_devices(void)
|
||||
{
|
||||
/* Find board configuration */
|
||||
ath25_find_config(AR2315_SPI_READ_BASE, AR2315_SPI_READ_SIZE);
|
||||
|
||||
+ ar2315_gpio_res[1].start = irq_create_mapping(ar2315_misc_irq_domain,
|
||||
+ AR2315_MISC_IRQ_GPIO);
|
||||
+ ar2315_gpio_res[1].end = ar2315_gpio_res[1].start;
|
||||
+ platform_device_register(&ar2315_gpio);
|
||||
+
|
||||
ath25_add_wmac(0, AR2315_WLAN0_BASE, AR2315_IRQ_WLAN0);
|
||||
}
|
||||
|
||||
@@ -187,8 +220,8 @@ static void ar2315_restart(char *command
|
||||
/* Cold reset does not work on the AR2315/6, use the GPIO reset bits
|
||||
* a workaround. Give it some time to attempt a gpio based hardware
|
||||
* reset (atheros reference design workaround) */
|
||||
-
|
||||
- /* TODO: implement the GPIO reset workaround */
|
||||
+ gpio_request_one(AR2315_RESET_GPIO, GPIOF_OUT_INIT_LOW, "Reset");
|
||||
+ mdelay(100);
|
||||
|
||||
/* Some boards (e.g. Senao EOC-2610) don't implement the reset logic
|
||||
* workaround. Attempt to jump to the mips reset location -
|
||||
--- a/drivers/gpio/Kconfig
|
||||
+++ b/drivers/gpio/Kconfig
|
||||
@@ -105,6 +105,13 @@ config GPIO_AMDPT
|
||||
driver for GPIO functionality on Promontory IOHub
|
||||
Require ACPI ASL code to enumerate as a platform device.
|
||||
|
||||
+config GPIO_AR2315
|
||||
+ bool "AR2315 SoC GPIO support"
|
||||
+ default y if SOC_AR2315
|
||||
+ depends on SOC_AR2315
|
||||
+ help
|
||||
+ Say yes here to enable GPIO support for Atheros AR2315+ SoCs.
|
||||
+
|
||||
config GPIO_AR5312
|
||||
bool "AR5312 SoC GPIO support"
|
||||
default y if SOC_AR5312
|
||||
--- a/drivers/gpio/Makefile
|
||||
+++ b/drivers/gpio/Makefile
|
||||
@@ -29,6 +29,7 @@ obj-$(CONFIG_GPIO_ALTERA) += gpio-alte
|
||||
obj-$(CONFIG_GPIO_ALTERA_A10SR) += gpio-altera-a10sr.o
|
||||
obj-$(CONFIG_GPIO_AMD8111) += gpio-amd8111.o
|
||||
obj-$(CONFIG_GPIO_AMDPT) += gpio-amdpt.o
|
||||
+obj-$(CONFIG_GPIO_AR2315) += gpio-ar2315.o
|
||||
obj-$(CONFIG_GPIO_AR5312) += gpio-ar5312.o
|
||||
obj-$(CONFIG_GPIO_ARIZONA) += gpio-arizona.o
|
||||
obj-$(CONFIG_GPIO_ATH79) += gpio-ath79.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/gpio/gpio-ar2315.c
|
||||
@@ -0,0 +1,233 @@
|
||||
+/*
|
||||
+ * This file is subject to the terms and conditions of the GNU General Public
|
||||
+ * License. See the file "COPYING" in the main directory of this archive
|
||||
+ * for more details.
|
||||
+ *
|
||||
+ * Copyright (C) 2003 Atheros Communications, Inc., All Rights Reserved.
|
||||
+ * Copyright (C) 2006 FON Technology, SL.
|
||||
+ * Copyright (C) 2006 Imre Kaloz <kaloz@openwrt.org>
|
||||
+ * Copyright (C) 2006 Felix Fietkau <nbd@nbd.name>
|
||||
+ * Copyright (C) 2012 Alexandros C. Couloumbis <alex@ozo.com>
|
||||
+ */
|
||||
+
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/gpio.h>
|
||||
+#include <linux/irq.h>
|
||||
+
|
||||
+#define DRIVER_NAME "ar2315-gpio"
|
||||
+
|
||||
+#define AR2315_GPIO_DI 0x0000
|
||||
+#define AR2315_GPIO_DO 0x0008
|
||||
+#define AR2315_GPIO_DIR 0x0010
|
||||
+#define AR2315_GPIO_INT 0x0018
|
||||
+
|
||||
+#define AR2315_GPIO_DIR_M(x) (1 << (x)) /* mask for i/o */
|
||||
+#define AR2315_GPIO_DIR_O(x) (1 << (x)) /* output */
|
||||
+#define AR2315_GPIO_DIR_I(x) (0) /* input */
|
||||
+
|
||||
+#define AR2315_GPIO_INT_NUM_M 0x3F /* mask for GPIO num */
|
||||
+#define AR2315_GPIO_INT_TRIG(x) ((x) << 6) /* interrupt trigger */
|
||||
+#define AR2315_GPIO_INT_TRIG_M (0x3 << 6) /* mask for int trig */
|
||||
+
|
||||
+#define AR2315_GPIO_INT_TRIG_OFF 0 /* Triggerring off */
|
||||
+#define AR2315_GPIO_INT_TRIG_LOW 1 /* Low Level Triggered */
|
||||
+#define AR2315_GPIO_INT_TRIG_HIGH 2 /* High Level Triggered */
|
||||
+#define AR2315_GPIO_INT_TRIG_EDGE 3 /* Edge Triggered */
|
||||
+
|
||||
+#define AR2315_GPIO_NUM 22
|
||||
+
|
||||
+static u32 ar2315_gpio_intmask;
|
||||
+static u32 ar2315_gpio_intval;
|
||||
+static unsigned ar2315_gpio_irq_base;
|
||||
+static void __iomem *ar2315_mem;
|
||||
+
|
||||
+static inline u32 ar2315_gpio_reg_read(unsigned reg)
|
||||
+{
|
||||
+ return __raw_readl(ar2315_mem + reg);
|
||||
+}
|
||||
+
|
||||
+static inline void ar2315_gpio_reg_write(unsigned reg, u32 val)
|
||||
+{
|
||||
+ __raw_writel(val, ar2315_mem + reg);
|
||||
+}
|
||||
+
|
||||
+static inline void ar2315_gpio_reg_mask(unsigned reg, u32 mask, u32 val)
|
||||
+{
|
||||
+ ar2315_gpio_reg_write(reg, (ar2315_gpio_reg_read(reg) & ~mask) | val);
|
||||
+}
|
||||
+
|
||||
+static void ar2315_gpio_irq_handler(struct irq_desc *desc)
|
||||
+{
|
||||
+ u32 pend;
|
||||
+ int bit = -1;
|
||||
+
|
||||
+ /* only do one gpio interrupt at a time */
|
||||
+ pend = ar2315_gpio_reg_read(AR2315_GPIO_DI);
|
||||
+ pend ^= ar2315_gpio_intval;
|
||||
+ pend &= ar2315_gpio_intmask;
|
||||
+
|
||||
+ if (pend) {
|
||||
+ bit = fls(pend) - 1;
|
||||
+ pend &= ~(1 << bit);
|
||||
+ ar2315_gpio_intval ^= (1 << bit);
|
||||
+ }
|
||||
+
|
||||
+ /* Enable interrupt with edge detection */
|
||||
+ if ((ar2315_gpio_reg_read(AR2315_GPIO_DIR) & AR2315_GPIO_DIR_M(bit)) !=
|
||||
+ AR2315_GPIO_DIR_I(bit))
|
||||
+ return;
|
||||
+
|
||||
+ if (bit >= 0)
|
||||
+ generic_handle_irq(ar2315_gpio_irq_base + bit);
|
||||
+}
|
||||
+
|
||||
+static void ar2315_gpio_int_setup(unsigned gpio, int trig)
|
||||
+{
|
||||
+ u32 reg = ar2315_gpio_reg_read(AR2315_GPIO_INT);
|
||||
+
|
||||
+ reg &= ~(AR2315_GPIO_INT_NUM_M | AR2315_GPIO_INT_TRIG_M);
|
||||
+ reg |= gpio | AR2315_GPIO_INT_TRIG(trig);
|
||||
+ ar2315_gpio_reg_write(AR2315_GPIO_INT, reg);
|
||||
+}
|
||||
+
|
||||
+static void ar2315_gpio_irq_unmask(struct irq_data *d)
|
||||
+{
|
||||
+ unsigned gpio = d->irq - ar2315_gpio_irq_base;
|
||||
+ u32 dir = ar2315_gpio_reg_read(AR2315_GPIO_DIR);
|
||||
+
|
||||
+ /* Enable interrupt with edge detection */
|
||||
+ if ((dir & AR2315_GPIO_DIR_M(gpio)) != AR2315_GPIO_DIR_I(gpio))
|
||||
+ return;
|
||||
+
|
||||
+ ar2315_gpio_intmask |= (1 << gpio);
|
||||
+ ar2315_gpio_int_setup(gpio, AR2315_GPIO_INT_TRIG_EDGE);
|
||||
+}
|
||||
+
|
||||
+static void ar2315_gpio_irq_mask(struct irq_data *d)
|
||||
+{
|
||||
+ unsigned gpio = d->irq - ar2315_gpio_irq_base;
|
||||
+
|
||||
+ /* Disable interrupt */
|
||||
+ ar2315_gpio_intmask &= ~(1 << gpio);
|
||||
+ ar2315_gpio_int_setup(gpio, AR2315_GPIO_INT_TRIG_OFF);
|
||||
+}
|
||||
+
|
||||
+static struct irq_chip ar2315_gpio_irq_chip = {
|
||||
+ .name = DRIVER_NAME,
|
||||
+ .irq_unmask = ar2315_gpio_irq_unmask,
|
||||
+ .irq_mask = ar2315_gpio_irq_mask,
|
||||
+};
|
||||
+
|
||||
+static void ar2315_gpio_irq_init(unsigned irq)
|
||||
+{
|
||||
+ unsigned i;
|
||||
+
|
||||
+ ar2315_gpio_intval = ar2315_gpio_reg_read(AR2315_GPIO_DI);
|
||||
+ for (i = 0; i < AR2315_GPIO_NUM; i++) {
|
||||
+ unsigned _irq = ar2315_gpio_irq_base + i;
|
||||
+
|
||||
+ irq_set_chip_and_handler(_irq, &ar2315_gpio_irq_chip,
|
||||
+ handle_level_irq);
|
||||
+ }
|
||||
+ irq_set_chained_handler(irq, ar2315_gpio_irq_handler);
|
||||
+}
|
||||
+
|
||||
+static int ar2315_gpio_get_val(struct gpio_chip *chip, unsigned gpio)
|
||||
+{
|
||||
+ return (ar2315_gpio_reg_read(AR2315_GPIO_DI) >> gpio) & 1;
|
||||
+}
|
||||
+
|
||||
+static void ar2315_gpio_set_val(struct gpio_chip *chip, unsigned gpio, int val)
|
||||
+{
|
||||
+ u32 reg = ar2315_gpio_reg_read(AR2315_GPIO_DO);
|
||||
+
|
||||
+ reg = val ? reg | (1 << gpio) : reg & ~(1 << gpio);
|
||||
+ ar2315_gpio_reg_write(AR2315_GPIO_DO, reg);
|
||||
+}
|
||||
+
|
||||
+static int ar2315_gpio_dir_in(struct gpio_chip *chip, unsigned gpio)
|
||||
+{
|
||||
+ ar2315_gpio_reg_mask(AR2315_GPIO_DIR, 1 << gpio, 0);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int ar2315_gpio_dir_out(struct gpio_chip *chip, unsigned gpio, int val)
|
||||
+{
|
||||
+ ar2315_gpio_reg_mask(AR2315_GPIO_DIR, 0, 1 << gpio);
|
||||
+ ar2315_gpio_set_val(chip, gpio, val);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int ar2315_gpio_to_irq(struct gpio_chip *chip, unsigned gpio)
|
||||
+{
|
||||
+ return ar2315_gpio_irq_base + gpio;
|
||||
+}
|
||||
+
|
||||
+static struct gpio_chip ar2315_gpio_chip = {
|
||||
+ .label = DRIVER_NAME,
|
||||
+ .direction_input = ar2315_gpio_dir_in,
|
||||
+ .direction_output = ar2315_gpio_dir_out,
|
||||
+ .set = ar2315_gpio_set_val,
|
||||
+ .get = ar2315_gpio_get_val,
|
||||
+ .to_irq = ar2315_gpio_to_irq,
|
||||
+ .base = 0,
|
||||
+ .ngpio = AR2315_GPIO_NUM,
|
||||
+};
|
||||
+
|
||||
+static int ar2315_gpio_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ struct resource *res;
|
||||
+ unsigned irq;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (ar2315_mem)
|
||||
+ return -EBUSY;
|
||||
+
|
||||
+ res = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
|
||||
+ "ar2315-gpio-irq-base");
|
||||
+ if (!res) {
|
||||
+ dev_err(dev, "not found GPIO IRQ base\n");
|
||||
+ return -ENXIO;
|
||||
+ }
|
||||
+ ar2315_gpio_irq_base = res->start;
|
||||
+
|
||||
+ res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, DRIVER_NAME);
|
||||
+ if (!res) {
|
||||
+ dev_err(dev, "not found IRQ number\n");
|
||||
+ return -ENXIO;
|
||||
+ }
|
||||
+ irq = res->start;
|
||||
+
|
||||
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, DRIVER_NAME);
|
||||
+ ar2315_mem = devm_ioremap_resource(dev, res);
|
||||
+ if (IS_ERR(ar2315_mem))
|
||||
+ return PTR_ERR(ar2315_mem);
|
||||
+
|
||||
+ ar2315_gpio_chip.parent = dev;
|
||||
+ ret = gpiochip_add(&ar2315_gpio_chip);
|
||||
+ if (ret) {
|
||||
+ dev_err(dev, "failed to add gpiochip\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ ar2315_gpio_irq_init(irq);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct platform_driver ar2315_gpio_driver = {
|
||||
+ .probe = ar2315_gpio_probe,
|
||||
+ .driver = {
|
||||
+ .name = DRIVER_NAME,
|
||||
+ .owner = THIS_MODULE,
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
+static int __init ar2315_gpio_init(void)
|
||||
+{
|
||||
+ return platform_driver_register(&ar2315_gpio_driver);
|
||||
+}
|
||||
+subsys_initcall(ar2315_gpio_init);
|
||||
--- a/arch/mips/ath25/devices.h
|
||||
+++ b/arch/mips/ath25/devices.h
|
||||
@@ -4,6 +4,11 @@
|
||||
|
||||
#include <linux/cpu.h>
|
||||
|
||||
+#define AR231X_GPIO_IRQ_BASE 0x30
|
||||
+
|
||||
+/* GPIO number for AR2315/16 reset issue workaround */
|
||||
+#define AR2315_RESET_GPIO 5
|
||||
+
|
||||
#define ATH25_REG_MS(_val, _field) (((_val) & _field##_M) >> _field##_S)
|
||||
|
||||
#define ATH25_IRQ_CPU_CLOCK (MIPS_CPU_IRQ_BASE + 7) /* C0_CAUSE: 0x8000 */
|
||||
--- a/arch/mips/ath25/ar2315_regs.h
|
||||
+++ b/arch/mips/ath25/ar2315_regs.h
|
||||
@@ -315,6 +315,9 @@
|
||||
#define AR2315_MEM_CFG_BANKADDR_BITS_M 0x00000018
|
||||
#define AR2315_MEM_CFG_BANKADDR_BITS_S 3
|
||||
|
||||
+/* GPIO MMR base address */
|
||||
+#define AR2315_GPIO 0x0088
|
||||
+
|
||||
/*
|
||||
* Local Bus Interface Registers
|
||||
*/
|
File diff suppressed because it is too large
Load Diff
@ -1,634 +0,0 @@
|
||||
--- a/drivers/mtd/devices/Kconfig
|
||||
+++ b/drivers/mtd/devices/Kconfig
|
||||
@@ -130,6 +130,10 @@ config MTD_BCM47XXSFLASH
|
||||
registered by bcma as platform devices. This enables driver for
|
||||
serial flash memories.
|
||||
|
||||
+config MTD_AR2315
|
||||
+ tristate "Atheros AR2315+ SPI Flash support"
|
||||
+ depends on SOC_AR2315
|
||||
+
|
||||
config MTD_SLRAM
|
||||
tristate "Uncached system RAM"
|
||||
help
|
||||
--- a/drivers/mtd/devices/Makefile
|
||||
+++ b/drivers/mtd/devices/Makefile
|
||||
@@ -16,6 +16,7 @@ obj-$(CONFIG_MTD_M25P80) += m25p80.o
|
||||
obj-$(CONFIG_MTD_MCHP23K256) += mchp23k256.o
|
||||
obj-$(CONFIG_MTD_SPEAR_SMI) += spear_smi.o
|
||||
obj-$(CONFIG_MTD_SST25L) += sst25l.o
|
||||
+obj-$(CONFIG_MTD_AR2315) += ar2315.o
|
||||
obj-$(CONFIG_MTD_BCM47XXSFLASH) += bcm47xxsflash.o
|
||||
obj-$(CONFIG_MTD_ST_SPI_FSM) += st_spi_fsm.o
|
||||
obj-$(CONFIG_MTD_POWERNV_FLASH) += powernv_flash.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/mtd/devices/ar2315.c
|
||||
@@ -0,0 +1,459 @@
|
||||
+
|
||||
+/*
|
||||
+ * MTD driver for the SPI Flash Memory support on Atheros AR2315
|
||||
+ *
|
||||
+ * Copyright (c) 2005-2006 Atheros Communications Inc.
|
||||
+ * Copyright (C) 2006-2007 FON Technology, SL.
|
||||
+ * Copyright (C) 2006-2007 Imre Kaloz <kaloz@openwrt.org>
|
||||
+ * Copyright (C) 2006-2009 Felix Fietkau <nbd@nbd.name>
|
||||
+ * Copyright (C) 2012 Alexandros C. Couloumbis <alex@ozo.com>
|
||||
+ *
|
||||
+ * This code is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/types.h>
|
||||
+#include <linux/errno.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/mtd/mtd.h>
|
||||
+#include <linux/mtd/partitions.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/sched.h>
|
||||
+#include <linux/delay.h>
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/mutex.h>
|
||||
+
|
||||
+#include "ar2315_spiflash.h"
|
||||
+
|
||||
+#define DRIVER_NAME "ar2315-spiflash"
|
||||
+
|
||||
+#define busy_wait(_priv, _condition, _wait) do { \
|
||||
+ while (_condition) { \
|
||||
+ if (_wait > 1) \
|
||||
+ msleep(_wait); \
|
||||
+ else if ((_wait == 1) && need_resched()) \
|
||||
+ schedule(); \
|
||||
+ else \
|
||||
+ udelay(1); \
|
||||
+ } \
|
||||
+} while (0)
|
||||
+
|
||||
+enum {
|
||||
+ FLASH_NONE,
|
||||
+ FLASH_1MB,
|
||||
+ FLASH_2MB,
|
||||
+ FLASH_4MB,
|
||||
+ FLASH_8MB,
|
||||
+ FLASH_16MB,
|
||||
+};
|
||||
+
|
||||
+/* Flash configuration table */
|
||||
+struct flashconfig {
|
||||
+ u32 byte_cnt;
|
||||
+ u32 sector_cnt;
|
||||
+ u32 sector_size;
|
||||
+};
|
||||
+
|
||||
+static const struct flashconfig flashconfig_tbl[] = {
|
||||
+ [FLASH_NONE] = { 0, 0, 0},
|
||||
+ [FLASH_1MB] = { STM_1MB_BYTE_COUNT, STM_1MB_SECTOR_COUNT,
|
||||
+ STM_1MB_SECTOR_SIZE},
|
||||
+ [FLASH_2MB] = { STM_2MB_BYTE_COUNT, STM_2MB_SECTOR_COUNT,
|
||||
+ STM_2MB_SECTOR_SIZE},
|
||||
+ [FLASH_4MB] = { STM_4MB_BYTE_COUNT, STM_4MB_SECTOR_COUNT,
|
||||
+ STM_4MB_SECTOR_SIZE},
|
||||
+ [FLASH_8MB] = { STM_8MB_BYTE_COUNT, STM_8MB_SECTOR_COUNT,
|
||||
+ STM_8MB_SECTOR_SIZE},
|
||||
+ [FLASH_16MB] = { STM_16MB_BYTE_COUNT, STM_16MB_SECTOR_COUNT,
|
||||
+ STM_16MB_SECTOR_SIZE}
|
||||
+};
|
||||
+
|
||||
+/* Mapping of generic opcodes to STM serial flash opcodes */
|
||||
+enum {
|
||||
+ SPI_WRITE_ENABLE,
|
||||
+ SPI_WRITE_DISABLE,
|
||||
+ SPI_RD_STATUS,
|
||||
+ SPI_WR_STATUS,
|
||||
+ SPI_RD_DATA,
|
||||
+ SPI_FAST_RD_DATA,
|
||||
+ SPI_PAGE_PROGRAM,
|
||||
+ SPI_SECTOR_ERASE,
|
||||
+ SPI_BULK_ERASE,
|
||||
+ SPI_DEEP_PWRDOWN,
|
||||
+ SPI_RD_SIG,
|
||||
+};
|
||||
+
|
||||
+struct opcodes {
|
||||
+ __u16 code;
|
||||
+ __s8 tx_cnt;
|
||||
+ __s8 rx_cnt;
|
||||
+};
|
||||
+
|
||||
+static const struct opcodes stm_opcodes[] = {
|
||||
+ [SPI_WRITE_ENABLE] = {STM_OP_WR_ENABLE, 1, 0},
|
||||
+ [SPI_WRITE_DISABLE] = {STM_OP_WR_DISABLE, 1, 0},
|
||||
+ [SPI_RD_STATUS] = {STM_OP_RD_STATUS, 1, 1},
|
||||
+ [SPI_WR_STATUS] = {STM_OP_WR_STATUS, 1, 0},
|
||||
+ [SPI_RD_DATA] = {STM_OP_RD_DATA, 4, 4},
|
||||
+ [SPI_FAST_RD_DATA] = {STM_OP_FAST_RD_DATA, 5, 0},
|
||||
+ [SPI_PAGE_PROGRAM] = {STM_OP_PAGE_PGRM, 8, 0},
|
||||
+ [SPI_SECTOR_ERASE] = {STM_OP_SECTOR_ERASE, 4, 0},
|
||||
+ [SPI_BULK_ERASE] = {STM_OP_BULK_ERASE, 1, 0},
|
||||
+ [SPI_DEEP_PWRDOWN] = {STM_OP_DEEP_PWRDOWN, 1, 0},
|
||||
+ [SPI_RD_SIG] = {STM_OP_RD_SIG, 4, 1},
|
||||
+};
|
||||
+
|
||||
+/* Driver private data structure */
|
||||
+struct spiflash_priv {
|
||||
+ struct mtd_info mtd;
|
||||
+ void __iomem *readaddr; /* memory mapped data for read */
|
||||
+ void __iomem *mmraddr; /* memory mapped register space */
|
||||
+ struct mutex lock; /* serialize registers access */
|
||||
+};
|
||||
+
|
||||
+#define to_spiflash(_mtd) container_of(_mtd, struct spiflash_priv, mtd)
|
||||
+
|
||||
+enum {
|
||||
+ FL_READY,
|
||||
+ FL_READING,
|
||||
+ FL_ERASING,
|
||||
+ FL_WRITING
|
||||
+};
|
||||
+
|
||||
+/*****************************************************************************/
|
||||
+
|
||||
+static u32
|
||||
+spiflash_read_reg(struct spiflash_priv *priv, int reg)
|
||||
+{
|
||||
+ return ioread32(priv->mmraddr + reg);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+spiflash_write_reg(struct spiflash_priv *priv, int reg, u32 data)
|
||||
+{
|
||||
+ iowrite32(data, priv->mmraddr + reg);
|
||||
+}
|
||||
+
|
||||
+static u32
|
||||
+spiflash_wait_busy(struct spiflash_priv *priv)
|
||||
+{
|
||||
+ u32 reg;
|
||||
+
|
||||
+ busy_wait(priv, (reg = spiflash_read_reg(priv, SPI_FLASH_CTL)) &
|
||||
+ SPI_CTL_BUSY, 0);
|
||||
+ return reg;
|
||||
+}
|
||||
+
|
||||
+static u32
|
||||
+spiflash_sendcmd(struct spiflash_priv *priv, int opcode, u32 addr)
|
||||
+{
|
||||
+ const struct opcodes *op;
|
||||
+ u32 reg, mask;
|
||||
+
|
||||
+ op = &stm_opcodes[opcode];
|
||||
+ reg = spiflash_wait_busy(priv);
|
||||
+ spiflash_write_reg(priv, SPI_FLASH_OPCODE,
|
||||
+ ((u32)op->code) | (addr << 8));
|
||||
+
|
||||
+ reg &= ~SPI_CTL_TX_RX_CNT_MASK;
|
||||
+ reg |= SPI_CTL_START | op->tx_cnt | (op->rx_cnt << 4);
|
||||
+
|
||||
+ spiflash_write_reg(priv, SPI_FLASH_CTL, reg);
|
||||
+ spiflash_wait_busy(priv);
|
||||
+
|
||||
+ if (!op->rx_cnt)
|
||||
+ return 0;
|
||||
+
|
||||
+ reg = spiflash_read_reg(priv, SPI_FLASH_DATA);
|
||||
+
|
||||
+ switch (op->rx_cnt) {
|
||||
+ case 1:
|
||||
+ mask = 0x000000ff;
|
||||
+ break;
|
||||
+ case 2:
|
||||
+ mask = 0x0000ffff;
|
||||
+ break;
|
||||
+ case 3:
|
||||
+ mask = 0x00ffffff;
|
||||
+ break;
|
||||
+ default:
|
||||
+ mask = 0xffffffff;
|
||||
+ break;
|
||||
+ }
|
||||
+ reg &= mask;
|
||||
+
|
||||
+ return reg;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * Probe SPI flash device
|
||||
+ * Function returns 0 for failure.
|
||||
+ * and flashconfig_tbl array index for success.
|
||||
+ */
|
||||
+static int
|
||||
+spiflash_probe_chip(struct platform_device *pdev, struct spiflash_priv *priv)
|
||||
+{
|
||||
+ u32 sig = spiflash_sendcmd(priv, SPI_RD_SIG, 0);
|
||||
+ int flash_size;
|
||||
+
|
||||
+ switch (sig) {
|
||||
+ case STM_8MBIT_SIGNATURE:
|
||||
+ flash_size = FLASH_1MB;
|
||||
+ break;
|
||||
+ case STM_16MBIT_SIGNATURE:
|
||||
+ flash_size = FLASH_2MB;
|
||||
+ break;
|
||||
+ case STM_32MBIT_SIGNATURE:
|
||||
+ flash_size = FLASH_4MB;
|
||||
+ break;
|
||||
+ case STM_64MBIT_SIGNATURE:
|
||||
+ flash_size = FLASH_8MB;
|
||||
+ break;
|
||||
+ case STM_128MBIT_SIGNATURE:
|
||||
+ flash_size = FLASH_16MB;
|
||||
+ break;
|
||||
+ default:
|
||||
+ dev_warn(&pdev->dev, "read of flash device signature failed!\n");
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ return flash_size;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+spiflash_wait_complete(struct spiflash_priv *priv, unsigned int timeout)
|
||||
+{
|
||||
+ busy_wait(priv, spiflash_sendcmd(priv, SPI_RD_STATUS, 0) &
|
||||
+ SPI_STATUS_WIP, timeout);
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+spiflash_erase(struct mtd_info *mtd, struct erase_info *instr)
|
||||
+{
|
||||
+ struct spiflash_priv *priv = to_spiflash(mtd);
|
||||
+ const struct opcodes *op;
|
||||
+ u32 temp, reg;
|
||||
+
|
||||
+ if (instr->addr + instr->len > mtd->size)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ mutex_lock(&priv->lock);
|
||||
+
|
||||
+ spiflash_sendcmd(priv, SPI_WRITE_ENABLE, 0);
|
||||
+ reg = spiflash_wait_busy(priv);
|
||||
+
|
||||
+ op = &stm_opcodes[SPI_SECTOR_ERASE];
|
||||
+ temp = ((u32)instr->addr << 8) | (u32)(op->code);
|
||||
+ spiflash_write_reg(priv, SPI_FLASH_OPCODE, temp);
|
||||
+
|
||||
+ reg &= ~SPI_CTL_TX_RX_CNT_MASK;
|
||||
+ reg |= op->tx_cnt | SPI_CTL_START;
|
||||
+ spiflash_write_reg(priv, SPI_FLASH_CTL, reg);
|
||||
+
|
||||
+ spiflash_wait_complete(priv, 20);
|
||||
+
|
||||
+ mutex_unlock(&priv->lock);
|
||||
+
|
||||
+ instr->state = MTD_ERASE_DONE;
|
||||
+ mtd_erase_callback(instr);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+spiflash_read(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen,
|
||||
+ u_char *buf)
|
||||
+{
|
||||
+ struct spiflash_priv *priv = to_spiflash(mtd);
|
||||
+
|
||||
+ if (!len)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (from + len > mtd->size)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ *retlen = len;
|
||||
+
|
||||
+ mutex_lock(&priv->lock);
|
||||
+
|
||||
+ memcpy_fromio(buf, priv->readaddr + from, len);
|
||||
+
|
||||
+ mutex_unlock(&priv->lock);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+spiflash_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen,
|
||||
+ const u8 *buf)
|
||||
+{
|
||||
+ struct spiflash_priv *priv = to_spiflash(mtd);
|
||||
+ u32 opcode, bytes_left;
|
||||
+
|
||||
+ *retlen = 0;
|
||||
+
|
||||
+ if (!len)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (to + len > mtd->size)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ bytes_left = len;
|
||||
+
|
||||
+ do {
|
||||
+ u32 read_len, reg, page_offset, spi_data = 0;
|
||||
+
|
||||
+ read_len = min(bytes_left, sizeof(u32));
|
||||
+
|
||||
+ /* 32-bit writes cannot span across a page boundary
|
||||
+ * (256 bytes). This types of writes require two page
|
||||
+ * program operations to handle it correctly. The STM part
|
||||
+ * will write the overflow data to the beginning of the
|
||||
+ * current page as opposed to the subsequent page.
|
||||
+ */
|
||||
+ page_offset = (to & (STM_PAGE_SIZE - 1)) + read_len;
|
||||
+
|
||||
+ if (page_offset > STM_PAGE_SIZE)
|
||||
+ read_len -= (page_offset - STM_PAGE_SIZE);
|
||||
+
|
||||
+ mutex_lock(&priv->lock);
|
||||
+
|
||||
+ spiflash_sendcmd(priv, SPI_WRITE_ENABLE, 0);
|
||||
+ spi_data = 0;
|
||||
+ switch (read_len) {
|
||||
+ case 4:
|
||||
+ spi_data |= buf[3] << 24;
|
||||
+ /* fall through */
|
||||
+ case 3:
|
||||
+ spi_data |= buf[2] << 16;
|
||||
+ /* fall through */
|
||||
+ case 2:
|
||||
+ spi_data |= buf[1] << 8;
|
||||
+ /* fall through */
|
||||
+ case 1:
|
||||
+ spi_data |= buf[0] & 0xff;
|
||||
+ break;
|
||||
+ default:
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ spiflash_write_reg(priv, SPI_FLASH_DATA, spi_data);
|
||||
+ opcode = stm_opcodes[SPI_PAGE_PROGRAM].code |
|
||||
+ (to & 0x00ffffff) << 8;
|
||||
+ spiflash_write_reg(priv, SPI_FLASH_OPCODE, opcode);
|
||||
+
|
||||
+ reg = spiflash_read_reg(priv, SPI_FLASH_CTL);
|
||||
+ reg &= ~SPI_CTL_TX_RX_CNT_MASK;
|
||||
+ reg |= (read_len + 4) | SPI_CTL_START;
|
||||
+ spiflash_write_reg(priv, SPI_FLASH_CTL, reg);
|
||||
+
|
||||
+ spiflash_wait_complete(priv, 1);
|
||||
+
|
||||
+ mutex_unlock(&priv->lock);
|
||||
+
|
||||
+ bytes_left -= read_len;
|
||||
+ to += read_len;
|
||||
+ buf += read_len;
|
||||
+
|
||||
+ *retlen += read_len;
|
||||
+ } while (bytes_left != 0);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#if defined CONFIG_MTD_REDBOOT_PARTS || CONFIG_MTD_MYLOADER_PARTS
|
||||
+static const char * const part_probe_types[] = {
|
||||
+ "cmdlinepart", "RedBoot", "MyLoader", NULL
|
||||
+};
|
||||
+#endif
|
||||
+
|
||||
+static int
|
||||
+spiflash_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct spiflash_priv *priv;
|
||||
+ struct mtd_info *mtd;
|
||||
+ struct resource *res;
|
||||
+ int index;
|
||||
+ int result = 0;
|
||||
+
|
||||
+ priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
|
||||
+ if (!priv)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ mutex_init(&priv->lock);
|
||||
+ mtd = &priv->mtd;
|
||||
+
|
||||
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||
+ priv->mmraddr = devm_ioremap_resource(&pdev->dev, res);
|
||||
+ if (IS_ERR(priv->mmraddr)) {
|
||||
+ dev_warn(&pdev->dev, "failed to map flash MMR\n");
|
||||
+ return PTR_ERR(priv->mmraddr);
|
||||
+ }
|
||||
+
|
||||
+ index = spiflash_probe_chip(pdev, priv);
|
||||
+ if (!index) {
|
||||
+ dev_warn(&pdev->dev, "found no flash device\n");
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
+ priv->readaddr = devm_ioremap_resource(&pdev->dev, res);
|
||||
+ if (IS_ERR(priv->readaddr)) {
|
||||
+ dev_warn(&pdev->dev, "failed to map flash read mem\n");
|
||||
+ return PTR_ERR(priv->readaddr);
|
||||
+ }
|
||||
+
|
||||
+ platform_set_drvdata(pdev, priv);
|
||||
+ mtd->name = "spiflash";
|
||||
+ mtd->type = MTD_NORFLASH;
|
||||
+ mtd->flags = (MTD_CAP_NORFLASH|MTD_WRITEABLE);
|
||||
+ mtd->size = flashconfig_tbl[index].byte_cnt;
|
||||
+ mtd->erasesize = flashconfig_tbl[index].sector_size;
|
||||
+ mtd->writesize = 1;
|
||||
+ mtd->numeraseregions = 0;
|
||||
+ mtd->eraseregions = NULL;
|
||||
+ mtd->_erase = spiflash_erase;
|
||||
+ mtd->_read = spiflash_read;
|
||||
+ mtd->_write = spiflash_write;
|
||||
+ mtd->owner = THIS_MODULE;
|
||||
+
|
||||
+ dev_info(&pdev->dev, "%lld Kbytes flash detected\n", mtd->size >> 10);
|
||||
+
|
||||
+#if defined CONFIG_MTD_REDBOOT_PARTS || CONFIG_MTD_MYLOADER_PARTS
|
||||
+ /* parse redboot partitions */
|
||||
+
|
||||
+ result = mtd_device_parse_register(mtd, part_probe_types,
|
||||
+ NULL, NULL, 0);
|
||||
+#endif
|
||||
+
|
||||
+ return result;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+spiflash_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct spiflash_priv *priv = platform_get_drvdata(pdev);
|
||||
+
|
||||
+ mtd_device_unregister(&priv->mtd);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct platform_driver spiflash_driver = {
|
||||
+ .driver.name = DRIVER_NAME,
|
||||
+ .probe = spiflash_probe,
|
||||
+ .remove = spiflash_remove,
|
||||
+};
|
||||
+
|
||||
+module_platform_driver(spiflash_driver);
|
||||
+
|
||||
+MODULE_LICENSE("GPL");
|
||||
+MODULE_AUTHOR("OpenWrt.org");
|
||||
+MODULE_AUTHOR("Atheros Communications Inc");
|
||||
+MODULE_DESCRIPTION("MTD driver for SPI Flash on Atheros AR2315+ SOC");
|
||||
+MODULE_ALIAS("platform:" DRIVER_NAME);
|
||||
+
|
||||
--- /dev/null
|
||||
+++ b/drivers/mtd/devices/ar2315_spiflash.h
|
||||
@@ -0,0 +1,106 @@
|
||||
+/*
|
||||
+ * Atheros AR2315 SPI Flash Memory support header file.
|
||||
+ *
|
||||
+ * Copyright (c) 2005, Atheros Communications Inc.
|
||||
+ * Copyright (C) 2006 FON Technology, SL.
|
||||
+ * Copyright (C) 2006 Imre Kaloz <kaloz@openwrt.org>
|
||||
+ * Copyright (C) 2006-2009 Felix Fietkau <nbd@nbd.name>
|
||||
+ *
|
||||
+ * This code is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ *
|
||||
+ */
|
||||
+#ifndef __AR2315_SPIFLASH_H
|
||||
+#define __AR2315_SPIFLASH_H
|
||||
+
|
||||
+#define STM_PAGE_SIZE 256
|
||||
+
|
||||
+#define SFI_WRITE_BUFFER_SIZE 4
|
||||
+#define SFI_FLASH_ADDR_MASK 0x00ffffff
|
||||
+
|
||||
+#define STM_8MBIT_SIGNATURE 0x13
|
||||
+#define STM_M25P80_BYTE_COUNT 1048576
|
||||
+#define STM_M25P80_SECTOR_COUNT 16
|
||||
+#define STM_M25P80_SECTOR_SIZE 0x10000
|
||||
+
|
||||
+#define STM_16MBIT_SIGNATURE 0x14
|
||||
+#define STM_M25P16_BYTE_COUNT 2097152
|
||||
+#define STM_M25P16_SECTOR_COUNT 32
|
||||
+#define STM_M25P16_SECTOR_SIZE 0x10000
|
||||
+
|
||||
+#define STM_32MBIT_SIGNATURE 0x15
|
||||
+#define STM_M25P32_BYTE_COUNT 4194304
|
||||
+#define STM_M25P32_SECTOR_COUNT 64
|
||||
+#define STM_M25P32_SECTOR_SIZE 0x10000
|
||||
+
|
||||
+#define STM_64MBIT_SIGNATURE 0x16
|
||||
+#define STM_M25P64_BYTE_COUNT 8388608
|
||||
+#define STM_M25P64_SECTOR_COUNT 128
|
||||
+#define STM_M25P64_SECTOR_SIZE 0x10000
|
||||
+
|
||||
+#define STM_128MBIT_SIGNATURE 0x17
|
||||
+#define STM_M25P128_BYTE_COUNT 16777216
|
||||
+#define STM_M25P128_SECTOR_COUNT 256
|
||||
+#define STM_M25P128_SECTOR_SIZE 0x10000
|
||||
+
|
||||
+#define STM_1MB_BYTE_COUNT STM_M25P80_BYTE_COUNT
|
||||
+#define STM_1MB_SECTOR_COUNT STM_M25P80_SECTOR_COUNT
|
||||
+#define STM_1MB_SECTOR_SIZE STM_M25P80_SECTOR_SIZE
|
||||
+#define STM_2MB_BYTE_COUNT STM_M25P16_BYTE_COUNT
|
||||
+#define STM_2MB_SECTOR_COUNT STM_M25P16_SECTOR_COUNT
|
||||
+#define STM_2MB_SECTOR_SIZE STM_M25P16_SECTOR_SIZE
|
||||
+#define STM_4MB_BYTE_COUNT STM_M25P32_BYTE_COUNT
|
||||
+#define STM_4MB_SECTOR_COUNT STM_M25P32_SECTOR_COUNT
|
||||
+#define STM_4MB_SECTOR_SIZE STM_M25P32_SECTOR_SIZE
|
||||
+#define STM_8MB_BYTE_COUNT STM_M25P64_BYTE_COUNT
|
||||
+#define STM_8MB_SECTOR_COUNT STM_M25P64_SECTOR_COUNT
|
||||
+#define STM_8MB_SECTOR_SIZE STM_M25P64_SECTOR_SIZE
|
||||
+#define STM_16MB_BYTE_COUNT STM_M25P128_BYTE_COUNT
|
||||
+#define STM_16MB_SECTOR_COUNT STM_M25P128_SECTOR_COUNT
|
||||
+#define STM_16MB_SECTOR_SIZE STM_M25P128_SECTOR_SIZE
|
||||
+
|
||||
+/*
|
||||
+ * ST Microelectronics Opcodes for Serial Flash
|
||||
+ */
|
||||
+
|
||||
+#define STM_OP_WR_ENABLE 0x06 /* Write Enable */
|
||||
+#define STM_OP_WR_DISABLE 0x04 /* Write Disable */
|
||||
+#define STM_OP_RD_STATUS 0x05 /* Read Status */
|
||||
+#define STM_OP_WR_STATUS 0x01 /* Write Status */
|
||||
+#define STM_OP_RD_DATA 0x03 /* Read Data */
|
||||
+#define STM_OP_FAST_RD_DATA 0x0b /* Fast Read Data */
|
||||
+#define STM_OP_PAGE_PGRM 0x02 /* Page Program */
|
||||
+#define STM_OP_SECTOR_ERASE 0xd8 /* Sector Erase */
|
||||
+#define STM_OP_BULK_ERASE 0xc7 /* Bulk Erase */
|
||||
+#define STM_OP_DEEP_PWRDOWN 0xb9 /* Deep Power-Down Mode */
|
||||
+#define STM_OP_RD_SIG 0xab /* Read Electronic Signature */
|
||||
+
|
||||
+#define STM_STATUS_WIP 0x01 /* Write-In-Progress */
|
||||
+#define STM_STATUS_WEL 0x02 /* Write Enable Latch */
|
||||
+#define STM_STATUS_BP0 0x04 /* Block Protect 0 */
|
||||
+#define STM_STATUS_BP1 0x08 /* Block Protect 1 */
|
||||
+#define STM_STATUS_BP2 0x10 /* Block Protect 2 */
|
||||
+#define STM_STATUS_SRWD 0x80 /* Status Register Write Disable */
|
||||
+
|
||||
+/*
|
||||
+ * SPI Flash Interface Registers
|
||||
+ */
|
||||
+
|
||||
+#define SPI_FLASH_CTL 0x00
|
||||
+#define SPI_FLASH_OPCODE 0x04
|
||||
+#define SPI_FLASH_DATA 0x08
|
||||
+
|
||||
+#define SPI_CTL_START 0x00000100
|
||||
+#define SPI_CTL_BUSY 0x00010000
|
||||
+#define SPI_CTL_TXCNT_MASK 0x0000000f
|
||||
+#define SPI_CTL_RXCNT_MASK 0x000000f0
|
||||
+#define SPI_CTL_TX_RX_CNT_MASK 0x000000ff
|
||||
+#define SPI_CTL_SIZE_MASK 0x00060000
|
||||
+
|
||||
+#define SPI_CTL_CLK_SEL_MASK 0x03000000
|
||||
+#define SPI_OPCODE_MASK 0x000000ff
|
||||
+
|
||||
+#define SPI_STATUS_WIP STM_STATUS_WIP
|
||||
+
|
||||
+#endif
|
||||
--- a/arch/mips/ath25/ar2315.c
|
||||
+++ b/arch/mips/ath25/ar2315.c
|
||||
@@ -220,6 +220,28 @@ static struct platform_device ar2315_gpi
|
||||
.num_resources = ARRAY_SIZE(ar2315_gpio_res)
|
||||
};
|
||||
|
||||
+static struct resource ar2315_spiflash_res[] = {
|
||||
+ {
|
||||
+ .name = "spiflash_read",
|
||||
+ .flags = IORESOURCE_MEM,
|
||||
+ .start = AR2315_SPI_READ_BASE,
|
||||
+ .end = AR2315_SPI_READ_BASE + AR2315_SPI_READ_SIZE - 1,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "spiflash_mmr",
|
||||
+ .flags = IORESOURCE_MEM,
|
||||
+ .start = AR2315_SPI_MMR_BASE,
|
||||
+ .end = AR2315_SPI_MMR_BASE + AR2315_SPI_MMR_SIZE - 1,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static struct platform_device ar2315_spiflash = {
|
||||
+ .id = 0,
|
||||
+ .name = "ar2315-spiflash",
|
||||
+ .resource = ar2315_spiflash_res,
|
||||
+ .num_resources = ARRAY_SIZE(ar2315_spiflash_res)
|
||||
+};
|
||||
+
|
||||
void __init ar2315_init_devices(void)
|
||||
{
|
||||
/* Find board configuration */
|
||||
@@ -230,6 +252,8 @@ void __init ar2315_init_devices(void)
|
||||
ar2315_gpio_res[1].end = ar2315_gpio_res[1].start;
|
||||
platform_device_register(&ar2315_gpio);
|
||||
|
||||
+ platform_device_register(&ar2315_spiflash);
|
||||
+
|
||||
ar2315_eth_data.macaddr = ath25_board.config->enet0_mac;
|
||||
ath25_add_ethernet(0, AR2315_ENET0_BASE, "eth0_mii",
|
||||
AR2315_ENET0_MII_BASE, AR2315_IRQ_ENET0,
|
@ -1,277 +0,0 @@
|
||||
--- /dev/null
|
||||
+++ b/drivers/watchdog/ar2315-wtd.c
|
||||
@@ -0,0 +1,209 @@
|
||||
+/*
|
||||
+ * 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; either version 2 of the License, or
|
||||
+ * (at your option) any later version.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU General Public License
|
||||
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
+ *
|
||||
+ * Copyright (C) 2008 John Crispin <blogic@openwrt.org>
|
||||
+ * Based on EP93xx and ifxmips wdt driver
|
||||
+ */
|
||||
+
|
||||
+#include <linux/interrupt.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/moduleparam.h>
|
||||
+#include <linux/types.h>
|
||||
+#include <linux/miscdevice.h>
|
||||
+#include <linux/watchdog.h>
|
||||
+#include <linux/fs.h>
|
||||
+#include <linux/ioport.h>
|
||||
+#include <linux/notifier.h>
|
||||
+#include <linux/reboot.h>
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/uaccess.h>
|
||||
+
|
||||
+#define DRIVER_NAME "ar2315-wdt"
|
||||
+
|
||||
+#define CLOCK_RATE 40000000
|
||||
+#define HEARTBEAT(x) (x < 1 || x > 90 ? 20 : x)
|
||||
+
|
||||
+#define WDT_REG_TIMER 0x00
|
||||
+#define WDT_REG_CTRL 0x04
|
||||
+
|
||||
+#define WDT_CTRL_ACT_NONE 0x00000000 /* No action */
|
||||
+#define WDT_CTRL_ACT_NMI 0x00000001 /* NMI on watchdog */
|
||||
+#define WDT_CTRL_ACT_RESET 0x00000002 /* reset on watchdog */
|
||||
+
|
||||
+static int wdt_timeout = 20;
|
||||
+static int started;
|
||||
+static int in_use;
|
||||
+static void __iomem *wdt_base;
|
||||
+
|
||||
+static inline void ar2315_wdt_wr(unsigned reg, u32 val)
|
||||
+{
|
||||
+ iowrite32(val, wdt_base + reg);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+ar2315_wdt_enable(void)
|
||||
+{
|
||||
+ ar2315_wdt_wr(WDT_REG_TIMER, wdt_timeout * CLOCK_RATE);
|
||||
+}
|
||||
+
|
||||
+static ssize_t
|
||||
+ar2315_wdt_write(struct file *file, const char __user *data, size_t len,
|
||||
+ loff_t *ppos)
|
||||
+{
|
||||
+ if (len)
|
||||
+ ar2315_wdt_enable();
|
||||
+ return len;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+ar2315_wdt_open(struct inode *inode, struct file *file)
|
||||
+{
|
||||
+ if (in_use)
|
||||
+ return -EBUSY;
|
||||
+ ar2315_wdt_enable();
|
||||
+ in_use = 1;
|
||||
+ started = 1;
|
||||
+ return nonseekable_open(inode, file);
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+ar2315_wdt_release(struct inode *inode, struct file *file)
|
||||
+{
|
||||
+ in_use = 0;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static irqreturn_t
|
||||
+ar2315_wdt_interrupt(int irq, void *dev)
|
||||
+{
|
||||
+ struct platform_device *pdev = (struct platform_device *)dev;
|
||||
+
|
||||
+ if (started) {
|
||||
+ dev_crit(&pdev->dev, "watchdog expired, rebooting system\n");
|
||||
+ emergency_restart();
|
||||
+ } else {
|
||||
+ ar2315_wdt_wr(WDT_REG_CTRL, 0);
|
||||
+ ar2315_wdt_wr(WDT_REG_TIMER, 0);
|
||||
+ }
|
||||
+ return IRQ_HANDLED;
|
||||
+}
|
||||
+
|
||||
+static struct watchdog_info ident = {
|
||||
+ .options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING,
|
||||
+ .identity = "ar2315 Watchdog",
|
||||
+};
|
||||
+
|
||||
+static long
|
||||
+ar2315_wdt_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
+{
|
||||
+ int new_wdt_timeout;
|
||||
+ int ret = -ENOIOCTLCMD;
|
||||
+
|
||||
+ switch (cmd) {
|
||||
+ case WDIOC_GETSUPPORT:
|
||||
+ ret = copy_to_user((void __user *)arg, &ident, sizeof(ident)) ?
|
||||
+ -EFAULT : 0;
|
||||
+ break;
|
||||
+ case WDIOC_KEEPALIVE:
|
||||
+ ar2315_wdt_enable();
|
||||
+ ret = 0;
|
||||
+ break;
|
||||
+ case WDIOC_SETTIMEOUT:
|
||||
+ ret = get_user(new_wdt_timeout, (int __user *)arg);
|
||||
+ if (ret)
|
||||
+ break;
|
||||
+ wdt_timeout = HEARTBEAT(new_wdt_timeout);
|
||||
+ ar2315_wdt_enable();
|
||||
+ break;
|
||||
+ case WDIOC_GETTIMEOUT:
|
||||
+ ret = put_user(wdt_timeout, (int __user *)arg);
|
||||
+ break;
|
||||
+ }
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static const struct file_operations ar2315_wdt_fops = {
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .llseek = no_llseek,
|
||||
+ .write = ar2315_wdt_write,
|
||||
+ .unlocked_ioctl = ar2315_wdt_ioctl,
|
||||
+ .open = ar2315_wdt_open,
|
||||
+ .release = ar2315_wdt_release,
|
||||
+};
|
||||
+
|
||||
+static struct miscdevice ar2315_wdt_miscdev = {
|
||||
+ .minor = WATCHDOG_MINOR,
|
||||
+ .name = "watchdog",
|
||||
+ .fops = &ar2315_wdt_fops,
|
||||
+};
|
||||
+
|
||||
+static int
|
||||
+ar2315_wdt_probe(struct platform_device *dev)
|
||||
+{
|
||||
+ struct resource *mem_res, *irq_res;
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ if (wdt_base)
|
||||
+ return -EBUSY;
|
||||
+
|
||||
+ irq_res = platform_get_resource(dev, IORESOURCE_IRQ, 0);
|
||||
+ if (!irq_res) {
|
||||
+ dev_err(&dev->dev, "no IRQ resource\n");
|
||||
+ return -ENOENT;
|
||||
+ }
|
||||
+
|
||||
+ mem_res = platform_get_resource(dev, IORESOURCE_MEM, 0);
|
||||
+ wdt_base = devm_ioremap_resource(&dev->dev, mem_res);
|
||||
+ if (IS_ERR(wdt_base))
|
||||
+ return PTR_ERR(wdt_base);
|
||||
+
|
||||
+ ret = devm_request_irq(&dev->dev, irq_res->start, ar2315_wdt_interrupt,
|
||||
+ 0, DRIVER_NAME, dev);
|
||||
+ if (ret) {
|
||||
+ dev_err(&dev->dev, "failed to register inetrrupt\n");
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ ret = misc_register(&ar2315_wdt_miscdev);
|
||||
+ if (ret)
|
||||
+ dev_err(&dev->dev, "failed to register miscdev\n");
|
||||
+
|
||||
+out:
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+ar2315_wdt_remove(struct platform_device *dev)
|
||||
+{
|
||||
+ misc_deregister(&ar2315_wdt_miscdev);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct platform_driver ar2315_wdt_driver = {
|
||||
+ .probe = ar2315_wdt_probe,
|
||||
+ .remove = ar2315_wdt_remove,
|
||||
+ .driver = {
|
||||
+ .name = DRIVER_NAME,
|
||||
+ .owner = THIS_MODULE,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+module_platform_driver(ar2315_wdt_driver);
|
||||
+
|
||||
+MODULE_DESCRIPTION("Atheros AR2315 hardware watchdog driver");
|
||||
+MODULE_AUTHOR("John Crispin <blogic@openwrt.org>");
|
||||
+MODULE_LICENSE("GPL");
|
||||
+MODULE_ALIAS("platform:" DRIVER_NAME);
|
||||
--- a/drivers/watchdog/Kconfig
|
||||
+++ b/drivers/watchdog/Kconfig
|
||||
@@ -1647,6 +1647,13 @@ config PIC32_DMT
|
||||
To compile this driver as a loadable module, choose M here.
|
||||
The module will be called pic32-dmt.
|
||||
|
||||
+config AR2315_WDT
|
||||
+ tristate "Atheros AR2315+ WiSoCs Watchdog Timer"
|
||||
+ depends on ATH25
|
||||
+ help
|
||||
+ Hardware driver for the built-in watchdog timer on the Atheros
|
||||
+ AR2315/AR2316 WiSoCs.
|
||||
+
|
||||
# PARISC Architecture
|
||||
|
||||
# POWERPC Architecture
|
||||
--- a/drivers/watchdog/Makefile
|
||||
+++ b/drivers/watchdog/Makefile
|
||||
@@ -166,6 +166,7 @@ obj-$(CONFIG_WDT_MTX1) += mtx-1_wdt.o
|
||||
obj-$(CONFIG_PNX833X_WDT) += pnx833x_wdt.o
|
||||
obj-$(CONFIG_SIBYTE_WDOG) += sb_wdog.o
|
||||
obj-$(CONFIG_AR7_WDT) += ar7_wdt.o
|
||||
+obj-$(CONFIG_AR2315_WDT) += ar2315-wtd.o
|
||||
obj-$(CONFIG_TXX9_WDT) += txx9wdt.o
|
||||
obj-$(CONFIG_OCTEON_WDT) += octeon-wdt.o
|
||||
octeon-wdt-y := octeon-wdt-main.o octeon-wdt-nmi.o
|
||||
--- a/arch/mips/ath25/ar2315.c
|
||||
+++ b/arch/mips/ath25/ar2315.c
|
||||
@@ -220,6 +220,24 @@ static struct platform_device ar2315_gpi
|
||||
.num_resources = ARRAY_SIZE(ar2315_gpio_res)
|
||||
};
|
||||
|
||||
+static struct resource ar2315_wdt_res[] = {
|
||||
+ {
|
||||
+ .flags = IORESOURCE_MEM,
|
||||
+ .start = AR2315_RST_BASE + AR2315_WDT_TIMER,
|
||||
+ .end = AR2315_RST_BASE + AR2315_WDT_TIMER + 8 - 1,
|
||||
+ },
|
||||
+ {
|
||||
+ .flags = IORESOURCE_IRQ,
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
+static struct platform_device ar2315_wdt = {
|
||||
+ .id = 0,
|
||||
+ .name = "ar2315-wdt",
|
||||
+ .resource = ar2315_wdt_res,
|
||||
+ .num_resources = ARRAY_SIZE(ar2315_wdt_res)
|
||||
+};
|
||||
+
|
||||
static struct resource ar2315_spiflash_res[] = {
|
||||
{
|
||||
.name = "spiflash_read",
|
||||
@@ -252,6 +270,11 @@ void __init ar2315_init_devices(void)
|
||||
ar2315_gpio_res[1].end = ar2315_gpio_res[1].start;
|
||||
platform_device_register(&ar2315_gpio);
|
||||
|
||||
+ ar2315_wdt_res[1].start = irq_create_mapping(ar2315_misc_irq_domain,
|
||||
+ AR2315_MISC_IRQ_WATCHDOG);
|
||||
+ ar2315_wdt_res[1].end = ar2315_wdt_res[1].start;
|
||||
+ platform_device_register(&ar2315_wdt);
|
||||
+
|
||||
platform_device_register(&ar2315_spiflash);
|
||||
|
||||
ar2315_eth_data.macaddr = ath25_board.config->enet0_mac;
|
@ -1,60 +0,0 @@
|
||||
--- a/drivers/mtd/redboot.c
|
||||
+++ b/drivers/mtd/redboot.c
|
||||
@@ -30,6 +30,8 @@
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
+#define BOARD_CONFIG_PART "boardconfig"
|
||||
+
|
||||
struct fis_image_desc {
|
||||
unsigned char name[16]; // Null terminated name
|
||||
uint32_t flash_base; // Address within FLASH of image
|
||||
@@ -60,6 +62,7 @@ static int parse_redboot_partitions(stru
|
||||
const struct mtd_partition **pparts,
|
||||
struct mtd_part_parser_data *data)
|
||||
{
|
||||
+ unsigned long max_offset = 0;
|
||||
int nrparts = 0;
|
||||
struct fis_image_desc *buf;
|
||||
struct mtd_partition *parts;
|
||||
@@ -225,14 +228,15 @@ static int parse_redboot_partitions(stru
|
||||
}
|
||||
}
|
||||
#endif
|
||||
- parts = kzalloc(sizeof(*parts)*nrparts + nulllen + namelen, GFP_KERNEL);
|
||||
+ parts = kzalloc(sizeof(*parts) * (nrparts + 1) + nulllen + namelen +
|
||||
+ sizeof(BOARD_CONFIG_PART), GFP_KERNEL);
|
||||
|
||||
if (!parts) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
- nullname = (char *)&parts[nrparts];
|
||||
+ nullname = (char *)&parts[nrparts + 1];
|
||||
#ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED
|
||||
if (nulllen > 0) {
|
||||
strcpy(nullname, nullstring);
|
||||
@@ -251,6 +255,8 @@ static int parse_redboot_partitions(stru
|
||||
}
|
||||
#endif
|
||||
for ( ; i<nrparts; i++) {
|
||||
+ if (max_offset < buf[i].flash_base + buf[i].size)
|
||||
+ max_offset = buf[i].flash_base + buf[i].size;
|
||||
parts[i].size = fl->img->size;
|
||||
parts[i].offset = fl->img->flash_base;
|
||||
parts[i].name = names;
|
||||
@@ -284,6 +290,13 @@ static int parse_redboot_partitions(stru
|
||||
fl = fl->next;
|
||||
kfree(tmp_fl);
|
||||
}
|
||||
+ if (master->size - max_offset >= master->erasesize) {
|
||||
+ parts[nrparts].size = master->size - max_offset;
|
||||
+ parts[nrparts].offset = max_offset;
|
||||
+ parts[nrparts].name = names;
|
||||
+ strcpy(names, BOARD_CONFIG_PART);
|
||||
+ nrparts++;
|
||||
+ }
|
||||
ret = nrparts;
|
||||
*pparts = parts;
|
||||
out:
|
@ -1,44 +0,0 @@
|
||||
--- a/drivers/mtd/redboot.c
|
||||
+++ b/drivers/mtd/redboot.c
|
||||
@@ -79,12 +79,18 @@ static int parse_redboot_partitions(stru
|
||||
static char nullstring[] = "unallocated";
|
||||
#endif
|
||||
|
||||
+ buf = vmalloc(master->erasesize);
|
||||
+ if (!buf)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ restart:
|
||||
if ( directory < 0 ) {
|
||||
offset = master->size + directory * master->erasesize;
|
||||
while (mtd_block_isbad(master, offset)) {
|
||||
if (!offset) {
|
||||
nogood:
|
||||
printk(KERN_NOTICE "Failed to find a non-bad block to check for RedBoot partition table\n");
|
||||
+ vfree(buf);
|
||||
return -EIO;
|
||||
}
|
||||
offset -= master->erasesize;
|
||||
@@ -97,10 +103,6 @@ static int parse_redboot_partitions(stru
|
||||
goto nogood;
|
||||
}
|
||||
}
|
||||
- buf = vmalloc(master->erasesize);
|
||||
-
|
||||
- if (!buf)
|
||||
- return -ENOMEM;
|
||||
|
||||
printk(KERN_NOTICE "Searching for RedBoot partition table in %s at offset 0x%lx\n",
|
||||
master->name, offset);
|
||||
@@ -173,6 +175,11 @@ static int parse_redboot_partitions(stru
|
||||
}
|
||||
if (i == numslots) {
|
||||
/* Didn't find it */
|
||||
+ if (offset + master->erasesize < master->size) {
|
||||
+ /* not at the end of the flash yet, maybe next block */
|
||||
+ directory++;
|
||||
+ goto restart;
|
||||
+ }
|
||||
printk(KERN_NOTICE "No RedBoot partition table detected in %s\n",
|
||||
master->name);
|
||||
ret = 0;
|
@ -1,72 +0,0 @@
|
||||
--- a/drivers/mtd/redboot.c
|
||||
+++ b/drivers/mtd/redboot.c
|
||||
@@ -58,6 +58,22 @@ static inline int redboot_checksum(struc
|
||||
return 1;
|
||||
}
|
||||
|
||||
+static uint32_t mtd_get_offset_erasesize(struct mtd_info *mtd, uint64_t offset)
|
||||
+{
|
||||
+ struct mtd_erase_region_info *regions = mtd->eraseregions;
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < mtd->numeraseregions; i++) {
|
||||
+ if (regions[i].offset +
|
||||
+ regions[i].numblocks * regions[i].erasesize <= offset)
|
||||
+ continue;
|
||||
+
|
||||
+ return regions[i].erasesize;
|
||||
+ }
|
||||
+
|
||||
+ return mtd->erasesize;
|
||||
+}
|
||||
+
|
||||
static int parse_redboot_partitions(struct mtd_info *master,
|
||||
const struct mtd_partition **pparts,
|
||||
struct mtd_part_parser_data *data)
|
||||
@@ -74,6 +90,7 @@ static int parse_redboot_partitions(stru
|
||||
int namelen = 0;
|
||||
int nulllen = 0;
|
||||
int numslots;
|
||||
+ int first_slot;
|
||||
unsigned long offset;
|
||||
#ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED
|
||||
static char nullstring[] = "unallocated";
|
||||
@@ -186,7 +203,10 @@ static int parse_redboot_partitions(stru
|
||||
goto out;
|
||||
}
|
||||
|
||||
- for (i = 0; i < numslots; i++) {
|
||||
+ first_slot = (buf[i].flash_base & (master->erasesize - 1)) /
|
||||
+ sizeof(struct fis_image_desc);
|
||||
+
|
||||
+ for (i = first_slot; i < first_slot + numslots; i++) {
|
||||
struct fis_list *new_fl, **prev;
|
||||
|
||||
if (buf[i].name[0] == 0xff) {
|
||||
@@ -262,12 +282,13 @@ static int parse_redboot_partitions(stru
|
||||
}
|
||||
#endif
|
||||
for ( ; i<nrparts; i++) {
|
||||
- if (max_offset < buf[i].flash_base + buf[i].size)
|
||||
- max_offset = buf[i].flash_base + buf[i].size;
|
||||
parts[i].size = fl->img->size;
|
||||
parts[i].offset = fl->img->flash_base;
|
||||
parts[i].name = names;
|
||||
|
||||
+ if (max_offset < parts[i].offset + parts[i].size)
|
||||
+ max_offset = parts[i].offset + parts[i].size;
|
||||
+
|
||||
strcpy(names, fl->img->name);
|
||||
#ifdef CONFIG_MTD_REDBOOT_PARTS_READONLY
|
||||
if (!memcmp(names, "RedBoot", 8) ||
|
||||
@@ -297,7 +318,9 @@ static int parse_redboot_partitions(stru
|
||||
fl = fl->next;
|
||||
kfree(tmp_fl);
|
||||
}
|
||||
- if (master->size - max_offset >= master->erasesize) {
|
||||
+
|
||||
+ if (master->size - max_offset >=
|
||||
+ mtd_get_offset_erasesize(master, max_offset)) {
|
||||
parts[nrparts].size = master->size - max_offset;
|
||||
parts[nrparts].offset = max_offset;
|
||||
parts[nrparts].name = names;
|
@ -1,71 +0,0 @@
|
||||
--- a/arch/mips/ath25/Makefile
|
||||
+++ b/arch/mips/ath25/Makefile
|
||||
@@ -8,7 +8,7 @@
|
||||
# Copyright (C) 2006-2009 Felix Fietkau <nbd@openwrt.org>
|
||||
#
|
||||
|
||||
-obj-y += board.o prom.o devices.o
|
||||
+obj-y += board.o prom.o devices.o reset.o
|
||||
|
||||
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
|
||||
|
||||
--- /dev/null
|
||||
+++ b/arch/mips/ath25/reset.c
|
||||
@@ -0,0 +1,57 @@
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/gpio_keys.h>
|
||||
+#include <linux/input.h>
|
||||
+#include <ath25_platform.h>
|
||||
+#include "devices.h"
|
||||
+
|
||||
+static int __init
|
||||
+ar231x_init_reset(void)
|
||||
+{
|
||||
+ struct platform_device *pdev;
|
||||
+ struct gpio_keys_platform_data pdata;
|
||||
+ struct gpio_keys_button *p;
|
||||
+ int err;
|
||||
+
|
||||
+ if (ath25_board.config->reset_config_gpio == 0xffff)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ p = kzalloc(sizeof(*p), GFP_KERNEL);
|
||||
+ if (!p)
|
||||
+ goto err;
|
||||
+
|
||||
+ p->desc = "reset";
|
||||
+ p->type = EV_KEY;
|
||||
+ p->code = KEY_RESTART;
|
||||
+ p->debounce_interval = 60;
|
||||
+ p->gpio = ath25_board.config->reset_config_gpio;
|
||||
+
|
||||
+ memset(&pdata, 0, sizeof(pdata));
|
||||
+ pdata.poll_interval = 20;
|
||||
+ pdata.buttons = p;
|
||||
+ pdata.nbuttons = 1;
|
||||
+
|
||||
+ pdev = platform_device_alloc("gpio-keys-polled", 0);
|
||||
+ if (!pdev)
|
||||
+ goto err_free;
|
||||
+
|
||||
+ err = platform_device_add_data(pdev, &pdata, sizeof(pdata));
|
||||
+ if (err)
|
||||
+ goto err_put_pdev;
|
||||
+
|
||||
+ err = platform_device_add(pdev);
|
||||
+ if (err)
|
||||
+ goto err_put_pdev;
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+err_put_pdev:
|
||||
+ platform_device_put(pdev);
|
||||
+err_free:
|
||||
+ kfree(p);
|
||||
+err:
|
||||
+ return -ENOMEM;
|
||||
+}
|
||||
+
|
||||
+device_initcall(ar231x_init_reset);
|
@ -1,111 +0,0 @@
|
||||
--- a/drivers/net/ethernet/atheros/ar231x/ar231x.c
|
||||
+++ b/drivers/net/ethernet/atheros/ar231x/ar231x.c
|
||||
@@ -135,6 +135,7 @@ static int ar231x_mdiobus_write(struct m
|
||||
static int ar231x_mdiobus_reset(struct mii_bus *bus);
|
||||
static int ar231x_mdiobus_probe(struct net_device *dev);
|
||||
static void ar231x_adjust_link(struct net_device *dev);
|
||||
+static bool no_phy;
|
||||
|
||||
#ifndef ERR
|
||||
#define ERR(fmt, args...) printk("%s: " fmt, __func__, ##args)
|
||||
@@ -167,6 +168,32 @@ static const struct net_device_ops ar231
|
||||
#endif
|
||||
};
|
||||
|
||||
+static int get_phy_id(struct mii_bus *bus, int addr, u32 *phy_id)
|
||||
+{
|
||||
+ int phy_reg;
|
||||
+
|
||||
+ /**
|
||||
+ * Grab the bits from PHYIR1, and put them
|
||||
+ * in the upper half.
|
||||
+ */
|
||||
+ phy_reg = mdiobus_read(bus, addr, MII_PHYSID1);
|
||||
+
|
||||
+ if (phy_reg < 0)
|
||||
+ return -EIO;
|
||||
+
|
||||
+ *phy_id = (phy_reg & 0xffff) << 16;
|
||||
+
|
||||
+ /* Grab the bits from PHYIR2, and put them in the lower half */
|
||||
+ phy_reg = mdiobus_read(bus, addr, MII_PHYSID2);
|
||||
+
|
||||
+ if (phy_reg < 0)
|
||||
+ return -EIO;
|
||||
+
|
||||
+ *phy_id |= (phy_reg & 0xffff);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int ar231x_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct net_device *dev;
|
||||
@@ -273,6 +300,24 @@ static int ar231x_probe(struct platform_
|
||||
|
||||
mdiobus_register(sp->mii_bus);
|
||||
|
||||
+ /**
|
||||
+ * Workaround for Micrel switch, which is only available on
|
||||
+ * one PHY and cannot be configured through MDIO.
|
||||
+ */
|
||||
+ if (!no_phy) {
|
||||
+ u32 phy_id = 0;
|
||||
+
|
||||
+ get_phy_id(sp->mii_bus, 1, &phy_id);
|
||||
+ if (phy_id == 0x00221450)
|
||||
+ no_phy = true;
|
||||
+ }
|
||||
+ if (no_phy) {
|
||||
+ sp->link = 1;
|
||||
+ netif_carrier_on(dev);
|
||||
+ return 0;
|
||||
+ }
|
||||
+ no_phy = true;
|
||||
+
|
||||
if (ar231x_mdiobus_probe(dev) != 0) {
|
||||
printk(KERN_ERR "%s: mdiobus_probe failed\n", dev->name);
|
||||
rx_tasklet_cleanup(dev);
|
||||
@@ -326,8 +371,10 @@ static int ar231x_remove(struct platform
|
||||
rx_tasklet_cleanup(dev);
|
||||
ar231x_init_cleanup(dev);
|
||||
unregister_netdev(dev);
|
||||
- mdiobus_unregister(sp->mii_bus);
|
||||
- mdiobus_free(sp->mii_bus);
|
||||
+ if (sp->mii_bus) {
|
||||
+ mdiobus_unregister(sp->mii_bus);
|
||||
+ mdiobus_free(sp->mii_bus);
|
||||
+ }
|
||||
kfree(dev);
|
||||
return 0;
|
||||
}
|
||||
@@ -870,7 +917,8 @@ static int ar231x_open(struct net_device
|
||||
|
||||
sp->eth_regs->mac_control |= MAC_CONTROL_RE;
|
||||
|
||||
- phy_start(sp->phy_dev);
|
||||
+ if (sp->phy_dev)
|
||||
+ phy_start(sp->phy_dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -951,7 +999,8 @@ static int ar231x_close(struct net_devic
|
||||
|
||||
#endif
|
||||
|
||||
- phy_stop(sp->phy_dev);
|
||||
+ if (sp->phy_dev)
|
||||
+ phy_stop(sp->phy_dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -995,6 +1044,9 @@ static int ar231x_ioctl(struct net_devic
|
||||
{
|
||||
struct ar231x_private *sp = netdev_priv(dev);
|
||||
|
||||
+ if (!sp->phy_dev)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
switch (cmd) {
|
||||
case SIOCGMIIPHY:
|
||||
case SIOCGMIIREG:
|
@ -1,116 +0,0 @@
|
||||
--- a/arch/mips/ath25/ar2315.c
|
||||
+++ b/arch/mips/ath25/ar2315.c
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/gpio.h>
|
||||
+#include <linux/leds.h>
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/reboot.h>
|
||||
#include <asm/time.h>
|
||||
@@ -260,6 +261,50 @@ static struct platform_device ar2315_spi
|
||||
.num_resources = ARRAY_SIZE(ar2315_spiflash_res)
|
||||
};
|
||||
|
||||
+#ifdef CONFIG_LEDS_GPIO
|
||||
+static struct gpio_led ar2315_leds[6];
|
||||
+static struct gpio_led_platform_data ar2315_led_data = {
|
||||
+ .leds = (void *)ar2315_leds,
|
||||
+};
|
||||
+
|
||||
+static struct platform_device ar2315_gpio_leds = {
|
||||
+ .name = "leds-gpio",
|
||||
+ .id = -1,
|
||||
+ .dev = {
|
||||
+ .platform_data = (void *)&ar2315_led_data,
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
+static void __init ar2315_init_gpio_leds(void)
|
||||
+{
|
||||
+ static char led_names[6][6];
|
||||
+ int i, led = 0;
|
||||
+
|
||||
+ ar2315_led_data.num_leds = 0;
|
||||
+ for (i = 1; i < 8; i++) {
|
||||
+ if ((i == AR2315_RESET_GPIO) ||
|
||||
+ (i == ath25_board.config->reset_config_gpio))
|
||||
+ continue;
|
||||
+
|
||||
+ if (i == ath25_board.config->sys_led_gpio)
|
||||
+ strcpy(led_names[led], "wlan");
|
||||
+ else
|
||||
+ sprintf(led_names[led], "gpio%d", i);
|
||||
+
|
||||
+ ar2315_leds[led].name = led_names[led];
|
||||
+ ar2315_leds[led].gpio = i;
|
||||
+ ar2315_leds[led].active_low = 0;
|
||||
+ led++;
|
||||
+ }
|
||||
+ ar2315_led_data.num_leds = led;
|
||||
+ platform_device_register(&ar2315_gpio_leds);
|
||||
+}
|
||||
+#else
|
||||
+static inline void ar2315_init_gpio_leds(void)
|
||||
+{
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
void __init ar2315_init_devices(void)
|
||||
{
|
||||
/* Find board configuration */
|
||||
@@ -270,6 +315,8 @@ void __init ar2315_init_devices(void)
|
||||
ar2315_gpio_res[1].end = ar2315_gpio_res[1].start;
|
||||
platform_device_register(&ar2315_gpio);
|
||||
|
||||
+ ar2315_init_gpio_leds();
|
||||
+
|
||||
ar2315_wdt_res[1].start = irq_create_mapping(ar2315_misc_irq_domain,
|
||||
AR2315_MISC_IRQ_WATCHDOG);
|
||||
ar2315_wdt_res[1].end = ar2315_wdt_res[1].start;
|
||||
--- a/arch/mips/ath25/ar5312.c
|
||||
+++ b/arch/mips/ath25/ar5312.c
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/gpio.h>
|
||||
+#include <linux/leds.h>
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/reboot.h>
|
||||
#include <asm/time.h>
|
||||
@@ -231,6 +232,23 @@ static struct platform_device ar5312_gpi
|
||||
.num_resources = ARRAY_SIZE(ar5312_gpio_res),
|
||||
};
|
||||
|
||||
+#ifdef CONFIG_LEDS_GPIO
|
||||
+static struct gpio_led ar5312_leds[] = {
|
||||
+ { .name = "wlan", .gpio = 0, .active_low = 1, },
|
||||
+};
|
||||
+
|
||||
+static const struct gpio_led_platform_data ar5312_led_data = {
|
||||
+ .num_leds = ARRAY_SIZE(ar5312_leds),
|
||||
+ .leds = (void *)ar5312_leds,
|
||||
+};
|
||||
+
|
||||
+static struct platform_device ar5312_gpio_leds = {
|
||||
+ .name = "leds-gpio",
|
||||
+ .id = -1,
|
||||
+ .dev.platform_data = (void *)&ar5312_led_data,
|
||||
+};
|
||||
+#endif
|
||||
+
|
||||
static void __init ar5312_flash_init(void)
|
||||
{
|
||||
void __iomem *flashctl_base;
|
||||
@@ -301,6 +319,11 @@ void __init ar5312_init_devices(void)
|
||||
|
||||
platform_device_register(&ar5312_gpio);
|
||||
|
||||
+#ifdef CONFIG_LEDS_GPIO
|
||||
+ ar5312_leds[0].gpio = config->sys_led_gpio;
|
||||
+ platform_device_register(&ar5312_gpio_leds);
|
||||
+#endif
|
||||
+
|
||||
/* Fix up MAC addresses if necessary */
|
||||
if (is_broadcast_ether_addr(config->enet0_mac))
|
||||
ether_addr_copy(config->enet0_mac, config->enet1_mac);
|
@ -1,16 +0,0 @@
|
||||
#
|
||||
# Copyright (C) 2011 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
define Profile/Default
|
||||
NAME:=Default Profile
|
||||
PRIORITY:=1
|
||||
endef
|
||||
|
||||
define Profile/Default/Description
|
||||
Default package set compatible with most boards.
|
||||
endef
|
||||
$(eval $(call Profile,Default))
|
@ -1,30 +0,0 @@
|
||||
From 13b1ecc3401653a355798eb1dee10cc1608202f4 Mon Sep 17 00:00:00 2001
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Mon, 18 Jan 2016 12:27:49 +0100
|
||||
Subject: [PATCH 33/34] Kbuild: don't hardcode path to awk in
|
||||
scripts/ld-version.sh
|
||||
|
||||
On some systems /usr/bin/awk does not exist, or is broken. Find it via
|
||||
$PATH instead.
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
---
|
||||
scripts/ld-version.sh | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/scripts/ld-version.sh
|
||||
+++ b/scripts/ld-version.sh
|
||||
@@ -1,6 +1,7 @@
|
||||
-#!/usr/bin/awk -f
|
||||
+#!/bin/sh
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# extract linker version number from stdin and turn into single number
|
||||
+exec awk '
|
||||
{
|
||||
gsub(".*\\)", "");
|
||||
gsub(".*version ", "");
|
||||
@@ -9,3 +10,4 @@
|
||||
print a[1]*100000000 + a[2]*1000000 + a[3]*10000;
|
||||
exit
|
||||
}
|
||||
+'
|
@ -1,23 +0,0 @@
|
||||
From 173019b66dcc9d68ad9333aa744dad1e369b5aa8 Mon Sep 17 00:00:00 2001
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Sun, 9 Jul 2017 00:26:53 +0200
|
||||
Subject: [PATCH 34/34] kernel: add compile fix for linux 4.9 on x86
|
||||
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
---
|
||||
Makefile | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -429,8 +429,8 @@ KBUILD_LDFLAGS_MODULE := -T $(srctree)/s
|
||||
GCC_PLUGINS_CFLAGS :=
|
||||
CLANG_FLAGS :=
|
||||
|
||||
-export ARCH SRCARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC
|
||||
-export CPP AR NM STRIP OBJCOPY OBJDUMP HOSTLDFLAGS HOST_LOADLIBES
|
||||
+export ARCH SRCARCH SUBARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD
|
||||
+export CC CPP AR NM STRIP OBJCOPY OBJDUMP HOSTLDFLAGS HOST_LOADLIBES
|
||||
export MAKE AWK GENKSYMS INSTALLKERNEL PERL PYTHON UTS_MACHINE
|
||||
export HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS
|
||||
|
@ -1,142 +0,0 @@
|
||||
From: Arnd Bergmann <arnd@arndb.de>
|
||||
Date: Tue, 19 Jun 2018 13:14:56 -0700
|
||||
Subject: [PATCH] kbuild: add macro for controlling warnings to
|
||||
linux/compiler.h
|
||||
|
||||
I have occasionally run into a situation where it would make sense to
|
||||
control a compiler warning from a source file rather than doing so from
|
||||
a Makefile using the $(cc-disable-warning, ...) or $(cc-option, ...)
|
||||
helpers.
|
||||
|
||||
The approach here is similar to what glibc uses, using __diag() and
|
||||
related macros to encapsulate a _Pragma("GCC diagnostic ...") statement
|
||||
that gets turned into the respective "#pragma GCC diagnostic ..." by
|
||||
the preprocessor when the macro gets expanded.
|
||||
|
||||
Like glibc, I also have an argument to pass the affected compiler
|
||||
version, but decided to actually evaluate that one. For now, this
|
||||
supports GCC_4_6, GCC_4_7, GCC_4_8, GCC_4_9, GCC_5, GCC_6, GCC_7,
|
||||
GCC_8 and GCC_9. Adding support for CLANG_5 and other interesting
|
||||
versions is straightforward here. GNU compilers starting with gcc-4.2
|
||||
could support it in principle, but "#pragma GCC diagnostic push"
|
||||
was only added in gcc-4.6, so it seems simpler to not deal with those
|
||||
at all. The same versions show a large number of warnings already,
|
||||
so it seems easier to just leave it at that and not do a more
|
||||
fine-grained control for them.
|
||||
|
||||
The use cases I found so far include:
|
||||
|
||||
- turning off the gcc-8 -Wattribute-alias warning inside of the
|
||||
SYSCALL_DEFINEx() macro without having to do it globally.
|
||||
|
||||
- Reducing the build time for a simple re-make after a change,
|
||||
once we move the warnings from ./Makefile and
|
||||
./scripts/Makefile.extrawarn into linux/compiler.h
|
||||
|
||||
- More control over the warnings based on other configurations,
|
||||
using preprocessor syntax instead of Makefile syntax. This should make
|
||||
it easier for the average developer to understand and change things.
|
||||
|
||||
- Adding an easy way to turn the W=1 option on unconditionally
|
||||
for a subdirectory or a specific file. This has been requested
|
||||
by several developers in the past that want to have their subsystems
|
||||
W=1 clean.
|
||||
|
||||
- Integrating clang better into the build systems. Clang supports
|
||||
more warnings than GCC, and we probably want to classify them
|
||||
as default, W=1, W=2 etc, but there are cases in which the
|
||||
warnings should be classified differently due to excessive false
|
||||
positives from one or the other compiler.
|
||||
|
||||
- Adding a way to turn the default warnings into errors (e.g. using
|
||||
a new "make E=0" tag) while not also turning the W=1 warnings into
|
||||
errors.
|
||||
|
||||
This patch for now just adds the minimal infrastructure in order to
|
||||
do the first of the list above. As the #pragma GCC diagnostic
|
||||
takes precedence over command line options, the next step would be
|
||||
to convert a lot of the individual Makefiles that set nonstandard
|
||||
options to use __diag() instead.
|
||||
|
||||
[paul.burton@mips.com:
|
||||
- Rebase atop current master.
|
||||
- Add __diag_GCC, or more generally __diag_<compiler>, abstraction to
|
||||
avoid code outside of linux/compiler-gcc.h needing to duplicate
|
||||
knowledge about different GCC versions.
|
||||
- Add a comment argument to __diag_{ignore,warn,error} which isn't
|
||||
used in the expansion of the macros but serves to push people to
|
||||
document the reason for using them - per feedback from Kees Cook.
|
||||
- Translate severity to GCC-specific pragmas in linux/compiler-gcc.h
|
||||
rather than using GCC-specific in linux/compiler_types.h.
|
||||
- Drop all but GCC 8 macros, since we only need to define macros for
|
||||
versions that we need to introduce pragmas for, and as of this
|
||||
series that's just GCC 8.
|
||||
- Capitalize comments in linux/compiler-gcc.h to match the style of
|
||||
the rest of the file.
|
||||
- Line up macro definitions with tabs in linux/compiler-gcc.h.]
|
||||
|
||||
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
|
||||
Signed-off-by: Paul Burton <paul.burton@mips.com>
|
||||
Tested-by: Christophe Leroy <christophe.leroy@c-s.fr>
|
||||
Tested-by: Stafford Horne <shorne@gmail.com>
|
||||
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
---
|
||||
|
||||
--- a/include/linux/compiler-gcc.h
|
||||
+++ b/include/linux/compiler-gcc.h
|
||||
@@ -366,3 +366,30 @@
|
||||
#if GCC_VERSION >= 50100
|
||||
#define COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW 1
|
||||
#endif
|
||||
+
|
||||
+
|
||||
+/*
|
||||
+ * Turn individual warnings and errors on and off locally, depending
|
||||
+ * on version.
|
||||
+ */
|
||||
+#define __diag_GCC(version, severity, s) \
|
||||
+ __diag_GCC_ ## version(__diag_GCC_ ## severity s)
|
||||
+
|
||||
+/* Severity used in pragma directives */
|
||||
+#define __diag_GCC_ignore ignored
|
||||
+#define __diag_GCC_warn warning
|
||||
+#define __diag_GCC_error error
|
||||
+
|
||||
+/* Compilers before gcc-4.6 do not understand "#pragma GCC diagnostic push" */
|
||||
+#if GCC_VERSION >= 40600
|
||||
+#define __diag_str1(s) #s
|
||||
+#define __diag_str(s) __diag_str1(s)
|
||||
+#define __diag(s) _Pragma(__diag_str(GCC diagnostic s))
|
||||
+#endif
|
||||
+
|
||||
+#if GCC_VERSION >= 80000
|
||||
+#define __diag_GCC_8(s) __diag(s)
|
||||
+#else
|
||||
+#define __diag_GCC_8(s)
|
||||
+#endif
|
||||
+
|
||||
--- a/include/linux/compiler_types.h
|
||||
+++ b/include/linux/compiler_types.h
|
||||
@@ -287,4 +287,22 @@ struct ftrace_likely_data {
|
||||
# define __native_word(t) (sizeof(t) == sizeof(char) || sizeof(t) == sizeof(short) || sizeof(t) == sizeof(int) || sizeof(t) == sizeof(long))
|
||||
#endif
|
||||
|
||||
+#ifndef __diag
|
||||
+#define __diag(string)
|
||||
+#endif
|
||||
+
|
||||
+#ifndef __diag_GCC
|
||||
+#define __diag_GCC(version, severity, string)
|
||||
+#endif
|
||||
+
|
||||
+#define __diag_push() __diag(push)
|
||||
+#define __diag_pop() __diag(pop)
|
||||
+
|
||||
+#define __diag_ignore(compiler, version, option, comment) \
|
||||
+ __diag_ ## compiler(version, ignore, option)
|
||||
+#define __diag_warn(compiler, version, option, comment) \
|
||||
+ __diag_ ## compiler(version, warn, option)
|
||||
+#define __diag_error(compiler, version, option, comment) \
|
||||
+ __diag_ ## compiler(version, error, option)
|
||||
+
|
||||
#endif /* __LINUX_COMPILER_TYPES_H */
|
@ -1,88 +0,0 @@
|
||||
From: Arnd Bergmann <arnd@arndb.de>
|
||||
Date: Tue, 19 Jun 2018 13:14:57 -0700
|
||||
Subject: [PATCH] disable -Wattribute-alias warning for SYSCALL_DEFINEx()
|
||||
|
||||
gcc-8 warns for every single definition of a system call entry
|
||||
point, e.g.:
|
||||
|
||||
include/linux/compat.h:56:18: error: 'compat_sys_rt_sigprocmask' alias between functions of incompatible types 'long int(int, compat_sigset_t *, compat_sigset_t *, compat_size_t)' {aka 'long int(int, struct <anonymous> *, struct <anonymous> *, unsigned int)'} and 'long int(long int, long int, long int, long int)' [-Werror=attribute-alias]
|
||||
asmlinkage long compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))\
|
||||
^~~~~~~~~~
|
||||
include/linux/compat.h:45:2: note: in expansion of macro 'COMPAT_SYSCALL_DEFINEx'
|
||||
COMPAT_SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)
|
||||
^~~~~~~~~~~~~~~~~~~~~~
|
||||
kernel/signal.c:2601:1: note: in expansion of macro 'COMPAT_SYSCALL_DEFINE4'
|
||||
COMPAT_SYSCALL_DEFINE4(rt_sigprocmask, int, how, compat_sigset_t __user *, nset,
|
||||
^~~~~~~~~~~~~~~~~~~~~~
|
||||
include/linux/compat.h:60:18: note: aliased declaration here
|
||||
asmlinkage long compat_SyS##name(__MAP(x,__SC_LONG,__VA_ARGS__))\
|
||||
^~~~~~~~~~
|
||||
|
||||
The new warning seems reasonable in principle, but it doesn't
|
||||
help us here, since we rely on the type mismatch to sanitize the
|
||||
system call arguments. After I reported this as GCC PR82435, a new
|
||||
-Wno-attribute-alias option was added that could be used to turn the
|
||||
warning off globally on the command line, but I'd prefer to do it a
|
||||
little more fine-grained.
|
||||
|
||||
Interestingly, turning a warning off and on again inside of
|
||||
a single macro doesn't always work, in this case I had to add
|
||||
an extra statement inbetween and decided to copy the __SC_TEST
|
||||
one from the native syscall to the compat syscall macro. See
|
||||
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83256 for more details
|
||||
about this.
|
||||
|
||||
[paul.burton@mips.com:
|
||||
- Rebase atop current master.
|
||||
- Split GCC & version arguments to __diag_ignore() in order to match
|
||||
changes to the preceding patch.
|
||||
- Add the comment argument to match the preceding patch.]
|
||||
|
||||
Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82435
|
||||
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
|
||||
Signed-off-by: Paul Burton <paul.burton@mips.com>
|
||||
Tested-by: Christophe Leroy <christophe.leroy@c-s.fr>
|
||||
Tested-by: Stafford Horne <shorne@gmail.com>
|
||||
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
---
|
||||
|
||||
--- a/include/linux/compat.h
|
||||
+++ b/include/linux/compat.h
|
||||
@@ -48,6 +48,9 @@
|
||||
COMPAT_SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
|
||||
|
||||
#define COMPAT_SYSCALL_DEFINEx(x, name, ...) \
|
||||
+ __diag_push(); \
|
||||
+ __diag_ignore(GCC, 8, "-Wattribute-alias", \
|
||||
+ "Type aliasing is used to sanitize syscall arguments");\
|
||||
asmlinkage long compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))\
|
||||
__attribute__((alias(__stringify(compat_SyS##name)))); \
|
||||
static inline long C_SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__));\
|
||||
@@ -56,6 +59,7 @@
|
||||
{ \
|
||||
return C_SYSC##name(__MAP(x,__SC_DELOUSE,__VA_ARGS__)); \
|
||||
} \
|
||||
+ __diag_pop(); \
|
||||
static inline long C_SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__))
|
||||
|
||||
#ifndef compat_user_stack_pointer
|
||||
--- a/include/linux/syscalls.h
|
||||
+++ b/include/linux/syscalls.h
|
||||
@@ -208,6 +208,9 @@ static inline int is_syscall_trace_event
|
||||
|
||||
#define __PROTECT(...) asmlinkage_protect(__VA_ARGS__)
|
||||
#define __SYSCALL_DEFINEx(x, name, ...) \
|
||||
+ __diag_push(); \
|
||||
+ __diag_ignore(GCC, 8, "-Wattribute-alias", \
|
||||
+ "Type aliasing is used to sanitize syscall arguments");\
|
||||
asmlinkage long sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)) \
|
||||
__attribute__((alias(__stringify(SyS##name)))); \
|
||||
static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \
|
||||
@@ -219,6 +222,7 @@ static inline int is_syscall_trace_event
|
||||
__PROTECT(x, ret,__MAP(x,__SC_ARGS,__VA_ARGS__)); \
|
||||
return ret; \
|
||||
} \
|
||||
+ __diag_pop(); \
|
||||
static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__))
|
||||
|
||||
/*
|
@ -1,558 +0,0 @@
|
||||
From 1bb0c3ec899827cfa4668bb63a08713a40744d21 Mon Sep 17 00:00:00 2001
|
||||
From: Florian Westphal <fw@strlen.de>
|
||||
Date: Sun, 9 Jul 2017 08:58:30 +0200
|
||||
Subject: [PATCH] netfilter: conntrack: cache route for forwarded connections
|
||||
|
||||
... to avoid per-packet FIB lookup if possible.
|
||||
|
||||
The cached dst is re-used provided the input interface
|
||||
is the same as that of the previous packet in the same direction.
|
||||
|
||||
If not, the cached dst is invalidated.
|
||||
|
||||
For ipv6 we also need to store sernum, else dst_check doesn't work,
|
||||
pointed out by Eric Dumazet.
|
||||
|
||||
This should speed up forwarding when conntrack is already in use
|
||||
anyway, especially when using reverse path filtering -- active RPF
|
||||
enforces two FIB lookups for each packet.
|
||||
|
||||
Before the routing cache removal this didn't matter since RPF was performed
|
||||
only when route cache didn't yield a result; but without route cache it
|
||||
comes at higher price.
|
||||
|
||||
Julian Anastasov suggested to add NETDEV_UNREGISTER handler to
|
||||
avoid holding on to dsts of 'frozen' conntracks.
|
||||
|
||||
Signed-off-by: Florian Westphal <fw@strlen.de>
|
||||
---
|
||||
include/net/netfilter/nf_conntrack_extend.h | 4 +
|
||||
include/net/netfilter/nf_conntrack_rtcache.h | 34 +++
|
||||
net/netfilter/Kconfig | 12 +
|
||||
net/netfilter/Makefile | 3 +
|
||||
net/netfilter/nf_conntrack_rtcache.c | 428 +++++++++++++++++++++++++++
|
||||
5 files changed, 481 insertions(+)
|
||||
create mode 100644 include/net/netfilter/nf_conntrack_rtcache.h
|
||||
create mode 100644 net/netfilter/nf_conntrack_rtcache.c
|
||||
|
||||
--- a/include/net/netfilter/nf_conntrack_extend.h
|
||||
+++ b/include/net/netfilter/nf_conntrack_extend.h
|
||||
@@ -28,6 +28,9 @@ enum nf_ct_ext_id {
|
||||
#if IS_ENABLED(CONFIG_NETFILTER_SYNPROXY)
|
||||
NF_CT_EXT_SYNPROXY,
|
||||
#endif
|
||||
+#if IS_ENABLED(CONFIG_NF_CONNTRACK_RTCACHE)
|
||||
+ NF_CT_EXT_RTCACHE,
|
||||
+#endif
|
||||
NF_CT_EXT_NUM,
|
||||
};
|
||||
|
||||
@@ -40,6 +43,7 @@ enum nf_ct_ext_id {
|
||||
#define NF_CT_EXT_TIMEOUT_TYPE struct nf_conn_timeout
|
||||
#define NF_CT_EXT_LABELS_TYPE struct nf_conn_labels
|
||||
#define NF_CT_EXT_SYNPROXY_TYPE struct nf_conn_synproxy
|
||||
+#define NF_CT_EXT_RTCACHE_TYPE struct nf_conn_rtcache
|
||||
|
||||
/* Extensions: optional stuff which isn't permanently in struct. */
|
||||
struct nf_ct_ext {
|
||||
--- /dev/null
|
||||
+++ b/include/net/netfilter/nf_conntrack_rtcache.h
|
||||
@@ -0,0 +1,34 @@
|
||||
+#include <linux/gfp.h>
|
||||
+#include <net/netfilter/nf_conntrack.h>
|
||||
+#include <net/netfilter/nf_conntrack_extend.h>
|
||||
+
|
||||
+struct dst_entry;
|
||||
+
|
||||
+struct nf_conn_dst_cache {
|
||||
+ struct dst_entry *dst;
|
||||
+ int iif;
|
||||
+#if IS_ENABLED(CONFIG_NF_CONNTRACK_IPV6)
|
||||
+ u32 cookie;
|
||||
+#endif
|
||||
+
|
||||
+};
|
||||
+
|
||||
+struct nf_conn_rtcache {
|
||||
+ struct nf_conn_dst_cache cached_dst[IP_CT_DIR_MAX];
|
||||
+};
|
||||
+
|
||||
+static inline
|
||||
+struct nf_conn_rtcache *nf_ct_rtcache_find(const struct nf_conn *ct)
|
||||
+{
|
||||
+#if IS_ENABLED(CONFIG_NF_CONNTRACK_RTCACHE)
|
||||
+ return nf_ct_ext_find(ct, NF_CT_EXT_RTCACHE);
|
||||
+#else
|
||||
+ return NULL;
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+static inline int nf_conn_rtcache_iif_get(const struct nf_conn_rtcache *rtc,
|
||||
+ enum ip_conntrack_dir dir)
|
||||
+{
|
||||
+ return rtc->cached_dst[dir].iif;
|
||||
+}
|
||||
--- a/net/netfilter/Kconfig
|
||||
+++ b/net/netfilter/Kconfig
|
||||
@@ -118,6 +118,18 @@ config NF_CONNTRACK_EVENTS
|
||||
|
||||
If unsure, say `N'.
|
||||
|
||||
+config NF_CONNTRACK_RTCACHE
|
||||
+ tristate "Cache route entries in conntrack objects"
|
||||
+ depends on NETFILTER_ADVANCED
|
||||
+ depends on NF_CONNTRACK
|
||||
+ help
|
||||
+ If this option is enabled, the connection tracking code will
|
||||
+ cache routing information for each connection that is being
|
||||
+ forwarded, at a cost of 32 bytes per conntrack object.
|
||||
+
|
||||
+ To compile it as a module, choose M here. If unsure, say N.
|
||||
+ The module will be called nf_conntrack_rtcache.
|
||||
+
|
||||
config NF_CONNTRACK_TIMEOUT
|
||||
bool 'Connection tracking timeout'
|
||||
depends on NETFILTER_ADVANCED
|
||||
--- a/net/netfilter/Makefile
|
||||
+++ b/net/netfilter/Makefile
|
||||
@@ -19,6 +19,9 @@ obj-$(CONFIG_NETFILTER_NETLINK_LOG) += n
|
||||
# connection tracking
|
||||
obj-$(CONFIG_NF_CONNTRACK) += nf_conntrack.o
|
||||
|
||||
+# optional conntrack route cache extension
|
||||
+obj-$(CONFIG_NF_CONNTRACK_RTCACHE) += nf_conntrack_rtcache.o
|
||||
+
|
||||
obj-$(CONFIG_NF_CT_PROTO_GRE) += nf_conntrack_proto_gre.o
|
||||
|
||||
# netlink interface for nf_conntrack
|
||||
--- /dev/null
|
||||
+++ b/net/netfilter/nf_conntrack_rtcache.c
|
||||
@@ -0,0 +1,428 @@
|
||||
+/* route cache for netfilter.
|
||||
+ *
|
||||
+ * (C) 2014 Red Hat GmbH
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ */
|
||||
+
|
||||
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
+
|
||||
+#include <linux/types.h>
|
||||
+#include <linux/netfilter.h>
|
||||
+#include <linux/skbuff.h>
|
||||
+#include <linux/stddef.h>
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/netdevice.h>
|
||||
+#include <linux/export.h>
|
||||
+#include <linux/module.h>
|
||||
+
|
||||
+#include <net/dst.h>
|
||||
+
|
||||
+#include <net/netfilter/nf_conntrack.h>
|
||||
+#include <net/netfilter/nf_conntrack_core.h>
|
||||
+#include <net/netfilter/nf_conntrack_extend.h>
|
||||
+#include <net/netfilter/nf_conntrack_rtcache.h>
|
||||
+
|
||||
+#if IS_ENABLED(CONFIG_NF_CONNTRACK_IPV6)
|
||||
+#include <net/ip6_fib.h>
|
||||
+#endif
|
||||
+
|
||||
+static void __nf_conn_rtcache_destroy(struct nf_conn_rtcache *rtc,
|
||||
+ enum ip_conntrack_dir dir)
|
||||
+{
|
||||
+ struct dst_entry *dst = rtc->cached_dst[dir].dst;
|
||||
+
|
||||
+ dst_release(dst);
|
||||
+}
|
||||
+
|
||||
+static void nf_conn_rtcache_destroy(struct nf_conn *ct)
|
||||
+{
|
||||
+ struct nf_conn_rtcache *rtc = nf_ct_rtcache_find(ct);
|
||||
+
|
||||
+ if (!rtc)
|
||||
+ return;
|
||||
+
|
||||
+ __nf_conn_rtcache_destroy(rtc, IP_CT_DIR_ORIGINAL);
|
||||
+ __nf_conn_rtcache_destroy(rtc, IP_CT_DIR_REPLY);
|
||||
+}
|
||||
+
|
||||
+static void nf_ct_rtcache_ext_add(struct nf_conn *ct)
|
||||
+{
|
||||
+ struct nf_conn_rtcache *rtc;
|
||||
+
|
||||
+ rtc = nf_ct_ext_add(ct, NF_CT_EXT_RTCACHE, GFP_ATOMIC);
|
||||
+ if (rtc) {
|
||||
+ rtc->cached_dst[IP_CT_DIR_ORIGINAL].iif = -1;
|
||||
+ rtc->cached_dst[IP_CT_DIR_ORIGINAL].dst = NULL;
|
||||
+ rtc->cached_dst[IP_CT_DIR_REPLY].iif = -1;
|
||||
+ rtc->cached_dst[IP_CT_DIR_REPLY].dst = NULL;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static struct nf_conn_rtcache *nf_ct_rtcache_find_usable(struct nf_conn *ct)
|
||||
+{
|
||||
+ return nf_ct_rtcache_find(ct);
|
||||
+}
|
||||
+
|
||||
+static struct dst_entry *
|
||||
+nf_conn_rtcache_dst_get(const struct nf_conn_rtcache *rtc,
|
||||
+ enum ip_conntrack_dir dir)
|
||||
+{
|
||||
+ return rtc->cached_dst[dir].dst;
|
||||
+}
|
||||
+
|
||||
+static u32 nf_rtcache_get_cookie(int pf, const struct dst_entry *dst)
|
||||
+{
|
||||
+#if IS_ENABLED(CONFIG_NF_CONNTRACK_IPV6)
|
||||
+ if (pf == NFPROTO_IPV6) {
|
||||
+ const struct rt6_info *rt = (const struct rt6_info *)dst;
|
||||
+
|
||||
+ if (rt->rt6i_node)
|
||||
+ return (u32)rt->rt6i_node->fn_sernum;
|
||||
+ }
|
||||
+#endif
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void nf_conn_rtcache_dst_set(int pf,
|
||||
+ struct nf_conn_rtcache *rtc,
|
||||
+ struct dst_entry *dst,
|
||||
+ enum ip_conntrack_dir dir, int iif)
|
||||
+{
|
||||
+ if (rtc->cached_dst[dir].iif != iif)
|
||||
+ rtc->cached_dst[dir].iif = iif;
|
||||
+
|
||||
+ if (rtc->cached_dst[dir].dst != dst) {
|
||||
+ struct dst_entry *old;
|
||||
+
|
||||
+ dst_hold(dst);
|
||||
+
|
||||
+ old = xchg(&rtc->cached_dst[dir].dst, dst);
|
||||
+ dst_release(old);
|
||||
+
|
||||
+#if IS_ENABLED(CONFIG_NF_CONNTRACK_IPV6)
|
||||
+ if (pf == NFPROTO_IPV6)
|
||||
+ rtc->cached_dst[dir].cookie =
|
||||
+ nf_rtcache_get_cookie(pf, dst);
|
||||
+#endif
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void nf_conn_rtcache_dst_obsolete(struct nf_conn_rtcache *rtc,
|
||||
+ enum ip_conntrack_dir dir)
|
||||
+{
|
||||
+ struct dst_entry *old;
|
||||
+
|
||||
+ pr_debug("Invalidate iif %d for dir %d on cache %p\n",
|
||||
+ rtc->cached_dst[dir].iif, dir, rtc);
|
||||
+
|
||||
+ old = xchg(&rtc->cached_dst[dir].dst, NULL);
|
||||
+ dst_release(old);
|
||||
+ rtc->cached_dst[dir].iif = -1;
|
||||
+}
|
||||
+
|
||||
+static unsigned int nf_rtcache_in(u_int8_t pf,
|
||||
+ struct sk_buff *skb,
|
||||
+ const struct nf_hook_state *state)
|
||||
+{
|
||||
+ struct nf_conn_rtcache *rtc;
|
||||
+ enum ip_conntrack_info ctinfo;
|
||||
+ enum ip_conntrack_dir dir;
|
||||
+ struct dst_entry *dst;
|
||||
+ struct nf_conn *ct;
|
||||
+ int iif;
|
||||
+ u32 cookie;
|
||||
+
|
||||
+ if (skb_dst(skb) || skb->sk)
|
||||
+ return NF_ACCEPT;
|
||||
+
|
||||
+ ct = nf_ct_get(skb, &ctinfo);
|
||||
+ if (!ct)
|
||||
+ return NF_ACCEPT;
|
||||
+
|
||||
+ rtc = nf_ct_rtcache_find_usable(ct);
|
||||
+ if (!rtc)
|
||||
+ return NF_ACCEPT;
|
||||
+
|
||||
+ /* if iif changes, don't use cache and let ip stack
|
||||
+ * do route lookup.
|
||||
+ *
|
||||
+ * If rp_filter is enabled it might toss skb, so
|
||||
+ * we don't want to avoid these checks.
|
||||
+ */
|
||||
+ dir = CTINFO2DIR(ctinfo);
|
||||
+ iif = nf_conn_rtcache_iif_get(rtc, dir);
|
||||
+ if (state->in->ifindex != iif) {
|
||||
+ pr_debug("ct %p, iif %d, cached iif %d, skip cached entry\n",
|
||||
+ ct, iif, state->in->ifindex);
|
||||
+ return NF_ACCEPT;
|
||||
+ }
|
||||
+ dst = nf_conn_rtcache_dst_get(rtc, dir);
|
||||
+ if (dst == NULL)
|
||||
+ return NF_ACCEPT;
|
||||
+
|
||||
+ cookie = nf_rtcache_get_cookie(pf, dst);
|
||||
+
|
||||
+ dst = dst_check(dst, cookie);
|
||||
+ pr_debug("obtained dst %p for skb %p, cookie %d\n", dst, skb, cookie);
|
||||
+ if (likely(dst))
|
||||
+ skb_dst_set_noref(skb, dst);
|
||||
+ else
|
||||
+ nf_conn_rtcache_dst_obsolete(rtc, dir);
|
||||
+
|
||||
+ return NF_ACCEPT;
|
||||
+}
|
||||
+
|
||||
+static unsigned int nf_rtcache_forward(u_int8_t pf,
|
||||
+ struct sk_buff *skb,
|
||||
+ const struct nf_hook_state *state)
|
||||
+{
|
||||
+ struct nf_conn_rtcache *rtc;
|
||||
+ enum ip_conntrack_info ctinfo;
|
||||
+ enum ip_conntrack_dir dir;
|
||||
+ struct nf_conn *ct;
|
||||
+ struct dst_entry *dst = skb_dst(skb);
|
||||
+ int iif;
|
||||
+
|
||||
+ ct = nf_ct_get(skb, &ctinfo);
|
||||
+ if (!ct)
|
||||
+ return NF_ACCEPT;
|
||||
+
|
||||
+ if (dst && dst_xfrm(dst))
|
||||
+ return NF_ACCEPT;
|
||||
+
|
||||
+ if (!nf_ct_is_confirmed(ct)) {
|
||||
+ if (WARN_ON(nf_ct_rtcache_find(ct)))
|
||||
+ return NF_ACCEPT;
|
||||
+ nf_ct_rtcache_ext_add(ct);
|
||||
+ return NF_ACCEPT;
|
||||
+ }
|
||||
+
|
||||
+ rtc = nf_ct_rtcache_find_usable(ct);
|
||||
+ if (!rtc)
|
||||
+ return NF_ACCEPT;
|
||||
+
|
||||
+ dir = CTINFO2DIR(ctinfo);
|
||||
+ iif = nf_conn_rtcache_iif_get(rtc, dir);
|
||||
+ pr_debug("ct %p, skb %p, dir %d, iif %d, cached iif %d\n",
|
||||
+ ct, skb, dir, iif, state->in->ifindex);
|
||||
+ if (likely(state->in->ifindex == iif))
|
||||
+ return NF_ACCEPT;
|
||||
+
|
||||
+ nf_conn_rtcache_dst_set(pf, rtc, skb_dst(skb), dir, state->in->ifindex);
|
||||
+ return NF_ACCEPT;
|
||||
+}
|
||||
+
|
||||
+static unsigned int nf_rtcache_in4(void *priv,
|
||||
+ struct sk_buff *skb,
|
||||
+ const struct nf_hook_state *state)
|
||||
+{
|
||||
+ return nf_rtcache_in(NFPROTO_IPV4, skb, state);
|
||||
+}
|
||||
+
|
||||
+static unsigned int nf_rtcache_forward4(void *priv,
|
||||
+ struct sk_buff *skb,
|
||||
+ const struct nf_hook_state *state)
|
||||
+{
|
||||
+ return nf_rtcache_forward(NFPROTO_IPV4, skb, state);
|
||||
+}
|
||||
+
|
||||
+#if IS_ENABLED(CONFIG_NF_CONNTRACK_IPV6)
|
||||
+static unsigned int nf_rtcache_in6(void *priv,
|
||||
+ struct sk_buff *skb,
|
||||
+ const struct nf_hook_state *state)
|
||||
+{
|
||||
+ return nf_rtcache_in(NFPROTO_IPV6, skb, state);
|
||||
+}
|
||||
+
|
||||
+static unsigned int nf_rtcache_forward6(void *priv,
|
||||
+ struct sk_buff *skb,
|
||||
+ const struct nf_hook_state *state)
|
||||
+{
|
||||
+ return nf_rtcache_forward(NFPROTO_IPV6, skb, state);
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
+static int nf_rtcache_dst_remove(struct nf_conn *ct, void *data)
|
||||
+{
|
||||
+ struct nf_conn_rtcache *rtc = nf_ct_rtcache_find(ct);
|
||||
+ struct net_device *dev = data;
|
||||
+
|
||||
+ if (!rtc)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (dev->ifindex == rtc->cached_dst[IP_CT_DIR_ORIGINAL].iif ||
|
||||
+ dev->ifindex == rtc->cached_dst[IP_CT_DIR_REPLY].iif) {
|
||||
+ nf_conn_rtcache_dst_obsolete(rtc, IP_CT_DIR_ORIGINAL);
|
||||
+ nf_conn_rtcache_dst_obsolete(rtc, IP_CT_DIR_REPLY);
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int nf_rtcache_netdev_event(struct notifier_block *this,
|
||||
+ unsigned long event, void *ptr)
|
||||
+{
|
||||
+ struct net_device *dev = netdev_notifier_info_to_dev(ptr);
|
||||
+ struct net *net = dev_net(dev);
|
||||
+
|
||||
+ if (event == NETDEV_DOWN)
|
||||
+ nf_ct_iterate_cleanup_net(net, nf_rtcache_dst_remove, dev, 0, 0);
|
||||
+
|
||||
+ return NOTIFY_DONE;
|
||||
+}
|
||||
+
|
||||
+static struct notifier_block nf_rtcache_notifier = {
|
||||
+ .notifier_call = nf_rtcache_netdev_event,
|
||||
+};
|
||||
+
|
||||
+static struct nf_hook_ops rtcache_ops[] = {
|
||||
+ {
|
||||
+ .hook = nf_rtcache_in4,
|
||||
+ .pf = NFPROTO_IPV4,
|
||||
+ .hooknum = NF_INET_PRE_ROUTING,
|
||||
+ .priority = NF_IP_PRI_LAST,
|
||||
+ },
|
||||
+ {
|
||||
+ .hook = nf_rtcache_forward4,
|
||||
+ .pf = NFPROTO_IPV4,
|
||||
+ .hooknum = NF_INET_FORWARD,
|
||||
+ .priority = NF_IP_PRI_LAST,
|
||||
+ },
|
||||
+#if IS_ENABLED(CONFIG_NF_CONNTRACK_IPV6)
|
||||
+ {
|
||||
+ .hook = nf_rtcache_in6,
|
||||
+ .pf = NFPROTO_IPV6,
|
||||
+ .hooknum = NF_INET_PRE_ROUTING,
|
||||
+ .priority = NF_IP_PRI_LAST,
|
||||
+ },
|
||||
+ {
|
||||
+ .hook = nf_rtcache_forward6,
|
||||
+ .pf = NFPROTO_IPV6,
|
||||
+ .hooknum = NF_INET_FORWARD,
|
||||
+ .priority = NF_IP_PRI_LAST,
|
||||
+ },
|
||||
+#endif
|
||||
+};
|
||||
+
|
||||
+static struct nf_ct_ext_type rtcache_extend __read_mostly = {
|
||||
+ .len = sizeof(struct nf_conn_rtcache),
|
||||
+ .align = __alignof__(struct nf_conn_rtcache),
|
||||
+ .id = NF_CT_EXT_RTCACHE,
|
||||
+ .destroy = nf_conn_rtcache_destroy,
|
||||
+};
|
||||
+
|
||||
+static int __net_init rtcache_net_init(struct net *net)
|
||||
+{
|
||||
+ return nf_register_net_hooks(net, rtcache_ops, ARRAY_SIZE(rtcache_ops));
|
||||
+}
|
||||
+
|
||||
+static void __net_exit rtcache_net_exit(struct net *net)
|
||||
+{
|
||||
+ /* remove hooks so no new connections get rtcache extension */
|
||||
+ nf_unregister_net_hooks(net, rtcache_ops, ARRAY_SIZE(rtcache_ops));
|
||||
+}
|
||||
+
|
||||
+static struct pernet_operations rtcache_ops_net_ops = {
|
||||
+ .init = rtcache_net_init,
|
||||
+ .exit = rtcache_net_exit,
|
||||
+};
|
||||
+
|
||||
+static int __init nf_conntrack_rtcache_init(void)
|
||||
+{
|
||||
+ int ret = nf_ct_extend_register(&rtcache_extend);
|
||||
+
|
||||
+ if (ret < 0) {
|
||||
+ pr_err("nf_conntrack_rtcache: Unable to register extension\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ ret = register_pernet_subsys(&rtcache_ops_net_ops);
|
||||
+ if (ret) {
|
||||
+ nf_ct_extend_unregister(&rtcache_extend);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ ret = register_netdevice_notifier(&nf_rtcache_notifier);
|
||||
+ if (ret) {
|
||||
+ nf_ct_extend_unregister(&rtcache_extend);
|
||||
+ unregister_pernet_subsys(&rtcache_ops_net_ops);
|
||||
+ }
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int nf_rtcache_ext_remove(struct nf_conn *ct, void *data)
|
||||
+{
|
||||
+ struct nf_conn_rtcache *rtc = nf_ct_rtcache_find(ct);
|
||||
+
|
||||
+ return rtc != NULL;
|
||||
+}
|
||||
+
|
||||
+static bool __exit nf_conntrack_rtcache_wait_for_dying(struct net *net)
|
||||
+{
|
||||
+ bool wait = false;
|
||||
+ int cpu;
|
||||
+
|
||||
+ for_each_possible_cpu(cpu) {
|
||||
+ struct nf_conntrack_tuple_hash *h;
|
||||
+ struct hlist_nulls_node *n;
|
||||
+ struct nf_conn *ct;
|
||||
+ struct ct_pcpu *pcpu = per_cpu_ptr(net->ct.pcpu_lists, cpu);
|
||||
+
|
||||
+ rcu_read_lock();
|
||||
+ spin_lock_bh(&pcpu->lock);
|
||||
+
|
||||
+ hlist_nulls_for_each_entry(h, n, &pcpu->dying, hnnode) {
|
||||
+ ct = nf_ct_tuplehash_to_ctrack(h);
|
||||
+ if (nf_ct_rtcache_find(ct) != NULL) {
|
||||
+ wait = true;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ spin_unlock_bh(&pcpu->lock);
|
||||
+ rcu_read_unlock();
|
||||
+ }
|
||||
+
|
||||
+ return wait;
|
||||
+}
|
||||
+
|
||||
+static void __exit nf_conntrack_rtcache_fini(void)
|
||||
+{
|
||||
+ struct net *net;
|
||||
+ int count = 0;
|
||||
+
|
||||
+ synchronize_net();
|
||||
+
|
||||
+ unregister_netdevice_notifier(&nf_rtcache_notifier);
|
||||
+ unregister_pernet_subsys(&rtcache_ops_net_ops);
|
||||
+
|
||||
+ synchronize_net();
|
||||
+
|
||||
+ rtnl_lock();
|
||||
+
|
||||
+ /* zap all conntracks with rtcache extension */
|
||||
+ for_each_net(net)
|
||||
+ nf_ct_iterate_cleanup_net(net, nf_rtcache_ext_remove, NULL, 0, 0);
|
||||
+
|
||||
+ for_each_net(net) {
|
||||
+ /* .. and make sure they're gone from dying list, too */
|
||||
+ while (nf_conntrack_rtcache_wait_for_dying(net)) {
|
||||
+ msleep(200);
|
||||
+ WARN_ONCE(++count > 25, "Waiting for all rtcache conntracks to go away\n");
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ rtnl_unlock();
|
||||
+
|
||||
+ synchronize_net();
|
||||
+ nf_ct_extend_unregister(&rtcache_extend);
|
||||
+}
|
||||
+module_init(nf_conntrack_rtcache_init);
|
||||
+module_exit(nf_conntrack_rtcache_fini);
|
||||
+
|
||||
+MODULE_LICENSE("GPL");
|
||||
+MODULE_AUTHOR("Florian Westphal <fw@strlen.de>");
|
||||
+MODULE_DESCRIPTION("Conntrack route cache extension");
|
@ -1,85 +0,0 @@
|
||||
From: Eric Dumazet <edumazet@google.com>
|
||||
Date: Sat, 11 Nov 2017 15:54:12 -0800
|
||||
Subject: [PATCH] tcp: allow drivers to tweak TSQ logic
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
I had many reports that TSQ logic breaks wifi aggregation.
|
||||
|
||||
Current logic is to allow up to 1 ms of bytes to be queued into qdisc
|
||||
and drivers queues.
|
||||
|
||||
But Wifi aggregation needs a bigger budget to allow bigger rates to
|
||||
be discovered by various TCP Congestion Controls algorithms.
|
||||
|
||||
This patch adds an extra socket field, allowing wifi drivers to select
|
||||
another log scale to derive TCP Small Queue credit from current pacing
|
||||
rate.
|
||||
|
||||
Initial value is 10, meaning that this patch does not change current
|
||||
behavior.
|
||||
|
||||
We expect wifi drivers to set this field to smaller values (tests have
|
||||
been done with values from 6 to 9)
|
||||
|
||||
They would have to use following template :
|
||||
|
||||
if (skb->sk && skb->sk->sk_pacing_shift != MY_PACING_SHIFT)
|
||||
skb->sk->sk_pacing_shift = MY_PACING_SHIFT;
|
||||
|
||||
Ref: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1670041
|
||||
Signed-off-by: Eric Dumazet <edumazet@google.com>
|
||||
Cc: Johannes Berg <johannes.berg@intel.com>
|
||||
Cc: Toke Høiland-Jørgensen <toke@toke.dk>
|
||||
Cc: Kir Kolyshkin <kir@openvz.org>
|
||||
---
|
||||
--- a/include/net/sock.h
|
||||
+++ b/include/net/sock.h
|
||||
@@ -267,6 +267,7 @@ struct sock_common {
|
||||
* @sk_gso_type: GSO type (e.g. %SKB_GSO_TCPV4)
|
||||
* @sk_gso_max_size: Maximum GSO segment size to build
|
||||
* @sk_gso_max_segs: Maximum number of GSO segments
|
||||
+ * @sk_pacing_shift: scaling factor for TCP Small Queues
|
||||
* @sk_lingertime: %SO_LINGER l_linger setting
|
||||
* @sk_backlog: always used with the per-socket spinlock held
|
||||
* @sk_callback_lock: used with the callbacks in the end of this struct
|
||||
@@ -446,6 +447,8 @@ struct sock {
|
||||
sk_type : 16;
|
||||
#define SK_PROTOCOL_MAX U8_MAX
|
||||
u16 sk_gso_max_segs;
|
||||
+#define sk_pacing_shift sk_pacing_shift /* for backport checks */
|
||||
+ u8 sk_pacing_shift;
|
||||
unsigned long sk_lingertime;
|
||||
struct proto *sk_prot_creator;
|
||||
rwlock_t sk_callback_lock;
|
||||
--- a/net/core/sock.c
|
||||
+++ b/net/core/sock.c
|
||||
@@ -2750,6 +2750,7 @@ void sock_init_data(struct socket *sock,
|
||||
|
||||
sk->sk_max_pacing_rate = ~0U;
|
||||
sk->sk_pacing_rate = ~0U;
|
||||
+ sk->sk_pacing_shift = 10;
|
||||
sk->sk_incoming_cpu = -1;
|
||||
/*
|
||||
* Before updating sk_refcnt, we must commit prior changes to memory
|
||||
--- a/net/ipv4/tcp_output.c
|
||||
+++ b/net/ipv4/tcp_output.c
|
||||
@@ -1699,7 +1699,7 @@ u32 tcp_tso_autosize(const struct sock *
|
||||
{
|
||||
u32 bytes, segs;
|
||||
|
||||
- bytes = min(sk->sk_pacing_rate >> 10,
|
||||
+ bytes = min(sk->sk_pacing_rate >> sk->sk_pacing_shift,
|
||||
sk->sk_gso_max_size - 1 - MAX_TCP_HEADER);
|
||||
|
||||
/* Goal is to send at least one packet per ms,
|
||||
@@ -2217,7 +2217,7 @@ static bool tcp_small_queue_check(struct
|
||||
{
|
||||
unsigned int limit;
|
||||
|
||||
- limit = max(2 * skb->truesize, sk->sk_pacing_rate >> 10);
|
||||
+ limit = max(2 * skb->truesize, sk->sk_pacing_rate >> sk->sk_pacing_shift);
|
||||
limit = min_t(u32, limit, sysctl_tcp_limit_output_bytes);
|
||||
limit <<= factor;
|
||||
|
@ -1,42 +0,0 @@
|
||||
From 4d304a6fe93538ce356b4593dc43476b50c023e7 Mon Sep 17 00:00:00 2001
|
||||
From: Giuseppe Lippolis <giu.lippolis@gmail.com>
|
||||
Date: Mon, 23 Apr 2018 09:03:06 +0200
|
||||
Subject: USB: serial: option: blacklist unused dwm-158 interfaces
|
||||
|
||||
The dwm-158 interface 4 and 5 doesn't answer to the AT commands
|
||||
and doesn't appears a option interface.
|
||||
Tested on openwrt distribution (kernel 4.14 using the old blacklist
|
||||
definitions).
|
||||
|
||||
Lars Melin also writes:
|
||||
|
||||
Blacklisting interface 4 and 5 is correct because:
|
||||
|
||||
MI_00 D-Link Mobile Broadband Device (cdc_ether)
|
||||
MI_02 D-Link HSPA+DataCard Diagnostics Interface (also ppp modem)
|
||||
MI_03 D-Link HSPA+DataCard NMEA Device
|
||||
MI_04 D-Link HSPA+DataCard Speech Port
|
||||
MI_05 D-Link HSPA+DataCard Debug Port
|
||||
MI_06 USB Mass Storage Device
|
||||
|
||||
Signed-off-by: Giuseppe Lippolis <giu.lippolis@gmail.com>
|
||||
[ johan: add Lars's comment on the interface layout and reword summary ]
|
||||
Cc: Lars Melin <larsm17@gmail.com>
|
||||
Cc: Dan Williams <dcbw@redhat.com>
|
||||
Signed-off-by: Johan Hovold <johan@kernel.org>
|
||||
---
|
||||
drivers/usb/serial/option.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/usb/serial/option.c
|
||||
+++ b/drivers/usb/serial/option.c
|
||||
@@ -1990,7 +1990,8 @@ static const struct usb_device_id option
|
||||
{ USB_DEVICE_INTERFACE_CLASS(0x2001, 0x7d01, 0xff) }, /* D-Link DWM-156 (variant) */
|
||||
{ USB_DEVICE_INTERFACE_CLASS(0x2001, 0x7d02, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(0x2001, 0x7d03, 0xff) },
|
||||
- { USB_DEVICE_INTERFACE_CLASS(0x2001, 0x7d04, 0xff) }, /* D-Link DWM-158 */
|
||||
+ { USB_DEVICE_INTERFACE_CLASS(0x2001, 0x7d04, 0xff), /* D-Link DWM-158 */
|
||||
+ .driver_info = RSVD(4) | RSVD(5) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(0x2001, 0x7d0e, 0xff) }, /* D-Link DWM-157 C1 */
|
||||
{ USB_DEVICE_INTERFACE_CLASS(0x2001, 0x7e19, 0xff), /* D-Link DWM-221 B1 */
|
||||
.driver_info = RSVD(4) },
|
@ -1,109 +0,0 @@
|
||||
From 531ef5ebea96394ddb7f554d4d88e017dde30a59 Mon Sep 17 00:00:00 2001
|
||||
From: Amelie Delaunay <amelie.delaunay@st.com>
|
||||
Date: Tue, 13 Feb 2018 09:28:12 +0100
|
||||
Subject: [PATCH] usb: dwc2: add support for host mode external vbus supply
|
||||
|
||||
This patch adds a way to enable an external vbus supply in host mode,
|
||||
when dwc2 drvvbus signal is not used.
|
||||
|
||||
This patch is very similar to the one done in U-Boot dwc2 driver [1]. It
|
||||
also adds dynamic vbus supply management depending on the role and state
|
||||
of the core.
|
||||
|
||||
[1] https://lists.denx.de/pipermail/u-boot/2017-March/283434.html
|
||||
|
||||
Signed-off-by: Amelie Delaunay <amelie.delaunay@st.com>
|
||||
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
|
||||
---
|
||||
drivers/usb/dwc2/core.h | 2 ++
|
||||
drivers/usb/dwc2/hcd.c | 26 ++++++++++++++++++++++++++
|
||||
2 files changed, 28 insertions(+)
|
||||
|
||||
--- a/drivers/usb/dwc2/core.h
|
||||
+++ b/drivers/usb/dwc2/core.h
|
||||
@@ -777,6 +777,7 @@ struct dwc2_hregs_backup {
|
||||
* @plat: The platform specific configuration data. This can be
|
||||
* removed once all SoCs support usb transceiver.
|
||||
* @supplies: Definition of USB power supplies
|
||||
+ * @vbus_supply: Regulator supplying vbus.
|
||||
* @phyif: PHY interface width
|
||||
* @lock: Spinlock that protects all the driver data structures
|
||||
* @priv: Stores a pointer to the struct usb_hcd
|
||||
@@ -914,6 +915,7 @@ struct dwc2_hsotg {
|
||||
struct usb_phy *uphy;
|
||||
struct dwc2_hsotg_plat *plat;
|
||||
struct regulator_bulk_data supplies[DWC2_NUM_SUPPLIES];
|
||||
+ struct regulator *vbus_supply;
|
||||
u32 phyif;
|
||||
|
||||
spinlock_t lock;
|
||||
--- a/drivers/usb/dwc2/hcd.c
|
||||
+++ b/drivers/usb/dwc2/hcd.c
|
||||
@@ -359,6 +359,23 @@ static void dwc2_gusbcfg_init(struct dwc
|
||||
dwc2_writel(usbcfg, hsotg->regs + GUSBCFG);
|
||||
}
|
||||
|
||||
+static int dwc2_vbus_supply_init(struct dwc2_hsotg *hsotg)
|
||||
+{
|
||||
+ hsotg->vbus_supply = devm_regulator_get_optional(hsotg->dev, "vbus");
|
||||
+ if (IS_ERR(hsotg->vbus_supply))
|
||||
+ return 0;
|
||||
+
|
||||
+ return regulator_enable(hsotg->vbus_supply);
|
||||
+}
|
||||
+
|
||||
+static int dwc2_vbus_supply_exit(struct dwc2_hsotg *hsotg)
|
||||
+{
|
||||
+ if (hsotg->vbus_supply)
|
||||
+ return regulator_disable(hsotg->vbus_supply);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* dwc2_enable_host_interrupts() - Enables the Host mode interrupts
|
||||
*
|
||||
@@ -3346,6 +3363,7 @@ static void dwc2_conn_id_status_change(s
|
||||
|
||||
/* B-Device connector (Device Mode) */
|
||||
if (gotgctl & GOTGCTL_CONID_B) {
|
||||
+ dwc2_vbus_supply_exit(hsotg);
|
||||
/* Wait for switch to device mode */
|
||||
dev_dbg(hsotg->dev, "connId B\n");
|
||||
if (hsotg->bus_suspended) {
|
||||
@@ -4455,6 +4473,9 @@ static int _dwc2_hcd_start(struct usb_hc
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&hsotg->lock, flags);
|
||||
+
|
||||
+ dwc2_vbus_supply_init(hsotg);
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -4482,6 +4503,8 @@ static void _dwc2_hcd_stop(struct usb_hc
|
||||
clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
|
||||
spin_unlock_irqrestore(&hsotg->lock, flags);
|
||||
|
||||
+ dwc2_vbus_supply_exit(hsotg);
|
||||
+
|
||||
usleep_range(1000, 3000);
|
||||
}
|
||||
|
||||
@@ -4518,6 +4541,7 @@ static int _dwc2_hcd_suspend(struct usb_
|
||||
hprt0 |= HPRT0_SUSP;
|
||||
hprt0 &= ~HPRT0_PWR;
|
||||
dwc2_writel(hprt0, hsotg->regs + HPRT0);
|
||||
+ dwc2_vbus_supply_exit(hsotg);
|
||||
}
|
||||
|
||||
/* Enter hibernation */
|
||||
@@ -4598,6 +4622,8 @@ static int _dwc2_hcd_resume(struct usb_h
|
||||
spin_unlock_irqrestore(&hsotg->lock, flags);
|
||||
dwc2_port_resume(hsotg);
|
||||
} else {
|
||||
+ dwc2_vbus_supply_init(hsotg);
|
||||
+
|
||||
/* Wait for controller to correctly update D+/D- level */
|
||||
usleep_range(3000, 5000);
|
||||
|
@ -1,55 +0,0 @@
|
||||
From 438fea2a6325933868aebc20279e2669c9a21207 Mon Sep 17 00:00:00 2001
|
||||
From: Tomeu Vizoso <tomeu.vizoso@collabora.com>
|
||||
Date: Mon, 26 Mar 2018 11:00:01 +0200
|
||||
Subject: [PATCH] usb: dwc2: dwc2_vbus_supply_init: fix error check
|
||||
|
||||
devm_regulator_get_optional returns -ENODEV if the regulator isn't
|
||||
there, so if that's the case we have to make sure not to leave -ENODEV
|
||||
in the regulator pointer.
|
||||
|
||||
Also, make sure we return 0 in that case, but correctly propagate any
|
||||
other errors. Also propagate the error from _dwc2_hcd_start.
|
||||
|
||||
Fixes: 531ef5ebea96 ("usb: dwc2: add support for host mode external vbus supply")
|
||||
Cc: Amelie Delaunay <amelie.delaunay@st.com>
|
||||
Reviewed-by: Amelie Delaunay <amelie.delaunay@st.com>
|
||||
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
|
||||
Reviewed-by: Grigor Tovmasyan <tovmasya@synopsys.com>
|
||||
Tested-by: Heiko Stuebner <heiko@sntech.de>
|
||||
Acked-by: Minas Harutyunyan <hminas@synopsys.com>
|
||||
Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
|
||||
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
|
||||
---
|
||||
drivers/usb/dwc2/hcd.c | 13 ++++++++-----
|
||||
1 file changed, 8 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/usb/dwc2/hcd.c
|
||||
+++ b/drivers/usb/dwc2/hcd.c
|
||||
@@ -361,9 +361,14 @@ static void dwc2_gusbcfg_init(struct dwc
|
||||
|
||||
static int dwc2_vbus_supply_init(struct dwc2_hsotg *hsotg)
|
||||
{
|
||||
+ int ret;
|
||||
+
|
||||
hsotg->vbus_supply = devm_regulator_get_optional(hsotg->dev, "vbus");
|
||||
- if (IS_ERR(hsotg->vbus_supply))
|
||||
- return 0;
|
||||
+ if (IS_ERR(hsotg->vbus_supply)) {
|
||||
+ ret = PTR_ERR(hsotg->vbus_supply);
|
||||
+ hsotg->vbus_supply = NULL;
|
||||
+ return ret == -ENODEV ? 0 : ret;
|
||||
+ }
|
||||
|
||||
return regulator_enable(hsotg->vbus_supply);
|
||||
}
|
||||
@@ -4474,9 +4479,7 @@ static int _dwc2_hcd_start(struct usb_hc
|
||||
|
||||
spin_unlock_irqrestore(&hsotg->lock, flags);
|
||||
|
||||
- dwc2_vbus_supply_init(hsotg);
|
||||
-
|
||||
- return 0;
|
||||
+ return dwc2_vbus_supply_init(hsotg);
|
||||
}
|
||||
|
||||
/*
|
@ -1,74 +0,0 @@
|
||||
From 2c77c57d22adb05b21cdb333a0c42bdfa0e19835 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Tue, 16 Jan 2018 16:45:41 +0100
|
||||
Subject: [PATCH] mtd: move code adding master MTD out of
|
||||
mtd_add_device_partitions()
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This change is a small cleanup of mtd_device_parse_register(). When
|
||||
using MTD_PARTITIONED_MASTER it makes sure a master MTD is registered
|
||||
before dealing with partitions. The advantage of this is not mixing
|
||||
code handling master MTD with code handling partitions.
|
||||
|
||||
This commit doesn't change any behavior except from a slightly different
|
||||
failure code path. The new code may need to call del_mtd_device when
|
||||
something goes wrong.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
|
||||
---
|
||||
drivers/mtd/mtdcore.c | 25 +++++++++++++------------
|
||||
1 file changed, 13 insertions(+), 12 deletions(-)
|
||||
|
||||
--- a/drivers/mtd/mtdcore.c
|
||||
+++ b/drivers/mtd/mtdcore.c
|
||||
@@ -641,20 +641,12 @@ static int mtd_add_device_partitions(str
|
||||
{
|
||||
const struct mtd_partition *real_parts = parts->parts;
|
||||
int nbparts = parts->nr_parts;
|
||||
- int ret;
|
||||
|
||||
- if (nbparts == 0 || IS_ENABLED(CONFIG_MTD_PARTITIONED_MASTER)) {
|
||||
- ret = add_mtd_device(mtd);
|
||||
- if (ret)
|
||||
- return ret;
|
||||
- }
|
||||
+ if (!nbparts && !device_is_registered(&mtd->dev))
|
||||
+ return add_mtd_device(mtd);
|
||||
|
||||
- if (nbparts > 0) {
|
||||
- ret = add_mtd_partitions(mtd, real_parts, nbparts);
|
||||
- if (ret && IS_ENABLED(CONFIG_MTD_PARTITIONED_MASTER))
|
||||
- del_mtd_device(mtd);
|
||||
- return ret;
|
||||
- }
|
||||
+ if (nbparts > 0)
|
||||
+ return add_mtd_partitions(mtd, real_parts, nbparts);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -714,6 +706,12 @@ int mtd_device_parse_register(struct mtd
|
||||
|
||||
mtd_set_dev_defaults(mtd);
|
||||
|
||||
+ if (IS_ENABLED(CONFIG_MTD_PARTITIONED_MASTER)) {
|
||||
+ ret = add_mtd_device(mtd);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
memset(&parsed, 0, sizeof(parsed));
|
||||
|
||||
ret = parse_mtd_partitions(mtd, types, &parsed, parser_data);
|
||||
@@ -753,6 +751,9 @@ int mtd_device_parse_register(struct mtd
|
||||
out:
|
||||
/* Cleanup any parsed partitions */
|
||||
mtd_part_parser_cleanup(&parsed);
|
||||
+ if (ret && device_is_registered(&mtd->dev))
|
||||
+ del_mtd_device(mtd);
|
||||
+
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mtd_device_parse_register);
|
@ -1,93 +0,0 @@
|
||||
From 0dbe4ea78d69756efeb0bba0764f6bd4a9ee9567 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Tue, 16 Jan 2018 16:45:42 +0100
|
||||
Subject: [PATCH] mtd: get rid of the mtd_add_device_partitions()
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This simplifies code a bit by:
|
||||
1) Avoiding an extra (tiny) function
|
||||
2) Checking for amount of parsed (found) partitions just once
|
||||
3) Avoiding clearing/filling struct mtd_partitions manually
|
||||
|
||||
With this commit proper functions are called directly from the
|
||||
mtd_device_parse_register(). It doesn't need to use minor tricks like
|
||||
memsetting struct to 0 to trigger an expected
|
||||
mtd_add_device_partitions() behavior.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
|
||||
---
|
||||
drivers/mtd/mtdcore.c | 43 ++++++++++++-------------------------------
|
||||
1 file changed, 12 insertions(+), 31 deletions(-)
|
||||
|
||||
--- a/drivers/mtd/mtdcore.c
|
||||
+++ b/drivers/mtd/mtdcore.c
|
||||
@@ -636,21 +636,6 @@ out_error:
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static int mtd_add_device_partitions(struct mtd_info *mtd,
|
||||
- struct mtd_partitions *parts)
|
||||
-{
|
||||
- const struct mtd_partition *real_parts = parts->parts;
|
||||
- int nbparts = parts->nr_parts;
|
||||
-
|
||||
- if (!nbparts && !device_is_registered(&mtd->dev))
|
||||
- return add_mtd_device(mtd);
|
||||
-
|
||||
- if (nbparts > 0)
|
||||
- return add_mtd_partitions(mtd, real_parts, nbparts);
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
/*
|
||||
* Set a few defaults based on the parent devices, if not provided by the
|
||||
* driver
|
||||
@@ -701,7 +686,7 @@ int mtd_device_parse_register(struct mtd
|
||||
const struct mtd_partition *parts,
|
||||
int nr_parts)
|
||||
{
|
||||
- struct mtd_partitions parsed;
|
||||
+ struct mtd_partitions parsed = { };
|
||||
int ret;
|
||||
|
||||
mtd_set_dev_defaults(mtd);
|
||||
@@ -712,24 +697,20 @@ int mtd_device_parse_register(struct mtd
|
||||
return ret;
|
||||
}
|
||||
|
||||
- memset(&parsed, 0, sizeof(parsed));
|
||||
-
|
||||
+ /* Prefer parsed partitions over driver-provided fallback */
|
||||
ret = parse_mtd_partitions(mtd, types, &parsed, parser_data);
|
||||
- if ((ret < 0 || parsed.nr_parts == 0) && parts && nr_parts) {
|
||||
- /* Fall back to driver-provided partitions */
|
||||
- parsed = (struct mtd_partitions){
|
||||
- .parts = parts,
|
||||
- .nr_parts = nr_parts,
|
||||
- };
|
||||
- } else if (ret < 0) {
|
||||
- /* Didn't come up with parsed OR fallback partitions */
|
||||
- pr_info("mtd: failed to find partitions; one or more parsers reports errors (%d)\n",
|
||||
- ret);
|
||||
- /* Don't abort on errors; we can still use unpartitioned MTD */
|
||||
- memset(&parsed, 0, sizeof(parsed));
|
||||
+ if (!ret && parsed.nr_parts) {
|
||||
+ parts = parsed.parts;
|
||||
+ nr_parts = parsed.nr_parts;
|
||||
}
|
||||
|
||||
- ret = mtd_add_device_partitions(mtd, &parsed);
|
||||
+ if (nr_parts)
|
||||
+ ret = add_mtd_partitions(mtd, parts, nr_parts);
|
||||
+ else if (!device_is_registered(&mtd->dev))
|
||||
+ ret = add_mtd_device(mtd);
|
||||
+ else
|
||||
+ ret = 0;
|
||||
+
|
||||
if (ret)
|
||||
goto out;
|
||||
|
@ -1,200 +0,0 @@
|
||||
From 5b644aa012f67fd211138a067b9f351f30bdcc60 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 14 Mar 2018 13:10:42 +0100
|
||||
Subject: [PATCH] mtd: partitions: add of_match_table parser matching for the
|
||||
"ofpart" type
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
In order to properly support compatibility strings as described in the
|
||||
bindings/mtd/partition.txt "ofpart" type should be treated as an
|
||||
indication for looking into OF. MTD should check "compatible" property
|
||||
and search for a matching parser rather than blindly trying the one
|
||||
supporting "fixed-partitions".
|
||||
|
||||
It also means that existing "fixed-partitions" parser should get renamed
|
||||
to use a more meaningful name.
|
||||
|
||||
This commit achievies that aim by introducing a new mtd_part_of_parse().
|
||||
It works by looking for a matching parser for every string in the
|
||||
"compatibility" property (starting with the most specific one).
|
||||
|
||||
Please note that driver-specified parsers still take a precedence. It's
|
||||
assumed that driver providing a parser type has a good reason for that
|
||||
(e.g. having platform data with device-specific info). Also doing
|
||||
otherwise could break existing setups. The same applies to using default
|
||||
parsers (including "cmdlinepart") as some overwrite DT data with cmdline
|
||||
argument.
|
||||
|
||||
Partition parsers can now provide an of_match_table to enable
|
||||
flash<-->parser matching via device tree as documented in the
|
||||
mtd/partition.txt.
|
||||
|
||||
This support is currently limited to built-in parsers as it uses
|
||||
request_module() and friends. This should be sufficient for most cases
|
||||
though as compiling parsers as modules isn't a common choice.
|
||||
|
||||
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Tested-by: Peter Rosin <peda@axentia.se>
|
||||
Reviewed-by: Richard Weinberger <richard@nod.at>
|
||||
Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
|
||||
---
|
||||
drivers/mtd/mtdpart.c | 116 +++++++++++++++++++++++++++++++++++++----
|
||||
include/linux/mtd/partitions.h | 1 +
|
||||
2 files changed, 108 insertions(+), 9 deletions(-)
|
||||
|
||||
--- a/drivers/mtd/mtdpart.c
|
||||
+++ b/drivers/mtd/mtdpart.c
|
||||
@@ -30,6 +30,7 @@
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/err.h>
|
||||
+#include <linux/of.h>
|
||||
|
||||
#include "mtdcore.h"
|
||||
|
||||
@@ -919,6 +920,92 @@ static int mtd_part_do_parse(struct mtd_
|
||||
}
|
||||
|
||||
/**
|
||||
+ * mtd_part_get_compatible_parser - find MTD parser by a compatible string
|
||||
+ *
|
||||
+ * @compat: compatible string describing partitions in a device tree
|
||||
+ *
|
||||
+ * MTD parsers can specify supported partitions by providing a table of
|
||||
+ * compatibility strings. This function finds a parser that advertises support
|
||||
+ * for a passed value of "compatible".
|
||||
+ */
|
||||
+static struct mtd_part_parser *mtd_part_get_compatible_parser(const char *compat)
|
||||
+{
|
||||
+ struct mtd_part_parser *p, *ret = NULL;
|
||||
+
|
||||
+ spin_lock(&part_parser_lock);
|
||||
+
|
||||
+ list_for_each_entry(p, &part_parsers, list) {
|
||||
+ const struct of_device_id *matches;
|
||||
+
|
||||
+ matches = p->of_match_table;
|
||||
+ if (!matches)
|
||||
+ continue;
|
||||
+
|
||||
+ for (; matches->compatible[0]; matches++) {
|
||||
+ if (!strcmp(matches->compatible, compat) &&
|
||||
+ try_module_get(p->owner)) {
|
||||
+ ret = p;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (ret)
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ spin_unlock(&part_parser_lock);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int mtd_part_of_parse(struct mtd_info *master,
|
||||
+ struct mtd_partitions *pparts)
|
||||
+{
|
||||
+ struct mtd_part_parser *parser;
|
||||
+ struct device_node *np;
|
||||
+ struct property *prop;
|
||||
+ const char *compat;
|
||||
+ const char *fixed = "ofpart";
|
||||
+ int ret, err = 0;
|
||||
+
|
||||
+ np = of_get_child_by_name(mtd_get_of_node(master), "partitions");
|
||||
+ of_property_for_each_string(np, "compatible", prop, compat) {
|
||||
+ parser = mtd_part_get_compatible_parser(compat);
|
||||
+ if (!parser)
|
||||
+ continue;
|
||||
+ ret = mtd_part_do_parse(parser, master, pparts, NULL);
|
||||
+ if (ret > 0) {
|
||||
+ of_node_put(np);
|
||||
+ return ret;
|
||||
+ }
|
||||
+ mtd_part_parser_put(parser);
|
||||
+ if (ret < 0 && !err)
|
||||
+ err = ret;
|
||||
+ }
|
||||
+ of_node_put(np);
|
||||
+
|
||||
+ /*
|
||||
+ * For backward compatibility we have to try the "ofpart"
|
||||
+ * parser. It supports old DT format with partitions specified as a
|
||||
+ * direct subnodes of a flash device DT node without any compatibility
|
||||
+ * specified we could match.
|
||||
+ */
|
||||
+ parser = mtd_part_parser_get(fixed);
|
||||
+ if (!parser && !request_module("%s", fixed))
|
||||
+ parser = mtd_part_parser_get(fixed);
|
||||
+ if (parser) {
|
||||
+ ret = mtd_part_do_parse(parser, master, pparts, NULL);
|
||||
+ if (ret > 0)
|
||||
+ return ret;
|
||||
+ mtd_part_parser_put(parser);
|
||||
+ if (ret < 0 && !err)
|
||||
+ err = ret;
|
||||
+ }
|
||||
+
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
* parse_mtd_partitions - parse MTD partitions
|
||||
* @master: the master partition (describes whole MTD device)
|
||||
* @types: names of partition parsers to try or %NULL
|
||||
@@ -950,19 +1037,30 @@ int parse_mtd_partitions(struct mtd_info
|
||||
types = default_mtd_part_types;
|
||||
|
||||
for ( ; *types; types++) {
|
||||
- pr_debug("%s: parsing partitions %s\n", master->name, *types);
|
||||
- parser = mtd_part_parser_get(*types);
|
||||
- if (!parser && !request_module("%s", *types))
|
||||
+ /*
|
||||
+ * ofpart is a special type that means OF partitioning info
|
||||
+ * should be used. It requires a bit different logic so it is
|
||||
+ * handled in a separated function.
|
||||
+ */
|
||||
+ if (!strcmp(*types, "ofpart")) {
|
||||
+ ret = mtd_part_of_parse(master, pparts);
|
||||
+ } else {
|
||||
+ pr_debug("%s: parsing partitions %s\n", master->name,
|
||||
+ *types);
|
||||
parser = mtd_part_parser_get(*types);
|
||||
- pr_debug("%s: got parser %s\n", master->name,
|
||||
- parser ? parser->name : NULL);
|
||||
- if (!parser)
|
||||
- continue;
|
||||
- ret = mtd_part_do_parse(parser, master, pparts, data);
|
||||
+ if (!parser && !request_module("%s", *types))
|
||||
+ parser = mtd_part_parser_get(*types);
|
||||
+ pr_debug("%s: got parser %s\n", master->name,
|
||||
+ parser ? parser->name : NULL);
|
||||
+ if (!parser)
|
||||
+ continue;
|
||||
+ ret = mtd_part_do_parse(parser, master, pparts, data);
|
||||
+ if (ret <= 0)
|
||||
+ mtd_part_parser_put(parser);
|
||||
+ }
|
||||
/* Found partitions! */
|
||||
if (ret > 0)
|
||||
return 0;
|
||||
- mtd_part_parser_put(parser);
|
||||
/*
|
||||
* Stash the first error we see; only report it if no parser
|
||||
* succeeds
|
||||
--- a/include/linux/mtd/partitions.h
|
||||
+++ b/include/linux/mtd/partitions.h
|
||||
@@ -77,6 +77,7 @@ struct mtd_part_parser {
|
||||
struct list_head list;
|
||||
struct module *owner;
|
||||
const char *name;
|
||||
+ const struct of_device_id *of_match_table;
|
||||
int (*parse_fn)(struct mtd_info *, const struct mtd_partition **,
|
||||
struct mtd_part_parser_data *);
|
||||
void (*cleanup)(const struct mtd_partition *pparts, int nr_parts);
|
@ -1,74 +0,0 @@
|
||||
From c0faf43482e7f7dfb6d61847cb93d17748560b24 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 14 Mar 2018 13:10:43 +0100
|
||||
Subject: [PATCH] mtd: rename "ofpart" parser to "fixed-partitions" as it fits
|
||||
it better
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Type "ofpart" means that OF should be used to get partitioning info and
|
||||
this driver supports "fixed-partitions" binding only. Renaming it should
|
||||
lead to less confusion especially when parsers for new compatibility
|
||||
strings start to appear.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Reviewed-by: Richard Weinberger <richard@nod.at>
|
||||
Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
|
||||
---
|
||||
drivers/mtd/mtdpart.c | 4 ++--
|
||||
drivers/mtd/ofpart.c | 11 ++++++-----
|
||||
2 files changed, 8 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/drivers/mtd/mtdpart.c
|
||||
+++ b/drivers/mtd/mtdpart.c
|
||||
@@ -965,7 +965,7 @@ static int mtd_part_of_parse(struct mtd_
|
||||
struct device_node *np;
|
||||
struct property *prop;
|
||||
const char *compat;
|
||||
- const char *fixed = "ofpart";
|
||||
+ const char *fixed = "fixed-partitions";
|
||||
int ret, err = 0;
|
||||
|
||||
np = of_get_child_by_name(mtd_get_of_node(master), "partitions");
|
||||
@@ -985,7 +985,7 @@ static int mtd_part_of_parse(struct mtd_
|
||||
of_node_put(np);
|
||||
|
||||
/*
|
||||
- * For backward compatibility we have to try the "ofpart"
|
||||
+ * For backward compatibility we have to try the "fixed-partitions"
|
||||
* parser. It supports old DT format with partitions specified as a
|
||||
* direct subnodes of a flash device DT node without any compatibility
|
||||
* specified we could match.
|
||||
--- a/drivers/mtd/ofpart.c
|
||||
+++ b/drivers/mtd/ofpart.c
|
||||
@@ -25,9 +25,9 @@ static bool node_has_compatible(struct d
|
||||
return of_get_property(pp, "compatible", NULL);
|
||||
}
|
||||
|
||||
-static int parse_ofpart_partitions(struct mtd_info *master,
|
||||
- const struct mtd_partition **pparts,
|
||||
- struct mtd_part_parser_data *data)
|
||||
+static int parse_fixed_partitions(struct mtd_info *master,
|
||||
+ const struct mtd_partition **pparts,
|
||||
+ struct mtd_part_parser_data *data)
|
||||
{
|
||||
struct mtd_partition *parts;
|
||||
struct device_node *mtd_node;
|
||||
@@ -141,8 +141,8 @@ ofpart_none:
|
||||
}
|
||||
|
||||
static struct mtd_part_parser ofpart_parser = {
|
||||
- .parse_fn = parse_ofpart_partitions,
|
||||
- .name = "ofpart",
|
||||
+ .parse_fn = parse_fixed_partitions,
|
||||
+ .name = "fixed-partitions",
|
||||
};
|
||||
|
||||
static int parse_ofoldpart_partitions(struct mtd_info *master,
|
||||
@@ -229,4 +229,5 @@ MODULE_AUTHOR("Vitaly Wool, David Gibson
|
||||
* with the same name. Since we provide the ofoldpart parser, we should have
|
||||
* the corresponding alias.
|
||||
*/
|
||||
+MODULE_ALIAS("fixed-partitions");
|
||||
MODULE_ALIAS("ofoldpart");
|
@ -1,44 +0,0 @@
|
||||
From 97b0c7c0df3efd7048ed39d7e2dee34cafd55887 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 14 Mar 2018 13:10:44 +0100
|
||||
Subject: [PATCH] mtd: ofpart: add of_match_table with "fixed-partitions"
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This allows using this parser with any flash driver that takes care of
|
||||
setting of_node (using mtd_set_of_node helper) correctly. Up to now
|
||||
support for "fixed-partitions" DT compatibility string was working only
|
||||
with flash drivers that were specifying "ofpart" (manually or by letting
|
||||
mtd use the default set of parsers).
|
||||
|
||||
This matches existing bindings documentation.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Reviewed-by: Brian Norris <computersforpeace@gmail.com>
|
||||
Tested-by: Brian Norris <computersforpeace@gmail.com>
|
||||
Reviewed-by: Richard Weinberger <richard@nod.at>
|
||||
Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
|
||||
---
|
||||
drivers/mtd/ofpart.c | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
--- a/drivers/mtd/ofpart.c
|
||||
+++ b/drivers/mtd/ofpart.c
|
||||
@@ -140,9 +140,16 @@ ofpart_none:
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static const struct of_device_id parse_ofpart_match_table[] = {
|
||||
+ { .compatible = "fixed-partitions" },
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, parse_ofpart_match_table);
|
||||
+
|
||||
static struct mtd_part_parser ofpart_parser = {
|
||||
.parse_fn = parse_fixed_partitions,
|
||||
.name = "fixed-partitions",
|
||||
+ .of_match_table = parse_ofpart_match_table,
|
||||
};
|
||||
|
||||
static int parse_ofoldpart_partitions(struct mtd_info *master,
|
@ -1,168 +0,0 @@
|
||||
From 5ac67ce36cfe38b4c104a42ce52c5c8d526f1c95 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Tue, 27 Mar 2018 22:35:41 +0200
|
||||
Subject: [PATCH] mtd: move code adding (registering) partitions to the
|
||||
parse_mtd_partitions()
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This commit slightly simplifies the code. Every parse_mtd_partitions()
|
||||
caller (out of two existing ones) had to add partitions & cleanup parser
|
||||
on its own. This moves that responsibility into the function.
|
||||
|
||||
That change also allows dropping struct mtd_partitions argument.
|
||||
|
||||
There is one minor behavior change caused by this cleanup. If
|
||||
parse_mtd_partitions() fails to add partitions (add_mtd_partitions()
|
||||
return an error) then mtd_device_parse_register() will still try to
|
||||
add (register) fallback partitions. It's a real corner case affecting
|
||||
one of uncommon error paths and shouldn't cause any harm.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
|
||||
---
|
||||
drivers/mtd/mtdcore.c | 14 ++++----------
|
||||
drivers/mtd/mtdcore.h | 1 -
|
||||
drivers/mtd/mtdpart.c | 44 ++++++++++++++++----------------------------
|
||||
3 files changed, 20 insertions(+), 39 deletions(-)
|
||||
|
||||
--- a/drivers/mtd/mtdcore.c
|
||||
+++ b/drivers/mtd/mtdcore.c
|
||||
@@ -686,7 +686,6 @@ int mtd_device_parse_register(struct mtd
|
||||
const struct mtd_partition *parts,
|
||||
int nr_parts)
|
||||
{
|
||||
- struct mtd_partitions parsed = { };
|
||||
int ret;
|
||||
|
||||
mtd_set_dev_defaults(mtd);
|
||||
@@ -698,13 +697,10 @@ int mtd_device_parse_register(struct mtd
|
||||
}
|
||||
|
||||
/* Prefer parsed partitions over driver-provided fallback */
|
||||
- ret = parse_mtd_partitions(mtd, types, &parsed, parser_data);
|
||||
- if (!ret && parsed.nr_parts) {
|
||||
- parts = parsed.parts;
|
||||
- nr_parts = parsed.nr_parts;
|
||||
- }
|
||||
-
|
||||
- if (nr_parts)
|
||||
+ ret = parse_mtd_partitions(mtd, types, parser_data);
|
||||
+ if (ret > 0)
|
||||
+ ret = 0;
|
||||
+ else if (nr_parts)
|
||||
ret = add_mtd_partitions(mtd, parts, nr_parts);
|
||||
else if (!device_is_registered(&mtd->dev))
|
||||
ret = add_mtd_device(mtd);
|
||||
@@ -730,8 +726,6 @@ int mtd_device_parse_register(struct mtd
|
||||
}
|
||||
|
||||
out:
|
||||
- /* Cleanup any parsed partitions */
|
||||
- mtd_part_parser_cleanup(&parsed);
|
||||
if (ret && device_is_registered(&mtd->dev))
|
||||
del_mtd_device(mtd);
|
||||
|
||||
--- a/drivers/mtd/mtdcore.h
|
||||
+++ b/drivers/mtd/mtdcore.h
|
||||
@@ -15,7 +15,6 @@ int del_mtd_partitions(struct mtd_info *
|
||||
struct mtd_partitions;
|
||||
|
||||
int parse_mtd_partitions(struct mtd_info *master, const char * const *types,
|
||||
- struct mtd_partitions *pparts,
|
||||
struct mtd_part_parser_data *data);
|
||||
|
||||
void mtd_part_parser_cleanup(struct mtd_partitions *parts);
|
||||
--- a/drivers/mtd/mtdpart.c
|
||||
+++ b/drivers/mtd/mtdpart.c
|
||||
@@ -383,20 +383,7 @@ static inline void free_partition(struct
|
||||
*/
|
||||
static int mtd_parse_part(struct mtd_part *slave, const char *const *types)
|
||||
{
|
||||
- struct mtd_partitions parsed;
|
||||
- int err;
|
||||
-
|
||||
- err = parse_mtd_partitions(&slave->mtd, types, &parsed, NULL);
|
||||
- if (err)
|
||||
- return err;
|
||||
- else if (!parsed.nr_parts)
|
||||
- return -ENOENT;
|
||||
-
|
||||
- err = add_mtd_partitions(&slave->mtd, parsed.parts, parsed.nr_parts);
|
||||
-
|
||||
- mtd_part_parser_cleanup(&parsed);
|
||||
-
|
||||
- return err;
|
||||
+ return parse_mtd_partitions(&slave->mtd, types, NULL);
|
||||
}
|
||||
|
||||
static struct mtd_part *allocate_partition(struct mtd_info *parent,
|
||||
@@ -1006,30 +993,27 @@ static int mtd_part_of_parse(struct mtd_
|
||||
}
|
||||
|
||||
/**
|
||||
- * parse_mtd_partitions - parse MTD partitions
|
||||
+ * parse_mtd_partitions - parse and register MTD partitions
|
||||
+ *
|
||||
* @master: the master partition (describes whole MTD device)
|
||||
* @types: names of partition parsers to try or %NULL
|
||||
- * @pparts: info about partitions found is returned here
|
||||
* @data: MTD partition parser-specific data
|
||||
*
|
||||
- * This function tries to find partition on MTD device @master. It uses MTD
|
||||
- * partition parsers, specified in @types. However, if @types is %NULL, then
|
||||
- * the default list of parsers is used. The default list contains only the
|
||||
+ * This function tries to find & register partitions on MTD device @master. It
|
||||
+ * uses MTD partition parsers, specified in @types. However, if @types is %NULL,
|
||||
+ * then the default list of parsers is used. The default list contains only the
|
||||
* "cmdlinepart" and "ofpart" parsers ATM.
|
||||
* Note: If there are more then one parser in @types, the kernel only takes the
|
||||
* partitions parsed out by the first parser.
|
||||
*
|
||||
* This function may return:
|
||||
* o a negative error code in case of failure
|
||||
- * o zero otherwise, and @pparts will describe the partitions, number of
|
||||
- * partitions, and the parser which parsed them. Caller must release
|
||||
- * resources with mtd_part_parser_cleanup() when finished with the returned
|
||||
- * data.
|
||||
+ * o number of found partitions otherwise
|
||||
*/
|
||||
int parse_mtd_partitions(struct mtd_info *master, const char *const *types,
|
||||
- struct mtd_partitions *pparts,
|
||||
struct mtd_part_parser_data *data)
|
||||
{
|
||||
+ struct mtd_partitions pparts = { };
|
||||
struct mtd_part_parser *parser;
|
||||
int ret, err = 0;
|
||||
|
||||
@@ -1043,7 +1027,7 @@ int parse_mtd_partitions(struct mtd_info
|
||||
* handled in a separated function.
|
||||
*/
|
||||
if (!strcmp(*types, "ofpart")) {
|
||||
- ret = mtd_part_of_parse(master, pparts);
|
||||
+ ret = mtd_part_of_parse(master, &pparts);
|
||||
} else {
|
||||
pr_debug("%s: parsing partitions %s\n", master->name,
|
||||
*types);
|
||||
@@ -1054,13 +1038,17 @@ int parse_mtd_partitions(struct mtd_info
|
||||
parser ? parser->name : NULL);
|
||||
if (!parser)
|
||||
continue;
|
||||
- ret = mtd_part_do_parse(parser, master, pparts, data);
|
||||
+ ret = mtd_part_do_parse(parser, master, &pparts, data);
|
||||
if (ret <= 0)
|
||||
mtd_part_parser_put(parser);
|
||||
}
|
||||
/* Found partitions! */
|
||||
- if (ret > 0)
|
||||
- return 0;
|
||||
+ if (ret > 0) {
|
||||
+ err = add_mtd_partitions(master, pparts.parts,
|
||||
+ pparts.nr_parts);
|
||||
+ mtd_part_parser_cleanup(&pparts);
|
||||
+ return err ? err : pparts.nr_parts;
|
||||
+ }
|
||||
/*
|
||||
* Stash the first error we see; only report it if no parser
|
||||
* succeeds
|
@ -1,70 +0,0 @@
|
||||
From 237ea0d4762cc14d0fc80e80d61f0f08e1050c7f Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Thu, 12 Apr 2018 07:24:52 +0200
|
||||
Subject: [PATCH] mtd: bcm47xxpart: improve handling TRX partition size
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
When bcm47xxpart finds a TRX partition (container) it's supposed to jump
|
||||
to the end of it and keep looking for more partitions. TRX and its
|
||||
subpartitions are handled by a separate parser.
|
||||
|
||||
The problem with old code was relying on the length specified in a TRX
|
||||
header. That isn't reliable as TRX is commonly modified to have checksum
|
||||
cover only non-changing subpartitions. Otherwise modifying e.g. a rootfs
|
||||
would result in CRC32 mismatch and bootloader refusing to boot a
|
||||
firmware.
|
||||
|
||||
Fix it by trying better to figure out a real TRX size. We can securely
|
||||
assume that TRX has to cover all subpartitions and the last one is at
|
||||
least of a block size in size. Then compare it with a length field.
|
||||
|
||||
This makes code more optimal & reliable thanks to skipping data that
|
||||
shouldn't be parsed.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
|
||||
---
|
||||
drivers/mtd/bcm47xxpart.c | 22 ++++++++++++++++++----
|
||||
1 file changed, 18 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/mtd/bcm47xxpart.c
|
||||
+++ b/drivers/mtd/bcm47xxpart.c
|
||||
@@ -186,6 +186,8 @@ static int bcm47xxpart_parse(struct mtd_
|
||||
/* TRX */
|
||||
if (buf[0x000 / 4] == TRX_MAGIC) {
|
||||
struct trx_header *trx;
|
||||
+ uint32_t last_subpart;
|
||||
+ uint32_t trx_size;
|
||||
|
||||
if (trx_num >= ARRAY_SIZE(trx_parts))
|
||||
pr_warn("No enough space to store another TRX found at 0x%X\n",
|
||||
@@ -195,11 +197,23 @@ static int bcm47xxpart_parse(struct mtd_
|
||||
bcm47xxpart_add_part(&parts[curr_part++], "firmware",
|
||||
offset, 0);
|
||||
|
||||
- /* Jump to the end of TRX */
|
||||
+ /*
|
||||
+ * Try to find TRX size. The "length" field isn't fully
|
||||
+ * reliable as it could be decreased to make CRC32 cover
|
||||
+ * only part of TRX data. It's commonly used as checksum
|
||||
+ * can't cover e.g. ever-changing rootfs partition.
|
||||
+ * Use offsets as helpers for assuming min TRX size.
|
||||
+ */
|
||||
trx = (struct trx_header *)buf;
|
||||
- offset = roundup(offset + trx->length, blocksize);
|
||||
- /* Next loop iteration will increase the offset */
|
||||
- offset -= blocksize;
|
||||
+ last_subpart = max3(trx->offset[0], trx->offset[1],
|
||||
+ trx->offset[2]);
|
||||
+ trx_size = max(trx->length, last_subpart + blocksize);
|
||||
+
|
||||
+ /*
|
||||
+ * Skip the TRX data. Decrease offset by block size as
|
||||
+ * the next loop iteration will increase it.
|
||||
+ */
|
||||
+ offset += roundup(trx_size, blocksize) - blocksize;
|
||||
continue;
|
||||
}
|
||||
|
@ -1,39 +0,0 @@
|
||||
From cf589ce71e84d3b8811c65740645af254c5248c0 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 9 May 2018 10:17:29 +0200
|
||||
Subject: [PATCH] mtd: bcm47xxpart: add of_match_table with a new DT binding
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This allows using bcm47xxpart parser to find partitions on flash
|
||||
described in DT using the "brcm,bcm947xx-cfe-partitions" compatible
|
||||
property. It means this parser doesn't have to be explicitly selected by
|
||||
a flash driver anymore. It can be used e.g. together with a generic
|
||||
m25p80 / spi-nor if device is just properly described.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
|
||||
---
|
||||
drivers/mtd/bcm47xxpart.c | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
--- a/drivers/mtd/bcm47xxpart.c
|
||||
+++ b/drivers/mtd/bcm47xxpart.c
|
||||
@@ -304,9 +304,16 @@ static int bcm47xxpart_parse(struct mtd_
|
||||
return curr_part;
|
||||
};
|
||||
|
||||
+static const struct of_device_id bcm47xxpart_of_match_table[] = {
|
||||
+ { .compatible = "brcm,bcm947xx-cfe-partitions" },
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, bcm47xxpart_of_match_table);
|
||||
+
|
||||
static struct mtd_part_parser bcm47xxpart_mtd_parser = {
|
||||
.parse_fn = bcm47xxpart_parse,
|
||||
.name = "bcm47xxpart",
|
||||
+ .of_match_table = bcm47xxpart_of_match_table,
|
||||
};
|
||||
module_mtd_part_parser(bcm47xxpart_mtd_parser);
|
||||
|
@ -1,37 +0,0 @@
|
||||
From 98534a58c8a40cdc9e3bcb04d74719fbcedfeb52 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Tue, 26 Jun 2018 00:05:08 +0200
|
||||
Subject: [PATCH] mtd: parsers: trx: add of_match_table with the new DT binding
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This allows using TRX parser to find TRX partitions on flash device
|
||||
described in DT using a proper binding. It's useful for devices storing
|
||||
firmware on a separated flash and having rootfs partition in it.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
|
||||
---
|
||||
drivers/mtd/parsers/parser_trx.c | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
--- a/drivers/mtd/parsers/parser_trx.c
|
||||
+++ b/drivers/mtd/parsers/parser_trx.c
|
||||
@@ -116,9 +116,16 @@ static int parser_trx_parse(struct mtd_i
|
||||
return i;
|
||||
};
|
||||
|
||||
+static const struct of_device_id mtd_parser_trx_of_match_table[] = {
|
||||
+ { .compatible = "brcm,trx" },
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, mtd_parser_trx_of_match_table);
|
||||
+
|
||||
static struct mtd_part_parser mtd_parser_trx = {
|
||||
.parse_fn = parser_trx_parse,
|
||||
.name = "trx",
|
||||
+ .of_match_table = mtd_parser_trx_of_match_table,
|
||||
};
|
||||
module_mtd_part_parser(mtd_parser_trx);
|
||||
|
@ -1,102 +0,0 @@
|
||||
From 76a832254ab05502c9394cc51ded6f0abe0e0bee Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Fri, 13 Jul 2018 16:32:21 +0200
|
||||
Subject: [PATCH] mtd: partitions: use DT info for parsing partitions with
|
||||
"compatible" prop
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
So far only flash devices could be described in DT regarding partitions
|
||||
parsing. That could be done with "partitions" subnode and a proper
|
||||
"compatible" string.
|
||||
|
||||
Some devices may use hierarchical (multi-level) layouts and may mix used
|
||||
layouts (fixed and dynamic). Describing that in DT is done by specifying
|
||||
"compatible" for DT-represented partition plus optionally more
|
||||
properties and/or subnodes.
|
||||
|
||||
To support such layouts each DT partition has to be checked for
|
||||
additional description.
|
||||
|
||||
Please note this implementation will work in parallel with support for
|
||||
partition type specified for non-DT setups. That already works since
|
||||
commit 1a0915be1926 ("mtd: partitions: add support for partition
|
||||
parsers").
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
|
||||
---
|
||||
drivers/mtd/mtdpart.c | 33 +++++++++++++--------------------
|
||||
1 file changed, 13 insertions(+), 20 deletions(-)
|
||||
|
||||
--- a/drivers/mtd/mtdpart.c
|
||||
+++ b/drivers/mtd/mtdpart.c
|
||||
@@ -370,22 +370,6 @@ static inline void free_partition(struct
|
||||
kfree(p);
|
||||
}
|
||||
|
||||
-/**
|
||||
- * mtd_parse_part - parse MTD partition looking for subpartitions
|
||||
- *
|
||||
- * @slave: part that is supposed to be a container and should be parsed
|
||||
- * @types: NULL-terminated array with names of partition parsers to try
|
||||
- *
|
||||
- * Some partitions are kind of containers with extra subpartitions (volumes).
|
||||
- * There can be various formats of such containers. This function tries to use
|
||||
- * specified parsers to analyze given partition and registers found
|
||||
- * subpartitions on success.
|
||||
- */
|
||||
-static int mtd_parse_part(struct mtd_part *slave, const char *const *types)
|
||||
-{
|
||||
- return parse_mtd_partitions(&slave->mtd, types, NULL);
|
||||
-}
|
||||
-
|
||||
static struct mtd_part *allocate_partition(struct mtd_info *parent,
|
||||
const struct mtd_partition *part, int partno,
|
||||
uint64_t cur_offset)
|
||||
@@ -803,8 +787,8 @@ int add_mtd_partitions(struct mtd_info *
|
||||
}
|
||||
|
||||
mtd_add_partition_attrs(slave);
|
||||
- if (parts[i].types)
|
||||
- mtd_parse_part(slave, parts[i].types);
|
||||
+ /* Look for subpartitions */
|
||||
+ parse_mtd_partitions(&slave->mtd, parts[i].types, NULL);
|
||||
|
||||
cur_offset = slave->offset + slave->mtd.size;
|
||||
}
|
||||
@@ -885,6 +869,12 @@ static const char * const default_mtd_pa
|
||||
NULL
|
||||
};
|
||||
|
||||
+/* Check DT only when looking for subpartitions. */
|
||||
+static const char * const default_subpartition_types[] = {
|
||||
+ "ofpart",
|
||||
+ NULL
|
||||
+};
|
||||
+
|
||||
static int mtd_part_do_parse(struct mtd_part_parser *parser,
|
||||
struct mtd_info *master,
|
||||
struct mtd_partitions *pparts,
|
||||
@@ -955,7 +945,9 @@ static int mtd_part_of_parse(struct mtd_
|
||||
const char *fixed = "fixed-partitions";
|
||||
int ret, err = 0;
|
||||
|
||||
- np = of_get_child_by_name(mtd_get_of_node(master), "partitions");
|
||||
+ np = mtd_get_of_node(master);
|
||||
+ if (!mtd_is_partition(master))
|
||||
+ np = of_get_child_by_name(np, "partitions");
|
||||
of_property_for_each_string(np, "compatible", prop, compat) {
|
||||
parser = mtd_part_get_compatible_parser(compat);
|
||||
if (!parser)
|
||||
@@ -1018,7 +1010,8 @@ int parse_mtd_partitions(struct mtd_info
|
||||
int ret, err = 0;
|
||||
|
||||
if (!types)
|
||||
- types = default_mtd_part_types;
|
||||
+ types = mtd_is_partition(master) ? default_subpartition_types :
|
||||
+ default_mtd_part_types;
|
||||
|
||||
for ( ; *types; types++) {
|
||||
/*
|
@ -1,58 +0,0 @@
|
||||
From 1186af457cc186c5ed01708da71b1ffbdf0a2638 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Tue, 20 Nov 2018 09:55:45 +0100
|
||||
Subject: [PATCH] mtd: keep original flags for every struct mtd_info
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
When allocating a new partition mtd subsystem runs internal tests in the
|
||||
allocate_partition(). They may result in modifying specified flags (e.g.
|
||||
dropping some /features/ like write access).
|
||||
|
||||
Those constraints don't have to be necessary true for subpartitions. It
|
||||
may happen parent partition isn't block aligned (effectively disabling
|
||||
write access) while subpartition may fit blocks nicely. In such case all
|
||||
checks should be run again (starting with original flags value).
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
|
||||
---
|
||||
drivers/mtd/mtdcore.c | 2 ++
|
||||
drivers/mtd/mtdpart.c | 3 ++-
|
||||
include/linux/mtd/mtd.h | 1 +
|
||||
3 files changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/mtd/mtdcore.c
|
||||
+++ b/drivers/mtd/mtdcore.c
|
||||
@@ -650,6 +650,8 @@ static void mtd_set_dev_defaults(struct
|
||||
} else {
|
||||
pr_debug("mtd device won't show a device symlink in sysfs\n");
|
||||
}
|
||||
+
|
||||
+ mtd->orig_flags = mtd->flags;
|
||||
}
|
||||
|
||||
/**
|
||||
--- a/drivers/mtd/mtdpart.c
|
||||
+++ b/drivers/mtd/mtdpart.c
|
||||
@@ -394,7 +394,8 @@ static struct mtd_part *allocate_partiti
|
||||
|
||||
/* set up the MTD object for this partition */
|
||||
slave->mtd.type = parent->type;
|
||||
- slave->mtd.flags = parent->flags & ~part->mask_flags;
|
||||
+ slave->mtd.flags = parent->orig_flags & ~part->mask_flags;
|
||||
+ slave->mtd.orig_flags = slave->mtd.flags;
|
||||
slave->mtd.size = part->size;
|
||||
slave->mtd.writesize = parent->writesize;
|
||||
slave->mtd.writebufsize = parent->writebufsize;
|
||||
--- a/include/linux/mtd/mtd.h
|
||||
+++ b/include/linux/mtd/mtd.h
|
||||
@@ -218,6 +218,7 @@ struct mtd_debug_info {
|
||||
struct mtd_info {
|
||||
u_char type;
|
||||
uint32_t flags;
|
||||
+ uint32_t orig_flags; /* Flags as before running mtd checks */
|
||||
uint64_t size; // Total size of the MTD
|
||||
|
||||
/* "Major" erase size for the device. Naïve users may take this
|
@ -1,55 +0,0 @@
|
||||
From 6750f61a13a0197c40e4a40739117493b15f19e8 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Tue, 20 Nov 2018 10:24:09 +0100
|
||||
Subject: [PATCH] mtd: improve calculating partition boundaries when checking
|
||||
for alignment
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
When checking for alignment mtd should check absolute offsets. It's
|
||||
important for subpartitions as it doesn't make sense to check their
|
||||
relative addresses.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
|
||||
---
|
||||
drivers/mtd/mtdpart.c | 13 +++++++++++--
|
||||
1 file changed, 11 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/mtd/mtdpart.c
|
||||
+++ b/drivers/mtd/mtdpart.c
|
||||
@@ -61,6 +61,15 @@ static inline struct mtd_part *mtd_to_pa
|
||||
return container_of(mtd, struct mtd_part, mtd);
|
||||
}
|
||||
|
||||
+static u64 part_absolute_offset(struct mtd_info *mtd)
|
||||
+{
|
||||
+ struct mtd_part *part = mtd_to_part(mtd);
|
||||
+
|
||||
+ if (!mtd_is_partition(mtd))
|
||||
+ return 0;
|
||||
+
|
||||
+ return part_absolute_offset(part->parent) + part->offset;
|
||||
+}
|
||||
|
||||
/*
|
||||
* MTD methods which simply translate the effective address and pass through
|
||||
@@ -562,7 +571,7 @@ static struct mtd_part *allocate_partiti
|
||||
if (!(slave->mtd.flags & MTD_NO_ERASE))
|
||||
wr_alignment = slave->mtd.erasesize;
|
||||
|
||||
- tmp = slave->offset;
|
||||
+ tmp = part_absolute_offset(parent) + slave->offset;
|
||||
remainder = do_div(tmp, wr_alignment);
|
||||
if ((slave->mtd.flags & MTD_WRITEABLE) && remainder) {
|
||||
/* Doesn't start on a boundary of major erase size */
|
||||
@@ -573,7 +582,7 @@ static struct mtd_part *allocate_partiti
|
||||
part->name);
|
||||
}
|
||||
|
||||
- tmp = slave->mtd.size;
|
||||
+ tmp = part_absolute_offset(parent) + slave->mtd.size;
|
||||
remainder = do_div(tmp, wr_alignment);
|
||||
if ((slave->mtd.flags & MTD_WRITEABLE) && remainder) {
|
||||
slave->mtd.flags &= ~MTD_WRITEABLE;
|
@ -1,69 +0,0 @@
|
||||
From dda9f4b9cac6bdd2a96253b4444d7a6ce5132edb Mon Sep 17 00:00:00 2001
|
||||
From: Chao Yu <yuchao0@huawei.com>
|
||||
Date: Sat, 11 Aug 2018 23:42:09 +0800
|
||||
Subject: f2fs: fix to skip verifying block address for non-regular inode
|
||||
|
||||
generic/184 1s ... [failed, exit status 1]- output mismatch
|
||||
--- tests/generic/184.out 2015-01-11 16:52:27.643681072 +0800
|
||||
QA output created by 184 - silence is golden
|
||||
+rm: cannot remove '/mnt/f2fs/null': Bad address
|
||||
+mknod: '/mnt/f2fs/null': Bad address
|
||||
+chmod: cannot access '/mnt/f2fs/null': Bad address
|
||||
+./tests/generic/184: line 36: /mnt/f2fs/null: Bad address
|
||||
...
|
||||
|
||||
F2FS-fs (zram0): access invalid blkaddr:259
|
||||
EIP: f2fs_is_valid_blkaddr+0x14b/0x1b0 [f2fs]
|
||||
f2fs_iget+0x927/0x1010 [f2fs]
|
||||
f2fs_lookup+0x26e/0x630 [f2fs]
|
||||
__lookup_slow+0xb3/0x140
|
||||
lookup_slow+0x31/0x50
|
||||
walk_component+0x185/0x1f0
|
||||
path_lookupat+0x51/0x190
|
||||
filename_lookup+0x7f/0x140
|
||||
user_path_at_empty+0x36/0x40
|
||||
vfs_statx+0x61/0xc0
|
||||
__do_sys_stat64+0x29/0x40
|
||||
sys_stat64+0x13/0x20
|
||||
do_fast_syscall_32+0xaa/0x22c
|
||||
entry_SYSENTER_32+0x53/0x86
|
||||
|
||||
In f2fs_iget(), we will check inode's first block address, if it is valid,
|
||||
we will set FI_FIRST_BLOCK_WRITTEN flag in inode.
|
||||
|
||||
But we should only do this for regular inode, otherwise, like special
|
||||
inode, i_addr[0] is used for storing device info instead of block address,
|
||||
it will fail checking flow obviously.
|
||||
|
||||
So for non-regular inode, let's skip verifying address and setting flag.
|
||||
|
||||
Signed-off-by: Chao Yu <yuchao0@huawei.com>
|
||||
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
|
||||
---
|
||||
fs/f2fs/inode.c | 14 ++++++++------
|
||||
1 file changed, 8 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/fs/f2fs/inode.c
|
||||
+++ b/fs/f2fs/inode.c
|
||||
@@ -310,13 +310,15 @@ static int do_read_inode(struct inode *i
|
||||
/* get rdev by using inline_info */
|
||||
__get_inode_rdev(inode, ri);
|
||||
|
||||
- err = __written_first_block(sbi, ri);
|
||||
- if (err < 0) {
|
||||
- f2fs_put_page(node_page, 1);
|
||||
- return err;
|
||||
+ if (S_ISREG(inode->i_mode)) {
|
||||
+ err = __written_first_block(sbi, ri);
|
||||
+ if (err < 0) {
|
||||
+ f2fs_put_page(node_page, 1);
|
||||
+ return err;
|
||||
+ }
|
||||
+ if (!err)
|
||||
+ set_inode_flag(inode, FI_FIRST_BLOCK_WRITTEN);
|
||||
}
|
||||
- if (!err)
|
||||
- set_inode_flag(inode, FI_FIRST_BLOCK_WRITTEN);
|
||||
|
||||
if (!need_inode_block_update(sbi, inode->i_ino))
|
||||
fi->last_disk_size = inode->i_size;
|
@ -1,50 +0,0 @@
|
||||
From 12acd136913ccdf394eeb2bc8686ff5505368119 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Thu, 12 Oct 2017 10:21:26 +0200
|
||||
Subject: [PATCH] net: bgmac: enable master mode for BCM54210E and B50212E PHYs
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
There are 4 very similar PHYs:
|
||||
0x600d84a1: BCM54210E (rev B0)
|
||||
0x600d84a2: BCM54210E (rev B1)
|
||||
0x600d84a5: B50212E (rev B0)
|
||||
0x600d84a6: B50212E (rev B1)
|
||||
that need setting master mode manually. It's because they run in slave
|
||||
mode by default with Automatic Slave/Master configuration disabled which
|
||||
can lead to unreliable connection with massive ping loss.
|
||||
|
||||
So far it was reported for a board with BCM47189 SoC and B50212E B1 PHY
|
||||
connected to the bgmac supported ethernet device. Telling PHY driver to
|
||||
setup PHY properly solves this issue.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/net/ethernet/broadcom/bgmac-bcma.c | 8 +++++++-
|
||||
1 file changed, 7 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/ethernet/broadcom/bgmac-bcma.c
|
||||
+++ b/drivers/net/ethernet/broadcom/bgmac-bcma.c
|
||||
@@ -184,13 +184,19 @@ static int bgmac_probe(struct bcma_devic
|
||||
|
||||
if (!bgmac_is_bcm4707_family(core) &&
|
||||
!(ci->id == BCMA_CHIP_ID_BCM53573 && core->core_unit == 1)) {
|
||||
+ struct phy_device *phydev;
|
||||
+
|
||||
mii_bus = bcma_mdio_mii_register(bgmac);
|
||||
if (IS_ERR(mii_bus)) {
|
||||
err = PTR_ERR(mii_bus);
|
||||
goto err;
|
||||
}
|
||||
-
|
||||
bgmac->mii_bus = mii_bus;
|
||||
+
|
||||
+ phydev = mdiobus_get_phy(bgmac->mii_bus, bgmac->phyaddr);
|
||||
+ if (ci->id == BCMA_CHIP_ID_BCM53573 && phydev &&
|
||||
+ (phydev->drv->phy_id & phydev->drv->phy_id_mask) == PHY_ID_BCM54210E)
|
||||
+ phydev->dev_flags |= PHY_BRCM_EN_MASTER_MODE;
|
||||
}
|
||||
|
||||
if (core->bus->hosttype == BCMA_HOSTTYPE_PCI) {
|
@ -1,54 +0,0 @@
|
||||
From 2355a6546a053b1c16ebefd6ce1f0cccc00e1da5 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Thu, 12 Oct 2017 10:21:25 +0200
|
||||
Subject: [PATCH] net: phy: broadcom: support new device flag for setting
|
||||
master mode
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Some of Broadcom's PHYs run by default in slave mode with Automatic
|
||||
Slave/Master configuration disabled. It stops them from working properly
|
||||
with some devices.
|
||||
|
||||
So far it has been verified for BCM54210E and BCM50212E which don't
|
||||
work well with Intel's I217-LM and I218-LM:
|
||||
http://ark.intel.com/products/60019/Intel-Ethernet-Connection-I217-LM
|
||||
http://ark.intel.com/products/71307/Intel-Ethernet-Connection-I218-LM
|
||||
I was told there is massive ping loss.
|
||||
|
||||
This commit adds support for a new flag which can be set by an ethernet
|
||||
driver to fixup PHY setup.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/net/phy/broadcom.c | 6 ++++++
|
||||
include/linux/brcmphy.h | 1 +
|
||||
2 files changed, 7 insertions(+)
|
||||
|
||||
--- a/drivers/net/phy/broadcom.c
|
||||
+++ b/drivers/net/phy/broadcom.c
|
||||
@@ -43,6 +43,12 @@ static int bcm54210e_config_init(struct
|
||||
val &= ~BCM54810_SHD_CLK_CTL_GTXCLK_EN;
|
||||
bcm_phy_write_shadow(phydev, BCM54810_SHD_CLK_CTL, val);
|
||||
|
||||
+ if (phydev->dev_flags & PHY_BRCM_EN_MASTER_MODE) {
|
||||
+ val = phy_read(phydev, MII_CTRL1000);
|
||||
+ val |= CTL1000_AS_MASTER | CTL1000_ENABLE_MASTER;
|
||||
+ phy_write(phydev, MII_CTRL1000, val);
|
||||
+ }
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
--- a/include/linux/brcmphy.h
|
||||
+++ b/include/linux/brcmphy.h
|
||||
@@ -64,6 +64,7 @@
|
||||
#define PHY_BRCM_EXT_IBND_TX_ENABLE 0x00002000
|
||||
#define PHY_BRCM_CLEAR_RGMII_MODE 0x00004000
|
||||
#define PHY_BRCM_DIS_TXCRXC_NOENRGY 0x00008000
|
||||
+#define PHY_BRCM_EN_MASTER_MODE 0x00010000
|
||||
|
||||
/* Broadcom BCM7xxx specific workarounds */
|
||||
#define PHY_BRCM_7XXX_REV(x) (((x) >> 8) & 0xff)
|
@ -1,199 +0,0 @@
|
||||
From 5a1c18b761ddb299a06746948b9ec2814b04fa92 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 2 Jan 2019 00:00:01 +0100
|
||||
Subject: [PATCH] bcma: keep a direct pointer to the struct device
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Accessing struct device is pretty useful/common so having a direct
|
||||
pointer:
|
||||
1) Simplifies some code
|
||||
2) Makes bcma_bus_get_host_dev() unneeded
|
||||
3) Allows further improvements like using dev_* printing helpers
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/bcma/bcma_private.h | 1 -
|
||||
drivers/bcma/driver_gpio.c | 2 +-
|
||||
drivers/bcma/host_pci.c | 2 ++
|
||||
drivers/bcma/host_soc.c | 4 ++--
|
||||
drivers/bcma/main.c | 45 +++++++++----------------------------
|
||||
include/linux/bcma/bcma.h | 11 +++------
|
||||
6 files changed, 18 insertions(+), 47 deletions(-)
|
||||
|
||||
--- a/drivers/bcma/bcma_private.h
|
||||
+++ b/drivers/bcma/bcma_private.h
|
||||
@@ -33,7 +33,6 @@ int __init bcma_bus_early_register(struc
|
||||
int bcma_bus_suspend(struct bcma_bus *bus);
|
||||
int bcma_bus_resume(struct bcma_bus *bus);
|
||||
#endif
|
||||
-struct device *bcma_bus_get_host_dev(struct bcma_bus *bus);
|
||||
|
||||
/* scan.c */
|
||||
void bcma_detect_chip(struct bcma_bus *bus);
|
||||
--- a/drivers/bcma/driver_gpio.c
|
||||
+++ b/drivers/bcma/driver_gpio.c
|
||||
@@ -183,7 +183,7 @@ int bcma_gpio_init(struct bcma_drv_cc *c
|
||||
chip->direction_input = bcma_gpio_direction_input;
|
||||
chip->direction_output = bcma_gpio_direction_output;
|
||||
chip->owner = THIS_MODULE;
|
||||
- chip->parent = bcma_bus_get_host_dev(bus);
|
||||
+ chip->parent = bus->dev;
|
||||
#if IS_BUILTIN(CONFIG_OF)
|
||||
chip->of_node = cc->core->dev.of_node;
|
||||
#endif
|
||||
--- a/drivers/bcma/host_pci.c
|
||||
+++ b/drivers/bcma/host_pci.c
|
||||
@@ -196,6 +196,8 @@ static int bcma_host_pci_probe(struct pc
|
||||
goto err_pci_release_regions;
|
||||
}
|
||||
|
||||
+ bus->dev = &dev->dev;
|
||||
+
|
||||
/* Map MMIO */
|
||||
err = -ENOMEM;
|
||||
bus->mmio = pci_iomap(dev, 0, ~0UL);
|
||||
--- a/drivers/bcma/host_soc.c
|
||||
+++ b/drivers/bcma/host_soc.c
|
||||
@@ -179,7 +179,6 @@ int __init bcma_host_soc_register(struct
|
||||
/* Host specific */
|
||||
bus->hosttype = BCMA_HOSTTYPE_SOC;
|
||||
bus->ops = &bcma_host_soc_ops;
|
||||
- bus->host_pdev = NULL;
|
||||
|
||||
/* Initialize struct, detect chip */
|
||||
bcma_init_bus(bus);
|
||||
@@ -213,6 +212,8 @@ static int bcma_host_soc_probe(struct pl
|
||||
if (!bus)
|
||||
return -ENOMEM;
|
||||
|
||||
+ bus->dev = dev;
|
||||
+
|
||||
/* Map MMIO */
|
||||
bus->mmio = of_iomap(np, 0);
|
||||
if (!bus->mmio)
|
||||
@@ -221,7 +222,6 @@ static int bcma_host_soc_probe(struct pl
|
||||
/* Host specific */
|
||||
bus->hosttype = BCMA_HOSTTYPE_SOC;
|
||||
bus->ops = &bcma_host_soc_ops;
|
||||
- bus->host_pdev = pdev;
|
||||
|
||||
/* Initialize struct, detect chip */
|
||||
bcma_init_bus(bus);
|
||||
--- a/drivers/bcma/main.c
|
||||
+++ b/drivers/bcma/main.c
|
||||
@@ -223,8 +223,8 @@ unsigned int bcma_core_irq(struct bcma_d
|
||||
mips_irq = bcma_core_mips_irq(core);
|
||||
return mips_irq <= 4 ? mips_irq + 2 : 0;
|
||||
}
|
||||
- if (bus->host_pdev)
|
||||
- return bcma_of_get_irq(&bus->host_pdev->dev, core, num);
|
||||
+ if (bus->dev)
|
||||
+ return bcma_of_get_irq(bus->dev, core, num);
|
||||
return 0;
|
||||
case BCMA_HOSTTYPE_SDIO:
|
||||
return 0;
|
||||
@@ -239,18 +239,18 @@ void bcma_prepare_core(struct bcma_bus *
|
||||
core->dev.release = bcma_release_core_dev;
|
||||
core->dev.bus = &bcma_bus_type;
|
||||
dev_set_name(&core->dev, "bcma%d:%d", bus->num, core->core_index);
|
||||
- core->dev.parent = bcma_bus_get_host_dev(bus);
|
||||
- if (core->dev.parent)
|
||||
- bcma_of_fill_device(core->dev.parent, core);
|
||||
+ core->dev.parent = bus->dev;
|
||||
+ if (bus->dev)
|
||||
+ bcma_of_fill_device(bus->dev, core);
|
||||
|
||||
switch (bus->hosttype) {
|
||||
case BCMA_HOSTTYPE_PCI:
|
||||
- core->dma_dev = &bus->host_pci->dev;
|
||||
+ core->dma_dev = bus->dev;
|
||||
core->irq = bus->host_pci->irq;
|
||||
break;
|
||||
case BCMA_HOSTTYPE_SOC:
|
||||
- if (IS_ENABLED(CONFIG_OF) && bus->host_pdev) {
|
||||
- core->dma_dev = &bus->host_pdev->dev;
|
||||
+ if (IS_ENABLED(CONFIG_OF) && bus->dev) {
|
||||
+ core->dma_dev = bus->dev;
|
||||
} else {
|
||||
core->dev.dma_mask = &core->dev.coherent_dma_mask;
|
||||
core->dma_dev = &core->dev;
|
||||
@@ -261,28 +261,6 @@ void bcma_prepare_core(struct bcma_bus *
|
||||
}
|
||||
}
|
||||
|
||||
-struct device *bcma_bus_get_host_dev(struct bcma_bus *bus)
|
||||
-{
|
||||
- switch (bus->hosttype) {
|
||||
- case BCMA_HOSTTYPE_PCI:
|
||||
- if (bus->host_pci)
|
||||
- return &bus->host_pci->dev;
|
||||
- else
|
||||
- return NULL;
|
||||
- case BCMA_HOSTTYPE_SOC:
|
||||
- if (bus->host_pdev)
|
||||
- return &bus->host_pdev->dev;
|
||||
- else
|
||||
- return NULL;
|
||||
- case BCMA_HOSTTYPE_SDIO:
|
||||
- if (bus->host_sdio)
|
||||
- return &bus->host_sdio->dev;
|
||||
- else
|
||||
- return NULL;
|
||||
- }
|
||||
- return NULL;
|
||||
-}
|
||||
-
|
||||
void bcma_init_bus(struct bcma_bus *bus)
|
||||
{
|
||||
mutex_lock(&bcma_buses_mutex);
|
||||
@@ -402,7 +380,6 @@ int bcma_bus_register(struct bcma_bus *b
|
||||
{
|
||||
int err;
|
||||
struct bcma_device *core;
|
||||
- struct device *dev;
|
||||
|
||||
/* Scan for devices (cores) */
|
||||
err = bcma_bus_scan(bus);
|
||||
@@ -425,10 +402,8 @@ int bcma_bus_register(struct bcma_bus *b
|
||||
bcma_core_pci_early_init(&bus->drv_pci[0]);
|
||||
}
|
||||
|
||||
- dev = bcma_bus_get_host_dev(bus);
|
||||
- if (dev) {
|
||||
- of_platform_default_populate(dev->of_node, NULL, dev);
|
||||
- }
|
||||
+ if (bus->dev)
|
||||
+ of_platform_default_populate(bus->dev->of_node, NULL, bus->dev);
|
||||
|
||||
/* Cores providing flash access go before SPROM init */
|
||||
list_for_each_entry(core, &bus->cores, list) {
|
||||
--- a/include/linux/bcma/bcma.h
|
||||
+++ b/include/linux/bcma/bcma.h
|
||||
@@ -332,6 +332,8 @@ extern int bcma_arch_register_fallback_s
|
||||
struct ssb_sprom *out));
|
||||
|
||||
struct bcma_bus {
|
||||
+ struct device *dev;
|
||||
+
|
||||
/* The MMIO area. */
|
||||
void __iomem *mmio;
|
||||
|
||||
@@ -339,14 +341,7 @@ struct bcma_bus {
|
||||
|
||||
enum bcma_hosttype hosttype;
|
||||
bool host_is_pcie2; /* Used for BCMA_HOSTTYPE_PCI only */
|
||||
- union {
|
||||
- /* Pointer to the PCI bus (only for BCMA_HOSTTYPE_PCI) */
|
||||
- struct pci_dev *host_pci;
|
||||
- /* Pointer to the SDIO device (only for BCMA_HOSTTYPE_SDIO) */
|
||||
- struct sdio_func *host_sdio;
|
||||
- /* Pointer to platform device (only for BCMA_HOSTTYPE_SOC) */
|
||||
- struct platform_device *host_pdev;
|
||||
- };
|
||||
+ struct pci_dev *host_pci; /* PCI bus pointer (BCMA_HOSTTYPE_PCI only) */
|
||||
|
||||
struct bcma_chipinfo chipinfo;
|
||||
|
@ -1,36 +0,0 @@
|
||||
From 777bc4801a6868fcbff09ffb6e30f023e7c5ed38 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||
Date: Wed, 2 Jan 2019 00:00:02 +0100
|
||||
Subject: [PATCH] bcma: use dev_* printing functions
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
It provides more meaningful messages.
|
||||
|
||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||||
---
|
||||
drivers/bcma/bcma_private.h | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/bcma/bcma_private.h
|
||||
+++ b/drivers/bcma/bcma_private.h
|
||||
@@ -10,13 +10,13 @@
|
||||
#include <linux/delay.h>
|
||||
|
||||
#define bcma_err(bus, fmt, ...) \
|
||||
- pr_err("bus%d: " fmt, (bus)->num, ##__VA_ARGS__)
|
||||
+ dev_err((bus)->dev, "bus%d: " fmt, (bus)->num, ##__VA_ARGS__)
|
||||
#define bcma_warn(bus, fmt, ...) \
|
||||
- pr_warn("bus%d: " fmt, (bus)->num, ##__VA_ARGS__)
|
||||
+ dev_warn((bus)->dev, "bus%d: " fmt, (bus)->num, ##__VA_ARGS__)
|
||||
#define bcma_info(bus, fmt, ...) \
|
||||
- pr_info("bus%d: " fmt, (bus)->num, ##__VA_ARGS__)
|
||||
+ dev_info((bus)->dev, "bus%d: " fmt, (bus)->num, ##__VA_ARGS__)
|
||||
#define bcma_debug(bus, fmt, ...) \
|
||||
- pr_debug("bus%d: " fmt, (bus)->num, ##__VA_ARGS__)
|
||||
+ dev_dbg((bus)->dev, "bus%d: " fmt, (bus)->num, ##__VA_ARGS__)
|
||||
|
||||
struct bcma_bus;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user