Add a tunable hw.firewire.phydma_enable.

This is enabled by default.  It should be disabled for
those who are uneasy with peeking/poking from FireWire.

Please note sbp(4) and dcons(4) over FireWire need
this feature.
This commit is contained in:
Hidetoshi Shimokawa 2007-06-07 13:20:48 +00:00
parent f6416cb484
commit ac2d2894b4
3 changed files with 19 additions and 6 deletions

View File

@ -299,6 +299,7 @@ int fw_open_isodma(struct firewire_comm *, int);
extern int firewire_debug;
extern devclass_t firewire_devclass;
extern int firewire_phydma_enable;
#ifdef __DragonFly__
#define FWPRI PCATCH

View File

@ -79,9 +79,13 @@
#undef OHCI_DEBUG
static int nocyclemaster = 0;
int firewire_phydma_enable = 1;
SYSCTL_DECL(_hw_firewire);
SYSCTL_INT(_hw_firewire, OID_AUTO, nocyclemaster, CTLFLAG_RW, &nocyclemaster, 0,
"Do not send cycle start packets");
SYSCTL_INT(_hw_firewire, OID_AUTO, phydma_enable, CTLFLAG_RW,
&firewire_phydma_enable, 1, "Allow physical request DMA from firewire");
TUNABLE_INT("hw.firewire.phydma_enable", &firewire_phydma_enable);
static char dbcode[16][0x10]={"OUTM", "OUTL","INPM","INPL",
"STOR","LOAD","NOP ","STOP",};
@ -1862,12 +1866,13 @@ fwohci_intr_core(struct fwohci_softc *sc, uint32_t stat, int count)
/* Allow async. request to us */
OWRITE(sc, OHCI_AREQHI, 1 << 31);
/* XXX insecure ?? */
/* allow from all nodes */
OWRITE(sc, OHCI_PREQHI, 0x7fffffff);
OWRITE(sc, OHCI_PREQLO, 0xffffffff);
/* 0 to 4GB regison */
OWRITE(sc, OHCI_PREQUPPER, 0x10000);
if (firewire_phydma_enable) {
/* allow from all nodes */
OWRITE(sc, OHCI_PREQHI, 0x7fffffff);
OWRITE(sc, OHCI_PREQLO, 0xffffffff);
/* 0 to 4GB region */
OWRITE(sc, OHCI_PREQUPPER, 0x10000);
}
/* Set ATRetries register */
OWRITE(sc, OHCI_ATRETRY, 1<<(13+16) | 0xfff);

View File

@ -824,6 +824,10 @@ sbp_post_explore(void *arg)
SBP_DEBUG(0)
printf("sbp_post_explore (sbp_cold=%d)\n", sbp_cold);
END_DEBUG
/* We need physical access */
if (!firewire_phydma_enable)
return;
if (sbp_cold > 0)
sbp_cold --;
@ -1946,6 +1950,9 @@ sbp_attach(device_t dev)
"SBP_MAXPHYS(%dKB).\n", DFLTPHYS / 1024,
SBP_MAXPHYS / 1024);
if (!firewire_phydma_enable)
device_printf(dev, "Warning, hw.firewire.phydma_enable must be 1 "
"for SBP over FireWire.\n");
SBP_DEBUG(0)
printf("sbp_attach (cold=%d)\n", cold);
END_DEBUG