summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2013-03-04 09:21:37 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2013-03-04 09:21:37 +0100
commit908bc8ce45f428658dab5826eb6fa2e5d9151aa1 (patch)
tree959ac4034ba324530304ffab6904157ed17d56be /drivers
parent831d83e922a3b45d52f502f12b75c2e97a1c7c48 (diff)
parenta9f50d96e5c53fcc32a905a448e7c856d92b77d0 (diff)
downloadbarebox-908bc8ce45f428658dab5826eb6fa2e5d9151aa1.tar.gz
barebox-908bc8ce45f428658dab5826eb6fa2e5d9151aa1.tar.xz
Merge branch 'for-next/imx'
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/fec_imx.c39
-rw-r--r--drivers/net/fec_imx.h1
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