]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/pasemi_mac.c
pasemi_mac: clear out old errors on interface open
[linux-2.6-omap-h63xx.git] / drivers / net / pasemi_mac.c
index ef1ebb4b8af27af194bb1ba06d3f9e037fcae81f..967ff8c96b0fa40d75219590ebbc5e6842699b8b 100644 (file)
@@ -903,16 +903,27 @@ static int pasemi_mac_open(struct net_device *dev)
 
        /* enable rx if */
        write_dma_reg(mac, PAS_DMA_RXINT_RCMDSTA(mac->dma_if),
-                          PAS_DMA_RXINT_RCMDSTA_EN);
+                          PAS_DMA_RXINT_RCMDSTA_EN |
+                          PAS_DMA_RXINT_RCMDSTA_DROPS_M |
+                          PAS_DMA_RXINT_RCMDSTA_BP |
+                          PAS_DMA_RXINT_RCMDSTA_OO |
+                          PAS_DMA_RXINT_RCMDSTA_BT);
 
        /* enable rx channel */
        write_dma_reg(mac, PAS_DMA_RXCHAN_CCMDSTA(mac->dma_rxch),
                           PAS_DMA_RXCHAN_CCMDSTA_EN |
-                          PAS_DMA_RXCHAN_CCMDSTA_DU);
+                          PAS_DMA_RXCHAN_CCMDSTA_DU |
+                          PAS_DMA_RXCHAN_CCMDSTA_OD |
+                          PAS_DMA_RXCHAN_CCMDSTA_FD |
+                          PAS_DMA_RXCHAN_CCMDSTA_DT);
 
        /* enable tx channel */
        write_dma_reg(mac, PAS_DMA_TXCHAN_TCMDSTA(mac->dma_txch),
-                          PAS_DMA_TXCHAN_TCMDSTA_EN);
+                          PAS_DMA_TXCHAN_TCMDSTA_EN |
+                          PAS_DMA_TXCHAN_TCMDSTA_SZ |
+                          PAS_DMA_TXCHAN_TCMDSTA_DB |
+                          PAS_DMA_TXCHAN_TCMDSTA_DE |
+                          PAS_DMA_TXCHAN_TCMDSTA_DA);
 
        pasemi_mac_replenish_rx_ring(dev, RX_RING_SIZE);
 
@@ -987,7 +998,7 @@ out_rx_resources:
 static int pasemi_mac_close(struct net_device *dev)
 {
        struct pasemi_mac *mac = netdev_priv(dev);
-       unsigned int stat;
+       unsigned int sta;
        int retries;
 
        if (mac->phydev) {
@@ -998,6 +1009,26 @@ static int pasemi_mac_close(struct net_device *dev)
        netif_stop_queue(dev);
        napi_disable(&mac->napi);
 
+       sta = read_dma_reg(mac, PAS_DMA_RXINT_RCMDSTA(mac->dma_if));
+       if (sta & (PAS_DMA_RXINT_RCMDSTA_BP |
+                     PAS_DMA_RXINT_RCMDSTA_OO |
+                     PAS_DMA_RXINT_RCMDSTA_BT))
+               printk(KERN_DEBUG "pasemi_mac: rcmdsta error: 0x%08x\n", sta);
+
+       sta = read_dma_reg(mac, PAS_DMA_RXCHAN_CCMDSTA(mac->dma_rxch));
+       if (sta & (PAS_DMA_RXCHAN_CCMDSTA_DU |
+                    PAS_DMA_RXCHAN_CCMDSTA_OD |
+                    PAS_DMA_RXCHAN_CCMDSTA_FD |
+                    PAS_DMA_RXCHAN_CCMDSTA_DT))
+               printk(KERN_DEBUG "pasemi_mac: ccmdsta error: 0x%08x\n", sta);
+
+       sta = read_dma_reg(mac, PAS_DMA_TXCHAN_TCMDSTA(mac->dma_txch));
+       if (sta & (PAS_DMA_TXCHAN_TCMDSTA_SZ |
+                     PAS_DMA_TXCHAN_TCMDSTA_DB |
+                     PAS_DMA_TXCHAN_TCMDSTA_DE |
+                     PAS_DMA_TXCHAN_TCMDSTA_DA))
+               printk(KERN_DEBUG "pasemi_mac: tcmdsta error: 0x%08x\n", sta);
+
        /* Clean out any pending buffers */
        pasemi_mac_clean_tx(mac);
        pasemi_mac_clean_rx(mac, RX_RING_SIZE);
@@ -1008,33 +1039,33 @@ static int pasemi_mac_close(struct net_device *dev)
        write_dma_reg(mac, PAS_DMA_RXCHAN_CCMDSTA(mac->dma_rxch), PAS_DMA_RXCHAN_CCMDSTA_ST);
 
        for (retries = 0; retries < MAX_RETRIES; retries++) {
-               stat = read_dma_reg(mac, PAS_DMA_TXCHAN_TCMDSTA(mac->dma_txch));
-               if (!(stat & PAS_DMA_TXCHAN_TCMDSTA_ACT))
+               sta = read_dma_reg(mac, PAS_DMA_TXCHAN_TCMDSTA(mac->dma_txch));
+               if (!(sta & PAS_DMA_TXCHAN_TCMDSTA_ACT))
                        break;
                cond_resched();
        }
 
-       if (stat & PAS_DMA_TXCHAN_TCMDSTA_ACT)
+       if (sta & PAS_DMA_TXCHAN_TCMDSTA_ACT)
                dev_err(&mac->dma_pdev->dev, "Failed to stop tx channel\n");
 
        for (retries = 0; retries < MAX_RETRIES; retries++) {
-               stat = read_dma_reg(mac, PAS_DMA_RXCHAN_CCMDSTA(mac->dma_rxch));
-               if (!(stat & PAS_DMA_RXCHAN_CCMDSTA_ACT))
+               sta = read_dma_reg(mac, PAS_DMA_RXCHAN_CCMDSTA(mac->dma_rxch));
+               if (!(sta & PAS_DMA_RXCHAN_CCMDSTA_ACT))
                        break;
                cond_resched();
        }
 
-       if (stat & PAS_DMA_RXCHAN_CCMDSTA_ACT)
+       if (sta & PAS_DMA_RXCHAN_CCMDSTA_ACT)
                dev_err(&mac->dma_pdev->dev, "Failed to stop rx channel\n");
 
        for (retries = 0; retries < MAX_RETRIES; retries++) {
-               stat = read_dma_reg(mac, PAS_DMA_RXINT_RCMDSTA(mac->dma_if));
-               if (!(stat & PAS_DMA_RXINT_RCMDSTA_ACT))
+               sta = read_dma_reg(mac, PAS_DMA_RXINT_RCMDSTA(mac->dma_if));
+               if (!(sta & PAS_DMA_RXINT_RCMDSTA_ACT))
                        break;
                cond_resched();
        }
 
-       if (stat & PAS_DMA_RXINT_RCMDSTA_ACT)
+       if (sta & PAS_DMA_RXINT_RCMDSTA_ACT)
                dev_err(&mac->dma_pdev->dev, "Failed to stop rx interface\n");
 
        /* Then, disable the channel. This must be done separately from