source: trunk/target/linux/brcm47xx/patches-2.6.30/700-ssb-gigabit-ethernet-driver.patch @ 20072

Last change on this file since 20072 was 20072, checked in by hauke, 7 years ago

brcm47xx: fix commit r18413 "128MB ram problem"

The patch commited in r18413 was wrong.
This patch prevents prom_init_mem from scanning over 128MB ram.
This is from #6765 and #3177

Refresh all patches

File size: 10.2 KB
  • drivers/net/tg3.c

    a b  
    4141#include <linux/prefetch.h> 
    4242#include <linux/dma-mapping.h> 
    4343#include <linux/firmware.h> 
     44#include <linux/ssb/ssb_driver_gige.h> 
    4445 
    4546#include <net/checksum.h> 
    4647#include <net/ip.h> 
    static void _tw32_flush(struct tg3 *tp,  
    446447static inline void tw32_mailbox_flush(struct tg3 *tp, u32 off, u32 val) 
    447448{ 
    448449        tp->write32_mbox(tp, off, val); 
    449         if (!(tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER) && 
    450             !(tp->tg3_flags2 & TG3_FLG2_ICH_WORKAROUND)) 
     450        if ((tp->tg3_flags3 & TG3_FLG3_FLUSH_POSTED_WRITES) || 
     451            (!(tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER) && 
     452             !(tp->tg3_flags2 & TG3_FLG2_ICH_WORKAROUND))) 
    451453                tp->read32_mbox(tp, off); 
    452454} 
    453455 
    static void tg3_write32_tx_mbox(struct t 
    457459        writel(val, mbox); 
    458460        if (tp->tg3_flags & TG3_FLAG_TXD_MBOX_HWBUG) 
    459461                writel(val, mbox); 
    460         if (tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER) 
     462        if ((tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER) || (tp->tg3_flags3 & TG3_FLG3_FLUSH_POSTED_WRITES)) 
    461463                readl(mbox); 
    462464} 
    463465 
    static void tg3_switch_clocks(struct tg3 
    729731 
    730732#define PHY_BUSY_LOOPS  5000 
    731733 
    732 static int tg3_readphy(struct tg3 *tp, int reg, u32 *val) 
     734static int __tg3_readphy(struct tg3 *tp, unsigned int phy_addr, int reg, u32 *val) 
    733735{ 
    734736        u32 frame_val; 
    735737        unsigned int loops; 
    static int tg3_readphy(struct tg3 *tp, i 
    743745 
    744746        *val = 0x0; 
    745747 
    746         frame_val  = ((PHY_ADDR << MI_COM_PHY_ADDR_SHIFT) & 
     748        frame_val  = ((phy_addr << MI_COM_PHY_ADDR_SHIFT) & 
    747749                      MI_COM_PHY_ADDR_MASK); 
    748750        frame_val |= ((reg << MI_COM_REG_ADDR_SHIFT) & 
    749751                      MI_COM_REG_ADDR_MASK); 
    static int tg3_readphy(struct tg3 *tp, i 
    778780        return ret; 
    779781} 
    780782 
    781 static int tg3_writephy(struct tg3 *tp, int reg, u32 val) 
     783static int tg3_readphy(struct tg3 *tp, int reg, u32 *val) 
     784{ 
     785        return __tg3_readphy(tp, PHY_ADDR, reg, val); 
     786} 
     787 
     788static int __tg3_writephy(struct tg3 *tp, unsigned int phy_addr, int reg, u32 val) 
    782789{ 
    783790        u32 frame_val; 
    784791        unsigned int loops; 
    static int tg3_writephy(struct tg3 *tp,  
    794801                udelay(80); 
    795802        } 
    796803 
    797         frame_val  = ((PHY_ADDR << MI_COM_PHY_ADDR_SHIFT) & 
     804        frame_val  = ((phy_addr << MI_COM_PHY_ADDR_SHIFT) & 
    798805                      MI_COM_PHY_ADDR_MASK); 
    799806        frame_val |= ((reg << MI_COM_REG_ADDR_SHIFT) & 
    800807                      MI_COM_REG_ADDR_MASK); 
    static int tg3_writephy(struct tg3 *tp,  
    827834        return ret; 
    828835} 
    829836 
     837static int tg3_writephy(struct tg3 *tp, int reg, u32 val) 
     838{ 
     839        return __tg3_writephy(tp, PHY_ADDR, reg, val); 
     840} 
     841 
    830842static int tg3_bmcr_reset(struct tg3 *tp) 
    831843{ 
    832844        u32 phy_control; 
    static int tg3_nvram_read(struct tg3 *tp 
    22622274{ 
    22632275        int ret; 
    22642276 
     2277        if (tp->tg3_flags3 & TG3_FLG3_IS_SSB_CORE) 
     2278                return -ENODEV; 
     2279 
    22652280        if (!(tp->tg3_flags & TG3_FLAG_NVRAM)) 
    22662281                return tg3_nvram_read_using_eeprom(tp, offset, val); 
    22672282 
    static int tg3_set_power_state(struct tg 
    25952610        tg3_frob_aux_power(tp); 
    25962611 
    25972612        /* Workaround for unstable PLL clock */ 
    2598         if ((GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5750_AX) || 
    2599             (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5750_BX)) { 
     2613        if ((tp->phy_id & PHY_ID_MASK) != PHY_ID_BCM5750_2 && 
     2614                                /* !!! FIXME !!! */ 
     2615            ((GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5750_AX) || 
     2616            (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5750_BX))) { 
    26002617                u32 val = tr32(0x7d00); 
    26012618 
    26022619                val &= ~((1 << 16) | (1 << 4) | (1 << 2) | (1 << 1) | 1); 
    relink: 
    30883105 
    30893106                tg3_phy_copper_begin(tp); 
    30903107 
     3108                if (tp->tg3_flags3 & TG3_FLG3_ROBOSWITCH) { 
     3109                        current_link_up = 1; 
     3110                        current_speed = SPEED_1000; //FIXME 
     3111                        current_duplex = DUPLEX_FULL; 
     3112                        tp->link_config.active_speed = current_speed; 
     3113                        tp->link_config.active_duplex = current_duplex; 
     3114                } 
     3115 
    30913116                tg3_readphy(tp, MII_BMSR, &tmp); 
    30923117                if (!tg3_readphy(tp, MII_BMSR, &tmp) && 
    30933118                    (tmp & BMSR_LSTATUS)) 
    static int tg3_poll_fw(struct tg3 *tp) 
    60006025        int i; 
    60016026        u32 val; 
    60026027 
     6028        if (tp->tg3_flags3 & TG3_FLG3_IS_SSB_CORE) { 
     6029                /* We don't use firmware. */ 
     6030                return 0; 
     6031        } 
     6032 
    60036033        if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { 
    60046034                /* Wait up to 20ms for init done. */ 
    60056035                for (i = 0; i < 200; i++) { 
    static int tg3_chip_reset(struct tg3 *tp 
    62566286                tw32(0x5000, 0x400); 
    62576287        } 
    62586288 
     6289        if (tp->tg3_flags3 & TG3_FLG3_IS_SSB_CORE) { 
     6290                /* BCM4785: In order to avoid repercussions from using potentially 
     6291                 * defective internal ROM, stop the Rx RISC CPU, which is not 
     6292                 * required. */ 
     6293                tg3_stop_fw(tp); 
     6294                tg3_halt_cpu(tp, RX_CPU_BASE); 
     6295        } 
     6296 
    62596297        tw32(GRC_MODE, tp->grc_mode); 
    62606298 
    62616299        if (tp->pci_chip_rev_id == CHIPREV_ID_5705_A0) { 
    static int tg3_halt_cpu(struct tg3 *tp,  
    64066444                return -ENODEV; 
    64076445        } 
    64086446 
    6409         /* Clear firmware's nvram arbitration. */ 
    6410         if (tp->tg3_flags & TG3_FLAG_NVRAM) 
    6411                 tw32(NVRAM_SWARB, SWARB_REQ_CLR0); 
     6447        if (!(tp->tg3_flags3 & TG3_FLG3_IS_SSB_CORE)) { 
     6448                /* Clear firmware's nvram arbitration. */ 
     6449                if (tp->tg3_flags & TG3_FLAG_NVRAM) 
     6450                        tw32(NVRAM_SWARB, SWARB_REQ_CLR0); 
     6451        } 
     6452 
    64126453        return 0; 
    64136454} 
    64146455 
    static int tg3_load_5701_a0_firmware_fix 
    64716512        const __be32 *fw_data; 
    64726513        int err, i; 
    64736514 
     6515        if (tp->tg3_flags3 & TG3_FLG3_IS_SSB_CORE) { 
     6516                /* We don't use firmware. */ 
     6517                return 0; 
     6518        } 
     6519 
    64746520        fw_data = (void *)tp->fw->data; 
    64756521 
    64766522        /* Firmware blob starts with version numbers, followed by 
    static int tg3_load_tso_firmware(struct  
    65306576        unsigned long cpu_base, cpu_scratch_base, cpu_scratch_size; 
    65316577        int err, i; 
    65326578 
     6579        if (tp->tg3_flags3 & TG3_FLG3_IS_SSB_CORE) { 
     6580                /* We don't use firmware. */ 
     6581                return 0; 
     6582        } 
     6583 
    65336584        if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) 
    65346585                return 0; 
    65356586 
    static void tg3_timer(unsigned long __op 
    74357486 
    74367487        spin_lock(&tp->lock); 
    74377488 
     7489        if (tp->tg3_flags3 & TG3_FLG3_FLUSH_POSTED_WRITES) { 
     7490                /* BCM4785: Flush posted writes from GbE to host memory. */ 
     7491                tr32(HOSTCC_MODE); 
     7492        } 
     7493 
    74387494        if (!(tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)) { 
    74397495                /* All of this garbage is because when using non-tagged 
    74407496                 * IRQ status the mailbox/status_block protocol the chip 
    static int tg3_test_nvram(struct tg3 *tp 
    92019257        __be32 *buf; 
    92029258        int i, j, k, err = 0, size; 
    92039259 
     9260        if (tp->tg3_flags3 & TG3_FLG3_IS_SSB_CORE) { 
     9261                /* We don't have NVRAM. */ 
     9262                return 0; 
     9263        } 
     9264 
    92049265        if (tg3_nvram_read(tp, 0, &magic) != 0) 
    92059266                return -EIO; 
    92069267 
    static int tg3_ioctl(struct net_device * 
    999410055                        return -EAGAIN; 
    999510056 
    999610057                spin_lock_bh(&tp->lock); 
    9997                 err = tg3_readphy(tp, data->reg_num & 0x1f, &mii_regval); 
     10058                err = __tg3_readphy(tp, data->phy_id & 0x1f, data->reg_num & 0x1f, &mii_regval); 
    999810059                spin_unlock_bh(&tp->lock); 
    999910060 
    1000010061                data->val_out = mii_regval; 
    static int tg3_ioctl(struct net_device * 
    1001310074                        return -EAGAIN; 
    1001410075 
    1001510076                spin_lock_bh(&tp->lock); 
    10016                 err = tg3_writephy(tp, data->reg_num & 0x1f, data->val_in); 
     10077                err = __tg3_writephy(tp, data->phy_id & 0x1f, data->reg_num & 0x1f, data->val_in); 
    1001710078                spin_unlock_bh(&tp->lock); 
    1001810079 
    1001910080                return err; 
    static void __devinit tg3_get_57780_nvra 
    1060110662/* Chips other than 5700/5701 use the NVRAM for fetching info. */ 
    1060210663static void __devinit tg3_nvram_init(struct tg3 *tp) 
    1060310664{ 
     10665        if (tp->tg3_flags3 & TG3_FLG3_IS_SSB_CORE) { 
     10666                /* No NVRAM and EEPROM on the SSB Broadcom GigE core. */ 
     10667                tp->tg3_flags &= ~(TG3_FLAG_NVRAM | TG3_FLAG_NVRAM_BUFFERED); 
     10668                return; 
     10669        } 
     10670 
    1060410671        tw32_f(GRC_EEPROM_ADDR, 
    1060510672             (EEPROM_ADDR_FSM_RESET | 
    1060610673              (EEPROM_DEFAULT_CLOCK_PERIOD << 
    static int tg3_nvram_write_block(struct  
    1085910926{ 
    1086010927        int ret; 
    1086110928 
     10929        if (tp->tg3_flags3 & TG3_FLG3_IS_SSB_CORE) 
     10930                return -ENODEV; 
     10931 
    1086210932        if (tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT) { 
    1086310933                tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl & 
    1086410934                       ~GRC_LCLCTRL_GPIO_OUTPUT1); 
    static int __devinit tg3_get_invariants( 
    1209912169              GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701))) 
    1210012170                tp->tg3_flags |= TG3_FLAG_SRAM_USE_CONFIG; 
    1210112171 
     12172        if (tp->tg3_flags3 & TG3_FLG3_FLUSH_POSTED_WRITES) { 
     12173                tp->write32_tx_mbox = tg3_write_flush_reg32; 
     12174                tp->write32_rx_mbox = tg3_write_flush_reg32; 
     12175        } 
     12176 
    1210212177        /* Get eeprom hw config before calling tg3_set_power_state(). 
    1210312178         * In particular, the TG3_FLG2_IS_NIC flag must be 
    1210412179         * determined before calling tg3_set_power_state() so that 
    static int __devinit tg3_get_device_addr 
    1247412549        } 
    1247512550 
    1247612551        if (!is_valid_ether_addr(&dev->dev_addr[0])) { 
     12552                if (tp->tg3_flags3 & TG3_FLG3_IS_SSB_CORE) 
     12553                        ssb_gige_get_macaddr(tp->pdev, &dev->dev_addr[0]); 
     12554        } 
     12555        if (!is_valid_ether_addr(&dev->dev_addr[0])) { 
    1247712556#ifdef CONFIG_SPARC 
    1247812557                if (!tg3_get_default_macaddr_sparc(tp)) 
    1247912558                        return 0; 
    static char * __devinit tg3_phy_string(s 
    1296513044        case PHY_ID_BCM5704:    return "5704"; 
    1296613045        case PHY_ID_BCM5705:    return "5705"; 
    1296713046        case PHY_ID_BCM5750:    return "5750"; 
     13047        case PHY_ID_BCM5750_2:  return "5750-2"; 
    1296813048        case PHY_ID_BCM5752:    return "5752"; 
    1296913049        case PHY_ID_BCM5714:    return "5714"; 
    1297013050        case PHY_ID_BCM5780:    return "5780"; 
    static int __devinit tg3_init_one(struct 
    1317513255                tp->msg_enable = tg3_debug; 
    1317613256        else 
    1317713257                tp->msg_enable = TG3_DEF_MSG_ENABLE; 
     13258        if (pdev_is_ssb_gige_core(pdev)) { 
     13259                tp->tg3_flags3 |= TG3_FLG3_IS_SSB_CORE; 
     13260                if (ssb_gige_must_flush_posted_writes(pdev)) 
     13261                        tp->tg3_flags3 |= TG3_FLG3_FLUSH_POSTED_WRITES; 
     13262                if (ssb_gige_have_roboswitch(pdev)) 
     13263                        tp->tg3_flags3 |= TG3_FLG3_ROBOSWITCH; 
     13264        } 
    1317813265 
    1317913266        /* The word/byte swap controls here control register access byte 
    1318013267         * swapping.  DMA data byte swapping is controlled in the GRC_MODE 
  • drivers/net/tg3.h

    a b  
    18491849#define  NIC_SRAM_RGMII_STD_IBND_DISABLE 0x00000004 
    18501850#define  NIC_SRAM_RGMII_EXT_IBND_RX_EN   0x00000008 
    18511851#define  NIC_SRAM_RGMII_EXT_IBND_TX_EN   0x00000010 
     1852#define TG3_FLG3_IS_SSB_CORE            0x00000800 
     1853#define TG3_FLG3_FLUSH_POSTED_WRITES    0x00001000 
     1854#define TG3_FLG3_ROBOSWITCH             0x00002000 
    18521855 
    18531856#define NIC_SRAM_RX_MINI_BUFFER_DESC    0x00001000 
    18541857 
    struct tg3 { 
    26952698#define PHY_ID_BCM5714                  0x60008340 
    26962699#define PHY_ID_BCM5780                  0x60008350 
    26972700#define PHY_ID_BCM5755                  0xbc050cc0 
     2701#define PHY_ID_BCM5750_2                0xbc050cd0 
    26982702#define PHY_ID_BCM5787                  0xbc050ce0 
    26992703#define PHY_ID_BCM5756                  0xbc050ed0 
    27002704#define PHY_ID_BCM5784                  0xbc050fa0 
    struct tg3 { 
    27392743         (X) == PHY_ID_BCM5780 || (X) == PHY_ID_BCM5787 || \ 
    27402744         (X) == PHY_ID_BCM5755 || (X) == PHY_ID_BCM5756 || \ 
    27412745         (X) == PHY_ID_BCM5906 || (X) == PHY_ID_BCM5761 || \ 
    2742          (X) == PHY_ID_BCM8002) 
     2746         (X) == PHY_ID_BCM8002 || (X) == PHY_ID_BCM5750_2) 
    27432747 
    27442748        struct tg3_hw_stats             *hw_stats; 
    27452749        dma_addr_t                      stats_mapping; 
Note: See TracBrowser for help on using the repository browser.