PM/Suspend: Introduce two new platform callbacks to avoid breakage
[safe/jmp/linux-2.6] / drivers / net / korina.c
index bd33fa9..38d6649 100644 (file)
@@ -334,7 +334,7 @@ static irqreturn_t korina_rx_dma_interrupt(int irq, void *dev_id)
                                DMA_STAT_HALT | DMA_STAT_ERR),
                                &lp->rx_dma_regs->dmasm);
 
-               netif_rx_schedule(&lp->napi);
+               napi_schedule(&lp->napi);
 
                if (dmas & DMA_STAT_ERR)
                        printk(KERN_ERR DRV_NAME "%s: DMA error\n", dev->name);
@@ -416,6 +416,9 @@ static int korina_rx(struct net_device *dev, int limit)
                        if (devcs & ETH_RX_MP)
                                dev->stats.multicast++;
 
+                       /* 16 bit align */
+                       skb_reserve(skb_new, 2);
+
                        lp->rx_skb[lp->rx_next_done] = skb_new;
                }
 
@@ -465,7 +468,7 @@ static int korina_poll(struct napi_struct *napi, int budget)
 
        work_done = korina_rx(dev, budget);
        if (work_done < budget) {
-               netif_rx_complete(napi);
+               napi_complete(napi);
 
                writel(readl(&lp->rx_dma_regs->dmasm) &
                        ~(DMA_STAT_DONE | DMA_STAT_HALT | DMA_STAT_ERR),
@@ -740,6 +743,7 @@ static struct ethtool_ops netdev_ethtool_ops = {
 static void korina_alloc_ring(struct net_device *dev)
 {
        struct korina_private *lp = netdev_priv(dev);
+       struct sk_buff *skb;
        int i;
 
        /* Initialize the transmit descriptors */
@@ -755,8 +759,6 @@ static void korina_alloc_ring(struct net_device *dev)
 
        /* Initialize the receive descriptors */
        for (i = 0; i < KORINA_NUM_RDS; i++) {
-               struct sk_buff *skb = lp->rx_skb[i];
-
                skb = dev_alloc_skb(KORINA_RBSIZE + 2);
                if (!skb)
                        break;
@@ -769,11 +771,12 @@ static void korina_alloc_ring(struct net_device *dev)
                lp->rd_ring[i].link = CPHYSADDR(&lp->rd_ring[i+1]);
        }
 
-       /* loop back */
-       lp->rd_ring[i].link = CPHYSADDR(&lp->rd_ring[0]);
-       lp->rx_next_done  = 0;
+       /* loop back receive descriptors, so the last
+        * descriptor points to the first one */
+       lp->rd_ring[i - 1].link = CPHYSADDR(&lp->rd_ring[0]);
+       lp->rd_ring[i - 1].control |= DMA_DESC_COD;
 
-       lp->rd_ring[i].control |= DMA_DESC_COD;
+       lp->rx_next_done  = 0;
        lp->rx_chain_head = 0;
        lp->rx_chain_tail = 0;
        lp->rx_chain_status = desc_empty;
@@ -1000,14 +1003,14 @@ static int korina_open(struct net_device *dev)
         * that handles the Done Finished
         * Ovr and Und Events */
        ret = request_irq(lp->rx_irq, &korina_rx_dma_interrupt,
-               IRQF_SHARED | IRQF_DISABLED, "Korina ethernet Rx", dev);
+                       IRQF_DISABLED, "Korina ethernet Rx", dev);
        if (ret < 0) {
                printk(KERN_ERR DRV_NAME "%s: unable to get Rx DMA IRQ %d\n",
                    dev->name, lp->rx_irq);
                goto err_release;
        }
        ret = request_irq(lp->tx_irq, &korina_tx_dma_interrupt,
-               IRQF_SHARED | IRQF_DISABLED, "Korina ethernet Tx", dev);
+                       IRQF_DISABLED, "Korina ethernet Tx", dev);
        if (ret < 0) {
                printk(KERN_ERR DRV_NAME "%s: unable to get Tx DMA IRQ %d\n",
                    dev->name, lp->tx_irq);
@@ -1016,7 +1019,7 @@ static int korina_open(struct net_device *dev)
 
        /* Install handler for overrun error. */
        ret = request_irq(lp->ovr_irq, &korina_ovr_interrupt,
-                       IRQF_SHARED | IRQF_DISABLED, "Ethernet Overflow", dev);
+                       IRQF_DISABLED, "Ethernet Overflow", dev);
        if (ret < 0) {
                printk(KERN_ERR DRV_NAME"%s: unable to get OVR IRQ %d\n",
                    dev->name, lp->ovr_irq);
@@ -1025,7 +1028,7 @@ static int korina_open(struct net_device *dev)
 
        /* Install handler for underflow error. */
        ret = request_irq(lp->und_irq, &korina_und_interrupt,
-                       IRQF_SHARED | IRQF_DISABLED, "Ethernet Underflow", dev);
+                       IRQF_DISABLED, "Ethernet Underflow", dev);
        if (ret < 0) {
                printk(KERN_ERR DRV_NAME "%s: unable to get UND IRQ %d\n",
                    dev->name, lp->und_irq);