294
294
#define MVPP2_GMAC_TX_FIFO_MIN_TH_ALL_MASK 0x1fc0
295
295
#define MVPP2_GMAC_TX_FIFO_MIN_TH_MASK (v ) (((v) << 6) & \
296
296
MVPP2_GMAC_TX_FIFO_MIN_TH_ALL_MASK)
297
+ #define MVPP22_GMAC_CTRL_4_REG 0x90
298
+ #define MVPP22_CTRL4_EXT_PIN_GMII_SEL BIT(0)
299
+ #define MVPP22_CTRL4_DP_CLK_SEL BIT(5)
300
+ #define MVPP22_CTRL4_SYNC_BYPASS BIT(6)
301
+ #define MVPP22_CTRL4_QSGMII_BYPASS_ACTIVE BIT(7)
302
+
303
+ /* Per-port XGMAC registers. PPv2.2 only, only for GOP port 0,
304
+ * relative to port->base.
305
+ */
306
+ #define MVPP22_XLG_CTRL3_REG 0x11c
307
+ #define MVPP22_XLG_CTRL3_MACMODESELECT_MASK (7 << 13)
308
+ #define MVPP22_XLG_CTRL3_MACMODESELECT_GMAC (0 << 13)
309
+
310
+ /* SMI registers. PPv2.2 only, relative to priv->iface_base. */
311
+ #define MVPP22_SMI_MISC_CFG_REG 0x1204
312
+ #define MVPP22_SMI_POLLING_EN BIT(10)
297
313
298
314
#define MVPP22_GMAC_BASE (port ) (0x7000 + (port) * 0x1000 + 0xe00)
299
315
@@ -4128,10 +4144,38 @@ static void mvpp2_interrupts_unmask(void *arg)
4128
4144
4129
4145
/* Port configuration routines */
4130
4146
4147
+ static void mvpp22_port_mii_set (struct mvpp2_port * port )
4148
+ {
4149
+ u32 val ;
4150
+
4151
+ return ;
4152
+
4153
+ /* Only GOP port 0 has an XLG MAC */
4154
+ if (port -> gop_id == 0 ) {
4155
+ val = readl (port -> base + MVPP22_XLG_CTRL3_REG );
4156
+ val &= ~MVPP22_XLG_CTRL3_MACMODESELECT_MASK ;
4157
+ val |= MVPP22_XLG_CTRL3_MACMODESELECT_GMAC ;
4158
+ writel (val , port -> base + MVPP22_XLG_CTRL3_REG );
4159
+ }
4160
+
4161
+ val = readl (port -> base + MVPP22_GMAC_CTRL_4_REG );
4162
+ if (port -> phy_interface == PHY_INTERFACE_MODE_RGMII )
4163
+ val |= MVPP22_CTRL4_EXT_PIN_GMII_SEL ;
4164
+ else
4165
+ val &= ~MVPP22_CTRL4_EXT_PIN_GMII_SEL ;
4166
+ val &= ~MVPP22_CTRL4_DP_CLK_SEL ;
4167
+ val |= MVPP22_CTRL4_SYNC_BYPASS ;
4168
+ val |= MVPP22_CTRL4_QSGMII_BYPASS_ACTIVE ;
4169
+ writel (val , port -> base + MVPP22_GMAC_CTRL_4_REG );
4170
+ }
4171
+
4131
4172
static void mvpp2_port_mii_set (struct mvpp2_port * port )
4132
4173
{
4133
4174
u32 val ;
4134
4175
4176
+ if (port -> priv -> hw_version == MVPP22 )
4177
+ mvpp22_port_mii_set (port );
4178
+
4135
4179
val = readl (port -> base + MVPP2_GMAC_CTRL_2_REG );
4136
4180
4137
4181
switch (port -> phy_interface ) {
@@ -5813,7 +5857,7 @@ static int mvpp2_check_ringparam_valid(struct net_device *dev,
5813
5857
return 0 ;
5814
5858
}
5815
5859
5816
- static void mvpp2_get_mac_address (struct mvpp2_port * port , unsigned char * addr )
5860
+ static void mvpp21_get_mac_address (struct mvpp2_port * port , unsigned char * addr )
5817
5861
{
5818
5862
u32 mac_addr_l , mac_addr_m , mac_addr_h ;
5819
5863
@@ -6258,16 +6302,6 @@ static const struct ethtool_ops mvpp2_eth_tool_ops = {
6258
6302
.set_link_ksettings = phy_ethtool_set_link_ksettings ,
6259
6303
};
6260
6304
6261
- /* Driver initialization */
6262
-
6263
- static void mvpp2_port_power_up (struct mvpp2_port * port )
6264
- {
6265
- mvpp2_port_mii_set (port );
6266
- mvpp2_port_periodic_xon_disable (port );
6267
- mvpp2_port_fc_adv_enable (port );
6268
- mvpp2_port_reset (port );
6269
- }
6270
-
6271
6305
/* Initialize port HW */
6272
6306
static int mvpp2_port_init (struct mvpp2_port * port )
6273
6307
{
@@ -6479,7 +6513,8 @@ static int mvpp2_port_probe(struct platform_device *pdev,
6479
6513
mac_from = "device tree" ;
6480
6514
ether_addr_copy (dev -> dev_addr , dt_mac_addr );
6481
6515
} else {
6482
- mvpp2_get_mac_address (port , hw_mac_addr );
6516
+ if (priv -> hw_version == MVPP21 )
6517
+ mvpp21_get_mac_address (port , hw_mac_addr );
6483
6518
if (is_valid_ether_addr (hw_mac_addr )) {
6484
6519
mac_from = "hardware" ;
6485
6520
ether_addr_copy (dev -> dev_addr , hw_mac_addr );
@@ -6499,7 +6534,14 @@ static int mvpp2_port_probe(struct platform_device *pdev,
6499
6534
dev_err (& pdev -> dev , "failed to init port %d\n" , id );
6500
6535
goto err_free_stats ;
6501
6536
}
6502
- mvpp2_port_power_up (port );
6537
+
6538
+ mvpp2_port_mii_set (port );
6539
+ mvpp2_port_periodic_xon_disable (port );
6540
+
6541
+ if (priv -> hw_version == MVPP21 )
6542
+ mvpp2_port_fc_adv_enable (port );
6543
+
6544
+ mvpp2_port_reset (port );
6503
6545
6504
6546
port -> pcpu = alloc_percpu (struct mvpp2_port_pcpu );
6505
6547
if (!port -> pcpu ) {
@@ -6642,9 +6684,15 @@ static int mvpp2_init(struct platform_device *pdev, struct mvpp2 *priv)
6642
6684
mvpp2_conf_mbus_windows (dram_target_info , priv );
6643
6685
6644
6686
/* Disable HW PHY polling */
6645
- val = readl (priv -> lms_base + MVPP2_PHY_AN_CFG0_REG );
6646
- val |= MVPP2_PHY_AN_STOP_SMI0_MASK ;
6647
- writel (val , priv -> lms_base + MVPP2_PHY_AN_CFG0_REG );
6687
+ if (priv -> hw_version == MVPP21 ) {
6688
+ val = readl (priv -> lms_base + MVPP2_PHY_AN_CFG0_REG );
6689
+ val |= MVPP2_PHY_AN_STOP_SMI0_MASK ;
6690
+ writel (val , priv -> lms_base + MVPP2_PHY_AN_CFG0_REG );
6691
+ } else {
6692
+ val = readl (priv -> iface_base + MVPP22_SMI_MISC_CFG_REG );
6693
+ val &= ~MVPP22_SMI_POLLING_EN ;
6694
+ writel (val , priv -> iface_base + MVPP22_SMI_MISC_CFG_REG );
6695
+ }
6648
6696
6649
6697
/* Allocate and initialize aggregated TXQs */
6650
6698
priv -> aggr_txqs = devm_kcalloc (& pdev -> dev , num_present_cpus (),
@@ -6669,8 +6717,9 @@ static int mvpp2_init(struct platform_device *pdev, struct mvpp2 *priv)
6669
6717
for (i = 0 ; i < MVPP2_MAX_PORTS ; i ++ )
6670
6718
mvpp2_write (priv , MVPP2_ISR_RXQ_GROUP_REG (i ), rxq_number );
6671
6719
6672
- writel (MVPP2_EXT_GLOBAL_CTRL_DEFAULT ,
6673
- priv -> lms_base + MVPP2_MNG_EXTENDED_GLOBAL_CTRL_REG );
6720
+ if (priv -> hw_version == MVPP21 )
6721
+ writel (MVPP2_EXT_GLOBAL_CTRL_DEFAULT ,
6722
+ priv -> lms_base + MVPP2_MNG_EXTENDED_GLOBAL_CTRL_REG );
6674
6723
6675
6724
/* Allow cache snoop when transmiting packets */
6676
6725
mvpp2_write (priv , MVPP2_TX_SNOOP_REG , 0x1 );
0 commit comments