diff options
author | glebius <glebius@FreeBSD.org> | 2005-12-22 09:09:39 +0000 |
---|---|---|
committer | glebius <glebius@FreeBSD.org> | 2005-12-22 09:09:39 +0000 |
commit | 546c2347deff7757b4ad366b80d9943ac1418adc (patch) | |
tree | 4c3f953a4432327450a667df1091611e1f527a17 | |
parent | 2543d7c4ba35f83357c8c61840da2e03d16b15d8 (diff) | |
download | FreeBSD-src-546c2347deff7757b4ad366b80d9943ac1418adc.zip FreeBSD-src-546c2347deff7757b4ad366b80d9943ac1418adc.tar.gz |
Add a quirk to fix resume on some laptops.
Reported by: joe
Reported by: Huang wen hui <huang gddsn.org.cn>
Reported by: Jacques Garrigue <garrigue math.nagoya-u.ac.jp>
PR: kern/89825
-rw-r--r-- | sys/dev/em/if_em.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/sys/dev/em/if_em.c b/sys/dev/em/if_em.c index 8f8f465..081a243 100644 --- a/sys/dev/em/if_em.c +++ b/sys/dev/em/if_em.c @@ -1048,6 +1048,15 @@ em_intr(void *arg) else if (reg_icr == 0) break; + /* + * XXX: some laptops trigger several spurious interrupts + * on em(4) when in the resume cycle. The ICR register + * reports all-ones value in this case. Processing such + * interrupts would lead to a freeze. I don't know why. + */ + if (reg_icr == 0xffffffff) + break; + if (ifp->if_drv_flags & IFF_DRV_RUNNING) { em_process_receive_interrupts(adapter, -1); em_clean_transmit_interrupts(adapter); |