source: bootcd/isolinux/syslinux-6.03/gpxe/src/drivers/net/tg3.c @ dd1be7c

Last change on this file since dd1be7c was e16e8f2, checked in by Edwin Eefting <edwin@datux.nl>, 3 years ago

bootstuff

  • Property mode set to 100644
File size: 95.1 KB
Line 
1/* $Id$
2 * tg3.c: Broadcom Tigon3 ethernet driver.
3 *
4 * Copyright (C) 2001, 2002 David S. Miller (davem@redhat.com)
5 * Copyright (C) 2001, 2002 Jeff Garzik (jgarzik@mandrakesoft.com)
6 * Copyright (C) 2003 Eric Biederman (ebiederman@lnxi.com)  [etherboot port]
7 */
8
9FILE_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 <gpxe/pci.h>
21#include <gpxe/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
32static 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
56struct 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
63struct 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 */
81static 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 */
95static 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
104static 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
118static void tw32_carefully(uint32_t reg, uint32_t val)
119{
120        tw32(reg, val);
121        tr32(reg);
122        udelay(100);
123}
124
125static void tw32_mailbox2(uint32_t reg, uint32_t val)
126{
127        tw32_mailbox(reg, val);
128        tr32(reg);
129}
130
131static 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
140static 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
149static 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
156static 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
180static 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
220static 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
256static 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
265static 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
277static 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
308static 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
325static 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
391static 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
411static 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 */
477static 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
514static 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
538static 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
559static 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
599static 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
618static 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
673static 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
691static 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
908struct 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
972static 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
1216static 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
1401static 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 */
1432static 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
1474static 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
1537out:
1538        return err;
1539}
1540
1541static 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
1634static 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
1654static 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
1689static 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
1697static 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
1731static 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
1750static 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) \
1791do { \
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 */
1802static 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. */
2294static 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
2326static 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
2362static 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
2411struct subsys_tbl_ent {
2412        uint16_t subsys_vendor, subsys_devid;
2413        uint32_t phy_id;
2414};
2415
2416static 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
2458static 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
2640static 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
2697out_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
2704static 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
2907static 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->devfn) == 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
2956static 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
3015static 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
3029static 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
3052static 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/**************************************************************************
3075POLL - Wait for a frame
3076***************************************************************************/
3077static 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
3098static 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/**************************************************************************
3141TRANSMIT - Transmit a frame
3142***************************************************************************/
3143#if 0
3144static 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
3161static 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/**************************************************************************
3217DISABLE - Turn off ethernet interface
3218***************************************************************************/
3219static 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/**************************************************************************
3238IRQ - Enable, Disable, or Force interrupts
3239***************************************************************************/
3240static 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
3252static 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/**************************************************************************
3261PROBE - Look for an adapter, this routine's visible to the outside
3262You should omit the last argument struct pci_device * for a non-PCI NIC
3263***************************************************************************/
3264static 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
3389static struct pci_device_id tg3_nics[] = {
3390PCI_ROM(0x14e4, 0x1644, "tg3-5700",        "Broadcom Tigon 3 5700", 0),
3391PCI_ROM(0x14e4, 0x1645, "tg3-5701",        "Broadcom Tigon 3 5701", 0),
3392PCI_ROM(0x14e4, 0x1646, "tg3-5702",        "Broadcom Tigon 3 5702", 0),
3393PCI_ROM(0x14e4, 0x1647, "tg3-5703",        "Broadcom Tigon 3 5703", 0),
3394PCI_ROM(0x14e4, 0x1648, "tg3-5704",        "Broadcom Tigon 3 5704", 0),
3395PCI_ROM(0x14e4, 0x164d, "tg3-5702FE",      "Broadcom Tigon 3 5702FE", 0),
3396PCI_ROM(0x14e4, 0x1653, "tg3-5705",        "Broadcom Tigon 3 5705", 0),
3397PCI_ROM(0x14e4, 0x1654, "tg3-5705_2",      "Broadcom Tigon 3 5705_2", 0),
3398PCI_ROM(0x14e4, 0x1659, "tg3-5721",        "Broadcom Tigon 3 5721", 0),
3399PCI_ROM(0x14e4, 0x165d, "tg3-5705M",       "Broadcom Tigon 3 5705M", 0),
3400PCI_ROM(0x14e4, 0x165e, "tg3-5705M_2",     "Broadcom Tigon 3 5705M_2", 0),
3401PCI_ROM(0x14e4, 0x1677, "tg3-5751",        "Broadcom Tigon 3 5751", 0),
3402PCI_ROM(0x14e4, 0x167a, "tg3-5754",        "Broadcom Tigon 3 5754", 0),
3403PCI_ROM(0x14e4, 0x1693, "tg3-5787",        "Broadcom Tigon 3 5787", 0),
3404PCI_ROM(0x14e4, 0x1696, "tg3-5782",        "Broadcom Tigon 3 5782", 0),
3405PCI_ROM(0x14e4, 0x169a, "tg3-5786",        "Broadcom Tigon 3 5786", 0),
3406PCI_ROM(0x14e4, 0x169c, "tg3-5788",        "Broadcom Tigon 3 5788", 0),
3407PCI_ROM(0x14e4, 0x169d, "tg3-5789",        "Broadcom Tigon 3 5789", 0),
3408PCI_ROM(0x14e4, 0x16a6, "tg3-5702X",       "Broadcom Tigon 3 5702X", 0),
3409PCI_ROM(0x14e4, 0x16a7, "tg3-5703X",       "Broadcom Tigon 3 5703X", 0),
3410PCI_ROM(0x14e4, 0x16a8, "tg3-5704S",       "Broadcom Tigon 3 5704S", 0),
3411PCI_ROM(0x14e4, 0x16c6, "tg3-5702A3",      "Broadcom Tigon 3 5702A3", 0),
3412PCI_ROM(0x14e4, 0x16c7, "tg3-5703A3",      "Broadcom Tigon 3 5703A3", 0),
3413PCI_ROM(0x14e4, 0x170d, "tg3-5901",        "Broadcom Tigon 3 5901", 0),
3414PCI_ROM(0x14e4, 0x170e, "tg3-5901_2",      "Broadcom Tigon 3 5901_2", 0),
3415PCI_ROM(0x1148, 0x4400, "tg3-9DXX",        "Syskonnect 9DXX", 0),
3416PCI_ROM(0x1148, 0x4500, "tg3-9MXX",        "Syskonnect 9MXX", 0),
3417PCI_ROM(0x173b, 0x03e8, "tg3-ac1000",      "Altima AC1000", 0),
3418PCI_ROM(0x173b, 0x03e9, "tg3-ac1001",      "Altima AC1001", 0),
3419PCI_ROM(0x173b, 0x03ea, "tg3-ac9100",      "Altima AC9100", 0),
3420PCI_ROM(0x173b, 0x03eb, "tg3-ac1003",      "Altima AC1003", 0),
3421PCI_ROM(0x0e11, 0x00ca, "tg3-hp",          "HP Tigon 3", 0),
3422};
3423
3424PCI_DRIVER ( tg3_driver, tg3_nics, PCI_NO_CLASS );
3425
3426DRIVER ( "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 */
Note: See TracBrowser for help on using the repository browser.