mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-13 01:08:50 +00:00
via-rhine: fix wait-bit inversion.
Bug appeared in a384a33bb1c9ec2d99db2046b41f57023fa7d77b ("via-rhine: RHINE_WAIT_FOR macro removal). It can be noticed during suspend/resume. Signed-off-by: Andreas Mohr <andi@lisas.de> Acked-by: Francois Romieu <romieu@fr.zoreil.com> Cc: David Lv <DavidLv@viatech.com.cn> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
72331bc0cd
commit
3f8c91a739
@ -503,30 +503,32 @@ static int rhine_vlan_rx_add_vid(struct net_device *dev, unsigned short vid);
|
|||||||
static int rhine_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid);
|
static int rhine_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid);
|
||||||
static void rhine_restart_tx(struct net_device *dev);
|
static void rhine_restart_tx(struct net_device *dev);
|
||||||
|
|
||||||
static void rhine_wait_bit(struct rhine_private *rp, u8 reg, u8 mask, bool high)
|
static void rhine_wait_bit(struct rhine_private *rp, u8 reg, u8 mask, bool low)
|
||||||
{
|
{
|
||||||
void __iomem *ioaddr = rp->base;
|
void __iomem *ioaddr = rp->base;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < 1024; i++) {
|
for (i = 0; i < 1024; i++) {
|
||||||
if (high ^ !!(ioread8(ioaddr + reg) & mask))
|
bool has_mask_bits = !!(ioread8(ioaddr + reg) & mask);
|
||||||
|
|
||||||
|
if (low ^ has_mask_bits)
|
||||||
break;
|
break;
|
||||||
udelay(10);
|
udelay(10);
|
||||||
}
|
}
|
||||||
if (i > 64) {
|
if (i > 64) {
|
||||||
netif_dbg(rp, hw, rp->dev, "%s bit wait (%02x/%02x) cycle "
|
netif_dbg(rp, hw, rp->dev, "%s bit wait (%02x/%02x) cycle "
|
||||||
"count: %04d\n", high ? "high" : "low", reg, mask, i);
|
"count: %04d\n", low ? "low" : "high", reg, mask, i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rhine_wait_bit_high(struct rhine_private *rp, u8 reg, u8 mask)
|
static void rhine_wait_bit_high(struct rhine_private *rp, u8 reg, u8 mask)
|
||||||
{
|
{
|
||||||
rhine_wait_bit(rp, reg, mask, true);
|
rhine_wait_bit(rp, reg, mask, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rhine_wait_bit_low(struct rhine_private *rp, u8 reg, u8 mask)
|
static void rhine_wait_bit_low(struct rhine_private *rp, u8 reg, u8 mask)
|
||||||
{
|
{
|
||||||
rhine_wait_bit(rp, reg, mask, false);
|
rhine_wait_bit(rp, reg, mask, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u32 rhine_get_events(struct rhine_private *rp)
|
static u32 rhine_get_events(struct rhine_private *rp)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user