Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+22 -21
+22 -21
drivers/net/ethernet/freescale/fec_main.c
··· 279 279 #define FEC_ECR_BYTESWP BIT(8) 280 280 /* FEC RCR bits definition */ 281 281 #define FEC_RCR_LOOP BIT(0) 282 - #define FEC_RCR_HALFDPX BIT(1) 282 + #define FEC_RCR_DRT BIT(1) 283 283 #define FEC_RCR_MII BIT(2) 284 284 #define FEC_RCR_PROMISC BIT(3) 285 285 #define FEC_RCR_BC_REJ BIT(4) 286 286 #define FEC_RCR_FLOWCTL BIT(5) 287 + #define FEC_RCR_RGMII BIT(6) 287 288 #define FEC_RCR_RMII BIT(8) 288 289 #define FEC_RCR_10BASET BIT(9) 290 + #define FEC_RCR_NLC BIT(30) 289 291 /* TX WMARK bits */ 290 292 #define FEC_TXWMRK_STRFWD BIT(8) 291 293 ··· 1123 1121 } 1124 1122 } 1125 1123 1124 + static void fec_set_hw_mac_addr(struct net_device *ndev) 1125 + { 1126 + struct fec_enet_private *fep = netdev_priv(ndev); 1127 + 1128 + writel(ndev->dev_addr[3] | (ndev->dev_addr[2] << 8) | 1129 + (ndev->dev_addr[1] << 16) | (ndev->dev_addr[0] << 24), 1130 + fep->hwp + FEC_ADDR_LOW); 1131 + writel((ndev->dev_addr[5] << 16) | (ndev->dev_addr[4] << 24), 1132 + fep->hwp + FEC_ADDR_HIGH); 1133 + } 1134 + 1126 1135 /* 1127 1136 * This function is called to start or restart the FEC during a link 1128 1137 * change, transmit timeout, or to reconfigure the FEC. The network ··· 1143 1130 fec_restart(struct net_device *ndev) 1144 1131 { 1145 1132 struct fec_enet_private *fep = netdev_priv(ndev); 1146 - u32 temp_mac[2]; 1147 - u32 rcntl = OPT_FRAME_SIZE | 0x04; 1133 + u32 rcntl = OPT_FRAME_SIZE | FEC_RCR_MII; 1148 1134 u32 ecntl = FEC_ECR_ETHEREN; 1149 1135 1150 1136 if (fep->bufdesc_ex) ··· 1155 1143 * enet-mac reset will reset mac address registers too, 1156 1144 * so need to reconfigure it. 1157 1145 */ 1158 - memcpy(&temp_mac, ndev->dev_addr, ETH_ALEN); 1159 - writel((__force u32)cpu_to_be32(temp_mac[0]), 1160 - fep->hwp + FEC_ADDR_LOW); 1161 - writel((__force u32)cpu_to_be32(temp_mac[1]), 1162 - fep->hwp + FEC_ADDR_HIGH); 1146 + fec_set_hw_mac_addr(ndev); 1163 1147 1164 1148 /* Clear any outstanding interrupt, except MDIO. */ 1165 1149 writel((0xffffffff & ~FEC_ENET_MII), fep->hwp + FEC_IEVENT); ··· 1170 1162 writel(0x04, fep->hwp + FEC_X_CNTRL); 1171 1163 } else { 1172 1164 /* No Rcv on Xmit */ 1173 - rcntl |= 0x02; 1165 + rcntl |= FEC_RCR_DRT; 1174 1166 writel(0x0, fep->hwp + FEC_X_CNTRL); 1175 1167 } 1176 1168 ··· 1199 1191 */ 1200 1192 if (fep->quirks & FEC_QUIRK_ENET_MAC) { 1201 1193 /* Enable flow control and length check */ 1202 - rcntl |= 0x40000000 | 0x00000020; 1194 + rcntl |= FEC_RCR_NLC | FEC_RCR_FLOWCTL; 1203 1195 1204 1196 /* RGMII, RMII or MII */ 1205 - if (fep->phy_interface == PHY_INTERFACE_MODE_RGMII || 1206 - fep->phy_interface == PHY_INTERFACE_MODE_RGMII_ID || 1207 - fep->phy_interface == PHY_INTERFACE_MODE_RGMII_RXID || 1208 - fep->phy_interface == PHY_INTERFACE_MODE_RGMII_TXID) 1209 - rcntl |= (1 << 6); 1197 + if (phy_interface_mode_is_rgmii(fep->phy_interface)) 1198 + rcntl |= FEC_RCR_RGMII; 1210 1199 else if (fep->phy_interface == PHY_INTERFACE_MODE_RMII) 1211 1200 rcntl |= FEC_RCR_RMII; 1212 1201 else ··· 3699 3694 static int 3700 3695 fec_set_mac_address(struct net_device *ndev, void *p) 3701 3696 { 3702 - struct fec_enet_private *fep = netdev_priv(ndev); 3703 3697 struct sockaddr *addr = p; 3704 3698 3705 3699 if (addr) { ··· 3715 3711 if (!netif_running(ndev)) 3716 3712 return 0; 3717 3713 3718 - writel(ndev->dev_addr[3] | (ndev->dev_addr[2] << 8) | 3719 - (ndev->dev_addr[1] << 16) | (ndev->dev_addr[0] << 24), 3720 - fep->hwp + FEC_ADDR_LOW); 3721 - writel((ndev->dev_addr[5] << 16) | (ndev->dev_addr[4] << 24), 3722 - fep->hwp + FEC_ADDR_HIGH); 3714 + fec_set_hw_mac_addr(ndev); 3715 + 3723 3716 return 0; 3724 3717 } 3725 3718