patch-2_6_7-vs1_9_1_12
[linux-2.6.git] / drivers / net / tulip / tulip_core.c
index c3b4d91..498f612 100644 (file)
@@ -226,8 +226,9 @@ static struct pci_device_id tulip_pci_tbl[] = {
        { 0x1113, 0x1216, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET },
        { 0x1113, 0x1217, PCI_ANY_ID, PCI_ANY_ID, 0, 0, MX98715 },
        { 0x1113, 0x9511, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET },
-       { 0x14f1, 0x1803, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CONEXANT },
+       { 0x1186, 0x1541, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET },
        { 0x1186, 0x1561, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET },
+       { 0x14f1, 0x1803, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CONEXANT },
        { 0x1626, 0x8410, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET },
        { 0x1737, 0xAB09, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET },
        { 0x1737, 0xAB08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET },
@@ -829,7 +830,7 @@ static struct net_device_stats *tulip_get_stats(struct net_device *dev)
 }
 
 
-static int netdev_ethtool_ioctl(struct net_device *dev, void *useraddr)
+static int netdev_ethtool_ioctl(struct net_device *dev, void __user *useraddr)
 {
        struct tulip_private *np = netdev_priv(dev);
        u32 ethcmd;
@@ -858,14 +859,14 @@ static int private_ioctl (struct net_device *dev, struct ifreq *rq, int cmd)
 {
        struct tulip_private *tp = netdev_priv(dev);
        long ioaddr = dev->base_addr;
-       struct mii_ioctl_data *data = (struct mii_ioctl_data *) & rq->ifr_data;
+       struct mii_ioctl_data *data = if_mii(rq);
        const unsigned int phy_idx = 0;
        int phy = tp->phys[phy_idx] & 0x1f;
        unsigned int regnum = data->reg_num;
 
        switch (cmd) {
        case SIOCETHTOOL:
-               return netdev_ethtool_ioctl(dev, (void *) rq->ifr_data);
+               return netdev_ethtool_ioctl(dev, rq->ifr_data);
 
        case SIOCGMIIPHY:               /* Get address of MII PHY in use. */
                if (tp->mii_cnt)
@@ -1245,6 +1246,7 @@ static int __devinit tulip_init_one (struct pci_dev *pdev,
        long ioaddr;
        static int board_idx = -1;
        int chip_idx = ent->driver_data;
+       const char *chip_name = tulip_tbl[chip_idx].chip_name;
        unsigned int eeprom_missing = 0;
        unsigned int force_csr0 = 0;
 
@@ -1413,6 +1415,23 @@ static int __devinit tulip_init_one (struct pci_dev *pdev,
 
        pci_set_master(pdev);
 
+#ifdef CONFIG_GSC
+       if (pdev->subsystem_vendor == PCI_VENDOR_ID_HP) {
+               switch (pdev->subsystem_device) {
+               default:
+                       break;
+               case 0x1061:
+               case 0x1062:
+               case 0x1063:
+               case 0x1098:
+               case 0x1099:
+               case 0x10EE:
+                       tp->flags |= HAS_SWAPPED_SEEPROM | NEEDS_FAKE_MEDIA_TABLE;
+                       chip_name = "GSC DS21140 Tulip";
+               }
+       }
+#endif
+
        /* Clear the missed-packet counter. */
        inl(ioaddr + CSR8);
 
@@ -1441,11 +1460,13 @@ static int __devinit tulip_init_one (struct pci_dev *pdev,
        } else {
                /* A serial EEPROM interface, we read now and sort it out later. */
                int sa_offset = 0;
-               int ee_addr_size = tulip_read_eeprom(ioaddr, 0xff, 8) & 0x40000 ? 8 : 6;
+               int ee_addr_size = tulip_read_eeprom(dev, 0xff, 8) & 0x40000 ? 8 : 6;
 
-               for (i = 0; i < sizeof(tp->eeprom)/2; i++)
-                       ((u16 *)ee_data)[i] =
-                               le16_to_cpu(tulip_read_eeprom(ioaddr, i, ee_addr_size));
+               for (i = 0; i < sizeof(tp->eeprom); i+=2) {
+                       u16 data = tulip_read_eeprom(dev, i/2, ee_addr_size);
+                       ee_data[i] = data & 0xff;
+                       ee_data[i + 1] = data >> 8;
+               }
 
                /* DEC now has a specification (see Notes) but early board makers
                   just put the address in the first EEPROM locations. */
@@ -1488,25 +1509,26 @@ static int __devinit tulip_init_one (struct pci_dev *pdev,
                        tp->flags &= ~HAS_MEDIA_TABLE;
                }
 #endif
-#ifdef __hppa__
-               /* 3x5 HSC (J3514A) has a broken srom */
-               if(ee_data[0] == 0x61 && ee_data[1] == 0x10) {
+#ifdef CONFIG_GSC
+               /* Check to see if we have a broken srom */
+               if (ee_data[0] == 0x61 && ee_data[1] == 0x10) {
                        /* pci_vendor_id and subsystem_id are swapped */
                        ee_data[0] = ee_data[2];
                        ee_data[1] = ee_data[3];
                        ee_data[2] = 0x61;
                        ee_data[3] = 0x10;
 
-                       /* srom need to be byte-swaped and shifted up 1 word.  
-                        * This shift needs to happen at the end of the MAC
-                        * first because of the 2 byte overlap.
+                       /* HSC-PCI boards need to be byte-swaped and shifted
+                        * up 1 word.  This shift needs to happen at the end
+                        * of the MAC first because of the 2 byte overlap.
                         */
-                       for(i = 4; i >= 0; i -= 2) {
+                       for (i = 4; i >= 0; i -= 2) {
                                ee_data[17 + i + 3] = ee_data[17 + i];
                                ee_data[16 + i + 5] = ee_data[16 + i];
                        }
                }
 #endif
+
                for (i = 0; i < 6; i ++) {
                        dev->dev_addr[i] = ee_data[i + sa_offset];
                        sum += ee_data[i + sa_offset];
@@ -1627,7 +1649,7 @@ static int __devinit tulip_init_one (struct pci_dev *pdev,
                goto err_out_free_ring;
 
        printk(KERN_INFO "%s: %s rev %d at %#3lx,",
-              dev->name, tulip_tbl[chip_idx].chip_name, chip_rev, ioaddr);
+              dev->name, chip_name, chip_rev, ioaddr);
        pci_set_drvdata(pdev, dev);
 
        if (eeprom_missing)