For all SAM Ethernet, need to enable management interface before reading PHY regisers in IOCTL

This commit is contained in:
Gregory Nutt 2014-08-17 11:09:54 -06:00
parent 2edcca009c
commit e0ef5a08bc
4 changed files with 99 additions and 0 deletions

View File

@ -1826,14 +1826,40 @@ static int sam_ioctl(struct net_driver_s *dev, int cmd, long arg)
case SIOCGMIIREG: /* Get register from MII PHY */
{
struct mii_ioctl_data_s *req = (struct mii_ioctl_data_s *)((uintptr_t)arg);
uint32_t regval;
/* Enable management port */
regval = sam_getreg(priv, SAM_EMAC_NCR);
sam_putreg(priv, SAM_EMAC_NCR, regval | EMAC_NCR_MPE);
/* Read from the requested register */
ret = sam_phyread(priv, req->phy_id, req->reg_num, &req->val_out);
/* Disable management port (probably) */
sam_putreg(priv, SAM_EMAC_NCR, regval);
}
break;
case SIOCSMIIREG: /* Set register in MII PHY */
{
struct mii_ioctl_data_s *req = (struct mii_ioctl_data_s *)((uintptr_t)arg);
uint32_t regval;
/* Enable management port */
regval = sam_getreg(priv, SAM_EMAC_NCR);
sam_putreg(priv, SAM_EMAC_NCR, regval | EMAC_NCR_MPE);
/* Write to the requested register */
ret = sam_phywrite(priv, req->phy_id, req->reg_num, req->val_in);
/* Disable management port (probably) */
sam_putreg(priv, SAM_EMAC_NCR, regval);
}
break;

View File

@ -1867,14 +1867,40 @@ static int sam_ioctl(struct net_driver_s *dev, int cmd, long arg)
case SIOCGMIIREG: /* Get register from MII PHY */
{
struct mii_ioctl_data_s *req = (struct mii_ioctl_data_s *)((uintptr_t)arg);
uint32_t regval;
/* Enable management port */
regval = sam_getreg(priv, SAM_EMAC_NCR);
sam_putreg(priv, SAM_EMAC_NCR, regval | EMAC_NCR_MPE);
/* Read from the requested register */
ret = sam_phyread(priv, req->phy_id, req->reg_num, &req->val_out);
/* Disable management port (probably) */
sam_putreg(priv, SAM_EMAC_NCR, regval);
}
break;
case SIOCSMIIREG: /* Set register in MII PHY */
{
struct mii_ioctl_data_s *req = (struct mii_ioctl_data_s *)((uintptr_t)arg);
uint32_t regval;
/* Enable management port */
regval = sam_getreg(priv, SAM_EMAC_NCR);
sam_putreg(priv, SAM_EMAC_NCR, regval | EMAC_NCR_MPE);
/* Write to the requested register */
ret = sam_phywrite(priv, req->phy_id, req->reg_num, req->val_in);
/* Disable management port (probably) */
sam_putreg(priv, SAM_EMAC_NCR, regval);
}
break;

View File

@ -2242,14 +2242,40 @@ static int sam_ioctl(struct net_driver_s *dev, int cmd, long arg)
case SIOCGMIIREG: /* Get register from MII PHY */
{
struct mii_ioctl_data_s *req = (struct mii_ioctl_data_s *)((uintptr_t)arg);
uint32_t regval;
/* Enable management port */
regval = sam_getreg(priv, SAM_EMAC_NCR_OFFSET);
sam_putreg(priv, SAM_EMAC_NCR_OFFSET, regval | EMAC_NCR_MPE);
/* Read from the requested register */
ret = sam_phyread(priv, req->phy_id, req->reg_num, &req->val_out);
/* Disable management port (probably) */
sam_putreg(priv, SAM_EMAC_NCR_OFFSET, regval);
}
break;
case SIOCSMIIREG: /* Set register in MII PHY */
{
struct mii_ioctl_data_s *req = (struct mii_ioctl_data_s *)((uintptr_t)arg);
uint32_t regval;
/* Enable management port */
regval = sam_getreg(priv, SAM_EMAC_NCR_OFFSET);
sam_putreg(priv, SAM_EMAC_NCR_OFFSET, regval | EMAC_NCR_MPE);
/* Write to the requested register */
ret = sam_phywrite(priv, req->phy_id, req->reg_num, req->val_in);
/* Disable management port (probably) */
sam_putreg(priv, SAM_EMAC_NCR_OFFSET, regval);
}
break;

View File

@ -1822,14 +1822,35 @@ static int sam_ioctl(struct net_driver_s *dev, int cmd, long arg)
case SIOCGMIIREG: /* Get register from MII PHY */
{
struct mii_ioctl_data_s *req = (struct mii_ioctl_data_s *)((uintptr_t)arg);
/* Enable the management port */
sam_enablemdio(priv);
/* Read from the requested register */
ret = sam_phyread(priv, req->phy_id, req->reg_num, &req->val_out);
/* Disable the management port */
sam_disablemdio(priv);
}
break;
case SIOCSMIIREG: /* Set register in MII PHY */
{
struct mii_ioctl_data_s *req = (struct mii_ioctl_data_s *)((uintptr_t)arg);
/* Enable the management port */
sam_enablemdio(priv);
/* Write to the requested register */
ret = sam_phywrite(priv, req->phy_id, req->reg_num, req->val_in);
/* Disable the management port */
sam_disablemdio(priv);
}
break;