svn commit: r310081 - stable/10/sys/dev/firewire
Andriy Gapon
avg at FreeBSD.org
Wed Dec 14 17:17:09 UTC 2016
Author: avg
Date: Wed Dec 14 17:17:07 2016
New Revision: 310081
URL: https://svnweb.freebsd.org/changeset/base/310081
Log:
MFC r277511: Fix remote DMA based firewire debugging when targeting
systems with more than 4GB of physical memory.
Modified:
stable/10/sys/dev/firewire/fwohci.c
Directory Properties:
stable/10/ (props changed)
Modified: stable/10/sys/dev/firewire/fwohci.c
==============================================================================
--- stable/10/sys/dev/firewire/fwohci.c Wed Dec 14 16:44:38 2016 (r310080)
+++ stable/10/sys/dev/firewire/fwohci.c Wed Dec 14 17:17:07 2016 (r310081)
@@ -55,6 +55,7 @@
#include <sys/kdb.h>
#include <machine/bus.h>
+#include <machine/md_var.h>
#if defined(__DragonFly__) || __FreeBSD_version < 500000
#include <machine/clock.h> /* for DELAY() */
@@ -202,6 +203,7 @@ static void fwohci_task_dma(void *, int)
#define OHCI_PREQLO 0x118
#define OHCI_PREQLOCLR 0x11c
#define OHCI_PREQUPPER 0x120
+#define OHCI_PREQUPPER_MAX 0xffff0000
#define OHCI_SID_BUF 0x64
#define OHCI_SID_CNT 0x68
@@ -869,7 +871,7 @@ fwohci_execute_db2(void *arg, bus_dma_se
static void
fwohci_start(struct fwohci_softc *sc, struct fwohci_dbch *dbch)
{
- int i, s;
+ int i;
int tcode, hdr_len, pl_off;
int fsegment = -1;
uint32_t off;
@@ -895,7 +897,6 @@ fwohci_start(struct fwohci_softc *sc, st
if (dbch->flags & FWOHCI_DBCH_FULL)
return;
- s = splfw();
db_tr = dbch->top;
txloop:
xfer = STAILQ_FIRST(&dbch->xferq.q);
@@ -1045,7 +1046,6 @@ kick:
}
dbch->top = db_tr;
- splx(s);
return;
}
@@ -1841,6 +1841,7 @@ static void
fwohci_intr_core(struct fwohci_softc *sc, uint32_t stat, int count)
{
struct firewire_comm *fc = (struct firewire_comm *)sc;
+ uintmax_t prequpper;
uint32_t node_id, plen;
FW_GLOCK_ASSERT(fc);
@@ -1872,8 +1873,17 @@ fwohci_intr_core(struct fwohci_softc *sc
/* allow from all nodes */
OWRITE(sc, OHCI_PREQHI, 0x7fffffff);
OWRITE(sc, OHCI_PREQLO, 0xffffffff);
- /* 0 to 4GB region */
- OWRITE(sc, OHCI_PREQUPPER, 0x10000);
+ prequpper = ((uintmax_t)Maxmem << PAGE_SHIFT) >> 16;
+ if (prequpper > OHCI_PREQUPPER_MAX) {
+ device_printf(fc->dev,
+ "Physical memory size of 0x%jx exceeds "
+ "fire wire address space. Limiting dma "
+ "to memory below 0x%jx\n",
+ (uintmax_t)Maxmem << PAGE_SHIFT,
+ (uintmax_t)OHCI_PREQUPPER_MAX << 16);
+ prequpper = OHCI_PREQUPPER_MAX;
+ }
+ OWRITE(sc, OHCI_PREQUPPER, prequpper & 0xffffffff);
if (OREAD(sc, OHCI_PREQUPPER) !=
(prequpper & 0xffffffff)) {
device_printf(fc->dev,
@@ -2203,7 +2213,7 @@ fwohci_rbuf_update(struct fwohci_softc *
struct fw_bulkxfer *chunk;
struct fw_xferq *ir;
uint32_t stat;
- int s, w = 0, ldesc;
+ int w = 0, ldesc;
ir = fc->ir[dmach];
ldesc = sc->ir[dmach].ndesc - 1;
@@ -2211,7 +2221,6 @@ fwohci_rbuf_update(struct fwohci_softc *
#if 0
dump_db(sc, dmach);
#endif
- s = splfw();
if ((ir->flag & FWXFERQ_HANDLER) == 0)
FW_GLOCK(fc);
fwdma_sync_multiseg_all(sc->ir[dmach].am, BUS_DMASYNC_POSTREAD);
@@ -2250,7 +2259,6 @@ fwohci_rbuf_update(struct fwohci_softc *
}
if ((ir->flag & FWXFERQ_HANDLER) == 0)
FW_GUNLOCK(fc);
- splx(s);
if (w == 0)
return;
More information about the svn-src-all
mailing list