ar71xx: remove pdata->fifo_cfg*
[openwrt/openwrt.git] / target / linux / ar71xx / files / arch / mips / ath79 / dev-eth.c
index 12a376e1322ae14dd714297ed5f8319ae09eeb64..9e72c41a4281cfc4ae1d3c2f4ebac4efb3e8199a 100644 (file)
@@ -271,6 +271,7 @@ void __init ath79_register_mdio(unsigned int id, u32 phy_mask)
        case ATH79_SOC_QCA956X:
                if (id == 1)
                        mdio_data->builtin_switch = 1;
+               mdio_data->is_ar934x = 1;
                break;
 
        default:
@@ -406,48 +407,14 @@ static void ath79_set_speed_dummy(int speed)
 {
 }
 
-static void ath79_ddr_no_flush(void)
-{
-}
-
 static void ath79_ddr_flush_ge0(void)
 {
-       ath79_ddr_wb_flush(AR71XX_DDR_REG_FLUSH_GE0);
+       ath79_ddr_wb_flush(0);
 }
 
 static void ath79_ddr_flush_ge1(void)
 {
-       ath79_ddr_wb_flush(AR71XX_DDR_REG_FLUSH_GE1);
-}
-
-static void ar724x_ddr_flush_ge0(void)
-{
-       ath79_ddr_wb_flush(AR724X_DDR_REG_FLUSH_GE0);
-}
-
-static void ar724x_ddr_flush_ge1(void)
-{
-       ath79_ddr_wb_flush(AR724X_DDR_REG_FLUSH_GE1);
-}
-
-static void ar91xx_ddr_flush_ge0(void)
-{
-       ath79_ddr_wb_flush(AR913X_DDR_REG_FLUSH_GE0);
-}
-
-static void ar91xx_ddr_flush_ge1(void)
-{
-       ath79_ddr_wb_flush(AR913X_DDR_REG_FLUSH_GE1);
-}
-
-static void ar933x_ddr_flush_ge0(void)
-{
-       ath79_ddr_wb_flush(AR933X_DDR_REG_FLUSH_GE0);
-}
-
-static void ar933x_ddr_flush_ge1(void)
-{
-       ath79_ddr_wb_flush(AR933X_DDR_REG_FLUSH_GE1);
+       ath79_ddr_wb_flush(1);
 }
 
 static struct resource ath79_eth0_resources[] = {
@@ -719,7 +686,6 @@ static int __init ath79_setup_phy_if_mode(unsigned int id,
                case ATH79_SOC_AR7241:
                case ATH79_SOC_AR9330:
                case ATH79_SOC_AR9331:
-               case ATH79_SOC_QCA956X:
                case ATH79_SOC_TP9343:
                        pdata->phy_if_mode = PHY_INTERFACE_MODE_GMII;
                        break;
@@ -731,6 +697,7 @@ static int __init ath79_setup_phy_if_mode(unsigned int id,
                case ATH79_SOC_AR9342:
                case ATH79_SOC_AR9344:
                case ATH79_SOC_QCA9533:
+               case ATH79_SOC_QCA956X:
                        switch (pdata->phy_if_mode) {
                        case PHY_INTERFACE_MODE_MII:
                        case PHY_INTERFACE_MODE_GMII:
@@ -847,6 +814,27 @@ void __init ath79_setup_qca955x_eth_cfg(u32 mask)
        iounmap(base);
 }
 
+void __init ath79_setup_qca956x_eth_cfg(u32 mask)
+{
+       void __iomem *base;
+       u32 t;
+
+       base = ioremap(QCA956X_GMAC_BASE, QCA956X_GMAC_SIZE);
+
+       t = __raw_readl(base + QCA956X_GMAC_REG_ETH_CFG);
+
+       t &= ~(QCA956X_ETH_CFG_SW_ONLY_MODE |
+              QCA956X_ETH_CFG_SW_PHY_SWAP);
+
+       t |= mask;
+
+       __raw_writel(t, base + QCA956X_GMAC_REG_ETH_CFG);
+       /* flush write */
+       __raw_readl(base + QCA956X_GMAC_REG_ETH_CFG);
+
+       iounmap(base);
+}
+
 static int ath79_eth_instance __initdata;
 void __init ath79_register_eth(unsigned int id)
 {
@@ -878,26 +866,25 @@ void __init ath79_register_eth(unsigned int id)
                return;
        }
 
+       if (id == 0)
+               pdata->ddr_flush = ath79_ddr_flush_ge0;
+       else
+               pdata->ddr_flush = ath79_ddr_flush_ge1;
+
        switch (ath79_soc) {
        case ATH79_SOC_AR7130:
-               if (id == 0) {
-                       pdata->ddr_flush = ath79_ddr_flush_ge0;
+               if (id == 0)
                        pdata->set_speed = ath79_set_speed_ge0;
-               } else {
-                       pdata->ddr_flush = ath79_ddr_flush_ge1;
+               else
                        pdata->set_speed = ath79_set_speed_ge1;
-               }
                break;
 
        case ATH79_SOC_AR7141:
        case ATH79_SOC_AR7161:
-               if (id == 0) {
-                       pdata->ddr_flush = ath79_ddr_flush_ge0;
+               if (id == 0)
                        pdata->set_speed = ath79_set_speed_ge0;
-               } else {
-                       pdata->ddr_flush = ath79_ddr_flush_ge1;
+               else
                        pdata->set_speed = ath79_set_speed_ge1;
-               }
                pdata->has_gbit = 1;
                break;
 
@@ -905,23 +892,14 @@ void __init ath79_register_eth(unsigned int id)
                if (id == 0) {
                        pdata->reset_bit |= AR724X_RESET_GE0_MDIO |
                                            AR71XX_RESET_GE0_PHY;
-                       pdata->ddr_flush = ar724x_ddr_flush_ge0;
                        pdata->set_speed = ar7242_set_speed_ge0;
                } else {
                        pdata->reset_bit |= AR724X_RESET_GE1_MDIO |
                                            AR71XX_RESET_GE1_PHY;
-                       pdata->ddr_flush = ar724x_ddr_flush_ge1;
                        pdata->set_speed = ath79_set_speed_dummy;
                }
                pdata->has_gbit = 1;
                pdata->is_ar724x = 1;
-
-               if (!pdata->fifo_cfg1)
-                       pdata->fifo_cfg1 = 0x0010ffff;
-               if (!pdata->fifo_cfg2)
-                       pdata->fifo_cfg2 = 0x015500aa;
-               if (!pdata->fifo_cfg3)
-                       pdata->fifo_cfg3 = 0x01f00140;
                break;
 
        case ATH79_SOC_AR7241:
@@ -933,18 +911,17 @@ void __init ath79_register_eth(unsigned int id)
        case ATH79_SOC_AR7240:
                if (id == 0) {
                        pdata->reset_bit |= AR71XX_RESET_GE0_PHY;
-                       pdata->ddr_flush = ar724x_ddr_flush_ge0;
                        pdata->set_speed = ath79_set_speed_dummy;
 
                        pdata->phy_mask = BIT(4);
                } else {
                        pdata->reset_bit |= AR71XX_RESET_GE1_PHY;
-                       pdata->ddr_flush = ar724x_ddr_flush_ge1;
                        pdata->set_speed = ath79_set_speed_dummy;
 
                        pdata->speed = SPEED_1000;
                        pdata->duplex = DUPLEX_FULL;
                        pdata->switch_data = &ath79_switch_data;
+                       pdata->use_flow_control = 1;
 
                        ath79_switch_data.phy_poll_mask |= BIT(4);
                }
@@ -952,36 +929,17 @@ void __init ath79_register_eth(unsigned int id)
                pdata->is_ar724x = 1;
                if (ath79_soc == ATH79_SOC_AR7240)
                        pdata->is_ar7240 = 1;
-
-               if (!pdata->fifo_cfg1)
-                       pdata->fifo_cfg1 = 0x0010ffff;
-               if (!pdata->fifo_cfg2)
-                       pdata->fifo_cfg2 = 0x015500aa;
-               if (!pdata->fifo_cfg3)
-                       pdata->fifo_cfg3 = 0x01f00140;
-               break;
-
-       case ATH79_SOC_AR9130:
-               if (id == 0) {
-                       pdata->ddr_flush = ar91xx_ddr_flush_ge0;
-                       pdata->set_speed = ar91xx_set_speed_ge0;
-               } else {
-                       pdata->ddr_flush = ar91xx_ddr_flush_ge1;
-                       pdata->set_speed = ar91xx_set_speed_ge1;
-               }
-               pdata->is_ar91xx = 1;
                break;
 
        case ATH79_SOC_AR9132:
-               if (id == 0) {
-                       pdata->ddr_flush = ar91xx_ddr_flush_ge0;
+               pdata->has_gbit = 1;
+               /* fall through */
+       case ATH79_SOC_AR9130:
+               if (id == 0)
                        pdata->set_speed = ar91xx_set_speed_ge0;
-               } else {
-                       pdata->ddr_flush = ar91xx_ddr_flush_ge1;
+               else
                        pdata->set_speed = ar91xx_set_speed_ge1;
-               }
                pdata->is_ar91xx = 1;
-               pdata->has_gbit = 1;
                break;
 
        case ATH79_SOC_AR9330:
@@ -989,32 +947,24 @@ void __init ath79_register_eth(unsigned int id)
                if (id == 0) {
                        pdata->reset_bit = AR933X_RESET_GE0_MAC |
                                           AR933X_RESET_GE0_MDIO;
-                       pdata->ddr_flush = ar933x_ddr_flush_ge0;
                        pdata->set_speed = ath79_set_speed_dummy;
 
                        pdata->phy_mask = BIT(4);
                } else {
                        pdata->reset_bit = AR933X_RESET_GE1_MAC |
                                           AR933X_RESET_GE1_MDIO;
-                       pdata->ddr_flush = ar933x_ddr_flush_ge1;
                        pdata->set_speed = ath79_set_speed_dummy;
 
                        pdata->speed = SPEED_1000;
                        pdata->has_gbit = 1;
                        pdata->duplex = DUPLEX_FULL;
                        pdata->switch_data = &ath79_switch_data;
+                       pdata->use_flow_control = 1;
 
                        ath79_switch_data.phy_poll_mask |= BIT(4);
                }
 
                pdata->is_ar724x = 1;
-
-               if (!pdata->fifo_cfg1)
-                       pdata->fifo_cfg1 = 0x0010ffff;
-               if (!pdata->fifo_cfg2)
-                       pdata->fifo_cfg2 = 0x015500aa;
-               if (!pdata->fifo_cfg3)
-                       pdata->fifo_cfg3 = 0x01f00140;
                break;
 
        case ATH79_SOC_AR9341:
@@ -1025,6 +975,9 @@ void __init ath79_register_eth(unsigned int id)
                        pdata->reset_bit = AR934X_RESET_GE0_MAC |
                                           AR934X_RESET_GE0_MDIO;
                        pdata->set_speed = ar934x_set_speed_ge0;
+
+                       if (ath79_soc == ATH79_SOC_QCA9533)
+                               pdata->disable_inline_checksum_engine = 1;
                } else {
                        pdata->reset_bit = AR934X_RESET_GE1_MAC |
                                           AR934X_RESET_GE1_MDIO;
@@ -1037,19 +990,11 @@ void __init ath79_register_eth(unsigned int id)
                        ath79_device_reset_clear(AR934X_RESET_ETH_SWITCH);
                }
 
-               pdata->ddr_flush = ath79_ddr_no_flush;
                pdata->has_gbit = 1;
                pdata->is_ar724x = 1;
 
                pdata->max_frame_len = SZ_16K - 1;
                pdata->desc_pktlen_mask = SZ_16K - 1;
-
-               if (!pdata->fifo_cfg1)
-                       pdata->fifo_cfg1 = 0x0010ffff;
-               if (!pdata->fifo_cfg2)
-                       pdata->fifo_cfg2 = 0x015500aa;
-               if (!pdata->fifo_cfg3)
-                       pdata->fifo_cfg3 = 0x01f00140;
                break;
 
        case ATH79_SOC_TP9343:
@@ -1068,20 +1013,13 @@ void __init ath79_register_eth(unsigned int id)
                        pdata->speed = SPEED_1000;
                        pdata->duplex = DUPLEX_FULL;
                        pdata->switch_data = &ath79_switch_data;
+                       pdata->use_flow_control = 1;
 
                        ath79_switch_data.phy_poll_mask |= BIT(4);
                }
 
-               pdata->ddr_flush = ath79_ddr_no_flush;
                pdata->has_gbit = 1;
                pdata->is_ar724x = 1;
-
-               if (!pdata->fifo_cfg1)
-                       pdata->fifo_cfg1 = 0x0010ffff;
-               if (!pdata->fifo_cfg2)
-                       pdata->fifo_cfg2 = 0x015500aa;
-               if (!pdata->fifo_cfg3)
-                       pdata->fifo_cfg3 = 0x01f00140;
                break;
 
        case ATH79_SOC_QCA9556:
@@ -1096,7 +1034,6 @@ void __init ath79_register_eth(unsigned int id)
                        pdata->set_speed = qca955x_set_speed_sgmii;
                }
 
-               pdata->ddr_flush = ath79_ddr_no_flush;
                pdata->has_gbit = 1;
                pdata->is_ar724x = 1;
 
@@ -1110,41 +1047,38 @@ void __init ath79_register_eth(unsigned int id)
                 */
                pdata->max_frame_len = SZ_4K - 1;
                pdata->desc_pktlen_mask = SZ_16K - 1;
-
-               if (!pdata->fifo_cfg1)
-                       pdata->fifo_cfg1 = 0x0010ffff;
-               if (!pdata->fifo_cfg2)
-                       pdata->fifo_cfg2 = 0x015500aa;
-               if (!pdata->fifo_cfg3)
-                       pdata->fifo_cfg3 = 0x01f00140;
                break;
 
        case ATH79_SOC_QCA956X:
                if (id == 0) {
                        pdata->reset_bit = QCA955X_RESET_GE0_MAC |
                                           QCA955X_RESET_GE0_MDIO;
+
                        if (pdata->phy_if_mode == PHY_INTERFACE_MODE_SGMII)
                                pdata->set_speed = qca956x_set_speed_sgmii;
                        else
-                               /* FIXME */
-                               pdata->set_speed = ath79_set_speed_dummy;
+                               pdata->set_speed = ar934x_set_speed_ge0;
+
+                       pdata->disable_inline_checksum_engine = 1;
                } else {
                        pdata->reset_bit = QCA955X_RESET_GE1_MAC |
                                           QCA955X_RESET_GE1_MDIO;
-                       /* FIXME */
+
                        pdata->set_speed = ath79_set_speed_dummy;
+
+                       pdata->switch_data = &ath79_switch_data;
+
+                       pdata->speed = SPEED_1000;
+                       pdata->duplex = DUPLEX_FULL;
+                       pdata->use_flow_control = 1;
+
+                       /* reset the built-in switch */
+                       ath79_device_reset_set(AR934X_RESET_ETH_SWITCH);
+                       ath79_device_reset_clear(AR934X_RESET_ETH_SWITCH);
                }
 
-               pdata->ddr_flush = ath79_ddr_no_flush;
                pdata->has_gbit = 1;
                pdata->is_ar724x = 1;
-
-               if (!pdata->fifo_cfg1)
-                       pdata->fifo_cfg1 = 0x0010ffff;
-               if (!pdata->fifo_cfg2)
-                       pdata->fifo_cfg2 = 0x015500aa;
-               if (!pdata->fifo_cfg3)
-                       pdata->fifo_cfg3 = 0x01f00140;
                break;
 
        default:
@@ -1196,6 +1130,11 @@ void __init ath79_register_eth(unsigned int id)
                        /* don't assign any MDIO device by default */
                        break;
 
+               case ATH79_SOC_QCA956X:
+                       if (pdata->phy_if_mode != PHY_INTERFACE_MODE_SGMII)
+                               pdata->mii_bus_dev = &ath79_mdio1_device.dev;
+                       break;
+
                default:
                        pdata->mii_bus_dev = &ath79_mdio0_device.dev;
                        break;