From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hidetoshi Seto Date: Fri, 19 Feb 2010 06:41:08 +0000 Subject: Re: How does Linux handle PCI-E Surprise unplug? Message-Id: <4B7E3284.2070305@jp.fujitsu.com> List-Id: References: <8506939B503B404A84BBB12293FC45F606B883BA@emailbng3.jnpr.net> In-Reply-To: <8506939B503B404A84BBB12293FC45F606B883BA@emailbng3.jnpr.net> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: linux-hotplug@vger.kernel.org (2010/02/19 13:01), Rajat Jain wrote: > > It is fairly common for the drivers to have such code: > > Val1 = ioread32(reg1); > Val2 = ioread32(reg2); > Val3 = ioread32(reg3); > Val4 = ioread32(reg4); > > Do you mean the above code is wrong and it should be re-written as: > > If ((Val1 = ioread32(reg1)) = 0xFFFFFFFF) > /* Abort */ > If ((Val2 = ioread32(reg2)) = 0xFFFFFFFF) > /* Abort */ > Etc .... > > Checking for 0xFFFFFFFF at every read is a pain, don't you think so? ... Dejavu? http://marc.info/?l=linux-kernel&m8125011020312 [RFC] readX_check() - Interface for PCI-X error recovery Date: 2004-04-06 11:04:49 > And > more over, what is a register ACTUALLY contains the value 0xFFFFFFFF? > How do we differentiate this with the case when the device has been > plugged out? An example I know is: [arch/powerpc/include/asm/eeh.h] static inline u8 eeh_readb(const volatile void __iomem *addr) { u8 val = in_8(addr); if (EEH_POSSIBLE_ERROR(val, u8)) return eeh_check_failure(addr, val); return val; } > > Finally, how do we re-write the following code to handle this correctly? > > iowrite32(val1, reg1); > iowrite32(val2, reg2); > iowrite32(val3, reg3); > iowrite32(val4, reg4); One answer is as already posted by Greg, "read it." If you made a request by writing some data, I think you will wait a response from the device, with setting some reasonable timeout. Soon in some form you will get a message like "success", "retry" or "failed", or nothing if timeout. Then you can report it to userland and/or start next conversation with the device. Thanks, H.Seto