5.4.1 updates, driver patch updates
[etherboot.git] / src / drivers / net / 3c90x.c
index 1c8b7e4..be4a43c 100644 (file)
@@ -239,6 +239,7 @@ typedef struct
 /*** Global variables ***/
 static struct
     {
+    unsigned int       is3c556;
     unsigned char      isBrev;
     unsigned char      CurrentWindow;
     unsigned int       IOAddr;
@@ -302,7 +303,15 @@ a3c90x_internal_ReadEeprom(int ioaddr, int address)
        while((1<<15) & inw(ioaddr + regEepromCommand_0_w));
 
        /** Read the value. **/
-       outw(address + ((0x02)<<6), ioaddr + regEepromCommand_0_w);
+       if (INF_3C90X.is3c556)
+        {
+            outw(address + (0x230), ioaddr + regEepromCommand_0_w);
+        }
+       else
+        {
+            outw(address + ((0x02)<<6), ioaddr + regEepromCommand_0_w);
+        }
        while((1<<15) & inw(ioaddr + regEepromCommand_0_w));
        val = inw(ioaddr + regEepromData_0_w);
 
@@ -691,6 +700,8 @@ static void a3c90x_irq(struct nic *nic __unused, irq_action_t action __unused)
 static int a3c90x_probe(struct dev *dev, struct pci_device *pci)
 {
     struct nic *nic = (struct nic *)dev;
+    INF_3C90X.is3c556 = (pci->dev_id == 0x6055);
     int i, c;
     unsigned short eeprom[0x21];
     unsigned int cfg;
@@ -792,6 +803,15 @@ static int a3c90x_probe(struct dev *dev, struct pci_device *pci)
     INF_3C90X.HWAddr[5] = eeprom[HWADDR_OFFSET + 2]&0xFF;
     printf("MAC Address = %!\n", INF_3C90X.HWAddr);
 
+    /** 3C556: Invert MII power **/
+    if (INF_3C90X.is3c556) {
+       unsigned int tmp;
+       a3c90x_internal_SetWindow(INF_3C90X.IOAddr, winAddressing2);
+       tmp = inw(INF_3C90X.IOAddr + regResetOptions_2_w);
+       tmp |= 0x4000;
+       outw(tmp, INF_3C90X.IOAddr + regResetOptions_2_w);
+    }
+
     /* Test if the link is good, if not continue */
     a3c90x_internal_SetWindow(INF_3C90X.IOAddr, winDiagnostics4);
     mstat = inw(INF_3C90X.IOAddr + regMediaStatus_4_w);
@@ -961,6 +981,7 @@ static int a3c90x_probe(struct dev *dev, struct pci_device *pci)
 
 static struct pci_id a3c90x_nics[] = {
 /* Original 90x revisions: */
+PCI_ROM(0x10b7, 0x6055, "3c556",        "3C556"),              /* Huricane */
 PCI_ROM(0x10b7, 0x9000, "3c905-tpo",     "3Com900-TPO"),       /* 10 Base TPO */
 PCI_ROM(0x10b7, 0x9001, "3c905-t4",      "3Com900-Combo"),     /* 10/100 T4 */
 PCI_ROM(0x10b7, 0x9050, "3c905-tpo100",  "3Com905-TX"),                /* 100 Base TX / 10/100 TPO */