Ignore:
Timestamp:
2011-07-20T16:46:36+02:00 (5 years ago)
Author:
nbd
Message:

ar71xx: merge ar7240 fixes from trunk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/backfire/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_main.c

    r26985 r27706  
    345345} 
    346346 
     347static void ag71xx_hw_set_macaddr(struct ag71xx *ag, unsigned char *mac) 
     348{ 
     349        u32 t; 
     350 
     351        t = (((u32) mac[5]) << 24) | (((u32) mac[4]) << 16) 
     352          | (((u32) mac[3]) << 8) | ((u32) mac[2]); 
     353 
     354        ag71xx_wr(ag, AG71XX_REG_MAC_ADDR1, t); 
     355 
     356        t = (((u32) mac[1]) << 24) | (((u32) mac[0]) << 16); 
     357        ag71xx_wr(ag, AG71XX_REG_MAC_ADDR2, t); 
     358} 
     359 
     360static void ag71xx_dma_reset(struct ag71xx *ag) 
     361{ 
     362        u32 val; 
     363        int i; 
     364 
     365        ag71xx_dump_dma_regs(ag); 
     366 
     367        /* stop RX and TX */ 
     368        ag71xx_wr(ag, AG71XX_REG_RX_CTRL, 0); 
     369        ag71xx_wr(ag, AG71XX_REG_TX_CTRL, 0); 
     370 
     371        /* 
     372         * give the hardware some time to really stop all rx/tx activity 
     373         * clearing the descriptors too early causes random memory corruption 
     374         */ 
     375        mdelay(1); 
     376 
     377        /* clear descriptor addresses */ 
     378        ag71xx_wr(ag, AG71XX_REG_TX_DESC, 0); 
     379        ag71xx_wr(ag, AG71XX_REG_RX_DESC, 0); 
     380 
     381        /* clear pending RX/TX interrupts */ 
     382        for (i = 0; i < 256; i++) { 
     383                ag71xx_wr(ag, AG71XX_REG_RX_STATUS, RX_STATUS_PR); 
     384                ag71xx_wr(ag, AG71XX_REG_TX_STATUS, TX_STATUS_PS); 
     385        } 
     386 
     387        /* clear pending errors */ 
     388        ag71xx_wr(ag, AG71XX_REG_RX_STATUS, RX_STATUS_BE | RX_STATUS_OF); 
     389        ag71xx_wr(ag, AG71XX_REG_TX_STATUS, TX_STATUS_BE | TX_STATUS_UR); 
     390 
     391        val = ag71xx_rr(ag, AG71XX_REG_RX_STATUS); 
     392        if (val) 
     393                printk(KERN_ALERT "%s: unable to clear DMA Rx status: %08x\n", 
     394                        ag->dev->name, val); 
     395 
     396        val = ag71xx_rr(ag, AG71XX_REG_TX_STATUS); 
     397 
     398        /* mask out reserved bits */ 
     399        val &= ~0xff000000; 
     400 
     401        if (val) 
     402                printk(KERN_ALERT "%s: unable to clear DMA Tx status: %08x\n", 
     403                        ag->dev->name, val); 
     404 
     405        ag71xx_dump_dma_regs(ag); 
     406} 
     407 
     408#define MAC_CFG1_INIT   (MAC_CFG1_RXE | MAC_CFG1_TXE | \ 
     409                         MAC_CFG1_SRX | MAC_CFG1_STX) 
     410 
     411#define FIFO_CFG0_INIT  (FIFO_CFG0_ALL << FIFO_CFG0_ENABLE_SHIFT) 
     412 
     413#define FIFO_CFG4_INIT  (FIFO_CFG4_DE | FIFO_CFG4_DV | FIFO_CFG4_FC | \ 
     414                         FIFO_CFG4_CE | FIFO_CFG4_CR | FIFO_CFG4_LM | \ 
     415                         FIFO_CFG4_LO | FIFO_CFG4_OK | FIFO_CFG4_MC | \ 
     416                         FIFO_CFG4_BC | FIFO_CFG4_DR | FIFO_CFG4_LE | \ 
     417                         FIFO_CFG4_CF | FIFO_CFG4_PF | FIFO_CFG4_UO | \ 
     418                         FIFO_CFG4_VT) 
     419 
     420#define FIFO_CFG5_INIT  (FIFO_CFG5_DE | FIFO_CFG5_DV | FIFO_CFG5_FC | \ 
     421                         FIFO_CFG5_CE | FIFO_CFG5_LO | FIFO_CFG5_OK | \ 
     422                         FIFO_CFG5_MC | FIFO_CFG5_BC | FIFO_CFG5_DR | \ 
     423                         FIFO_CFG5_CF | FIFO_CFG5_PF | FIFO_CFG5_VT | \ 
     424                         FIFO_CFG5_LE | FIFO_CFG5_FT | FIFO_CFG5_16 | \ 
     425                         FIFO_CFG5_17 | FIFO_CFG5_SF) 
     426 
     427static void ag71xx_hw_stop(struct ag71xx *ag) 
     428{ 
     429        /* disable all interrupts and stop the rx engine */ 
     430        ag71xx_wr(ag, AG71XX_REG_INT_ENABLE, 0); 
     431        ag71xx_wr(ag, AG71XX_REG_RX_CTRL, 0); 
     432} 
     433 
     434static void ag71xx_hw_init(struct ag71xx *ag) 
     435{ 
     436        struct ag71xx_platform_data *pdata = ag71xx_get_pdata(ag); 
     437        u32 reset_mask = pdata->reset_bit; 
     438 
     439        ag71xx_hw_stop(ag); 
     440 
     441        if (pdata->is_ar724x) { 
     442                u32 reset_phy = reset_mask; 
     443 
     444                reset_phy &= RESET_MODULE_GE0_PHY | RESET_MODULE_GE1_PHY; 
     445                reset_mask &= ~(RESET_MODULE_GE0_PHY | RESET_MODULE_GE1_PHY); 
     446 
     447                ar71xx_device_stop(reset_phy); 
     448                mdelay(50); 
     449                ar71xx_device_start(reset_phy); 
     450                mdelay(200); 
     451        } 
     452 
     453        ag71xx_sb(ag, AG71XX_REG_MAC_CFG1, MAC_CFG1_SR); 
     454        udelay(20); 
     455 
     456        ar71xx_device_stop(pdata->reset_bit); 
     457        mdelay(100); 
     458        ar71xx_device_start(pdata->reset_bit); 
     459        mdelay(200); 
     460 
     461        /* setup MAC configuration registers */ 
     462        ag71xx_wr(ag, AG71XX_REG_MAC_CFG1, MAC_CFG1_INIT); 
     463 
     464        ag71xx_sb(ag, AG71XX_REG_MAC_CFG2, 
     465                  MAC_CFG2_PAD_CRC_EN | MAC_CFG2_LEN_CHECK); 
     466 
     467        /* setup max frame length */ 
     468        ag71xx_wr(ag, AG71XX_REG_MAC_MFL, AG71XX_TX_MTU_LEN); 
     469 
     470        /* setup MII interface type */ 
     471        ag71xx_mii_ctrl_set_if(ag, pdata->mii_if); 
     472 
     473        /* setup FIFO configuration registers */ 
     474        ag71xx_wr(ag, AG71XX_REG_FIFO_CFG0, FIFO_CFG0_INIT); 
     475        if (pdata->is_ar724x) { 
     476                ag71xx_wr(ag, AG71XX_REG_FIFO_CFG1, pdata->fifo_cfg1); 
     477                ag71xx_wr(ag, AG71XX_REG_FIFO_CFG2, pdata->fifo_cfg2); 
     478        } else { 
     479                ag71xx_wr(ag, AG71XX_REG_FIFO_CFG1, 0x0fff0000); 
     480                ag71xx_wr(ag, AG71XX_REG_FIFO_CFG2, 0x00001fff); 
     481        } 
     482        ag71xx_wr(ag, AG71XX_REG_FIFO_CFG4, FIFO_CFG4_INIT); 
     483        ag71xx_wr(ag, AG71XX_REG_FIFO_CFG5, FIFO_CFG5_INIT); 
     484 
     485        ag71xx_dma_reset(ag); 
     486} 
     487 
     488static void ag71xx_hw_start(struct ag71xx *ag) 
     489{ 
     490        /* start RX engine */ 
     491        ag71xx_wr(ag, AG71XX_REG_RX_CTRL, RX_CTRL_RXE); 
     492 
     493        /* enable interrupts */ 
     494        ag71xx_wr(ag, AG71XX_REG_INT_ENABLE, AG71XX_INT_INIT); 
     495} 
     496 
    347497void ag71xx_link_adjust(struct ag71xx *ag) 
    348498{ 
     
    354504 
    355505        if (!ag->link) { 
     506                ag71xx_hw_stop(ag); 
    356507                netif_carrier_off(ag->dev); 
    357508                if (netif_msg_link(ag)) 
     
    405556        ag71xx_wr(ag, AG71XX_REG_FIFO_CFG5, fifo5); 
    406557        ag71xx_wr(ag, AG71XX_REG_MAC_IFCTL, ifctl); 
     558        ag71xx_hw_start(ag); 
    407559 
    408560        netif_carrier_on(ag->dev); 
     
    432584} 
    433585 
    434 static void ag71xx_hw_set_macaddr(struct ag71xx *ag, unsigned char *mac) 
    435 { 
    436         u32 t; 
    437  
    438         t = (((u32) mac[5]) << 24) | (((u32) mac[4]) << 16) 
    439           | (((u32) mac[3]) << 8) | ((u32) mac[2]); 
    440  
    441         ag71xx_wr(ag, AG71XX_REG_MAC_ADDR1, t); 
    442  
    443         t = (((u32) mac[1]) << 24) | (((u32) mac[0]) << 16); 
    444         ag71xx_wr(ag, AG71XX_REG_MAC_ADDR2, t); 
    445 } 
    446  
    447 static void ag71xx_dma_reset(struct ag71xx *ag) 
    448 { 
    449         u32 val; 
    450         int i; 
    451  
    452         ag71xx_dump_dma_regs(ag); 
    453  
    454         /* stop RX and TX */ 
    455         ag71xx_wr(ag, AG71XX_REG_RX_CTRL, 0); 
    456         ag71xx_wr(ag, AG71XX_REG_TX_CTRL, 0); 
    457  
    458         /* 
    459          * give the hardware some time to really stop all rx/tx activity 
    460          * clearing the descriptors too early causes random memory corruption 
    461          */ 
    462         mdelay(1); 
    463  
    464         /* clear descriptor addresses */ 
    465         ag71xx_wr(ag, AG71XX_REG_TX_DESC, 0); 
    466         ag71xx_wr(ag, AG71XX_REG_RX_DESC, 0); 
    467  
    468         /* clear pending RX/TX interrupts */ 
    469         for (i = 0; i < 256; i++) { 
    470                 ag71xx_wr(ag, AG71XX_REG_RX_STATUS, RX_STATUS_PR); 
    471                 ag71xx_wr(ag, AG71XX_REG_TX_STATUS, TX_STATUS_PS); 
    472         } 
    473  
    474         /* clear pending errors */ 
    475         ag71xx_wr(ag, AG71XX_REG_RX_STATUS, RX_STATUS_BE | RX_STATUS_OF); 
    476         ag71xx_wr(ag, AG71XX_REG_TX_STATUS, TX_STATUS_BE | TX_STATUS_UR); 
    477  
    478         val = ag71xx_rr(ag, AG71XX_REG_RX_STATUS); 
    479         if (val) 
    480                 printk(KERN_ALERT "%s: unable to clear DMA Rx status: %08x\n", 
    481                         ag->dev->name, val); 
    482  
    483         val = ag71xx_rr(ag, AG71XX_REG_TX_STATUS); 
    484  
    485         /* mask out reserved bits */ 
    486         val &= ~0xff000000; 
    487  
    488         if (val) 
    489                 printk(KERN_ALERT "%s: unable to clear DMA Tx status: %08x\n", 
    490                         ag->dev->name, val); 
    491  
    492         ag71xx_dump_dma_regs(ag); 
    493 } 
    494  
    495 #define MAC_CFG1_INIT   (MAC_CFG1_RXE | MAC_CFG1_TXE | \ 
    496                          MAC_CFG1_SRX | MAC_CFG1_STX) 
    497  
    498 #define FIFO_CFG0_INIT  (FIFO_CFG0_ALL << FIFO_CFG0_ENABLE_SHIFT) 
    499  
    500 #define FIFO_CFG4_INIT  (FIFO_CFG4_DE | FIFO_CFG4_DV | FIFO_CFG4_FC | \ 
    501                          FIFO_CFG4_CE | FIFO_CFG4_CR | FIFO_CFG4_LM | \ 
    502                          FIFO_CFG4_LO | FIFO_CFG4_OK | FIFO_CFG4_MC | \ 
    503                          FIFO_CFG4_BC | FIFO_CFG4_DR | FIFO_CFG4_LE | \ 
    504                          FIFO_CFG4_CF | FIFO_CFG4_PF | FIFO_CFG4_UO | \ 
    505                          FIFO_CFG4_VT) 
    506  
    507 #define FIFO_CFG5_INIT  (FIFO_CFG5_DE | FIFO_CFG5_DV | FIFO_CFG5_FC | \ 
    508                          FIFO_CFG5_CE | FIFO_CFG5_LO | FIFO_CFG5_OK | \ 
    509                          FIFO_CFG5_MC | FIFO_CFG5_BC | FIFO_CFG5_DR | \ 
    510                          FIFO_CFG5_CF | FIFO_CFG5_PF | FIFO_CFG5_VT | \ 
    511                          FIFO_CFG5_LE | FIFO_CFG5_FT | FIFO_CFG5_16 | \ 
    512                          FIFO_CFG5_17 | FIFO_CFG5_SF) 
    513  
    514 static void ag71xx_hw_init(struct ag71xx *ag) 
    515 { 
    516         struct ag71xx_platform_data *pdata = ag71xx_get_pdata(ag); 
    517  
    518         ag71xx_sb(ag, AG71XX_REG_MAC_CFG1, MAC_CFG1_SR); 
    519         udelay(20); 
    520  
    521         ar71xx_device_stop(pdata->reset_bit); 
    522         mdelay(100); 
    523         ar71xx_device_start(pdata->reset_bit); 
    524         mdelay(100); 
    525  
    526         /* setup MAC configuration registers */ 
    527         if (pdata->is_ar724x) 
    528                 ag71xx_wr(ag, AG71XX_REG_MAC_CFG1, 
    529                           MAC_CFG1_INIT | MAC_CFG1_TFC | MAC_CFG1_RFC); 
    530         else 
    531                 ag71xx_wr(ag, AG71XX_REG_MAC_CFG1, MAC_CFG1_INIT); 
    532  
    533         ag71xx_sb(ag, AG71XX_REG_MAC_CFG2, 
    534                   MAC_CFG2_PAD_CRC_EN | MAC_CFG2_LEN_CHECK); 
    535  
    536         /* setup max frame length */ 
    537         ag71xx_wr(ag, AG71XX_REG_MAC_MFL, AG71XX_TX_MTU_LEN); 
    538  
    539         /* setup MII interface type */ 
    540         ag71xx_mii_ctrl_set_if(ag, pdata->mii_if); 
    541  
    542         /* setup FIFO configuration registers */ 
    543         ag71xx_wr(ag, AG71XX_REG_FIFO_CFG0, FIFO_CFG0_INIT); 
    544         if (pdata->is_ar724x) { 
    545                 ag71xx_wr(ag, AG71XX_REG_FIFO_CFG1, pdata->fifo_cfg1); 
    546                 ag71xx_wr(ag, AG71XX_REG_FIFO_CFG2, pdata->fifo_cfg2); 
    547         } else { 
    548                 ag71xx_wr(ag, AG71XX_REG_FIFO_CFG1, 0x0fff0000); 
    549                 ag71xx_wr(ag, AG71XX_REG_FIFO_CFG2, 0x00001fff); 
    550         } 
    551         ag71xx_wr(ag, AG71XX_REG_FIFO_CFG4, FIFO_CFG4_INIT); 
    552         ag71xx_wr(ag, AG71XX_REG_FIFO_CFG5, FIFO_CFG5_INIT); 
    553  
    554         ag71xx_dma_reset(ag); 
    555 } 
    556  
    557 static void ag71xx_hw_start(struct ag71xx *ag) 
    558 { 
    559         /* start RX engine */ 
    560         ag71xx_wr(ag, AG71XX_REG_RX_CTRL, RX_CTRL_RXE); 
    561  
    562         /* enable interrupts */ 
    563         ag71xx_wr(ag, AG71XX_REG_INT_ENABLE, AG71XX_INT_INIT); 
    564 } 
    565  
    566 static void ag71xx_hw_stop(struct ag71xx *ag) 
    567 { 
    568         /* disable all interrupts */ 
    569         ag71xx_wr(ag, AG71XX_REG_INT_ENABLE, 0); 
    570  
    571         ag71xx_dma_reset(ag); 
    572 } 
    573  
    574586static int ag71xx_open(struct net_device *dev) 
    575587{ 
     
    591603        ag71xx_hw_set_macaddr(ag, dev->dev_addr); 
    592604 
    593         ag71xx_hw_start(ag); 
    594  
    595605        netif_start_queue(dev); 
    596606 
     
    615625 
    616626        ag71xx_hw_stop(ag); 
     627        ag71xx_dma_reset(ag); 
    617628 
    618629        napi_disable(&ag->napi); 
     
    745756{ 
    746757        struct ag71xx *ag = container_of(work, struct ag71xx, restart_work); 
    747         struct ag71xx_platform_data *pdata = ag71xx_get_pdata(ag); 
    748758 
    749759        ag71xx_stop(ag->dev); 
    750  
    751         if (pdata->is_ar724x) 
    752                 ag71xx_hw_init(ag); 
    753  
    754760        ag71xx_open(ag->dev); 
    755761} 
Note: See TracChangeset for help on using the changeset viewer.