summaryrefslogtreecommitdiff
path: root/drivers/net/ethernet/freescale/fec_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/freescale/fec_main.c')
-rw-r--r--drivers/net/ethernet/freescale/fec_main.c81
1 files changed, 39 insertions, 42 deletions
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index 93eeb70c644b..a29f392e229d 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -657,7 +657,8 @@ fec_restart(struct net_device *ndev)
/* Set maximum receive buffer size. */
writel(PKT_MAXBLR_SIZE, fep->hwp + FEC_R_BUFF_SIZE);
- fec_enet_bd_init(ndev);
+ if (fep->rx_bd_base)
+ fec_enet_bd_init(ndev);
netdev_reset_queue(ndev);
/* Set receive and transmit descriptor base. */
@@ -2072,6 +2073,8 @@ static void fec_enet_free_buffers(struct net_device *ndev)
fep->tx_skbuff[i] = NULL;
dev_kfree_skb(skb);
}
+
+ dma_free_coherent(NULL, PAGE_SIZE, fep->rx_bd_base, fep->rx_bd_dma);
}
static int fec_enet_alloc_buffers(struct net_device *ndev)
@@ -2080,6 +2083,37 @@ static int fec_enet_alloc_buffers(struct net_device *ndev)
unsigned int i;
struct sk_buff *skb;
union bufdesc_u *bdp;
+ union bufdesc_u *cbd_base;
+ dma_addr_t cbd_dma;
+ int bd_size;
+
+ bd_size = fep->tx_ring_size + fep->rx_ring_size;
+ if (fep->flags & FEC_FLAG_BUFDESC_EX)
+ bd_size *= sizeof(struct bufdesc_ex);
+ else
+ bd_size *= sizeof(struct bufdesc);
+
+ /* Allocate memory for buffer descriptors. */
+ cbd_base = dma_alloc_coherent(NULL, bd_size, &cbd_dma, GFP_KERNEL);
+ if (!cbd_base)
+ return -ENOMEM;
+
+ memset(cbd_base, 0, PAGE_SIZE);
+
+ /* Set receive and transmit descriptor base. */
+ fep->rx_bd_base = cbd_base;
+ fep->rx_bd_dma = cbd_dma;
+ if (fep->flags & FEC_FLAG_BUFDESC_EX) {
+ fep->tx_bd_base = (union bufdesc_u *)
+ (&cbd_base->ebd + fep->rx_ring_size);
+ fep->tx_bd_dma = cbd_dma + sizeof(struct bufdesc_ex) *
+ fep->rx_ring_size;
+ } else {
+ fep->tx_bd_base = (union bufdesc_u *)
+ (&cbd_base->bd + fep->rx_ring_size);
+ fep->tx_bd_dma = cbd_dma + sizeof(struct bufdesc) *
+ fep->rx_ring_size;
+ }
for (i = 0; i < fep->rx_ring_size; i++) {
dma_addr_t addr;
@@ -2395,36 +2429,16 @@ static const struct net_device_ops fec_netdev_ops = {
.ndo_set_features = fec_set_features,
};
- /*
- * XXX: We need to clean up on failure exits here.
- *
- */
-static int fec_enet_init(struct net_device *ndev)
+static void fec_enet_init(struct net_device *ndev)
{
struct fec_enet_private *fep = netdev_priv(ndev);
const struct platform_device_id *id_entry =
platform_get_device_id(fep->pdev);
- union bufdesc_u *cbd_base;
- dma_addr_t cbd_dma;
- int bd_size;
/* init the tx & rx ring size */
fep->tx_ring_size = TX_RING_SIZE;
fep->rx_ring_size = RX_RING_SIZE;
- bd_size = fep->tx_ring_size + fep->rx_ring_size;
- if (fep->flags & FEC_FLAG_BUFDESC_EX)
- bd_size *= sizeof(struct bufdesc_ex);
- else
- bd_size *= sizeof(struct bufdesc);
-
- /* Allocate memory for buffer descriptors. */
- cbd_base = dma_alloc_coherent(NULL, bd_size, &cbd_dma, GFP_KERNEL);
- if (!cbd_base)
- return -ENOMEM;
-
- memset(cbd_base, 0, PAGE_SIZE);
-
fep->netdev = ndev;
/* Get the Ethernet address */
@@ -2432,20 +2446,8 @@ static int fec_enet_init(struct net_device *ndev)
/* make sure MAC we just acquired is programmed into the hw */
fec_set_mac_address(ndev, NULL);
- /* Set receive and transmit descriptor base. */
- fep->rx_bd_base = cbd_base;
- fep->rx_bd_dma = cbd_dma;
- if (fep->flags & FEC_FLAG_BUFDESC_EX) {
- fep->tx_bd_base = (union bufdesc_u *)
- (&cbd_base->ebd + fep->rx_ring_size);
- fep->tx_bd_dma = cbd_dma + sizeof(struct bufdesc_ex) *
- fep->rx_ring_size;
- } else {
- fep->tx_bd_base = (union bufdesc_u *)
- (&cbd_base->bd + fep->rx_ring_size);
- fep->tx_bd_dma = cbd_dma + sizeof(struct bufdesc) *
- fep->rx_ring_size;
- }
+ fep->rx_bd_base = fep->tx_bd_base = NULL;
+ fep->rx_bd_dma = fep->tx_bd_dma = 0;
/* The FEC Ethernet specific entries in the device structure */
ndev->watchdog_timeo = TX_TIMEOUT;
@@ -2480,8 +2482,6 @@ static int fec_enet_init(struct net_device *ndev)
ndev->hw_features = ndev->features;
fec_restart(ndev);
-
- return 0;
}
#ifdef CONFIG_OF
@@ -2647,9 +2647,7 @@ fec_probe(struct platform_device *pdev)
if (fep->flags & FEC_FLAG_BUFDESC_EX)
fec_ptp_init(pdev);
- ret = fec_enet_init(ndev);
- if (ret)
- goto failed_init;
+ fec_enet_init(ndev);
for (i = 0; i < FEC_IRQ_NUM; i++) {
irq = platform_get_irq(pdev, i);
@@ -2688,7 +2686,6 @@ failed_register:
fec_enet_mii_remove(fep);
failed_mii_init:
failed_irq:
-failed_init:
if (fep->reg_phy)
regulator_disable(fep->reg_phy);
failed_regulator: