@@ -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
11301143fec_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)
36943699static int
36953700fec_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