This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / drivers / net / tulip / tulip_core.c
index c3b4d91..0fc00ed 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 },
@@ -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)