From: Rafał Miłecki <ra...@milecki.pl> To share as much code as possible in bgmac we call alloc_etherdev from bgmac.c which is used by both: platform and bcma code. The easiest solution was to use it for allocating whole struct bgmac but it doesn't work well as we already get early-filled struct bgmac as an argument.
So far we were solving this by copying received struct into newly allocated one. The problem is it means storing 2 allocated structs, using only 1 of them and non-shared code not having access to it. This patch solves it by using alloc_etherdev to allocate *pointer* for the already allocated struct. The only downside of this is we have to be careful when using netdev_priv. Another solution was to call alloc_etherdev in platform/bcma specific code but Jon advised against it due to sharing less code that way. Signed-off-by: Rafał Miłecki <ra...@milecki.pl> --- drivers/net/ethernet/broadcom/bgmac-platform.c | 2 +- drivers/net/ethernet/broadcom/bgmac.c | 24 +++++++++++------------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bgmac-platform.c b/drivers/net/ethernet/broadcom/bgmac-platform.c index 6f736c19872f..4fefd1a74fcb 100644 --- a/drivers/net/ethernet/broadcom/bgmac-platform.c +++ b/drivers/net/ethernet/broadcom/bgmac-platform.c @@ -98,7 +98,7 @@ static void platform_bgmac_cmn_maskset32(struct bgmac *bgmac, u16 offset, static void bgmac_nicpm_speed_set(struct net_device *net_dev) { - struct bgmac *bgmac = netdev_priv(net_dev); + struct bgmac *bgmac = *(struct bgmac **)netdev_priv(net_dev); u32 val; if (!bgmac->plat.nicpm_base) diff --git a/drivers/net/ethernet/broadcom/bgmac.c b/drivers/net/ethernet/broadcom/bgmac.c index 0e066dc6b8cc..73d679337903 100644 --- a/drivers/net/ethernet/broadcom/bgmac.c +++ b/drivers/net/ethernet/broadcom/bgmac.c @@ -777,7 +777,7 @@ static void bgmac_write_mac_address(struct bgmac *bgmac, u8 *addr) static void bgmac_set_rx_mode(struct net_device *net_dev) { - struct bgmac *bgmac = netdev_priv(net_dev); + struct bgmac *bgmac = *(struct bgmac **)netdev_priv(net_dev); if (net_dev->flags & IFF_PROMISC) bgmac_cmdcfg_maskset(bgmac, ~0, BGMAC_CMDCFG_PROM, true); @@ -1112,7 +1112,7 @@ static void bgmac_chip_init(struct bgmac *bgmac) static irqreturn_t bgmac_interrupt(int irq, void *dev_id) { - struct bgmac *bgmac = netdev_priv(dev_id); + struct bgmac *bgmac = *(struct bgmac **)netdev_priv(dev_id); u32 int_status = bgmac_read(bgmac, BGMAC_INT_STATUS); int_status &= bgmac->int_mask; @@ -1161,7 +1161,7 @@ static int bgmac_poll(struct napi_struct *napi, int weight) static int bgmac_open(struct net_device *net_dev) { - struct bgmac *bgmac = netdev_priv(net_dev); + struct bgmac *bgmac = *(struct bgmac **)netdev_priv(net_dev); int err = 0; bgmac_chip_reset(bgmac); @@ -1191,7 +1191,7 @@ static int bgmac_open(struct net_device *net_dev) static int bgmac_stop(struct net_device *net_dev) { - struct bgmac *bgmac = netdev_priv(net_dev); + struct bgmac *bgmac = *(struct bgmac **)netdev_priv(net_dev); netif_carrier_off(net_dev); @@ -1210,7 +1210,7 @@ static int bgmac_stop(struct net_device *net_dev) static netdev_tx_t bgmac_start_xmit(struct sk_buff *skb, struct net_device *net_dev) { - struct bgmac *bgmac = netdev_priv(net_dev); + struct bgmac *bgmac = *(struct bgmac **)netdev_priv(net_dev); struct bgmac_dma_ring *ring; /* No QOS support yet */ @@ -1220,7 +1220,7 @@ static netdev_tx_t bgmac_start_xmit(struct sk_buff *skb, static int bgmac_set_mac_address(struct net_device *net_dev, void *addr) { - struct bgmac *bgmac = netdev_priv(net_dev); + struct bgmac *bgmac = *(struct bgmac **)netdev_priv(net_dev); int ret; ret = eth_prepare_mac_addr_change(net_dev, addr); @@ -1356,7 +1356,7 @@ static void bgmac_get_strings(struct net_device *dev, u32 stringset, static void bgmac_get_ethtool_stats(struct net_device *dev, struct ethtool_stats *ss, uint64_t *data) { - struct bgmac *bgmac = netdev_priv(dev); + struct bgmac *bgmac = *(struct bgmac **)netdev_priv(dev); const struct bgmac_stat *s; unsigned int i; u64 val; @@ -1396,7 +1396,7 @@ static const struct ethtool_ops bgmac_ethtool_ops = { void bgmac_adjust_link(struct net_device *net_dev) { - struct bgmac *bgmac = netdev_priv(net_dev); + struct bgmac *bgmac = *(struct bgmac **)netdev_priv(net_dev); struct phy_device *phy_dev = net_dev->phydev; bool update = false; @@ -1446,21 +1446,19 @@ int bgmac_phy_connect_direct(struct bgmac *bgmac) } EXPORT_SYMBOL_GPL(bgmac_phy_connect_direct); -int bgmac_enet_probe(struct bgmac *info) +int bgmac_enet_probe(struct bgmac *bgmac) { struct net_device *net_dev; - struct bgmac *bgmac; int err; /* Allocation and references */ - net_dev = alloc_etherdev(sizeof(*bgmac)); + net_dev = alloc_etherdev(sizeof(struct bgmac **)); if (!net_dev) return -ENOMEM; net_dev->netdev_ops = &bgmac_netdev_ops; net_dev->ethtool_ops = &bgmac_ethtool_ops; - bgmac = netdev_priv(net_dev); - memcpy(bgmac, info, sizeof(*bgmac)); + *(struct bgmac **)netdev_priv(net_dev) = bgmac; bgmac->net_dev = net_dev; net_dev->irq = bgmac->irq; SET_NETDEV_DEV(net_dev, bgmac->dev); -- 2.11.0