Merge /pub/scm/linux/kernel/git/torvalds/linux-2.6
[powerpc.git] / drivers / net / dm9000.c
index 24996da..264fa0e 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 ": "
 
@@ -159,7 +156,7 @@ static void dm9000_init_dm9000(struct net_device *);
 
 static struct net_device_stats *dm9000_get_stats(struct net_device *);
 
-static irqreturn_t dm9000_interrupt(int, void *, struct pt_regs *);
+static irqreturn_t dm9000_interrupt(int, void *);
 
 static int dm9000_phy_read(struct net_device *dev, int phyaddr_unsused, int reg);
 static void dm9000_phy_write(struct net_device *dev, int phyaddr_unused, int reg,
@@ -339,6 +336,17 @@ static void dm9000_timeout(struct net_device *dev)
        spin_unlock_irqrestore(&db->lock,flags);
 }
 
+#ifdef CONFIG_NET_POLL_CONTROLLER
+/*
+ *Used by netconsole
+ */
+static void dm9000_poll_controller(struct net_device *dev)
+{
+       disable_irq(dev->irq);
+       dm9000_interrupt(dev->irq,dev);
+       enable_irq(dev->irq);
+}
+#endif
 
 /* dm9000_release_board
  *
@@ -366,8 +374,8 @@ dm9000_release_board(struct platform_device *pdev, struct board_info *db)
                kfree(db->data_req);
        }
 
-       if (db->addr_res != NULL) {
-               release_resource(db->addr_res);
+       if (db->addr_req != NULL) {
+               release_resource(db->addr_req);
                kfree(db->addr_req);
        }
 }
@@ -410,10 +418,7 @@ dm9000_probe(struct platform_device *pdev)
        if (pdev->num_resources < 2) {
                ret = -ENODEV;
                goto out;
-       }
-
-       switch (pdev->num_resources) {
-       case 2:
+       } else if (pdev->num_resources == 2) {
                base = pdev->resource[0].start;
 
                if (!request_mem_region(base, 4, ndev->name)) {
@@ -423,17 +428,16 @@ dm9000_probe(struct platform_device *pdev)
 
                ndev->base_addr = base;
                ndev->irq = pdev->resource[1].start;
-               db->io_addr = (void *)base;
-               db->io_data = (void *)(base + 4);
+               db->io_addr = (void __iomem *)base;
+               db->io_data = (void __iomem *)(base + 4);
 
-               break;
-
-       case 3:
+       } else {
                db->addr_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
                db->data_res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
                db->irq_res  = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
 
-               if (db->addr_res == NULL || db->data_res == NULL) {
+               if (db->addr_res == NULL || db->data_res == NULL ||
+                   db->irq_res == NULL) {
                        printk(KERN_ERR PFX "insufficient resources\n");
                        ret = -ENOENT;
                        goto out;
@@ -482,7 +486,6 @@ dm9000_probe(struct platform_device *pdev)
 
                /* ensure at least we have a default set of IO routines */
                dm9000_set_io(db, iosize);
-
        }
 
        /* check to see if anything is being over-ridden */
@@ -543,6 +546,9 @@ dm9000_probe(struct platform_device *pdev)
        ndev->stop               = &dm9000_stop;
        ndev->get_stats          = &dm9000_get_stats;
        ndev->set_multicast_list = &dm9000_hash_table;
+#ifdef CONFIG_NET_POLL_CONTROLLER
+       ndev->poll_controller    = &dm9000_poll_controller;
+#endif
 
 #ifdef DM9000_PROGRAM_EEPROM
        program_eeprom(db);
@@ -564,6 +570,13 @@ dm9000_probe(struct platform_device *pdev)
        for (i = 0; i < 6; i++)
                ndev->dev_addr[i] = db->srom[i];
 
+       if (!is_valid_ether_addr(ndev->dev_addr)) {
+               /* try reading from mac */
+
+               for (i = 0; i < 6; i++)
+                       ndev->dev_addr[i] = ior(db, i+DM9000_PAR);
+       }
+
        if (!is_valid_ether_addr(ndev->dev_addr))
                printk("%s: Invalid ethernet MAC address.  Please "
                       "set using ifconfig\n", ndev->name);
@@ -585,7 +598,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;
 }
@@ -601,7 +614,7 @@ dm9000_open(struct net_device *dev)
 
        PRINTK2("entering dm9000_open\n");
 
-       if (request_irq(dev->irq, &dm9000_interrupt, SA_SHIRQ, dev->name, dev))
+       if (request_irq(dev->irq, &dm9000_interrupt, IRQF_SHARED, dev->name, dev))
                return -EAGAIN;
 
        /* Initialize DM9000 board */
@@ -663,7 +676,6 @@ dm9000_init_dm9000(struct net_device *dev)
        db->tx_pkt_cnt = 0;
        db->queue_pkt_len = 0;
        dev->trans_start = 0;
-       spin_lock_init(&db->lock);
 }
 
 /*
@@ -767,7 +779,7 @@ dm9000_stop(struct net_device *ndev)
  * receive the packet to upper layer, free the transmitted packet
  */
 
-void
+static void
 dm9000_tx_done(struct net_device *dev, board_info_t * db)
 {
        int tx_status = ior(db, DM9000_NSR);    /* Got TX status */
@@ -789,7 +801,7 @@ dm9000_tx_done(struct net_device *dev, board_info_t * db)
 }
 
 static irqreturn_t
-dm9000_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+dm9000_interrupt(int irq, void *dev_id)
 {
        struct net_device *dev = dev_id;
        board_info_t *db;
@@ -881,7 +893,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 */
@@ -903,7 +915,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));
@@ -912,7 +924,7 @@ dm9000_rx(struct net_device *dev)
 
                /* Packet Status check */
                if (RxLen < 0x40) {
-                       GoodPacket = FALSE;
+                       GoodPacket = false;
                        PRINTK1("Bad Packet received (runt)\n");
                }
 
@@ -921,7 +933,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++;
@@ -939,7 +951,6 @@ dm9000_rx(struct net_device *dev)
                /* Move data from DM9000 */
                if (GoodPacket
                    && ((skb = dev_alloc_skb(RxLen + 4)) != NULL)) {
-                       skb->dev = dev;
                        skb_reserve(skb, 2);
                        rdptr = (u8 *) skb_put(skb, RxLen - 4);
 
@@ -1179,7 +1190,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");
 
@@ -1187,13 +1198,14 @@ dm9000_drv_remove(struct platform_device *pdev)
 }
 
 static struct platform_driver dm9000_driver = {
+       .driver = {
+               .name    = "dm9000",
+               .owner   = THIS_MODULE,
+       },
        .probe   = dm9000_probe,
        .remove  = dm9000_drv_remove,
        .suspend = dm9000_drv_suspend,
        .resume  = dm9000_drv_resume,
-       .driver = {
-               .name   = "dm9000",
-       },
 };
 
 static int __init