Annotation of qemu/roms/ipxe/src/drivers/net/tg3.c, revision 1.1.1.1

1.1       root        1: /* $Id$
                      2:  * tg3.c: Broadcom Tigon3 ethernet driver.
                      3:  *
                      4:  * Copyright (C) 2001, 2002 David S. Miller ([email protected])
                      5:  * Copyright (C) 2001, 2002 Jeff Garzik ([email protected])
                      6:  * Copyright (C) 2003 Eric Biederman ([email protected])  [etherboot port]
                      7:  */
                      8: 
                      9: FILE_LICENCE ( GPL2_ONLY );
                     10: 
                     11: /* 11-13-2003  timlegge        Fix Issue with NetGear GA302T 
                     12:  * 11-18-2003   ebiederm        Generalize NetGear Fix to what the code was supposed to be.
                     13:  * 01-06-2005   Alf (Frederic Olivie) Add Dell bcm 5751 (0x1677) support
                     14:  * 04-15-2005   Martin Vogt Add Fujitsu Siemens Computer (FSC) 0x1734 bcm 5751 0x105d support
                     15:  */
                     16: 
                     17: #include "etherboot.h"
                     18: #include "nic.h"
                     19: #include <errno.h>
                     20: #include <ipxe/pci.h>
                     21: #include <ipxe/ethernet.h>
                     22: #include "string.h"
                     23: #include <mii.h>
                     24: #include "tg3.h"
                     25: 
                     26: #define SUPPORT_COPPER_PHY  1
                     27: #define SUPPORT_FIBER_PHY   1
                     28: #define SUPPORT_LINK_REPORT 1
                     29: #define SUPPORT_PARTNO_STR  1
                     30: #define SUPPORT_PHY_STR     1
                     31: 
                     32: static struct tg3 tg3;
                     33: 
                     34: /* These numbers seem to be hard coded in the NIC firmware somehow.
                     35:  * You can't change the ring sizes, but you can change where you place
                     36:  * them in the NIC onboard memory.
                     37:  */
                     38: #define TG3_RX_RING_SIZE               512
                     39: #define TG3_DEF_RX_RING_PENDING                20      /* RX_RING_PENDING seems to be o.k. at 20 and 200 */
                     40: #define TG3_RX_RCB_RING_SIZE   1024
                     41: 
                     42: /*     (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 ? \
                     43:         512 : 1024) */
                     44: #define TG3_TX_RING_SIZE               512
                     45: #define TG3_DEF_TX_RING_PENDING                (TG3_TX_RING_SIZE - 1)
                     46: 
                     47: #define TG3_RX_RING_BYTES      (sizeof(struct tg3_rx_buffer_desc) * TG3_RX_RING_SIZE)
                     48: #define TG3_RX_RCB_RING_BYTES  (sizeof(struct tg3_rx_buffer_desc) * TG3_RX_RCB_RING_SIZE)
                     49: 
                     50: #define TG3_TX_RING_BYTES      (sizeof(struct tg3_tx_buffer_desc) * TG3_TX_RING_SIZE)
                     51: #define NEXT_TX(N)             (((N) + 1) & (TG3_TX_RING_SIZE - 1))
                     52: #define PREV_TX(N)             (((N) - 1) & (TG3_TX_RING_SIZE - 1))
                     53: 
                     54: #define RX_PKT_BUF_SZ          (1536 + 2 + 64)
                     55: 
                     56: struct eth_frame {
                     57:        uint8_t  dst_addr[ETH_ALEN];
                     58:        uint8_t  src_addr[ETH_ALEN];
                     59:        uint16_t type;
                     60:        uint8_t  data [ETH_FRAME_LEN - ETH_HLEN];
                     61: };
                     62: 
                     63: struct bss {
                     64:        struct tg3_rx_buffer_desc rx_std[TG3_RX_RING_SIZE];
                     65:        struct tg3_rx_buffer_desc rx_rcb[TG3_RX_RCB_RING_SIZE];
                     66:        struct tg3_tx_buffer_desc tx_ring[TG3_TX_RING_SIZE];
                     67:        struct tg3_hw_status      hw_status;
                     68:        struct tg3_hw_stats       hw_stats;
                     69:        unsigned char             rx_bufs[TG3_DEF_RX_RING_PENDING][RX_PKT_BUF_SZ];
                     70:        struct eth_frame          tx_frame[2];
                     71: } tg3_bss __shared;
                     72: 
                     73: /**
                     74:  * pci_save_state - save the PCI configuration space of a device before suspending
                     75:  * @dev: - PCI device that we're dealing with
                     76:  * @buffer: - buffer to hold config space context
                     77:  *
                     78:  * @buffer must be large enough to hold the entire PCI 2.2 config space 
                     79:  * (>= 64 bytes).
                     80:  */
                     81: static int pci_save_state(struct pci_device *dev, uint32_t *buffer)
                     82: {
                     83:        int i;
                     84:        for (i = 0; i < 16; i++)
                     85:                pci_read_config_dword(dev, i * 4,&buffer[i]);
                     86:        return 0;
                     87: }
                     88: 
                     89: /** 
                     90:  * pci_restore_state - Restore the saved state of a PCI device
                     91:  * @dev: - PCI device that we're dealing with
                     92:  * @buffer: - saved PCI config space
                     93:  *
                     94:  */
                     95: static int pci_restore_state(struct pci_device *dev, uint32_t *buffer)
                     96: {
                     97:        int i;
                     98: 
                     99:        for (i = 0; i < 16; i++)
                    100:                pci_write_config_dword(dev,i * 4, buffer[i]);
                    101:        return 0;
                    102: }
                    103: 
                    104: static void tg3_write_indirect_reg32(uint32_t off, uint32_t val)
                    105: {
                    106:        pci_write_config_dword(tg3.pdev, TG3PCI_REG_BASE_ADDR, off);
                    107:        pci_write_config_dword(tg3.pdev, TG3PCI_REG_DATA, val);
                    108: }
                    109: 
                    110: #define tw32(reg,val)          tg3_write_indirect_reg32((reg),(val))
                    111: #define tw32_mailbox(reg, val) writel(((val) & 0xffffffff), tg3.regs + (reg))
                    112: #define tw16(reg,val)          writew(((val) & 0xffff), tg3.regs + (reg))
                    113: #define tw8(reg,val)           writeb(((val) & 0xff), tg3.regs + (reg))
                    114: #define tr32(reg)              readl(tg3.regs + (reg))
                    115: #define tr16(reg)              readw(tg3.regs + (reg))
                    116: #define tr8(reg)               readb(tg3.regs + (reg))
                    117: 
                    118: static void tw32_carefully(uint32_t reg, uint32_t val)
                    119: {
                    120:        tw32(reg, val);
                    121:        tr32(reg);
                    122:        udelay(100);
                    123: }
                    124: 
                    125: static void tw32_mailbox2(uint32_t reg, uint32_t val)
                    126: {
                    127:        tw32_mailbox(reg, val);
                    128:        tr32(reg);
                    129: }
                    130: 
                    131: static void tg3_write_mem(uint32_t off, uint32_t val)
                    132: {
                    133:        pci_write_config_dword(tg3.pdev, TG3PCI_MEM_WIN_BASE_ADDR, off);
                    134:        pci_write_config_dword(tg3.pdev, TG3PCI_MEM_WIN_DATA, val);
                    135: 
                    136:        /* Always leave this as zero. */
                    137:        pci_write_config_dword(tg3.pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0);
                    138: }
                    139: 
                    140: static void tg3_read_mem(uint32_t off, uint32_t *val)
                    141: {
                    142:        pci_write_config_dword(tg3.pdev, TG3PCI_MEM_WIN_BASE_ADDR, off);
                    143:        pci_read_config_dword(tg3.pdev, TG3PCI_MEM_WIN_DATA, val);
                    144: 
                    145:        /* Always leave this as zero. */
                    146:        pci_write_config_dword(tg3.pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0);
                    147: }
                    148: 
                    149: static void tg3_disable_ints(struct tg3 *tp)
                    150: {
                    151:        tw32(TG3PCI_MISC_HOST_CTRL,
                    152:             (tp->misc_host_ctrl | MISC_HOST_CTRL_MASK_PCI_INT));
                    153:        tw32_mailbox2(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001);
                    154: }
                    155: 
                    156: static void tg3_switch_clocks(struct tg3 *tp)
                    157: {
                    158:        uint32_t orig_clock_ctrl, clock_ctrl;
                    159: 
                    160:        clock_ctrl = tr32(TG3PCI_CLOCK_CTRL);
                    161: 
                    162:        orig_clock_ctrl = clock_ctrl;
                    163:        clock_ctrl &= (CLOCK_CTRL_FORCE_CLKRUN | CLOCK_CTRL_CLKRUN_OENABLE | 0x1f);
                    164:        tp->pci_clock_ctrl = clock_ctrl;
                    165:        
                    166:        if ((GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) &&
                    167:            (!((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750)
                    168:               && (tp->tg3_flags & TG3_FLAG_ENABLE_ASF))) &&
                    169:                (orig_clock_ctrl & CLOCK_CTRL_44MHZ_CORE)!=0) {
                    170:                tw32_carefully(TG3PCI_CLOCK_CTRL, 
                    171:                        clock_ctrl | (CLOCK_CTRL_44MHZ_CORE | CLOCK_CTRL_ALTCLK));
                    172:                tw32_carefully(TG3PCI_CLOCK_CTRL, 
                    173:                        clock_ctrl | (CLOCK_CTRL_ALTCLK));
                    174:        }
                    175:        tw32_carefully(TG3PCI_CLOCK_CTRL, clock_ctrl);
                    176: }
                    177: 
                    178: #define PHY_BUSY_LOOPS 5000
                    179: 
                    180: static int tg3_readphy(struct tg3 *tp, int reg, uint32_t *val)
                    181: {
                    182:        uint32_t frame_val;
                    183:        int loops, ret;
                    184: 
                    185:        tw32_carefully(MAC_MI_MODE, tp->mi_mode & ~MAC_MI_MODE_AUTO_POLL);
                    186: 
                    187:        *val = 0xffffffff;
                    188: 
                    189:        frame_val  = ((PHY_ADDR << MI_COM_PHY_ADDR_SHIFT) &
                    190:                      MI_COM_PHY_ADDR_MASK);
                    191:        frame_val |= ((reg << MI_COM_REG_ADDR_SHIFT) &
                    192:                      MI_COM_REG_ADDR_MASK);
                    193:        frame_val |= (MI_COM_CMD_READ | MI_COM_START);
                    194:        
                    195:        tw32_carefully(MAC_MI_COM, frame_val);
                    196: 
                    197:        loops = PHY_BUSY_LOOPS;
                    198:        while (loops-- > 0) {
                    199:                udelay(10);
                    200:                frame_val = tr32(MAC_MI_COM);
                    201: 
                    202:                if ((frame_val & MI_COM_BUSY) == 0) {
                    203:                        udelay(5);
                    204:                        frame_val = tr32(MAC_MI_COM);
                    205:                        break;
                    206:                }
                    207:        }
                    208: 
                    209:        ret = -EBUSY;
                    210:        if (loops > 0) {
                    211:                *val = frame_val & MI_COM_DATA_MASK;
                    212:                ret = 0;
                    213:        }
                    214: 
                    215:        tw32_carefully(MAC_MI_MODE, tp->mi_mode);
                    216: 
                    217:        return ret;
                    218: }
                    219: 
                    220: static int tg3_writephy(struct tg3 *tp, int reg, uint32_t val)
                    221: {
                    222:        uint32_t frame_val;
                    223:        int loops, ret;
                    224: 
                    225:        tw32_carefully(MAC_MI_MODE, tp->mi_mode & ~MAC_MI_MODE_AUTO_POLL);
                    226: 
                    227:        frame_val  = ((PHY_ADDR << MI_COM_PHY_ADDR_SHIFT) &
                    228:                      MI_COM_PHY_ADDR_MASK);
                    229:        frame_val |= ((reg << MI_COM_REG_ADDR_SHIFT) &
                    230:                      MI_COM_REG_ADDR_MASK);
                    231:        frame_val |= (val & MI_COM_DATA_MASK);
                    232:        frame_val |= (MI_COM_CMD_WRITE | MI_COM_START);
                    233:        
                    234:        tw32_carefully(MAC_MI_COM, frame_val);
                    235: 
                    236:        loops = PHY_BUSY_LOOPS;
                    237:        while (loops-- > 0) {
                    238:                udelay(10);
                    239:                frame_val = tr32(MAC_MI_COM);
                    240:                if ((frame_val & MI_COM_BUSY) == 0) {
                    241:                        udelay(5);
                    242:                        frame_val = tr32(MAC_MI_COM);
                    243:                        break;
                    244:                }
                    245:        }
                    246: 
                    247:        ret = -EBUSY;
                    248:        if (loops > 0)
                    249:                ret = 0;
                    250: 
                    251:        tw32_carefully(MAC_MI_MODE, tp->mi_mode);
                    252: 
                    253:        return ret;
                    254: }
                    255: 
                    256: static int tg3_writedsp(struct tg3 *tp, uint16_t addr, uint16_t val)
                    257: {
                    258:        int err;
                    259:        err  = tg3_writephy(tp, MII_TG3_DSP_ADDRESS, addr);
                    260:        err |= tg3_writephy(tp, MII_TG3_DSP_RW_PORT, val);
                    261:        return err;
                    262: }
                    263: 
                    264: 
                    265: static void tg3_phy_set_wirespeed(struct tg3 *tp)
                    266: {
                    267:        uint32_t val;
                    268: 
                    269:        if (tp->tg3_flags2 & TG3_FLG2_NO_ETH_WIRE_SPEED)
                    270:                return;
                    271: 
                    272:        tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x7007);
                    273:        tg3_readphy(tp, MII_TG3_AUX_CTRL, &val);
                    274:        tg3_writephy(tp, MII_TG3_AUX_CTRL, (val | (1 << 15) | (1 << 4)));
                    275: }
                    276: 
                    277: static int tg3_bmcr_reset(struct tg3 *tp)
                    278: {
                    279:        uint32_t phy_control;
                    280:        int limit, err;
                    281: 
                    282:        /* OK, reset it, and poll the BMCR_RESET bit until it
                    283:         * clears or we time out.
                    284:         */
                    285:        phy_control = BMCR_RESET;
                    286:        err = tg3_writephy(tp, MII_BMCR, phy_control);
                    287:        if (err != 0)
                    288:                return -EBUSY;
                    289: 
                    290:        limit = 5000;
                    291:        while (limit--) {
                    292:                err = tg3_readphy(tp, MII_BMCR, &phy_control);
                    293:                if (err != 0)
                    294:                        return -EBUSY;
                    295: 
                    296:                if ((phy_control & BMCR_RESET) == 0) {
                    297:                        udelay(40);
                    298:                        break;
                    299:                }
                    300:                udelay(10);
                    301:        }
                    302:        if (limit <= 0)
                    303:                return -EBUSY;
                    304: 
                    305:        return 0;
                    306: }
                    307: 
                    308: static int tg3_wait_macro_done(struct tg3 *tp)
                    309: {
                    310:        int limit = 100;
                    311: 
                    312:        while (limit--) {
                    313:                uint32_t tmp32;
                    314: 
                    315:                tg3_readphy(tp, 0x16, &tmp32);
                    316:                if ((tmp32 & 0x1000) == 0)
                    317:                        break;
                    318:        }
                    319:        if (limit <= 0)
                    320:                return -EBUSY;
                    321: 
                    322:        return 0;
                    323: }
                    324: 
                    325: static int tg3_phy_write_and_check_testpat(struct tg3 *tp, int *resetp)
                    326: {
                    327:        static const uint32_t test_pat[4][6] = {
                    328:        { 0x00005555, 0x00000005, 0x00002aaa, 0x0000000a, 0x00003456, 0x00000003 },
                    329:        { 0x00002aaa, 0x0000000a, 0x00003333, 0x00000003, 0x0000789a, 0x00000005 },
                    330:        { 0x00005a5a, 0x00000005, 0x00002a6a, 0x0000000a, 0x00001bcd, 0x00000003 },
                    331:        { 0x00002a5a, 0x0000000a, 0x000033c3, 0x00000003, 0x00002ef1, 0x00000005 }
                    332:        };
                    333:        int chan;
                    334: 
                    335:        for (chan = 0; chan < 4; chan++) {
                    336:                int i;
                    337: 
                    338:                tg3_writephy(tp, MII_TG3_DSP_ADDRESS,
                    339:                        (chan * 0x2000) | 0x0200);
                    340:                tg3_writephy(tp, 0x16, 0x0002);
                    341: 
                    342:                for (i = 0; i < 6; i++)
                    343:                        tg3_writephy(tp, MII_TG3_DSP_RW_PORT,
                    344:                                test_pat[chan][i]);
                    345: 
                    346:                tg3_writephy(tp, 0x16, 0x0202);
                    347:                if (tg3_wait_macro_done(tp)) {
                    348:                        *resetp = 1;
                    349:                        return -EBUSY;
                    350:                }
                    351: 
                    352:                tg3_writephy(tp, MII_TG3_DSP_ADDRESS,
                    353:                             (chan * 0x2000) | 0x0200);
                    354:                tg3_writephy(tp, 0x16, 0x0082);
                    355:                if (tg3_wait_macro_done(tp)) {
                    356:                        *resetp = 1;
                    357:                        return -EBUSY;
                    358:                }
                    359: 
                    360:                tg3_writephy(tp, 0x16, 0x0802);
                    361:                if (tg3_wait_macro_done(tp)) {
                    362:                        *resetp = 1;
                    363:                        return -EBUSY;
                    364:                }
                    365: 
                    366:                for (i = 0; i < 6; i += 2) {
                    367:                        uint32_t low, high;
                    368: 
                    369:                        tg3_readphy(tp, MII_TG3_DSP_RW_PORT, &low);
                    370:                        tg3_readphy(tp, MII_TG3_DSP_RW_PORT, &high);
                    371:                        if (tg3_wait_macro_done(tp)) {
                    372:                                *resetp = 1;
                    373:                                return -EBUSY;
                    374:                        }
                    375:                        low &= 0x7fff;
                    376:                        high &= 0x000f;
                    377:                        if (low != test_pat[chan][i] ||
                    378:                            high != test_pat[chan][i+1]) {
                    379:                                tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x000b);
                    380:                                tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x4001);
                    381:                                tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x4005);
                    382: 
                    383:                                return -EBUSY;
                    384:                        }
                    385:                }
                    386:        }
                    387: 
                    388:        return 0;
                    389: }
                    390: 
                    391: static int tg3_phy_reset_chanpat(struct tg3 *tp)
                    392: {
                    393:        int chan;
                    394: 
                    395:        for (chan = 0; chan < 4; chan++) {
                    396:                int i;
                    397: 
                    398:                tg3_writephy(tp, MII_TG3_DSP_ADDRESS,
                    399:                             (chan * 0x2000) | 0x0200);
                    400:                tg3_writephy(tp, 0x16, 0x0002);
                    401:                for (i = 0; i < 6; i++)
                    402:                        tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x000);
                    403:                tg3_writephy(tp, 0x16, 0x0202);
                    404:                if (tg3_wait_macro_done(tp))
                    405:                        return -EBUSY;
                    406:        }
                    407: 
                    408:        return 0;
                    409: }
                    410: 
                    411: static int tg3_phy_reset_5703_4_5(struct tg3 *tp)
                    412: {
                    413:        uint32_t reg32, phy9_orig;
                    414:        int retries, do_phy_reset, err;
                    415: 
                    416:        retries = 10;
                    417:        do_phy_reset = 1;
                    418:        do {
                    419:                if (do_phy_reset) {
                    420:                        err = tg3_bmcr_reset(tp);
                    421:                        if (err)
                    422:                                return err;
                    423:                        do_phy_reset = 0;
                    424:                }
                    425:                
                    426:                /* Disable transmitter and interrupt.  */
                    427:                tg3_readphy(tp, MII_TG3_EXT_CTRL, &reg32);
                    428:                reg32 |= 0x3000;
                    429:                tg3_writephy(tp, MII_TG3_EXT_CTRL, reg32);
                    430: 
                    431:                /* Set full-duplex, 1000 mbps.  */
                    432:                tg3_writephy(tp, MII_BMCR,
                    433:                        BMCR_FULLDPLX | TG3_BMCR_SPEED1000);
                    434: 
                    435:                /* Set to master mode.  */
                    436:                tg3_readphy(tp, MII_TG3_CTRL, &phy9_orig);
                    437:                tg3_writephy(tp, MII_TG3_CTRL,
                    438:                        (MII_TG3_CTRL_AS_MASTER |
                    439:                                MII_TG3_CTRL_ENABLE_AS_MASTER));
                    440: 
                    441:                /* Enable SM_DSP_CLOCK and 6dB.  */
                    442:                tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0c00);
                    443: 
                    444:                /* Block the PHY control access.  */
                    445:                tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x8005);
                    446:                tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x0800);
                    447: 
                    448:                err = tg3_phy_write_and_check_testpat(tp, &do_phy_reset);
                    449:                if (!err)
                    450:                        break;
                    451:        } while (--retries);
                    452: 
                    453:        err = tg3_phy_reset_chanpat(tp);
                    454:        if (err)
                    455:                return err;
                    456: 
                    457:        tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x8005);
                    458:        tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x0000);
                    459: 
                    460:        tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x8200);
                    461:        tg3_writephy(tp, 0x16, 0x0000);
                    462: 
                    463:        tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0400);
                    464: 
                    465:        tg3_writephy(tp, MII_TG3_CTRL, phy9_orig);
                    466: 
                    467:        tg3_readphy(tp, MII_TG3_EXT_CTRL, &reg32);
                    468:        reg32 &= ~0x3000;
                    469:        tg3_writephy(tp, MII_TG3_EXT_CTRL, reg32);
                    470: 
                    471:        return err;
                    472: }
                    473: 
                    474: /* This will reset the tigon3 PHY if there is no valid
                    475:  * link.
                    476:  */
                    477: static int tg3_phy_reset(struct tg3 *tp)
                    478: {
                    479:        uint32_t phy_status;
                    480:        int err;
                    481: 
                    482:        err  = tg3_readphy(tp, MII_BMSR, &phy_status);
                    483:        err |= tg3_readphy(tp, MII_BMSR, &phy_status);
                    484:        if (err != 0)
                    485:                return -EBUSY;
                    486: 
                    487:        if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703) ||
                    488:                (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) ||
                    489:                (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705)) {
                    490:                err = tg3_phy_reset_5703_4_5(tp);
                    491:                if (err)
                    492:                        return err;
                    493:                goto out;
                    494:        }
                    495:        if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) {
                    496:          // Taken from Broadcom's source code
                    497:          tg3_writephy(tp, 0x18, 0x0c00);
                    498:          tg3_writephy(tp, 0x17, 0x000a);
                    499:          tg3_writephy(tp, 0x15, 0x310b);
                    500:          tg3_writephy(tp, 0x17, 0x201f);
                    501:          tg3_writephy(tp, 0x15, 0x9506);
                    502:          tg3_writephy(tp, 0x17, 0x401f);
                    503:          tg3_writephy(tp, 0x15, 0x14e2);
                    504:          tg3_writephy(tp, 0x18, 0x0400);
                    505:        }
                    506:        err = tg3_bmcr_reset(tp);
                    507:        if (err)
                    508:                return err;
                    509:  out:
                    510:        tg3_phy_set_wirespeed(tp);
                    511:        return 0;
                    512: }
                    513: 
                    514: static void tg3_set_power_state_0(struct tg3 *tp)
                    515: {
                    516:        uint16_t power_control;
                    517:        int pm = tp->pm_cap;
                    518: 
                    519:        /* Make sure register accesses (indirect or otherwise)
                    520:         * will function correctly.
                    521:         */
                    522:        pci_write_config_dword(tp->pdev,  TG3PCI_MISC_HOST_CTRL, tp->misc_host_ctrl);
                    523: 
                    524:        pci_read_config_word(tp->pdev, pm + PCI_PM_CTRL, &power_control);
                    525: 
                    526:        power_control |= PCI_PM_CTRL_PME_STATUS;
                    527:        power_control &= ~(PCI_PM_CTRL_STATE_MASK);
                    528:        power_control |= 0;
                    529:        pci_write_config_word(tp->pdev, pm + PCI_PM_CTRL, power_control);
                    530: 
                    531:        tw32_carefully(GRC_LOCAL_CTRL, tp->grc_local_ctrl);
                    532: 
                    533:        return;
                    534: }
                    535: 
                    536: 
                    537: #if SUPPORT_LINK_REPORT
                    538: static void tg3_link_report(struct tg3 *tp)
                    539: {
                    540:        if (!tp->carrier_ok) {
                    541:                printf("Link is down.\n");
                    542:        } else {
                    543:                printf("Link is up at %d Mbps, %s duplex. %s %s %s\n",
                    544:                        (tp->link_config.active_speed == SPEED_1000 ?
                    545:                               1000 :
                    546:                        (tp->link_config.active_speed == SPEED_100 ?
                    547:                                100 : 10)),
                    548:                        (tp->link_config.active_duplex == DUPLEX_FULL ?  
                    549:                                "full" : "half"),
                    550:                        (tp->tg3_flags & TG3_FLAG_TX_PAUSE) ? "TX" : "",
                    551:                        (tp->tg3_flags & TG3_FLAG_RX_PAUSE) ? "RX" : "",
                    552:                        (tp->tg3_flags & (TG3_FLAG_TX_PAUSE |TG3_FLAG_RX_PAUSE)) ? "flow control" : "");
                    553:        }
                    554: }
                    555: #else
                    556: #define tg3_link_report(tp)
                    557: #endif
                    558: 
                    559: static void tg3_setup_flow_control(struct tg3 *tp, uint32_t local_adv, uint32_t remote_adv)
                    560: {
                    561:        uint32_t new_tg3_flags = 0;
                    562: 
                    563:        if (local_adv & ADVERTISE_PAUSE_CAP) {
                    564:                if (local_adv & ADVERTISE_PAUSE_ASYM) {
                    565:                        if (remote_adv & LPA_PAUSE_CAP)
                    566:                                new_tg3_flags |=
                    567:                                        (TG3_FLAG_RX_PAUSE |
                    568:                                         TG3_FLAG_TX_PAUSE);
                    569:                        else if (remote_adv & LPA_PAUSE_ASYM)
                    570:                                new_tg3_flags |=
                    571:                                        (TG3_FLAG_RX_PAUSE);
                    572:                } else {
                    573:                        if (remote_adv & LPA_PAUSE_CAP)
                    574:                                new_tg3_flags |=
                    575:                                        (TG3_FLAG_RX_PAUSE |
                    576:                                         TG3_FLAG_TX_PAUSE);
                    577:                }
                    578:        } else if (local_adv & ADVERTISE_PAUSE_ASYM) {
                    579:                if ((remote_adv & LPA_PAUSE_CAP) &&
                    580:                    (remote_adv & LPA_PAUSE_ASYM))
                    581:                        new_tg3_flags |= TG3_FLAG_TX_PAUSE;
                    582:        }
                    583: 
                    584:        tp->tg3_flags &= ~(TG3_FLAG_RX_PAUSE | TG3_FLAG_TX_PAUSE);
                    585:        tp->tg3_flags |= new_tg3_flags;
                    586: 
                    587:        if (new_tg3_flags & TG3_FLAG_RX_PAUSE)
                    588:                tp->rx_mode |= RX_MODE_FLOW_CTRL_ENABLE;
                    589:        else
                    590:                tp->rx_mode &= ~RX_MODE_FLOW_CTRL_ENABLE;
                    591: 
                    592:        if (new_tg3_flags & TG3_FLAG_TX_PAUSE)
                    593:                tp->tx_mode |= TX_MODE_FLOW_CTRL_ENABLE;
                    594:        else
                    595:                tp->tx_mode &= ~TX_MODE_FLOW_CTRL_ENABLE;
                    596: }
                    597: 
                    598: #if SUPPORT_COPPER_PHY
                    599: static void tg3_aux_stat_to_speed_duplex(
                    600:        struct tg3 *tp __unused, uint32_t val, uint8_t *speed, uint8_t *duplex)
                    601: {
                    602:        static const uint8_t map[] = {
                    603:                [0] = (SPEED_INVALID << 2) | DUPLEX_INVALID,
                    604:                [MII_TG3_AUX_STAT_10HALF >> 8]   = (SPEED_10 << 2) | DUPLEX_HALF,
                    605:                [MII_TG3_AUX_STAT_10FULL >> 8]   = (SPEED_10 << 2) | DUPLEX_FULL,
                    606:                [MII_TG3_AUX_STAT_100HALF >> 8]  = (SPEED_100 << 2) | DUPLEX_HALF,
                    607:                [MII_TG3_AUX_STAT_100_4 >> 8] = (SPEED_INVALID << 2) | DUPLEX_INVALID,
                    608:                [MII_TG3_AUX_STAT_100FULL >> 8]  = (SPEED_100 << 2) | DUPLEX_FULL,
                    609:                [MII_TG3_AUX_STAT_1000HALF >> 8] = (SPEED_1000 << 2) | DUPLEX_HALF,
                    610:                [MII_TG3_AUX_STAT_1000FULL >> 8] = (SPEED_1000 << 2) | DUPLEX_FULL,
                    611:        };
                    612:        uint8_t result;
                    613:        result = map[(val & MII_TG3_AUX_STAT_SPDMASK) >> 8];
                    614:        *speed = result >> 2;
                    615:        *duplex = result & 3;
                    616: }
                    617: 
                    618: static int tg3_phy_copper_begin(struct tg3 *tp)
                    619: {
                    620:        uint32_t new_adv;
                    621: 
                    622:        tp->link_config.advertising =
                    623:                (ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |
                    624:                        ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full |
                    625:                        ADVERTISED_1000baseT_Half | ADVERTISED_1000baseT_Full |
                    626:                        ADVERTISED_Autoneg | ADVERTISED_MII);
                    627:        
                    628:        if (tp->tg3_flags & TG3_FLAG_10_100_ONLY) {
                    629:                tp->link_config.advertising &=
                    630:                        ~(ADVERTISED_1000baseT_Half | ADVERTISED_1000baseT_Full);
                    631:        }
                    632:        
                    633:        new_adv = (ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP);
                    634:        if (tp->link_config.advertising & ADVERTISED_10baseT_Half) {
                    635:                new_adv |= ADVERTISE_10HALF;
                    636:        }
                    637:        if (tp->link_config.advertising & ADVERTISED_10baseT_Full) {
                    638:                new_adv |= ADVERTISE_10FULL;
                    639:        }
                    640:        if (tp->link_config.advertising & ADVERTISED_100baseT_Half) {
                    641:                new_adv |= ADVERTISE_100HALF;
                    642:        }
                    643:        if (tp->link_config.advertising & ADVERTISED_100baseT_Full) {
                    644:                new_adv |= ADVERTISE_100FULL;
                    645:        }
                    646:        tg3_writephy(tp, MII_ADVERTISE, new_adv);
                    647:        
                    648:        if (tp->link_config.advertising &
                    649:                (ADVERTISED_1000baseT_Half | ADVERTISED_1000baseT_Full)) {
                    650:                new_adv = 0;
                    651:                if (tp->link_config.advertising & ADVERTISED_1000baseT_Half) {
                    652:                        new_adv |= MII_TG3_CTRL_ADV_1000_HALF;
                    653:                }
                    654:                if (tp->link_config.advertising & ADVERTISED_1000baseT_Full) {
                    655:                        new_adv |= MII_TG3_CTRL_ADV_1000_FULL;
                    656:                }
                    657:                if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY) &&
                    658:                        (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0 ||
                    659:                                tp->pci_chip_rev_id == CHIPREV_ID_5701_B0)) {
                    660:                        new_adv |= (MII_TG3_CTRL_AS_MASTER |
                    661:                                MII_TG3_CTRL_ENABLE_AS_MASTER);
                    662:                }
                    663:                tg3_writephy(tp, MII_TG3_CTRL, new_adv);
                    664:        } else {
                    665:                tg3_writephy(tp, MII_TG3_CTRL, 0);
                    666:        }
                    667: 
                    668:        tg3_writephy(tp, MII_BMCR, BMCR_ANENABLE | BMCR_ANRESTART);
                    669: 
                    670:        return 0;
                    671: }
                    672: 
                    673: static int tg3_init_5401phy_dsp(struct tg3 *tp)
                    674: {
                    675:        int err;
                    676: 
                    677:        /* Turn off tap power management. */
                    678:        err  = tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0c20);
                    679:        
                    680:        err |= tg3_writedsp(tp, 0x0012, 0x1804);
                    681:        err |= tg3_writedsp(tp, 0x0013, 0x1204);
                    682:        err |= tg3_writedsp(tp, 0x8006, 0x0132);
                    683:        err |= tg3_writedsp(tp, 0x8006, 0x0232);
                    684:        err |= tg3_writedsp(tp, 0x201f, 0x0a20);
                    685: 
                    686:        udelay(40);
                    687: 
                    688:        return err;
                    689: }
                    690: 
                    691: static int tg3_setup_copper_phy(struct tg3 *tp)
                    692: {
                    693:        int current_link_up;
                    694:        uint32_t bmsr, dummy;
                    695:        int i, err;
                    696: 
                    697:        tw32_carefully(MAC_STATUS,
                    698:                (MAC_STATUS_SYNC_CHANGED | MAC_STATUS_CFG_CHANGED
                    699:                 | MAC_STATUS_LNKSTATE_CHANGED));
                    700: 
                    701:        tp->mi_mode = MAC_MI_MODE_BASE;
                    702:        tw32_carefully(MAC_MI_MODE, tp->mi_mode);
                    703: 
                    704:        tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x02);
                    705: 
                    706:        /* Some third-party PHYs need to be reset on link going
                    707:         * down.
                    708:         */
                    709:        if (    (       (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703) ||
                    710:                        (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) ||
                    711:                        (tp->pci_chip_rev_id == CHIPREV_ID_5705_A0)) &&
                    712:                (tp->carrier_ok)) {
                    713:                tg3_readphy(tp, MII_BMSR, &bmsr);
                    714:                tg3_readphy(tp, MII_BMSR, &bmsr);
                    715:                if (!(bmsr & BMSR_LSTATUS))
                    716:                        tg3_phy_reset(tp);
                    717:        }
                    718: 
                    719:        if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) {
                    720:                tg3_readphy(tp, MII_BMSR, &bmsr);
                    721:                tg3_readphy(tp, MII_BMSR, &bmsr);
                    722: 
                    723:                if (!(tp->tg3_flags & TG3_FLAG_INIT_COMPLETE))
                    724:                        bmsr = 0;
                    725: 
                    726:                if (!(bmsr & BMSR_LSTATUS)) {
                    727:                        err = tg3_init_5401phy_dsp(tp);
                    728:                        if (err)
                    729:                                return err;
                    730: 
                    731:                        tg3_readphy(tp, MII_BMSR, &bmsr);
                    732:                        for (i = 0; i < 1000; i++) {
                    733:                                udelay(10);
                    734:                                tg3_readphy(tp, MII_BMSR, &bmsr);
                    735:                                if (bmsr & BMSR_LSTATUS) {
                    736:                                        udelay(40);
                    737:                                        break;
                    738:                                }
                    739:                        }
                    740: 
                    741:                        if ((tp->phy_id & PHY_ID_REV_MASK) == PHY_REV_BCM5401_B0 &&
                    742:                            !(bmsr & BMSR_LSTATUS) &&
                    743:                            tp->link_config.active_speed == SPEED_1000) {
                    744:                                err = tg3_phy_reset(tp);
                    745:                                if (!err)
                    746:                                        err = tg3_init_5401phy_dsp(tp);
                    747:                                if (err)
                    748:                                        return err;
                    749:                        }
                    750:                }
                    751:        } else if (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0 ||
                    752:                   tp->pci_chip_rev_id == CHIPREV_ID_5701_B0) {
                    753:                /* 5701 {A0,B0} CRC bug workaround */
                    754:                tg3_writephy(tp, 0x15, 0x0a75);
                    755:                tg3_writephy(tp, 0x1c, 0x8c68);
                    756:                tg3_writephy(tp, 0x1c, 0x8d68);
                    757:                tg3_writephy(tp, 0x1c, 0x8c68);
                    758:        }
                    759: 
                    760:        /* Clear pending interrupts... */
                    761:        tg3_readphy(tp, MII_TG3_ISTAT, &dummy);
                    762:        tg3_readphy(tp, MII_TG3_ISTAT, &dummy);
                    763: 
                    764:        tg3_writephy(tp, MII_TG3_IMASK, ~0);
                    765: 
                    766:        if (tp->led_mode == led_mode_three_link)
                    767:                tg3_writephy(tp, MII_TG3_EXT_CTRL,
                    768:                             MII_TG3_EXT_CTRL_LNK3_LED_MODE);
                    769:        else
                    770:                tg3_writephy(tp, MII_TG3_EXT_CTRL, 0);
                    771: 
                    772:        current_link_up = 0;
                    773: 
                    774:        tg3_readphy(tp, MII_BMSR, &bmsr);
                    775:        tg3_readphy(tp, MII_BMSR, &bmsr);
                    776: 
                    777:        if (bmsr & BMSR_LSTATUS) {
                    778:                uint32_t aux_stat, bmcr;
                    779: 
                    780:                tg3_readphy(tp, MII_TG3_AUX_STAT, &aux_stat);
                    781:                for (i = 0; i < 2000; i++) {
                    782:                        udelay(10);
                    783:                        tg3_readphy(tp, MII_TG3_AUX_STAT, &aux_stat);
                    784:                        if (aux_stat)
                    785:                                break;
                    786:                }
                    787: 
                    788:                tg3_aux_stat_to_speed_duplex(tp, aux_stat,
                    789:                        &tp->link_config.active_speed,
                    790:                        &tp->link_config.active_duplex);
                    791:                tg3_readphy(tp, MII_BMCR, &bmcr);
                    792:                tg3_readphy(tp, MII_BMCR, &bmcr);
                    793:                if (bmcr & BMCR_ANENABLE) {
                    794:                        uint32_t gig_ctrl;
                    795:                        
                    796:                        current_link_up = 1;
                    797:                        
                    798:                        /* Force autoneg restart if we are exiting
                    799:                         * low power mode.
                    800:                         */
                    801:                        tg3_readphy(tp, MII_TG3_CTRL, &gig_ctrl);
                    802:                        if (!(gig_ctrl & (MII_TG3_CTRL_ADV_1000_HALF |
                    803:                                      MII_TG3_CTRL_ADV_1000_FULL))) {
                    804:                                current_link_up = 0;
                    805:                        }
                    806:                } else {
                    807:                        current_link_up = 0;
                    808:                }
                    809:        }
                    810: 
                    811:        if (current_link_up == 1 &&
                    812:                (tp->link_config.active_duplex == DUPLEX_FULL)) {
                    813:                uint32_t local_adv, remote_adv;
                    814: 
                    815:                tg3_readphy(tp, MII_ADVERTISE, &local_adv);
                    816:                local_adv &= (ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM);
                    817: 
                    818:                tg3_readphy(tp, MII_LPA, &remote_adv);
                    819:                remote_adv &= (LPA_PAUSE_CAP | LPA_PAUSE_ASYM);
                    820: 
                    821:                /* If we are not advertising full pause capability,
                    822:                 * something is wrong.  Bring the link down and reconfigure.
                    823:                 */
                    824:                if (local_adv != ADVERTISE_PAUSE_CAP) {
                    825:                        current_link_up = 0;
                    826:                } else {
                    827:                        tg3_setup_flow_control(tp, local_adv, remote_adv);
                    828:                }
                    829:        }
                    830: 
                    831:        if (current_link_up == 0) {
                    832:                uint32_t tmp;
                    833: 
                    834:                tg3_phy_copper_begin(tp);
                    835: 
                    836:                tg3_readphy(tp, MII_BMSR, &tmp);
                    837:                tg3_readphy(tp, MII_BMSR, &tmp);
                    838:                if (tmp & BMSR_LSTATUS)
                    839:                        current_link_up = 1;
                    840:        }
                    841: 
                    842:        tp->mac_mode &= ~MAC_MODE_PORT_MODE_MASK;
                    843:        if (current_link_up == 1) {
                    844:                if (tp->link_config.active_speed == SPEED_100 ||
                    845:                    tp->link_config.active_speed == SPEED_10)
                    846:                        tp->mac_mode |= MAC_MODE_PORT_MODE_MII;
                    847:                else
                    848:                        tp->mac_mode |= MAC_MODE_PORT_MODE_GMII;
                    849:        } else
                    850:                tp->mac_mode |= MAC_MODE_PORT_MODE_GMII;
                    851: 
                    852:        tp->mac_mode &= ~MAC_MODE_HALF_DUPLEX;
                    853:        if (tp->link_config.active_duplex == DUPLEX_HALF)
                    854:                tp->mac_mode |= MAC_MODE_HALF_DUPLEX;
                    855: 
                    856:        tp->mac_mode &= ~MAC_MODE_LINK_POLARITY;
                    857:        if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700) {
                    858:                if ((tp->led_mode == led_mode_link10) ||
                    859:                    (current_link_up == 1 &&
                    860:                     tp->link_config.active_speed == SPEED_10))
                    861:                        tp->mac_mode |= MAC_MODE_LINK_POLARITY;
                    862:        } else {
                    863:                if (current_link_up == 1)
                    864:                        tp->mac_mode |= MAC_MODE_LINK_POLARITY;
                    865:                tw32(MAC_LED_CTRL, LED_CTRL_PHY_MODE_1);
                    866:        }
                    867: 
                    868:        /* ??? Without this setting Netgear GA302T PHY does not
                    869:         * ??? send/receive packets...
                    870:         * With this other PHYs cannot bring up the link
                    871:         */
                    872:        if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5411 &&
                    873:                tp->pci_chip_rev_id == CHIPREV_ID_5700_ALTIMA) {
                    874:                tp->mi_mode |= MAC_MI_MODE_AUTO_POLL;
                    875:                tw32_carefully(MAC_MI_MODE, tp->mi_mode);
                    876:        }
                    877: 
                    878:        tw32_carefully(MAC_MODE, tp->mac_mode);
                    879: 
                    880:        /* Link change polled. */
                    881:        tw32_carefully(MAC_EVENT, 0);
                    882: 
                    883:        if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 &&
                    884:            current_link_up == 1 &&
                    885:            tp->link_config.active_speed == SPEED_1000 &&
                    886:            ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) ||
                    887:             (tp->tg3_flags & TG3_FLAG_PCI_HIGH_SPEED))) {
                    888:                udelay(120);
                    889:                tw32_carefully(MAC_STATUS,
                    890:                        (MAC_STATUS_SYNC_CHANGED | MAC_STATUS_CFG_CHANGED));
                    891:                tg3_write_mem(
                    892:                              NIC_SRAM_FIRMWARE_MBOX,
                    893:                              NIC_SRAM_FIRMWARE_MBOX_MAGIC2);
                    894:        }
                    895: 
                    896:        if (current_link_up != tp->carrier_ok) {
                    897:                tp->carrier_ok = current_link_up;
                    898:                tg3_link_report(tp);
                    899:        }
                    900: 
                    901:        return 0;
                    902: }
                    903: #else
                    904: #define tg3_setup_copper_phy(TP) (-EINVAL)
                    905: #endif /* SUPPORT_COPPER_PHY */
                    906: 
                    907: #if SUPPORT_FIBER_PHY
                    908: struct tg3_fiber_aneginfo {
                    909:        int state;
                    910: #define ANEG_STATE_UNKNOWN             0
                    911: #define ANEG_STATE_AN_ENABLE           1
                    912: #define ANEG_STATE_RESTART_INIT                2
                    913: #define ANEG_STATE_RESTART             3
                    914: #define ANEG_STATE_DISABLE_LINK_OK     4
                    915: #define ANEG_STATE_ABILITY_DETECT_INIT 5
                    916: #define ANEG_STATE_ABILITY_DETECT      6
                    917: #define ANEG_STATE_ACK_DETECT_INIT     7
                    918: #define ANEG_STATE_ACK_DETECT          8
                    919: #define ANEG_STATE_COMPLETE_ACK_INIT   9
                    920: #define ANEG_STATE_COMPLETE_ACK                10
                    921: #define ANEG_STATE_IDLE_DETECT_INIT    11
                    922: #define ANEG_STATE_IDLE_DETECT         12
                    923: #define ANEG_STATE_LINK_OK             13
                    924: #define ANEG_STATE_NEXT_PAGE_WAIT_INIT 14
                    925: #define ANEG_STATE_NEXT_PAGE_WAIT      15
                    926: 
                    927:        uint32_t flags;
                    928: #define MR_AN_ENABLE           0x00000001
                    929: #define MR_RESTART_AN          0x00000002
                    930: #define MR_AN_COMPLETE         0x00000004
                    931: #define MR_PAGE_RX             0x00000008
                    932: #define MR_NP_LOADED           0x00000010
                    933: #define MR_TOGGLE_TX           0x00000020
                    934: #define MR_LP_ADV_FULL_DUPLEX  0x00000040
                    935: #define MR_LP_ADV_HALF_DUPLEX  0x00000080
                    936: #define MR_LP_ADV_SYM_PAUSE    0x00000100
                    937: #define MR_LP_ADV_ASYM_PAUSE   0x00000200
                    938: #define MR_LP_ADV_REMOTE_FAULT1        0x00000400
                    939: #define MR_LP_ADV_REMOTE_FAULT2        0x00000800
                    940: #define MR_LP_ADV_NEXT_PAGE    0x00001000
                    941: #define MR_TOGGLE_RX           0x00002000
                    942: #define MR_NP_RX               0x00004000
                    943: 
                    944: #define MR_LINK_OK             0x80000000
                    945: 
                    946:        unsigned long link_time, cur_time;
                    947: 
                    948:        uint32_t ability_match_cfg;
                    949:        int ability_match_count;
                    950: 
                    951:        char ability_match, idle_match, ack_match;
                    952: 
                    953:        uint32_t txconfig, rxconfig;
                    954: #define ANEG_CFG_NP            0x00000080
                    955: #define ANEG_CFG_ACK           0x00000040
                    956: #define ANEG_CFG_RF2           0x00000020
                    957: #define ANEG_CFG_RF1           0x00000010
                    958: #define ANEG_CFG_PS2           0x00000001
                    959: #define ANEG_CFG_PS1           0x00008000
                    960: #define ANEG_CFG_HD            0x00004000
                    961: #define ANEG_CFG_FD            0x00002000
                    962: #define ANEG_CFG_INVAL         0x00001f06
                    963: 
                    964: };
                    965: #define ANEG_OK                0
                    966: #define ANEG_DONE      1
                    967: #define ANEG_TIMER_ENAB        2
                    968: #define ANEG_FAILED    -1
                    969: 
                    970: #define ANEG_STATE_SETTLE_TIME 10000
                    971: 
                    972: static int tg3_fiber_aneg_smachine(struct tg3 *tp,
                    973:                                   struct tg3_fiber_aneginfo *ap)
                    974: {
                    975:        unsigned long delta;
                    976:        uint32_t rx_cfg_reg;
                    977:        int ret;
                    978: 
                    979:        if (ap->state == ANEG_STATE_UNKNOWN) {
                    980:                ap->rxconfig = 0;
                    981:                ap->link_time = 0;
                    982:                ap->cur_time = 0;
                    983:                ap->ability_match_cfg = 0;
                    984:                ap->ability_match_count = 0;
                    985:                ap->ability_match = 0;
                    986:                ap->idle_match = 0;
                    987:                ap->ack_match = 0;
                    988:        }
                    989:        ap->cur_time++;
                    990: 
                    991:        if (tr32(MAC_STATUS) & MAC_STATUS_RCVD_CFG) {
                    992:                rx_cfg_reg = tr32(MAC_RX_AUTO_NEG);
                    993: 
                    994:                if (rx_cfg_reg != ap->ability_match_cfg) {
                    995:                        ap->ability_match_cfg = rx_cfg_reg;
                    996:                        ap->ability_match = 0;
                    997:                        ap->ability_match_count = 0;
                    998:                } else {
                    999:                        if (++ap->ability_match_count > 1) {
                   1000:                                ap->ability_match = 1;
                   1001:                                ap->ability_match_cfg = rx_cfg_reg;
                   1002:                        }
                   1003:                }
                   1004:                if (rx_cfg_reg & ANEG_CFG_ACK)
                   1005:                        ap->ack_match = 1;
                   1006:                else
                   1007:                        ap->ack_match = 0;
                   1008: 
                   1009:                ap->idle_match = 0;
                   1010:        } else {
                   1011:                ap->idle_match = 1;
                   1012:                ap->ability_match_cfg = 0;
                   1013:                ap->ability_match_count = 0;
                   1014:                ap->ability_match = 0;
                   1015:                ap->ack_match = 0;
                   1016: 
                   1017:                rx_cfg_reg = 0;
                   1018:        }
                   1019: 
                   1020:        ap->rxconfig = rx_cfg_reg;
                   1021:        ret = ANEG_OK;
                   1022: 
                   1023:        switch(ap->state) {
                   1024:        case ANEG_STATE_UNKNOWN:
                   1025:                if (ap->flags & (MR_AN_ENABLE | MR_RESTART_AN))
                   1026:                        ap->state = ANEG_STATE_AN_ENABLE;
                   1027: 
                   1028:                /* fallthru */
                   1029:        case ANEG_STATE_AN_ENABLE:
                   1030:                ap->flags &= ~(MR_AN_COMPLETE | MR_PAGE_RX);
                   1031:                if (ap->flags & MR_AN_ENABLE) {
                   1032:                        ap->link_time = 0;
                   1033:                        ap->cur_time = 0;
                   1034:                        ap->ability_match_cfg = 0;
                   1035:                        ap->ability_match_count = 0;
                   1036:                        ap->ability_match = 0;
                   1037:                        ap->idle_match = 0;
                   1038:                        ap->ack_match = 0;
                   1039: 
                   1040:                        ap->state = ANEG_STATE_RESTART_INIT;
                   1041:                } else {
                   1042:                        ap->state = ANEG_STATE_DISABLE_LINK_OK;
                   1043:                }
                   1044:                break;
                   1045: 
                   1046:        case ANEG_STATE_RESTART_INIT:
                   1047:                ap->link_time = ap->cur_time;
                   1048:                ap->flags &= ~(MR_NP_LOADED);
                   1049:                ap->txconfig = 0;
                   1050:                tw32(MAC_TX_AUTO_NEG, 0);
                   1051:                tp->mac_mode |= MAC_MODE_SEND_CONFIGS;
                   1052:                tw32_carefully(MAC_MODE, tp->mac_mode);
                   1053: 
                   1054:                ret = ANEG_TIMER_ENAB;
                   1055:                ap->state = ANEG_STATE_RESTART;
                   1056: 
                   1057:                /* fallthru */
                   1058:        case ANEG_STATE_RESTART:
                   1059:                delta = ap->cur_time - ap->link_time;
                   1060:                if (delta > ANEG_STATE_SETTLE_TIME) {
                   1061:                        ap->state = ANEG_STATE_ABILITY_DETECT_INIT;
                   1062:                } else {
                   1063:                        ret = ANEG_TIMER_ENAB;
                   1064:                }
                   1065:                break;
                   1066: 
                   1067:        case ANEG_STATE_DISABLE_LINK_OK:
                   1068:                ret = ANEG_DONE;
                   1069:                break;
                   1070: 
                   1071:        case ANEG_STATE_ABILITY_DETECT_INIT:
                   1072:                ap->flags &= ~(MR_TOGGLE_TX);
                   1073:                ap->txconfig = (ANEG_CFG_FD | ANEG_CFG_PS1);
                   1074:                tw32(MAC_TX_AUTO_NEG, ap->txconfig);
                   1075:                tp->mac_mode |= MAC_MODE_SEND_CONFIGS;
                   1076:                tw32_carefully(MAC_MODE, tp->mac_mode);
                   1077: 
                   1078:                ap->state = ANEG_STATE_ABILITY_DETECT;
                   1079:                break;
                   1080: 
                   1081:        case ANEG_STATE_ABILITY_DETECT:
                   1082:                if (ap->ability_match != 0 && ap->rxconfig != 0) {
                   1083:                        ap->state = ANEG_STATE_ACK_DETECT_INIT;
                   1084:                }
                   1085:                break;
                   1086: 
                   1087:        case ANEG_STATE_ACK_DETECT_INIT:
                   1088:                ap->txconfig |= ANEG_CFG_ACK;
                   1089:                tw32(MAC_TX_AUTO_NEG, ap->txconfig);
                   1090:                tp->mac_mode |= MAC_MODE_SEND_CONFIGS;
                   1091:                tw32_carefully(MAC_MODE, tp->mac_mode);
                   1092: 
                   1093:                ap->state = ANEG_STATE_ACK_DETECT;
                   1094: 
                   1095:                /* fallthru */
                   1096:        case ANEG_STATE_ACK_DETECT:
                   1097:                if (ap->ack_match != 0) {
                   1098:                        if ((ap->rxconfig & ~ANEG_CFG_ACK) ==
                   1099:                            (ap->ability_match_cfg & ~ANEG_CFG_ACK)) {
                   1100:                                ap->state = ANEG_STATE_COMPLETE_ACK_INIT;
                   1101:                        } else {
                   1102:                                ap->state = ANEG_STATE_AN_ENABLE;
                   1103:                        }
                   1104:                } else if (ap->ability_match != 0 &&
                   1105:                           ap->rxconfig == 0) {
                   1106:                        ap->state = ANEG_STATE_AN_ENABLE;
                   1107:                }
                   1108:                break;
                   1109: 
                   1110:        case ANEG_STATE_COMPLETE_ACK_INIT:
                   1111:                if (ap->rxconfig & ANEG_CFG_INVAL) {
                   1112:                        ret = ANEG_FAILED;
                   1113:                        break;
                   1114:                }
                   1115:                ap->flags &= ~(MR_LP_ADV_FULL_DUPLEX |
                   1116:                               MR_LP_ADV_HALF_DUPLEX |
                   1117:                               MR_LP_ADV_SYM_PAUSE |
                   1118:                               MR_LP_ADV_ASYM_PAUSE |
                   1119:                               MR_LP_ADV_REMOTE_FAULT1 |
                   1120:                               MR_LP_ADV_REMOTE_FAULT2 |
                   1121:                               MR_LP_ADV_NEXT_PAGE |
                   1122:                               MR_TOGGLE_RX |
                   1123:                               MR_NP_RX);
                   1124:                if (ap->rxconfig & ANEG_CFG_FD)
                   1125:                        ap->flags |= MR_LP_ADV_FULL_DUPLEX;
                   1126:                if (ap->rxconfig & ANEG_CFG_HD)
                   1127:                        ap->flags |= MR_LP_ADV_HALF_DUPLEX;
                   1128:                if (ap->rxconfig & ANEG_CFG_PS1)
                   1129:                        ap->flags |= MR_LP_ADV_SYM_PAUSE;
                   1130:                if (ap->rxconfig & ANEG_CFG_PS2)
                   1131:                        ap->flags |= MR_LP_ADV_ASYM_PAUSE;
                   1132:                if (ap->rxconfig & ANEG_CFG_RF1)
                   1133:                        ap->flags |= MR_LP_ADV_REMOTE_FAULT1;
                   1134:                if (ap->rxconfig & ANEG_CFG_RF2)
                   1135:                        ap->flags |= MR_LP_ADV_REMOTE_FAULT2;
                   1136:                if (ap->rxconfig & ANEG_CFG_NP)
                   1137:                        ap->flags |= MR_LP_ADV_NEXT_PAGE;
                   1138: 
                   1139:                ap->link_time = ap->cur_time;
                   1140: 
                   1141:                ap->flags ^= (MR_TOGGLE_TX);
                   1142:                if (ap->rxconfig & 0x0008)
                   1143:                        ap->flags |= MR_TOGGLE_RX;
                   1144:                if (ap->rxconfig & ANEG_CFG_NP)
                   1145:                        ap->flags |= MR_NP_RX;
                   1146:                ap->flags |= MR_PAGE_RX;
                   1147: 
                   1148:                ap->state = ANEG_STATE_COMPLETE_ACK;
                   1149:                ret = ANEG_TIMER_ENAB;
                   1150:                break;
                   1151: 
                   1152:        case ANEG_STATE_COMPLETE_ACK:
                   1153:                if (ap->ability_match != 0 &&
                   1154:                    ap->rxconfig == 0) {
                   1155:                        ap->state = ANEG_STATE_AN_ENABLE;
                   1156:                        break;
                   1157:                }
                   1158:                delta = ap->cur_time - ap->link_time;
                   1159:                if (delta > ANEG_STATE_SETTLE_TIME) {
                   1160:                        if (!(ap->flags & (MR_LP_ADV_NEXT_PAGE))) {
                   1161:                                ap->state = ANEG_STATE_IDLE_DETECT_INIT;
                   1162:                        } else {
                   1163:                                if ((ap->txconfig & ANEG_CFG_NP) == 0 &&
                   1164:                                    !(ap->flags & MR_NP_RX)) {
                   1165:                                        ap->state = ANEG_STATE_IDLE_DETECT_INIT;
                   1166:                                } else {
                   1167:                                        ret = ANEG_FAILED;
                   1168:                                }
                   1169:                        }
                   1170:                }
                   1171:                break;
                   1172: 
                   1173:        case ANEG_STATE_IDLE_DETECT_INIT:
                   1174:                ap->link_time = ap->cur_time;
                   1175:                tp->mac_mode &= ~MAC_MODE_SEND_CONFIGS;
                   1176:                tw32_carefully(MAC_MODE, tp->mac_mode);
                   1177: 
                   1178:                ap->state = ANEG_STATE_IDLE_DETECT;
                   1179:                ret = ANEG_TIMER_ENAB;
                   1180:                break;
                   1181: 
                   1182:        case ANEG_STATE_IDLE_DETECT:
                   1183:                if (ap->ability_match != 0 &&
                   1184:                    ap->rxconfig == 0) {
                   1185:                        ap->state = ANEG_STATE_AN_ENABLE;
                   1186:                        break;
                   1187:                }
                   1188:                delta = ap->cur_time - ap->link_time;
                   1189:                if (delta > ANEG_STATE_SETTLE_TIME) {
                   1190:                        /* XXX another gem from the Broadcom driver :( */
                   1191:                        ap->state = ANEG_STATE_LINK_OK;
                   1192:                }
                   1193:                break;
                   1194: 
                   1195:        case ANEG_STATE_LINK_OK:
                   1196:                ap->flags |= (MR_AN_COMPLETE | MR_LINK_OK);
                   1197:                ret = ANEG_DONE;
                   1198:                break;
                   1199: 
                   1200:        case ANEG_STATE_NEXT_PAGE_WAIT_INIT:
                   1201:                /* ??? unimplemented */
                   1202:                break;
                   1203: 
                   1204:        case ANEG_STATE_NEXT_PAGE_WAIT:
                   1205:                /* ??? unimplemented */
                   1206:                break;
                   1207: 
                   1208:        default:
                   1209:                ret = ANEG_FAILED;
                   1210:                break;
                   1211:        };
                   1212: 
                   1213:        return ret;
                   1214: }
                   1215: 
                   1216: static int tg3_setup_fiber_phy(struct tg3 *tp)
                   1217: {
                   1218:        uint32_t orig_pause_cfg;
                   1219:        uint16_t orig_active_speed;
                   1220:        uint8_t orig_active_duplex;
                   1221:        int current_link_up;
                   1222:        int i;
                   1223: 
                   1224:        orig_pause_cfg =
                   1225:                (tp->tg3_flags & (TG3_FLAG_RX_PAUSE |
                   1226:                                  TG3_FLAG_TX_PAUSE));
                   1227:        orig_active_speed = tp->link_config.active_speed;
                   1228:        orig_active_duplex = tp->link_config.active_duplex;
                   1229: 
                   1230:        tp->mac_mode &= ~(MAC_MODE_PORT_MODE_MASK | MAC_MODE_HALF_DUPLEX);
                   1231:        tp->mac_mode |= MAC_MODE_PORT_MODE_TBI;
                   1232:        tw32_carefully(MAC_MODE, tp->mac_mode);
                   1233: 
                   1234:        /* Reset when initting first time or we have a link. */
                   1235:        if (!(tp->tg3_flags & TG3_FLAG_INIT_COMPLETE) ||
                   1236:            (tr32(MAC_STATUS) & MAC_STATUS_PCS_SYNCED)) {
                   1237:                /* Set PLL lock range. */
                   1238:                tg3_writephy(tp, 0x16, 0x8007);
                   1239: 
                   1240:                /* SW reset */
                   1241:                tg3_writephy(tp, MII_BMCR, BMCR_RESET);
                   1242: 
                   1243:                /* Wait for reset to complete. */
                   1244:                mdelay(5);
                   1245: 
                   1246:                /* Config mode; select PMA/Ch 1 regs. */
                   1247:                tg3_writephy(tp, 0x10, 0x8411);
                   1248: 
                   1249:                /* Enable auto-lock and comdet, select txclk for tx. */
                   1250:                tg3_writephy(tp, 0x11, 0x0a10);
                   1251: 
                   1252:                tg3_writephy(tp, 0x18, 0x00a0);
                   1253:                tg3_writephy(tp, 0x16, 0x41ff);
                   1254: 
                   1255:                /* Assert and deassert POR. */
                   1256:                tg3_writephy(tp, 0x13, 0x0400);
                   1257:                udelay(40);
                   1258:                tg3_writephy(tp, 0x13, 0x0000);
                   1259: 
                   1260:                tg3_writephy(tp, 0x11, 0x0a50);
                   1261:                udelay(40);
                   1262:                tg3_writephy(tp, 0x11, 0x0a10);
                   1263: 
                   1264:                /* Wait for signal to stabilize */
                   1265:                mdelay(150);
                   1266: 
                   1267:                /* Deselect the channel register so we can read the PHYID
                   1268:                 * later.
                   1269:                 */
                   1270:                tg3_writephy(tp, 0x10, 0x8011);
                   1271:        }
                   1272: 
                   1273:        /* Disable link change interrupt.  */
                   1274:        tw32_carefully(MAC_EVENT, 0);
                   1275: 
                   1276:        current_link_up = 0;
                   1277:        if (tr32(MAC_STATUS) & MAC_STATUS_PCS_SYNCED) {
                   1278:                if (!(tp->tg3_flags & TG3_FLAG_GOT_SERDES_FLOWCTL)) {
                   1279:                        struct tg3_fiber_aneginfo aninfo;
                   1280:                        int status = ANEG_FAILED;
                   1281:                        unsigned int tick;
                   1282:                        uint32_t tmp;
                   1283: 
                   1284:                        memset(&aninfo, 0, sizeof(aninfo));
                   1285:                        aninfo.flags |= (MR_AN_ENABLE);
                   1286: 
                   1287:                        tw32(MAC_TX_AUTO_NEG, 0);
                   1288: 
                   1289:                        tmp = tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK;
                   1290:                        tw32_carefully(MAC_MODE, tmp | MAC_MODE_PORT_MODE_GMII);
                   1291: 
                   1292:                        tw32_carefully(MAC_MODE, tp->mac_mode | MAC_MODE_SEND_CONFIGS);
                   1293: 
                   1294:                        aninfo.state = ANEG_STATE_UNKNOWN;
                   1295:                        aninfo.cur_time = 0;
                   1296:                        tick = 0;
                   1297:                        while (++tick < 195000) {
                   1298:                                status = tg3_fiber_aneg_smachine(tp, &aninfo);
                   1299:                                if (status == ANEG_DONE ||
                   1300:                                    status == ANEG_FAILED)
                   1301:                                        break;
                   1302: 
                   1303:                                udelay(1);
                   1304:                        }
                   1305: 
                   1306:                        tp->mac_mode &= ~MAC_MODE_SEND_CONFIGS;
                   1307:                        tw32_carefully(MAC_MODE, tp->mac_mode);
                   1308: 
                   1309:                        if (status == ANEG_DONE &&
                   1310:                            (aninfo.flags &
                   1311:                             (MR_AN_COMPLETE | MR_LINK_OK |
                   1312:                              MR_LP_ADV_FULL_DUPLEX))) {
                   1313:                                uint32_t local_adv, remote_adv;
                   1314: 
                   1315:                                local_adv = ADVERTISE_PAUSE_CAP;
                   1316:                                remote_adv = 0;
                   1317:                                if (aninfo.flags & MR_LP_ADV_SYM_PAUSE)
                   1318:                                        remote_adv |= LPA_PAUSE_CAP;
                   1319:                                if (aninfo.flags & MR_LP_ADV_ASYM_PAUSE)
                   1320:                                        remote_adv |= LPA_PAUSE_ASYM;
                   1321: 
                   1322:                                tg3_setup_flow_control(tp, local_adv, remote_adv);
                   1323: 
                   1324:                                tp->tg3_flags |=
                   1325:                                        TG3_FLAG_GOT_SERDES_FLOWCTL;
                   1326:                                current_link_up = 1;
                   1327:                        }
                   1328:                        for (i = 0; i < 60; i++) {
                   1329:                                udelay(20);
                   1330:                                tw32_carefully(MAC_STATUS,
                   1331:                                        (MAC_STATUS_SYNC_CHANGED | MAC_STATUS_CFG_CHANGED));
                   1332:                                if ((tr32(MAC_STATUS) &
                   1333:                                     (MAC_STATUS_SYNC_CHANGED |
                   1334:                                      MAC_STATUS_CFG_CHANGED)) == 0)
                   1335:                                        break;
                   1336:                        }
                   1337:                        if (current_link_up == 0 &&
                   1338:                            (tr32(MAC_STATUS) & MAC_STATUS_PCS_SYNCED)) {
                   1339:                                current_link_up = 1;
                   1340:                        }
                   1341:                } else {
                   1342:                        /* Forcing 1000FD link up. */
                   1343:                        current_link_up = 1;
                   1344:                }
                   1345:        }
                   1346: 
                   1347:        tp->mac_mode &= ~MAC_MODE_LINK_POLARITY;
                   1348:        tw32_carefully(MAC_MODE, tp->mac_mode);
                   1349: 
                   1350:        tp->hw_status->status =
                   1351:                (SD_STATUS_UPDATED |
                   1352:                 (tp->hw_status->status & ~SD_STATUS_LINK_CHG));
                   1353: 
                   1354:        for (i = 0; i < 100; i++) {
                   1355:                udelay(20);
                   1356:                tw32_carefully(MAC_STATUS,
                   1357:                        (MAC_STATUS_SYNC_CHANGED | MAC_STATUS_CFG_CHANGED));
                   1358:                if ((tr32(MAC_STATUS) &
                   1359:                     (MAC_STATUS_SYNC_CHANGED |
                   1360:                      MAC_STATUS_CFG_CHANGED)) == 0)
                   1361:                        break;
                   1362:        }
                   1363: 
                   1364:        if ((tr32(MAC_STATUS) & MAC_STATUS_PCS_SYNCED) == 0)
                   1365:                current_link_up = 0;
                   1366: 
                   1367:        if (current_link_up == 1) {
                   1368:                tp->link_config.active_speed = SPEED_1000;
                   1369:                tp->link_config.active_duplex = DUPLEX_FULL;
                   1370:        } else {
                   1371:                tp->link_config.active_speed = SPEED_INVALID;
                   1372:                tp->link_config.active_duplex = DUPLEX_INVALID;
                   1373:        }
                   1374: 
                   1375:        if (current_link_up != tp->carrier_ok) {
                   1376:                tp->carrier_ok = current_link_up;
                   1377:                tg3_link_report(tp);
                   1378:        } else {
                   1379:                uint32_t now_pause_cfg =
                   1380:                        tp->tg3_flags & (TG3_FLAG_RX_PAUSE |
                   1381:                                         TG3_FLAG_TX_PAUSE);
                   1382:                if (orig_pause_cfg != now_pause_cfg ||
                   1383:                    orig_active_speed != tp->link_config.active_speed ||
                   1384:                    orig_active_duplex != tp->link_config.active_duplex)
                   1385:                        tg3_link_report(tp);
                   1386:        }
                   1387: 
                   1388:        if ((tr32(MAC_STATUS) & MAC_STATUS_PCS_SYNCED) == 0) {
                   1389:                tw32_carefully(MAC_MODE, tp->mac_mode | MAC_MODE_LINK_POLARITY);
                   1390:                if (tp->tg3_flags & TG3_FLAG_INIT_COMPLETE) {
                   1391:                        tw32_carefully(MAC_MODE, tp->mac_mode);
                   1392:                }
                   1393:        }
                   1394: 
                   1395:        return 0;
                   1396: }
                   1397: #else
                   1398: #define tg3_setup_fiber_phy(TP) (-EINVAL)
                   1399: #endif /* SUPPORT_FIBER_PHY */
                   1400: 
                   1401: static int tg3_setup_phy(struct tg3 *tp)
                   1402: {
                   1403:        int err;
                   1404: 
                   1405:        if (tp->phy_id == PHY_ID_SERDES) {
                   1406:                err = tg3_setup_fiber_phy(tp);
                   1407:        } else {
                   1408:                err = tg3_setup_copper_phy(tp);
                   1409:        }
                   1410: 
                   1411:        if (tp->link_config.active_speed == SPEED_1000 &&
                   1412:            tp->link_config.active_duplex == DUPLEX_HALF)
                   1413:                tw32(MAC_TX_LENGTHS,
                   1414:                     ((2 << TX_LENGTHS_IPG_CRS_SHIFT) |
                   1415:                      (6 << TX_LENGTHS_IPG_SHIFT) |
                   1416:                      (0xff << TX_LENGTHS_SLOT_TIME_SHIFT)));
                   1417:        else
                   1418:                tw32(MAC_TX_LENGTHS,
                   1419:                     ((2 << TX_LENGTHS_IPG_CRS_SHIFT) |
                   1420:                      (6 << TX_LENGTHS_IPG_SHIFT) |
                   1421:                      (32 << TX_LENGTHS_SLOT_TIME_SHIFT)));
                   1422: 
                   1423:        return err;
                   1424: }
                   1425: 
                   1426: 
                   1427: #define MAX_WAIT_CNT 1000
                   1428: 
                   1429: /* To stop a block, clear the enable bit and poll till it
                   1430:  * clears.  
                   1431:  */
                   1432: static int tg3_stop_block(struct tg3 *tp, unsigned long ofs, uint32_t enable_bit)
                   1433: {
                   1434:        unsigned int i;
                   1435:        uint32_t val;
                   1436: 
                   1437:        if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 ||
                   1438:            GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) {
                   1439:                switch(ofs) {
                   1440:                case RCVLSC_MODE:
                   1441:                case DMAC_MODE:
                   1442:                case MBFREE_MODE:
                   1443:                case BUFMGR_MODE:
                   1444:                case MEMARB_MODE:
                   1445:                        /* We can't enable/disable these bits of the
                   1446:                         * 5705 or 5787, just say success.
                   1447:                         */
                   1448:                        return 0;
                   1449:                default:
                   1450:                        break;
                   1451:                }
                   1452:        }
                   1453:        val = tr32(ofs);
                   1454:        val &= ~enable_bit;
                   1455:        tw32(ofs, val);
                   1456:        tr32(ofs);
                   1457: 
                   1458:        for (i = 0; i < MAX_WAIT_CNT; i++) {
                   1459:                udelay(100);
                   1460:                val = tr32(ofs);
                   1461:                if ((val & enable_bit) == 0)
                   1462:                        break;
                   1463:        }
                   1464: 
                   1465:        if (i == MAX_WAIT_CNT) {
                   1466:                printf( "tg3_stop_block timed out, ofs=%#lx enable_bit=%3x\n",
                   1467:                       ofs, enable_bit );
                   1468:                return -ENODEV;
                   1469:        }
                   1470: 
                   1471:        return 0;
                   1472: }
                   1473: 
                   1474: static int tg3_abort_hw(struct tg3 *tp)
                   1475: {
                   1476:        int i, err;
                   1477:        uint32_t val;
                   1478: 
                   1479:        tg3_disable_ints(tp);
                   1480: 
                   1481:        tp->rx_mode &= ~RX_MODE_ENABLE;
                   1482:        tw32_carefully(MAC_RX_MODE, tp->rx_mode);
                   1483: 
                   1484:        err  = tg3_stop_block(tp, RCVBDI_MODE,   RCVBDI_MODE_ENABLE);
                   1485:        err |= tg3_stop_block(tp, RCVLPC_MODE,   RCVLPC_MODE_ENABLE);
                   1486:        err |= tg3_stop_block(tp, RCVLSC_MODE,   RCVLSC_MODE_ENABLE);
                   1487:        err |= tg3_stop_block(tp, RCVDBDI_MODE,  RCVDBDI_MODE_ENABLE);
                   1488:        err |= tg3_stop_block(tp, RCVDCC_MODE,   RCVDCC_MODE_ENABLE);
                   1489:        err |= tg3_stop_block(tp, RCVCC_MODE,    RCVCC_MODE_ENABLE);
                   1490: 
                   1491:        err |= tg3_stop_block(tp, SNDBDS_MODE,   SNDBDS_MODE_ENABLE);
                   1492:        err |= tg3_stop_block(tp, SNDBDI_MODE,   SNDBDI_MODE_ENABLE);
                   1493:        err |= tg3_stop_block(tp, SNDDATAI_MODE, SNDDATAI_MODE_ENABLE);
                   1494:        err |= tg3_stop_block(tp, RDMAC_MODE,    RDMAC_MODE_ENABLE);
                   1495:        err |= tg3_stop_block(tp, SNDDATAC_MODE, SNDDATAC_MODE_ENABLE);
                   1496:        err |= tg3_stop_block(tp, SNDBDC_MODE,   SNDBDC_MODE_ENABLE);
                   1497:        if (err)
                   1498:                goto out;
                   1499: 
                   1500:        tp->mac_mode &= ~MAC_MODE_TDE_ENABLE;
                   1501:        tw32_carefully(MAC_MODE, tp->mac_mode);
                   1502: 
                   1503:        tp->tx_mode &= ~TX_MODE_ENABLE;
                   1504:        tw32_carefully(MAC_TX_MODE, tp->tx_mode);
                   1505: 
                   1506:        for (i = 0; i < MAX_WAIT_CNT; i++) {
                   1507:                udelay(100);
                   1508:                if (!(tr32(MAC_TX_MODE) & TX_MODE_ENABLE))
                   1509:                        break;
                   1510:        }
                   1511:        if (i >= MAX_WAIT_CNT) {
                   1512:                printf("tg3_abort_hw timed out TX_MODE_ENABLE will not clear MAC_TX_MODE=%x\n",
                   1513:                       (unsigned int) tr32(MAC_TX_MODE));
                   1514:                return -ENODEV;
                   1515:        }
                   1516: 
                   1517:        err  = tg3_stop_block(tp, HOSTCC_MODE, HOSTCC_MODE_ENABLE);
                   1518:        err |= tg3_stop_block(tp, WDMAC_MODE,  WDMAC_MODE_ENABLE);
                   1519:        err |= tg3_stop_block(tp, MBFREE_MODE, MBFREE_MODE_ENABLE);
                   1520: 
                   1521:        val = tr32(FTQ_RESET);
                   1522:        val |= FTQ_RESET_DMA_READ_QUEUE | FTQ_RESET_DMA_HIGH_PRI_READ |
                   1523:               FTQ_RESET_SEND_BD_COMPLETION | FTQ_RESET_DMA_WRITE |
                   1524:               FTQ_RESET_DMA_HIGH_PRI_WRITE | FTQ_RESET_SEND_DATA_COMPLETION |
                   1525:               FTQ_RESET_HOST_COALESCING | FTQ_RESET_MAC_TX |
                   1526:               FTQ_RESET_RX_BD_COMPLETE | FTQ_RESET_RX_LIST_PLCMT |
                   1527:                FTQ_RESET_RX_DATA_COMPLETION;
                   1528:        tw32(FTQ_RESET, val);
                   1529: 
                   1530:        err |= tg3_stop_block(tp, BUFMGR_MODE, BUFMGR_MODE_ENABLE);
                   1531:        err |= tg3_stop_block(tp, MEMARB_MODE, MEMARB_MODE_ENABLE);
                   1532:        if (err)
                   1533:                goto out;
                   1534: 
                   1535:        memset(tp->hw_status, 0, TG3_HW_STATUS_SIZE);
                   1536: 
                   1537: out:
                   1538:        return err;
                   1539: }
                   1540: 
                   1541: static void tg3_chip_reset(struct tg3 *tp)
                   1542: {
                   1543:        uint32_t val;
                   1544: 
                   1545:        if (!(tp->tg3_flags2 & TG3_FLG2_SUN_5704)) {
                   1546:                /* Force NVRAM to settle.
                   1547:                 * This deals with a chip bug which can result in EEPROM
                   1548:                 * corruption.
                   1549:                 */
                   1550:                if (tp->tg3_flags & TG3_FLAG_NVRAM) {
                   1551:                        int i;
                   1552:        
                   1553:                        tw32(NVRAM_SWARB, SWARB_REQ_SET1);
                   1554:                        for (i = 0; i < 100000; i++) {
                   1555:                                if (tr32(NVRAM_SWARB) & SWARB_GNT1)
                   1556:                                        break;
                   1557:                                udelay(10);
                   1558:                        }
                   1559:                }
                   1560:        }
                   1561:        /* In Etherboot we don't need to worry about the 5701
                   1562:         * REG_WRITE_BUG because we do all register writes indirectly.
                   1563:         */
                   1564: 
                   1565:        // Alf: here patched
                   1566:        /* do the reset */
                   1567:        val = GRC_MISC_CFG_CORECLK_RESET;
                   1568:        if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) {
                   1569:                if (tr32(0x7e2c) == 0x60) {
                   1570:                        tw32(0x7e2c, 0x20);
                   1571:                }
                   1572:                if (tp->pci_chip_rev_id != CHIPREV_ID_5750_A0) {
                   1573:                        tw32(GRC_MISC_CFG, (1 << 29));
                   1574:                        val |= (1 << 29);
                   1575:                }
                   1576:        }
                   1577:        
                   1578:        if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705)
                   1579:            || (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750)
                   1580:            || (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)) {
                   1581:                val |= GRC_MISC_CFG_KEEP_GPHY_POWER;
                   1582:        }
                   1583: 
                   1584:        // Alf : Please VALIDATE THIS.
                   1585:        // It is necessary in my case (5751) to prevent a reboot, but
                   1586:        // I have no idea about a side effect on any other version.
                   1587:        // It appears to be what's done in tigon3.c from Broadcom
                   1588:        if (tp->pci_chip_rev_id != CHIPREV_ID_5750_A0) {
                   1589:          tw32(GRC_MISC_CFG, 0x20000000) ;
                   1590:          val |= 0x20000000 ;
                   1591:        }
                   1592: 
                   1593:        tw32(GRC_MISC_CFG, val);
                   1594: 
                   1595:        /* Flush PCI posted writes.  The normal MMIO registers
                   1596:         * are inaccessible at this time so this is the only
                   1597:         * way to make this reliably.  I tried to use indirect
                   1598:         * register read/write but this upset some 5701 variants.
                   1599:         */
                   1600:        pci_read_config_dword(tp->pdev, PCI_COMMAND, &val);
                   1601: 
                   1602:        udelay(120);
                   1603: 
                   1604:        /* Re-enable indirect register accesses. */
                   1605:        pci_write_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL,
                   1606:                               tp->misc_host_ctrl);
                   1607: 
                   1608:        /* Set MAX PCI retry to zero. */
                   1609:        val = (PCISTATE_ROM_ENABLE | PCISTATE_ROM_RETRY_ENABLE);
                   1610:        if (tp->pci_chip_rev_id == CHIPREV_ID_5704_A0 &&
                   1611:            (tp->tg3_flags & TG3_FLAG_PCIX_MODE))
                   1612:                val |= PCISTATE_RETRY_SAME_DMA;
                   1613:        pci_write_config_dword(tp->pdev, TG3PCI_PCISTATE, val);
                   1614: 
                   1615:        pci_restore_state(tp->pdev, tp->pci_cfg_state);
                   1616: 
                   1617:        /* Make sure PCI-X relaxed ordering bit is clear. */
                   1618:        pci_read_config_dword(tp->pdev, TG3PCI_X_CAPS, &val);
                   1619:        val &= ~PCIX_CAPS_RELAXED_ORDERING;
                   1620:        pci_write_config_dword(tp->pdev, TG3PCI_X_CAPS, val);
                   1621: 
                   1622:        tw32(MEMARB_MODE, MEMARB_MODE_ENABLE);
                   1623: 
                   1624:        if (((tp->nic_sram_data_cfg & NIC_SRAM_DATA_CFG_MINI_PCI) != 0) &&
                   1625:                (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705)) {
                   1626:                tp->pci_clock_ctrl |=
                   1627:                        (CLOCK_CTRL_FORCE_CLKRUN | CLOCK_CTRL_CLKRUN_OENABLE);
                   1628:                tw32(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl);
                   1629:        }
                   1630: 
                   1631:        tw32(TG3PCI_MISC_HOST_CTRL, tp->misc_host_ctrl);
                   1632: }
                   1633: 
                   1634: static void tg3_stop_fw(struct tg3 *tp)
                   1635: {
                   1636:        if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) {
                   1637:                uint32_t val;
                   1638:                int i;
                   1639: 
                   1640:                tg3_write_mem(NIC_SRAM_FW_CMD_MBOX, FWCMD_NICDRV_PAUSE_FW);
                   1641:                val = tr32(GRC_RX_CPU_EVENT);
                   1642:                val |= (1 << 14);
                   1643:                tw32(GRC_RX_CPU_EVENT, val);
                   1644: 
                   1645:                /* Wait for RX cpu to ACK the event.  */
                   1646:                for (i = 0; i < 100; i++) {
                   1647:                        if (!(tr32(GRC_RX_CPU_EVENT) & (1 << 14)))
                   1648:                                break;
                   1649:                        udelay(1);
                   1650:                }
                   1651:        }
                   1652: }
                   1653: 
                   1654: static int tg3_restart_fw(struct tg3 *tp, uint32_t state)
                   1655: {
                   1656:        uint32_t val;
                   1657:        int i;
                   1658:        
                   1659:        tg3_write_mem(NIC_SRAM_FIRMWARE_MBOX, 
                   1660:                NIC_SRAM_FIRMWARE_MBOX_MAGIC1);
                   1661:        /* Wait for firmware initialization to complete. */
                   1662:        for (i = 0; i < 100000; i++) {
                   1663:                tg3_read_mem(NIC_SRAM_FIRMWARE_MBOX, &val);
                   1664:                if (val == (uint32_t) ~NIC_SRAM_FIRMWARE_MBOX_MAGIC1)
                   1665:                        break;
                   1666:                udelay(10);
                   1667:        }
                   1668:        if (i >= 100000 &&
                   1669:                    !(tp->tg3_flags2 & TG3_FLG2_SUN_5704) &&
                   1670:                    !(GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)) {
                   1671:                printf ( "Firmware will not restart magic=%#x\n",
                   1672:                        val );
                   1673:                return -ENODEV;
                   1674:        }
                   1675:        if (!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) {
                   1676:          state = DRV_STATE_SUSPEND;
                   1677:        }
                   1678: 
                   1679:        if ((tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) &&
                   1680:            (tp->pci_chip_rev_id != CHIPREV_ID_5750_A0)) {
                   1681:          // Enable PCIE bug fix
                   1682:          tg3_read_mem(0x7c00, &val);
                   1683:          tg3_write_mem(0x7c00, val | 0x02000000);
                   1684:        }
                   1685:        tg3_write_mem(NIC_SRAM_FW_DRV_STATE_MBOX, state);
                   1686:        return 0;
                   1687: }
                   1688: 
                   1689: static int tg3_halt(struct tg3 *tp)
                   1690: {
                   1691:        tg3_stop_fw(tp);
                   1692:        tg3_abort_hw(tp);
                   1693:        tg3_chip_reset(tp);
                   1694:        return tg3_restart_fw(tp, DRV_STATE_UNLOAD);
                   1695: }
                   1696: 
                   1697: static void __tg3_set_mac_addr(struct tg3 *tp)
                   1698: {
                   1699:        uint32_t addr_high, addr_low;
                   1700:        int i;
                   1701: 
                   1702:        addr_high = ((tp->nic->node_addr[0] << 8) |
                   1703:                     tp->nic->node_addr[1]);
                   1704:        addr_low = ((tp->nic->node_addr[2] << 24) |
                   1705:                    (tp->nic->node_addr[3] << 16) |
                   1706:                    (tp->nic->node_addr[4] <<  8) |
                   1707:                    (tp->nic->node_addr[5] <<  0));
                   1708:        for (i = 0; i < 4; i++) {
                   1709:                tw32(MAC_ADDR_0_HIGH + (i * 8), addr_high);
                   1710:                tw32(MAC_ADDR_0_LOW + (i * 8), addr_low);
                   1711:        }
                   1712: 
                   1713:        if ((GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700) &&
                   1714:                (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) &&
                   1715:                (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705)) {
                   1716:                for(i = 0; i < 12; i++) {
                   1717:                        tw32(MAC_EXTADDR_0_HIGH + (i * 8), addr_high);
                   1718:                        tw32(MAC_EXTADDR_0_LOW + (i * 8), addr_low);
                   1719:                }
                   1720:        }
                   1721:        addr_high = (tp->nic->node_addr[0] +
                   1722:                     tp->nic->node_addr[1] +
                   1723:                     tp->nic->node_addr[2] +
                   1724:                     tp->nic->node_addr[3] +
                   1725:                     tp->nic->node_addr[4] +
                   1726:                     tp->nic->node_addr[5]) &
                   1727:                TX_BACKOFF_SEED_MASK;
                   1728:        tw32(MAC_TX_BACKOFF_SEED, addr_high);
                   1729: }
                   1730: 
                   1731: static void tg3_set_bdinfo(struct tg3 *tp, uint32_t bdinfo_addr,
                   1732:                           dma_addr_t mapping, uint32_t maxlen_flags,
                   1733:                           uint32_t nic_addr)
                   1734: {
                   1735:        tg3_write_mem((bdinfo_addr +
                   1736:                       TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_HIGH),
                   1737:                      ((uint64_t) mapping >> 32));
                   1738:        tg3_write_mem((bdinfo_addr +
                   1739:                       TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW),
                   1740:                      ((uint64_t) mapping & 0xffffffff));
                   1741:        tg3_write_mem((bdinfo_addr +
                   1742:                       TG3_BDINFO_MAXLEN_FLAGS),
                   1743:                       maxlen_flags);
                   1744:        if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) {
                   1745:                tg3_write_mem((bdinfo_addr + TG3_BDINFO_NIC_ADDR), nic_addr);
                   1746:        }
                   1747: }
                   1748: 
                   1749: 
                   1750: static void tg3_init_rings(struct tg3 *tp)
                   1751: {
                   1752:        unsigned i;
                   1753: 
                   1754:        /* Zero out the tg3 variables */
                   1755:        memset(&tg3_bss, 0, sizeof(tg3_bss));
                   1756:        tp->rx_std    = &tg3_bss.rx_std[0];
                   1757:        tp->rx_rcb    = &tg3_bss.rx_rcb[0];
                   1758:        tp->tx_ring   = &tg3_bss.tx_ring[0];
                   1759:        tp->hw_status = &tg3_bss.hw_status;
                   1760:        tp->hw_stats  = &tg3_bss.hw_stats;
                   1761:        tp->mac_mode  = 0;
                   1762: 
                   1763: 
                   1764:        /* Initialize tx/rx rings for packet processing.
                   1765:         *
                   1766:         * The chip has been shut down and the driver detached from
                   1767:         * the networking, so no interrupts or new tx packets will
                   1768:         * end up in the driver.
                   1769:         */
                   1770: 
                   1771:        /* Initialize invariants of the rings, we only set this
                   1772:         * stuff once.  This works because the card does not
                   1773:         * write into the rx buffer posting rings.
                   1774:         */
                   1775:        for (i = 0; i < TG3_RX_RING_SIZE; i++) {
                   1776:                struct tg3_rx_buffer_desc *rxd;
                   1777: 
                   1778:                rxd = &tp->rx_std[i];
                   1779:                rxd->idx_len = (RX_PKT_BUF_SZ - 2 - 64) << RXD_LEN_SHIFT;
                   1780:                rxd->type_flags = (RXD_FLAG_END << RXD_FLAGS_SHIFT);
                   1781:                rxd->opaque = (RXD_OPAQUE_RING_STD | (i << RXD_OPAQUE_INDEX_SHIFT));
                   1782: 
                   1783:                /* Note where the receive buffer for the ring is placed */
                   1784:                rxd->addr_hi = 0;
                   1785:                rxd->addr_lo = virt_to_bus(
                   1786:                        &tg3_bss.rx_bufs[i%TG3_DEF_RX_RING_PENDING][2]);
                   1787:        }
                   1788: }
                   1789: 
                   1790: #define TG3_WRITE_SETTINGS(TABLE) \
                   1791: do { \
                   1792:        const uint32_t *_table, *_end; \
                   1793:        _table = TABLE; \
                   1794:        _end = _table + sizeof(TABLE)/sizeof(TABLE[0]);  \
                   1795:        for(; _table < _end; _table += 2) { \
                   1796:                tw32(_table[0], _table[1]); \
                   1797:        } \
                   1798: } while(0)
                   1799: 
                   1800: 
                   1801: /* initialize/reset the tg3 */
                   1802: static int tg3_setup_hw(struct tg3 *tp)
                   1803: {
                   1804:        uint32_t val, rdmac_mode;
                   1805:        int i, err, limit;
                   1806: 
                   1807:        /* Simply don't support setups with extremly buggy firmware in etherboot */
                   1808:        if (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0) {
                   1809:                printf("Error 5701_A0 firmware bug detected\n");
                   1810:                return -EINVAL;
                   1811:        }
                   1812: 
                   1813:        tg3_disable_ints(tp);
                   1814: 
                   1815:        /* Originally this was all in tg3_init_hw */
                   1816: 
                   1817:        /* Force the chip into D0. */
                   1818:        tg3_set_power_state_0(tp);
                   1819: 
                   1820:        tg3_switch_clocks(tp);
                   1821: 
                   1822:        tw32(TG3PCI_MEM_WIN_BASE_ADDR, 0);
                   1823: 
                   1824:        // This should go somewhere else
                   1825: #define T3_PCIE_CAPABILITY_ID_REG           0xD0
                   1826: #define T3_PCIE_CAPABILITY_ID               0x10
                   1827: #define T3_PCIE_CAPABILITY_REG              0xD2
                   1828: 
                   1829:        /* Originally this was all in tg3_reset_hw */
                   1830: 
                   1831:        tg3_stop_fw(tp);
                   1832: 
                   1833:        /* No need to call tg3_abort_hw here, it is called before tg3_setup_hw. */
                   1834: 
                   1835:        tg3_chip_reset(tp);
                   1836: 
                   1837:        tw32(GRC_MODE, tp->grc_mode);  /* Redundant? */
                   1838: 
                   1839:        err = tg3_restart_fw(tp, DRV_STATE_START);
                   1840:        if (err)
                   1841:                return err;
                   1842: 
                   1843:        if (tp->phy_id == PHY_ID_SERDES) {
                   1844:                tp->mac_mode = MAC_MODE_PORT_MODE_TBI;
                   1845:        }
                   1846:        tw32_carefully(MAC_MODE, tp->mac_mode);
                   1847: 
                   1848: 
                   1849:        /* This works around an issue with Athlon chipsets on
                   1850:         * B3 tigon3 silicon.  This bit has no effect on any
                   1851:         * other revision.
                   1852:         * Alf: Except 5750 ! (which reboots)
                   1853:         */
                   1854: 
                   1855:         if (!(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS))
                   1856:          tp->pci_clock_ctrl |= CLOCK_CTRL_DELAY_PCI_GRANT;
                   1857:        tw32_carefully(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl);
                   1858: 
                   1859:        if (tp->pci_chip_rev_id == CHIPREV_ID_5704_A0 &&
                   1860:            (tp->tg3_flags & TG3_FLAG_PCIX_MODE)) {
                   1861:                val = tr32(TG3PCI_PCISTATE);
                   1862:                val |= PCISTATE_RETRY_SAME_DMA;
                   1863:                tw32(TG3PCI_PCISTATE, val);
                   1864:        }
                   1865: 
                   1866:        /* Descriptor ring init may make accesses to the
                   1867:         * NIC SRAM area to setup the TX descriptors, so we
                   1868:         * can only do this after the hardware has been
                   1869:         * successfully reset.
                   1870:         */
                   1871:        tg3_init_rings(tp);
                   1872: 
                   1873:        /* Clear statistics/status block in chip */
                   1874:        if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) {
                   1875:                for (i = NIC_SRAM_STATS_BLK;
                   1876:                     i < NIC_SRAM_STATUS_BLK + TG3_HW_STATUS_SIZE;
                   1877:                     i += sizeof(uint32_t)) {
                   1878:                        tg3_write_mem(i, 0);
                   1879:                        udelay(40);
                   1880:                }
                   1881:        }
                   1882: 
                   1883:        /* This value is determined during the probe time DMA
                   1884:         * engine test, tg3_setup_dma.
                   1885:         */
                   1886:        tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl);
                   1887: 
                   1888:        tp->grc_mode &= ~(GRC_MODE_HOST_SENDBDS |
                   1889:                          GRC_MODE_4X_NIC_SEND_RINGS |
                   1890:                          GRC_MODE_NO_TX_PHDR_CSUM |
                   1891:                          GRC_MODE_NO_RX_PHDR_CSUM);
                   1892:        tp->grc_mode |= GRC_MODE_HOST_SENDBDS;
                   1893:        tp->grc_mode |= GRC_MODE_NO_TX_PHDR_CSUM;
                   1894:        tp->grc_mode |= GRC_MODE_NO_RX_PHDR_CSUM;
                   1895: 
                   1896:        tw32(GRC_MODE,
                   1897:                tp->grc_mode | 
                   1898:                (GRC_MODE_IRQ_ON_MAC_ATTN | GRC_MODE_HOST_STACKUP));
                   1899: 
                   1900:        /* Setup the timer prescalar register.  Clock is always 66Mhz. */
                   1901:        tw32(GRC_MISC_CFG,
                   1902:             (65 << GRC_MISC_CFG_PRESCALAR_SHIFT));
                   1903: 
                   1904:        /* Initialize MBUF/DESC pool. */
                   1905:        if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) {
                   1906:                /* Do nothing. */
                   1907:        } else if ((GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) &&
                   1908:                (tp->pci_chip_rev_id != CHIPREV_ID_5721)) {
                   1909:                tw32(BUFMGR_MB_POOL_ADDR, NIC_SRAM_MBUF_POOL_BASE);
                   1910:                if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704)
                   1911:                        tw32(BUFMGR_MB_POOL_SIZE, NIC_SRAM_MBUF_POOL_SIZE64);
                   1912:                else
                   1913:                        tw32(BUFMGR_MB_POOL_SIZE, NIC_SRAM_MBUF_POOL_SIZE96);
                   1914:                tw32(BUFMGR_DMA_DESC_POOL_ADDR, NIC_SRAM_DMA_DESC_POOL_BASE);
                   1915:                tw32(BUFMGR_DMA_DESC_POOL_SIZE, NIC_SRAM_DMA_DESC_POOL_SIZE);
                   1916:        }
                   1917:        if (!(tp->tg3_flags & TG3_FLAG_JUMBO_ENABLE)) {
                   1918:                tw32(BUFMGR_MB_RDMA_LOW_WATER,
                   1919:                     tp->bufmgr_config.mbuf_read_dma_low_water);
                   1920:                tw32(BUFMGR_MB_MACRX_LOW_WATER,
                   1921:                     tp->bufmgr_config.mbuf_mac_rx_low_water);
                   1922:                tw32(BUFMGR_MB_HIGH_WATER,
                   1923:                     tp->bufmgr_config.mbuf_high_water);
                   1924:        } else {
                   1925:                tw32(BUFMGR_MB_RDMA_LOW_WATER,
                   1926:                     tp->bufmgr_config.mbuf_read_dma_low_water_jumbo);
                   1927:                tw32(BUFMGR_MB_MACRX_LOW_WATER,
                   1928:                     tp->bufmgr_config.mbuf_mac_rx_low_water_jumbo);
                   1929:                tw32(BUFMGR_MB_HIGH_WATER,
                   1930:                     tp->bufmgr_config.mbuf_high_water_jumbo);
                   1931:        }
                   1932:        tw32(BUFMGR_DMA_LOW_WATER,
                   1933:             tp->bufmgr_config.dma_low_water);
                   1934:        tw32(BUFMGR_DMA_HIGH_WATER,
                   1935:             tp->bufmgr_config.dma_high_water);
                   1936: 
                   1937:        tw32(BUFMGR_MODE, BUFMGR_MODE_ENABLE | BUFMGR_MODE_ATTN_ENABLE);
                   1938:        for (i = 0; i < 2000; i++) {
                   1939:                if (tr32(BUFMGR_MODE) & BUFMGR_MODE_ENABLE)
                   1940:                        break;
                   1941:                udelay(10);
                   1942:        }
                   1943:        if (i >= 2000) {
                   1944:                printf("tg3_setup_hw cannot enable BUFMGR\n");
                   1945:                return -ENODEV;
                   1946:        }
                   1947: 
                   1948:        tw32(FTQ_RESET, 0xffffffff);
                   1949:        tw32(FTQ_RESET, 0x00000000);
                   1950:        for (i = 0; i < 2000; i++) {
                   1951:                if (tr32(FTQ_RESET) == 0x00000000)
                   1952:                        break;
                   1953:                udelay(10);
                   1954:        }
                   1955:        if (i >= 2000) {
                   1956:                printf("tg3_setup_hw cannot reset FTQ\n");
                   1957:                return -ENODEV;
                   1958:        }
                   1959: 
                   1960:        /* Initialize TG3_BDINFO's at:
                   1961:         *  RCVDBDI_STD_BD:     standard eth size rx ring
                   1962:         *  RCVDBDI_JUMBO_BD:   jumbo frame rx ring
                   1963:         *  RCVDBDI_MINI_BD:    small frame rx ring (??? does not work)
                   1964:         *
                   1965:         * like so:
                   1966:         *  TG3_BDINFO_HOST_ADDR:       high/low parts of DMA address of ring
                   1967:         *  TG3_BDINFO_MAXLEN_FLAGS:    (rx max buffer size << 16) |
                   1968:         *                              ring attribute flags
                   1969:         *  TG3_BDINFO_NIC_ADDR:        location of descriptors in nic SRAM
                   1970:         *
                   1971:         * Standard receive ring @ NIC_SRAM_RX_BUFFER_DESC, 512 entries.
                   1972:         * Jumbo receive ring @ NIC_SRAM_RX_JUMBO_BUFFER_DESC, 256 entries.
                   1973:         *
                   1974:         * ??? No space allocated for mini receive ring? :(
                   1975:         *
                   1976:         * The size of each ring is fixed in the firmware, but the location is
                   1977:         * configurable.
                   1978:         */
                   1979:        {
                   1980:                static const uint32_t table_all[] = {
                   1981:                        /* Setup replenish thresholds. */
                   1982:                        RCVBDI_STD_THRESH, TG3_DEF_RX_RING_PENDING / 8,
                   1983: 
                   1984:                        /* Etherboot lives below 4GB */
                   1985:                        RCVDBDI_STD_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_HIGH, 0,
                   1986:                        RCVDBDI_STD_BD + TG3_BDINFO_NIC_ADDR, NIC_SRAM_RX_BUFFER_DESC,
                   1987:                };
                   1988:                static const uint32_t table_not_5705[] = {
                   1989:                        /* Buffer maximum length */
                   1990:                        RCVDBDI_STD_BD + TG3_BDINFO_MAXLEN_FLAGS, RX_STD_MAX_SIZE << BDINFO_FLAGS_MAXLEN_SHIFT,
                   1991:                        
                   1992:                        /* Disable the mini frame rx ring */
                   1993:                        RCVDBDI_MINI_BD + TG3_BDINFO_MAXLEN_FLAGS,      BDINFO_FLAGS_DISABLED,
                   1994:                        
                   1995:                        /* Disable the jumbo frame rx ring */
                   1996:                        RCVBDI_JUMBO_THRESH, 0,
                   1997:                        RCVDBDI_JUMBO_BD + TG3_BDINFO_MAXLEN_FLAGS, BDINFO_FLAGS_DISABLED,
                   1998:                        
                   1999:                        
                   2000:                };
                   2001:                TG3_WRITE_SETTINGS(table_all);
                   2002:                tw32(RCVDBDI_STD_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW, 
                   2003:                        virt_to_bus(tp->rx_std));
                   2004:                if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 ||
                   2005:                    GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) {
                   2006:                        tw32(RCVDBDI_STD_BD + TG3_BDINFO_MAXLEN_FLAGS,
                   2007:                                RX_STD_MAX_SIZE_5705 << BDINFO_FLAGS_MAXLEN_SHIFT);
                   2008:                } else {
                   2009:                        TG3_WRITE_SETTINGS(table_not_5705);
                   2010:                }
                   2011:        }
                   2012: 
                   2013:        
                   2014:        /* There is only one send ring on 5705 and 5787, no need to explicitly
                   2015:         * disable the others.
                   2016:         */
                   2017:        if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705 &&
                   2018:            GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5787) {
                   2019:                /* Clear out send RCB ring in SRAM. */
                   2020:                for (i = NIC_SRAM_SEND_RCB; i < NIC_SRAM_RCV_RET_RCB; i += TG3_BDINFO_SIZE)
                   2021:                        tg3_write_mem(i + TG3_BDINFO_MAXLEN_FLAGS, BDINFO_FLAGS_DISABLED);
                   2022:        }
                   2023: 
                   2024:        tp->tx_prod = 0;
                   2025:        tw32_mailbox(MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW, 0);
                   2026:        tw32_mailbox2(MAILBOX_SNDNIC_PROD_IDX_0 + TG3_64BIT_REG_LOW, 0);
                   2027: 
                   2028:        tg3_set_bdinfo(tp,
                   2029:                NIC_SRAM_SEND_RCB,
                   2030:                virt_to_bus(tp->tx_ring),
                   2031:                (TG3_TX_RING_SIZE << BDINFO_FLAGS_MAXLEN_SHIFT),
                   2032:                NIC_SRAM_TX_BUFFER_DESC);
                   2033: 
                   2034:        /* There is only one receive return ring on 5705 and 5787, no need to
                   2035:         * explicitly disable the others.
                   2036:         */
                   2037:        if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705 &&
                   2038:            GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5787) {
                   2039:                for (i = NIC_SRAM_RCV_RET_RCB; i < NIC_SRAM_STATS_BLK; i += TG3_BDINFO_SIZE) {
                   2040:                        tg3_write_mem(i + TG3_BDINFO_MAXLEN_FLAGS,
                   2041:                                BDINFO_FLAGS_DISABLED);
                   2042:                }
                   2043:        }
                   2044: 
                   2045:        tp->rx_rcb_ptr = 0;
                   2046:        tw32_mailbox2(MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW, 0);
                   2047: 
                   2048:        tg3_set_bdinfo(tp,
                   2049:                NIC_SRAM_RCV_RET_RCB,
                   2050:                virt_to_bus(tp->rx_rcb),
                   2051:                (TG3_RX_RCB_RING_SIZE << BDINFO_FLAGS_MAXLEN_SHIFT),
                   2052:                0);
                   2053: 
                   2054:        tp->rx_std_ptr = TG3_DEF_RX_RING_PENDING;
                   2055:        tw32_mailbox2(MAILBOX_RCV_STD_PROD_IDX + TG3_64BIT_REG_LOW,
                   2056:                     tp->rx_std_ptr);
                   2057: 
                   2058:        tw32_mailbox2(MAILBOX_RCV_JUMBO_PROD_IDX + TG3_64BIT_REG_LOW, 0);
                   2059: 
                   2060:        /* Initialize MAC address and backoff seed. */
                   2061:        __tg3_set_mac_addr(tp);
                   2062: 
                   2063:        /* Calculate RDMAC_MODE setting early, we need it to determine
                   2064:         * the RCVLPC_STATE_ENABLE mask.
                   2065:         */
                   2066:        rdmac_mode = (RDMAC_MODE_ENABLE | RDMAC_MODE_TGTABORT_ENAB |
                   2067:                RDMAC_MODE_MSTABORT_ENAB | RDMAC_MODE_PARITYERR_ENAB |
                   2068:                RDMAC_MODE_ADDROFLOW_ENAB | RDMAC_MODE_FIFOOFLOW_ENAB |
                   2069:                RDMAC_MODE_FIFOURUN_ENAB | RDMAC_MODE_FIFOOREAD_ENAB |
                   2070:                RDMAC_MODE_LNGREAD_ENAB);
                   2071:        if (tp->tg3_flags & TG3_FLAG_SPLIT_MODE)
                   2072:                rdmac_mode |= RDMAC_MODE_SPLIT_ENABLE;
                   2073:        if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
                   2074:                if (tp->pci_chip_rev_id != CHIPREV_ID_5705_A0) {
                   2075:                        if (!(tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH) &&
                   2076:                                !(tp->tg3_flags2 & TG3_FLG2_IS_5788)) {
                   2077:                                rdmac_mode |= RDMAC_MODE_FIFO_LONG_BURST;
                   2078:                        }
                   2079:                }
                   2080:        }
                   2081: 
                   2082:        /* Setup host coalescing engine. */
                   2083:        tw32(HOSTCC_MODE, 0);
                   2084:        for (i = 0; i < 2000; i++) {
                   2085:                if (!(tr32(HOSTCC_MODE) & HOSTCC_MODE_ENABLE))
                   2086:                        break;
                   2087:                udelay(10);
                   2088:        }
                   2089: 
                   2090:        tp->mac_mode = MAC_MODE_TXSTAT_ENABLE | MAC_MODE_RXSTAT_ENABLE |
                   2091:                MAC_MODE_TDE_ENABLE | MAC_MODE_RDE_ENABLE | MAC_MODE_FHDE_ENABLE;
                   2092:        tw32_carefully(MAC_MODE, tp->mac_mode | MAC_MODE_RXSTAT_CLEAR | MAC_MODE_TXSTAT_CLEAR);
                   2093: 
                   2094:        tp->grc_local_ctrl = GRC_LCLCTRL_INT_ON_ATTN | GRC_LCLCTRL_AUTO_SEEPROM;
                   2095:        if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700)
                   2096:                tp->grc_local_ctrl |= (GRC_LCLCTRL_GPIO_OE1 |
                   2097:                                       GRC_LCLCTRL_GPIO_OUTPUT1);
                   2098:        tw32_carefully(GRC_LOCAL_CTRL, tp->grc_local_ctrl);
                   2099: 
                   2100:        tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0);
                   2101:        tr32(MAILBOX_INTERRUPT_0);
                   2102: 
                   2103:        if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) {
                   2104:                tw32_carefully(DMAC_MODE, DMAC_MODE_ENABLE);
                   2105:        }
                   2106: 
                   2107:        val = ( WDMAC_MODE_ENABLE | WDMAC_MODE_TGTABORT_ENAB |
                   2108:                WDMAC_MODE_MSTABORT_ENAB | WDMAC_MODE_PARITYERR_ENAB |
                   2109:                WDMAC_MODE_ADDROFLOW_ENAB | WDMAC_MODE_FIFOOFLOW_ENAB |
                   2110:                WDMAC_MODE_FIFOURUN_ENAB | WDMAC_MODE_FIFOOREAD_ENAB |
                   2111:                WDMAC_MODE_LNGREAD_ENAB);
                   2112:        if ((GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) &&
                   2113:                ((tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH) != 0) &&
                   2114:                !(tp->tg3_flags2 & TG3_FLG2_IS_5788)) {
                   2115:                val |= WDMAC_MODE_RX_ACCEL;
                   2116:        }
                   2117: 
                   2118:        /* Host coalescing bug fix */
                   2119:        if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)
                   2120:                val |= (1 << 29);
                   2121: 
                   2122:        tw32_carefully(WDMAC_MODE, val);
                   2123: 
                   2124:        if ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) != 0) {
                   2125:                val = tr32(TG3PCI_X_CAPS);
                   2126:                if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703) {
                   2127:                        val &= PCIX_CAPS_BURST_MASK;
                   2128:                        val |= (PCIX_CAPS_MAX_BURST_CPIOB << PCIX_CAPS_BURST_SHIFT);
                   2129:                } else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) {
                   2130:                        val &= ~(PCIX_CAPS_SPLIT_MASK | PCIX_CAPS_BURST_MASK);
                   2131:                        val |= (PCIX_CAPS_MAX_BURST_CPIOB << PCIX_CAPS_BURST_SHIFT);
                   2132:                        if (tp->tg3_flags & TG3_FLAG_SPLIT_MODE)
                   2133:                                val |= (tp->split_mode_max_reqs <<
                   2134:                                        PCIX_CAPS_SPLIT_SHIFT);
                   2135:                }
                   2136:                tw32(TG3PCI_X_CAPS, val);
                   2137:        }
                   2138: 
                   2139:        tw32_carefully(RDMAC_MODE, rdmac_mode);
                   2140:        {
                   2141:                static const uint32_t table_all[] = {
                   2142:                        /* MTU + ethernet header + FCS + optional VLAN tag */
                   2143:                        MAC_RX_MTU_SIZE, ETH_MAX_MTU + ETH_HLEN + 8,
                   2144:                        
                   2145:                        /* The slot time is changed by tg3_setup_phy if we
                   2146:                         * run at gigabit with half duplex.
                   2147:                         */
                   2148:                        MAC_TX_LENGTHS, 
                   2149:                        (2 << TX_LENGTHS_IPG_CRS_SHIFT) |
                   2150:                        (6 << TX_LENGTHS_IPG_SHIFT) |
                   2151:                        (32 << TX_LENGTHS_SLOT_TIME_SHIFT),
                   2152:                        
                   2153:                        /* Receive rules. */
                   2154:                        MAC_RCV_RULE_CFG, RCV_RULE_CFG_DEFAULT_CLASS,
                   2155:                        RCVLPC_CONFIG, 0x0181,
                   2156:                        
                   2157:                        /* Receive/send statistics. */
                   2158:                        RCVLPC_STATS_ENABLE, 0xffffff,
                   2159:                        RCVLPC_STATSCTRL, RCVLPC_STATSCTRL_ENABLE,
                   2160:                        SNDDATAI_STATSENAB, 0xffffff,
                   2161:                        SNDDATAI_STATSCTRL, (SNDDATAI_SCTRL_ENABLE |SNDDATAI_SCTRL_FASTUPD),
                   2162:                        
                   2163:                        /* Host coalescing engine */
                   2164:                        HOSTCC_RXCOL_TICKS, 0,
                   2165:                        HOSTCC_TXCOL_TICKS, LOW_TXCOL_TICKS,
                   2166:                        HOSTCC_RXMAX_FRAMES, 1,
                   2167:                        HOSTCC_TXMAX_FRAMES, LOW_RXMAX_FRAMES,
                   2168:                        HOSTCC_RXCOAL_MAXF_INT, 1,
                   2169:                        HOSTCC_TXCOAL_MAXF_INT, 0,
                   2170:                        
                   2171:                        /* Status/statistics block address. */
                   2172:                        /* Etherboot lives below 4GB, so HIGH == 0 */
                   2173:                        HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH, 0,
                   2174: 
                   2175:                        /* No need to enable 32byte coalesce mode. */
                   2176:                        HOSTCC_MODE, HOSTCC_MODE_ENABLE | 0,
                   2177:                        
                   2178:                        RCVCC_MODE, RCVCC_MODE_ENABLE | RCVCC_MODE_ATTN_ENABLE,
                   2179:                        RCVLPC_MODE, RCVLPC_MODE_ENABLE,
                   2180:                        
                   2181:                        RCVDCC_MODE, RCVDCC_MODE_ENABLE | RCVDCC_MODE_ATTN_ENABLE,
                   2182: 
                   2183:                        SNDDATAC_MODE, SNDDATAC_MODE_ENABLE,
                   2184:                        SNDBDC_MODE, SNDBDC_MODE_ENABLE | SNDBDC_MODE_ATTN_ENABLE,
                   2185:                        RCVBDI_MODE, RCVBDI_MODE_ENABLE | RCVBDI_MODE_RCB_ATTN_ENAB,
                   2186:                        RCVDBDI_MODE, RCVDBDI_MODE_ENABLE | RCVDBDI_MODE_INV_RING_SZ,
                   2187:                        SNDDATAI_MODE, SNDDATAI_MODE_ENABLE,
                   2188:                        SNDBDI_MODE, SNDBDI_MODE_ENABLE | SNDBDI_MODE_ATTN_ENABLE,
                   2189:                        SNDBDS_MODE, SNDBDS_MODE_ENABLE | SNDBDS_MODE_ATTN_ENABLE,
                   2190:                        
                   2191:                        /* Accept all multicast frames. */
                   2192:                        MAC_HASH_REG_0, 0xffffffff,
                   2193:                        MAC_HASH_REG_1, 0xffffffff,
                   2194:                        MAC_HASH_REG_2, 0xffffffff,
                   2195:                        MAC_HASH_REG_3, 0xffffffff,
                   2196:                };
                   2197:                static const uint32_t table_not_5705[] = {
                   2198:                        /* Host coalescing engine */
                   2199:                        HOSTCC_RXCOAL_TICK_INT, 0,
                   2200:                        HOSTCC_TXCOAL_TICK_INT, 0,
                   2201: 
                   2202:                        /* Status/statistics block address. */
                   2203:                        /* Etherboot lives below 4GB, so HIGH == 0 */
                   2204:                        HOSTCC_STAT_COAL_TICKS, DEFAULT_STAT_COAL_TICKS,
                   2205:                        HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH, 0,
                   2206:                        HOSTCC_STATS_BLK_NIC_ADDR, NIC_SRAM_STATS_BLK,
                   2207:                        HOSTCC_STATUS_BLK_NIC_ADDR, NIC_SRAM_STATUS_BLK,
                   2208: 
                   2209:                        RCVLSC_MODE, RCVLSC_MODE_ENABLE | RCVLSC_MODE_ATTN_ENABLE,
                   2210: 
                   2211:                        MBFREE_MODE, MBFREE_MODE_ENABLE,
                   2212:                };
                   2213:                TG3_WRITE_SETTINGS(table_all);
                   2214:                tw32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW,
                   2215:                        virt_to_bus(tp->hw_stats));
                   2216:                tw32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW,
                   2217:                        virt_to_bus(tp->hw_status));
                   2218:                if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705 &&
                   2219:                    GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5787) {
                   2220:                        TG3_WRITE_SETTINGS(table_not_5705);
                   2221:                }
                   2222:        }
                   2223: 
                   2224:        tp->tx_mode = TX_MODE_ENABLE;
                   2225:        tw32_carefully(MAC_TX_MODE, tp->tx_mode);
                   2226: 
                   2227:        tp->rx_mode = RX_MODE_ENABLE;
                   2228:        tw32_carefully(MAC_RX_MODE, tp->rx_mode);
                   2229: 
                   2230:        tp->mi_mode = MAC_MI_MODE_BASE;
                   2231:        tw32_carefully(MAC_MI_MODE, tp->mi_mode);
                   2232: 
                   2233:        tw32(MAC_LED_CTRL, 0);
                   2234:        tw32(MAC_MI_STAT, MAC_MI_STAT_LNKSTAT_ATTN_ENAB);
                   2235:        if (tp->phy_id == PHY_ID_SERDES) {
                   2236:                tw32_carefully(MAC_RX_MODE, RX_MODE_RESET);
                   2237:        }
                   2238:        tp->rx_mode |= RX_MODE_KEEP_VLAN_TAG; /* drop tagged vlan packets */
                   2239:        tw32_carefully(MAC_RX_MODE, tp->rx_mode);
                   2240: 
                   2241:        if (tp->pci_chip_rev_id == CHIPREV_ID_5703_A1)
                   2242:                tw32(MAC_SERDES_CFG, 0x616000);
                   2243: 
                   2244:        /* Prevent chip from dropping frames when flow control
                   2245:         * is enabled.
                   2246:         */
                   2247:        tw32(MAC_LOW_WMARK_MAX_RX_FRAME, 2);
                   2248:        tr32(MAC_LOW_WMARK_MAX_RX_FRAME);
                   2249: 
                   2250:        err = tg3_setup_phy(tp);
                   2251: 
                   2252:        /* Ignore CRC stats */
                   2253: 
                   2254:        /* Initialize receive rules. */
                   2255:        tw32(MAC_RCV_RULE_0,  0xc2000000 & RCV_RULE_DISABLE_MASK);
                   2256:        tw32(MAC_RCV_VALUE_0, 0xffffffff & RCV_RULE_DISABLE_MASK);
                   2257:        tw32(MAC_RCV_RULE_1,  0x86000004 & RCV_RULE_DISABLE_MASK);
                   2258:        tw32(MAC_RCV_VALUE_1, 0xffffffff & RCV_RULE_DISABLE_MASK);
                   2259: 
                   2260:        if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705)
                   2261:            || (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750))
                   2262:                limit = 8;
                   2263:        else
                   2264:                limit = 16;
                   2265:        if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF)
                   2266:                limit -= 4;
                   2267:        switch (limit) {
                   2268:        case 16:        tw32(MAC_RCV_RULE_15,  0); tw32(MAC_RCV_VALUE_15,  0);
                   2269:        case 15:        tw32(MAC_RCV_RULE_14,  0); tw32(MAC_RCV_VALUE_14,  0);
                   2270:        case 14:        tw32(MAC_RCV_RULE_13,  0); tw32(MAC_RCV_VALUE_13,  0);
                   2271:        case 13:        tw32(MAC_RCV_RULE_12,  0); tw32(MAC_RCV_VALUE_12,  0);
                   2272:        case 12:        tw32(MAC_RCV_RULE_11,  0); tw32(MAC_RCV_VALUE_11,  0);
                   2273:        case 11:        tw32(MAC_RCV_RULE_10,  0); tw32(MAC_RCV_VALUE_10,  0);
                   2274:        case 10:        tw32(MAC_RCV_RULE_9,  0);  tw32(MAC_RCV_VALUE_9,  0);
                   2275:        case 9:         tw32(MAC_RCV_RULE_8,  0);  tw32(MAC_RCV_VALUE_8,  0);
                   2276:        case 8:         tw32(MAC_RCV_RULE_7,  0);  tw32(MAC_RCV_VALUE_7,  0);
                   2277:        case 7:         tw32(MAC_RCV_RULE_6,  0);  tw32(MAC_RCV_VALUE_6,  0);
                   2278:        case 6:         tw32(MAC_RCV_RULE_5,  0);  tw32(MAC_RCV_VALUE_5,  0);
                   2279:        case 5:         tw32(MAC_RCV_RULE_4,  0);  tw32(MAC_RCV_VALUE_4,  0);
                   2280:        case 4:         /* tw32(MAC_RCV_RULE_3,  0); tw32(MAC_RCV_VALUE_3,  0); */
                   2281:        case 3:         /* tw32(MAC_RCV_RULE_2,  0); tw32(MAC_RCV_VALUE_2,  0); */
                   2282:        case 2:
                   2283:        case 1:
                   2284:        default:
                   2285:                break;
                   2286:        };
                   2287: 
                   2288:        return err;
                   2289: }
                   2290: 
                   2291: 
                   2292: 
                   2293: /* Chips other than 5700/5701 use the NVRAM for fetching info. */
                   2294: static void tg3_nvram_init(struct tg3 *tp)
                   2295: {
                   2296:        tw32(GRC_EEPROM_ADDR,
                   2297:             (EEPROM_ADDR_FSM_RESET |
                   2298:              (EEPROM_DEFAULT_CLOCK_PERIOD <<
                   2299:               EEPROM_ADDR_CLKPERD_SHIFT)));
                   2300: 
                   2301:        mdelay(1);
                   2302: 
                   2303:        /* Enable seeprom accesses. */
                   2304:        tw32_carefully(GRC_LOCAL_CTRL,
                   2305:                tr32(GRC_LOCAL_CTRL) | GRC_LCLCTRL_AUTO_SEEPROM);
                   2306: 
                   2307:        if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700 &&
                   2308:            GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) {
                   2309:                uint32_t nvcfg1 = tr32(NVRAM_CFG1);
                   2310: 
                   2311:                tp->tg3_flags |= TG3_FLAG_NVRAM;
                   2312:                if (nvcfg1 & NVRAM_CFG1_FLASHIF_ENAB) {
                   2313:                        if (nvcfg1 & NVRAM_CFG1_BUFFERED_MODE)
                   2314:                                tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
                   2315:                } else {
                   2316:                        nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS;
                   2317:                        tw32(NVRAM_CFG1, nvcfg1);
                   2318:                }
                   2319: 
                   2320:        } else {
                   2321:                tp->tg3_flags &= ~(TG3_FLAG_NVRAM | TG3_FLAG_NVRAM_BUFFERED);
                   2322:        }
                   2323: }
                   2324: 
                   2325: 
                   2326: static int tg3_nvram_read_using_eeprom(
                   2327:        struct tg3 *tp __unused, uint32_t offset, uint32_t *val)
                   2328: {
                   2329:        uint32_t tmp;
                   2330:        int i;
                   2331: 
                   2332:        if (offset > EEPROM_ADDR_ADDR_MASK ||
                   2333:                (offset % 4) != 0) {
                   2334:                return -EINVAL;
                   2335:        }
                   2336: 
                   2337:        tmp = tr32(GRC_EEPROM_ADDR) & ~(EEPROM_ADDR_ADDR_MASK |
                   2338:                                        EEPROM_ADDR_DEVID_MASK |
                   2339:                                        EEPROM_ADDR_READ);
                   2340:        tw32(GRC_EEPROM_ADDR,
                   2341:             tmp |
                   2342:             (0 << EEPROM_ADDR_DEVID_SHIFT) |
                   2343:             ((offset << EEPROM_ADDR_ADDR_SHIFT) &
                   2344:              EEPROM_ADDR_ADDR_MASK) |
                   2345:             EEPROM_ADDR_READ | EEPROM_ADDR_START);
                   2346: 
                   2347:        for (i = 0; i < 10000; i++) {
                   2348:                tmp = tr32(GRC_EEPROM_ADDR);
                   2349: 
                   2350:                if (tmp & EEPROM_ADDR_COMPLETE)
                   2351:                        break;
                   2352:                udelay(100);
                   2353:        }
                   2354:        if (!(tmp & EEPROM_ADDR_COMPLETE)) {
                   2355:                return -EBUSY;
                   2356:        }
                   2357: 
                   2358:        *val = tr32(GRC_EEPROM_DATA);
                   2359:        return 0;
                   2360: }
                   2361: 
                   2362: static int tg3_nvram_read(struct tg3 *tp, uint32_t offset, uint32_t *val)
                   2363: {
                   2364:        int i, saw_done_clear;
                   2365: 
                   2366:        if (!(tp->tg3_flags & TG3_FLAG_NVRAM))
                   2367:                return tg3_nvram_read_using_eeprom(tp, offset, val);
                   2368: 
                   2369:        if (tp->tg3_flags & TG3_FLAG_NVRAM_BUFFERED)
                   2370:                offset = ((offset / NVRAM_BUFFERED_PAGE_SIZE) <<
                   2371:                          NVRAM_BUFFERED_PAGE_POS) +
                   2372:                        (offset % NVRAM_BUFFERED_PAGE_SIZE);
                   2373: 
                   2374:        if (offset > NVRAM_ADDR_MSK)
                   2375:                return -EINVAL;
                   2376: 
                   2377:        tw32(NVRAM_SWARB, SWARB_REQ_SET1);
                   2378:        for (i = 0; i < 1000; i++) {
                   2379:                if (tr32(NVRAM_SWARB) & SWARB_GNT1)
                   2380:                        break;
                   2381:                udelay(20);
                   2382:        }
                   2383: 
                   2384:        tw32(NVRAM_ADDR, offset);
                   2385:        tw32(NVRAM_CMD,
                   2386:             NVRAM_CMD_RD | NVRAM_CMD_GO |
                   2387:             NVRAM_CMD_FIRST | NVRAM_CMD_LAST | NVRAM_CMD_DONE);
                   2388: 
                   2389:        /* Wait for done bit to clear then set again. */
                   2390:        saw_done_clear = 0;
                   2391:        for (i = 0; i < 1000; i++) {
                   2392:                udelay(10);
                   2393:                if (!saw_done_clear &&
                   2394:                    !(tr32(NVRAM_CMD) & NVRAM_CMD_DONE))
                   2395:                        saw_done_clear = 1;
                   2396:                else if (saw_done_clear &&
                   2397:                         (tr32(NVRAM_CMD) & NVRAM_CMD_DONE))
                   2398:                        break;
                   2399:        }
                   2400:        if (i >= 1000) {
                   2401:                tw32(NVRAM_SWARB, SWARB_REQ_CLR1);
                   2402:                return -EBUSY;
                   2403:        }
                   2404: 
                   2405:        *val = bswap_32(tr32(NVRAM_RDDATA));
                   2406:        tw32(NVRAM_SWARB, 0x20);
                   2407: 
                   2408:        return 0;
                   2409: }
                   2410: 
                   2411: struct subsys_tbl_ent {
                   2412:        uint16_t subsys_vendor, subsys_devid;
                   2413:        uint32_t phy_id;
                   2414: };
                   2415: 
                   2416: static struct subsys_tbl_ent subsys_id_to_phy_id[] = {
                   2417:        /* Broadcom boards. */
                   2418:        { 0x14e4, 0x1644, PHY_ID_BCM5401 }, /* BCM95700A6 */
                   2419:        { 0x14e4, 0x0001, PHY_ID_BCM5701 }, /* BCM95701A5 */
                   2420:        { 0x14e4, 0x0002, PHY_ID_BCM8002 }, /* BCM95700T6 */
                   2421:        { 0x14e4, 0x0003, PHY_ID_SERDES  }, /* BCM95700A9 */
                   2422:        { 0x14e4, 0x0005, PHY_ID_BCM5701 }, /* BCM95701T1 */
                   2423:        { 0x14e4, 0x0006, PHY_ID_BCM5701 }, /* BCM95701T8 */
                   2424:        { 0x14e4, 0x0007, PHY_ID_SERDES  }, /* BCM95701A7 */
                   2425:        { 0x14e4, 0x0008, PHY_ID_BCM5701 }, /* BCM95701A10 */
                   2426:        { 0x14e4, 0x8008, PHY_ID_BCM5701 }, /* BCM95701A12 */
                   2427:        { 0x14e4, 0x0009, PHY_ID_BCM5701 }, /* BCM95703Ax1 */
                   2428:        { 0x14e4, 0x8009, PHY_ID_BCM5701 }, /* BCM95703Ax2 */
                   2429: 
                   2430:        /* 3com boards. */
                   2431:        { PCI_VENDOR_ID_3COM, 0x1000, PHY_ID_BCM5401 }, /* 3C996T */
                   2432:        { PCI_VENDOR_ID_3COM, 0x1006, PHY_ID_BCM5701 }, /* 3C996BT */
                   2433:        /* { PCI_VENDOR_ID_3COM, 0x1002, PHY_ID_XXX },     3C996CT */
                   2434:        /* { PCI_VENDOR_ID_3COM, 0x1003, PHY_ID_XXX },     3C997T */
                   2435:        { PCI_VENDOR_ID_3COM, 0x1004, PHY_ID_SERDES  }, /* 3C996SX */
                   2436:        /* { PCI_VENDOR_ID_3COM, 0x1005, PHY_ID_XXX },     3C997SZ */
                   2437:        { PCI_VENDOR_ID_3COM, 0x1007, PHY_ID_BCM5701 }, /* 3C1000T */
                   2438:        { PCI_VENDOR_ID_3COM, 0x1008, PHY_ID_BCM5701 }, /* 3C940BR01 */
                   2439: 
                   2440:        /* DELL boards. */
                   2441:        { PCI_VENDOR_ID_DELL, 0x00d1, PHY_ID_BCM5401 }, /* VIPER */
                   2442:        { PCI_VENDOR_ID_DELL, 0x0106, PHY_ID_BCM5401 }, /* JAGUAR */
                   2443:        { PCI_VENDOR_ID_DELL, 0x0109, PHY_ID_BCM5411 }, /* MERLOT */
                   2444:        { PCI_VENDOR_ID_DELL, 0x010a, PHY_ID_BCM5411 }, /* SLIM_MERLOT */
                   2445:        { PCI_VENDOR_ID_DELL, 0x0179, PHY_ID_BCM5751 }, /* EtherXpress */
                   2446:        
                   2447:        /* Fujitsu Siemens Computer */
                   2448:        { PCI_VENDOR_ID_FSC, 0x105d, PHY_ID_BCM5751 }, /* Futro C200 */ 
                   2449: 
                   2450:        /* Compaq boards. */
                   2451:        { PCI_VENDOR_ID_COMPAQ, 0x007c, PHY_ID_BCM5701 }, /* BANSHEE */
                   2452:        { PCI_VENDOR_ID_COMPAQ, 0x009a, PHY_ID_BCM5701 }, /* BANSHEE_2 */
                   2453:        { PCI_VENDOR_ID_COMPAQ, 0x007d, PHY_ID_SERDES  }, /* CHANGELING */
                   2454:        { PCI_VENDOR_ID_COMPAQ, 0x0085, PHY_ID_BCM5701 }, /* NC7780 */
                   2455:        { PCI_VENDOR_ID_COMPAQ, 0x0099, PHY_ID_BCM5701 }  /* NC7780_2 */
                   2456: };
                   2457: 
                   2458: static int tg3_phy_probe(struct tg3 *tp)
                   2459: {
                   2460:        uint32_t eeprom_phy_id, hw_phy_id_1, hw_phy_id_2;
                   2461:        uint32_t hw_phy_id, hw_phy_id_masked;
                   2462:        enum phy_led_mode eeprom_led_mode;
                   2463:        uint32_t val;
                   2464:        unsigned i;
                   2465:        int eeprom_signature_found, err;
                   2466: 
                   2467:        tp->phy_id = PHY_ID_INVALID;
                   2468: 
                   2469:        for (i = 0; i < sizeof(subsys_id_to_phy_id)/sizeof(subsys_id_to_phy_id[0]); i++) {
                   2470:                if ((subsys_id_to_phy_id[i].subsys_vendor == tp->subsystem_vendor) &&
                   2471:                        (subsys_id_to_phy_id[i].subsys_devid == tp->subsystem_device)) {
                   2472:                        tp->phy_id = subsys_id_to_phy_id[i].phy_id;
                   2473:                        break;
                   2474:                }
                   2475:        }
                   2476: 
                   2477:        eeprom_phy_id = PHY_ID_INVALID;
                   2478:        eeprom_led_mode = led_mode_auto;
                   2479:        eeprom_signature_found = 0;
                   2480:        tg3_read_mem(NIC_SRAM_DATA_SIG, &val);
                   2481:        if (val == NIC_SRAM_DATA_SIG_MAGIC) {
                   2482:                uint32_t nic_cfg;
                   2483: 
                   2484:                tg3_read_mem(NIC_SRAM_DATA_CFG, &nic_cfg);
                   2485:                tp->nic_sram_data_cfg = nic_cfg;
                   2486: 
                   2487:                eeprom_signature_found = 1;
                   2488: 
                   2489:                if ((nic_cfg & NIC_SRAM_DATA_CFG_PHY_TYPE_MASK) ==
                   2490:                    NIC_SRAM_DATA_CFG_PHY_TYPE_FIBER) {
                   2491:                        eeprom_phy_id = PHY_ID_SERDES;
                   2492:                } else {
                   2493:                        uint32_t nic_phy_id;
                   2494: 
                   2495:                        tg3_read_mem(NIC_SRAM_DATA_PHY_ID, &nic_phy_id);
                   2496:                        if (nic_phy_id != 0) {
                   2497:                                uint32_t id1 = nic_phy_id & NIC_SRAM_DATA_PHY_ID1_MASK;
                   2498:                                uint32_t id2 = nic_phy_id & NIC_SRAM_DATA_PHY_ID2_MASK;
                   2499: 
                   2500:                                eeprom_phy_id  = (id1 >> 16) << 10;
                   2501:                                eeprom_phy_id |= (id2 & 0xfc00) << 16;
                   2502:                                eeprom_phy_id |= (id2 & 0x03ff) <<  0;
                   2503:                        }
                   2504:                }
                   2505: 
                   2506:                switch (nic_cfg & NIC_SRAM_DATA_CFG_LED_MODE_MASK) {
                   2507:                case NIC_SRAM_DATA_CFG_LED_TRIPLE_SPD:
                   2508:                        eeprom_led_mode = led_mode_three_link;
                   2509:                        break;
                   2510: 
                   2511:                case NIC_SRAM_DATA_CFG_LED_LINK_SPD:
                   2512:                        eeprom_led_mode = led_mode_link10;
                   2513:                        break;
                   2514: 
                   2515:                default:
                   2516:                        eeprom_led_mode = led_mode_auto;
                   2517:                        break;
                   2518:                };
                   2519:                if (((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703) ||
                   2520:                        (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) ||
                   2521:                        (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705)) &&
                   2522:                        (nic_cfg & NIC_SRAM_DATA_CFG_EEPROM_WP)) {
                   2523:                        tp->tg3_flags |= TG3_FLAG_EEPROM_WRITE_PROT;
                   2524:                }
                   2525: 
                   2526:                if (nic_cfg & NIC_SRAM_DATA_CFG_ASF_ENABLE)
                   2527:                        tp->tg3_flags |= TG3_FLAG_ENABLE_ASF;
                   2528:                if (nic_cfg & NIC_SRAM_DATA_CFG_FIBER_WOL)
                   2529:                        tp->tg3_flags |= TG3_FLAG_SERDES_WOL_CAP;
                   2530:        }
                   2531: 
                   2532:        /* Now read the physical PHY_ID from the chip and verify
                   2533:         * that it is sane.  If it doesn't look good, we fall back
                   2534:         * to either the hard-coded table based PHY_ID and failing
                   2535:         * that the value found in the eeprom area.
                   2536:         */
                   2537:        err  = tg3_readphy(tp, MII_PHYSID1, &hw_phy_id_1);
                   2538:        err |= tg3_readphy(tp, MII_PHYSID2, &hw_phy_id_2);
                   2539: 
                   2540:        hw_phy_id  = (hw_phy_id_1 & 0xffff) << 10;
                   2541:        hw_phy_id |= (hw_phy_id_2 & 0xfc00) << 16;
                   2542:        hw_phy_id |= (hw_phy_id_2 & 0x03ff) <<  0;
                   2543: 
                   2544:        hw_phy_id_masked = hw_phy_id & PHY_ID_MASK;
                   2545: 
                   2546:        if (!err && KNOWN_PHY_ID(hw_phy_id_masked)) {
                   2547:                tp->phy_id = hw_phy_id;
                   2548:        } else {
                   2549:                /* phy_id currently holds the value found in the
                   2550:                 * subsys_id_to_phy_id[] table or PHY_ID_INVALID
                   2551:                 * if a match was not found there.
                   2552:                 */
                   2553:                if (tp->phy_id == PHY_ID_INVALID) {
                   2554:                        if (!eeprom_signature_found ||
                   2555:                            !KNOWN_PHY_ID(eeprom_phy_id & PHY_ID_MASK))
                   2556:                                return -ENODEV;
                   2557:                        tp->phy_id = eeprom_phy_id;
                   2558:                }
                   2559:        }
                   2560: 
                   2561:        err = tg3_phy_reset(tp);
                   2562:        if (err)
                   2563:                return err;
                   2564: 
                   2565:        if (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0 ||
                   2566:            tp->pci_chip_rev_id == CHIPREV_ID_5701_B0) {
                   2567:                uint32_t mii_tg3_ctrl;
                   2568:                
                   2569:                /* These chips, when reset, only advertise 10Mb
                   2570:                 * capabilities.  Fix that.
                   2571:                 */
                   2572:                err  = tg3_writephy(tp, MII_ADVERTISE,
                   2573:                                    (ADVERTISE_CSMA |
                   2574:                                     ADVERTISE_PAUSE_CAP |
                   2575:                                     ADVERTISE_10HALF |
                   2576:                                     ADVERTISE_10FULL |
                   2577:                                     ADVERTISE_100HALF |
                   2578:                                     ADVERTISE_100FULL));
                   2579:                mii_tg3_ctrl = (MII_TG3_CTRL_ADV_1000_HALF |
                   2580:                                MII_TG3_CTRL_ADV_1000_FULL |
                   2581:                                MII_TG3_CTRL_AS_MASTER |
                   2582:                                MII_TG3_CTRL_ENABLE_AS_MASTER);
                   2583:                if (tp->tg3_flags & TG3_FLAG_10_100_ONLY)
                   2584:                        mii_tg3_ctrl = 0;
                   2585: 
                   2586:                err |= tg3_writephy(tp, MII_TG3_CTRL, mii_tg3_ctrl);
                   2587:                err |= tg3_writephy(tp, MII_BMCR,
                   2588:                                    (BMCR_ANRESTART | BMCR_ANENABLE));
                   2589:        }
                   2590: 
                   2591:        if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703) {
                   2592:                tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0c00);
                   2593:                tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x201f);
                   2594:                tg3_writedsp(tp, MII_TG3_DSP_RW_PORT, 0x2aaa);
                   2595:        }
                   2596: 
                   2597:        if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) {
                   2598:                tg3_writephy(tp, 0x1c, 0x8d68);
                   2599:                tg3_writephy(tp, 0x1c, 0x8d68);
                   2600:        }
                   2601: 
                   2602:        /* Enable Ethernet@WireSpeed */
                   2603:        tg3_phy_set_wirespeed(tp);
                   2604: 
                   2605:        if (!err && ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401)) {
                   2606:                err = tg3_init_5401phy_dsp(tp);
                   2607:        }
                   2608: 
                   2609:        /* Determine the PHY led mode. 
                   2610:         * Be careful if this gets set wrong it can result in an inability to 
                   2611:         * establish a link.
                   2612:         */
                   2613:        if (tp->phy_id == PHY_ID_SERDES) {
                   2614:                tp->led_mode = led_mode_three_link;
                   2615:        }
                   2616:        else if (tp->subsystem_vendor == PCI_VENDOR_ID_DELL) {
                   2617:                tp->led_mode = led_mode_link10;
                   2618:        } else {
                   2619:                tp->led_mode = led_mode_three_link;
                   2620:                if (eeprom_signature_found &&
                   2621:                    eeprom_led_mode != led_mode_auto)
                   2622:                        tp->led_mode = eeprom_led_mode;
                   2623:        }
                   2624: 
                   2625:        if (tp->phy_id == PHY_ID_SERDES)
                   2626:                tp->link_config.advertising =
                   2627:                        (ADVERTISED_1000baseT_Half |
                   2628:                         ADVERTISED_1000baseT_Full |
                   2629:                         ADVERTISED_Autoneg |
                   2630:                         ADVERTISED_FIBRE);
                   2631:        if (tp->tg3_flags & TG3_FLAG_10_100_ONLY)
                   2632:                tp->link_config.advertising &=
                   2633:                        ~(ADVERTISED_1000baseT_Half |
                   2634:                          ADVERTISED_1000baseT_Full);
                   2635: 
                   2636:        return err;
                   2637: }
                   2638: 
                   2639: #if SUPPORT_PARTNO_STR
                   2640: static void tg3_read_partno(struct tg3 *tp)
                   2641: {
                   2642:        unsigned char vpd_data[256];
                   2643:        int i;
                   2644: 
                   2645:        for (i = 0; i < 256; i += 4) {
                   2646:                uint32_t tmp;
                   2647: 
                   2648:                if (tg3_nvram_read(tp, 0x100 + i, &tmp))
                   2649:                        goto out_not_found;
                   2650: 
                   2651:                vpd_data[i + 0] = ((tmp >>  0) & 0xff);
                   2652:                vpd_data[i + 1] = ((tmp >>  8) & 0xff);
                   2653:                vpd_data[i + 2] = ((tmp >> 16) & 0xff);
                   2654:                vpd_data[i + 3] = ((tmp >> 24) & 0xff);
                   2655:        }
                   2656: 
                   2657:        /* Now parse and find the part number. */
                   2658:        for (i = 0; i < 256; ) {
                   2659:                unsigned char val = vpd_data[i];
                   2660:                int block_end;
                   2661: 
                   2662:                if (val == 0x82 || val == 0x91) {
                   2663:                        i = (i + 3 +
                   2664:                             (vpd_data[i + 1] +
                   2665:                              (vpd_data[i + 2] << 8)));
                   2666:                        continue;
                   2667:                }
                   2668: 
                   2669:                if (val != 0x90)
                   2670:                        goto out_not_found;
                   2671: 
                   2672:                block_end = (i + 3 +
                   2673:                             (vpd_data[i + 1] +
                   2674:                              (vpd_data[i + 2] << 8)));
                   2675:                i += 3;
                   2676:                while (i < block_end) {
                   2677:                        if (vpd_data[i + 0] == 'P' &&
                   2678:                            vpd_data[i + 1] == 'N') {
                   2679:                                int partno_len = vpd_data[i + 2];
                   2680: 
                   2681:                                if (partno_len > 24)
                   2682:                                        goto out_not_found;
                   2683: 
                   2684:                                memcpy(tp->board_part_number,
                   2685:                                       &vpd_data[i + 3],
                   2686:                                       partno_len);
                   2687: 
                   2688:                                /* Success. */
                   2689:                                return;
                   2690:                        }
                   2691:                }
                   2692: 
                   2693:                /* Part number not found. */
                   2694:                goto out_not_found;
                   2695:        }
                   2696: 
                   2697: out_not_found:
                   2698:        memcpy(tp->board_part_number, "none", sizeof("none"));
                   2699: }
                   2700: #else
                   2701: #define tg3_read_partno(TP) ((TP)->board_part_number[0] = '\0')
                   2702: #endif
                   2703: 
                   2704: static int tg3_get_invariants(struct tg3 *tp)
                   2705: {
                   2706:        uint32_t misc_ctrl_reg;
                   2707:        uint32_t pci_state_reg, grc_misc_cfg;
                   2708:        uint16_t pci_cmd;
                   2709:        uint8_t  pci_latency;
                   2710:        uint32_t val ;
                   2711:        int err;
                   2712: 
                   2713:        /* Read the subsystem vendor and device ids */
                   2714:        pci_read_config_word(tp->pdev, PCI_SUBSYSTEM_VENDOR_ID, &tp->subsystem_vendor);
                   2715:        pci_read_config_word(tp->pdev, PCI_SUBSYSTEM_ID, &tp->subsystem_device);
                   2716: 
                   2717:        /* The sun_5704 code needs infrastructure etherboot does have
                   2718:         * ignore it for now.
                   2719:         */
                   2720: 
                   2721:        /* If we have an AMD 762 or Intel ICH/ICH0 chipset, write
                   2722:         * reordering to the mailbox registers done by the host
                   2723:         * controller can cause major troubles.  We read back from
                   2724:         * every mailbox register write to force the writes to be
                   2725:         * posted to the chip in order.
                   2726:         *
                   2727:         * TG3_FLAG_MBOX_WRITE_REORDER has been forced on.
                   2728:         */
                   2729: 
                   2730:        /* Force memory write invalidate off.  If we leave it on,
                   2731:         * then on 5700_BX chips we have to enable a workaround.
                   2732:         * The workaround is to set the TG3PCI_DMA_RW_CTRL boundry
                   2733:         * to match the cacheline size.  The Broadcom driver have this
                   2734:         * workaround but turns MWI off all the times so never uses
                   2735:         * it.  This seems to suggest that the workaround is insufficient.
                   2736:         */
                   2737:        pci_read_config_word(tp->pdev, PCI_COMMAND, &pci_cmd);
                   2738:        pci_cmd &= ~PCI_COMMAND_INVALIDATE;
                   2739:        /* Also, force SERR#/PERR# in PCI command. */
                   2740:        pci_cmd |= PCI_COMMAND_PARITY | PCI_COMMAND_SERR;
                   2741:        pci_write_config_word(tp->pdev, PCI_COMMAND, pci_cmd);
                   2742: 
                   2743:        /* It is absolutely critical that TG3PCI_MISC_HOST_CTRL
                   2744:         * has the register indirect write enable bit set before
                   2745:         * we try to access any of the MMIO registers.  It is also
                   2746:         * critical that the PCI-X hw workaround situation is decided
                   2747:         * before that as well.
                   2748:         */
                   2749:        pci_read_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL, &misc_ctrl_reg);
                   2750: 
                   2751:        tp->pci_chip_rev_id = (misc_ctrl_reg >> MISC_HOST_CTRL_CHIPREV_SHIFT);
                   2752: 
                   2753:        /* Initialize misc host control in PCI block. */
                   2754:        tp->misc_host_ctrl |= (misc_ctrl_reg &
                   2755:                               MISC_HOST_CTRL_CHIPREV);
                   2756:        pci_write_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL,
                   2757:                               tp->misc_host_ctrl);
                   2758: 
                   2759:        pci_read_config_byte(tp->pdev, PCI_LATENCY_TIMER, &pci_latency);
                   2760:        if (pci_latency < 64) {
                   2761:                pci_write_config_byte(tp->pdev, PCI_LATENCY_TIMER, 64);
                   2762:        }
                   2763: 
                   2764:        pci_read_config_dword(tp->pdev, TG3PCI_PCISTATE, &pci_state_reg);
                   2765: 
                   2766:        /* If this is a 5700 BX chipset, and we are in PCI-X
                   2767:         * mode, enable register write workaround.
                   2768:         *
                   2769:         * The workaround is to use indirect register accesses
                   2770:         * for all chip writes not to mailbox registers.
                   2771:         *
                   2772:         * In etherboot to simplify things we just always use this work around.
                   2773:         */
                   2774:        if ((pci_state_reg & PCISTATE_CONV_PCI_MODE) == 0) {
                   2775:                tp->tg3_flags |= TG3_FLAG_PCIX_MODE;
                   2776:        }
                   2777:        /* Back to back register writes can cause problems on the 5701,
                   2778:         * the workaround is to read back all reg writes except those to
                   2779:         * mailbox regs.
                   2780:         * In etherboot we always use indirect register accesses so
                   2781:         * we don't see this.
                   2782:         */
                   2783: 
                   2784:        if ((pci_state_reg & PCISTATE_BUS_SPEED_HIGH) != 0)
                   2785:                tp->tg3_flags |= TG3_FLAG_PCI_HIGH_SPEED;
                   2786:        if ((pci_state_reg & PCISTATE_BUS_32BIT) != 0)
                   2787:                tp->tg3_flags |= TG3_FLAG_PCI_32BIT;
                   2788: 
                   2789:        /* Chip-specific fixup from Broadcom driver */
                   2790:        if ((tp->pci_chip_rev_id == CHIPREV_ID_5704_A0) &&
                   2791:            (!(pci_state_reg & PCISTATE_RETRY_SAME_DMA))) {
                   2792:                pci_state_reg |= PCISTATE_RETRY_SAME_DMA;
                   2793:                pci_write_config_dword(tp->pdev, TG3PCI_PCISTATE, pci_state_reg);
                   2794:        }
                   2795: 
                   2796:        /* determine if it is PCIE system */
                   2797:        // Alf : I have no idea what this is about...
                   2798:        // But it's definitely usefull
                   2799:        val = pci_find_capability(tp->pdev, PCI_CAP_ID_EXP);
                   2800:        if (val)
                   2801:                tp->tg3_flags2 |= TG3_FLG2_PCI_EXPRESS;
                   2802: 
                   2803:        /* Force the chip into D0. */
                   2804:        tg3_set_power_state_0(tp);
                   2805: 
                   2806:        /* Etherboot does not ask the tg3 to do checksums */
                   2807:        /* Etherboot does not ask the tg3 to do jumbo frames */
                   2808:        /* Ehterboot does not ask the tg3 to use WakeOnLan. */
                   2809: 
                   2810:        /* A few boards don't want Ethernet@WireSpeed phy feature */
                   2811:        if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700) ||
                   2812:            (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) ||
                   2813:                ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) &&
                   2814:                        (tp->pci_chip_rev_id != CHIPREV_ID_5705_A0) &&
                   2815:                        (tp->pci_chip_rev_id != CHIPREV_ID_5705_A1))) {
                   2816:                tp->tg3_flags2 |= TG3_FLG2_NO_ETH_WIRE_SPEED;
                   2817:        }
                   2818: 
                   2819:        /* Avoid tagged irq status etherboot does not use irqs */
                   2820: 
                   2821:        /* Only 5701 and later support tagged irq status mode.
                   2822:         * Also, 5788 chips cannot use tagged irq status.
                   2823:         *
                   2824:         * However, since etherboot does not use irqs avoid tagged irqs
                   2825:         * status  because the interrupt condition is more difficult to
                   2826:         * fully clear in that mode.
                   2827:         */
                   2828:        
                   2829:        /* Since some 5700_AX && 5700_BX have problems with 32BYTE
                   2830:         * coalesce_mode, and the rest work fine anything set.
                   2831:         * Don't enable HOST_CC_MODE_32BYTE in etherboot.
                   2832:         */
                   2833: 
                   2834:        /* Initialize MAC MI mode, polling disabled. */
                   2835:        tw32_carefully(MAC_MI_MODE, tp->mi_mode);
                   2836: 
                   2837:        /* Initialize data/descriptor byte/word swapping. */
                   2838:        tw32(GRC_MODE, tp->grc_mode);
                   2839: 
                   2840:        tg3_switch_clocks(tp);
                   2841: 
                   2842:        /* Clear this out for sanity. */
                   2843:        tw32(TG3PCI_MEM_WIN_BASE_ADDR, 0);
                   2844: 
                   2845:        /* Etherboot does not need to check if the PCIX_TARGET_HWBUG
                   2846:         * is needed.  It always uses it.
                   2847:         */
                   2848:        
                   2849:        udelay(50);
                   2850:        tg3_nvram_init(tp);
                   2851: 
                   2852:        /* The TX descriptors will reside in main memory.
                   2853:         */
                   2854: 
                   2855:        /* See which board we are using.
                   2856:         */
                   2857:        grc_misc_cfg = tr32(GRC_MISC_CFG);
                   2858:        grc_misc_cfg &= GRC_MISC_CFG_BOARD_ID_MASK;
                   2859: 
                   2860:        if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 &&
                   2861:            grc_misc_cfg == GRC_MISC_CFG_BOARD_ID_5704CIOBE) {
                   2862:                tp->tg3_flags |= TG3_FLAG_SPLIT_MODE;
                   2863:                tp->split_mode_max_reqs = SPLIT_MODE_5704_MAX_REQ;
                   2864:        }
                   2865: 
                   2866:        if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 &&
                   2867:            (grc_misc_cfg == GRC_MISC_CFG_BOARD_ID_5788 ||
                   2868:             grc_misc_cfg == GRC_MISC_CFG_BOARD_ID_5788M))
                   2869:                tp->tg3_flags2 |= TG3_FLG2_IS_5788;
                   2870: 
                   2871: #define PCI_DEVICE_ID_TIGON3_5901      0x170d
                   2872: #define PCI_DEVICE_ID_TIGON3_5901_2    0x170e
                   2873: 
                   2874:        /* these are limited to 10/100 only */
                   2875:        if (((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703) &&
                   2876:                    ((grc_misc_cfg == 0x8000) || (grc_misc_cfg == 0x4000))) ||
                   2877:                ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) &&
                   2878:                        (tp->pdev->vendor == PCI_VENDOR_ID_BROADCOM) &&
                   2879:                        ((tp->pdev->device == PCI_DEVICE_ID_TIGON3_5901) ||
                   2880:                                (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5901_2)))) {
                   2881:                tp->tg3_flags |= TG3_FLAG_10_100_ONLY;
                   2882:        }
                   2883: 
                   2884:        err = tg3_phy_probe(tp);
                   2885:        if (err) {
                   2886:                printf("phy probe failed, err %d\n", err);
                   2887:        }
                   2888: 
                   2889:        tg3_read_partno(tp);
                   2890: 
                   2891: 
                   2892:        /* 5700 BX chips need to have their TX producer index mailboxes
                   2893:         * written twice to workaround a bug.
                   2894:         * In etherboot we do this unconditionally to simplify things.
                   2895:         */
                   2896: 
                   2897:        /* 5700 chips can get confused if TX buffers straddle the
                   2898:         * 4GB address boundary in some cases.
                   2899:         * 
                   2900:         * In etherboot we can ignore the problem as etherboot lives below 4GB.
                   2901:         */
                   2902: 
                   2903:        /* In etherboot wake-on-lan is unconditionally disabled */
                   2904:        return err;
                   2905: }
                   2906: 
                   2907: static int  tg3_get_device_address(struct tg3 *tp)
                   2908: {
                   2909:        struct nic *nic = tp->nic;
                   2910:        uint32_t hi, lo, mac_offset;
                   2911: 
                   2912:        if (PCI_FUNC(tp->pdev->busdevfn) == 0)
                   2913:                mac_offset = 0x7c;
                   2914:        else
                   2915:                mac_offset = 0xcc;
                   2916: 
                   2917:        /* First try to get it from MAC address mailbox. */
                   2918:        tg3_read_mem(NIC_SRAM_MAC_ADDR_HIGH_MBOX, &hi);
                   2919:        if ((hi >> 16) == 0x484b) {
                   2920:                nic->node_addr[0] = (hi >>  8) & 0xff;
                   2921:                nic->node_addr[1] = (hi >>  0) & 0xff;
                   2922: 
                   2923:                tg3_read_mem(NIC_SRAM_MAC_ADDR_LOW_MBOX, &lo);
                   2924:                nic->node_addr[2] = (lo >> 24) & 0xff;
                   2925:                nic->node_addr[3] = (lo >> 16) & 0xff;
                   2926:                nic->node_addr[4] = (lo >>  8) & 0xff;
                   2927:                nic->node_addr[5] = (lo >>  0) & 0xff;
                   2928:        }
                   2929:        /* Next, try NVRAM. */
                   2930:        else if (!tg3_nvram_read(tp, mac_offset + 0, &hi) &&
                   2931:                 !tg3_nvram_read(tp, mac_offset + 4, &lo)) {
                   2932:                nic->node_addr[0] = ((hi >> 16) & 0xff);
                   2933:                nic->node_addr[1] = ((hi >> 24) & 0xff);
                   2934:                nic->node_addr[2] = ((lo >>  0) & 0xff);
                   2935:                nic->node_addr[3] = ((lo >>  8) & 0xff);
                   2936:                nic->node_addr[4] = ((lo >> 16) & 0xff);
                   2937:                nic->node_addr[5] = ((lo >> 24) & 0xff);
                   2938:        }
                   2939:        /* Finally just fetch it out of the MAC control regs. */
                   2940:        else {
                   2941:                hi = tr32(MAC_ADDR_0_HIGH);
                   2942:                lo = tr32(MAC_ADDR_0_LOW);
                   2943: 
                   2944:                nic->node_addr[5] = lo & 0xff;
                   2945:                nic->node_addr[4] = (lo >> 8) & 0xff;
                   2946:                nic->node_addr[3] = (lo >> 16) & 0xff;
                   2947:                nic->node_addr[2] = (lo >> 24) & 0xff;
                   2948:                nic->node_addr[1] = hi & 0xff;
                   2949:                nic->node_addr[0] = (hi >> 8) & 0xff;
                   2950:        }
                   2951: 
                   2952:        return 0;
                   2953: }
                   2954: 
                   2955: 
                   2956: static int tg3_setup_dma(struct tg3 *tp)
                   2957: {
                   2958:        tw32(TG3PCI_CLOCK_CTRL, 0);
                   2959: 
                   2960:        if ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) == 0) {
                   2961:                tp->dma_rwctrl =
                   2962:                        (0x7 << DMA_RWCTRL_PCI_WRITE_CMD_SHIFT) |
                   2963:                        (0x6 << DMA_RWCTRL_PCI_READ_CMD_SHIFT) |
                   2964:                        (0x7 << DMA_RWCTRL_WRITE_WATER_SHIFT) |
                   2965:                        (0x7 << DMA_RWCTRL_READ_WATER_SHIFT) |
                   2966:                        (0x0f << DMA_RWCTRL_MIN_DMA_SHIFT);
                   2967:                if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
                   2968:                        tp->dma_rwctrl &= ~(DMA_RWCTRL_MIN_DMA << DMA_RWCTRL_MIN_DMA_SHIFT);
                   2969:                }
                   2970:        } else {
                   2971:                if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704)
                   2972:                        tp->dma_rwctrl =
                   2973:                                (0x7 << DMA_RWCTRL_PCI_WRITE_CMD_SHIFT) |
                   2974:                                (0x6 << DMA_RWCTRL_PCI_READ_CMD_SHIFT) |
                   2975:                                (0x3 << DMA_RWCTRL_WRITE_WATER_SHIFT) |
                   2976:                                (0x7 << DMA_RWCTRL_READ_WATER_SHIFT) |
                   2977:                                (0x00 << DMA_RWCTRL_MIN_DMA_SHIFT);
                   2978:                else
                   2979:                        tp->dma_rwctrl =
                   2980:                                (0x7 << DMA_RWCTRL_PCI_WRITE_CMD_SHIFT) |
                   2981:                                (0x6 << DMA_RWCTRL_PCI_READ_CMD_SHIFT) |
                   2982:                                (0x3 << DMA_RWCTRL_WRITE_WATER_SHIFT) |
                   2983:                                (0x3 << DMA_RWCTRL_READ_WATER_SHIFT) |
                   2984:                                (0x0f << DMA_RWCTRL_MIN_DMA_SHIFT);
                   2985: 
                   2986:                /* Wheee, some more chip bugs... */
                   2987:                if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703) ||
                   2988:                        (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704)) {
                   2989:                        uint32_t ccval = tr32(TG3PCI_CLOCK_CTRL) & 0x1f;
                   2990: 
                   2991:                        if ((ccval == 0x6) || (ccval == 0x7)) {
                   2992:                                tp->dma_rwctrl |= DMA_RWCTRL_ONE_DMA;
                   2993:                        }
                   2994:                }
                   2995:        }
                   2996: 
                   2997:        if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703) ||
                   2998:                (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704)) {
                   2999:                tp->dma_rwctrl &= ~(DMA_RWCTRL_MIN_DMA << DMA_RWCTRL_MIN_DMA_SHIFT);
                   3000:        }
                   3001: 
                   3002:        /*
                   3003:          Alf : Tried that, but it does not work. Should be this way though :-(
                   3004:        if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) {
                   3005:          tp->dma_rwctrl |= 0x001f0000;
                   3006:        }
                   3007:        */
                   3008:        tp->dma_rwctrl |= DMA_RWCTRL_ASSERT_ALL_BE;
                   3009: 
                   3010:        tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl);
                   3011: 
                   3012:        return 0;
                   3013: }
                   3014: 
                   3015: static void tg3_init_link_config(struct tg3 *tp)
                   3016: {
                   3017:        tp->link_config.advertising =
                   3018:                (ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |
                   3019:                 ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full |
                   3020:                 ADVERTISED_1000baseT_Half | ADVERTISED_1000baseT_Full |
                   3021:                 ADVERTISED_Autoneg | ADVERTISED_MII);
                   3022:        tp->carrier_ok = 0;
                   3023:        tp->link_config.active_speed = SPEED_INVALID;
                   3024:        tp->link_config.active_duplex = DUPLEX_INVALID;
                   3025: }
                   3026: 
                   3027: 
                   3028: #if SUPPORT_PHY_STR
                   3029: static const char * tg3_phy_string(struct tg3 *tp)
                   3030: {
                   3031:        switch (tp->phy_id & PHY_ID_MASK) {
                   3032:        case PHY_ID_BCM5400:    return "5400";
                   3033:        case PHY_ID_BCM5401:    return "5401";
                   3034:        case PHY_ID_BCM5411:    return "5411";
                   3035:        case PHY_ID_BCM5701:    return "5701";
                   3036:        case PHY_ID_BCM5703:    return "5703";
                   3037:        case PHY_ID_BCM5704:    return "5704";
                   3038:         case PHY_ID_BCM5705:    return "5705";
                   3039:         case PHY_ID_BCM5750:    return "5750";
                   3040:        case PHY_ID_BCM5751:    return "5751"; 
                   3041:        case PHY_ID_BCM5787:    return "5787";
                   3042:        case PHY_ID_BCM8002:    return "8002/serdes";
                   3043:        case PHY_ID_SERDES:     return "serdes";
                   3044:        default:                return "unknown";
                   3045:        };
                   3046: }
                   3047: #else
                   3048: #define tg3_phy_string(TP) "?"
                   3049: #endif
                   3050: 
                   3051: 
                   3052: static void tg3_poll_link(struct tg3 *tp)
                   3053: {
                   3054:        uint32_t mac_stat;
                   3055: 
                   3056:        mac_stat = tr32(MAC_STATUS);
                   3057:        if (tp->phy_id == PHY_ID_SERDES) {
                   3058:                if (tp->carrier_ok?
                   3059:                        (mac_stat & MAC_STATUS_LNKSTATE_CHANGED):
                   3060:                        (mac_stat & MAC_STATUS_PCS_SYNCED)) {
                   3061:                        tw32_carefully(MAC_MODE, tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK);
                   3062:                        tw32_carefully(MAC_MODE, tp->mac_mode);
                   3063: 
                   3064:                        tg3_setup_phy(tp);
                   3065:                }
                   3066:        }
                   3067:        else {
                   3068:                if (mac_stat & MAC_STATUS_LNKSTATE_CHANGED) {
                   3069:                        tg3_setup_phy(tp);
                   3070:                }
                   3071:        }
                   3072: }
                   3073: 
                   3074: /**************************************************************************
                   3075: POLL - Wait for a frame
                   3076: ***************************************************************************/
                   3077: static void tg3_ack_irqs(struct tg3 *tp)
                   3078: {
                   3079:        if (tp->hw_status->status & SD_STATUS_UPDATED) {
                   3080:                /*
                   3081:                 * writing any value to intr-mbox-0 clears PCI INTA# and
                   3082:                 * chip-internal interrupt pending events.
                   3083:                 * writing non-zero to intr-mbox-0 additional tells the
                   3084:                 * NIC to stop sending us irqs, engaging "in-intr-handler"
                   3085:                 * event coalescing.
                   3086:                 */
                   3087:                tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 
                   3088:                        0x00000001);
                   3089:                /*
                   3090:                 * Flush PCI write.  This also guarantees that our
                   3091:                 * status block has been flushed to host memory.
                   3092:                 */
                   3093:                tr32(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW);
                   3094:                tp->hw_status->status &= ~SD_STATUS_UPDATED;
                   3095:        }
                   3096: }
                   3097: 
                   3098: static int tg3_poll(struct nic *nic, int retrieve)
                   3099: {
                   3100:        /* return true if there's an ethernet packet ready to read */
                   3101:        /* nic->packet should contain data on return */
                   3102:        /* nic->packetlen should contain length of data */
                   3103: 
                   3104:        struct tg3 *tp = &tg3;
                   3105:        int result;
                   3106: 
                   3107:        result = 0;
                   3108: 
                   3109:        if ( (tp->hw_status->idx[0].rx_producer != tp->rx_rcb_ptr) && !retrieve ) 
                   3110:          return 1;
                   3111: 
                   3112:        tg3_ack_irqs(tp);
                   3113: 
                   3114:        if (tp->hw_status->idx[0].rx_producer != tp->rx_rcb_ptr) {
                   3115:                struct tg3_rx_buffer_desc *desc;
                   3116:                unsigned int len;
                   3117:                desc = &tp->rx_rcb[tp->rx_rcb_ptr];
                   3118:                if ((desc->opaque & RXD_OPAQUE_RING_MASK) == RXD_OPAQUE_RING_STD) {
                   3119:                        len = ((desc->idx_len & RXD_LEN_MASK) >> RXD_LEN_SHIFT) - 4; /* omit crc */
                   3120:                        
                   3121:                        nic->packetlen = len;
                   3122:                        memcpy(nic->packet, bus_to_virt(desc->addr_lo), len);
                   3123:                        result = 1;
                   3124:                }
                   3125:                tp->rx_rcb_ptr = (tp->rx_rcb_ptr + 1) % TG3_RX_RCB_RING_SIZE;
                   3126:                
                   3127:                /* ACK the status ring */
                   3128:                tw32_mailbox2(MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW, tp->rx_rcb_ptr);
                   3129: 
                   3130:                /* Refill RX ring. */
                   3131:                if (result) {
                   3132:                        tp->rx_std_ptr = (tp->rx_std_ptr + 1) % TG3_RX_RING_SIZE;
                   3133:                        tw32_mailbox2(MAILBOX_RCV_STD_PROD_IDX + TG3_64BIT_REG_LOW, tp->rx_std_ptr);
                   3134:                }
                   3135:        }
                   3136:        tg3_poll_link(tp);
                   3137:        return result;
                   3138: }
                   3139: 
                   3140: /**************************************************************************
                   3141: TRANSMIT - Transmit a frame
                   3142: ***************************************************************************/
                   3143: #if 0
                   3144: static void tg3_set_txd(struct tg3 *tp, int entry,
                   3145:        dma_addr_t mapping, int len, uint32_t flags,
                   3146:        uint32_t mss_and_is_end)
                   3147: {
                   3148:        struct tg3_tx_buffer_desc *txd =  &tp->tx_ring[entry];
                   3149:        int is_end = (mss_and_is_end & 0x1);
                   3150:        if (is_end) {
                   3151:                flags |= TXD_FLAG_END;
                   3152:        }
                   3153: 
                   3154:        txd->addr_hi   = 0;
                   3155:        txd->addr_lo   = mapping & 0xffffffff;
                   3156:        txd->len_flags = (len << TXD_LEN_SHIFT) | flags;
                   3157:        txd->vlan_tag  = 0 << TXD_VLAN_TAG_SHIFT;
                   3158: }
                   3159: #endif
                   3160: 
                   3161: static void tg3_transmit(struct nic *nic, const char *dst_addr,
                   3162:        unsigned int type, unsigned int size, const char *packet)
                   3163: {
                   3164:        static int frame_idx;
                   3165:        struct eth_frame *frame;
                   3166:        
                   3167:        /* send the packet to destination */
                   3168:        struct tg3_tx_buffer_desc *txd;
                   3169:        struct tg3 *tp;
                   3170:        uint32_t entry;
                   3171:        int i;
                   3172: 
                   3173:        /* Wait until there is a free packet frame */
                   3174:        tp = &tg3;
                   3175:        i = 0;
                   3176:        entry = tp->tx_prod;
                   3177:        while((tp->hw_status->idx[0].tx_consumer != entry) &&
                   3178:                (tp->hw_status->idx[0].tx_consumer != PREV_TX(entry))) {
                   3179:                mdelay(10);     /* give the nick a chance */
                   3180:                if (++i > 500) { /* timeout 5s for transmit */
                   3181:                        printf("transmit timed out\n");
                   3182:                        tg3_halt(tp);
                   3183:                        tg3_setup_hw(tp);
                   3184:                        return;
                   3185:                }
                   3186:        }
                   3187:        if (i != 0) {
                   3188:                printf("#");
                   3189:        }
                   3190:        
                   3191:        /* Copy the packet to the our local buffer */
                   3192:        frame = &tg3_bss.tx_frame[frame_idx];
                   3193:        memcpy(frame->dst_addr, dst_addr, ETH_ALEN);
                   3194:        memcpy(frame->src_addr, nic->node_addr, ETH_ALEN);
                   3195:        frame->type = htons(type);
                   3196:        memset(frame->data, 0, sizeof(frame->data));
                   3197:        memcpy(frame->data, packet, size);
                   3198: 
                   3199:        /* Setup the ring buffer entry to transmit */
                   3200:        txd            = &tp->tx_ring[entry];
                   3201:        txd->addr_hi   = 0; /* Etherboot runs under 4GB */
                   3202:        txd->addr_lo   = virt_to_bus(frame);
                   3203:        txd->len_flags = ((size + ETH_HLEN) << TXD_LEN_SHIFT) | TXD_FLAG_END;
                   3204:        txd->vlan_tag  = 0 << TXD_VLAN_TAG_SHIFT;
                   3205: 
                   3206:        /* Advance to the next entry */
                   3207:        entry = NEXT_TX(entry);
                   3208:        frame_idx ^= 1;
                   3209: 
                   3210:        /* Packets are ready, update Tx producer idx local and on card */
                   3211:        tw32_mailbox((MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW), entry);
                   3212:        tw32_mailbox2((MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW), entry);
                   3213:        tp->tx_prod = entry;
                   3214: }
                   3215: 
                   3216: /**************************************************************************
                   3217: DISABLE - Turn off ethernet interface
                   3218: ***************************************************************************/
                   3219: static void tg3_disable ( struct nic *nic __unused ) {
                   3220:        struct tg3 *tp = &tg3;
                   3221:        /* put the card in its initial state */
                   3222:        /* This function serves 3 purposes.
                   3223:         * This disables DMA and interrupts so we don't receive
                   3224:         *  unexpected packets or interrupts from the card after
                   3225:         *  etherboot has finished. 
                   3226:         * This frees resources so etherboot may use
                   3227:         *  this driver on another interface
                   3228:         * This allows etherboot to reinitialize the interface
                   3229:         *  if something is something goes wrong.
                   3230:         */
                   3231:        tg3_halt(tp);
                   3232:        tp->tg3_flags &= ~(TG3_FLAG_INIT_COMPLETE|TG3_FLAG_GOT_SERDES_FLOWCTL);
                   3233:        tp->carrier_ok = 0;
                   3234:        iounmap((void *)tp->regs);
                   3235: }
                   3236: 
                   3237: /**************************************************************************
                   3238: IRQ - Enable, Disable, or Force interrupts
                   3239: ***************************************************************************/
                   3240: static void tg3_irq(struct nic *nic __unused, irq_action_t action __unused)
                   3241: {
                   3242:   switch ( action ) {
                   3243:   case DISABLE :
                   3244:     break;
                   3245:   case ENABLE :
                   3246:     break;
                   3247:   case FORCE :
                   3248:     break;
                   3249:   }
                   3250: }
                   3251: 
                   3252: static struct nic_operations tg3_operations = {
                   3253:        .connect        = dummy_connect,
                   3254:        .poll           = tg3_poll,
                   3255:        .transmit       = tg3_transmit,
                   3256:        .irq            = tg3_irq,
                   3257: 
                   3258: };
                   3259: 
                   3260: /**************************************************************************
                   3261: PROBE - Look for an adapter, this routine's visible to the outside
                   3262: You should omit the last argument struct pci_device * for a non-PCI NIC
                   3263: ***************************************************************************/
                   3264: static int tg3_probe ( struct nic *nic, struct pci_device *pdev ) {
                   3265: 
                   3266:        struct tg3 *tp = &tg3;
                   3267:        unsigned long tg3reg_base, tg3reg_len;
                   3268:        int i, err, pm_cap;
                   3269: 
                   3270:        memset(tp, 0, sizeof(*tp));
                   3271: 
                   3272:        adjust_pci_device(pdev);
                   3273: 
                   3274:        nic->irqno  = 0;
                   3275:         nic->ioaddr = pdev->ioaddr;
                   3276: 
                   3277:        /* Find power-management capability. */
                   3278:        pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM);
                   3279:        if (pm_cap == 0) {
                   3280:                printf("Cannot find PowerManagement capability, aborting.\n");
                   3281:                return 0;
                   3282:        }
                   3283:        tg3reg_base = pci_bar_start(pdev, PCI_BASE_ADDRESS_0);
                   3284:        if (tg3reg_base == -1UL) {
                   3285:                printf("Unuseable bar\n");
                   3286:                return 0;
                   3287:        }
                   3288:        tg3reg_len  = pci_bar_size(pdev,  PCI_BASE_ADDRESS_0);
                   3289: 
                   3290:        tp->pdev       = pdev;
                   3291:        tp->nic        = nic;
                   3292:        tp->pm_cap     = pm_cap;
                   3293:        tp->rx_mode    = 0;
                   3294:        tp->tx_mode    = 0;
                   3295:        tp->mi_mode    = MAC_MI_MODE_BASE;
                   3296:        tp->tg3_flags  = 0 & ~TG3_FLAG_INIT_COMPLETE; 
                   3297:        
                   3298:        /* The word/byte swap controls here control register access byte
                   3299:         * swapping.  DMA data byte swapping is controlled in the GRC_MODE
                   3300:         * setting below.
                   3301:         */
                   3302:        tp->misc_host_ctrl =
                   3303:                MISC_HOST_CTRL_MASK_PCI_INT |
                   3304:                MISC_HOST_CTRL_WORD_SWAP |
                   3305:                MISC_HOST_CTRL_INDIR_ACCESS |
                   3306:                MISC_HOST_CTRL_PCISTATE_RW;
                   3307: 
                   3308:        /* The NONFRM (non-frame) byte/word swap controls take effect
                   3309:         * on descriptor entries, anything which isn't packet data.
                   3310:         *
                   3311:         * The StrongARM chips on the board (one for tx, one for rx)
                   3312:         * are running in big-endian mode.
                   3313:         */
                   3314:        tp->grc_mode = (GRC_MODE_WSWAP_DATA | GRC_MODE_BSWAP_DATA |
                   3315:                        GRC_MODE_WSWAP_NONFRM_DATA);
                   3316: #if __BYTE_ORDER == __BIG_ENDIAN
                   3317:        tp->grc_mode |= GRC_MODE_BSWAP_NONFRM_DATA;
                   3318: #endif
                   3319:        tp->regs = (unsigned long) ioremap(tg3reg_base, tg3reg_len);
                   3320:        if (tp->regs == 0UL) {
                   3321:                printf("Cannot map device registers, aborting\n");
                   3322:                return 0;
                   3323:        }
                   3324: 
                   3325:        tg3_init_link_config(tp);
                   3326: 
                   3327:        err = tg3_get_invariants(tp);
                   3328:        if (err) {
                   3329:                printf("Problem fetching invariants of chip, aborting.\n");
                   3330:                goto err_out_iounmap;
                   3331:        }
                   3332: 
                   3333:        err = tg3_get_device_address(tp);
                   3334:        if (err) {
                   3335:                printf("Could not obtain valid ethernet address, aborting.\n");
                   3336:                goto err_out_iounmap;
                   3337:        }
                   3338: 
                   3339:        DBG ( "Ethernet addr: %s\n", eth_ntoa ( nic->node_addr ) );
                   3340: 
                   3341:        tg3_setup_dma(tp);
                   3342: 
                   3343:        /* Now that we have fully setup the chip, save away a snapshot
                   3344:         * of the PCI config space.  We need to restore this after
                   3345:         * GRC_MISC_CFG core clock resets and some resume events.
                   3346:         */
                   3347:        pci_save_state(tp->pdev, tp->pci_cfg_state);
                   3348: 
                   3349:        printf("Tigon3 [partno(%s) rev %hx PHY(%s)] (PCI%s:%s:%s)\n",
                   3350:                tp->board_part_number,
                   3351:                tp->pci_chip_rev_id,
                   3352:                tg3_phy_string(tp),
                   3353:                ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) ? "X" : ""),
                   3354:                ((tp->tg3_flags & TG3_FLAG_PCI_HIGH_SPEED) ?
                   3355:                        ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) ? "133MHz" : "66MHz") :
                   3356:                        ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) ? "100MHz" : "33MHz")),
                   3357:                ((tp->tg3_flags & TG3_FLAG_PCI_32BIT) ? "32-bit" : "64-bit"));
                   3358: 
                   3359: 
                   3360:        err = tg3_setup_hw(tp); 
                   3361:        if (err) {
                   3362:                goto err_out_disable;
                   3363:        } 
                   3364:        tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE;
                   3365: 
                   3366:        /* Wait for a reasonable time for the link to come up */
                   3367:        tg3_poll_link(tp);
                   3368:        for(i = 0; !tp->carrier_ok && (i < VALID_LINK_TIMEOUT*100); i++) {
                   3369:                mdelay(1);
                   3370:                tg3_poll_link(tp);
                   3371:        }
                   3372:        if (!tp->carrier_ok){
                   3373:                printf("Valid link not established\n");
                   3374:                goto err_out_disable;
                   3375:        }
                   3376: 
                   3377:        nic->nic_op     = &tg3_operations;
                   3378:        return 1;
                   3379: 
                   3380:  err_out_iounmap:
                   3381:        iounmap((void *)tp->regs);
                   3382:        return 0;
                   3383:  err_out_disable:
                   3384:        tg3_disable(nic);
                   3385:        return 0;
                   3386: }
                   3387: 
                   3388: 
                   3389: static struct pci_device_id tg3_nics[] = {
                   3390: PCI_ROM(0x14e4, 0x1644, "tg3-5700",        "Broadcom Tigon 3 5700", 0),
                   3391: PCI_ROM(0x14e4, 0x1645, "tg3-5701",        "Broadcom Tigon 3 5701", 0),
                   3392: PCI_ROM(0x14e4, 0x1646, "tg3-5702",        "Broadcom Tigon 3 5702", 0),
                   3393: PCI_ROM(0x14e4, 0x1647, "tg3-5703",        "Broadcom Tigon 3 5703", 0),
                   3394: PCI_ROM(0x14e4, 0x1648, "tg3-5704",        "Broadcom Tigon 3 5704", 0),
                   3395: PCI_ROM(0x14e4, 0x164d, "tg3-5702FE",      "Broadcom Tigon 3 5702FE", 0),
                   3396: PCI_ROM(0x14e4, 0x1653, "tg3-5705",        "Broadcom Tigon 3 5705", 0),
                   3397: PCI_ROM(0x14e4, 0x1654, "tg3-5705_2",      "Broadcom Tigon 3 5705_2", 0),
                   3398: PCI_ROM(0x14e4, 0x1659, "tg3-5721",        "Broadcom Tigon 3 5721", 0),
                   3399: PCI_ROM(0x14e4, 0x165d, "tg3-5705M",       "Broadcom Tigon 3 5705M", 0),
                   3400: PCI_ROM(0x14e4, 0x165e, "tg3-5705M_2",     "Broadcom Tigon 3 5705M_2", 0),
                   3401: PCI_ROM(0x14e4, 0x1677, "tg3-5751",        "Broadcom Tigon 3 5751", 0),
                   3402: PCI_ROM(0x14e4, 0x167a, "tg3-5754",        "Broadcom Tigon 3 5754", 0),
                   3403: PCI_ROM(0x14e4, 0x1693, "tg3-5787",       "Broadcom Tigon 3 5787", 0),
                   3404: PCI_ROM(0x14e4, 0x1696, "tg3-5782",        "Broadcom Tigon 3 5782", 0),
                   3405: PCI_ROM(0x14e4, 0x169a, "tg3-5786",        "Broadcom Tigon 3 5786", 0),
                   3406: PCI_ROM(0x14e4, 0x169c, "tg3-5788",        "Broadcom Tigon 3 5788", 0),
                   3407: PCI_ROM(0x14e4, 0x169d, "tg3-5789",        "Broadcom Tigon 3 5789", 0),
                   3408: PCI_ROM(0x14e4, 0x16a6, "tg3-5702X",       "Broadcom Tigon 3 5702X", 0),
                   3409: PCI_ROM(0x14e4, 0x16a7, "tg3-5703X",       "Broadcom Tigon 3 5703X", 0),
                   3410: PCI_ROM(0x14e4, 0x16a8, "tg3-5704S",       "Broadcom Tigon 3 5704S", 0),
                   3411: PCI_ROM(0x14e4, 0x16c6, "tg3-5702A3",      "Broadcom Tigon 3 5702A3", 0),
                   3412: PCI_ROM(0x14e4, 0x16c7, "tg3-5703A3",      "Broadcom Tigon 3 5703A3", 0),
                   3413: PCI_ROM(0x14e4, 0x170d, "tg3-5901",        "Broadcom Tigon 3 5901", 0),
                   3414: PCI_ROM(0x14e4, 0x170e, "tg3-5901_2",      "Broadcom Tigon 3 5901_2", 0),
                   3415: PCI_ROM(0x1148, 0x4400, "tg3-9DXX",        "Syskonnect 9DXX", 0),
                   3416: PCI_ROM(0x1148, 0x4500, "tg3-9MXX",        "Syskonnect 9MXX", 0),
                   3417: PCI_ROM(0x173b, 0x03e8, "tg3-ac1000",      "Altima AC1000", 0),
                   3418: PCI_ROM(0x173b, 0x03e9, "tg3-ac1001",      "Altima AC1001", 0),
                   3419: PCI_ROM(0x173b, 0x03ea, "tg3-ac9100",      "Altima AC9100", 0),
                   3420: PCI_ROM(0x173b, 0x03eb, "tg3-ac1003",      "Altima AC1003", 0),
                   3421: PCI_ROM(0x0e11, 0x00ca, "tg3-hp",         "HP Tigon 3", 0),
                   3422: };
                   3423: 
                   3424: PCI_DRIVER ( tg3_driver, tg3_nics, PCI_NO_CLASS );
                   3425: 
                   3426: DRIVER ( "TG3", nic_driver, pci_driver, tg3_driver,
                   3427:         tg3_probe, tg3_disable );
                   3428: 
                   3429: /*
                   3430:  * Local variables:
                   3431:  *  c-basic-offset: 8
                   3432:  *  c-indent-level: 8
                   3433:  *  tab-width: 8
                   3434:  * End:
                   3435:  */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.