37639faf17c5e4f872f6e05285a5071138deea22
[librecmc/librecmc.git] /
1 From 34a5102c3235c470a6c77fba16cb971964d9c136 Mon Sep 17 00:00:00 2001
2 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
3 Date: Tue, 31 Jan 2017 19:37:54 +0100
4 Subject: [PATCH 1/3] net: bgmac: allocate struct bgmac just once & don't copy
5  it
6 MIME-Version: 1.0
7 Content-Type: text/plain; charset=UTF-8
8 Content-Transfer-Encoding: 8bit
9
10 So far were were allocating struct bgmac in 3 places: platform code,
11 bcma code and shared bgmac_enet_probe function. The reason for this was
12 bgmac_enet_probe:
13 1) Requiring early-filled struct bgmac
14 2) Calling alloc_etherdev on its own in order to use netdev_priv later
15
16 This solution got few drawbacks:
17 1) Was duplicating allocating code
18 2) Required copying early-filled struct
19 3) Resulted in platform/bcma code having access only to unused struct
20
21 Solve this situation by simply extracting some probe code into the new
22 bgmac_alloc function.
23
24 Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
25 Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
26 Signed-off-by: David S. Miller <davem@davemloft.net>
27 ---
28  drivers/net/ethernet/broadcom/bgmac-bcma.c     |  4 +---
29  drivers/net/ethernet/broadcom/bgmac-platform.c |  2 +-
30  drivers/net/ethernet/broadcom/bgmac.c          | 25 +++++++++++++++++--------
31  drivers/net/ethernet/broadcom/bgmac.h          |  3 ++-
32  4 files changed, 21 insertions(+), 13 deletions(-)
33
34 --- a/drivers/net/ethernet/broadcom/bgmac-bcma.c
35 +++ b/drivers/net/ethernet/broadcom/bgmac-bcma.c
36 @@ -99,12 +99,11 @@ static int bgmac_probe(struct bcma_devic
37         u8 *mac;
38         int err;
39  
40 -       bgmac = kzalloc(sizeof(*bgmac), GFP_KERNEL);
41 +       bgmac = bgmac_alloc(&core->dev);
42         if (!bgmac)
43                 return -ENOMEM;
44  
45         bgmac->bcma.core = core;
46 -       bgmac->dev = &core->dev;
47         bgmac->dma_dev = core->dma_dev;
48         bgmac->irq = core->irq;
49  
50 @@ -285,7 +284,6 @@ static int bgmac_probe(struct bcma_devic
51  err1:
52         bcma_mdio_mii_unregister(bgmac->mii_bus);
53  err:
54 -       kfree(bgmac);
55         bcma_set_drvdata(core, NULL);
56  
57         return err;
58 --- a/drivers/net/ethernet/broadcom/bgmac-platform.c
59 +++ b/drivers/net/ethernet/broadcom/bgmac-platform.c
60 @@ -93,7 +93,7 @@ static int bgmac_probe(struct platform_d
61         struct resource *regs;
62         const u8 *mac_addr;
63  
64 -       bgmac = devm_kzalloc(&pdev->dev, sizeof(*bgmac), GFP_KERNEL);
65 +       bgmac = bgmac_alloc(&pdev->dev);
66         if (!bgmac)
67                 return -ENOMEM;
68  
69 --- a/drivers/net/ethernet/broadcom/bgmac.c
70 +++ b/drivers/net/ethernet/broadcom/bgmac.c
71 @@ -1459,22 +1459,32 @@ static int bgmac_phy_connect(struct bgma
72         return 0;
73  }
74  
75 -int bgmac_enet_probe(struct bgmac *info)
76 +struct bgmac *bgmac_alloc(struct device *dev)
77  {
78         struct net_device *net_dev;
79         struct bgmac *bgmac;
80 -       int err;
81  
82         /* Allocation and references */
83 -       net_dev = alloc_etherdev(sizeof(*bgmac));
84 +       net_dev = devm_alloc_etherdev(dev, sizeof(*bgmac));
85         if (!net_dev)
86 -               return -ENOMEM;
87 +               return NULL;
88  
89         net_dev->netdev_ops = &bgmac_netdev_ops;
90         net_dev->ethtool_ops = &bgmac_ethtool_ops;
91 +
92         bgmac = netdev_priv(net_dev);
93 -       memcpy(bgmac, info, sizeof(*bgmac));
94 +       bgmac->dev = dev;
95         bgmac->net_dev = net_dev;
96 +
97 +       return bgmac;
98 +}
99 +EXPORT_SYMBOL_GPL(bgmac_alloc);
100 +
101 +int bgmac_enet_probe(struct bgmac *bgmac)
102 +{
103 +       struct net_device *net_dev = bgmac->net_dev;
104 +       int err;
105 +
106         net_dev->irq = bgmac->irq;
107         SET_NETDEV_DEV(net_dev, bgmac->dev);
108  
109 @@ -1501,7 +1511,7 @@ int bgmac_enet_probe(struct bgmac *info)
110         err = bgmac_dma_alloc(bgmac);
111         if (err) {
112                 dev_err(bgmac->dev, "Unable to alloc memory for DMA\n");
113 -               goto err_netdev_free;
114 +               goto err_out;
115         }
116  
117         bgmac->int_mask = BGMAC_IS_ERRMASK | BGMAC_IS_RX | BGMAC_IS_TX_MASK;
118 @@ -1537,8 +1547,7 @@ err_phy_disconnect:
119         phy_disconnect(net_dev->phydev);
120  err_dma_free:
121         bgmac_dma_free(bgmac);
122 -err_netdev_free:
123 -       free_netdev(net_dev);
124 +err_out:
125  
126         return err;
127  }
128 --- a/drivers/net/ethernet/broadcom/bgmac.h
129 +++ b/drivers/net/ethernet/broadcom/bgmac.h
130 @@ -515,7 +515,8 @@ struct bgmac {
131                               u32 set);
132  };
133  
134 -int bgmac_enet_probe(struct bgmac *info);
135 +struct bgmac *bgmac_alloc(struct device *dev);
136 +int bgmac_enet_probe(struct bgmac *bgmac);
137  void bgmac_enet_remove(struct bgmac *bgmac);
138  
139  struct mii_bus *bcma_mdio_mii_register(struct bcma_device *core, u8 phyaddr);