diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/pci/if_sis.c | 14 | ||||
-rw-r--r-- | sys/dev/pci/if_sisreg.h | 7 |
2 files changed, 15 insertions, 6 deletions
diff --git a/sys/dev/pci/if_sis.c b/sys/dev/pci/if_sis.c index 5a0c12e71d1..b4e54cbcdbf 100644 --- a/sys/dev/pci/if_sis.c +++ b/sys/dev/pci/if_sis.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_sis.c,v 1.86 2008/12/04 23:05:32 oga Exp $ */ +/* $OpenBSD: if_sis.c,v 1.87 2009/02/24 21:10:14 claudio Exp $ */ /* * Copyright (c) 1997, 1998, 1999 * Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved. @@ -1307,9 +1307,13 @@ sis_rxeof(struct sis_softc *sc) * If an error occurs, update stats, clear the * status word and leave the mbuf cluster in place: * it should simply get re-used next time this descriptor - * comes up in the ring. + * comes up in the ring. However, don't report long + * frames as errors since they could be VLANs. */ - if (!(rxstat & SIS_CMDSTS_PKT_OK)) { + if (rxstat & SIS_RXSTAT_GIANT && + total_len <= (ETHER_MAX_DIX_LEN - ETHER_CRC_LEN)) + rxstat &= ~SIS_RXSTAT_GIANT; + if (SIS_RXSTAT_ERROR(rxstat)) { ifp->if_ierrors++; if (rxstat & SIS_RXSTAT_COLL) ifp->if_collisions++; @@ -1493,10 +1497,10 @@ sis_intr(void *arg) if (status & (SIS_ISR_RX_DESC_OK | SIS_ISR_RX_OK | - SIS_ISR_RX_IDLE)) + SIS_ISR_RX_ERR | SIS_ISR_RX_IDLE)) sis_rxeof(sc); - if (status & (SIS_ISR_RX_ERR | SIS_ISR_RX_OFLOW)) + if (status & SIS_ISR_RX_OFLOW) sis_rxeoc(sc); #if 0 diff --git a/sys/dev/pci/if_sisreg.h b/sys/dev/pci/if_sisreg.h index 771c52309c6..1770a1576ec 100644 --- a/sys/dev/pci/if_sisreg.h +++ b/sys/dev/pci/if_sisreg.h @@ -1,4 +1,4 @@ -/* $OpenBSD: if_sisreg.h,v 1.27 2007/05/28 17:51:26 ckuethe Exp $ */ +/* $OpenBSD: if_sisreg.h,v 1.28 2009/02/24 21:10:14 claudio Exp $ */ /* * Copyright (c) 1997, 1998, 1999 * Bill Paul <wpaul@ee.columbia.edu>. All rights reserved. @@ -356,6 +356,11 @@ struct sis_desc { #define SIS_RXSTAT_OVERRUN 0x02000000 #define SIS_RXSTAT_RX_ABORT 0x04000000 +#define SIS_RXSTAT_ERROR(x) \ + ((x) & (SIS_RXSTAT_RX_ABORT | SIS_RXSTAT_OVERRUN | \ + SIS_RXSTAT_GIANT | SIS_RXSTAT_SYMBOLERR | SIS_RXSTAT_RUNT | \ + SIS_RXSTAT_CRCERR | SIS_RXSTAT_ALIGNERR)) + #define SIS_DSTCLASS_REJECT 0x00000000 #define SIS_DSTCLASS_UNICAST 0x00800000 #define SIS_DSTCLASS_MULTICAST 0x01000000 |