static int ec_bhf_stop(struct net_device *net_dev) { struct ec_bhf_priv *priv = netdev_priv(net_dev); struct device *dev = PRIV_TO_DEV(priv); hrtimer_cancel(&priv->hrtimer); ec_bhf_reset(priv); netif_tx_disable(net_dev); dma_free_coherent(dev, priv->tx_buf.alloc_len, priv->tx_buf.alloc, priv->tx_buf.alloc_phys); dma_free_coherent(dev, priv->rx_buf.alloc_len, priv->rx_buf.alloc, priv->rx_buf.alloc_phys); return 0; }
static int ec_bhf_open(struct net_device *net_dev) { struct ec_bhf_priv *priv = netdev_priv(net_dev); struct device *dev = PRIV_TO_DEV(priv); int err = 0; ec_bhf_reset(priv); err = ec_bhf_alloc_dma_mem(priv, &priv->rx_buf, priv->rx_dma_chan, FIFO_SIZE * sizeof(struct rx_desc)); if (err) { dev_err(dev, "Failed to allocate rx buffer\n"); goto out; } ec_bhf_setup_rx_descs(priv); err = ec_bhf_alloc_dma_mem(priv, &priv->tx_buf, priv->tx_dma_chan, FIFO_SIZE * sizeof(struct tx_desc)); if (err) { dev_err(dev, "Failed to allocate tx buffer\n"); goto error_rx_free; } iowrite8(0, priv->mii_io + MII_MAC_FILT_FLAG); ec_bhf_setup_tx_descs(priv); netif_start_queue(net_dev); hrtimer_init(&priv->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); priv->hrtimer.function = ec_bhf_timer_fun; hrtimer_start(&priv->hrtimer, ktime_set(0, polling_frequency), HRTIMER_MODE_REL); return 0; error_rx_free: dma_free_coherent(dev, priv->rx_buf.alloc_len, priv->rx_buf.alloc, priv->rx_buf.alloc_len); out: return err; }