提交 2ffa007e 编写于 作者: F françois romieu 提交者: David S. Miller

via-velocity: fix the WOL bug on 1000M full duplex forced mode.

The VIA velocity card can't be waken up by WOL tool on 1000M full
duplex forced mode. This patch fixes the bug.
Signed-off-by: NDavid Lv <DavidLv@viatech.com.cn>
Acked-by: NFrancois Romieu <romieu@fr.zoreil.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 a2da570d
...@@ -2923,6 +2923,7 @@ static u16 wol_calc_crc(int size, u8 *pattern, u8 *mask_pattern) ...@@ -2923,6 +2923,7 @@ static u16 wol_calc_crc(int size, u8 *pattern, u8 *mask_pattern)
static int velocity_set_wol(struct velocity_info *vptr) static int velocity_set_wol(struct velocity_info *vptr)
{ {
struct mac_regs __iomem *regs = vptr->mac_regs; struct mac_regs __iomem *regs = vptr->mac_regs;
enum speed_opt spd_dpx = vptr->options.spd_dpx;
static u8 buf[256]; static u8 buf[256];
int i; int i;
...@@ -2968,6 +2969,12 @@ static int velocity_set_wol(struct velocity_info *vptr) ...@@ -2968,6 +2969,12 @@ static int velocity_set_wol(struct velocity_info *vptr)
writew(0x0FFF, &regs->WOLSRClr); writew(0x0FFF, &regs->WOLSRClr);
if (spd_dpx == SPD_DPX_1000_FULL)
goto mac_done;
if (spd_dpx != SPD_DPX_AUTO)
goto advertise_done;
if (vptr->mii_status & VELOCITY_AUTONEG_ENABLE) { if (vptr->mii_status & VELOCITY_AUTONEG_ENABLE) {
if (PHYID_GET_PHY_ID(vptr->phy_id) == PHYID_CICADA_CS8201) if (PHYID_GET_PHY_ID(vptr->phy_id) == PHYID_CICADA_CS8201)
MII_REG_BITS_ON(AUXCR_MDPPS, MII_NCONFIG, vptr->mac_regs); MII_REG_BITS_ON(AUXCR_MDPPS, MII_NCONFIG, vptr->mac_regs);
...@@ -2978,6 +2985,7 @@ static int velocity_set_wol(struct velocity_info *vptr) ...@@ -2978,6 +2985,7 @@ static int velocity_set_wol(struct velocity_info *vptr)
if (vptr->mii_status & VELOCITY_SPEED_1000) if (vptr->mii_status & VELOCITY_SPEED_1000)
MII_REG_BITS_ON(BMCR_ANRESTART, MII_BMCR, vptr->mac_regs); MII_REG_BITS_ON(BMCR_ANRESTART, MII_BMCR, vptr->mac_regs);
advertise_done:
BYTE_REG_BITS_ON(CHIPGCR_FCMODE, &regs->CHIPGCR); BYTE_REG_BITS_ON(CHIPGCR_FCMODE, &regs->CHIPGCR);
{ {
...@@ -2987,6 +2995,7 @@ static int velocity_set_wol(struct velocity_info *vptr) ...@@ -2987,6 +2995,7 @@ static int velocity_set_wol(struct velocity_info *vptr)
writeb(GCR, &regs->CHIPGCR); writeb(GCR, &regs->CHIPGCR);
} }
mac_done:
BYTE_REG_BITS_OFF(ISR_PWEI, &regs->ISR); BYTE_REG_BITS_OFF(ISR_PWEI, &regs->ISR);
/* Turn on SWPTAG just before entering power mode */ /* Turn on SWPTAG just before entering power mode */
BYTE_REG_BITS_ON(STICKHW_SWPTAG, &regs->STICKHW); BYTE_REG_BITS_ON(STICKHW_SWPTAG, &regs->STICKHW);
......
...@@ -361,7 +361,7 @@ enum velocity_owner { ...@@ -361,7 +361,7 @@ enum velocity_owner {
#define MAC_REG_CHIPGSR 0x9C #define MAC_REG_CHIPGSR 0x9C
#define MAC_REG_TESTCFG 0x9D #define MAC_REG_TESTCFG 0x9D
#define MAC_REG_DEBUG 0x9E #define MAC_REG_DEBUG 0x9E
#define MAC_REG_CHIPGCR 0x9F #define MAC_REG_CHIPGCR 0x9F /* Chip Operation and Diagnostic Control */
#define MAC_REG_WOLCR0_SET 0xA0 #define MAC_REG_WOLCR0_SET 0xA0
#define MAC_REG_WOLCR1_SET 0xA1 #define MAC_REG_WOLCR1_SET 0xA1
#define MAC_REG_PWCFG_SET 0xA2 #define MAC_REG_PWCFG_SET 0xA2
...@@ -848,10 +848,10 @@ enum velocity_owner { ...@@ -848,10 +848,10 @@ enum velocity_owner {
* Bits in CHIPGCR register * Bits in CHIPGCR register
*/ */
#define CHIPGCR_FCGMII 0x80 /* enable GMII mode */ #define CHIPGCR_FCGMII 0x80 /* force GMII (else MII only) */
#define CHIPGCR_FCFDX 0x40 #define CHIPGCR_FCFDX 0x40 /* force full duplex */
#define CHIPGCR_FCRESV 0x20 #define CHIPGCR_FCRESV 0x20
#define CHIPGCR_FCMODE 0x10 #define CHIPGCR_FCMODE 0x10 /* enable MAC forced mode */
#define CHIPGCR_LPSOPT 0x08 #define CHIPGCR_LPSOPT 0x08
#define CHIPGCR_TM1US 0x04 #define CHIPGCR_TM1US 0x04
#define CHIPGCR_TM0US 0x02 #define CHIPGCR_TM0US 0x02
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册