On 06/12/2017 10:20 PM, Joe Hershberger wrote: > Don't wait forever, Pass errors back, etc. > > Signed-off-by: Joe Hershberger <joe.hershber...@ni.com> > > --- > This is a pass at improving the code quality. > This has not been tested in any way. > > drivers/net/ag7xxx.c | 63 > +++++++++++++++++++++++++++++++++++++++++----------- > 1 file changed, 50 insertions(+), 13 deletions(-) > > diff --git a/drivers/net/ag7xxx.c b/drivers/net/ag7xxx.c > index cf60d11..c8352d1 100644 > --- a/drivers/net/ag7xxx.c > +++ b/drivers/net/ag7xxx.c > @@ -26,6 +26,7 @@ enum ag7xxx_model { > AG7XXX_MODEL_AG934X, > }; > > +/* MAC Configuration 1 */ > #define AG7XXX_ETH_CFG1 0x00 > #define AG7XXX_ETH_CFG1_SOFT_RST BIT(31) > #define AG7XXX_ETH_CFG1_RX_RST BIT(19) > @@ -34,6 +35,7 @@ enum ag7xxx_model { > #define AG7XXX_ETH_CFG1_RX_EN BIT(2) > #define AG7XXX_ETH_CFG1_TX_EN BIT(0) > > +/* MAC Configuration 2 */ > #define AG7XXX_ETH_CFG2 0x04 > #define AG7XXX_ETH_CFG2_IF_1000 BIT(9) > #define AG7XXX_ETH_CFG2_IF_10_100 BIT(8) > @@ -43,26 +45,34 @@ enum ag7xxx_model { > #define AG7XXX_ETH_CFG2_PAD_CRC_EN BIT(2) > #define AG7XXX_ETH_CFG2_FDX BIT(0) > > +/* MII Configuration */ > #define AG7XXX_ETH_MII_MGMT_CFG 0x20 > #define AG7XXX_ETH_MII_MGMT_CFG_RESET BIT(31) > > +/* MII Command */ > #define AG7XXX_ETH_MII_MGMT_CMD 0x24 > #define AG7XXX_ETH_MII_MGMT_CMD_READ 0x1 > > +/* MII Address */ > #define AG7XXX_ETH_MII_MGMT_ADDRESS 0x28 > #define AG7XXX_ETH_MII_MGMT_ADDRESS_SHIFT 8 > > +/* MII Control */ > #define AG7XXX_ETH_MII_MGMT_CTRL 0x2c > > +/* MII Status */ > #define AG7XXX_ETH_MII_MGMT_STATUS 0x30 > > +/* MII Indicators */ > #define AG7XXX_ETH_MII_MGMT_IND 0x34 > #define AG7XXX_ETH_MII_MGMT_IND_INVALID BIT(2) > #define AG7XXX_ETH_MII_MGMT_IND_BUSY BIT(0) > > +/* STA Address 1 & 2 */ > #define AG7XXX_ETH_ADDR1 0x40 > #define AG7XXX_ETH_ADDR2 0x44 > > +/* ETH Configuration 0 - 5 */ > #define AG7XXX_ETH_FIFO_CFG_0 0x48 > #define AG7XXX_ETH_FIFO_CFG_1 0x4c > #define AG7XXX_ETH_FIFO_CFG_2 0x50 > @@ -70,20 +80,32 @@ enum ag7xxx_model { > #define AG7XXX_ETH_FIFO_CFG_4 0x58 > #define AG7XXX_ETH_FIFO_CFG_5 0x5c > > +/* DMA Transfer Control for Queue 0 */ > #define AG7XXX_ETH_DMA_TX_CTRL 0x180 > #define AG7XXX_ETH_DMA_TX_CTRL_TXE BIT(0) > > +/* Descriptor Address for Queue 0 Tx */ > #define AG7XXX_ETH_DMA_TX_DESC 0x184 > > +/* DMA Tx Status */ > #define AG7XXX_ETH_DMA_TX_STATUS 0x188 > > +/* Rx Control */ > #define AG7XXX_ETH_DMA_RX_CTRL 0x18c > #define AG7XXX_ETH_DMA_RX_CTRL_RXE BIT(0) > > +/* Pointer to Rx Descriptor */ > #define AG7XXX_ETH_DMA_RX_DESC 0x190 > > +/* Rx Status */ > #define AG7XXX_ETH_DMA_RX_STATUS 0x194 > > +/* PHY Control Registers */ > + > +/* PHY Specific Status Register */ > +#define AG7XXX_PHY_PSSR 0x11 > +#define AG7XXX_PHY_PSSR_LINK_UP BIT(10) > + > /* Custom register at 0x18070000 */ > #define AG7XXX_GMAC_ETH_CFG 0x00 > #define AG7XXX_ETH_CFG_SW_PHY_ADDR_SWAP BIT(8) > @@ -269,18 +291,33 @@ static int ag7xxx_switch_reg_write(struct mii_dev *bus, > int reg, u32 val) > return 0; > } > > -static u16 ag7xxx_mdio_rw(struct mii_dev *bus, int addr, int reg, u32 val) > +static int ag7xxx_mdio_rw(struct mii_dev *bus, int addr, int reg, u32 val) > { > u32 data; > + unsigned long start; > + int ret; > + /* No idea if this is long enough or too long */ > + int timeout_ms = 1000; > > /* Dummy read followed by PHY read/write command. */ > - ag7xxx_switch_reg_read(bus, 0x98, &data); > + ret = ag7xxx_switch_reg_read(bus, 0x98, &data); > + if (ret < 0) > + return ret; > data = val | (reg << 16) | (addr << 21) | BIT(30) | BIT(31); > - ag7xxx_switch_reg_write(bus, 0x98, data); > + ret = ag7xxx_switch_reg_write(bus, 0x98, data); > + if (ret < 0) > + return ret; > + > + start = get_timer(0); > > /* Wait for operation to finish */ > do { > - ag7xxx_switch_reg_read(bus, 0x98, &data); > + ret = ag7xxx_switch_reg_read(bus, 0x98, &data); > + if (ret < 0) > + return ret; > + > + if (get_timer(start) > timeout_ms) > + return -ETIMEDOUT; > } while (data & BIT(31)); > > return data & 0xffff; > @@ -294,7 +331,11 @@ static int ag7xxx_mdio_read(struct mii_dev *bus, int > addr, int devad, int reg) > static int ag7xxx_mdio_write(struct mii_dev *bus, int addr, int devad, int > reg, > u16 val) > { > - ag7xxx_mdio_rw(bus, addr, reg, val); > + int ret; > + > + ret = ag7xxx_mdio_rw(bus, addr, reg, val); > + if (ret < 0) > + return ret; > return 0; > } > > @@ -723,10 +764,13 @@ static int ag933x_phy_setup_common(struct udevice *dev) > return ret; > > /* Read out link status */ > - ret = ag7xxx_mdio_read(priv->bus, phymax, 0, MII_MIPSCR); > + ret = ag7xxx_mdio_read(priv->bus, phymax, 0, AG7XXX_PHY_PSSR); > if (ret < 0) > return ret; > > + if (!(ret & AG7XXX_PHY_PSSR_LINK_UP)) > + return -ENOLINK;
Are you sure about this ? > return 0; > } > > @@ -743,13 +787,6 @@ static int ag933x_phy_setup_common(struct udevice *dev) > return ret; > } > > - for (i = 0; i < phymax; i++) { > - /* Read out link status */ > - ret = ag7xxx_mdio_read(priv->bus, i, 0, MII_MIPSCR); > - if (ret < 0) > - return ret; > - } And this ? > return 0; > } > > -- Best regards, Marek Vasut _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot