drivers/net/tulip/dmfe: support basic carrier detection
Samuel Thibault [Thu, 30 Nov 2006 12:11:24 +0000 (07:11 -0500)]
Signed-off-by: Jeff Garzik <jeff@garzik.org>

drivers/net/tulip/dmfe.c

index 4dd8a0b..7f59a3d 100644 (file)
@@ -187,7 +187,7 @@ struct rx_desc {
 struct dmfe_board_info {
        u32 chip_id;                    /* Chip vendor/Device ID */
        u32 chip_revision;              /* Chip revision */
-       struct DEVICE *next_dev;        /* next device */
+       struct DEVICE *dev;             /* net device */
        struct pci_dev *pdev;           /* PCI device */
        spinlock_t lock;
 
@@ -399,6 +399,8 @@ static int __devinit dmfe_init_one (struct pci_dev *pdev,
        /* Init system & device */
        db = netdev_priv(dev);
 
+       db->dev = dev;
+
        /* Allocate Tx/Rx descriptor memory */
        db->desc_pool_ptr = pci_alloc_consistent(pdev, sizeof(struct tx_desc) * DESC_ALL_CNT + 0x20, &db->desc_pool_dma_ptr);
        db->buf_pool_ptr = pci_alloc_consistent(pdev, TX_BUF_ALLOC * TX_DESC_CNT + 4, &db->buf_pool_dma_ptr);
@@ -426,6 +428,7 @@ static int __devinit dmfe_init_one (struct pci_dev *pdev,
        dev->poll_controller = &poll_dmfe;
 #endif
        dev->ethtool_ops = &netdev_ethtool_ops;
+       netif_carrier_off(db->dev);
        spin_lock_init(&db->lock);
 
        pci_read_config_dword(pdev, 0x50, &pci_pmr);
@@ -1050,6 +1053,7 @@ static void netdev_get_drvinfo(struct net_device *dev,
 
 static const struct ethtool_ops netdev_ethtool_ops = {
        .get_drvinfo            = netdev_get_drvinfo,
+       .get_link               = ethtool_op_get_link,
 };
 
 /*
@@ -1144,6 +1148,7 @@ static void dmfe_timer(unsigned long data)
                /* Link Failed */
                DMFE_DBUG(0, "Link Failed", tmp_cr12);
                db->link_failed = 1;
+               netif_carrier_off(db->dev);
 
                /* For Force 10/100M Half/Full mode: Enable Auto-Nego mode */
                /* AUTO or force 1M Homerun/Longrun don't need */
@@ -1166,6 +1171,8 @@ static void dmfe_timer(unsigned long data)
                        if ( (db->media_mode & DMFE_AUTO) &&
                                dmfe_sense_speed(db) )
                                db->link_failed = 1;
+                       else
+                               netif_carrier_on(db->dev);
                        dmfe_process_mode(db);
                        /* SHOW_MEDIA_TYPE(db->op_mode); */
                }