From cd657bfede3b88875555f15856dbe1a19ff94ad0 Mon Sep 17 00:00:00 2001 From: Travis Wheatley Date: Fri, 13 Jul 2007 10:02:40 -0500 Subject: [PATCH] MPC8610 ETH - Lyra native ethernet MAC addrex fix with corected formatting issues Signed-off-by: Paul Widmer --- drivers/net/tulip/eeprom.c | 4 ++-- drivers/net/tulip/media.c | 38 ++++++++++++++++++++++++++++++++++++-- drivers/net/tulip/timer.c | 1 + drivers/net/tulip/tulip.h | 8 ++++++-- drivers/net/tulip/tulip_core.c | 19 ++++++++++++++----- 5 files changed, 59 insertions(+), 11 deletions(-) diff --git a/drivers/net/tulip/eeprom.c b/drivers/net/tulip/eeprom.c index 206918b..a765b74 100644 --- a/drivers/net/tulip/eeprom.c +++ b/drivers/net/tulip/eeprom.c @@ -203,7 +203,7 @@ void __devinit tulip_parse_eeprom(struct } subsequent_board: - if (ee_data[27] == 0) { /* No valid media table. */ + if(ee_data[27] == 0) { /* No valid media table. */ tulip_build_fake_mediatable(tp); } else { unsigned char *p = (void *)ee_data + ee_data[27]; @@ -297,7 +297,7 @@ subsequent_board: } leaf->leafdata = p + 2; p += (p[0] & 0x3f) + 1; - } + } if (tulip_debug > 1 && leaf->media == 11) { unsigned char *bp = leaf->leafdata; printk(KERN_INFO "%s: MII interface PHY %d, setup/reset " diff --git a/drivers/net/tulip/media.c b/drivers/net/tulip/media.c index b562566..664a3e8 100644 --- a/drivers/net/tulip/media.c +++ b/drivers/net/tulip/media.c @@ -82,7 +82,25 @@ int tulip_mdio_read(struct net_device *d spin_unlock_irqrestore(&tp->mii_lock, flags); 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) | 0x8000000; + 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. */ for (i = 32; i >= 0; i--) { iowrite32(MDIO_ENB | MDIO_DATA_WRITE1, mdio_addr); @@ -142,7 +160,23 @@ void tulip_mdio_write(struct net_device spin_unlock_irqrestore(&tp->mii_lock, flags); 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) | 0x4000000 | (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. */ for (i = 32; i >= 0; i--) { iowrite32(MDIO_ENB | MDIO_DATA_WRITE1, mdio_addr); diff --git a/drivers/net/tulip/timer.c b/drivers/net/tulip/timer.c index d2c1f42..2b2fb94 100644 --- a/drivers/net/tulip/timer.c +++ b/drivers/net/tulip/timer.c @@ -40,6 +40,7 @@ void tulip_media_task(struct work_struct case MX98713: case COMPEX9881: case DM910X: + case ULI526X: default: { struct medialeaf *mleaf; unsigned char *p; diff --git a/drivers/net/tulip/tulip.h b/drivers/net/tulip/tulip.h index 16f26a8..222c685 100644 --- a/drivers/net/tulip/tulip.h +++ b/drivers/net/tulip/tulip.h @@ -88,6 +88,7 @@ enum chips { I21145, DM910X, CONEXANT, + ULI526X, }; @@ -493,8 +494,11 @@ static inline void tulip_stop_rxtx(struc static inline void tulip_restart_rxtx(struct tulip_private *tp) { - tulip_stop_rxtx(tp); - udelay(5); + if(!(tp->chip_id == ULI526X && + (tp->revision == 0x40 || tp->revision == 0x50))) { + tulip_stop_rxtx(tp); + udelay(5); + } tulip_start_rxtx(tp); } diff --git a/drivers/net/tulip/tulip_core.c b/drivers/net/tulip/tulip_core.c index eca984f..f7523e2 100644 --- a/drivers/net/tulip/tulip_core.c +++ b/drivers/net/tulip/tulip_core.c @@ -206,6 +206,10 @@ struct tulip_chip_table tulip_tbl[] = { { "Conexant LANfinity", 256, 0x0001ebef, HAS_MII | HAS_ACPI, tulip_timer, tulip_media_task }, + /* ULi526X */ + { "ULi M5261/M5263", 128, 0x0001ebef, + NEEDS_FAKE_MEDIA_TABLE, tulip_timer, tulip_media_task + }, }; @@ -243,6 +247,8 @@ static struct pci_device_id tulip_pci_tb { 0x1737, 0xAB09, 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 }, + { 0x10b9, 0x5261, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ULI526X }, + { 0x10b9, 0x5263, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ULI526X }, { 0x10b7, 0x9300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET }, /* 3Com 3CSOHO100B-TX */ { 0x14ea, 0xab08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET }, /* Planex FNW-3602-TX */ { 0x1414, 0x0002, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET }, @@ -527,7 +533,7 @@ static void tulip_tx_timeout(struct net_ dev->name); } else if (tp->chip_id == DC21140 || tp->chip_id == DC21142 || 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, " "SIA %8.8x %8.8x %8.8x %8.8x, resetting...\n", dev->name, ioread32(ioaddr + CSR5), ioread32(ioaddr + CSR12), @@ -1090,7 +1096,8 @@ static void set_rx_mode(struct net_devic /* Now add this frame to the Tx list. */ entry = tp->cur_tx++ % TX_RING_SIZE; - + if( !(tp->chip_id==ULI526X && (tp->revision == 0x40 || tp->revision == 0x50)) ) + { if (entry != 0) { /* Avoid a chip errata by prefixing a dummy entry. */ tp->tx_buffers[entry].skb = NULL; @@ -1103,7 +1110,7 @@ static void set_rx_mode(struct net_devic entry = tp->cur_tx++ % TX_RING_SIZE; } - + } tp->tx_buffers[entry].skb = NULL; tp->tx_buffers[entry].mapping = pci_map_single(tp->pdev, tp->setup_frame, @@ -1220,7 +1227,9 @@ #endif static int tulip_uli_dm_quirk(struct pci_dev *pdev) { - if (pdev->vendor == 0x1282 && pdev->device == 0x9102) + if ((pdev->vendor == 0x1282 && pdev->device == 0x9102) + || (pdev->vendor == 0x10b9 && (pdev->device == 0x5261 || + pdev->device == 0x5263))) return 1; return 0; } @@ -1266,7 +1275,6 @@ #endif printk (KERN_ERR PFX "skipping LMC card.\n"); return -ENODEV; } - /* * Early DM9100's need software CRC and the DMFE driver */ @@ -1648,6 +1656,7 @@ #endif switch (chip_idx) { case DC21140: case DM910X: + case ULI526X: default: if (tp->mtable) iowrite32(tp->mtable->csr12dir | 0x100, ioaddr + CSR12); -- 1.4.0