]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/dm9000.c
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/kyle/parisc-2.6
[linux-2.6-omap-h63xx.git] / drivers / net / dm9000.c
index 8cc1174e7f64361847def8e89132ee0ade90f863..738aa59065149a185414e25946658cd5ef58667b 100644 (file)
@@ -77,9 +77,6 @@
 
 #define DM9000_PHY             0x40    /* PHY address 0x01 */
 
-#define TRUE                   1
-#define FALSE                  0
-
 #define CARDNAME "dm9000"
 #define PFX CARDNAME ": "
 
 #define PRINTK(args...)   printk(KERN_DEBUG args)
 #endif
 
+#ifdef CONFIG_BLACKFIN
+#define readsb insb
+#define readsw insw
+#define readsl insl
+#define writesb        outsb
+#define writesw        outsw
+#define writesl        outsl
+#define DM9000_IRQ_FLAGS       (IRQF_SHARED | IRQF_TRIGGER_HIGH)
+#else
+#define DM9000_IRQ_FLAGS       IRQF_SHARED
+#endif
+
 /*
  * Transmit timeout, default 5 seconds.
  */
@@ -434,6 +443,9 @@ dm9000_probe(struct platform_device *pdev)
                db->io_addr = (void __iomem *)base;
                db->io_data = (void __iomem *)(base + 4);
 
+               /* ensure at least we have a default set of IO routines */
+               dm9000_set_io(db, 2);
+
        } else {
                db->addr_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
                db->data_res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
@@ -601,7 +613,7 @@ dm9000_probe(struct platform_device *pdev)
        printk("%s: not found (%d).\n", CARDNAME, ret);
 
        dm9000_release_board(pdev, db);
-       kfree(ndev);
+       free_netdev(ndev);
 
        return ret;
 }
@@ -617,7 +629,7 @@ dm9000_open(struct net_device *dev)
 
        PRINTK2("entering dm9000_open\n");
 
-       if (request_irq(dev->irq, &dm9000_interrupt, IRQF_SHARED, dev->name, dev))
+       if (request_irq(dev->irq, &dm9000_interrupt, DM9000_IRQ_FLAGS, dev->name, dev))
                return -EAGAIN;
 
        /* Initialize DM9000 board */
@@ -688,6 +700,7 @@ dm9000_init_dm9000(struct net_device *dev)
 static int
 dm9000_start_xmit(struct sk_buff *skb, struct net_device *dev)
 {
+       unsigned long flags;
        board_info_t *db = (board_info_t *) dev->priv;
 
        PRINTK3("dm9000_start_xmit\n");
@@ -695,10 +708,7 @@ dm9000_start_xmit(struct sk_buff *skb, struct net_device *dev)
        if (db->tx_pkt_cnt > 1)
                return 1;
 
-       netif_stop_queue(dev);
-
-       /* Disable all interrupts */
-       iow(db, DM9000_IMR, IMR_PAR);
+       spin_lock_irqsave(&db->lock, flags);
 
        /* Move data to DM9000 TX RAM */
        writeb(DM9000_MWCMD, db->io_addr);
@@ -706,12 +716,9 @@ dm9000_start_xmit(struct sk_buff *skb, struct net_device *dev)
        (db->outblk)(db->io_data, skb->data, skb->len);
        db->stats.tx_bytes += skb->len;
 
+       db->tx_pkt_cnt++;
        /* TX control: First packet immediately send, second packet queue */
-       if (db->tx_pkt_cnt == 0) {
-
-               /* First Packet */
-               db->tx_pkt_cnt++;
-
+       if (db->tx_pkt_cnt == 1) {
                /* Set TX length to DM9000 */
                iow(db, DM9000_TXPLL, skb->len & 0xff);
                iow(db, DM9000_TXPLH, (skb->len >> 8) & 0xff);
@@ -720,23 +727,17 @@ dm9000_start_xmit(struct sk_buff *skb, struct net_device *dev)
                iow(db, DM9000_TCR, TCR_TXREQ); /* Cleared after TX complete */
 
                dev->trans_start = jiffies;     /* save the time stamp */
-
        } else {
                /* Second packet */
-               db->tx_pkt_cnt++;
                db->queue_pkt_len = skb->len;
+               netif_stop_queue(dev);
        }
 
+       spin_unlock_irqrestore(&db->lock, flags);
+
        /* free this SKB */
        dev_kfree_skb(skb);
 
-       /* Re-enable resource check */
-       if (db->tx_pkt_cnt == 1)
-               netif_wake_queue(dev);
-
-       /* Re-enable interrupt */
-       iow(db, DM9000_IMR, IMR_PAR | IMR_PTM | IMR_PRM);
-
        return 0;
 }
 
@@ -896,7 +897,7 @@ dm9000_rx(struct net_device *dev)
        struct dm9000_rxhdr rxhdr;
        struct sk_buff *skb;
        u8 rxbyte, *rdptr;
-       int GoodPacket;
+       bool GoodPacket;
        int RxLen;
 
        /* Check packet ready or not */
@@ -918,7 +919,7 @@ dm9000_rx(struct net_device *dev)
                        return;
 
                /* A packet ready now  & Get status/length */
-               GoodPacket = TRUE;
+               GoodPacket = true;
                writeb(DM9000_MRCMD, db->io_addr);
 
                (db->inblk)(db->io_data, &rxhdr, sizeof(rxhdr));
@@ -927,7 +928,7 @@ dm9000_rx(struct net_device *dev)
 
                /* Packet Status check */
                if (RxLen < 0x40) {
-                       GoodPacket = FALSE;
+                       GoodPacket = false;
                        PRINTK1("Bad Packet received (runt)\n");
                }
 
@@ -936,7 +937,7 @@ dm9000_rx(struct net_device *dev)
                }
 
                if (rxhdr.RxStatus & 0xbf00) {
-                       GoodPacket = FALSE;
+                       GoodPacket = false;
                        if (rxhdr.RxStatus & 0x100) {
                                PRINTK1("fifo error\n");
                                db->stats.rx_fifo_errors++;
@@ -1193,7 +1194,7 @@ dm9000_drv_remove(struct platform_device *pdev)
 
        unregister_netdev(ndev);
        dm9000_release_board(pdev, (board_info_t *) ndev->priv);
-       kfree(ndev);            /* free device structure */
+       free_netdev(ndev);              /* free device structure */
 
        PRINTK1("clean_module() exit\n");