summaryrefslogtreecommitdiffstats
path: root/drivers/net/fec_imx.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/fec_imx.c')
-rw-r--r--drivers/net/fec_imx.c109
1 files changed, 57 insertions, 52 deletions
diff --git a/drivers/net/fec_imx.c b/drivers/net/fec_imx.c
index 5a7e021929..ab71c2451c 100644
--- a/drivers/net/fec_imx.c
+++ b/drivers/net/fec_imx.c
@@ -58,17 +58,17 @@ static int fec_miiphy_read(struct miiphy_device *mdev, uint8_t phyAddr,
* reading from any PHY's register is done by properly
* programming the FEC's MII data register.
*/
- writel(FEC_IEVENT_MII, &fec->eth->ievent);
+ writel(FEC_IEVENT_MII, fec->regs + FEC_IEVENT);
reg = regAddr << FEC_MII_DATA_RA_SHIFT;
phy = phyAddr << FEC_MII_DATA_PA_SHIFT;
- writel(FEC_MII_DATA_ST | FEC_MII_DATA_OP_RD | FEC_MII_DATA_TA | phy | reg, &fec->eth->mii_data);
+ writel(FEC_MII_DATA_ST | FEC_MII_DATA_OP_RD | FEC_MII_DATA_TA | phy | reg, fec->regs + FEC_MII_DATA);
/*
* wait for the related interrupt
*/
start = get_time_ns();
- while (!(readl(&fec->eth->ievent) & FEC_IEVENT_MII)) {
+ while (!(readl(fec->regs + FEC_IEVENT) & FEC_IEVENT_MII)) {
if (is_timeout(start, MSECOND)) {
printf("Read MDIO failed...\n");
return -1;
@@ -78,12 +78,12 @@ static int fec_miiphy_read(struct miiphy_device *mdev, uint8_t phyAddr,
/*
* clear mii interrupt bit
*/
- writel(FEC_IEVENT_MII, &fec->eth->ievent);
+ writel(FEC_IEVENT_MII, fec->regs + FEC_IEVENT);
/*
* it's now safe to read the PHY's register
*/
- *retVal = readl(&fec->eth->mii_data);
+ *retVal = readl(fec->regs + FEC_MII_DATA);
return 0;
}
@@ -102,13 +102,13 @@ static int fec_miiphy_write(struct miiphy_device *mdev, uint8_t phyAddr,
phy = phyAddr << FEC_MII_DATA_PA_SHIFT;
writel(FEC_MII_DATA_ST | FEC_MII_DATA_OP_WR |
- FEC_MII_DATA_TA | phy | reg | data, &fec->eth->mii_data);
+ FEC_MII_DATA_TA | phy | reg | data, fec->regs + FEC_MII_DATA);
/*
* wait for the MII interrupt
*/
start = get_time_ns();
- while (!(readl(&fec->eth->ievent) & FEC_IEVENT_MII)) {
+ while (!(readl(fec->regs + FEC_IEVENT) & FEC_IEVENT_MII)) {
if (is_timeout(start, MSECOND)) {
printf("Write MDIO failed...\n");
return -1;
@@ -118,14 +118,14 @@ static int fec_miiphy_write(struct miiphy_device *mdev, uint8_t phyAddr,
/*
* clear MII interrupt bit
*/
- writel(FEC_IEVENT_MII, &fec->eth->ievent);
+ writel(FEC_IEVENT_MII, fec->regs + FEC_IEVENT);
return 0;
}
static int fec_rx_task_enable(fec_priv *fec)
{
- writel(1 << 24, &fec->eth->r_des_active);
+ writel(1 << 24, fec->regs + FEC_R_DES_ACTIVE);
return 0;
}
@@ -136,7 +136,7 @@ static int fec_rx_task_disable(fec_priv *fec)
static int fec_tx_task_enable(fec_priv *fec)
{
- writel(1 << 24, &fec->eth->x_des_active);
+ writel(1 << 24, fec->regs + FEC_X_DES_ACTIVE);
return 0;
}
@@ -239,8 +239,8 @@ static int fec_set_hwaddr(struct eth_device *dev, unsigned char *mac)
/*
* Set physical address
*/
- writel((mac[0] << 24) + (mac[1] << 16) + (mac[2] << 8) + mac[3], &fec->eth->paddr1);
- writel((mac[4] << 24) + (mac[5] << 16) + 0x8808, &fec->eth->paddr2);
+ writel((mac[0] << 24) + (mac[1] << 16) + (mac[2] << 8) + mac[3], fec->regs + FEC_PADDR1);
+ writel((mac[4] << 24) + (mac[5] << 16) + 0x8808, fec->regs + FEC_PADDR2);
return 0;
}
@@ -258,12 +258,12 @@ static int fec_init(struct eth_device *dev)
/*
* Clear FEC-Lite interrupt event register(IEVENT)
*/
- writel(0xffffffff, &fec->eth->ievent);
+ writel(0xffffffff, fec->regs + FEC_IEVENT);
/*
* Set interrupt mask register
*/
- writel(0x00000000, &fec->eth->imask);
+ writel(0x00000000, fec->regs + FEC_IMASK);
/*
* Set FEC-Lite receive control register(R_CNTRL):
@@ -272,33 +272,48 @@ static int fec_init(struct eth_device *dev)
/*
* Frame length=1518; 7-wire mode
*/
- writel((1518 << 16), &fec->eth->r_cntrl);
+ writel((1518 << 16), fec->regs + FEC_R_CNTRL);
} else {
/*
* Frame length=1518; MII mode;
*/
- writel((1518 << 16) | (1 << 2), &fec->eth->r_cntrl);
+ writel((1518 << 16) | (1 << 2), fec->regs + FEC_R_CNTRL);
/*
* Set MII_SPEED = (1/(mii_speed * 2)) * System Clock
* and do not drop the Preamble.
*/
- writel(((imx_get_fecclk() >> 20) / 5) << 1, &fec->eth->mii_speed); /* No MII for 7-wire mode */
+// writel(((imx_get_fecclk() >> 20) / 5) << 1, fec->regs + FEC_MII_SPEED); /* No MII for 7-wire mode */
+ writel( ((((imx_get_fecclk() / 2 + 4999999) / 2500000) / 2) & 0x3F) << 1, fec->regs + FEC_MII_SPEED);
}
+
+ if (fec->xcv_type == RMII) {
+ /* disable the gasket and wait */
+ writel(0, fec->regs + FEC_MIIGSK_ENR);
+ while (readl(fec->regs + FEC_MIIGSK_ENR) & FEC_MIIGSK_ENR_READY)
+ udelay(1);
+
+ /* configure the gasket for RMII, 50 MHz, no loopback, no echo */
+ writel(FEC_MIIGSK_CFGR_IF_MODE_RMII, fec->regs + FEC_MIIGSK_CFGR);
+
+ /* re-enable the gasket */
+ writel(FEC_MIIGSK_ENR_EN, fec->regs + FEC_MIIGSK_ENR);
+ }
+
/*
* Set Opcode/Pause Duration Register
*/
- writel(0x00010020, &fec->eth->op_pause);
- writel(0x2, &fec->eth->x_wmrk);
+ writel(0x00010020, fec->regs + FEC_OP_PAUSE);
+ writel(0x2, fec->regs + FEC_X_WMRK);
/*
* Set multicast address filter
*/
- writel(0, &fec->eth->iaddr1);
- writel(0, &fec->eth->iaddr2);
- writel(0, &fec->eth->gaddr1);
- writel(0, &fec->eth->gaddr2);
+ writel(0, fec->regs + FEC_IADDR1);
+ writel(0, fec->regs + FEC_IADDR2);
+ writel(0, fec->regs + FEC_GADDR1);
+ writel(0, fec->regs + FEC_GADDR2);
/* size of each buffer */
- writel(FEC_MAX_PKT_SIZE, &fec->eth->emrbr);
+ writel(FEC_MAX_PKT_SIZE, fec->regs + FEC_EMRBR);
if (fec->xcv_type != SEVENWIRE)
miiphy_restart_aneg(&fec->miiphy);
@@ -314,13 +329,13 @@ static int fec_open(struct eth_device *edev)
{
fec_priv *fec = (fec_priv *)edev->priv;
- writel(1 << 2, &fec->eth->x_cntrl); /* full-duplex, heartbeat disabled */
+ writel(1 << 2, fec->regs + FEC_X_CNTRL); /* full-duplex, heartbeat disabled */
fec->rbd_index = 0;
/*
* Enable FEC-Lite controller
*/
- writel(FEC_ECNTRL_ETHER_EN, &fec->eth->ecntrl);
+ writel(FEC_ECNTRL_ETHER_EN, fec->regs + FEC_ECNTRL);
/*
* Enable SmartDMA receive task
*/
@@ -346,12 +361,13 @@ static void fec_halt(struct eth_device *dev)
/*
* issue graceful stop command to the FEC transmitter if necessary
*/
- writel(FEC_ECNTRL_RESET | readl(&fec->eth->x_cntrl), &fec->eth->x_cntrl);
+ 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->eth->ievent) & FEC_IEVENT_GRA)))
+ while ((counter--) && (!(readl(fec->regs + FEC_IEVENT) & FEC_IEVENT_GRA)))
; /* FIXME ensure time */
/*
@@ -364,7 +380,7 @@ static void fec_halt(struct eth_device *dev)
* Disable the Ethernet Controller
* Note: this will also reset the BD index counter!
*/
- writel(0, &fec->eth->ecntrl);
+ writel(0, fec->regs + FEC_ECNTRL);
fec->rbd_index = 0;
fec->tbd_index = 0;
}
@@ -459,8 +475,8 @@ static int fec_recv(struct eth_device *dev)
/*
* Check if any critical events have happened
*/
- ievent = readl(&fec->eth->ievent);
- writel(ievent, &fec->eth->ievent);
+ ievent = readl(fec->regs + FEC_IEVENT);
+ writel(ievent, fec->regs + FEC_IEVENT);
if (ievent & (FEC_IEVENT_BABT | FEC_IEVENT_XFIFO_ERROR |
FEC_IEVENT_RFIFO_ERROR)) {
@@ -472,13 +488,15 @@ static int fec_recv(struct eth_device *dev)
}
if (ievent & FEC_IEVENT_HBERR) {
/* Heartbeat error */
- writel(0x00000001 | readl(&fec->eth->x_cntrl), &fec->eth->x_cntrl);
+ writel(readl(fec->regs + FEC_X_CNTRL) | 0x1,
+ fec->regs + FEC_X_CNTRL);
}
if (ievent & FEC_IEVENT_GRA) {
/* Graceful stop complete */
- if (readl(&fec->eth->x_cntrl) & 0x00000001) {
+ if (readl(fec->regs + FEC_X_CNTRL) & 0x00000001) {
fec_halt(dev);
- writel(~0x00000001 & readl(&fec->eth->x_cntrl), &fec->eth->x_cntrl);
+ writel(readl(fec->regs + FEC_X_CNTRL) & ~0x00000001,
+ fec->regs + FEC_X_CNTRL);
fec_init(dev);
}
}
@@ -538,11 +556,11 @@ static int fec_probe(struct device_d *dev)
edev->get_ethaddr = fec_get_hwaddr,
edev->set_ethaddr = fec_set_hwaddr,
- fec->eth = (ethernet_regs *)dev->map_base;
+ fec->regs = (void *)dev->map_base;
/* Reset chip. */
- writel(FEC_ECNTRL_RESET, &fec->eth->ecntrl);
- while(readl(&fec->eth->ecntrl) & 1) {
+ writel(FEC_ECNTRL_RESET, fec->regs + FEC_ECNTRL);
+ while(readl(fec->regs + FEC_ECNTRL) & 1) {
udelay(10);
}
@@ -558,26 +576,13 @@ static int fec_probe(struct device_d *dev)
base &= ~(DB_ALIGNMENT-1);
fec->tbd_base = (FEC_BD*)base;
- writel((uint32_t)fec->tbd_base, &fec->eth->etdsr);
- writel((uint32_t)fec->rbd_base, &fec->eth->erdsr);
+ writel((uint32_t)fec->tbd_base, fec->regs + FEC_ETDSR);
+ writel((uint32_t)fec->rbd_base, fec->regs + FEC_ERDSR);
fec->xcv_type = pdata->xcv_type;
sprintf(dev->name, "FEC ETHERNET");
- if (fec->xcv_type == RMII) {
- /* disable the gasket and wait */
- writel(0, dev->map_base + FEC_MIIGSK_ENR);
- while (readl(dev->map_base + FEC_MIIGSK_ENR) & FEC_MIIGSK_ENR_READY)
- udelay(1);
-
- /* configure the gasket for RMII, 50 MHz, no loopback, no echo */
- writel(FEC_MIIGSK_CFGR_IF_MODE_RMII, dev->map_base + FEC_MIIGSK_CFGR);
-
- /* re-enable the gasket */
- writel(FEC_MIIGSK_ENR_EN, dev->map_base + FEC_MIIGSK_ENR);
- }
-
if (fec->xcv_type != SEVENWIRE) {
fec->miiphy.read = fec_miiphy_read;
fec->miiphy.write = fec_miiphy_write;