• Christian Riesch's avatar
    net: davinci_emac: Fix rollback of emac_dev_open() · cd11cf50
    Christian Riesch authored
    If an error occurs during the initialization in emac_dev_open() (the
    driver's ndo_open function), interrupts, DMA descriptors etc. must be freed.
    The current rollback code is buggy in several ways.
    
      1) Freeing the interrupts. The current code will not free all interrupts
         that were requested by the driver. Furthermore,  the code tries to do a
         platform_get_resource(priv->pdev, IORESOURCE_IRQ, -1) in its last
         iteration.
    
         This patch fixes these bugs.
    
      2) Wrong order of err: and rollback: labels. If the setup of the PHY in
         the code fails, the interrupts that have been requested before are
         not freed:
    
            request irq
                    if requesting irqs fails, goto rollback
            setup phy
                    if phy setup fails, goto err
            return 0
    
         rollback:
            free irqs
         err:
    
         This patch brings the code into the correct order.
    
      3) The code calls napi_enable() and emac_int_enable(), but does not
         undo both in case of an error.
    
         This patch adds calls of emac_int_disable() and napi_disable() to the
         rollback code.
    
      4) RX DMA descriptors are not freed in case of an error: Right before
         requesting the irqs, the function creates DMA descriptors for the
         RX channel. These RX descriptors are never freed when we jump to either
         rollback or err.
    
         This patch adds code for freeing the DMA descriptors in the case of
         an initialization error. This required a modification of
         cpdma_ctrl_stop() in davinci_cpdma.c: We must be able to call this
         function to free the DMA descriptors while the DMA channels are
         in IDLE state (before cpdma_ctlr_start() was called).
    
    Tested on a custom board with the Texas Instruments AM1808.
    Signed-off-by: default avatarChristian Riesch <christian.riesch@omicron.at>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    cd11cf50
davinci_emac.c 60.6 KB