Skip to content

Commit b2b14d2

Browse files
Sergei Shtylyovdavem330
authored andcommitted
sh_eth: factor out register bit twiddling code
The driver has often repeated pattern of reading a register, AND'ing and/or OR'ing some bits and writing the value back. Factor the pattern out into sh_eth_modify() -- this saves 84 bytes of code with ARM gcc 4.7.3. While at it, update Cogent Embedded's copyright. Signed-off-by: Sergei Shtylyov <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 568b3ce commit b2b14d2

File tree

1 file changed

+24
-29
lines changed

1 file changed

+24
-29
lines changed

drivers/net/ethernet/renesas/sh_eth.c

Lines changed: 24 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Copyright (C) 2014 Renesas Electronics Corporation
44
* Copyright (C) 2006-2012 Nobuhiro Iwamatsu
55
* Copyright (C) 2008-2014 Renesas Solutions Corp.
6-
* Copyright (C) 2013-2014 Cogent Embedded, Inc.
6+
* Copyright (C) 2013-2016 Cogent Embedded, Inc.
77
* Copyright (C) 2014 Codethink Limited
88
*
99
* This program is free software; you can redistribute it and/or modify it
@@ -428,6 +428,13 @@ static u32 sh_eth_read(struct net_device *ndev, int enum_index)
428428
return ioread32(mdp->addr + offset);
429429
}
430430

