Commit 19c0ef6b authored by Ken Kawasaki's avatar Ken Kawasaki Committed by David S. Miller

axnet_cs: fix resume problem for some Ax88790 chip

axnet_cs:
    Some Ax88790 chip need to reinitialize the CISREG_CCSR register
    after resume.
Signed-off-by: default avatarKen Kawasaki <ken_kawasaki@spring.nifty.jp>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 2de79570
...@@ -118,6 +118,7 @@ typedef struct axnet_dev_t { ...@@ -118,6 +118,7 @@ typedef struct axnet_dev_t {
u_char duplex_flag; u_char duplex_flag;
int phy_id; int phy_id;
int flags; int flags;
int active_low;
} axnet_dev_t; } axnet_dev_t;
static inline axnet_dev_t *PRIV(struct net_device *dev) static inline axnet_dev_t *PRIV(struct net_device *dev)
...@@ -322,6 +323,8 @@ static int axnet_config(struct pcmcia_device *link) ...@@ -322,6 +323,8 @@ static int axnet_config(struct pcmcia_device *link)
if (info->flags & IS_AX88790) if (info->flags & IS_AX88790)
outb(0x10, dev->base_addr + AXNET_GPIO); /* select Internal PHY */ outb(0x10, dev->base_addr + AXNET_GPIO); /* select Internal PHY */
info->active_low = 0;
for (i = 0; i < 32; i++) { for (i = 0; i < 32; i++) {
j = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 1); j = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 1);
j2 = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 2); j2 = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 2);
...@@ -329,15 +332,18 @@ static int axnet_config(struct pcmcia_device *link) ...@@ -329,15 +332,18 @@ static int axnet_config(struct pcmcia_device *link)
if ((j != 0) && (j != 0xffff)) break; if ((j != 0) && (j != 0xffff)) break;
} }
if (i == 32) {
/* Maybe PHY is in power down mode. (PPD_SET = 1) /* Maybe PHY is in power down mode. (PPD_SET = 1)
Bit 2 of CCSR is active low. */ Bit 2 of CCSR is active low. */
if (i == 32) {
pcmcia_write_config_byte(link, CISREG_CCSR, 0x04); pcmcia_write_config_byte(link, CISREG_CCSR, 0x04);
for (i = 0; i < 32; i++) { for (i = 0; i < 32; i++) {
j = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 1); j = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 1);
j2 = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 2); j2 = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 2);
if (j == j2) continue; if (j == j2) continue;
if ((j != 0) && (j != 0xffff)) break; if ((j != 0) && (j != 0xffff)) {
info->active_low = 1;
break;
}
} }
} }
...@@ -383,8 +389,12 @@ static int axnet_suspend(struct pcmcia_device *link) ...@@ -383,8 +389,12 @@ static int axnet_suspend(struct pcmcia_device *link)
static int axnet_resume(struct pcmcia_device *link) static int axnet_resume(struct pcmcia_device *link)
{ {
struct net_device *dev = link->priv; struct net_device *dev = link->priv;
axnet_dev_t *info = PRIV(dev);
if (link->open) { if (link->open) {
if (info->active_low == 1)
pcmcia_write_config_byte(link, CISREG_CCSR, 0x04);
axnet_reset_8390(dev); axnet_reset_8390(dev);
AX88190_init(dev, 1); AX88190_init(dev, 1);
netif_device_attach(dev); netif_device_attach(dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment