aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/allwinner/sun4i-emac.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/drivers/net/ethernet/allwinner/sun4i-emac.c b/drivers/net/ethernet/allwinner/sun4i-emac.c
index fcaeeb8a4929..28460676b8ca 100644
--- a/drivers/net/ethernet/allwinner/sun4i-emac.c
+++ b/drivers/net/ethernet/allwinner/sun4i-emac.c
@@ -268,15 +268,6 @@ static unsigned int emac_setup(struct net_device *ndev)
268 writel(reg_val | EMAC_TX_MODE_ABORTED_FRAME_EN, 268 writel(reg_val | EMAC_TX_MODE_ABORTED_FRAME_EN,
269 db->membase + EMAC_TX_MODE_REG); 269 db->membase + EMAC_TX_MODE_REG);
270 270
271 /* set up RX */
272 reg_val = readl(db->membase + EMAC_RX_CTL_REG);
273
274 writel(reg_val | EMAC_RX_CTL_PASS_LEN_OOR_EN |
275 EMAC_RX_CTL_ACCEPT_UNICAST_EN | EMAC_RX_CTL_DA_FILTER_EN |
276 EMAC_RX_CTL_ACCEPT_MULTICAST_EN |
277 EMAC_RX_CTL_ACCEPT_BROADCAST_EN,
278 db->membase + EMAC_RX_CTL_REG);
279
280 /* set MAC */ 271 /* set MAC */
281 /* set MAC CTL0 */ 272 /* set MAC CTL0 */
282 reg_val = readl(db->membase + EMAC_MAC_CTL0_REG); 273 reg_val = readl(db->membase + EMAC_MAC_CTL0_REG);
@@ -309,6 +300,26 @@ static unsigned int emac_setup(struct net_device *ndev)
309 return 0; 300 return 0;
310} 301}
311 302
303static void emac_set_rx_mode(struct net_device *ndev)
304{
305 struct emac_board_info *db = netdev_priv(ndev);
306 unsigned int reg_val;
307
308 /* set up RX */
309 reg_val = readl(db->membase + EMAC_RX_CTL_REG);
310
311 if (ndev->flags & IFF_PROMISC)
312 reg_val |= EMAC_RX_CTL_PASS_ALL_EN;
313 else
314 reg_val &= ~EMAC_RX_CTL_PASS_ALL_EN;
315
316 writel(reg_val | EMAC_RX_CTL_PASS_LEN_OOR_EN |
317 EMAC_RX_CTL_ACCEPT_UNICAST_EN | EMAC_RX_CTL_DA_FILTER_EN |
318 EMAC_RX_CTL_ACCEPT_MULTICAST_EN |
319 EMAC_RX_CTL_ACCEPT_BROADCAST_EN,
320 db->membase + EMAC_RX_CTL_REG);
321}
322
312static unsigned int emac_powerup(struct net_device *ndev) 323static unsigned int emac_powerup(struct net_device *ndev)
313{ 324{
314 struct emac_board_info *db = netdev_priv(ndev); 325 struct emac_board_info *db = netdev_priv(ndev);
@@ -782,6 +793,7 @@ static const struct net_device_ops emac_netdev_ops = {
782 .ndo_stop = emac_stop, 793 .ndo_stop = emac_stop,
783 .ndo_start_xmit = emac_start_xmit, 794 .ndo_start_xmit = emac_start_xmit,
784 .ndo_tx_timeout = emac_timeout, 795 .ndo_tx_timeout = emac_timeout,
796 .ndo_set_rx_mode = emac_set_rx_mode,
785 .ndo_do_ioctl = emac_ioctl, 797 .ndo_do_ioctl = emac_ioctl,
786 .ndo_change_mtu = eth_change_mtu, 798 .ndo_change_mtu = eth_change_mtu,
787 .ndo_validate_addr = eth_validate_addr, 799 .ndo_validate_addr = eth_validate_addr,