11 static void tg3_link_report(struct tg3 *tp);
13 void tg3_mdio_init(struct tg3 *tp)
14 { DBGP("%s\n", __func__);
16 if (tg3_flag(tp, 5717_PLUS)) {
19 tp->phy_addr = PCI_FUNC(tp->pdev->busdevfn) + 1;
21 if (tp->pci_chip_rev_id != CHIPREV_ID_5717_A0)
22 is_serdes = tr32(SG_DIG_STATUS) & SG_DIG_IS_SERDES;
24 is_serdes = tr32(TG3_CPMU_PHY_STRAP) &
25 TG3_CPMU_PHY_STRAP_IS_SERDES;
29 tp->phy_addr = TG3_PHY_MII_ADDR;
32 static int tg3_issue_otp_command(struct tg3 *tp, u32 cmd)
33 { DBGP("%s\n", __func__);
38 tw32(OTP_CTRL, cmd | OTP_CTRL_OTP_CMD_START);
41 /* Wait for up to 1 ms for command to execute. */
42 for (i = 0; i < 100; i++) {
43 val = tr32(OTP_STATUS);
44 if (val & OTP_STATUS_CMD_DONE)
49 return (val & OTP_STATUS_CMD_DONE) ? 0 : -EBUSY;
52 /* Read the gphy configuration from the OTP region of the chip. The gphy
53 * configuration is a 32-bit value that straddles the alignment boundary.
54 * We do two 32-bit reads and then shift and merge the results.
56 u32 tg3_read_otp_phycfg(struct tg3 *tp)
57 { DBGP("%s\n", __func__);
59 u32 bhalf_otp, thalf_otp;
61 tw32(OTP_MODE, OTP_MODE_OTP_THRU_GRC);
63 if (tg3_issue_otp_command(tp, OTP_CTRL_OTP_CMD_INIT))
66 tw32(OTP_ADDRESS, OTP_ADDRESS_MAGIC1);
68 if (tg3_issue_otp_command(tp, OTP_CTRL_OTP_CMD_READ))
71 thalf_otp = tr32(OTP_READ_DATA);
73 tw32(OTP_ADDRESS, OTP_ADDRESS_MAGIC2);
75 if (tg3_issue_otp_command(tp, OTP_CTRL_OTP_CMD_READ))
78 bhalf_otp = tr32(OTP_READ_DATA);
80 return ((thalf_otp & 0x0000ffff) << 16) | (bhalf_otp >> 16);
83 #define PHY_BUSY_LOOPS 5000
85 int tg3_readphy(struct tg3 *tp, int reg, u32 *val)
86 { DBGP("%s\n", __func__);
92 if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
94 (tp->mi_mode & ~MAC_MI_MODE_AUTO_POLL));
100 frame_val = ((tp->phy_addr << MI_COM_PHY_ADDR_SHIFT) &
101 MI_COM_PHY_ADDR_MASK);
102 frame_val |= ((reg << MI_COM_REG_ADDR_SHIFT) &
103 MI_COM_REG_ADDR_MASK);
104 frame_val |= (MI_COM_CMD_READ | MI_COM_START);
106 tw32_f(MAC_MI_COM, frame_val);
108 loops = PHY_BUSY_LOOPS;
111 frame_val = tr32(MAC_MI_COM);
113 if ((frame_val & MI_COM_BUSY) == 0) {
115 frame_val = tr32(MAC_MI_COM);
123 *val = frame_val & MI_COM_DATA_MASK;
127 if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
128 tw32_f(MAC_MI_MODE, tp->mi_mode);
135 struct subsys_tbl_ent {
136 u16 subsys_vendor, subsys_devid;
140 static struct subsys_tbl_ent subsys_id_to_phy_id[] = {
141 /* Broadcom boards. */
142 { TG3PCI_SUBVENDOR_ID_BROADCOM,
143 TG3PCI_SUBDEVICE_ID_BROADCOM_95700A6, TG3_PHY_ID_BCM5401 },
144 { TG3PCI_SUBVENDOR_ID_BROADCOM,
145 TG3PCI_SUBDEVICE_ID_BROADCOM_95701A5, TG3_PHY_ID_BCM5701 },
146 { TG3PCI_SUBVENDOR_ID_BROADCOM,
147 TG3PCI_SUBDEVICE_ID_BROADCOM_95700T6, TG3_PHY_ID_BCM8002 },
148 { TG3PCI_SUBVENDOR_ID_BROADCOM,
149 TG3PCI_SUBDEVICE_ID_BROADCOM_95700A9, 0 },
150 { TG3PCI_SUBVENDOR_ID_BROADCOM,
151 TG3PCI_SUBDEVICE_ID_BROADCOM_95701T1, TG3_PHY_ID_BCM5701 },
152 { TG3PCI_SUBVENDOR_ID_BROADCOM,
153 TG3PCI_SUBDEVICE_ID_BROADCOM_95701T8, TG3_PHY_ID_BCM5701 },
154 { TG3PCI_SUBVENDOR_ID_BROADCOM,
155 TG3PCI_SUBDEVICE_ID_BROADCOM_95701A7, 0 },
156 { TG3PCI_SUBVENDOR_ID_BROADCOM,
157 TG3PCI_SUBDEVICE_ID_BROADCOM_95701A10, TG3_PHY_ID_BCM5701 },
158 { TG3PCI_SUBVENDOR_ID_BROADCOM,
159 TG3PCI_SUBDEVICE_ID_BROADCOM_95701A12, TG3_PHY_ID_BCM5701 },
160 { TG3PCI_SUBVENDOR_ID_BROADCOM,
161 TG3PCI_SUBDEVICE_ID_BROADCOM_95703AX1, TG3_PHY_ID_BCM5703 },
162 { TG3PCI_SUBVENDOR_ID_BROADCOM,
163 TG3PCI_SUBDEVICE_ID_BROADCOM_95703AX2, TG3_PHY_ID_BCM5703 },
166 { TG3PCI_SUBVENDOR_ID_3COM,
167 TG3PCI_SUBDEVICE_ID_3COM_3C996T, TG3_PHY_ID_BCM5401 },
168 { TG3PCI_SUBVENDOR_ID_3COM,
169 TG3PCI_SUBDEVICE_ID_3COM_3C996BT, TG3_PHY_ID_BCM5701 },
170 { TG3PCI_SUBVENDOR_ID_3COM,
171 TG3PCI_SUBDEVICE_ID_3COM_3C996SX, 0 },
172 { TG3PCI_SUBVENDOR_ID_3COM,
173 TG3PCI_SUBDEVICE_ID_3COM_3C1000T, TG3_PHY_ID_BCM5701 },
174 { TG3PCI_SUBVENDOR_ID_3COM,
175 TG3PCI_SUBDEVICE_ID_3COM_3C940BR01, TG3_PHY_ID_BCM5701 },
178 { TG3PCI_SUBVENDOR_ID_DELL,
179 TG3PCI_SUBDEVICE_ID_DELL_VIPER, TG3_PHY_ID_BCM5401 },
180 { TG3PCI_SUBVENDOR_ID_DELL,
181 TG3PCI_SUBDEVICE_ID_DELL_JAGUAR, TG3_PHY_ID_BCM5401 },
182 { TG3PCI_SUBVENDOR_ID_DELL,
183 TG3PCI_SUBDEVICE_ID_DELL_MERLOT, TG3_PHY_ID_BCM5411 },
184 { TG3PCI_SUBVENDOR_ID_DELL,
185 TG3PCI_SUBDEVICE_ID_DELL_SLIM_MERLOT, TG3_PHY_ID_BCM5411 },
188 { TG3PCI_SUBVENDOR_ID_COMPAQ,
189 TG3PCI_SUBDEVICE_ID_COMPAQ_BANSHEE, TG3_PHY_ID_BCM5701 },
190 { TG3PCI_SUBVENDOR_ID_COMPAQ,
191 TG3PCI_SUBDEVICE_ID_COMPAQ_BANSHEE_2, TG3_PHY_ID_BCM5701 },
192 { TG3PCI_SUBVENDOR_ID_COMPAQ,
193 TG3PCI_SUBDEVICE_ID_COMPAQ_CHANGELING, 0 },
194 { TG3PCI_SUBVENDOR_ID_COMPAQ,
195 TG3PCI_SUBDEVICE_ID_COMPAQ_NC7780, TG3_PHY_ID_BCM5701 },
196 { TG3PCI_SUBVENDOR_ID_COMPAQ,
197 TG3PCI_SUBDEVICE_ID_COMPAQ_NC7780_2, TG3_PHY_ID_BCM5701 },
200 { TG3PCI_SUBVENDOR_ID_IBM,
201 TG3PCI_SUBDEVICE_ID_IBM_5703SAX2, 0 }
204 static struct subsys_tbl_ent *tg3_lookup_by_subsys(struct tg3 *tp)
205 { DBGP("%s\n", __func__);
209 DBGC(tp->dev, "Matching with: %x:%x\n", tp->subsystem_vendor, tp->subsystem_device);
211 for (i = 0; i < (int) ARRAY_SIZE(subsys_id_to_phy_id); i++) {
212 if ((subsys_id_to_phy_id[i].subsys_vendor ==
213 tp->subsystem_vendor) &&
214 (subsys_id_to_phy_id[i].subsys_devid ==
215 tp->subsystem_device))
216 return &subsys_id_to_phy_id[i];
221 int tg3_writephy(struct tg3 *tp, int reg, u32 val)
222 { DBGP("%s\n", __func__);
228 if ((tp->phy_flags & TG3_PHYFLG_IS_FET) &&
229 (reg == MII_TG3_CTRL || reg == MII_TG3_AUX_CTRL))
232 if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
234 (tp->mi_mode & ~MAC_MI_MODE_AUTO_POLL));
238 frame_val = ((tp->phy_addr << MI_COM_PHY_ADDR_SHIFT) &
239 MI_COM_PHY_ADDR_MASK);
240 frame_val |= ((reg << MI_COM_REG_ADDR_SHIFT) &
241 MI_COM_REG_ADDR_MASK);
242 frame_val |= (val & MI_COM_DATA_MASK);
243 frame_val |= (MI_COM_CMD_WRITE | MI_COM_START);
245 tw32_f(MAC_MI_COM, frame_val);
247 loops = PHY_BUSY_LOOPS;
250 frame_val = tr32(MAC_MI_COM);
251 if ((frame_val & MI_COM_BUSY) == 0) {
253 frame_val = tr32(MAC_MI_COM);
263 if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
264 tw32_f(MAC_MI_MODE, tp->mi_mode);
271 static int tg3_bmcr_reset(struct tg3 *tp)
272 { DBGP("%s\n", __func__);
277 /* OK, reset it, and poll the BMCR_RESET bit until it
278 * clears or we time out.
280 phy_control = BMCR_RESET;
281 err = tg3_writephy(tp, MII_BMCR, phy_control);
287 err = tg3_readphy(tp, MII_BMCR, &phy_control);
291 if ((phy_control & BMCR_RESET) == 0) {
303 static int tg3_wait_macro_done(struct tg3 *tp)
304 { DBGP("%s\n", __func__);
311 if (!tg3_readphy(tp, MII_TG3_DSP_CONTROL, &tmp32)) {
312 if ((tmp32 & 0x1000) == 0)
322 static int tg3_phy_write_and_check_testpat(struct tg3 *tp, int *resetp)
323 { DBGP("%s\n", __func__);
325 static const u32 test_pat[4][6] = {
326 { 0x00005555, 0x00000005, 0x00002aaa, 0x0000000a, 0x00003456, 0x00000003 },
327 { 0x00002aaa, 0x0000000a, 0x00003333, 0x00000003, 0x0000789a, 0x00000005 },
328 { 0x00005a5a, 0x00000005, 0x00002a6a, 0x0000000a, 0x00001bcd, 0x00000003 },
329 { 0x00002a5a, 0x0000000a, 0x000033c3, 0x00000003, 0x00002ef1, 0x00000005 }
333 for (chan = 0; chan < 4; chan++) {
336 tg3_writephy(tp, MII_TG3_DSP_ADDRESS,
337 (chan * 0x2000) | 0x0200);
338 tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0002);
340 for (i = 0; i < 6; i++)
341 tg3_writephy(tp, MII_TG3_DSP_RW_PORT,
344 tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0202);
345 if (tg3_wait_macro_done(tp)) {
350 tg3_writephy(tp, MII_TG3_DSP_ADDRESS,
351 (chan * 0x2000) | 0x0200);
352 tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0082);
353 if (tg3_wait_macro_done(tp)) {
358 tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0802);
359 if (tg3_wait_macro_done(tp)) {
364 for (i = 0; i < 6; i += 2) {
367 if (tg3_readphy(tp, MII_TG3_DSP_RW_PORT, &low) ||
368 tg3_readphy(tp, MII_TG3_DSP_RW_PORT, &high) ||
369 tg3_wait_macro_done(tp)) {
375 if (low != test_pat[chan][i] ||
376 high != test_pat[chan][i+1]) {
377 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x000b);
378 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x4001);
379 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x4005);
389 static int tg3_phy_reset_chanpat(struct tg3 *tp)
390 { DBGP("%s\n", __func__);
394 for (chan = 0; chan < 4; chan++) {
397 tg3_writephy(tp, MII_TG3_DSP_ADDRESS,
398 (chan * 0x2000) | 0x0200);
399 tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0002);
400 for (i = 0; i < 6; i++)
401 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x000);
402 tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0202);
403 if (tg3_wait_macro_done(tp))
410 static int tg3_phydsp_write(struct tg3 *tp, u32 reg, u32 val)
411 { DBGP("%s\n", __func__);
415 err = tg3_writephy(tp, MII_TG3_DSP_ADDRESS, reg);
417 err = tg3_writephy(tp, MII_TG3_DSP_RW_PORT, val);
422 static int tg3_phy_auxctl_write(struct tg3 *tp, int reg, u32 set)
423 { DBGP("%s\n", __func__);
425 if (reg == MII_TG3_AUXCTL_SHDWSEL_MISC)
426 set |= MII_TG3_AUXCTL_MISC_WREN;
428 return tg3_writephy(tp, MII_TG3_AUX_CTRL, set | reg);
431 #define TG3_PHY_AUXCTL_SMDSP_ENABLE(tp) \
432 tg3_phy_auxctl_write((tp), MII_TG3_AUXCTL_SHDWSEL_AUXCTL, \
433 MII_TG3_AUXCTL_ACTL_SMDSP_ENA | \
434 MII_TG3_AUXCTL_ACTL_TX_6DB)
436 #define TG3_PHY_AUXCTL_SMDSP_DISABLE(tp) \
437 tg3_phy_auxctl_write((tp), MII_TG3_AUXCTL_SHDWSEL_AUXCTL, \
438 MII_TG3_AUXCTL_ACTL_TX_6DB);
440 static int tg3_phy_reset_5703_4_5(struct tg3 *tp)
441 { DBGP("%s\n", __func__);
443 u32 reg32, phy9_orig;
444 int retries, do_phy_reset, err;
450 err = tg3_bmcr_reset(tp);
456 /* Disable transmitter and interrupt. */
457 if (tg3_readphy(tp, MII_TG3_EXT_CTRL, ®32))
461 tg3_writephy(tp, MII_TG3_EXT_CTRL, reg32);
463 /* Set full-duplex, 1000 mbps. */
464 tg3_writephy(tp, MII_BMCR,
465 BMCR_FULLDPLX | TG3_BMCR_SPEED1000);
467 /* Set to master mode. */
468 if (tg3_readphy(tp, MII_TG3_CTRL, &phy9_orig))
471 tg3_writephy(tp, MII_TG3_CTRL,
472 (MII_TG3_CTRL_AS_MASTER |
473 MII_TG3_CTRL_ENABLE_AS_MASTER));
475 err = TG3_PHY_AUXCTL_SMDSP_ENABLE(tp);
479 /* Block the PHY control access. */
480 tg3_phydsp_write(tp, 0x8005, 0x0800);
482 err = tg3_phy_write_and_check_testpat(tp, &do_phy_reset);
487 err = tg3_phy_reset_chanpat(tp);
491 tg3_phydsp_write(tp, 0x8005, 0x0000);
493 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x8200);
494 tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0000);
496 TG3_PHY_AUXCTL_SMDSP_DISABLE(tp);
498 tg3_writephy(tp, MII_TG3_CTRL, phy9_orig);
500 if (!tg3_readphy(tp, MII_TG3_EXT_CTRL, ®32)) {
502 tg3_writephy(tp, MII_TG3_EXT_CTRL, reg32);
509 static void tg3_phy_apply_otp(struct tg3 *tp)
510 { DBGP("%s\n", __func__);
519 if (TG3_PHY_AUXCTL_SMDSP_ENABLE(tp))
522 phy = ((otp & TG3_OTP_AGCTGT_MASK) >> TG3_OTP_AGCTGT_SHIFT);
523 phy |= MII_TG3_DSP_TAP1_AGCTGT_DFLT;
524 tg3_phydsp_write(tp, MII_TG3_DSP_TAP1, phy);
526 phy = ((otp & TG3_OTP_HPFFLTR_MASK) >> TG3_OTP_HPFFLTR_SHIFT) |
527 ((otp & TG3_OTP_HPFOVER_MASK) >> TG3_OTP_HPFOVER_SHIFT);
528 tg3_phydsp_write(tp, MII_TG3_DSP_AADJ1CH0, phy);
530 phy = ((otp & TG3_OTP_LPFDIS_MASK) >> TG3_OTP_LPFDIS_SHIFT);
531 phy |= MII_TG3_DSP_AADJ1CH3_ADCCKADJ;
532 tg3_phydsp_write(tp, MII_TG3_DSP_AADJ1CH3, phy);
534 phy = ((otp & TG3_OTP_VDAC_MASK) >> TG3_OTP_VDAC_SHIFT);
535 tg3_phydsp_write(tp, MII_TG3_DSP_EXP75, phy);
537 phy = ((otp & TG3_OTP_10BTAMP_MASK) >> TG3_OTP_10BTAMP_SHIFT);
538 tg3_phydsp_write(tp, MII_TG3_DSP_EXP96, phy);
540 phy = ((otp & TG3_OTP_ROFF_MASK) >> TG3_OTP_ROFF_SHIFT) |
541 ((otp & TG3_OTP_RCOFF_MASK) >> TG3_OTP_RCOFF_SHIFT);
542 tg3_phydsp_write(tp, MII_TG3_DSP_EXP97, phy);
544 TG3_PHY_AUXCTL_SMDSP_DISABLE(tp);
547 static int tg3_phy_auxctl_read(struct tg3 *tp, int reg, u32 *val)
548 { DBGP("%s\n", __func__);
552 err = tg3_writephy(tp, MII_TG3_AUX_CTRL,
553 (reg << MII_TG3_AUXCTL_MISC_RDSEL_SHIFT) |
554 MII_TG3_AUXCTL_SHDWSEL_MISC);
556 err = tg3_readphy(tp, MII_TG3_AUX_CTRL, val);
561 static void tg3_phy_toggle_automdix(struct tg3 *tp, int enable)
562 { DBGP("%s\n", __func__);
566 if (!tg3_flag(tp, 5705_PLUS) ||
567 (tp->phy_flags & TG3_PHYFLG_ANY_SERDES))
570 if (tp->phy_flags & TG3_PHYFLG_IS_FET) {
573 if (!tg3_readphy(tp, MII_TG3_FET_TEST, &ephy)) {
574 u32 reg = MII_TG3_FET_SHDW_MISCCTRL;
576 tg3_writephy(tp, MII_TG3_FET_TEST,
577 ephy | MII_TG3_FET_SHADOW_EN);
578 if (!tg3_readphy(tp, reg, &phy)) {
580 phy |= MII_TG3_FET_SHDW_MISCCTRL_MDIX;
582 phy &= ~MII_TG3_FET_SHDW_MISCCTRL_MDIX;
583 tg3_writephy(tp, reg, phy);
585 tg3_writephy(tp, MII_TG3_FET_TEST, ephy);
590 ret = tg3_phy_auxctl_read(tp,
591 MII_TG3_AUXCTL_SHDWSEL_MISC, &phy);
594 phy |= MII_TG3_AUXCTL_MISC_FORCE_AMDIX;
596 phy &= ~MII_TG3_AUXCTL_MISC_FORCE_AMDIX;
597 tg3_phy_auxctl_write(tp,
598 MII_TG3_AUXCTL_SHDWSEL_MISC, phy);
603 static void tg3_phy_set_wirespeed(struct tg3 *tp)
604 { DBGP("%s\n", __func__);
609 if (tp->phy_flags & TG3_PHYFLG_NO_ETH_WIRE_SPEED)
612 ret = tg3_phy_auxctl_read(tp, MII_TG3_AUXCTL_SHDWSEL_MISC, &val);
614 tg3_phy_auxctl_write(tp, MII_TG3_AUXCTL_SHDWSEL_MISC,
615 val | MII_TG3_AUXCTL_MISC_WIRESPD_EN);
618 /* This will reset the tigon3 PHY if there is no valid
619 * link unless the FORCE argument is non-zero.
621 int tg3_phy_reset(struct tg3 *tp)
622 { DBGP("%s\n", __func__);
627 DBGCP(&tp->pdev->dev, "%s\n", __func__);
629 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
630 val = tr32(GRC_MISC_CFG);
631 tw32_f(GRC_MISC_CFG, val & ~GRC_MISC_CFG_EPHY_IDDQ);
634 err = tg3_readphy(tp, MII_BMSR, &val);
635 err |= tg3_readphy(tp, MII_BMSR, &val);
639 netdev_link_down(tp->dev);
642 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
643 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 ||
644 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
645 err = tg3_phy_reset_5703_4_5(tp);
652 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 &&
653 GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5784_AX) {
654 cpmuctrl = tr32(TG3_CPMU_CTRL);
655 if (cpmuctrl & CPMU_CTRL_GPHY_10MB_RXONLY)
657 cpmuctrl & ~CPMU_CTRL_GPHY_10MB_RXONLY);
660 err = tg3_bmcr_reset(tp);
664 if (cpmuctrl & CPMU_CTRL_GPHY_10MB_RXONLY) {
665 val = MII_TG3_DSP_EXP8_AEDW | MII_TG3_DSP_EXP8_REJ2MHz;
666 tg3_phydsp_write(tp, MII_TG3_DSP_EXP8, val);
668 tw32(TG3_CPMU_CTRL, cpmuctrl);
671 if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5784_AX ||
672 GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5761_AX) {
673 val = tr32(TG3_CPMU_LSPD_1000MB_CLK);
674 if ((val & CPMU_LSPD_1000MB_MACCLK_MASK) ==
675 CPMU_LSPD_1000MB_MACCLK_12_5) {
676 val &= ~CPMU_LSPD_1000MB_MACCLK_MASK;
678 tw32_f(TG3_CPMU_LSPD_1000MB_CLK, val);
682 if (tg3_flag(tp, 5717_PLUS) &&
683 (tp->phy_flags & TG3_PHYFLG_MII_SERDES))
686 tg3_phy_apply_otp(tp);
689 if ((tp->phy_flags & TG3_PHYFLG_ADC_BUG) &&
690 !TG3_PHY_AUXCTL_SMDSP_ENABLE(tp)) {
691 tg3_phydsp_write(tp, 0x201f, 0x2aaa);
692 tg3_phydsp_write(tp, 0x000a, 0x0323);
693 TG3_PHY_AUXCTL_SMDSP_DISABLE(tp);
696 if (tp->phy_flags & TG3_PHYFLG_5704_A0_BUG) {
697 tg3_writephy(tp, MII_TG3_MISC_SHDW, 0x8d68);
698 tg3_writephy(tp, MII_TG3_MISC_SHDW, 0x8d68);
701 if (tp->phy_flags & TG3_PHYFLG_BER_BUG) {
702 if (!TG3_PHY_AUXCTL_SMDSP_ENABLE(tp)) {
703 tg3_phydsp_write(tp, 0x000a, 0x310b);
704 tg3_phydsp_write(tp, 0x201f, 0x9506);
705 tg3_phydsp_write(tp, 0x401f, 0x14e2);
706 TG3_PHY_AUXCTL_SMDSP_DISABLE(tp);
708 } else if (tp->phy_flags & TG3_PHYFLG_JITTER_BUG) {
709 if (!TG3_PHY_AUXCTL_SMDSP_ENABLE(tp)) {
710 tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x000a);
711 if (tp->phy_flags & TG3_PHYFLG_ADJUST_TRIM) {
712 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x110b);
713 tg3_writephy(tp, MII_TG3_TEST1,
714 MII_TG3_TEST1_TRIM_EN | 0x4);
716 tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x010b);
718 TG3_PHY_AUXCTL_SMDSP_DISABLE(tp);
722 if ((tp->phy_id & TG3_PHY_ID_MASK) == TG3_PHY_ID_BCM5401) {
723 /* Cannot do read-modify-write on 5401 */
724 tg3_phy_auxctl_write(tp, MII_TG3_AUXCTL_SHDWSEL_AUXCTL, 0x4c20);
727 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
728 /* adjust output voltage */
729 tg3_writephy(tp, MII_TG3_FET_PTEST, 0x12);
732 tg3_phy_toggle_automdix(tp, 1);
733 tg3_phy_set_wirespeed(tp);
737 static int tg3_copper_is_advertising_all(struct tg3 *tp, u32 mask)
738 { DBGP("%s\n", __func__);
740 u32 adv_reg, all_mask = 0;
742 if (mask & ADVERTISED_10baseT_Half)
743 all_mask |= ADVERTISE_10HALF;
744 if (mask & ADVERTISED_10baseT_Full)
745 all_mask |= ADVERTISE_10FULL;
746 if (mask & ADVERTISED_100baseT_Half)
747 all_mask |= ADVERTISE_100HALF;
748 if (mask & ADVERTISED_100baseT_Full)
749 all_mask |= ADVERTISE_100FULL;
751 if (tg3_readphy(tp, MII_ADVERTISE, &adv_reg))
754 if ((adv_reg & all_mask) != all_mask)
756 if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY)) {
760 if (mask & ADVERTISED_1000baseT_Half)
761 all_mask |= ADVERTISE_1000HALF;
762 if (mask & ADVERTISED_1000baseT_Full)
763 all_mask |= ADVERTISE_1000FULL;
765 if (tg3_readphy(tp, MII_TG3_CTRL, &tg3_ctrl))
768 if ((tg3_ctrl & all_mask) != all_mask)
774 static u16 tg3_advert_flowctrl_1000T(u8 flow_ctrl)
775 { DBGP("%s\n", __func__);
779 if ((flow_ctrl & FLOW_CTRL_TX) && (flow_ctrl & FLOW_CTRL_RX))
780 miireg = ADVERTISE_PAUSE_CAP;
781 else if (flow_ctrl & FLOW_CTRL_TX)
782 miireg = ADVERTISE_PAUSE_ASYM;
783 else if (flow_ctrl & FLOW_CTRL_RX)
784 miireg = ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
791 static int tg3_phy_autoneg_cfg(struct tg3 *tp, u32 advertise, u32 flowctrl)
792 { DBGP("%s\n", __func__);
795 u32 val __unused, new_adv;
797 new_adv = ADVERTISE_CSMA;
798 if (advertise & ADVERTISED_10baseT_Half)
799 new_adv |= ADVERTISE_10HALF;
800 if (advertise & ADVERTISED_10baseT_Full)
801 new_adv |= ADVERTISE_10FULL;
802 if (advertise & ADVERTISED_100baseT_Half)
803 new_adv |= ADVERTISE_100HALF;
804 if (advertise & ADVERTISED_100baseT_Full)
805 new_adv |= ADVERTISE_100FULL;
807 new_adv |= tg3_advert_flowctrl_1000T(flowctrl);
809 err = tg3_writephy(tp, MII_ADVERTISE, new_adv);
813 if (tp->phy_flags & TG3_PHYFLG_10_100_ONLY)
817 if (advertise & ADVERTISED_1000baseT_Half)
818 new_adv |= MII_TG3_CTRL_ADV_1000_HALF;
819 if (advertise & ADVERTISED_1000baseT_Full)
820 new_adv |= MII_TG3_CTRL_ADV_1000_FULL;
822 if (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0 ||
823 tp->pci_chip_rev_id == CHIPREV_ID_5701_B0)
824 new_adv |= (MII_TG3_CTRL_AS_MASTER |
825 MII_TG3_CTRL_ENABLE_AS_MASTER);
827 err = tg3_writephy(tp, MII_TG3_CTRL, new_adv);
831 if (!(tp->phy_flags & TG3_PHYFLG_EEE_CAP))
838 static int tg3_init_5401phy_dsp(struct tg3 *tp)
839 { DBGP("%s\n", __func__);
843 /* Turn off tap power management. */
844 /* Set Extended packet length bit */
845 err = tg3_phy_auxctl_write(tp, MII_TG3_AUXCTL_SHDWSEL_AUXCTL, 0x4c20);
847 err |= tg3_phydsp_write(tp, 0x0012, 0x1804);
848 err |= tg3_phydsp_write(tp, 0x0013, 0x1204);
849 err |= tg3_phydsp_write(tp, 0x8006, 0x0132);
850 err |= tg3_phydsp_write(tp, 0x8006, 0x0232);
851 err |= tg3_phydsp_write(tp, 0x201f, 0x0a20);
858 #define ADVERTISED_Autoneg (1 << 6)
859 #define ADVERTISED_Pause (1 << 13)
860 #define ADVERTISED_TP (1 << 7)
861 #define ADVERTISED_FIBRE (1 << 10)
863 #define AUTONEG_ENABLE 0x01
865 static void tg3_phy_init_link_config(struct tg3 *tp)
866 { DBGP("%s\n", __func__);
868 u32 adv = ADVERTISED_Autoneg |
872 if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY))
873 adv |= ADVERTISED_1000baseT_Half |
874 ADVERTISED_1000baseT_Full;
875 if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES))
876 adv |= ADVERTISED_100baseT_Half |
877 ADVERTISED_100baseT_Full |
878 ADVERTISED_10baseT_Half |
879 ADVERTISED_10baseT_Full |
882 adv |= ADVERTISED_FIBRE;
884 tp->link_config.advertising = adv;
885 tp->link_config.speed = SPEED_INVALID;
886 tp->link_config.duplex = DUPLEX_INVALID;
887 tp->link_config.autoneg = AUTONEG_ENABLE;
888 tp->link_config.active_speed = SPEED_INVALID;
889 tp->link_config.active_duplex = DUPLEX_INVALID;
890 tp->link_config.orig_speed = SPEED_INVALID;
891 tp->link_config.orig_duplex = DUPLEX_INVALID;
892 tp->link_config.orig_autoneg = AUTONEG_INVALID;
895 int tg3_phy_probe(struct tg3 *tp)
896 { DBGP("%s\n", __func__);
898 u32 hw_phy_id_1, hw_phy_id_2;
899 u32 hw_phy_id, hw_phy_id_masked;
902 /* flow control autonegotiation is default behavior */
903 tg3_flag_set(tp, PAUSE_AUTONEG);
904 tp->link_config.flowctrl = FLOW_CTRL_TX | FLOW_CTRL_RX;
906 /* Reading the PHY ID register can conflict with ASF
907 * firmware access to the PHY hardware.
910 if (tg3_flag(tp, ENABLE_ASF) || tg3_flag(tp, ENABLE_APE)) {
911 hw_phy_id = hw_phy_id_masked = TG3_PHY_ID_INVALID;
913 /* Now read the physical PHY_ID from the chip and verify
914 * that it is sane. If it doesn't look good, we fall back
915 * to either the hard-coded table based PHY_ID and failing
916 * that the value found in the eeprom area.
918 err |= tg3_readphy(tp, MII_PHYSID1, &hw_phy_id_1);
919 err |= tg3_readphy(tp, MII_PHYSID2, &hw_phy_id_2);
921 hw_phy_id = (hw_phy_id_1 & 0xffff) << 10;
922 hw_phy_id |= (hw_phy_id_2 & 0xfc00) << 16;
923 hw_phy_id |= (hw_phy_id_2 & 0x03ff) << 0;
925 hw_phy_id_masked = hw_phy_id & TG3_PHY_ID_MASK;
928 if (!err && TG3_KNOWN_PHY_ID(hw_phy_id_masked)) {
929 tp->phy_id = hw_phy_id;
930 if (hw_phy_id_masked == TG3_PHY_ID_BCM8002)
931 tp->phy_flags |= TG3_PHYFLG_PHY_SERDES;
933 tp->phy_flags &= ~TG3_PHYFLG_PHY_SERDES;
935 if (tp->phy_id != TG3_PHY_ID_INVALID) {
936 /* Do nothing, phy ID already set up in
937 * tg3_get_eeprom_hw_cfg().
940 struct subsys_tbl_ent *p;
942 /* No eeprom signature? Try the hardcoded
943 * subsys device table.
945 p = tg3_lookup_by_subsys(tp);
947 DBGC(&tp->pdev->dev, "lookup by subsys failed\n");
951 tp->phy_id = p->phy_id;
953 tp->phy_id == TG3_PHY_ID_BCM8002)
954 tp->phy_flags |= TG3_PHYFLG_PHY_SERDES;
958 if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES) &&
959 ((tp->pdev->device == TG3PCI_DEVICE_TIGON3_5718 &&
960 tp->pci_chip_rev_id != CHIPREV_ID_5717_A0) ||
961 (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57765 &&
962 tp->pci_chip_rev_id != CHIPREV_ID_57765_A0)))
963 tp->phy_flags |= TG3_PHYFLG_EEE_CAP;
965 tg3_phy_init_link_config(tp);
967 if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES) &&
968 !tg3_flag(tp, ENABLE_APE) &&
969 !tg3_flag(tp, ENABLE_ASF)) {
973 tg3_readphy(tp, MII_BMSR, &bmsr);
974 if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
975 (bmsr & BMSR_LSTATUS))
978 err = tg3_phy_reset(tp);
982 tg3_phy_set_wirespeed(tp);
984 mask = (ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |
985 ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full |
986 ADVERTISED_1000baseT_Half | ADVERTISED_1000baseT_Full);
987 if (!tg3_copper_is_advertising_all(tp, mask)) {
988 tg3_phy_autoneg_cfg(tp, tp->link_config.advertising,
989 tp->link_config.flowctrl);
991 tg3_writephy(tp, MII_BMCR,
992 BMCR_ANENABLE | BMCR_ANRESTART);
997 if ((tp->phy_id & TG3_PHY_ID_MASK) == TG3_PHY_ID_BCM5401) {
998 err = tg3_init_5401phy_dsp(tp);
1002 err = tg3_init_5401phy_dsp(tp);
1008 void tg3_poll_link(struct tg3 *tp)
1009 { DBGP("%s\n", __func__);
1011 if (tp->hw_status->status & SD_STATUS_LINK_CHG) {
1012 DBGC(tp->dev,"link_changed\n");
1013 tp->hw_status->status &= ~SD_STATUS_LINK_CHG;
1014 tg3_setup_phy(tp, 0);
1018 static void tg3_aux_stat_to_speed_duplex(struct tg3 *tp, u32 val, u16 *speed, u8 *duplex)
1019 { DBGP("%s\n", __func__);
1021 switch (val & MII_TG3_AUX_STAT_SPDMASK) {
1022 case MII_TG3_AUX_STAT_10HALF:
1024 *duplex = DUPLEX_HALF;
1027 case MII_TG3_AUX_STAT_10FULL:
1029 *duplex = DUPLEX_FULL;
1032 case MII_TG3_AUX_STAT_100HALF:
1034 *duplex = DUPLEX_HALF;
1037 case MII_TG3_AUX_STAT_100FULL:
1039 *duplex = DUPLEX_FULL;
1042 case MII_TG3_AUX_STAT_1000HALF:
1043 *speed = SPEED_1000;
1044 *duplex = DUPLEX_HALF;
1047 case MII_TG3_AUX_STAT_1000FULL:
1048 *speed = SPEED_1000;
1049 *duplex = DUPLEX_FULL;
1053 if (tp->phy_flags & TG3_PHYFLG_IS_FET) {
1054 *speed = (val & MII_TG3_AUX_STAT_100) ? SPEED_100 :
1056 *duplex = (val & MII_TG3_AUX_STAT_FULL) ? DUPLEX_FULL :
1060 *speed = SPEED_INVALID;
1061 *duplex = DUPLEX_INVALID;
1066 static int tg3_adv_1000T_flowctrl_ok(struct tg3 *tp, u32 *lcladv, u32 *rmtadv)
1067 { DBGP("%s\n", __func__);
1071 if (tg3_readphy(tp, MII_ADVERTISE, lcladv))
1074 curadv = *lcladv & (ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM);
1075 reqadv = tg3_advert_flowctrl_1000T(tp->link_config.flowctrl);
1077 if (tp->link_config.active_duplex == DUPLEX_FULL) {
1078 if (curadv != reqadv)
1081 if (tg3_flag(tp, PAUSE_AUTONEG))
1082 tg3_readphy(tp, MII_LPA, rmtadv);
1084 /* Reprogram the advertisement register, even if it
1085 * does not affect the current link. If the link
1086 * gets renegotiated in the future, we can save an
1087 * additional renegotiation cycle by advertising
1088 * it correctly in the first place.
1090 if (curadv != reqadv) {
1091 *lcladv &= ~(ADVERTISE_PAUSE_CAP |
1092 ADVERTISE_PAUSE_ASYM);
1093 tg3_writephy(tp, MII_ADVERTISE, *lcladv | reqadv);
1100 static u8 tg3_resolve_flowctrl_1000X(u16 lcladv, u16 rmtadv)
1101 { DBGP("%s\n", __func__);
1105 if (lcladv & ADVERTISE_1000XPAUSE) {
1106 if (lcladv & ADVERTISE_1000XPSE_ASYM) {
1107 if (rmtadv & LPA_1000XPAUSE)
1108 cap = FLOW_CTRL_TX | FLOW_CTRL_RX;
1109 else if (rmtadv & LPA_1000XPAUSE_ASYM)
1112 if (rmtadv & LPA_1000XPAUSE)
1113 cap = FLOW_CTRL_TX | FLOW_CTRL_RX;
1115 } else if (lcladv & ADVERTISE_1000XPSE_ASYM) {
1116 if ((rmtadv & LPA_1000XPAUSE) && (rmtadv & LPA_1000XPAUSE_ASYM))
1123 static void tg3_setup_flow_control(struct tg3 *tp, u32 lcladv, u32 rmtadv)
1124 { DBGP("%s\n", __func__);
1127 u32 old_rx_mode = tp->rx_mode;
1128 u32 old_tx_mode = tp->tx_mode;
1130 if (tg3_flag(tp, PAUSE_AUTONEG)) {
1131 if (tp->phy_flags & TG3_PHYFLG_ANY_SERDES)
1132 flowctrl = tg3_resolve_flowctrl_1000X(lcladv, rmtadv);
1134 flowctrl = mii_resolve_flowctrl_fdx(lcladv, rmtadv);
1136 flowctrl = tp->link_config.flowctrl;
1138 tp->link_config.active_flowctrl = flowctrl;
1140 if (flowctrl & FLOW_CTRL_RX)
1141 tp->rx_mode |= RX_MODE_FLOW_CTRL_ENABLE;
1143 tp->rx_mode &= ~RX_MODE_FLOW_CTRL_ENABLE;
1145 if (old_rx_mode != tp->rx_mode)
1146 tw32_f(MAC_RX_MODE, tp->rx_mode);
1148 if (flowctrl & FLOW_CTRL_TX)
1149 tp->tx_mode |= TX_MODE_FLOW_CTRL_ENABLE;
1151 tp->tx_mode &= ~TX_MODE_FLOW_CTRL_ENABLE;
1153 if (old_tx_mode != tp->tx_mode)
1154 tw32_f(MAC_TX_MODE, tp->tx_mode);
1157 static void tg3_phy_copper_begin(struct tg3 *tp)
1158 { DBGP("%s\n", __func__);
1162 if (tp->link_config.speed == SPEED_INVALID) {
1163 if (tp->phy_flags & TG3_PHYFLG_10_100_ONLY)
1164 tp->link_config.advertising &=
1165 ~(ADVERTISED_1000baseT_Half |
1166 ADVERTISED_1000baseT_Full);
1168 tg3_phy_autoneg_cfg(tp, tp->link_config.advertising,
1169 tp->link_config.flowctrl);
1171 /* Asking for a specific link mode. */
1172 if (tp->link_config.speed == SPEED_1000) {
1173 if (tp->link_config.duplex == DUPLEX_FULL)
1174 new_adv = ADVERTISED_1000baseT_Full;
1176 new_adv = ADVERTISED_1000baseT_Half;
1177 } else if (tp->link_config.speed == SPEED_100) {
1178 if (tp->link_config.duplex == DUPLEX_FULL)
1179 new_adv = ADVERTISED_100baseT_Full;
1181 new_adv = ADVERTISED_100baseT_Half;
1183 if (tp->link_config.duplex == DUPLEX_FULL)
1184 new_adv = ADVERTISED_10baseT_Full;
1186 new_adv = ADVERTISED_10baseT_Half;
1189 tg3_phy_autoneg_cfg(tp, new_adv,
1190 tp->link_config.flowctrl);
1193 tg3_writephy(tp, MII_BMCR, BMCR_ANENABLE | BMCR_ANRESTART);
1196 static int tg3_5700_link_polarity(struct tg3 *tp, u32 speed)
1197 { DBGP("%s\n", __func__);
1199 if (tp->led_ctrl == LED_CTRL_MODE_PHY_2)
1201 else if ((tp->phy_id & TG3_PHY_ID_MASK) == TG3_PHY_ID_BCM5411) {
1202 if (speed != SPEED_10)
1204 } else if (speed == SPEED_10)
1212 static void tg3_ump_link_report(struct tg3 *tp)
1213 { DBGP("%s\n", __func__);
1218 if (!tg3_flag(tp, 5780_CLASS) || !tg3_flag(tp, ENABLE_ASF))
1221 tg3_wait_for_event_ack(tp);
1223 tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, FWCMD_NICDRV_LINK_UPDATE);
1225 tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 14);
1228 if (!tg3_readphy(tp, MII_BMCR, ®))
1230 if (!tg3_readphy(tp, MII_BMSR, ®))
1231 val |= (reg & 0xffff);
1232 tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX, val);
1235 if (!tg3_readphy(tp, MII_ADVERTISE, ®))
1237 if (!tg3_readphy(tp, MII_LPA, ®))
1238 val |= (reg & 0xffff);
1239 tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 4, val);
1242 if (!(tp->phy_flags & TG3_PHYFLG_MII_SERDES)) {
1243 if (!tg3_readphy(tp, MII_CTRL1000, ®))
1245 if (!tg3_readphy(tp, MII_STAT1000, ®))
1246 val |= (reg & 0xffff);
1248 tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 8, val);
1250 if (!tg3_readphy(tp, MII_PHYADDR, ®))
1254 tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 12, val);
1256 tg3_generate_fw_event(tp);
1259 /* NOTE: Debugging only code */
1260 static void tg3_link_report(struct tg3 *tp)
1261 { DBGP("%s\n", __func__);
1263 if (!netdev_link_ok(tp->dev)) {
1264 DBGC(tp->dev, "Link is down\n");
1265 tg3_ump_link_report(tp);
1267 DBGC(tp->dev, "Link is up at %d Mbps, %s duplex\n",
1268 (tp->link_config.active_speed == SPEED_1000 ?
1270 (tp->link_config.active_speed == SPEED_100 ?
1272 (tp->link_config.active_duplex == DUPLEX_FULL ?
1275 DBGC(tp->dev, "Flow control is %s for TX and %s for RX\n",
1276 (tp->link_config.active_flowctrl & FLOW_CTRL_TX) ?
1278 (tp->link_config.active_flowctrl & FLOW_CTRL_RX) ?
1281 if (tp->phy_flags & TG3_PHYFLG_EEE_CAP)
1282 DBGC(tp->dev, "EEE is %s\n",
1283 tp->setlpicnt ? "enabled" : "disabled");
1285 tg3_ump_link_report(tp);
1290 static int tg3_setup_copper_phy(struct tg3 *tp, int force_reset)
1291 { DBGP("%s\n", __func__);
1293 int current_link_up;
1295 u32 lcl_adv, rmt_adv;
1303 (MAC_STATUS_SYNC_CHANGED |
1304 MAC_STATUS_CFG_CHANGED |
1305 MAC_STATUS_MI_COMPLETION |
1306 MAC_STATUS_LNKSTATE_CHANGED));
1309 if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
1311 (tp->mi_mode & ~MAC_MI_MODE_AUTO_POLL));
1315 tg3_phy_auxctl_write(tp, MII_TG3_AUXCTL_SHDWSEL_PWRCTL, 0);
1317 /* Some third-party PHYs need to be reset on link going
1320 if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
1321 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 ||
1322 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) &&
1323 netdev_link_ok(tp->dev)) {
1324 tg3_readphy(tp, MII_BMSR, &bmsr);
1325 if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
1326 !(bmsr & BMSR_LSTATUS))
1332 if ((tp->phy_id & TG3_PHY_ID_MASK) == TG3_PHY_ID_BCM5401) {
1333 tg3_readphy(tp, MII_BMSR, &bmsr);
1334 if (tg3_readphy(tp, MII_BMSR, &bmsr) ||
1335 !tg3_flag(tp, INIT_COMPLETE))
1338 if (!(bmsr & BMSR_LSTATUS)) {
1339 err = tg3_init_5401phy_dsp(tp);
1343 tg3_readphy(tp, MII_BMSR, &bmsr);
1344 for (i = 0; i < 1000; i++) {
1346 if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
1347 (bmsr & BMSR_LSTATUS)) {
1353 if ((tp->phy_id & TG3_PHY_ID_REV_MASK) ==
1354 TG3_PHY_REV_BCM5401_B0 &&
1355 !(bmsr & BMSR_LSTATUS) &&
1356 tp->link_config.active_speed == SPEED_1000) {
1357 err = tg3_phy_reset(tp);
1359 err = tg3_init_5401phy_dsp(tp);
1364 } else if (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0 ||
1365 tp->pci_chip_rev_id == CHIPREV_ID_5701_B0) {
1366 /* 5701 {A0,B0} CRC bug workaround */
1367 tg3_writephy(tp, 0x15, 0x0a75);
1368 tg3_writephy(tp, MII_TG3_MISC_SHDW, 0x8c68);
1369 tg3_writephy(tp, MII_TG3_MISC_SHDW, 0x8d68);
1370 tg3_writephy(tp, MII_TG3_MISC_SHDW, 0x8c68);
1373 /* Clear pending interrupts... */
1374 tg3_readphy(tp, MII_TG3_ISTAT, &val);
1375 tg3_readphy(tp, MII_TG3_ISTAT, &val);
1377 if (tp->phy_flags & TG3_PHYFLG_USE_MI_INTERRUPT)
1378 tg3_writephy(tp, MII_TG3_IMASK, ~MII_TG3_INT_LINKCHG);
1379 else if (!(tp->phy_flags & TG3_PHYFLG_IS_FET))
1380 tg3_writephy(tp, MII_TG3_IMASK, ~0);
1382 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
1383 GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) {
1384 if (tp->led_ctrl == LED_CTRL_MODE_PHY_1)
1385 tg3_writephy(tp, MII_TG3_EXT_CTRL,
1386 MII_TG3_EXT_CTRL_LNK3_LED_MODE);
1388 tg3_writephy(tp, MII_TG3_EXT_CTRL, 0);
1391 current_link_up = 0;
1392 current_speed = SPEED_INVALID;
1393 current_duplex = DUPLEX_INVALID;
1395 if (tp->phy_flags & TG3_PHYFLG_CAPACITIVE_COUPLING) {
1396 err = tg3_phy_auxctl_read(tp,
1397 MII_TG3_AUXCTL_SHDWSEL_MISCTEST,
1399 if (!err && !(val & (1 << 10))) {
1400 tg3_phy_auxctl_write(tp,
1401 MII_TG3_AUXCTL_SHDWSEL_MISCTEST,
1408 for (i = 0; i < 100; i++) {
1409 tg3_readphy(tp, MII_BMSR, &bmsr);
1410 if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
1411 (bmsr & BMSR_LSTATUS))
1416 if (bmsr & BMSR_LSTATUS) {
1419 tg3_readphy(tp, MII_TG3_AUX_STAT, &aux_stat);
1420 for (i = 0; i < 2000; i++) {
1422 if (!tg3_readphy(tp, MII_TG3_AUX_STAT, &aux_stat) &&
1427 tg3_aux_stat_to_speed_duplex(tp, aux_stat,
1432 for (i = 0; i < 200; i++) {
1433 tg3_readphy(tp, MII_BMCR, &bmcr);
1434 if (tg3_readphy(tp, MII_BMCR, &bmcr))
1436 if (bmcr && bmcr != 0x7fff)
1444 tp->link_config.active_speed = current_speed;
1445 tp->link_config.active_duplex = current_duplex;
1447 if ((bmcr & BMCR_ANENABLE) &&
1448 tg3_copper_is_advertising_all(tp,
1449 tp->link_config.advertising)) {
1450 if (tg3_adv_1000T_flowctrl_ok(tp, &lcl_adv,
1452 current_link_up = 1;
1456 if (current_link_up == 1 &&
1457 tp->link_config.active_duplex == DUPLEX_FULL)
1458 tg3_setup_flow_control(tp, lcl_adv, rmt_adv);
1462 if (current_link_up == 0) {
1463 tg3_phy_copper_begin(tp);
1465 tg3_readphy(tp, MII_BMSR, &bmsr);
1466 if ((!tg3_readphy(tp, MII_BMSR, &bmsr) && (bmsr & BMSR_LSTATUS)) ||
1467 (tp->mac_mode & MAC_MODE_PORT_INT_LPBACK))
1468 current_link_up = 1;
1471 tp->mac_mode &= ~MAC_MODE_PORT_MODE_MASK;
1472 if (current_link_up == 1) {
1473 if (tp->link_config.active_speed == SPEED_100 ||
1474 tp->link_config.active_speed == SPEED_10)
1475 tp->mac_mode |= MAC_MODE_PORT_MODE_MII;
1477 tp->mac_mode |= MAC_MODE_PORT_MODE_GMII;
1478 } else if (tp->phy_flags & TG3_PHYFLG_IS_FET)
1479 tp->mac_mode |= MAC_MODE_PORT_MODE_MII;
1481 tp->mac_mode |= MAC_MODE_PORT_MODE_GMII;
1483 tp->mac_mode &= ~MAC_MODE_HALF_DUPLEX;
1484 if (tp->link_config.active_duplex == DUPLEX_HALF)
1485 tp->mac_mode |= MAC_MODE_HALF_DUPLEX;
1487 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700) {
1488 if (current_link_up == 1 &&
1489 tg3_5700_link_polarity(tp, tp->link_config.active_speed))
1490 tp->mac_mode |= MAC_MODE_LINK_POLARITY;
1492 tp->mac_mode &= ~MAC_MODE_LINK_POLARITY;
1495 /* ??? Without this setting Netgear GA302T PHY does not
1496 * ??? send/receive packets...
1498 if ((tp->phy_id & TG3_PHY_ID_MASK) == TG3_PHY_ID_BCM5411 &&
1499 tp->pci_chip_rev_id == CHIPREV_ID_5700_ALTIMA) {
1500 tp->mi_mode |= MAC_MI_MODE_AUTO_POLL;
1501 tw32_f(MAC_MI_MODE, tp->mi_mode);
1505 tw32_f(MAC_MODE, tp->mac_mode);
1508 /* Enabled attention when the link has changed state. */
1509 tw32_f(MAC_EVENT, MAC_EVENT_LNKSTATE_CHANGED);
1512 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 &&
1513 current_link_up == 1 &&
1514 tp->link_config.active_speed == SPEED_1000 &&
1515 (tg3_flag(tp, PCIX_MODE) || tg3_flag(tp, PCI_HIGH_SPEED))) {
1517 /* NOTE: this freezes for mdc? */
1519 (MAC_STATUS_SYNC_CHANGED |
1520 MAC_STATUS_CFG_CHANGED));
1523 NIC_SRAM_FIRMWARE_MBOX,
1524 NIC_SRAM_FIRMWARE_MBOX_MAGIC2);
1527 /* Prevent send BD corruption. */
1528 if (tg3_flag(tp, CLKREQ_BUG)) {
1529 u16 oldlnkctl, newlnkctl;
1531 pci_read_config_word(tp->pdev,
1532 tp->pcie_cap + PCI_EXP_LNKCTL,
1534 if (tp->link_config.active_speed == SPEED_100 ||
1535 tp->link_config.active_speed == SPEED_10)
1536 newlnkctl = oldlnkctl & ~PCI_EXP_LNKCTL_CLKREQ_EN;
1538 newlnkctl = oldlnkctl | PCI_EXP_LNKCTL_CLKREQ_EN;
1539 if (newlnkctl != oldlnkctl)
1540 pci_write_config_word(tp->pdev,
1541 tp->pcie_cap + PCI_EXP_LNKCTL,
1545 if (current_link_up != netdev_link_ok(tp->dev)) {
1546 if (current_link_up)
1547 netdev_link_up(tp->dev);
1549 netdev_link_down(tp->dev);
1550 tg3_link_report(tp);
1556 int tg3_setup_phy(struct tg3 *tp, int force_reset)
1557 { DBGP("%s\n", __func__);
1563 if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES)
1564 err = tg3_setup_fiber_phy(tp, force_reset);
1565 else if (tp->phy_flags & TG3_PHYFLG_MII_SERDES)
1566 err = tg3_setup_fiber_mii_phy(tp, force_reset);
1569 /* FIXME: add only copper phy variants for now */
1570 err = tg3_setup_copper_phy(tp, force_reset);
1572 val = (2 << TX_LENGTHS_IPG_CRS_SHIFT) |
1573 (6 << TX_LENGTHS_IPG_SHIFT);
1574 if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5720)
1575 val |= tr32(MAC_TX_LENGTHS) &
1576 (TX_LENGTHS_JMB_FRM_LEN_MSK |
1577 TX_LENGTHS_CNT_DWN_VAL_MSK);
1579 if (tp->link_config.active_speed == SPEED_1000 &&
1580 tp->link_config.active_duplex == DUPLEX_HALF)
1581 tw32(MAC_TX_LENGTHS, val |
1582 (0xff << TX_LENGTHS_SLOT_TIME_SHIFT));
1584 tw32(MAC_TX_LENGTHS, val |
1585 (32 << TX_LENGTHS_SLOT_TIME_SHIFT));
1587 if (!tg3_flag(tp, 5705_PLUS)) {
1588 if (netdev_link_ok(tp->dev)) {
1589 tw32(HOSTCC_STAT_COAL_TICKS, DEFAULT_STAT_COAL_TICKS);
1591 tw32(HOSTCC_STAT_COAL_TICKS, 0);
1595 val = tr32(PCIE_PWR_MGMT_THRESH);
1596 if (!netdev_link_ok(tp->dev))
1597 val = (val & ~PCIE_PWR_MGMT_L1_THRESH_MSK);
1599 val |= PCIE_PWR_MGMT_L1_THRESH_MSK;
1600 tw32(PCIE_PWR_MGMT_THRESH, val);