Skip to content

Commit c0a3923

Browse files
committed
Merge branch 'net-fec-add-some-optimizations'
Wei Fang says: ==================== net: fec: add some optimizations Add some optimizations to the fec driver, see each patch for details. v1: https://lore.kernel.org/20250710090902.1171180-1-wei.fang@nxp.com ==================== Link: https://patch.msgid.link/20250711091639.1374411-1-wei.fang@nxp.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2 parents 2a683d0 + d39e134 commit c0a3923

File tree

1 file changed

+22
-21
lines changed

1 file changed

+22
-21
lines changed

drivers/net/ethernet/freescale/fec_main.c

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -279,13 +279,15 @@ MODULE_PARM_DESC(macaddr, "FEC Ethernet MAC address");
279279
#define FEC_ECR_BYTESWP BIT(8)
280280
/* FEC RCR bits definition */
281281
#define FEC_RCR_LOOP BIT(0)
282-
#define FEC_RCR_HALFDPX BIT(1)
282+
#define FEC_RCR_DRT BIT(1)
283283
#define FEC_RCR_MII BIT(2)
284284
#define FEC_RCR_PROMISC BIT(3)
285285
#define FEC_RCR_BC_REJ BIT(4)
286286
#define FEC_RCR_FLOWCTL BIT(5)
287+
#define FEC_RCR_RGMII BIT(6)
287288
#define FEC_RCR_RMII BIT(8)
288289
#define FEC_RCR_10BASET BIT(9)
290+
#define FEC_RCR_NLC BIT(30)
289291
/* TX WMARK bits */
290292
#define FEC_TXWMRK_STRFWD BIT(8)
291293

@@ -1121,6 +1123,17 @@ static void fec_ctrl_reset(struct fec_enet_private *fep, bool allow_wol)
11211123
}
11221124
}
11231125

1126+
static void fec_set_hw_mac_addr(struct net_device *ndev)
1127+
{
1128+
struct fec_enet_private *fep = netdev_priv(ndev);
1129+
1130+
writel(ndev->dev_addr[3] | (ndev->dev_addr[2] << 8) |
1131+
(ndev->dev_addr[1] << 16) | (ndev->dev_addr[0] << 24),
1132+
fep->hwp + FEC_ADDR_LOW);
1133+
writel((ndev->dev_addr[5] << 16) | (ndev->dev_addr[4] << 24),
1134+
fep->hwp + FEC_ADDR_HIGH);
1135+
}
1136+
11241137
/*
11251138
* This function is called to start or restart the FEC during a link
11261139
* change, transmit timeout, or to reconfigure the FEC. The network
@@ -1130,8 +1143,7 @@ static void
11301143
fec_restart(struct net_device *ndev)
11311144
{
11321145
struct fec_enet_private *fep = netdev_priv(ndev);
1133-
u32 temp_mac[2];
1134-
u32 rcntl = OPT_FRAME_SIZE | 0x04;
1146+
u32 rcntl = OPT_FRAME_SIZE | FEC_RCR_MII;
11351147
u32 ecntl = FEC_ECR_ETHEREN;
11361148

11371149
if (fep->bufdesc_ex)
@@ -1143,11 +1155,7 @@ fec_restart(struct net_device *ndev)
11431155
* enet-mac reset will reset mac address registers too,
11441156
* so need to reconfigure it.
11451157
*/
1146-
memcpy(&temp_mac, ndev->dev_addr, ETH_ALEN);
1147-
writel((__force u32)cpu_to_be32(temp_mac[0]),
1148-
fep->hwp + FEC_ADDR_LOW);
1149-
writel((__force u32)cpu_to_be32(temp_mac[1]),
1150-
fep->hwp + FEC_ADDR_HIGH);
1158+
fec_set_hw_mac_addr(ndev);
11511159

11521160
/* Clear any outstanding interrupt, except MDIO. */
11531161
writel((0xffffffff & ~FEC_ENET_MII), fep->hwp + FEC_IEVENT);
@@ -1162,7 +1170,7 @@ fec_restart(struct net_device *ndev)
11621170
writel(0x04, fep->hwp + FEC_X_CNTRL);
11631171
} else {
11641172
/* No Rcv on Xmit */
1165-
rcntl |= 0x02;
1173+
rcntl |= FEC_RCR_DRT;
11661174
writel(0x0, fep->hwp + FEC_X_CNTRL);
11671175
}
11681176

@@ -1191,14 +1199,11 @@ fec_restart(struct net_device *ndev)
11911199
*/
11921200
if (fep->quirks & FEC_QUIRK_ENET_MAC) {
11931201
/* Enable flow control and length check */
1194-
rcntl |= 0x40000000 | 0x00000020;
1202+
rcntl |= FEC_RCR_NLC | FEC_RCR_FLOWCTL;
11951203

11961204
/* RGMII, RMII or MII */
1197-
if (fep->phy_interface == PHY_INTERFACE_MODE_RGMII ||
1198-
fep->phy_interface == PHY_INTERFACE_MODE_RGMII_ID ||
1199-
fep->phy_interface == PHY_INTERFACE_MODE_RGMII_RXID ||
1200-
fep->phy_interface == PHY_INTERFACE_MODE_RGMII_TXID)
1201-
rcntl |= (1 << 6);
1205+
if (phy_interface_mode_is_rgmii(fep->phy_interface))
1206+
rcntl |= FEC_RCR_RGMII;
12021207
else if (fep->phy_interface == PHY_INTERFACE_MODE_RMII)
12031208
rcntl |= FEC_RCR_RMII;
12041209
else
@@ -3694,7 +3699,6 @@ static void set_multicast_list(struct net_device *ndev)
36943699
static int
36953700
fec_set_mac_address(struct net_device *ndev, void *p)
36963701
{
3697-
struct fec_enet_private *fep = netdev_priv(ndev);
36983702
struct sockaddr *addr = p;
36993703

37003704
if (addr) {
@@ -3711,11 +3715,8 @@ fec_set_mac_address(struct net_device *ndev, void *p)
37113715
if (!netif_running(ndev))
37123716
return 0;
37133717

3714-
writel(ndev->dev_addr[3] | (ndev->dev_addr[2] << 8) |
3715-
(ndev->dev_addr[1] << 16) | (ndev->dev_addr[0] << 24),
3716-
fep->hwp + FEC_ADDR_LOW);
3717-
writel((ndev->dev_addr[5] << 16) | (ndev->dev_addr[4] << 24),
3718-
fep->hwp + FEC_ADDR_HIGH);
3718+
fec_set_hw_mac_addr(ndev);
3719+
37193720
return 0;
37203721
}
37213722

0 commit comments

Comments
 (0)