@@ -571,37 +571,20 @@ static void macb_mac_config(struct phylink_config *config, unsigned int mode,
571
571
572
572
old_ctrl = ctrl = macb_or_gem_readl (bp , NCFGR );
573
573
574
- /* Clear all the bits we might set later */
575
- ctrl &= ~(MACB_BIT (SPD ) | MACB_BIT (FD ) | MACB_BIT (PAE ));
576
-
577
574
if (bp -> caps & MACB_CAPS_MACB_IS_EMAC ) {
578
575
if (state -> interface == PHY_INTERFACE_MODE_RMII )
579
576
ctrl |= MACB_BIT (RM9200_RMII );
580
577
} else {
581
- ctrl &= ~(GEM_BIT (GBE ) | GEM_BIT (SGMIIEN ) | GEM_BIT (PCSSEL ));
582
-
583
- /* We do not support MLO_PAUSE_RX yet */
584
- if (state -> pause & MLO_PAUSE_TX )
585
- ctrl |= MACB_BIT (PAE );
578
+ ctrl &= ~(GEM_BIT (SGMIIEN ) | GEM_BIT (PCSSEL ));
586
579
587
580
if (state -> interface == PHY_INTERFACE_MODE_SGMII )
588
581
ctrl |= GEM_BIT (SGMIIEN ) | GEM_BIT (PCSSEL );
589
582
}
590
583
591
- if (state -> speed == SPEED_1000 )
592
- ctrl |= GEM_BIT (GBE );
593
- else if (state -> speed == SPEED_100 )
594
- ctrl |= MACB_BIT (SPD );
595
-
596
- if (state -> duplex )
597
- ctrl |= MACB_BIT (FD );
598
-
599
584
/* Apply the new configuration, if any */
600
585
if (old_ctrl ^ ctrl )
601
586
macb_or_gem_writel (bp , NCFGR , ctrl );
602
587
603
- bp -> speed = state -> speed ;
604
-
605
588
spin_unlock_irqrestore (& bp -> lock , flags );
606
589
}
607
590
@@ -635,10 +618,33 @@ static void macb_mac_link_up(struct phylink_config *config,
635
618
struct net_device * ndev = to_net_dev (config -> dev );
636
619
struct macb * bp = netdev_priv (ndev );
637
620
struct macb_queue * queue ;
621
+ unsigned long flags ;
638
622
unsigned int q ;
623
+ u32 ctrl ;
624
+
625
+ spin_lock_irqsave (& bp -> lock , flags );
626
+
627
+ ctrl = macb_or_gem_readl (bp , NCFGR );
628
+
629
+ ctrl &= ~(MACB_BIT (SPD ) | MACB_BIT (FD ));
630
+
631
+ if (speed == SPEED_100 )
632
+ ctrl |= MACB_BIT (SPD );
633
+
634
+ if (duplex )
635
+ ctrl |= MACB_BIT (FD );
639
636
640
637
if (!(bp -> caps & MACB_CAPS_MACB_IS_EMAC )) {
641
- macb_set_tx_clk (bp -> tx_clk , bp -> speed , ndev );
638
+ ctrl &= ~(GEM_BIT (GBE ) | MACB_BIT (PAE ));
639
+
640
+ if (speed == SPEED_1000 )
641
+ ctrl |= GEM_BIT (GBE );
642
+
643
+ /* We do not support MLO_PAUSE_RX yet */
644
+ if (tx_pause )
645
+ ctrl |= MACB_BIT (PAE );
646
+
647
+ macb_set_tx_clk (bp -> tx_clk , speed , ndev );
642
648
643
649
/* Initialize rings & buffers as clearing MACB_BIT(TE) in link down
644
650
* cleared the pipeline and control registers.
@@ -651,6 +657,10 @@ static void macb_mac_link_up(struct phylink_config *config,
651
657
bp -> rx_intr_mask | MACB_TX_INT_FLAGS | MACB_BIT (HRESP ));
652
658
}
653
659
660
+ macb_or_gem_writel (bp , NCFGR , ctrl );
661
+
662
+ spin_unlock_irqrestore (& bp -> lock , flags );
663
+
654
664
/* Enable Rx and Tx */
655
665
macb_writel (bp , NCR , macb_readl (bp , NCR ) | MACB_BIT (RE ) | MACB_BIT (TE ));
656
666
@@ -4432,8 +4442,6 @@ static int macb_probe(struct platform_device *pdev)
4432
4442
else
4433
4443
bp -> phy_interface = interface ;
4434
4444
4435
- bp -> speed = SPEED_UNKNOWN ;
4436
-
4437
4445
/* IP specific init */
4438
4446
err = init (pdev );
4439
4447
if (err )
0 commit comments