diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-23 11:28:25 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-23 11:28:25 -0400 |
commit | 9bf9b2f3ad6362cdc9ef79291d440a92960b8f51 (patch) | |
tree | c50a317a619096a6ec84c243fafef50388004df6 /drivers/net | |
parent | 9779a8325a9bbf4ccd3853e0e4064984cf9da9c9 (diff) | |
parent | 54622f10a6aabb8bb2bdacf3dd070046f03dc246 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc
* git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc: (53 commits)
powerpc: Support for relocatable kdump kernel
powerpc: Don't use a 16G page if beyond mem= limits
powerpc: Add del_node() for early boot code to prune inapplicable devices.
powerpc: Further compile fixup for STRICT_MM_TYPECHECKS
powerpc: Remove empty #else from signal_64.c
powerpc: Move memory size print into common show_cpuinfo for 32-bit
hvc_console: Remove __devexit annotation of hvc_remove()
hvc_console: Add support for tty window resizing
hvc_console: Fix loop if put_char() returns 0
hvc_console: Add tty driver flag TTY_DRIVER_RESET_TERMIOS
hvc_console: Add a hangup notifier for backends
powerpc/83xx: Add DS1339 RTC support for MPC8349E-mITX boards .dts
powerpc/83xx: Add support for MCU microcontroller in .dts files
powerpc/85xx: Move mpc8572ds.dts to address-cells/size-cells = <2>
of/spi: Support specifying chip select as active high via device tree
powerpc: Remove device_type = "board_control" properties in .dts files
i2c-cpm: Suppress autoprobing for devices
powerpc/85xx: Fix mpc8536ds dma interrupt numbers
powerpc/85xx: Enable enhanced functions for 8536 TSEC
powerpc: Delete unused prom_strtoul and prom_memparse
...
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/fec_mpc52xx_phy.c | 55 | ||||
-rw-r--r-- | drivers/net/ibm_newemac/core.c | 10 | ||||
-rw-r--r-- | drivers/net/ibm_newemac/mal.c | 15 |
3 files changed, 45 insertions, 35 deletions
diff --git a/drivers/net/fec_mpc52xx_phy.c b/drivers/net/fec_mpc52xx_phy.c index 08e18bcb970f..45dd9bdc5d62 100644 --- a/drivers/net/fec_mpc52xx_phy.c +++ b/drivers/net/fec_mpc52xx_phy.c | |||
@@ -2,6 +2,7 @@ | |||
2 | * Driver for the MPC5200 Fast Ethernet Controller - MDIO bus driver | 2 | * Driver for the MPC5200 Fast Ethernet Controller - MDIO bus driver |
3 | * | 3 | * |
4 | * Copyright (C) 2007 Domen Puncer, Telargo, Inc. | 4 | * Copyright (C) 2007 Domen Puncer, Telargo, Inc. |
5 | * Copyright (C) 2008 Wolfram Sang, Pengutronix | ||
5 | * | 6 | * |
6 | * This file is licensed under the terms of the GNU General Public License | 7 | * This file is licensed under the terms of the GNU General Public License |
7 | * version 2. This program is licensed "as is" without any warranty of any | 8 | * version 2. This program is licensed "as is" without any warranty of any |
@@ -21,58 +22,45 @@ struct mpc52xx_fec_mdio_priv { | |||
21 | struct mpc52xx_fec __iomem *regs; | 22 | struct mpc52xx_fec __iomem *regs; |
22 | }; | 23 | }; |
23 | 24 | ||
24 | static int mpc52xx_fec_mdio_read(struct mii_bus *bus, int phy_id, int reg) | 25 | static int mpc52xx_fec_mdio_transfer(struct mii_bus *bus, int phy_id, |
26 | int reg, u32 value) | ||
25 | { | 27 | { |
26 | struct mpc52xx_fec_mdio_priv *priv = bus->priv; | 28 | struct mpc52xx_fec_mdio_priv *priv = bus->priv; |
27 | struct mpc52xx_fec __iomem *fec; | 29 | struct mpc52xx_fec __iomem *fec; |
28 | int tries = 100; | 30 | int tries = 100; |
29 | u32 request = FEC_MII_READ_FRAME; | 31 | |
32 | value |= (phy_id << FEC_MII_DATA_PA_SHIFT) & FEC_MII_DATA_PA_MSK; | ||
33 | value |= (reg << FEC_MII_DATA_RA_SHIFT) & FEC_MII_DATA_RA_MSK; | ||
30 | 34 | ||
31 | fec = priv->regs; | 35 | fec = priv->regs; |
32 | out_be32(&fec->ievent, FEC_IEVENT_MII); | 36 | out_be32(&fec->ievent, FEC_IEVENT_MII); |
33 | 37 | out_be32(&priv->regs->mii_data, value); | |
34 | request |= (phy_id << FEC_MII_DATA_PA_SHIFT) & FEC_MII_DATA_PA_MSK; | ||
35 | request |= (reg << FEC_MII_DATA_RA_SHIFT) & FEC_MII_DATA_RA_MSK; | ||
36 | |||
37 | out_be32(&priv->regs->mii_data, request); | ||
38 | 38 | ||
39 | /* wait for it to finish, this takes about 23 us on lite5200b */ | 39 | /* wait for it to finish, this takes about 23 us on lite5200b */ |
40 | while (!(in_be32(&fec->ievent) & FEC_IEVENT_MII) && --tries) | 40 | while (!(in_be32(&fec->ievent) & FEC_IEVENT_MII) && --tries) |
41 | udelay(5); | 41 | udelay(5); |
42 | 42 | ||
43 | if (tries == 0) | 43 | if (!tries) |
44 | return -ETIMEDOUT; | 44 | return -ETIMEDOUT; |
45 | 45 | ||
46 | return in_be32(&priv->regs->mii_data) & FEC_MII_DATA_DATAMSK; | 46 | return value & FEC_MII_DATA_OP_RD ? |
47 | in_be32(&priv->regs->mii_data) & FEC_MII_DATA_DATAMSK : 0; | ||
47 | } | 48 | } |
48 | 49 | ||
49 | static int mpc52xx_fec_mdio_write(struct mii_bus *bus, int phy_id, int reg, u16 data) | 50 | static int mpc52xx_fec_mdio_read(struct mii_bus *bus, int phy_id, int reg) |
50 | { | 51 | { |
51 | struct mpc52xx_fec_mdio_priv *priv = bus->priv; | 52 | return mpc52xx_fec_mdio_transfer(bus, phy_id, reg, FEC_MII_READ_FRAME); |
52 | struct mpc52xx_fec __iomem *fec; | 53 | } |
53 | u32 value = data; | ||
54 | int tries = 100; | ||
55 | |||
56 | fec = priv->regs; | ||
57 | out_be32(&fec->ievent, FEC_IEVENT_MII); | ||
58 | |||
59 | value |= FEC_MII_WRITE_FRAME; | ||
60 | value |= (phy_id << FEC_MII_DATA_PA_SHIFT) & FEC_MII_DATA_PA_MSK; | ||
61 | value |= (reg << FEC_MII_DATA_RA_SHIFT) & FEC_MII_DATA_RA_MSK; | ||
62 | |||
63 | out_be32(&priv->regs->mii_data, value); | ||
64 | |||
65 | /* wait for request to finish */ | ||
66 | while (!(in_be32(&fec->ievent) & FEC_IEVENT_MII) && --tries) | ||
67 | udelay(5); | ||
68 | |||
69 | if (tries == 0) | ||
70 | return -ETIMEDOUT; | ||
71 | 54 | ||
72 | return 0; | 55 | static int mpc52xx_fec_mdio_write(struct mii_bus *bus, int phy_id, int reg, |
56 | u16 data) | ||
57 | { | ||
58 | return mpc52xx_fec_mdio_transfer(bus, phy_id, reg, | ||
59 | data | FEC_MII_WRITE_FRAME); | ||
73 | } | 60 | } |
74 | 61 | ||
75 | static int mpc52xx_fec_mdio_probe(struct of_device *of, const struct of_device_id *match) | 62 | static int mpc52xx_fec_mdio_probe(struct of_device *of, |
63 | const struct of_device_id *match) | ||
76 | { | 64 | { |
77 | struct device *dev = &of->dev; | 65 | struct device *dev = &of->dev; |
78 | struct device_node *np = of->node; | 66 | struct device_node *np = of->node; |
@@ -131,7 +119,8 @@ static int mpc52xx_fec_mdio_probe(struct of_device *of, const struct of_device_i | |||
131 | dev_set_drvdata(dev, bus); | 119 | dev_set_drvdata(dev, bus); |
132 | 120 | ||
133 | /* set MII speed */ | 121 | /* set MII speed */ |
134 | out_be32(&priv->regs->mii_speed, ((mpc52xx_find_ipb_freq(of->node) >> 20) / 5) << 1); | 122 | out_be32(&priv->regs->mii_speed, |
123 | ((mpc52xx_find_ipb_freq(of->node) >> 20) / 5) << 1); | ||
135 | 124 | ||
136 | /* enable MII interrupt */ | 125 | /* enable MII interrupt */ |
137 | out_be32(&priv->regs->imask, in_be32(&priv->regs->imask) | FEC_IMASK_MII); | 126 | out_be32(&priv->regs->imask, in_be32(&priv->regs->imask) | FEC_IMASK_MII); |
diff --git a/drivers/net/ibm_newemac/core.c b/drivers/net/ibm_newemac/core.c index efcf21c9f5c7..2ee2622258f5 100644 --- a/drivers/net/ibm_newemac/core.c +++ b/drivers/net/ibm_newemac/core.c | |||
@@ -2604,8 +2604,16 @@ static int __devinit emac_init_config(struct emac_instance *dev) | |||
2604 | if (of_device_is_compatible(np, "ibm,emac-440ep") || | 2604 | if (of_device_is_compatible(np, "ibm,emac-440ep") || |
2605 | of_device_is_compatible(np, "ibm,emac-440gr")) | 2605 | of_device_is_compatible(np, "ibm,emac-440gr")) |
2606 | dev->features |= EMAC_FTR_440EP_PHY_CLK_FIX; | 2606 | dev->features |= EMAC_FTR_440EP_PHY_CLK_FIX; |
2607 | if (of_device_is_compatible(np, "ibm,emac-405ez")) | 2607 | if (of_device_is_compatible(np, "ibm,emac-405ez")) { |
2608 | #ifdef CONFIG_IBM_NEW_EMAC_NO_FLOW_CONTROL | ||
2608 | dev->features |= EMAC_FTR_NO_FLOW_CONTROL_40x; | 2609 | dev->features |= EMAC_FTR_NO_FLOW_CONTROL_40x; |
2610 | #else | ||
2611 | printk(KERN_ERR "%s: Flow control not disabled!\n", | ||
2612 | np->full_name); | ||
2613 | return -ENXIO; | ||
2614 | #endif | ||
2615 | } | ||
2616 | |||
2609 | } | 2617 | } |
2610 | 2618 | ||
2611 | /* Fixup some feature bits based on the device tree */ | 2619 | /* Fixup some feature bits based on the device tree */ |
diff --git a/drivers/net/ibm_newemac/mal.c b/drivers/net/ibm_newemac/mal.c index 1839d3f154a3..ecf9798987fa 100644 --- a/drivers/net/ibm_newemac/mal.c +++ b/drivers/net/ibm_newemac/mal.c | |||
@@ -280,9 +280,11 @@ static irqreturn_t mal_txeob(int irq, void *dev_instance) | |||
280 | mal_schedule_poll(mal); | 280 | mal_schedule_poll(mal); |
281 | set_mal_dcrn(mal, MAL_TXEOBISR, r); | 281 | set_mal_dcrn(mal, MAL_TXEOBISR, r); |
282 | 282 | ||
283 | #ifdef CONFIG_PPC_DCR_NATIVE | ||
283 | if (mal_has_feature(mal, MAL_FTR_CLEAR_ICINTSTAT)) | 284 | if (mal_has_feature(mal, MAL_FTR_CLEAR_ICINTSTAT)) |
284 | mtdcri(SDR0, DCRN_SDR_ICINTSTAT, | 285 | mtdcri(SDR0, DCRN_SDR_ICINTSTAT, |
285 | (mfdcri(SDR0, DCRN_SDR_ICINTSTAT) | ICINTSTAT_ICTX)); | 286 | (mfdcri(SDR0, DCRN_SDR_ICINTSTAT) | ICINTSTAT_ICTX)); |
287 | #endif | ||
286 | 288 | ||
287 | return IRQ_HANDLED; | 289 | return IRQ_HANDLED; |
288 | } | 290 | } |
@@ -298,9 +300,11 @@ static irqreturn_t mal_rxeob(int irq, void *dev_instance) | |||
298 | mal_schedule_poll(mal); | 300 | mal_schedule_poll(mal); |
299 | set_mal_dcrn(mal, MAL_RXEOBISR, r); | 301 | set_mal_dcrn(mal, MAL_RXEOBISR, r); |
300 | 302 | ||
303 | #ifdef CONFIG_PPC_DCR_NATIVE | ||
301 | if (mal_has_feature(mal, MAL_FTR_CLEAR_ICINTSTAT)) | 304 | if (mal_has_feature(mal, MAL_FTR_CLEAR_ICINTSTAT)) |
302 | mtdcri(SDR0, DCRN_SDR_ICINTSTAT, | 305 | mtdcri(SDR0, DCRN_SDR_ICINTSTAT, |
303 | (mfdcri(SDR0, DCRN_SDR_ICINTSTAT) | ICINTSTAT_ICRX)); | 306 | (mfdcri(SDR0, DCRN_SDR_ICINTSTAT) | ICINTSTAT_ICRX)); |
307 | #endif | ||
304 | 308 | ||
305 | return IRQ_HANDLED; | 309 | return IRQ_HANDLED; |
306 | } | 310 | } |
@@ -572,9 +576,18 @@ static int __devinit mal_probe(struct of_device *ofdev, | |||
572 | goto fail; | 576 | goto fail; |
573 | } | 577 | } |
574 | 578 | ||
575 | if (of_device_is_compatible(ofdev->node, "ibm,mcmal-405ez")) | 579 | if (of_device_is_compatible(ofdev->node, "ibm,mcmal-405ez")) { |
580 | #if defined(CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT) && \ | ||
581 | defined(CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR) | ||
576 | mal->features |= (MAL_FTR_CLEAR_ICINTSTAT | | 582 | mal->features |= (MAL_FTR_CLEAR_ICINTSTAT | |
577 | MAL_FTR_COMMON_ERR_INT); | 583 | MAL_FTR_COMMON_ERR_INT); |
584 | #else | ||
585 | printk(KERN_ERR "%s: Support for 405EZ not enabled!\n", | ||
586 | ofdev->node->full_name); | ||
587 | err = -ENODEV; | ||
588 | goto fail; | ||
589 | #endif | ||
590 | } | ||
578 | 591 | ||
579 | mal->txeob_irq = irq_of_parse_and_map(ofdev->node, 0); | 592 | mal->txeob_irq = irq_of_parse_and_map(ofdev->node, 0); |
580 | mal->rxeob_irq = irq_of_parse_and_map(ofdev->node, 1); | 593 | mal->rxeob_irq = irq_of_parse_and_map(ofdev->node, 1); |