[U-Boot] [RFC PATCH] net: ag7xxx: Clean up some issues with phy access
Marek Vasut
marex at denx.de
Tue Jun 13 09:24:40 UTC 2017
On 06/12/2017 10:20 PM, Joe Hershberger wrote:
> Don't wait forever, Pass errors back, etc.
>
> Signed-off-by: Joe Hershberger <joe.hershberger at 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
More information about the U-Boot
mailing list