431+
static void sh_eth_modify(struct net_device *ndev, int enum_index, u32 clear,
432+
u32 set)
433+
{
434+
sh_eth_write(ndev, (sh_eth_read(ndev, enum_index) & ~clear) | set,
435+
enum_index);
436+
}
437+
431438
static bool sh_eth_is_gether(struct sh_eth_private *mdp)
432439
{
433440
return mdp->reg_offset == sh_eth_offset_gigabit;
@@ -467,10 +474,7 @@ static void sh_eth_set_duplex(struct net_device *ndev)
467474
{
468475
struct sh_eth_private *mdp = netdev_priv(ndev);
469476

470-
if (mdp->duplex) /* Full */
471-
sh_eth_write(ndev, sh_eth_read(ndev, ECMR) | ECMR_DM, ECMR);
472-
else /* Half */
473-
sh_eth_write(ndev, sh_eth_read(ndev, ECMR) & ~ECMR_DM, ECMR);
477+
sh_eth_modify(ndev, ECMR, ECMR_DM, mdp->duplex ? ECMR_DM : 0);
474478
}
475479

476480
static void sh_eth_chip_reset(struct net_device *ndev)
@@ -583,10 +587,10 @@ static void sh_eth_set_rate_r8a777x(struct net_device *ndev)
583587

584588
switch (mdp->speed) {
585589
case 10: /* 10BASE */
586-
sh_eth_write(ndev, sh_eth_read(ndev, ECMR) & ~ECMR_ELB, ECMR);
590+
sh_eth_modify(ndev, ECMR, ECMR_ELB, 0);
587591
break;
588592
case 100:/* 100BASE */
589-
sh_eth_write(ndev, sh_eth_read(ndev, ECMR) | ECMR_ELB, ECMR);
593+
sh_eth_modify(ndev, ECMR, ECMR_ELB, ECMR_ELB);
590594
break;
591595
default:
592596
break;
@@ -649,10 +653,10 @@ static void sh_eth_set_rate_sh7724(struct net_device *ndev)
649653

650654
switch (mdp->speed) {
651655
case 10: /* 10BASE */
652-
sh_eth_write(ndev, sh_eth_read(ndev, ECMR) & ~ECMR_RTM, ECMR);
656+
sh_eth_modify(ndev, ECMR, ECMR_RTM, 0);
653657
break;
654658
case 100:/* 100BASE */
655-
sh_eth_write(ndev, sh_eth_read(ndev, ECMR) | ECMR_RTM, ECMR);
659+
sh_eth_modify(ndev, ECMR, ECMR_RTM, ECMR_RTM);
656660
break;
657661
default:
658662
break;
@@ -924,8 +928,7 @@ static int sh_eth_reset(struct net_device *ndev)
924928

925929
if (sh_eth_is_gether(mdp) || sh_eth_is_rz_fast_ether(mdp)) {
926930
sh_eth_write(ndev, EDSR_ENALL, EDSR);
927-
sh_eth_write(ndev, sh_eth_read(ndev, EDMR) | EDMR_SRST_GETHER,
928-
EDMR);
931+
sh_eth_modify(ndev, EDMR, EDMR_SRST_GETHER, EDMR_SRST_GETHER);
929932

930933
ret = sh_eth_check_reset(ndev);
931934
if (ret)
@@ -949,11 +952,9 @@ static int sh_eth_reset(struct net_device *ndev)
949952
if (mdp->cd->select_mii)
950953
sh_eth_select_mii(ndev);
951954
} else {
952-
sh_eth_write(ndev, sh_eth_read(ndev, EDMR) | EDMR_SRST_ETHER,
953-
EDMR);
955+
sh_eth_modify(ndev, EDMR, EDMR_SRST_ETHER, EDMR_SRST_ETHER);
954956
mdelay(3);
955-
sh_eth_write(ndev, sh_eth_read(ndev, EDMR) & ~EDMR_SRST_ETHER,
956-
EDMR);
957+
sh_eth_modify(ndev, EDMR, EDMR_SRST_ETHER, 0);
957958
}
958959

959960
return ret;
@@ -1285,7 +1286,7 @@ static int sh_eth_dev_init(struct net_device *ndev, bool start)
12851286
sh_eth_write(ndev, ndev->mtu + ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN,
12861287
RFLR);
12871288

1288-
sh_eth_write(ndev, sh_eth_read(ndev, EESR), EESR);
1289+
sh_eth_modify(ndev, EESR, 0, 0);
12891290
if (start) {
12901291
mdp->irq_enabled = true;
12911292
sh_eth_write(ndev, mdp->cd->eesipr_value, EESIPR);
@@ -1532,15 +1533,13 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota)
15321533
static void sh_eth_rcv_snd_disable(struct net_device *ndev)
15331534
{
15341535
/* disable tx and rx */
1535-
sh_eth_write(ndev, sh_eth_read(ndev, ECMR) &
1536-
~(ECMR_RE | ECMR_TE), ECMR);
1536+
sh_eth_modify(ndev, ECMR, ECMR_RE | ECMR_TE, 0);
15371537
}
15381538

15391539
static void sh_eth_rcv_snd_enable(struct net_device *ndev)
15401540
{
15411541
/* enable tx and rx */
1542-
sh_eth_write(ndev, sh_eth_read(ndev, ECMR) |
1543-
(ECMR_RE | ECMR_TE), ECMR);
1542+
sh_eth_modify(ndev, ECMR, ECMR_RE | ECMR_TE, ECMR_RE | ECMR_TE);
15441543
}
15451544

15461545
/* error control function */
@@ -1569,13 +1568,11 @@ static void sh_eth_error(struct net_device *ndev, u32 intr_status)
15691568
sh_eth_rcv_snd_disable(ndev);
15701569
} else {
15711570
/* Link Up */
1572-
sh_eth_write(ndev, sh_eth_read(ndev, EESIPR) &
1573-
~DMAC_M_ECI, EESIPR);
1571+
sh_eth_modify(ndev, EESIPR, DMAC_M_ECI, 0);
15741572
/* clear int */
1575-
sh_eth_write(ndev, sh_eth_read(ndev, ECSR),
1576-
ECSR);
1577-
sh_eth_write(ndev, sh_eth_read(ndev, EESIPR) |
1578-
DMAC_M_ECI, EESIPR);
1573+
sh_eth_modify(ndev, ECSR, 0, 0);
1574+
sh_eth_modify(ndev, EESIPR, DMAC_M_ECI,
1575+
DMAC_M_ECI);
15791576
/* enable tx and rx */
15801577
sh_eth_rcv_snd_enable(ndev);
15811578
}
@@ -1765,9 +1762,7 @@ static void sh_eth_adjust_link(struct net_device *ndev)
17651762
mdp->cd->set_rate(ndev);
17661763
}
17671764
if (!mdp->link) {
1768-
sh_eth_write(ndev,
1769-
sh_eth_read(ndev, ECMR) & ~ECMR_TXF,
1770-
ECMR);
1765+
sh_eth_modify(ndev, ECMR, ECMR_TXF, 0);
17711766
new_state = 1;
17721767
mdp->link = phydev->link;
17731768
if (mdp->cd->no_psr || mdp->no_ether_link)

0 commit comments

Comments
 (0)