Hifn7751 based cards may stop working on certain motherboards due to
DMA errors.
Apply by doing:
cd /usr/src
patch -p0 < 018_hifn.patch
And then rebuild your kernel.
Index: sys/dev/pci/hifn7751.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/hifn7751.c,v
retrieving revision 1.57
diff -u -r1.57 hifn7751.c
--- sys/dev/pci/hifn7751.c 2001/04/06 16:27:46 1.57
+++ sys/dev/pci/hifn7751.c 2001/11/15 16:06:00
@@ -145,6 +145,9 @@
int rseg;
caddr_t kva;
+ sc->sc_pci_pc = pa->pa_pc;
+ sc->sc_pci_tag = pa->pa_tag;
+
cmd = pci_conf_read(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
cmd |= PCI_COMMAND_MEM_ENABLE | PCI_COMMAND_MASTER_ENABLE;
pci_conf_write(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, cmd);
@@ -172,6 +175,10 @@
goto fail_io0;
}
+ cmd = pci_conf_read(sc->sc_pci_pc, sc->sc_pci_tag, HIFN_RETRY_TIMEOUT);
+ cmd &= 0xffff0000;
+ pci_conf_write(sc->sc_pci_pc, sc->sc_pci_tag, HIFN_RETRY_TIMEOUT, cmd);
+
sc->sc_dmat = pa->pa_dmat;
if (bus_dmamem_alloc(sc->sc_dmat, sizeof(*sc->sc_dma), PAGE_SIZE, 0,
&seg, 1, &rseg, BUS_DMA_NOWAIT)) {
@@ -310,6 +317,8 @@
hifn_reset_board(sc)
struct hifn_softc *sc;
{
+ u_int32_t reg;
+
/*
* Set polling in the DMA configuration register to zero. 0x7 avoids
* resetting the board and zeros out the other fields.
@@ -344,6 +353,10 @@
* Wait another millisecond for the board to un-reset.
*/
DELAY(1000);
+
+ reg = pci_conf_read(sc->sc_pci_pc, sc->sc_pci_tag, HIFN_RETRY_TIMEOUT);
+ reg &= 0xffff0000;
+ pci_conf_write(sc->sc_pci_pc, sc->sc_pci_tag, HIFN_RETRY_TIMEOUT, reg);
}
u_int32_t
@@ -761,7 +774,12 @@
struct hifn_softc *sc;
{
struct hifn_dma *dma = sc->sc_dma;
+ u_int32_t reg;
int i;
+
+ reg = pci_conf_read(sc->sc_pci_pc, sc->sc_pci_tag, HIFN_RETRY_TIMEOUT);
+ reg &= 0xffff0000;
+ pci_conf_write(sc->sc_pci_pc, sc->sc_pci_tag, HIFN_RETRY_TIMEOUT, reg);
/* initialize static pointer values */
for (i = 0; i < HIFN_D_CMD_RSIZE; i++)
Index: sys/dev/pci/hifn7751reg.h
===================================================================
RCS file: /cvs/src/sys/dev/pci/hifn7751reg.h,v
retrieving revision 1.17
diff -u -r1.17 hifn7751reg.h
--- sys/dev/pci/hifn7751reg.h 2000/12/12 21:30:34 1.17
+++ sys/dev/pci/hifn7751reg.h 2001/11/15 16:06:01
@@ -35,7 +35,7 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __HIFN_H__
-#define __HIFN_H__
+#define __HIFN_H__
#include <machine/endian.h>
@@ -43,8 +43,10 @@
* Some PCI configuration space offset defines. The names were made
* identical to the names used by the Linux kernel.
*/
-#define HIFN_BAR0 (PCI_MAPREG_START + 0) /* PUC register map */
-#define HIFN_BAR1 (PCI_MAPREG_START + 4) /* DMA register map */
+#define HIFN_BAR0 (PCI_MAPREG_START + 0) /* PUC register map */
+#define HIFN_BAR1 (PCI_MAPREG_START + 4) /* DMA register map */
+#define HIFN_RETRY_TIMEOUT 0x40
+#define HIFN_TRDY_TIMEOUT 0x41
/*
* Some configurable values for the driver
@@ -138,6 +140,8 @@
int sc_maxses;
int sc_ramsize;
struct hifn_session sc_sessions[2048];
+ pci_chipset_tag_t sc_pci_pc;
+ pcitag_t sc_pci_tag;
};
/*