source: trunk/target/linux/lantiq/patches-3.2/0018-NET-MIPS-lantiq-make-etop-ethernet-work-on-ase-ar9.patch @ 31260

Last change on this file since 31260 was 31260, checked in by blogic, 5 years ago

[lantiq] update 3.2 patches

sync with lantiq kernel series

File size: 12.6 KB
  • arch/mips/include/asm/mach-lantiq/xway/lantiq_irq.h

    From a1a9dcf7554df9bbf23ca0933e645b2327abbb8b Mon Sep 17 00:00:00 2001
    From: John Crispin <blogic@openwrt.org>
    Date: Wed, 10 Aug 2011 15:32:16 +0200
    Subject: [PATCH 18/73] NET: MIPS: lantiq: make etop ethernet work on ase/ar9
    
    Extend the driver to handle the different DMA channel layout for AR9 and
    Amazon-SE SoCs. The patch also adds support for the integrated PHY found
    on Amazon-SE and the gigabit switch found inside the AR9.
    
    Signed-off-by: John Crispin <blogic@openwrt.org>
    Cc: netdev@vger.kernel.org
    ---
     .../mips/include/asm/mach-lantiq/xway/lantiq_irq.h |   22 +---
     .../mips/include/asm/mach-lantiq/xway/lantiq_soc.h |   10 ++
     arch/mips/lantiq/xway/devices.c                    |   11 +-
     drivers/net/ethernet/lantiq_etop.c                 |  171 ++++++++++++++++++--
     4 files changed, 174 insertions(+), 40 deletions(-)
    
    diff --git a/arch/mips/include/asm/mach-lantiq/xway/lantiq_irq.h b/arch/mips/include/asm/mach-lantiq/xway/lantiq_irq.h
    index b4465a8..2a8d5ad 100644
    a b  
    3838 
    3939#define MIPS_CPU_TIMER_IRQ              7 
    4040 
    41 #define LTQ_DMA_CH0_INT         (INT_NUM_IM2_IRL0) 
    42 #define LTQ_DMA_CH1_INT         (INT_NUM_IM2_IRL0 + 1) 
    43 #define LTQ_DMA_CH2_INT         (INT_NUM_IM2_IRL0 + 2) 
    44 #define LTQ_DMA_CH3_INT         (INT_NUM_IM2_IRL0 + 3) 
    45 #define LTQ_DMA_CH4_INT         (INT_NUM_IM2_IRL0 + 4) 
    46 #define LTQ_DMA_CH5_INT         (INT_NUM_IM2_IRL0 + 5) 
    47 #define LTQ_DMA_CH6_INT         (INT_NUM_IM2_IRL0 + 6) 
    48 #define LTQ_DMA_CH7_INT         (INT_NUM_IM2_IRL0 + 7) 
    49 #define LTQ_DMA_CH8_INT         (INT_NUM_IM2_IRL0 + 8) 
    50 #define LTQ_DMA_CH9_INT         (INT_NUM_IM2_IRL0 + 9) 
    51 #define LTQ_DMA_CH10_INT        (INT_NUM_IM2_IRL0 + 10) 
    52 #define LTQ_DMA_CH11_INT        (INT_NUM_IM2_IRL0 + 11) 
    53 #define LTQ_DMA_CH12_INT        (INT_NUM_IM2_IRL0 + 25) 
    54 #define LTQ_DMA_CH13_INT        (INT_NUM_IM2_IRL0 + 26) 
    55 #define LTQ_DMA_CH14_INT        (INT_NUM_IM2_IRL0 + 27) 
    56 #define LTQ_DMA_CH15_INT        (INT_NUM_IM2_IRL0 + 28) 
    57 #define LTQ_DMA_CH16_INT        (INT_NUM_IM2_IRL0 + 29) 
    58 #define LTQ_DMA_CH17_INT        (INT_NUM_IM2_IRL0 + 30) 
    59 #define LTQ_DMA_CH18_INT        (INT_NUM_IM2_IRL0 + 16) 
    60 #define LTQ_DMA_CH19_INT        (INT_NUM_IM2_IRL0 + 21) 
     41#define LTQ_DMA_ETOP            ((ltq_is_ase()) ? \ 
     42                                (INT_NUM_IM3_IRL0) : (INT_NUM_IM2_IRL0)) 
    6143 
    6244#define LTQ_PPE_MBOX_INT        (INT_NUM_IM2_IRL0 + 24) 
    6345 
  • arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h

    diff --git a/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h b/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
    index e31f52d..6983d75 100644
    a b  
    8282#define LTQ_PMU_SIZE            0x1000 
    8383 
    8484#define PMU_DMA                 0x0020 
     85#define PMU_EPHY                0x0080 
    8586#define PMU_USB                 0x8041 
    8687#define PMU_LED                 0x0800 
    8788#define PMU_GPT                 0x1000 
     
    9394#define LTQ_ETOP_BASE_ADDR      0x1E180000 
    9495#define LTQ_ETOP_SIZE           0x40000 
    9596 
     97/* GBIT - gigabit switch */ 
     98#define LTQ_GBIT_BASE_ADDR      0x1E108000 
     99#define LTQ_GBIT_SIZE           0x200 
     100 
    96101/* DMA */ 
    97102#define LTQ_DMA_BASE_ADDR       0x1E104100 
    98103#define LTQ_DMA_SIZE            0x800 
    extern void ltq_pmu_enable(unsigned int module); 
    147152extern void ltq_pmu_disable(unsigned int module); 
    148153extern void ltq_cgu_enable(unsigned int clk); 
    149154 
     155static inline int ltq_is_ase(void) 
     156{ 
     157        return (ltq_get_soc_type() == SOC_TYPE_AMAZON_SE); 
     158} 
     159 
    150160static inline int ltq_is_ar9(void) 
    151161{ 
    152162        return (ltq_get_soc_type() == SOC_TYPE_AR9); 
  • arch/mips/lantiq/xway/devices.c

    diff --git a/arch/mips/lantiq/xway/devices.c b/arch/mips/lantiq/xway/devices.c
    index f97e565..eab4644d 100644
    a b void __init ltq_register_ase_asc(void) 
    7474} 
    7575 
    7676/* ethernet */ 
    77 static struct resource ltq_etop_resources = 
    78         MEM_RES("etop", LTQ_ETOP_BASE_ADDR, LTQ_ETOP_SIZE); 
     77static struct resource ltq_etop_resources[] = { 
     78        MEM_RES("etop", LTQ_ETOP_BASE_ADDR, LTQ_ETOP_SIZE), 
     79        MEM_RES("gbit", LTQ_GBIT_BASE_ADDR, LTQ_GBIT_SIZE), 
     80}; 
    7981 
    8082static struct platform_device ltq_etop = { 
    8183        .name           = "ltq_etop", 
    82         .resource       = &ltq_etop_resources, 
     84        .resource       = ltq_etop_resources, 
    8385        .num_resources  = 1, 
    8486}; 
    8587 
    8688void __init 
    8789ltq_register_etop(struct ltq_eth_data *eth) 
    8890{ 
     91        /* only register the gphy on socs that have one */ 
     92        if (ltq_is_ar9() | ltq_is_vr9()) 
     93                ltq_etop.num_resources = 2; 
    8994        if (eth) { 
    9095                ltq_etop.dev.platform_data = eth; 
    9196                platform_device_register(&ltq_etop); 
  • drivers/net/ethernet/lantiq_etop.c

    diff --git a/drivers/net/ethernet/lantiq_etop.c b/drivers/net/ethernet/lantiq_etop.c
    index 0b3567a..d3d4931 100644
    a b  
    7171#define ETOP_MII_REVERSE        0xe 
    7272#define ETOP_PLEN_UNDER         0x40 
    7373#define ETOP_CGEN               0x800 
    74  
    75 /* use 2 static channels for TX/RX */ 
     74#define ETOP_CFG_MII0           0x01 
     75 
     76#define LTQ_GBIT_MDIO_CTL       0xCC 
     77#define LTQ_GBIT_MDIO_DATA      0xd0 
     78#define LTQ_GBIT_GCTL0          0x68 
     79#define LTQ_GBIT_PMAC_HD_CTL    0x8c 
     80#define LTQ_GBIT_P0_CTL         0x4 
     81#define LTQ_GBIT_PMAC_RX_IPG    0xa8 
     82 
     83#define PMAC_HD_CTL_AS          (1 << 19) 
     84#define PMAC_HD_CTL_RXSH        (1 << 22) 
     85 
     86/* Switch Enable (0=disable, 1=enable) */ 
     87#define GCTL0_SE                0x80000000 
     88/* Disable MDIO auto polling (0=disable, 1=enable) */ 
     89#define PX_CTL_DMDIO            0x00400000 
     90 
     91/* register information for the gbit's MDIO bus */ 
     92#define MDIO_XR9_REQUEST        0x00008000 
     93#define MDIO_XR9_READ           0x00000800 
     94#define MDIO_XR9_WRITE          0x00000400 
     95#define MDIO_XR9_REG_MASK       0x1f 
     96#define MDIO_XR9_ADDR_MASK      0x1f 
     97#define MDIO_XR9_RD_MASK        0xffff 
     98#define MDIO_XR9_REG_OFFSET     0 
     99#define MDIO_XR9_ADDR_OFFSET    5 
     100#define MDIO_XR9_WR_OFFSET      16 
     101 
     102/* the newer xway socks have a embedded 3/7 port gbit multiplexer */ 
     103#define ltq_has_gbit()          (ltq_is_ar9() || ltq_is_vr9()) 
     104 
     105/* use 2 static channels for TX/RX 
     106   depending on the SoC we need to use different DMA channels for ethernet */ 
    76107#define LTQ_ETOP_TX_CHANNEL     1 
    77 #define LTQ_ETOP_RX_CHANNEL     6 
     108#define LTQ_ETOP_RX_CHANNEL     ((ltq_is_ase()) ? (5) : \ 
     109                                ((ltq_has_gbit()) ? (0) : (6))) 
     110 
    78111#define IS_TX(x)                (x == LTQ_ETOP_TX_CHANNEL) 
    79112#define IS_RX(x)                (x == LTQ_ETOP_RX_CHANNEL) 
    80113 
     
    83116#define ltq_etop_w32_mask(x, y, z)      \ 
    84117                ltq_w32_mask(x, y, ltq_etop_membase + (z)) 
    85118 
     119#define ltq_gbit_r32(x)         ltq_r32(ltq_gbit_membase + (x)) 
     120#define ltq_gbit_w32(x, y)      ltq_w32(x, ltq_gbit_membase + (y)) 
     121#define ltq_gbit_w32_mask(x, y, z)      \ 
     122                ltq_w32_mask(x, y, ltq_gbit_membase + (z)) 
     123 
    86124#define DRV_VERSION     "1.0" 
    87125 
    88126static void __iomem *ltq_etop_membase; 
     127static void __iomem *ltq_gbit_membase; 
    89128 
    90129struct ltq_etop_chan { 
    91130        int idx; 
    struct ltq_etop_priv { 
    110149        spinlock_t lock; 
    111150}; 
    112151 
     152static int ltq_etop_mdio_wr(struct mii_bus *bus, int phy_addr, 
     153                                int phy_reg, u16 phy_data); 
     154 
    113155static int 
    114156ltq_etop_alloc_skb(struct ltq_etop_chan *ch) 
    115157{ 
    static irqreturn_t 
    211253ltq_etop_dma_irq(int irq, void *_priv) 
    212254{ 
    213255        struct ltq_etop_priv *priv = _priv; 
    214         int ch = irq - LTQ_DMA_CH0_INT; 
     256        int ch = irq - LTQ_DMA_ETOP; 
    215257 
    216258        napi_schedule(&priv->ch[ch].napi); 
    217259        return IRQ_HANDLED; 
    ltq_etop_hw_exit(struct net_device *dev) 
    244286                        ltq_etop_free_channel(dev, &priv->ch[i]); 
    245287} 
    246288 
     289static void 
     290ltq_etop_gbit_init(void) 
     291{ 
     292        ltq_pmu_enable(PMU_SWITCH); 
     293 
     294        ltq_gpio_request(42, 2, 1, "MDIO"); 
     295        ltq_gpio_request(43, 2, 1, "MDC"); 
     296 
     297        ltq_gbit_w32_mask(0, GCTL0_SE, LTQ_GBIT_GCTL0); 
     298        /** Disable MDIO auto polling mode */ 
     299        ltq_gbit_w32_mask(0, PX_CTL_DMDIO, LTQ_GBIT_P0_CTL); 
     300        /* set 1522 packet size */ 
     301        ltq_gbit_w32_mask(0x300, 0, LTQ_GBIT_GCTL0); 
     302        /* disable pmac & dmac headers */ 
     303        ltq_gbit_w32_mask(PMAC_HD_CTL_AS | PMAC_HD_CTL_RXSH, 0, 
     304                LTQ_GBIT_PMAC_HD_CTL); 
     305        /* Due to traffic halt when burst length 8, 
     306                replace default IPG value with 0x3B */ 
     307        ltq_gbit_w32(0x3B, LTQ_GBIT_PMAC_RX_IPG); 
     308} 
     309 
    247310static int 
    248311ltq_etop_hw_init(struct net_device *dev) 
    249312{ 
    250313        struct ltq_etop_priv *priv = netdev_priv(dev); 
     314        unsigned int mii_mode = priv->pldata->mii_mode; 
    251315        int i; 
    252316 
    253317        ltq_pmu_enable(PMU_PPE); 
    254318 
    255         switch (priv->pldata->mii_mode) { 
     319        if (ltq_has_gbit()) { 
     320                ltq_etop_gbit_init(); 
     321                /* force the etops link to the gbit to MII */ 
     322                mii_mode = PHY_INTERFACE_MODE_MII; 
     323        } 
     324 
     325        switch (mii_mode) { 
    256326        case PHY_INTERFACE_MODE_RMII: 
    257327                ltq_etop_w32_mask(ETOP_MII_MASK, 
    258328                        ETOP_MII_REVERSE, LTQ_ETOP_CFG); 
    ltq_etop_hw_init(struct net_device *dev) 
    264334                break; 
    265335 
    266336        default: 
     337                if (ltq_is_ase()) { 
     338                        ltq_pmu_enable(PMU_EPHY); 
     339                        /* disable external MII */ 
     340                        ltq_etop_w32_mask(0, ETOP_CFG_MII0, LTQ_ETOP_CFG); 
     341                        /* enable clock for internal PHY */ 
     342                        ltq_cgu_enable(CGU_EPHY); 
     343                        /* we need to write this magic to the internal phy to 
     344                           make it work */ 
     345                        ltq_etop_mdio_wr(NULL, 0x8, 0x12, 0xC020); 
     346                        pr_info("Selected EPHY mode\n"); 
     347                        break; 
     348                } 
    267349                netdev_err(dev, "unknown mii mode %d\n", 
    268350                        priv->pldata->mii_mode); 
    269351                return -ENOTSUPP; 
    ltq_etop_hw_init(struct net_device *dev) 
    275357        ltq_dma_init_port(DMA_PORT_ETOP); 
    276358 
    277359        for (i = 0; i < MAX_DMA_CHAN; i++) { 
    278                 int irq = LTQ_DMA_CH0_INT + i; 
     360                int irq = LTQ_DMA_ETOP + i; 
    279361                struct ltq_etop_chan *ch = &priv->ch[i]; 
    280362 
    281363                ch->idx = ch->dma.nr = i; 
    static const struct ethtool_ops ltq_etop_ethtool_ops = { 
    339421}; 
    340422 
    341423static int 
     424ltq_etop_mdio_wr_xr9(struct mii_bus *bus, int phy_addr, 
     425                int phy_reg, u16 phy_data) 
     426{ 
     427        u32 val = MDIO_XR9_REQUEST | MDIO_XR9_WRITE | 
     428                (phy_data << MDIO_XR9_WR_OFFSET) | 
     429                ((phy_addr & MDIO_XR9_ADDR_MASK) << MDIO_XR9_ADDR_OFFSET) | 
     430                ((phy_reg & MDIO_XR9_REG_MASK) << MDIO_XR9_REG_OFFSET); 
     431 
     432        while (ltq_gbit_r32(LTQ_GBIT_MDIO_CTL) & MDIO_XR9_REQUEST) 
     433                ; 
     434        ltq_gbit_w32(val, LTQ_GBIT_MDIO_CTL); 
     435        while (ltq_gbit_r32(LTQ_GBIT_MDIO_CTL) & MDIO_XR9_REQUEST) 
     436                ; 
     437        return 0; 
     438} 
     439 
     440static int 
     441ltq_etop_mdio_rd_xr9(struct mii_bus *bus, int phy_addr, int phy_reg) 
     442{ 
     443        u32 val = MDIO_XR9_REQUEST | MDIO_XR9_READ | 
     444                ((phy_addr & MDIO_XR9_ADDR_MASK) << MDIO_XR9_ADDR_OFFSET) | 
     445                ((phy_reg & MDIO_XR9_REG_MASK) << MDIO_XR9_REG_OFFSET); 
     446 
     447        while (ltq_gbit_r32(LTQ_GBIT_MDIO_CTL) & MDIO_XR9_REQUEST) 
     448                ; 
     449        ltq_gbit_w32(val, LTQ_GBIT_MDIO_CTL); 
     450        while (ltq_gbit_r32(LTQ_GBIT_MDIO_CTL) & MDIO_XR9_REQUEST) 
     451                ; 
     452        val = ltq_gbit_r32(LTQ_GBIT_MDIO_DATA) & MDIO_XR9_RD_MASK; 
     453        return val; 
     454} 
     455 
     456static int 
    342457ltq_etop_mdio_wr(struct mii_bus *bus, int phy_addr, int phy_reg, u16 phy_data) 
    343458{ 
    344459        u32 val = MDIO_REQUEST | 
    ltq_etop_mdio_probe(struct net_device *dev) 
    379494{ 
    380495        struct ltq_etop_priv *priv = netdev_priv(dev); 
    381496        struct phy_device *phydev = NULL; 
    382         int phy_addr; 
    383497 
    384         for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) { 
    385                 if (priv->mii_bus->phy_map[phy_addr]) { 
    386                         phydev = priv->mii_bus->phy_map[phy_addr]; 
    387                         break; 
    388                 } 
    389         } 
     498        if (ltq_is_ase()) 
     499                phydev = priv->mii_bus->phy_map[8]; 
     500        else 
     501                phydev = priv->mii_bus->phy_map[0]; 
    390502 
    391503        if (!phydev) { 
    392504                netdev_err(dev, "no PHY found\n"); 
    ltq_etop_mdio_probe(struct net_device *dev) 
    408520                              | SUPPORTED_Autoneg 
    409521                              | SUPPORTED_MII 
    410522                              | SUPPORTED_TP); 
     523        if (ltq_has_gbit()) 
     524                phydev->supported &= SUPPORTED_1000baseT_Half 
     525                                        | SUPPORTED_1000baseT_Full; 
    411526 
    412527        phydev->advertising = phydev->supported; 
    413528        priv->phydev = phydev; 
    ltq_etop_mdio_init(struct net_device *dev) 
    433548        } 
    434549 
    435550        priv->mii_bus->priv = dev; 
    436         priv->mii_bus->read = ltq_etop_mdio_rd; 
    437         priv->mii_bus->write = ltq_etop_mdio_wr; 
     551        if (ltq_has_gbit()) { 
     552                priv->mii_bus->read = ltq_etop_mdio_rd_xr9; 
     553                priv->mii_bus->write = ltq_etop_mdio_wr_xr9; 
     554        } else { 
     555                priv->mii_bus->read = ltq_etop_mdio_rd; 
     556                priv->mii_bus->write = ltq_etop_mdio_wr; 
     557        } 
    438558        priv->mii_bus->name = "ltq_mii"; 
    439559        snprintf(priv->mii_bus->id, MII_BUS_ID_SIZE, "%x", 0); 
    440560        priv->mii_bus->irq = kmalloc(sizeof(int) * PHY_MAX_ADDR, GFP_KERNEL); 
    ltq_etop_tx(struct sk_buff *skb, struct net_device *dev) 
    524644        struct ltq_etop_priv *priv = netdev_priv(dev); 
    525645        struct ltq_etop_chan *ch = &priv->ch[(queue << 1) | 1]; 
    526646        struct ltq_dma_desc *desc = &ch->dma.desc_base[ch->dma.desc]; 
    527         int len; 
    528647        unsigned long flags; 
    529648        u32 byte_offset; 
     649        int len; 
    530650 
    531651        len = skb->len < ETH_ZLEN ? ETH_ZLEN : skb->len; 
    532652 
    ltq_etop_probe(struct platform_device *pdev) 
    700820{ 
    701821        struct net_device *dev; 
    702822        struct ltq_etop_priv *priv; 
    703         struct resource *res; 
     823        struct resource *res, *gbit_res; 
    704824        int err; 
    705825        int i; 
    706826 
    ltq_etop_probe(struct platform_device *pdev) 
    728848                goto err_out; 
    729849        } 
    730850 
     851        if (ltq_has_gbit()) { 
     852                gbit_res = platform_get_resource(pdev, IORESOURCE_MEM, 1); 
     853                if (!gbit_res) { 
     854                        dev_err(&pdev->dev, "failed to get gbit resource\n"); 
     855                        err = -ENOENT; 
     856                        goto err_out; 
     857                } 
     858                ltq_gbit_membase = devm_ioremap_nocache(&pdev->dev, 
     859                        gbit_res->start, resource_size(gbit_res)); 
     860                if (!ltq_gbit_membase) { 
     861                        dev_err(&pdev->dev, "failed to remap gigabit switch %d\n", 
     862                                pdev->id); 
     863                        err = -ENOMEM; 
     864                        goto err_out; 
     865                } 
     866        } 
     867 
    731868        dev = alloc_etherdev_mq(sizeof(struct ltq_etop_priv), 4); 
    732869        strcpy(dev->name, "eth%d"); 
    733870        dev->netdev_ops = &ltq_eth_netdev_ops; 
Note: See TracBrowser for help on using the repository browser.