Commit 5f87bc33 authored by Alan Cox's avatar Alan Cox Committed by Jeff Garzik

[PATCH] ULi support for 526X tulip variants

Signed-off-by: default avatarAlan Cox <alan@redhat.com>

from a 2.4 change by Clear Zhang (signed off by Clear Zhang)
Signed-off-by: default avatarJeff Garzik <jgarzik@pobox.com>
parent 221054fb
...@@ -81,6 +81,25 @@ int tulip_mdio_read(struct net_device *dev, int phy_id, int location) ...@@ -81,6 +81,25 @@ int tulip_mdio_read(struct net_device *dev, int phy_id, int location)
return retval & 0xffff; return retval & 0xffff;
} }
if(tp->chip_id == ULI526X && tp->revision >= 0x40) {
int value;
int i = 1000;
value = ioread32(ioaddr + CSR9);
iowrite32(value & 0xFFEFFFFF, ioaddr + CSR9);
value = (phy_id << 21) | (location << 16) | 0x80000000;
iowrite32(value, ioaddr + CSR10);
while(--i > 0) {
mdio_delay();
if(ioread32(ioaddr + CSR10) & 0x10000000)
break;
}
retval = ioread32(ioaddr + CSR10);
spin_unlock_irqrestore(&tp->mii_lock, flags);
return retval & 0xFFFF;
}
/* Establish sync by sending at least 32 logic ones. */ /* Establish sync by sending at least 32 logic ones. */
for (i = 32; i >= 0; i--) { for (i = 32; i >= 0; i--) {
iowrite32(MDIO_ENB | MDIO_DATA_WRITE1, mdio_addr); iowrite32(MDIO_ENB | MDIO_DATA_WRITE1, mdio_addr);
...@@ -140,6 +159,22 @@ void tulip_mdio_write(struct net_device *dev, int phy_id, int location, int val) ...@@ -140,6 +159,22 @@ void tulip_mdio_write(struct net_device *dev, int phy_id, int location, int val)
spin_unlock_irqrestore(&tp->mii_lock, flags); spin_unlock_irqrestore(&tp->mii_lock, flags);
return; return;
} }
if (tp->chip_id == ULI526X && tp->revision >= 0x40) {
int value;
int i = 1000;
value = ioread32(ioaddr + CSR9);
iowrite32(value & 0xFFEFFFFF, ioaddr + CSR9);
value = (phy_id << 21) | (location << 16) | 0x40000000 | (val & 0xFFFF);
iowrite32(value, ioaddr + CSR10);
while(--i > 0) {
if (ioread32(ioaddr + CSR10) & 0x10000000)
break;
}
spin_unlock_irqrestore(&tp->mii_lock, flags);
}
/* Establish sync by sending 32 logic ones. */ /* Establish sync by sending 32 logic ones. */
for (i = 32; i >= 0; i--) { for (i = 32; i >= 0; i--) {
......
...@@ -39,6 +39,7 @@ void tulip_timer(unsigned long data) ...@@ -39,6 +39,7 @@ void tulip_timer(unsigned long data)
case MX98713: case MX98713:
case COMPEX9881: case COMPEX9881:
case DM910X: case DM910X:
case ULI526X:
default: { default: {
struct medialeaf *mleaf; struct medialeaf *mleaf;
unsigned char *p; unsigned char *p;
......
...@@ -88,6 +88,7 @@ enum chips { ...@@ -88,6 +88,7 @@ enum chips {
I21145, I21145,
DM910X, DM910X,
CONEXANT, CONEXANT,
ULI526X
}; };
...@@ -481,8 +482,11 @@ static inline void tulip_stop_rxtx(struct tulip_private *tp) ...@@ -481,8 +482,11 @@ static inline void tulip_stop_rxtx(struct tulip_private *tp)
static inline void tulip_restart_rxtx(struct tulip_private *tp) static inline void tulip_restart_rxtx(struct tulip_private *tp)
{ {
if(!(tp->chip_id == ULI526X &&
(tp->revision == 0x40 || tp->revision == 0x50))) {
tulip_stop_rxtx(tp); tulip_stop_rxtx(tp);
udelay(5); udelay(5);
}
tulip_start_rxtx(tp); tulip_start_rxtx(tp);
} }
......
...@@ -198,6 +198,10 @@ struct tulip_chip_table tulip_tbl[] = { ...@@ -198,6 +198,10 @@ struct tulip_chip_table tulip_tbl[] = {
/* RS7112 */ /* RS7112 */
{ "Conexant LANfinity", 256, 0x0001ebef, { "Conexant LANfinity", 256, 0x0001ebef,
HAS_MII | HAS_ACPI, tulip_timer }, HAS_MII | HAS_ACPI, tulip_timer },
/* ULi526X */
{ "ULi M5261/M5263", 128, 0x0001ebef,
HAS_MII | HAS_MEDIA_TABLE | CSR12_IN_SROM | HAS_ACPI, tulip_timer },
}; };
...@@ -234,7 +238,8 @@ static struct pci_device_id tulip_pci_tbl[] = { ...@@ -234,7 +238,8 @@ static struct pci_device_id tulip_pci_tbl[] = {
{ 0x1737, 0xAB09, 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 }, { 0x1737, 0xAB08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET },
{ 0x17B3, 0xAB08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET }, { 0x17B3, 0xAB08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET },
{ 0x10b9, 0x5261, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DM910X }, /* ALi 1563 integrated ethernet */ { 0x10b9, 0x5261, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ULI526X }, /* ALi 1563 integrated ethernet */
{ 0x10b9, 0x5263, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ULI526X }, /* ALi 1563 integrated ethernet */
{ 0x10b7, 0x9300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET }, /* 3Com 3CSOHO100B-TX */ { 0x10b7, 0x9300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET }, /* 3Com 3CSOHO100B-TX */
{ } /* terminate list */ { } /* terminate list */
}; };
...@@ -515,7 +520,7 @@ static void tulip_tx_timeout(struct net_device *dev) ...@@ -515,7 +520,7 @@ static void tulip_tx_timeout(struct net_device *dev)
dev->name); dev->name);
} else if (tp->chip_id == DC21140 || tp->chip_id == DC21142 } else if (tp->chip_id == DC21140 || tp->chip_id == DC21142
|| tp->chip_id == MX98713 || tp->chip_id == COMPEX9881 || tp->chip_id == MX98713 || tp->chip_id == COMPEX9881
|| tp->chip_id == DM910X) { || tp->chip_id == DM910X || tp->chip_id == ULI526X) {
printk(KERN_WARNING "%s: 21140 transmit timed out, status %8.8x, " printk(KERN_WARNING "%s: 21140 transmit timed out, status %8.8x, "
"SIA %8.8x %8.8x %8.8x %8.8x, resetting...\n", "SIA %8.8x %8.8x %8.8x %8.8x, resetting...\n",
dev->name, ioread32(ioaddr + CSR5), ioread32(ioaddr + CSR12), dev->name, ioread32(ioaddr + CSR5), ioread32(ioaddr + CSR12),
...@@ -1216,6 +1221,22 @@ static void __devinit tulip_mwi_config (struct pci_dev *pdev, ...@@ -1216,6 +1221,22 @@ static void __devinit tulip_mwi_config (struct pci_dev *pdev,
} }
#endif #endif
/*
* Chips that have the MRM/reserved bit quirk and the burst quirk. That
* is the DM910X and the on chip ULi devices
*/
static int tulip_uli_dm_quirk(struct pci_dev *pdev)
{
if (pdev->vendor == 0x1282 && pdev->device == 0x9102)
return 1;
if (pdev->vendor == 0x10b9 && pdev->device == 0x5261)
return 1;
if (pdev->vendor == 0x10b9 && pdev->device == 0x5263)
return 1;
return 0;
}
static int __devinit tulip_init_one (struct pci_dev *pdev, static int __devinit tulip_init_one (struct pci_dev *pdev,
const struct pci_device_id *ent) const struct pci_device_id *ent)
{ {
...@@ -1304,17 +1325,12 @@ static int __devinit tulip_init_one (struct pci_dev *pdev, ...@@ -1304,17 +1325,12 @@ static int __devinit tulip_init_one (struct pci_dev *pdev,
csr0 &= ~0xfff10000; /* zero reserved bits 31:20, 16 */ csr0 &= ~0xfff10000; /* zero reserved bits 31:20, 16 */
/* DM9102A has troubles with MRM & clear reserved bits 24:22, 20, 16, 7:1 */ /* DM9102A has troubles with MRM & clear reserved bits 24:22, 20, 16, 7:1 */
if ((pdev->vendor == 0x1282 && pdev->device == 0x9102) if (tulip_uli_dm_quirk(pdev)) {
|| (pdev->vendor == 0x10b9 && pdev->device == 0x5261))
csr0 &= ~0x01f100ff; csr0 &= ~0x01f100ff;
#if defined(__sparc__) #if defined(__sparc__)
/* DM9102A needs 32-dword alignment/burst length on sparc - chip bug? */
if ((pdev->vendor == 0x1282 && pdev->device == 0x9102)
|| (pdev->vendor == 0x10b9 && pdev->device == 0x5261))
csr0 = (csr0 & ~0xff00) | 0xe000; csr0 = (csr0 & ~0xff00) | 0xe000;
#endif #endif
}
/* /*
* And back to business * And back to business
*/ */
...@@ -1659,6 +1675,7 @@ static int __devinit tulip_init_one (struct pci_dev *pdev, ...@@ -1659,6 +1675,7 @@ static int __devinit tulip_init_one (struct pci_dev *pdev,
switch (chip_idx) { switch (chip_idx) {
case DC21140: case DC21140:
case DM910X: case DM910X:
case ULI526X:
default: default:
if (tp->mtable) if (tp->mtable)
iowrite32(tp->mtable->csr12dir | 0x100, ioaddr + CSR12); iowrite32(tp->mtable->csr12dir | 0x100, ioaddr + CSR12);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment