r6040: bump to version 0.25 and 20 August 2009 release date
[safe/jmp/linux-2.6] / drivers / net / r6040.c
index 3c27a7b..8068a07 100644 (file)
 #include <asm/processor.h>
 
 #define DRV_NAME       "r6040"
-#define DRV_VERSION    "0.21"
-#define DRV_RELDATE    "09Jan2009"
+#define DRV_VERSION    "0.25"
+#define DRV_RELDATE    "20Aug2009"
 
 /* PHY CHIP Address */
 #define PHY1_ADDR      1       /* For MAC1 */
-#define PHY2_ADDR      2       /* For MAC2 */
+#define PHY2_ADDR      3       /* For MAC2 */
 #define PHY_MODE       0x3100  /* PHY CHIP Register 0 */
 #define PHY_CAP                0x01E1  /* PHY CHIP Register 4 */
 
@@ -160,6 +160,7 @@ MODULE_AUTHOR("Sten Wang <sten.wang@rdc.com.tw>,"
        "Florian Fainelli <florian@openwrt.org>");
 MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("RDC R6040 NAPI PCI FastEthernet driver");
+MODULE_VERSION(DRV_VERSION " " DRV_RELDATE);
 
 /* RX and TX interrupts that we handle */
 #define RX_INTS                        (RX_FIFO_FULL | RX_NO_DESC | RX_FINISH)
@@ -400,6 +401,9 @@ static void r6040_init_mac_regs(struct net_device *dev)
         * we may got called by r6040_tx_timeout which has left
         * some unsent tx buffers */
        iowrite16(0x01, ioaddr + MTPR);
+
+       /* Check media */
+       mii_check_media(&lp->mii_if, 1, 1);
 }
 
 static void r6040_tx_timeout(struct net_device *dev)
@@ -484,12 +488,12 @@ static int r6040_close(struct net_device *dev)
        /* Free Descriptor memory */
        if (lp->rx_ring) {
                pci_free_consistent(pdev, RX_DESC_SIZE, lp->rx_ring, lp->rx_ring_dma);
-               lp->rx_ring = 0;
+               lp->rx_ring = NULL;
        }
 
        if (lp->tx_ring) {
                pci_free_consistent(pdev, TX_DESC_SIZE, lp->tx_ring, lp->tx_ring_dma);
-               lp->tx_ring = 0;
+               lp->tx_ring = NULL;
        }
 
        return 0;
@@ -527,6 +531,8 @@ static int r6040_phy_mode_chk(struct net_device *dev)
                        phy_dat = 0x0000;
        }
 
+       mii_check_media(&lp->mii_if, 0, 1);
+
        return phy_dat;
 };
 
@@ -698,8 +704,11 @@ static irqreturn_t r6040_interrupt(int irq, void *dev_id)
        /* Read MISR status and clear */
        status = ioread16(ioaddr + MISR);
 
-       if (status == 0x0000 || status == 0xffff)
+       if (status == 0x0000 || status == 0xffff) {
+               /* Restore RDC MAC interrupt */
+               iowrite16(misr, ioaddr + MIER);
                return IRQ_NONE;
+       }
 
        /* RX interrupt request */
        if (status & RX_INTS) {
@@ -801,7 +810,6 @@ static void r6040_timer(unsigned long data)
                lp->phy_mode = phy_mode;
                lp->mcr0 = (lp->mcr0 & 0x7fff) | phy_mode;
                iowrite16(lp->mcr0, ioaddr);
-               printk(KERN_INFO "Link Change %x \n", ioread16(ioaddr));
        }
 
        /* Timer active again */
@@ -1075,7 +1083,6 @@ static int __devinit r6040_init_one(struct pci_dev *pdev,
        int err, io_size = R6040_IO_SIZE;
        static int card_idx = -1;
        int bar = 0;
-       long pioaddr;
        u16 *adrp;
 
        printk(KERN_INFO "%s\n", version);
@@ -1085,13 +1092,13 @@ static int __devinit r6040_init_one(struct pci_dev *pdev,
                goto err_out;
 
        /* this should always be supported */
-       err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+       err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
        if (err) {
                printk(KERN_ERR DRV_NAME ": 32-bit PCI DMA addresses"
                                "not supported by the card\n");
                goto err_out;
        }
-       err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+       err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
        if (err) {
                printk(KERN_ERR DRV_NAME ": 32-bit PCI DMA addresses"
                                "not supported by the card\n");
@@ -1099,13 +1106,12 @@ static int __devinit r6040_init_one(struct pci_dev *pdev,
        }
 
        /* IO Size check */
-       if (pci_resource_len(pdev, 0) < io_size) {
+       if (pci_resource_len(pdev, bar) < io_size) {
                printk(KERN_ERR DRV_NAME ": Insufficient PCI resources, aborting\n");
                err = -EIO;
                goto err_out;
        }
 
-       pioaddr = pci_resource_start(pdev, 0);  /* IO map base address */
        pci_set_master(pdev);
 
        dev = alloc_etherdev(sizeof(struct r6040_private));
@@ -1180,6 +1186,13 @@ static int __devinit r6040_init_one(struct pci_dev *pdev,
        lp->mii_if.phy_id_mask = 0x1f;
        lp->mii_if.reg_num_mask = 0x1f;
 
+       /* Check the vendor ID on the PHY, if 0xffff assume none attached */
+       if (r6040_phy_read(ioaddr, lp->phy_addr, 2) == 0xffff) {
+               printk(KERN_ERR DRV_NAME ": Failed to detect an attached PHY\n");
+               err = -ENODEV;
+               goto err_out_unmap;
+       }
+
        /* Register net device. After this dev->name assign */
        err = register_netdev(dev);
        if (err) {