Skip to content

Commit b677d6c

Browse files
LorenzoBianconidavem330
authored andcommitted
net: ethernet: mtk_eth_soc: do not overwrite mtu configuration running reset routine
Restore user configured MTU running mtk_hw_init() during tx timeout routine since it will be overwritten after a hw reset. Reported-by: Felix Fietkau <[email protected]> Fixes: 9ea4d31 ("net: ethernet: mediatek: add the whole ethernet reset into the reset process") Signed-off-by: Lorenzo Bianconi <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 15b4f99 commit b677d6c

File tree

1 file changed

+34
-19
lines changed

1 file changed

+34
-19
lines changed

drivers/net/ethernet/mediatek/mtk_eth_soc.c

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3281,6 +3281,30 @@ static void mtk_dim_tx(struct work_struct *work)
32813281
dim->state = DIM_START_MEASURE;
32823282
}
32833283

3284+
static void mtk_set_mcr_max_rx(struct mtk_mac *mac, u32 val)
3285+
{
3286+
struct mtk_eth *eth = mac->hw;
3287+
u32 mcr_cur, mcr_new;
3288+
3289+
if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628))
3290+
return;
3291+
3292+
mcr_cur = mtk_r32(mac->hw, MTK_MAC_MCR(mac->id));
3293+
mcr_new = mcr_cur & ~MAC_MCR_MAX_RX_MASK;
3294+
3295+
if (val <= 1518)
3296+
mcr_new |= MAC_MCR_MAX_RX(MAC_MCR_MAX_RX_1518);
3297+
else if (val <= 1536)
3298+
mcr_new |= MAC_MCR_MAX_RX(MAC_MCR_MAX_RX_1536);
3299+
else if (val <= 1552)
3300+
mcr_new |= MAC_MCR_MAX_RX(MAC_MCR_MAX_RX_1552);
3301+
else
3302+
mcr_new |= MAC_MCR_MAX_RX(MAC_MCR_MAX_RX_2048);
3303+
3304+
if (mcr_new != mcr_cur)
3305+
mtk_w32(mac->hw, mcr_new, MTK_MAC_MCR(mac->id));
3306+
}
3307+
32843308
static int mtk_hw_init(struct mtk_eth *eth)
32853309
{
32863310
u32 dma_mask = ETHSYS_DMA_AG_MAP_PDMA | ETHSYS_DMA_AG_MAP_QDMA |
@@ -3355,8 +3379,16 @@ static int mtk_hw_init(struct mtk_eth *eth)
33553379
* up with the more appropriate value when mtk_mac_config call is being
33563380
* invoked.
33573381
*/
3358-
for (i = 0; i < MTK_MAC_COUNT; i++)
3382+
for (i = 0; i < MTK_MAC_COUNT; i++) {
3383+
struct net_device *dev = eth->netdev[i];
3384+
33593385
mtk_w32(eth, MAC_MCR_FORCE_LINK_DOWN, MTK_MAC_MCR(i));
3386+
if (dev) {
3387+
struct mtk_mac *mac = netdev_priv(dev);
3388+
3389+
mtk_set_mcr_max_rx(mac, dev->mtu + MTK_RX_ETH_HLEN);
3390+
}
3391+
}
33603392

33613393
/* Indicates CDM to parse the MTK special tag from CPU
33623394
* which also is working out for untag packets.
@@ -3476,31 +3508,14 @@ static int mtk_change_mtu(struct net_device *dev, int new_mtu)
34763508
int length = new_mtu + MTK_RX_ETH_HLEN;
34773509
struct mtk_mac *mac = netdev_priv(dev);
34783510
struct mtk_eth *eth = mac->hw;
3479-
u32 mcr_cur, mcr_new;
34803511

34813512
if (rcu_access_pointer(eth->prog) &&
34823513
length > MTK_PP_MAX_BUF_SIZE) {
34833514
netdev_err(dev, "Invalid MTU for XDP mode\n");
34843515
return -EINVAL;
34853516
}
34863517

3487-
if (!MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) {
3488-
mcr_cur = mtk_r32(mac->hw, MTK_MAC_MCR(mac->id));
3489-
mcr_new = mcr_cur & ~MAC_MCR_MAX_RX_MASK;
3490-
3491-
if (length <= 1518)
3492-
mcr_new |= MAC_MCR_MAX_RX(MAC_MCR_MAX_RX_1518);
3493-
else if (length <= 1536)
3494-
mcr_new |= MAC_MCR_MAX_RX(MAC_MCR_MAX_RX_1536);
3495-
else if (length <= 1552)
3496-
mcr_new |= MAC_MCR_MAX_RX(MAC_MCR_MAX_RX_1552);
3497-
else
3498-
mcr_new |= MAC_MCR_MAX_RX(MAC_MCR_MAX_RX_2048);
3499-
3500-
if (mcr_new != mcr_cur)
3501-
mtk_w32(mac->hw, mcr_new, MTK_MAC_MCR(mac->id));
3502-
}
3503-
3518+
mtk_set_mcr_max_rx(mac, length);
35043519
dev->mtu = new_mtu;
35053520

35063521
return 0;

0 commit comments

Comments
 (0)