Commit fdfc76a1 authored by Andrew Halaney's avatar Andrew Halaney Committed by David S. Miller

net: stmmac: enable all safety features by default

In the original implementation of dwmac5
commit 8bf993a5 ("net: stmmac: Add support for DWMAC5 and implement Safety Features")
all safety features were enabled by default.

Later it seems some implementations didn't have support for all the
features, so in
commit 5ac712dc ("net: stmmac: enable platform specific safety features")
the safety_feat_cfg structure was added to the callback and defined for
some platforms to selectively enable these safety features.

The problem is that only certain platforms were given that software
support. If the automotive safety package bit is set in the hardware
features register the safety feature callback is called for the platform,
and for platforms that didn't get a safety_feat_cfg defined this results
in the following NULL pointer dereference:

[    7.933303] Call trace:
[    7.935812]  dwmac5_safety_feat_config+0x20/0x170 [stmmac]
[    7.941455]  __stmmac_open+0x16c/0x474 [stmmac]
[    7.946117]  stmmac_open+0x38/0x70 [stmmac]
[    7.950414]  __dev_open+0x100/0x1dc
[    7.954006]  __dev_change_flags+0x18c/0x204
[    7.958297]  dev_change_flags+0x24/0x6c
[    7.962237]  do_setlink+0x2b8/0xfa4
[    7.965827]  __rtnl_newlink+0x4ec/0x840
[    7.969766]  rtnl_newlink+0x50/0x80
[    7.973353]  rtnetlink_rcv_msg+0x12c/0x374
[    7.977557]  netlink_rcv_skb+0x5c/0x130
[    7.981500]  rtnetlink_rcv+0x18/0x2c
[    7.985172]  netlink_unicast+0x2e8/0x340
[    7.989197]  netlink_sendmsg+0x1a8/0x420
[    7.993222]  ____sys_sendmsg+0x218/0x280
[    7.997249]  ___sys_sendmsg+0xac/0x100
[    8.001103]  __sys_sendmsg+0x84/0xe0
[    8.004776]  __arm64_sys_sendmsg+0x24/0x30
[    8.008983]  invoke_syscall+0x48/0x114
[    8.012840]  el0_svc_common.constprop.0+0xcc/0xec
[    8.017665]  do_el0_svc+0x38/0xb0
[    8.021071]  el0_svc+0x2c/0x84
[    8.024212]  el0t_64_sync_handler+0xf4/0x120
[    8.028598]  el0t_64_sync+0x190/0x194

Go back to the original behavior, if the automotive safety package
is found to be supported in hardware enable all the features unless
safety_feat_cfg is passed in saying this particular platform only
supports a subset of the features.

Fixes: 5ac712dc ("net: stmmac: enable platform specific safety features")
Reported-by: default avatarNing Cai <ncai@quicinc.com>
Signed-off-by: default avatarAndrew Halaney <ahalaney@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b4fbf0b2
...@@ -186,11 +186,25 @@ static void dwmac5_handle_dma_err(struct net_device *ndev, ...@@ -186,11 +186,25 @@ static void dwmac5_handle_dma_err(struct net_device *ndev,
int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp, int dwmac5_safety_feat_config(void __iomem *ioaddr, unsigned int asp,
struct stmmac_safety_feature_cfg *safety_feat_cfg) struct stmmac_safety_feature_cfg *safety_feat_cfg)
{ {
struct stmmac_safety_feature_cfg all_safety_feats = {
.tsoee = 1,
.mrxpee = 1,
.mestee = 1,
.mrxee = 1,
.mtxee = 1,
.epsi = 1,
.edpp = 1,
.prtyen = 1,
.tmouten = 1,
};
u32 value; u32 value;
if (!asp) if (!asp)
return -EINVAL; return -EINVAL;
if (!safety_feat_cfg)
safety_feat_cfg = &all_safety_feats;
/* 1. Enable Safety Features */ /* 1. Enable Safety Features */
value = readl(ioaddr + MTL_ECC_CONTROL); value = readl(ioaddr + MTL_ECC_CONTROL);
value |= MEEAO; /* MTL ECC Error Addr Status Override */ value |= MEEAO; /* MTL ECC Error Addr Status Override */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment