diff options
| -rw-r--r-- | drivers/net/tg3.c | 85 | ||||
| -rw-r--r-- | drivers/net/tg3.h | 2 |
2 files changed, 77 insertions, 10 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index bf376b32450e..3ba6c52fed4e 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
| @@ -1656,12 +1656,76 @@ static int tg3_set_power_state(struct tg3 *tp, pci_power_t state) | |||
| 1656 | return 0; | 1656 | return 0; |
| 1657 | } | 1657 | } |
| 1658 | 1658 | ||
| 1659 | /* tp->lock is held. */ | ||
| 1660 | static void tg3_wait_for_event_ack(struct tg3 *tp) | ||
| 1661 | { | ||
| 1662 | int i; | ||
| 1663 | |||
| 1664 | /* Wait for up to 2.5 milliseconds */ | ||
| 1665 | for (i = 0; i < 250000; i++) { | ||
| 1666 | if (!(tr32(GRC_RX_CPU_EVENT) & GRC_RX_CPU_DRIVER_EVENT)) | ||
| 1667 | break; | ||
| 1668 | udelay(10); | ||
| 1669 | } | ||
| 1670 | } | ||
| 1671 | |||
| 1672 | /* tp->lock is held. */ | ||
| 1673 | static void tg3_ump_link_report(struct tg3 *tp) | ||
| 1674 | { | ||
| 1675 | u32 reg; | ||
| 1676 | u32 val; | ||
| 1677 | |||
| 1678 | if (!(tp->tg3_flags2 & TG3_FLG2_5780_CLASS) || | ||
| 1679 | !(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) | ||
| 1680 | return; | ||
| 1681 | |||
| 1682 | tg3_wait_for_event_ack(tp); | ||
| 1683 | |||
| 1684 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, FWCMD_NICDRV_LINK_UPDATE); | ||
| 1685 | |||
| 1686 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 14); | ||
| 1687 | |||
| 1688 | val = 0; | ||
| 1689 | if (!tg3_readphy(tp, MII_BMCR, ®)) | ||
| 1690 | val = reg << 16; | ||
| 1691 | if (!tg3_readphy(tp, MII_BMSR, ®)) | ||
| 1692 | val |= (reg & 0xffff); | ||
| 1693 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX, val); | ||
| 1694 | |||
| 1695 | val = 0; | ||
| 1696 | if (!tg3_readphy(tp, MII_ADVERTISE, ®)) | ||
| 1697 | val = reg << 16; | ||
| 1698 | if (!tg3_readphy(tp, MII_LPA, ®)) | ||
| 1699 | val |= (reg & 0xffff); | ||
| 1700 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 4, val); | ||
| 1701 | |||
| 1702 | val = 0; | ||
| 1703 | if (!(tp->tg3_flags2 & TG3_FLG2_MII_SERDES)) { | ||
| 1704 | if (!tg3_readphy(tp, MII_CTRL1000, ®)) | ||
| 1705 | val = reg << 16; | ||
| 1706 | if (!tg3_readphy(tp, MII_STAT1000, ®)) | ||
| 1707 | val |= (reg & 0xffff); | ||
| 1708 | } | ||
| 1709 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 8, val); | ||
| 1710 | |||
| 1711 | if (!tg3_readphy(tp, MII_PHYADDR, ®)) | ||
| 1712 | val = reg << 16; | ||
| 1713 | else | ||
| 1714 | val = 0; | ||
| 1715 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 12, val); | ||
| 1716 | |||
| 1717 | val = tr32(GRC_RX_CPU_EVENT); | ||
| 1718 | val |= GRC_RX_CPU_DRIVER_EVENT; | ||
| 1719 | tw32_f(GRC_RX_CPU_EVENT, val); | ||
| 1720 | } | ||
| 1721 | |||
| 1659 | static void tg3_link_report(struct tg3 *tp) | 1722 | static void tg3_link_report(struct tg3 *tp) |
| 1660 | { | 1723 | { |
| 1661 | if (!netif_carrier_ok(tp->dev)) { | 1724 | if (!netif_carrier_ok(tp->dev)) { |
| 1662 | if (netif_msg_link(tp)) | 1725 | if (netif_msg_link(tp)) |
| 1663 | printk(KERN_INFO PFX "%s: Link is down.\n", | 1726 | printk(KERN_INFO PFX "%s: Link is down.\n", |
| 1664 | tp->dev->name); | 1727 | tp->dev->name); |
| 1728 | tg3_ump_link_report(tp); | ||
| 1665 | } else if (netif_msg_link(tp)) { | 1729 | } else if (netif_msg_link(tp)) { |
| 1666 | printk(KERN_INFO PFX "%s: Link is up at %d Mbps, %s duplex.\n", | 1730 | printk(KERN_INFO PFX "%s: Link is up at %d Mbps, %s duplex.\n", |
| 1667 | tp->dev->name, | 1731 | tp->dev->name, |
| @@ -1679,6 +1743,7 @@ static void tg3_link_report(struct tg3 *tp) | |||
| 1679 | "on" : "off", | 1743 | "on" : "off", |
| 1680 | (tp->link_config.active_flowctrl & TG3_FLOW_CTRL_RX) ? | 1744 | (tp->link_config.active_flowctrl & TG3_FLOW_CTRL_RX) ? |
| 1681 | "on" : "off"); | 1745 | "on" : "off"); |
| 1746 | tg3_ump_link_report(tp); | ||
| 1682 | } | 1747 | } |
| 1683 | } | 1748 | } |
| 1684 | 1749 | ||
| @@ -5500,19 +5565,17 @@ static void tg3_stop_fw(struct tg3 *tp) | |||
| 5500 | if ((tp->tg3_flags & TG3_FLAG_ENABLE_ASF) && | 5565 | if ((tp->tg3_flags & TG3_FLAG_ENABLE_ASF) && |
| 5501 | !(tp->tg3_flags3 & TG3_FLG3_ENABLE_APE)) { | 5566 | !(tp->tg3_flags3 & TG3_FLG3_ENABLE_APE)) { |
| 5502 | u32 val; | 5567 | u32 val; |
| 5503 | int i; | 5568 | |
| 5569 | /* Wait for RX cpu to ACK the previous event. */ | ||
| 5570 | tg3_wait_for_event_ack(tp); | ||
| 5504 | 5571 | ||
| 5505 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, FWCMD_NICDRV_PAUSE_FW); | 5572 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, FWCMD_NICDRV_PAUSE_FW); |
| 5506 | val = tr32(GRC_RX_CPU_EVENT); | 5573 | val = tr32(GRC_RX_CPU_EVENT); |
| 5507 | val |= (1 << 14); | 5574 | val |= GRC_RX_CPU_DRIVER_EVENT; |
| 5508 | tw32(GRC_RX_CPU_EVENT, val); | 5575 | tw32(GRC_RX_CPU_EVENT, val); |
| 5509 | 5576 | ||
| 5510 | /* Wait for RX cpu to ACK the event. */ | 5577 | /* Wait for RX cpu to ACK this event. */ |
| 5511 | for (i = 0; i < 100; i++) { | 5578 | tg3_wait_for_event_ack(tp); |
| 5512 | if (!(tr32(GRC_RX_CPU_EVENT) & (1 << 14))) | ||
| 5513 | break; | ||
| 5514 | udelay(1); | ||
| 5515 | } | ||
| 5516 | } | 5579 | } |
| 5517 | } | 5580 | } |
| 5518 | 5581 | ||
| @@ -7402,14 +7465,16 @@ static void tg3_timer(unsigned long __opaque) | |||
| 7402 | if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) { | 7465 | if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) { |
| 7403 | u32 val; | 7466 | u32 val; |
| 7404 | 7467 | ||
| 7468 | tg3_wait_for_event_ack(tp); | ||
| 7469 | |||
| 7405 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, | 7470 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, |
| 7406 | FWCMD_NICDRV_ALIVE3); | 7471 | FWCMD_NICDRV_ALIVE3); |
| 7407 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 4); | 7472 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 4); |
| 7408 | /* 5 seconds timeout */ | 7473 | /* 5 seconds timeout */ |
| 7409 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX, 5); | 7474 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX, 5); |
| 7410 | val = tr32(GRC_RX_CPU_EVENT); | 7475 | val = tr32(GRC_RX_CPU_EVENT); |
| 7411 | val |= (1 << 14); | 7476 | val |= GRC_RX_CPU_DRIVER_EVENT; |
| 7412 | tw32(GRC_RX_CPU_EVENT, val); | 7477 | tw32_f(GRC_RX_CPU_EVENT, val); |
| 7413 | } | 7478 | } |
| 7414 | tp->asf_counter = tp->asf_multiplier; | 7479 | tp->asf_counter = tp->asf_multiplier; |
| 7415 | } | 7480 | } |
diff --git a/drivers/net/tg3.h b/drivers/net/tg3.h index bf387ff9bc15..0404f93baa29 100644 --- a/drivers/net/tg3.h +++ b/drivers/net/tg3.h | |||
| @@ -1429,6 +1429,7 @@ | |||
| 1429 | #define GRC_LCLCTRL_AUTO_SEEPROM 0x01000000 | 1429 | #define GRC_LCLCTRL_AUTO_SEEPROM 0x01000000 |
| 1430 | #define GRC_TIMER 0x0000680c | 1430 | #define GRC_TIMER 0x0000680c |
| 1431 | #define GRC_RX_CPU_EVENT 0x00006810 | 1431 | #define GRC_RX_CPU_EVENT 0x00006810 |
| 1432 | #define GRC_RX_CPU_DRIVER_EVENT 0x00004000 | ||
| 1432 | #define GRC_RX_TIMER_REF 0x00006814 | 1433 | #define GRC_RX_TIMER_REF 0x00006814 |
| 1433 | #define GRC_RX_CPU_SEM 0x00006818 | 1434 | #define GRC_RX_CPU_SEM 0x00006818 |
| 1434 | #define GRC_REMOTE_RX_CPU_ATTN 0x0000681c | 1435 | #define GRC_REMOTE_RX_CPU_ATTN 0x0000681c |
| @@ -1676,6 +1677,7 @@ | |||
| 1676 | #define FWCMD_NICDRV_IPV6ADDR_CHG 0x00000004 | 1677 | #define FWCMD_NICDRV_IPV6ADDR_CHG 0x00000004 |
| 1677 | #define FWCMD_NICDRV_FIX_DMAR 0x00000005 | 1678 | #define FWCMD_NICDRV_FIX_DMAR 0x00000005 |
| 1678 | #define FWCMD_NICDRV_FIX_DMAW 0x00000006 | 1679 | #define FWCMD_NICDRV_FIX_DMAW 0x00000006 |
| 1680 | #define FWCMD_NICDRV_LINK_UPDATE 0x0000000c | ||
| 1679 | #define FWCMD_NICDRV_ALIVE2 0x0000000d | 1681 | #define FWCMD_NICDRV_ALIVE2 0x0000000d |
| 1680 | #define FWCMD_NICDRV_ALIVE3 0x0000000e | 1682 | #define FWCMD_NICDRV_ALIVE3 0x0000000e |
| 1681 | #define NIC_SRAM_FW_CMD_LEN_MBOX 0x00000b7c | 1683 | #define NIC_SRAM_FW_CMD_LEN_MBOX 0x00000b7c |
