diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2013-03-04 09:21:37 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2013-03-04 09:21:37 +0100 |
commit | 908bc8ce45f428658dab5826eb6fa2e5d9151aa1 (patch) | |
tree | 959ac4034ba324530304ffab6904157ed17d56be /drivers | |
parent | 831d83e922a3b45d52f502f12b75c2e97a1c7c48 (diff) | |
parent | a9f50d96e5c53fcc32a905a448e7c856d92b77d0 (diff) | |
download | barebox-908bc8ce45f428658dab5826eb6fa2e5d9151aa1.tar.gz barebox-908bc8ce45f428658dab5826eb6fa2e5d9151aa1.tar.xz |
Merge branch 'for-next/imx'
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/fec_imx.c | 39 | ||||
-rw-r--r-- | drivers/net/fec_imx.h | 1 |
2 files changed, 26 insertions, 14 deletions
diff --git a/drivers/net/fec_imx.c b/drivers/net/fec_imx.c index 2cf5008218..1767ef8bc0 100644 --- a/drivers/net/fec_imx.c +++ b/drivers/net/fec_imx.c @@ -86,7 +86,7 @@ static int fec_miibus_read(struct mii_bus *bus, int phyAddr, int regAddr) start = get_time_ns(); while (!(readl(fec->regs + FEC_IEVENT) & FEC_IEVENT_MII)) { if (is_timeout(start, MSECOND)) { - printf("Read MDIO failed...\n"); + dev_err(&fec->edev.dev, "Read MDIO failed...\n"); return -1; } } @@ -126,7 +126,7 @@ static int fec_miibus_write(struct mii_bus *bus, int phyAddr, start = get_time_ns(); while (!(readl(fec->regs + FEC_IEVENT) & FEC_IEVENT_MII)) { if (is_timeout(start, MSECOND)) { - printf("Write MDIO failed...\n"); + dev_err(&fec->edev.dev, "Write MDIO failed...\n"); return -1; } } @@ -361,12 +361,18 @@ static int fec_init(struct eth_device *dev) static void fec_update_linkspeed(struct eth_device *edev) { struct fec_priv *fec = (struct fec_priv *)edev->priv; + int speed = edev->phydev->speed; + u32 rcntl = readl(fec->regs + FEC_R_CNTRL) & ~FEC_R_CNTRL_RMII_10T; + u32 ecntl = readl(fec->regs + FEC_ECNTRL) & ~FEC_ECNTRL_SPEED; - if (edev->phydev->speed == SPEED_10) { - u32 rcntl = readl(fec->regs + FEC_R_CNTRL); + if (speed == SPEED_10) rcntl |= FEC_R_CNTRL_RMII_10T; - writel(rcntl, fec->regs + FEC_R_CNTRL); - } + + if (speed == SPEED_1000) + ecntl |= FEC_ECNTRL_SPEED; + + writel(rcntl, fec->regs + FEC_R_CNTRL); + writel(ecntl, fec->regs + FEC_ECNTRL); } /** @@ -425,15 +431,20 @@ static int fec_open(struct eth_device *edev) static void fec_halt(struct eth_device *dev) { struct fec_priv *fec = (struct fec_priv *)dev->priv; - int counter = 0xffff; + uint64_t tmo; /* issue graceful stop command to the FEC transmitter if necessary */ writel(readl(fec->regs + FEC_X_CNTRL) | FEC_ECNTRL_RESET, fec->regs + FEC_X_CNTRL); /* wait for graceful stop to register */ - while ((counter--) && (!(readl(fec->regs + FEC_IEVENT) & FEC_IEVENT_GRA))) - ; /* FIXME ensure time */ + tmo = get_time_ns(); + while (!(readl(fec->regs + FEC_IEVENT) & FEC_IEVENT_GRA)) { + if (is_timeout(tmo, 1 * SECOND)) { + dev_err(&dev->dev, "graceful stop timeout\n"); + break; + } + } /* Disable SmartDMA tasks */ fec_tx_task_disable(fec); @@ -468,12 +479,12 @@ static int fec_send(struct eth_device *dev, void *eth_data, int data_length) /* Check for valid length of data. */ if ((data_length > 1500) || (data_length <= 0)) { - printf("Payload (%d) to large!\n", data_length); + dev_err(&dev->dev, "Payload (%d) to large!\n", data_length); return -1; } if ((uint32_t)eth_data & (DB_DATA_ALIGNMENT-1)) - printf("%s: Warning: Transmit data not aligned: %p!\n", __FUNCTION__, eth_data); + dev_warn(&dev->dev, "Transmit data not aligned: %p!\n", eth_data); /* * Setup the transmit buffer @@ -506,7 +517,7 @@ static int fec_send(struct eth_device *dev, void *eth_data, int data_length) tmo = get_time_ns(); while (readw(&fec->tbd_base[fec->tbd_index].status) & FEC_TBD_READY) { if (is_timeout(tmo, 1 * SECOND)) { - printf("transmission timeout\n"); + dev_err(&dev->dev, "transmission timeout\n"); break; } } @@ -544,7 +555,7 @@ static int fec_recv(struct eth_device *dev) /* BABT, Rx/Tx FIFO errors */ fec_halt(dev); fec_init(dev); - printf("some error: 0x%08x\n", ievent); + dev_err(&dev->dev, "some error: 0x%08x\n", ievent); return 0; } if (!fec_is_imx28(fec)) { @@ -587,7 +598,7 @@ static int fec_recv(struct eth_device *dev) len = frame_length; } else { if (bd_status & FEC_RBD_ERR) { - printf("error frame: 0x%p 0x%08x\n", rbd, bd_status); + dev_warn(&dev->dev, "error frame: 0x%p 0x%08x\n", rbd, bd_status); } } /* diff --git a/drivers/net/fec_imx.h b/drivers/net/fec_imx.h index 1eb1eba5a1..29aea852df 100644 --- a/drivers/net/fec_imx.h +++ b/drivers/net/fec_imx.h @@ -92,6 +92,7 @@ #define FEC_ECNTRL_RESET 0x00000001 /**< reset the FEC */ #define FEC_ECNTRL_ETHER_EN 0x00000002 /**< enable the FEC */ +#define FEC_ECNTRL_SPEED 0x00000020 /**< i.MX6: enable 1000Mbps mode */ /** * @brief Descriptor buffer alignment |