diff options
| author | Victor Gallardo <vgallardo@amcc.com> | 2008-09-18 08:41:26 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2008-10-08 18:27:14 -0400 |
| commit | 6fbc779c03591ee536fef9efb7d7e20f281d0b5c (patch) | |
| tree | 2721ba739886a19f600082c97aeba48a6358f680 /drivers/net/ibm_newemac | |
| parent | c6d6a511d768cf7627ab54fc18f40edf85097362 (diff) | |
ibm_newemac: Fix EMAC soft reset on 460EX/GT
This patch fixes EMAC soft reset on 460EX/GT when no external clock is
available.
Signed-off-by: Victor Gallardo <vgallardo@amcc.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ibm_newemac')
| -rw-r--r-- | drivers/net/ibm_newemac/core.c | 18 | ||||
| -rw-r--r-- | drivers/net/ibm_newemac/core.h | 5 |
2 files changed, 23 insertions, 0 deletions
diff --git a/drivers/net/ibm_newemac/core.c b/drivers/net/ibm_newemac/core.c index ccd9d9058f6d..58dfd32ccca8 100644 --- a/drivers/net/ibm_newemac/core.c +++ b/drivers/net/ibm_newemac/core.c | |||
| @@ -130,6 +130,7 @@ static inline void emac_report_timeout_error(struct emac_instance *dev, | |||
| 130 | const char *error) | 130 | const char *error) |
| 131 | { | 131 | { |
| 132 | if (emac_has_feature(dev, EMAC_FTR_440GX_PHY_CLK_FIX | | 132 | if (emac_has_feature(dev, EMAC_FTR_440GX_PHY_CLK_FIX | |
| 133 | EMAC_FTR_460EX_PHY_CLK_FIX | | ||
| 133 | EMAC_FTR_440EP_PHY_CLK_FIX)) | 134 | EMAC_FTR_440EP_PHY_CLK_FIX)) |
| 134 | DBG(dev, "%s" NL, error); | 135 | DBG(dev, "%s" NL, error); |
| 135 | else if (net_ratelimit()) | 136 | else if (net_ratelimit()) |
| @@ -351,10 +352,24 @@ static int emac_reset(struct emac_instance *dev) | |||
| 351 | emac_tx_disable(dev); | 352 | emac_tx_disable(dev); |
| 352 | } | 353 | } |
| 353 | 354 | ||
| 355 | #ifdef CONFIG_PPC_DCR_NATIVE | ||
| 356 | /* Enable internal clock source */ | ||
| 357 | if (emac_has_feature(dev, EMAC_FTR_460EX_PHY_CLK_FIX)) | ||
| 358 | dcri_clrset(SDR0, SDR0_ETH_CFG, | ||
| 359 | 0, SDR0_ETH_CFG_ECS << dev->cell_index); | ||
| 360 | #endif | ||
| 361 | |||
| 354 | out_be32(&p->mr0, EMAC_MR0_SRST); | 362 | out_be32(&p->mr0, EMAC_MR0_SRST); |
| 355 | while ((in_be32(&p->mr0) & EMAC_MR0_SRST) && n) | 363 | while ((in_be32(&p->mr0) & EMAC_MR0_SRST) && n) |
| 356 | --n; | 364 | --n; |
| 357 | 365 | ||
| 366 | #ifdef CONFIG_PPC_DCR_NATIVE | ||
| 367 | /* Enable external clock source */ | ||
| 368 | if (emac_has_feature(dev, EMAC_FTR_460EX_PHY_CLK_FIX)) | ||
| 369 | dcri_clrset(SDR0, SDR0_ETH_CFG, | ||
| 370 | SDR0_ETH_CFG_ECS << dev->cell_index, 0); | ||
| 371 | #endif | ||
| 372 | |||
| 358 | if (n) { | 373 | if (n) { |
| 359 | dev->reset_failed = 0; | 374 | dev->reset_failed = 0; |
| 360 | return 0; | 375 | return 0; |
| @@ -2559,6 +2574,9 @@ static int __devinit emac_init_config(struct emac_instance *dev) | |||
| 2559 | /* Check EMAC version */ | 2574 | /* Check EMAC version */ |
| 2560 | if (of_device_is_compatible(np, "ibm,emac4sync")) { | 2575 | if (of_device_is_compatible(np, "ibm,emac4sync")) { |
| 2561 | dev->features |= (EMAC_FTR_EMAC4 | EMAC_FTR_EMAC4SYNC); | 2576 | dev->features |= (EMAC_FTR_EMAC4 | EMAC_FTR_EMAC4SYNC); |
| 2577 | if (of_device_is_compatible(np, "ibm,emac-460ex") || | ||
| 2578 | of_device_is_compatible(np, "ibm,emac-460gt")) | ||
| 2579 | dev->features |= EMAC_FTR_460EX_PHY_CLK_FIX; | ||
| 2562 | } else if (of_device_is_compatible(np, "ibm,emac4")) { | 2580 | } else if (of_device_is_compatible(np, "ibm,emac4")) { |
| 2563 | dev->features |= EMAC_FTR_EMAC4; | 2581 | dev->features |= EMAC_FTR_EMAC4; |
| 2564 | if (of_device_is_compatible(np, "ibm,emac-440gx")) | 2582 | if (of_device_is_compatible(np, "ibm,emac-440gx")) |
diff --git a/drivers/net/ibm_newemac/core.h b/drivers/net/ibm_newemac/core.h index 6545e69d12c3..5ca70e55b6c5 100644 --- a/drivers/net/ibm_newemac/core.h +++ b/drivers/net/ibm_newemac/core.h | |||
| @@ -317,6 +317,10 @@ struct emac_instance { | |||
| 317 | * The 405EX and 460EX contain the EMAC4SYNC core | 317 | * The 405EX and 460EX contain the EMAC4SYNC core |
| 318 | */ | 318 | */ |
| 319 | #define EMAC_FTR_EMAC4SYNC 0x00000200 | 319 | #define EMAC_FTR_EMAC4SYNC 0x00000200 |
| 320 | /* | ||
| 321 | * Set if we need phy clock workaround for 460ex or 460gt | ||
| 322 | */ | ||
| 323 | #define EMAC_FTR_460EX_PHY_CLK_FIX 0x00000400 | ||
| 320 | 324 | ||
| 321 | 325 | ||
| 322 | /* Right now, we don't quite handle the always/possible masks on the | 326 | /* Right now, we don't quite handle the always/possible masks on the |
| @@ -341,6 +345,7 @@ enum { | |||
| 341 | #ifdef CONFIG_IBM_NEW_EMAC_RGMII | 345 | #ifdef CONFIG_IBM_NEW_EMAC_RGMII |
| 342 | EMAC_FTR_HAS_RGMII | | 346 | EMAC_FTR_HAS_RGMII | |
| 343 | #endif | 347 | #endif |
| 348 | EMAC_FTR_460EX_PHY_CLK_FIX | | ||
| 344 | EMAC_FTR_440EP_PHY_CLK_FIX, | 349 | EMAC_FTR_440EP_PHY_CLK_FIX, |
| 345 | }; | 350 | }; |
| 346 | 351 | ||
