sh_eth: fix bitbang memory leak
sh_mdio_init() allocates pointer to 'struct bb_info' but only stores it locally, so that sh_mdio_release() can't free it on driver unload. Add the pointer to 'struct bb_info' to 'struct sh_eth_private', so that sh_mdio_init() can save 'bitbang' variable for sh_mdio_release() to be able to free it later... Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
283951f95b
Коммит
0582b7d15f
|
@ -2220,6 +2220,7 @@ static void sh_eth_tsu_init(struct sh_eth_private *mdp)
|
|||
/* MDIO bus release function */
|
||||
static int sh_mdio_release(struct net_device *ndev)
|
||||
{
|
||||
struct sh_eth_private *mdp = netdev_priv(ndev);
|
||||
struct mii_bus *bus = dev_get_drvdata(&ndev->dev);
|
||||
|
||||
/* unregister mdio bus */
|
||||
|
@ -2234,6 +2235,9 @@ static int sh_mdio_release(struct net_device *ndev)
|
|||
/* free bitbang info */
|
||||
free_mdio_bitbang(bus);
|
||||
|
||||
/* free bitbang memory */
|
||||
kfree(mdp->bitbang);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2262,6 +2266,7 @@ static int sh_mdio_init(struct net_device *ndev, int id,
|
|||
bitbang->ctrl.ops = &bb_ops;
|
||||
|
||||
/* MII controller setting */
|
||||
mdp->bitbang = bitbang;
|
||||
mdp->mii_bus = alloc_mdio_bitbang(&bitbang->ctrl);
|
||||
if (!mdp->mii_bus) {
|
||||
ret = -ENOMEM;
|
||||
|
|
|
@ -705,6 +705,7 @@ struct sh_eth_private {
|
|||
const u16 *reg_offset;
|
||||
void __iomem *addr;
|
||||
void __iomem *tsu_addr;
|
||||
struct bb_info *bitbang;
|
||||
u32 num_rx_ring;
|
||||
u32 num_tx_ring;
|
||||
dma_addr_t rx_desc_dma;
|
||||
|
|
Загрузка…
Ссылка в новой задаче