Persistent tg3_stop_block timed out, ofs=* enable_bit=2

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



With a tigon3 5701, 2.4.21 kernel, we are getting persistent
tg3_stop_block timed out, ofs=* enable_bit=2 messages, with ofs=3400,
2400, 1400, c00.  drivers/net/tg3.c:

/* To stop a block, clear the enable bit and poll till it
 * clears.  tp->lock is held.
 */
static int tg3_stop_block(struct tg3 *tp, unsigned long ofs, u32 enable_bit)
{
	unsigned int i;
	u32 val;

	val = tr32(ofs);
	val &= ~enable_bit;
	tw32(ofs, val);
	tr32(ofs);		<=== why?

	for (i = 0; i < MAX_WAIT_CNT; i++) {
		udelay(100);
		val = tr32(ofs);
		if ((val & enable_bit) == 0)
			break;
	}

	if (i == MAX_WAIT_CNT) {
		printk(KERN_ERR PFX "tg3_stop_block timed out, "
		       "ofs=%lx enable_bit=%x\n",
		       ofs, enable_bit);
		return -ENODEV;
	}

	return 0;
}

Why does the code read tr32(ofs) twice and only test after the second
read?  Is there any possibility of a race here?

tw32(ofs, val); /* clear bit1 */
tr32(ofs); /* bit1 reads 0 */
for (i = 0; i < MAX_WAIT_CNT; i++) {
	udelay(100);
	val = tr32(ofs);	/* bit1 reset to 1 */

IOW, bit1 went 1 -> 0 -> 1 but because we only test the second and
subsequent read, it appears that bit1 is locked on.

-
: send the line "unsubscribe linux-net" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux 802.1Q VLAN]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Git]     [Bugtraq]     [Yosemite News and Information]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux PCI]     [Linux Admin]     [Samba]

  Powered by Linux