@@ -976,8 +976,8 @@ fec_restart(struct net_device *ndev)
976
976
writel ((__force u32 )cpu_to_be32 (temp_mac [1 ]),
977
977
fep -> hwp + FEC_ADDR_HIGH );
978
978
979
- /* Clear any outstanding interrupt. */
980
- writel (0xffffffff , fep -> hwp + FEC_IEVENT );
979
+ /* Clear any outstanding interrupt, except MDIO . */
980
+ writel (( 0xffffffff & ~ FEC_ENET_MII ) , fep -> hwp + FEC_IEVENT );
981
981
982
982
fec_enet_bd_init (ndev );
983
983
@@ -1123,7 +1123,7 @@ fec_restart(struct net_device *ndev)
1123
1123
if (fep -> link )
1124
1124
writel (FEC_DEFAULT_IMASK , fep -> hwp + FEC_IMASK );
1125
1125
else
1126
- writel (FEC_ENET_MII , fep -> hwp + FEC_IMASK );
1126
+ writel (0 , fep -> hwp + FEC_IMASK );
1127
1127
1128
1128
/* Init the interrupt coalescing */
1129
1129
fec_enet_itr_coal_init (ndev );
@@ -1652,23 +1652,23 @@ fec_enet_interrupt(int irq, void *dev_id)
1652
1652
irqreturn_t ret = IRQ_NONE ;
1653
1653
1654
1654
int_events = readl (fep -> hwp + FEC_IEVENT );
1655
+
1656
+ /* Don't clear MDIO events, we poll for those */
1657
+ int_events &= ~FEC_ENET_MII ;
1658
+
1655
1659
writel (int_events , fep -> hwp + FEC_IEVENT );
1656
1660
fec_enet_collect_events (fep , int_events );
1657
1661
1658
1662
if ((fep -> work_tx || fep -> work_rx ) && fep -> link ) {
1659
1663
ret = IRQ_HANDLED ;
1660
1664
1661
1665
if (napi_schedule_prep (& fep -> napi )) {
1662
- /* Disable the NAPI interrupts */
1663
- writel (FEC_NAPI_IMASK , fep -> hwp + FEC_IMASK );
1666
+ /* Disable interrupts */
1667
+ writel (0 , fep -> hwp + FEC_IMASK );
1664
1668
__napi_schedule (& fep -> napi );
1665
1669
}
1666
1670
}
1667
1671
1668
- if (int_events & FEC_ENET_MII ) {
1669
- ret = IRQ_HANDLED ;
1670
- complete (& fep -> mdio_done );
1671
- }
1672
1672
return ret ;
1673
1673
}
1674
1674
@@ -1818,20 +1818,31 @@ static void fec_enet_adjust_link(struct net_device *ndev)
1818
1818
phy_print_status (phy_dev );
1819
1819
}
1820
1820
1821
+ static int fec_enet_mdio_wait (struct fec_enet_private * fep )
1822
+ {
1823
+ uint ievent ;
1824
+ int ret ;
1825
+
1826
+ ret = readl_poll_timeout_atomic (fep -> hwp + FEC_IEVENT , ievent ,
1827
+ ievent & FEC_ENET_MII , 2 , 30000 );
1828
+
1829
+ if (!ret )
1830
+ writel (FEC_ENET_MII , fep -> hwp + FEC_IEVENT );
1831
+
1832
+ return ret ;
1833
+ }
1834
+
1821
1835
static int fec_enet_mdio_read (struct mii_bus * bus , int mii_id , int regnum )
1822
1836
{
1823
1837
struct fec_enet_private * fep = bus -> priv ;
1824
1838
struct device * dev = & fep -> pdev -> dev ;
1825
- unsigned long time_left ;
1826
1839
int ret = 0 , frame_start , frame_addr , frame_op ;
1827
1840
bool is_c45 = !!(regnum & MII_ADDR_C45 );
1828
1841
1829
1842
ret = pm_runtime_get_sync (dev );
1830
1843
if (ret < 0 )
1831
1844
return ret ;
1832
1845
1833
- reinit_completion (& fep -> mdio_done );
1834
-
1835
1846
if (is_c45 ) {
1836
1847
frame_start = FEC_MMFR_ST_C45 ;
1837
1848
@@ -1843,11 +1854,9 @@ static int fec_enet_mdio_read(struct mii_bus *bus, int mii_id, int regnum)
1843
1854
fep -> hwp + FEC_MII_DATA );
1844
1855
1845
1856
/* wait for end of transfer */
1846
- time_left = wait_for_completion_timeout (& fep -> mdio_done ,
1847
- usecs_to_jiffies (FEC_MII_TIMEOUT ));
1848
- if (time_left == 0 ) {
1857
+ ret = fec_enet_mdio_wait (fep );
1858
+ if (ret ) {
1849
1859
netdev_err (fep -> netdev , "MDIO address write timeout\n" );
1850
- ret = - ETIMEDOUT ;
1851
1860
goto out ;
1852
1861
}
1853
1862
@@ -1866,11 +1875,9 @@ static int fec_enet_mdio_read(struct mii_bus *bus, int mii_id, int regnum)
1866
1875
FEC_MMFR_TA , fep -> hwp + FEC_MII_DATA );
1867
1876
1868
1877
/* wait for end of transfer */
1869
- time_left = wait_for_completion_timeout (& fep -> mdio_done ,
1870
- usecs_to_jiffies (FEC_MII_TIMEOUT ));
1871
- if (time_left == 0 ) {
1878
+ ret = fec_enet_mdio_wait (fep );
1879
+ if (ret ) {
1872
1880
netdev_err (fep -> netdev , "MDIO read timeout\n" );
1873
- ret = - ETIMEDOUT ;
1874
1881
goto out ;
1875
1882
}
1876
1883
@@ -1888,7 +1895,6 @@ static int fec_enet_mdio_write(struct mii_bus *bus, int mii_id, int regnum,
1888
1895
{
1889
1896
struct fec_enet_private * fep = bus -> priv ;
1890
1897
struct device * dev = & fep -> pdev -> dev ;
1891
- unsigned long time_left ;
1892
1898
int ret , frame_start , frame_addr ;
1893
1899
bool is_c45 = !!(regnum & MII_ADDR_C45 );
1894
1900
@@ -1898,8 +1904,6 @@ static int fec_enet_mdio_write(struct mii_bus *bus, int mii_id, int regnum,
1898
1904
else
1899
1905
ret = 0 ;
1900
1906
1901
- reinit_completion (& fep -> mdio_done );
1902
-
1903
1907
if (is_c45 ) {
1904
1908
frame_start = FEC_MMFR_ST_C45 ;
1905
1909
@@ -1911,11 +1915,9 @@ static int fec_enet_mdio_write(struct mii_bus *bus, int mii_id, int regnum,
1911
1915
fep -> hwp + FEC_MII_DATA );
1912
1916
1913
1917
/* wait for end of transfer */
1914
- time_left = wait_for_completion_timeout (& fep -> mdio_done ,
1915
- usecs_to_jiffies (FEC_MII_TIMEOUT ));
1916
- if (time_left == 0 ) {
1918
+ ret = fec_enet_mdio_wait (fep );
1919
+ if (ret ) {
1917
1920
netdev_err (fep -> netdev , "MDIO address write timeout\n" );
1918
- ret = - ETIMEDOUT ;
1919
1921
goto out ;
1920
1922
}
1921
1923
} else {
@@ -1931,12 +1933,9 @@ static int fec_enet_mdio_write(struct mii_bus *bus, int mii_id, int regnum,
1931
1933
fep -> hwp + FEC_MII_DATA );
1932
1934
1933
1935
/* wait for end of transfer */
1934
- time_left = wait_for_completion_timeout (& fep -> mdio_done ,
1935
- usecs_to_jiffies (FEC_MII_TIMEOUT ));
1936
- if (time_left == 0 ) {
1936
+ ret = fec_enet_mdio_wait (fep );
1937
+ if (ret )
1937
1938
netdev_err (fep -> netdev , "MDIO write timeout\n" );
1938
- ret = - ETIMEDOUT ;
1939
- }
1940
1939
1941
1940
out :
1942
1941
pm_runtime_mark_last_busy (dev );
@@ -2143,8 +2142,21 @@ static int fec_enet_mii_init(struct platform_device *pdev)
2143
2142
if (suppress_preamble )
2144
2143
fep -> phy_speed |= BIT (7 );
2145
2144
2145
+ /* Clear MMFR to avoid to generate MII event by writing MSCR.
2146
+ * MII event generation condition:
2147
+ * - writing MSCR:
2148
+ * - mmfr[31:0]_not_zero & mscr[7:0]_is_zero &
2149
+ * mscr_reg_data_in[7:0] != 0
2150
+ * - writing MMFR:
2151
+ * - mscr[7:0]_not_zero
2152
+ */
2153
+ writel (0 , fep -> hwp + FEC_MII_DATA );
2154
+
2146
2155
writel (fep -> phy_speed , fep -> hwp + FEC_MII_SPEED );
2147
2156
2157
+ /* Clear any pending transaction complete indication */
2158
+ writel (FEC_ENET_MII , fep -> hwp + FEC_IEVENT );
2159
+
2148
2160
fep -> mii_bus = mdiobus_alloc ();
2149
2161
if (fep -> mii_bus == NULL ) {
2150
2162
err = - ENOMEM ;
@@ -3686,7 +3698,6 @@ fec_probe(struct platform_device *pdev)
3686
3698
fep -> irq [i ] = irq ;
3687
3699
}
3688
3700
3689
- init_completion (& fep -> mdio_done );
3690
3701
ret = fec_enet_mii_init (pdev );
3691
3702
if (ret )
3692
3703
goto failed_mii_init ;
0 commit comments