On Monday, November 7, 2016, Cao jin <caoj.fnst@xxxxxxxxxxxxxx
<mailto:caoj.fnst@xxxxxxxxxxxxxx>> wrote:
We removed head because it isn't really accessed very often, it is only
really used for when the ring is configured. Tail is accessed every
time we add a descriptor to a ring. The pointer chasing from ring to
netdev to adapter to hw is expensive. That is one of the rasons why
we cache the pointer to the tail register.
Signed-off-by: Cao jin <caoj.fnst@xxxxxxxxxxxxxx>
---
drivers/net/ethernet/intel/igb/igb.h | 1 -
drivers/net/ethernet/intel/igb/igb_main.c | 16
+++++++++-------
hw->hw_addr could be alterred to NULL(in igb_rd32), this is why
writel oops the kernel, you give a fine solution.
But from the oops message, we can find, register reading returns all
F's, I also have a question want to consult: when igb device is
reset, would reading register(no matter config space or non-PCIe
configuration registers) during reset returns all F's? (I guess this
is the core of my issue)
An all F's value means the read failed. The device is likely off of the
bus and the hw_addr may not have been repopulated after the reset.
You might want to check the mailing list as I thought someone had
submitted a patch recently for one of the drivers to repopulate hw_addr
after a reset.