summaryrefslogtreecommitdiffstats
path: root/sys/dev
diff options
context:
space:
mode:
authorgonzo <gonzo@FreeBSD.org>2009-09-08 19:15:29 +0000
committergonzo <gonzo@FreeBSD.org>2009-09-08 19:15:29 +0000
commit225f6f2a565848bfa3b958b8c6551f7f1871fd6d (patch)
treec690fdd3d243c7c4f77c55c9c6b63dfc51709fac /sys/dev
parent46f4809177236f729e4b2e37e2407da29bef4d7f (diff)
parenta7104567d1b1543ad709fb587f326e65d5efc1e6 (diff)
downloadFreeBSD-src-225f6f2a565848bfa3b958b8c6551f7f1871fd6d.zip
FreeBSD-src-225f6f2a565848bfa3b958b8c6551f7f1871fd6d.tar.gz
- MFC from head@196987
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/aac/aac.c8
-rw-r--r--sys/dev/acpica/acpi.c34
-rw-r--r--sys/dev/acpica/acpi_battery.c15
-rw-r--r--sys/dev/acpica/acpi_cpu.c2
-rw-r--r--sys/dev/acpica/acpi_dock.c8
-rw-r--r--sys/dev/acpica/acpi_thermal.c3
-rw-r--r--sys/dev/adb/adb_bus.c2
-rw-r--r--sys/dev/ahci/ahci.c219
-rw-r--r--sys/dev/ahci/ahci.h21
-rw-r--r--sys/dev/alc/if_alc.c3
-rw-r--r--sys/dev/amdtemp/amdtemp.c2
-rw-r--r--sys/dev/amr/amr.c23
-rw-r--r--sys/dev/asmc/asmc.c3
-rw-r--r--sys/dev/ata/ata-all.c34
-rw-r--r--sys/dev/ata/ata-disk.c4
-rw-r--r--sys/dev/ata/ata-dma.c6
-rw-r--r--sys/dev/ath/ah_osdep.c2
-rw-r--r--sys/dev/ath/ath_hal/ah_eeprom_v3.c2
-rw-r--r--sys/dev/ath/ath_hal/ah_regdomain.c2
-rw-r--r--sys/dev/ath/if_ath.c13
-rw-r--r--sys/dev/atkbdc/psm.c4
-rw-r--r--sys/dev/bge/if_bge.c15
-rw-r--r--sys/dev/bktr/bktr_os.c11
-rw-r--r--sys/dev/coretemp/coretemp.c8
-rw-r--r--sys/dev/cxgb/cxgb_main.c3
-rw-r--r--sys/dev/drm/drmP.h3
-rw-r--r--sys/dev/drm/drm_bufs.c22
-rw-r--r--sys/dev/drm/drm_drv.c19
-rw-r--r--sys/dev/drm/drm_fops.c4
-rw-r--r--sys/dev/drm/drm_pciids.h10
-rw-r--r--sys/dev/drm/drm_sysctl.c7
-rw-r--r--sys/dev/drm/r600_cp.c153
-rw-r--r--sys/dev/drm/radeon_cp.c17
-rw-r--r--sys/dev/drm/radeon_drm.h24
-rw-r--r--sys/dev/drm/radeon_drv.h121
-rw-r--r--sys/dev/drm/radeon_state.c26
-rw-r--r--sys/dev/e1000/if_em.c3
-rw-r--r--sys/dev/e1000/if_igb.c3
-rw-r--r--sys/dev/ep/if_ep.c15
-rw-r--r--sys/dev/hptrr/hptrr_osm_bsd.c4
-rw-r--r--sys/dev/hwpmc/hwpmc_core.c30
-rw-r--r--sys/dev/hwpmc/hwpmc_piv.c5
-rw-r--r--sys/dev/hwpmc/hwpmc_ppro.c5
-rw-r--r--sys/dev/hwpmc/hwpmc_x86.c22
-rw-r--r--sys/dev/hwpmc/pmc_events.h62
-rw-r--r--sys/dev/ips/ips_pci.c2
-rw-r--r--sys/dev/iscsi/initiator/isc_cam.c2
-rw-r--r--sys/dev/isp/isp_freebsd.c4
-rw-r--r--sys/dev/ixgbe/ixgbe.c71
-rw-r--r--sys/dev/mfi/mfi.c20
-rw-r--r--sys/dev/mfi/mfi_ioctl.h2
-rw-r--r--sys/dev/mfi/mfireg.h219
-rw-r--r--sys/dev/mge/if_mge.c11
-rw-r--r--sys/dev/mii/e1000phy.c4
-rw-r--r--sys/dev/mlx/mlx.c2
-rw-r--r--sys/dev/mmc/mmc.c2
-rw-r--r--sys/dev/mwl/if_mwl.c4
-rw-r--r--sys/dev/null/null.c11
-rw-r--r--sys/dev/pccbb/pccbb.c11
-rw-r--r--sys/dev/ppbus/vpo.c2
-rw-r--r--sys/dev/pst/pst-iop.c2
-rw-r--r--sys/dev/pty/pty.c159
-rw-r--r--sys/dev/re/if_re.c8
-rw-r--r--sys/dev/rp/rp.c4
-rw-r--r--sys/dev/rp/rp_pci.c8
-rw-r--r--sys/dev/siis/siis.c36
-rw-r--r--sys/dev/snp/snp.c11
-rw-r--r--sys/dev/sound/pci/hda/hdac.c15
-rw-r--r--sys/dev/sound/pci/hda/hdac_private.h1
-rw-r--r--sys/dev/sound/pci/hda/hdac_reg.h2
-rw-r--r--sys/dev/sound/usb/uaudio.c4
-rw-r--r--sys/dev/syscons/scterm-teken.c16
-rw-r--r--sys/dev/syscons/scvgarndr.c20
-rw-r--r--sys/dev/syscons/scvidctl.c4
-rw-r--r--sys/dev/syscons/teken/Makefile13
-rw-r--r--sys/dev/syscons/teken/gensequences157
-rw-r--r--sys/dev/syscons/teken/sequences110
-rw-r--r--sys/dev/syscons/teken/teken.c430
-rw-r--r--sys/dev/syscons/teken/teken.h184
-rw-r--r--sys/dev/syscons/teken/teken_demo.c367
-rw-r--r--sys/dev/syscons/teken/teken_scs.h98
-rw-r--r--sys/dev/syscons/teken/teken_stress.c123
-rw-r--r--sys/dev/syscons/teken/teken_subr.h1209
-rw-r--r--sys/dev/syscons/teken/teken_subr_compat.h86
-rw-r--r--sys/dev/syscons/teken/teken_wcwidth.h120
-rw-r--r--sys/dev/twe/twe.c6
-rw-r--r--sys/dev/txp/if_txp.c6
-rw-r--r--sys/dev/usb/controller/usb_controller.c86
-rw-r--r--sys/dev/usb/input/ukbd.c88
-rw-r--r--sys/dev/usb/misc/ufm.c15
-rw-r--r--sys/dev/usb/net/if_aue.c13
-rw-r--r--sys/dev/usb/net/if_cdce.c6
-rw-r--r--sys/dev/usb/net/usb_ethernet.c11
-rw-r--r--sys/dev/usb/serial/uipaq.c4
-rw-r--r--sys/dev/usb/serial/uvisor.c46
-rw-r--r--sys/dev/usb/storage/umass.c62
-rw-r--r--sys/dev/usb/storage/urio.c3
-rw-r--r--sys/dev/usb/usb.h2
-rw-r--r--sys/dev/usb/usb_busdma.c13
-rw-r--r--sys/dev/usb/usb_compat_linux.c27
-rw-r--r--sys/dev/usb/usb_dev.c25
-rw-r--r--sys/dev/usb/usb_device.c80
-rw-r--r--sys/dev/usb/usb_device.h3
-rw-r--r--sys/dev/usb/usb_handle_request.c30
-rw-r--r--sys/dev/usb/usb_hub.c42
-rw-r--r--sys/dev/usb/usb_process.c47
-rw-r--r--sys/dev/usb/usb_process.h5
-rw-r--r--sys/dev/usb/usb_transfer.c4
-rw-r--r--sys/dev/usb/usbdevs14
-rw-r--r--sys/dev/usb/wlan/if_upgt.c2
-rw-r--r--sys/dev/usb/wlan/if_zyd.c2
-rw-r--r--sys/dev/xen/blkback/blkback.c4
-rw-r--r--sys/dev/xen/blkfront/blkfront.c89
-rw-r--r--sys/dev/xen/console/console.c68
-rw-r--r--sys/dev/xen/netback/netback.c4
115 files changed, 1790 insertions, 3573 deletions
diff --git a/sys/dev/aac/aac.c b/sys/dev/aac/aac.c
index c576a35..f3d931a 100644
--- a/sys/dev/aac/aac.c
+++ b/sys/dev/aac/aac.c
@@ -3270,10 +3270,10 @@ aac_handle_aif(struct aac_softc *sc, struct aac_fib *fib)
while (co != NULL) {
if (co->co_found == 0) {
mtx_unlock(&sc->aac_io_lock);
- newbus_xlock();
+ mtx_lock(&Giant);
device_delete_child(sc->aac_dev,
co->co_disk);
- newbus_xunlock();
+ mtx_unlock(&Giant);
mtx_lock(&sc->aac_io_lock);
co_next = TAILQ_NEXT(co, co_link);
mtx_lock(&sc->aac_container_lock);
@@ -3291,9 +3291,9 @@ aac_handle_aif(struct aac_softc *sc, struct aac_fib *fib)
/* Attach the newly created containers */
if (added) {
mtx_unlock(&sc->aac_io_lock);
- newbus_xlock();
+ mtx_lock(&Giant);
bus_generic_attach(sc->aac_dev);
- newbus_xunlock();
+ mtx_unlock(&Giant);
mtx_lock(&sc->aac_io_lock);
}
diff --git a/sys/dev/acpica/acpi.c b/sys/dev/acpica/acpi.c
index c3e4e52..a2e5883 100644
--- a/sys/dev/acpica/acpi.c
+++ b/sys/dev/acpica/acpi.c
@@ -675,6 +675,8 @@ acpi_suspend(device_t dev)
device_t child, *devlist;
int error, i, numdevs, pstate;
+ GIANT_REQUIRED;
+
/* First give child devices a chance to suspend. */
error = bus_generic_suspend(dev);
if (error)
@@ -717,6 +719,8 @@ acpi_resume(device_t dev)
int i, numdevs, error;
device_t child, *devlist;
+ GIANT_REQUIRED;
+
/*
* Put all devices in D0 before resuming them. Call _S0D on each one
* since some systems expect this.
@@ -741,6 +745,8 @@ static int
acpi_shutdown(device_t dev)
{
+ GIANT_REQUIRED;
+
/* Allow children to shutdown first. */
bus_generic_shutdown(dev);
@@ -1008,14 +1014,27 @@ acpi_hint_device_unit(device_t acdev, device_t child, const char *name,
continue;
/*
- * Check for matching resources. We must have at least one,
- * and all resources specified have to match.
+ * Check for matching resources. We must have at least one match.
+ * Since I/O and memory resources cannot be shared, if we get a
+ * match on either of those, ignore any mismatches in IRQs or DRQs.
*
* XXX: We may want to revisit this to be more lenient and wire
* as long as it gets one match.
*/
matches = 0;
if (resource_long_value(name, unit, "port", &value) == 0) {
+ /*
+ * Floppy drive controllers are notorious for having a
+ * wide variety of resources not all of which include the
+ * first port that is specified by the hint (typically
+ * 0x3f0) (see the comment above fdc_isa_alloc_resources()
+ * in fdc_isa.c). However, they do all seem to include
+ * port + 2 (e.g. 0x3f2) so for a floppy device, look for
+ * 'value + 2' in the port resources instead of the hint
+ * value.
+ */
+ if (strcmp(name, "fdc") == 0)
+ value += 2;
if (acpi_match_resource_hint(child, SYS_RES_IOPORT, value))
matches++;
else
@@ -1027,6 +1046,8 @@ acpi_hint_device_unit(device_t acdev, device_t child, const char *name,
else
continue;
}
+ if (matches > 0)
+ goto matched;
if (resource_long_value(name, unit, "irq", &value) == 0) {
if (acpi_match_resource_hint(child, SYS_RES_IRQ, value))
matches++;
@@ -1040,6 +1061,7 @@ acpi_hint_device_unit(device_t acdev, device_t child, const char *name,
continue;
}
+ matched:
if (matches > 0) {
/* We have a winner! */
*unitp = unit;
@@ -2528,7 +2550,11 @@ acpi_EnterSleepState(struct acpi_softc *sc, int state)
thread_unlock(curthread);
#endif
- newbus_xlock();
+ /*
+ * Be sure to hold Giant across DEVICE_SUSPEND/RESUME since non-MPSAFE
+ * drivers need this.
+ */
+ mtx_lock(&Giant);
slp_state = ACPI_SS_NONE;
@@ -2601,7 +2627,7 @@ backout:
if (slp_state >= ACPI_SS_SLEPT)
acpi_enable_fixed_events(sc);
- newbus_xunlock();
+ mtx_unlock(&Giant);
#ifdef SMP
thread_lock(curthread);
diff --git a/sys/dev/acpica/acpi_battery.c b/sys/dev/acpica/acpi_battery.c
index 1ec1413..dd2b3fa 100644
--- a/sys/dev/acpica/acpi_battery.c
+++ b/sys/dev/acpica/acpi_battery.c
@@ -329,7 +329,6 @@ acpi_battery_find_dev(u_int logical_unit)
dev = NULL;
found_unit = 0;
- newbus_slock();
batt_dc = devclass_find("battery");
maxunit = devclass_get_maxunit(batt_dc);
for (i = 0; i < maxunit; i++) {
@@ -341,7 +340,6 @@ acpi_battery_find_dev(u_int logical_unit)
found_unit++;
dev = NULL;
}
- newbus_sunlock();
return (dev);
}
@@ -371,17 +369,13 @@ acpi_battery_ioctl(u_long cmd, caddr_t addr, void *arg)
*/
switch (cmd) {
case ACPIIO_BATT_GET_UNITS:
- newbus_slock();
*(int *)addr = acpi_battery_get_units();
- newbus_sunlock();
error = 0;
break;
case ACPIIO_BATT_GET_BATTINFO:
if (dev != NULL || unit == ACPI_BATTERY_ALL_UNITS) {
bzero(&ioctl_arg->battinfo, sizeof(ioctl_arg->battinfo));
- newbus_slock();
error = acpi_battery_get_battinfo(dev, &ioctl_arg->battinfo);
- newbus_sunlock();
}
break;
case ACPIIO_BATT_GET_BIF:
@@ -422,11 +416,6 @@ acpi_battery_sysctl(SYSCTL_HANDLER_ARGS)
{
int val, error;
- /*
- * Tolerate a race here because newbus lock can't be acquired before
- * acpi_battery_get_battinfo() as it can create a LOR with the sysctl
- * lock.
- */
acpi_battery_get_battinfo(NULL, &acpi_battery_battinfo);
val = *(u_int *)oidp->oid_arg1;
error = sysctl_handle_int(oidp, &val, 0, req);
@@ -438,10 +427,6 @@ acpi_battery_units_sysctl(SYSCTL_HANDLER_ARGS)
{
int count, error;
- /*
- * Tolerate a race here in order to avoid a LOR between sysctl lock
- * and newbus lock.
- */
count = acpi_battery_get_units();
error = sysctl_handle_int(oidp, &count, 0, req);
return (error);
diff --git a/sys/dev/acpica/acpi_cpu.c b/sys/dev/acpica/acpi_cpu.c
index 37134e2..5d8ad53 100644
--- a/sys/dev/acpica/acpi_cpu.c
+++ b/sys/dev/acpica/acpi_cpu.c
@@ -732,9 +732,7 @@ acpi_cpu_startup(void *arg)
int i;
/* Get set of CPU devices */
- newbus_slock();
devclass_get_devices(acpi_cpu_devclass, &cpu_devices, &cpu_ndevices);
- newbus_sunlock();
/*
* Setup any quirks that might necessary now that we have probed
diff --git a/sys/dev/acpica/acpi_dock.c b/sys/dev/acpica/acpi_dock.c
index 95b9fae..b7d2e3e 100644
--- a/sys/dev/acpica/acpi_dock.c
+++ b/sys/dev/acpica/acpi_dock.c
@@ -188,12 +188,12 @@ acpi_dock_attach_later(void *context)
dev = (device_t)context;
- newbus_xlock();
if (!device_is_enabled(dev))
device_enable(dev);
+ mtx_lock(&Giant);
device_probe_and_attach(dev);
- newbus_xunlock();
+ mtx_unlock(&Giant);
}
static ACPI_STATUS
@@ -299,11 +299,11 @@ acpi_dock_eject_child(ACPI_HANDLE handle, UINT32 level, void *context,
"ejecting device for %s\n", acpi_name(handle));
dev = acpi_get_device(handle);
- newbus_xlock();
if (dev != NULL && device_is_attached(dev)) {
+ mtx_lock(&Giant);
device_detach(dev);
+ mtx_unlock(&Giant);
}
- newbus_xunlock();
acpi_SetInteger(handle, "_EJ0", 0);
out:
diff --git a/sys/dev/acpica/acpi_thermal.c b/sys/dev/acpica/acpi_thermal.c
index 1e58d52..962fdb7 100644
--- a/sys/dev/acpica/acpi_thermal.c
+++ b/sys/dev/acpica/acpi_thermal.c
@@ -936,8 +936,6 @@ acpi_tz_thread(void *arg)
sc = NULL;
for (;;) {
- newbus_slock();
-
/* If the number of devices has changed, re-evaluate. */
if (devclass_get_count(acpi_tz_devclass) != devcount) {
if (devs != NULL) {
@@ -950,7 +948,6 @@ acpi_tz_thread(void *arg)
for (i = 0; i < devcount; i++)
sc[i] = device_get_softc(devs[i]);
}
- newbus_sunlock();
/* Check for temperature events and act on them. */
for (i = 0; i < devcount; i++) {
diff --git a/sys/dev/adb/adb_bus.c b/sys/dev/adb/adb_bus.c
index c4a9c96..faab048 100644
--- a/sys/dev/adb/adb_bus.c
+++ b/sys/dev/adb/adb_bus.c
@@ -113,7 +113,6 @@ adb_bus_enumerate(void *xdev)
uint8_t i, next_free;
uint16_t r3;
- newbus_xlock();
sc->sc_dev = dev;
sc->parent = device_get_parent(dev);
@@ -188,7 +187,6 @@ adb_bus_enumerate(void *xdev)
}
bus_generic_attach(dev);
- newbus_xunlock();
config_intrhook_disestablish(&sc->enum_hook);
}
diff --git a/sys/dev/ahci/ahci.c b/sys/dev/ahci/ahci.c
index 389648a..273c276 100644
--- a/sys/dev/ahci/ahci.c
+++ b/sys/dev/ahci/ahci.c
@@ -63,6 +63,7 @@ static int ahci_suspend(device_t dev);
static int ahci_resume(device_t dev);
static int ahci_ch_suspend(device_t dev);
static int ahci_ch_resume(device_t dev);
+static void ahci_ch_pm(void *arg);
static void ahci_ch_intr_locked(void *data);
static void ahci_ch_intr(void *data);
static int ahci_ctlr_reset(device_t dev);
@@ -121,9 +122,11 @@ ahci_attach(device_t dev)
struct ahci_controller *ctlr = device_get_softc(dev);
device_t child;
int error, unit, speed;
- u_int32_t version, caps;
+ u_int32_t version;
ctlr->dev = dev;
+ resource_int_value(device_get_name(dev),
+ device_get_unit(dev), "ccc", &ctlr->ccc);
/* if we have a memory BAR(5) we are likely on an AHCI part */
ctlr->r_rid = PCIR_BAR(5);
if (!(ctlr->r_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
@@ -160,41 +163,49 @@ ahci_attach(device_t dev)
}
/* Announce HW capabilities. */
version = ATA_INL(ctlr->r_mem, AHCI_VS);
- caps = ATA_INL(ctlr->r_mem, AHCI_CAP);
- speed = (caps & AHCI_CAP_ISS) >> AHCI_CAP_ISS_SHIFT;
+ ctlr->caps = ATA_INL(ctlr->r_mem, AHCI_CAP);
+ if (version >= 0x00010020)
+ ctlr->caps2 = ATA_INL(ctlr->r_mem, AHCI_CAP2);
+ speed = (ctlr->caps & AHCI_CAP_ISS) >> AHCI_CAP_ISS_SHIFT;
device_printf(dev,
"AHCI v%x.%02x with %d %sGbps ports, Port Multiplier %s\n",
((version >> 20) & 0xf0) + ((version >> 16) & 0x0f),
((version >> 4) & 0xf0) + (version & 0x0f),
- (caps & AHCI_CAP_NPMASK) + 1,
+ (ctlr->caps & AHCI_CAP_NPMASK) + 1,
((speed == 1) ? "1.5":((speed == 2) ? "3":
((speed == 3) ? "6":"?"))),
- (caps & AHCI_CAP_SPM) ?
+ (ctlr->caps & AHCI_CAP_SPM) ?
"supported" : "not supported");
if (bootverbose) {
device_printf(dev, "Caps:%s%s%s%s%s%s%s%s %sGbps",
- (caps & AHCI_CAP_64BIT) ? " 64bit":"",
- (caps & AHCI_CAP_SNCQ) ? " NCQ":"",
- (caps & AHCI_CAP_SSNTF) ? " SNTF":"",
- (caps & AHCI_CAP_SMPS) ? " MPS":"",
- (caps & AHCI_CAP_SSS) ? " SS":"",
- (caps & AHCI_CAP_SALP) ? " ALP":"",
- (caps & AHCI_CAP_SAL) ? " AL":"",
- (caps & AHCI_CAP_SCLO) ? " CLO":"",
+ (ctlr->caps & AHCI_CAP_64BIT) ? " 64bit":"",
+ (ctlr->caps & AHCI_CAP_SNCQ) ? " NCQ":"",
+ (ctlr->caps & AHCI_CAP_SSNTF) ? " SNTF":"",
+ (ctlr->caps & AHCI_CAP_SMPS) ? " MPS":"",
+ (ctlr->caps & AHCI_CAP_SSS) ? " SS":"",
+ (ctlr->caps & AHCI_CAP_SALP) ? " ALP":"",
+ (ctlr->caps & AHCI_CAP_SAL) ? " AL":"",
+ (ctlr->caps & AHCI_CAP_SCLO) ? " CLO":"",
((speed == 1) ? "1.5":((speed == 2) ? "3":
((speed == 3) ? "6":"?"))));
printf("%s%s%s%s%s%s %dcmd%s%s%s %dports\n",
- (caps & AHCI_CAP_SAM) ? " AM":"",
- (caps & AHCI_CAP_SPM) ? " PM":"",
- (caps & AHCI_CAP_FBSS) ? " FBS":"",
- (caps & AHCI_CAP_PMD) ? " PMD":"",
- (caps & AHCI_CAP_SSC) ? " SSC":"",
- (caps & AHCI_CAP_PSC) ? " PSC":"",
- ((caps & AHCI_CAP_NCS) >> AHCI_CAP_NCS_SHIFT) + 1,
- (caps & AHCI_CAP_CCCS) ? " CCC":"",
- (caps & AHCI_CAP_EMS) ? " EM":"",
- (caps & AHCI_CAP_SXS) ? " eSATA":"",
- (caps & AHCI_CAP_NPMASK) + 1);
+ (ctlr->caps & AHCI_CAP_SAM) ? " AM":"",
+ (ctlr->caps & AHCI_CAP_SPM) ? " PM":"",
+ (ctlr->caps & AHCI_CAP_FBSS) ? " FBS":"",
+ (ctlr->caps & AHCI_CAP_PMD) ? " PMD":"",
+ (ctlr->caps & AHCI_CAP_SSC) ? " SSC":"",
+ (ctlr->caps & AHCI_CAP_PSC) ? " PSC":"",
+ ((ctlr->caps & AHCI_CAP_NCS) >> AHCI_CAP_NCS_SHIFT) + 1,
+ (ctlr->caps & AHCI_CAP_CCCS) ? " CCC":"",
+ (ctlr->caps & AHCI_CAP_EMS) ? " EM":"",
+ (ctlr->caps & AHCI_CAP_SXS) ? " eSATA":"",
+ (ctlr->caps & AHCI_CAP_NPMASK) + 1);
+ }
+ if (bootverbose && version >= 0x00010020) {
+ device_printf(dev, "Caps2:%s%s%s\n",
+ (ctlr->caps2 & AHCI_CAP2_APST) ? " APST":"",
+ (ctlr->caps2 & AHCI_CAP2_NVMP) ? " NVMP":"",
+ (ctlr->caps2 & AHCI_CAP2_BOH) ? " BOH":"");
}
/* Attach all channels on this controller */
for (unit = 0; unit < ctlr->channels; unit++) {
@@ -266,6 +277,21 @@ ahci_ctlr_reset(device_t dev)
ATA_OUTL(ctlr->r_mem, AHCI_GHC, AHCI_GHC_AE);
/* Clear interrupts */
ATA_OUTL(ctlr->r_mem, AHCI_IS, ATA_INL(ctlr->r_mem, AHCI_IS));
+ /* Configure CCC */
+ if (ctlr->ccc) {
+ ATA_OUTL(ctlr->r_mem, AHCI_CCCP, ATA_INL(ctlr->r_mem, AHCI_PI));
+ ATA_OUTL(ctlr->r_mem, AHCI_CCCC,
+ (ctlr->ccc << AHCI_CCCC_TV_SHIFT) |
+ (4 << AHCI_CCCC_CC_SHIFT) |
+ AHCI_CCCC_EN);
+ ctlr->cccv = (ATA_INL(ctlr->r_mem, AHCI_CCCC) &
+ AHCI_CCCC_INT_MASK) >> AHCI_CCCC_INT_SHIFT;
+ if (bootverbose) {
+ device_printf(dev,
+ "CCC with %dms/4cmd enabled on vector %d\n",
+ ctlr->ccc, ctlr->cccv);
+ }
+ }
/* Enable AHCI interrupts */
ATA_OUTL(ctlr->r_mem, AHCI_GHC,
ATA_INL(ctlr->r_mem, AHCI_GHC) | AHCI_GHC_IE);
@@ -326,7 +352,8 @@ ahci_setup_interrupt(device_t dev)
for (i = 0; i < ctlr->numirqs; i++) {
ctlr->irqs[i].ctlr = ctlr;
ctlr->irqs[i].r_irq_rid = i + (msi ? 1 : 0);
- if (ctlr->numirqs == 1 || i >= ctlr->channels)
+ if (ctlr->numirqs == 1 || i >= ctlr->channels ||
+ (ctlr->ccc && i == ctlr->cccv))
ctlr->irqs[i].mode = AHCI_IRQ_MODE_ALL;
else if (i == ctlr->numirqs - 1)
ctlr->irqs[i].mode = AHCI_IRQ_MODE_AFTER;
@@ -360,11 +387,16 @@ ahci_intr(void *data)
void *arg;
int unit;
- is = ATA_INL(ctlr->r_mem, AHCI_IS);
- if (irq->mode == AHCI_IRQ_MODE_ALL)
+ if (irq->mode == AHCI_IRQ_MODE_ALL) {
unit = 0;
- else /* AHCI_IRQ_MODE_AFTER */
+ if (ctlr->ccc)
+ is = ctlr->ichannels;
+ else
+ is = ATA_INL(ctlr->r_mem, AHCI_IS);
+ } else { /* AHCI_IRQ_MODE_AFTER */
unit = irq->r_irq_rid - 1;
+ is = ATA_INL(ctlr->r_mem, AHCI_IS);
+ }
for (; unit < ctlr->channels; unit++) {
if ((is & (1 << unit)) != 0 &&
(arg = ctlr->interrupt[unit].argument)) {
@@ -523,10 +555,14 @@ ahci_ch_attach(device_t dev)
ch->dev = dev;
ch->unit = (intptr_t)device_get_ivars(dev);
- ch->caps = ATA_INL(ctlr->r_mem, AHCI_CAP);
+ ch->caps = ctlr->caps;
+ ch->caps2 = ctlr->caps2;
ch->numslots = ((ch->caps & AHCI_CAP_NCS) >> AHCI_CAP_NCS_SHIFT) + 1,
+ mtx_init(&ch->mtx, "AHCI channel lock", NULL, MTX_DEF);
resource_int_value(device_get_name(dev),
device_get_unit(dev), "pm_level", &ch->pm_level);
+ if (ch->pm_level > 3)
+ callout_init_mtx(&ch->pm_timer, &ch->mtx, 0);
/* Limit speed for my onboard JMicron external port.
* It is not eSATA really. */
if (pci_get_devid(ctlr->dev) == 0x2363197b &&
@@ -536,7 +572,6 @@ ahci_ch_attach(device_t dev)
ch->sata_rev = 1;
resource_int_value(device_get_name(dev),
device_get_unit(dev), "sata_rev", &ch->sata_rev);
- mtx_init(&ch->mtx, "AHCI channel lock", NULL, MTX_DEF);
rid = ch->unit;
if (!(ch->r_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
&rid, RF_ACTIVE)))
@@ -584,6 +619,11 @@ ahci_ch_attach(device_t dev)
error = ENXIO;
goto err3;
}
+ if (ch->pm_level > 3) {
+ callout_reset(&ch->pm_timer,
+ (ch->pm_level == 4) ? hz / 1000 : hz / 8,
+ ahci_ch_pm, dev);
+ }
mtx_unlock(&ch->mtx);
return (0);
@@ -610,6 +650,8 @@ ahci_ch_detach(device_t dev)
cam_sim_free(ch->sim, /*free_devq*/TRUE);
mtx_unlock(&ch->mtx);
+ if (ch->pm_level > 3)
+ callout_drain(&ch->pm_timer);
bus_teardown_intr(dev, ch->r_irq, ch->ih);
bus_release_resource(dev, SYS_RES_IRQ, ATA_IRQ_RID, ch->r_irq);
@@ -661,7 +703,7 @@ ahci_ch_resume(device_t dev)
/* Activate the channel and power/spin up device */
ATA_OUTL(ch->r_mem, AHCI_P_CMD,
(AHCI_P_CMD_ACTIVE | AHCI_P_CMD_POD | AHCI_P_CMD_SUD |
- ((ch->pm_level > 1) ? AHCI_P_CMD_ALPE : 0) |
+ ((ch->pm_level == 2 || ch->pm_level == 3) ? AHCI_P_CMD_ALPE : 0) |
((ch->pm_level > 2) ? AHCI_P_CMD_ASP : 0 )));
ahci_start_fr(dev);
ahci_start(dev);
@@ -815,6 +857,7 @@ ahci_slotsfree(device_t dev)
for (i = 0; i < ch->numslots; i++) {
struct ahci_slot *slot = &ch->slot[i];
+ callout_drain(&slot->timeout);
if (slot->dma.data_map) {
bus_dmamap_destroy(ch->dma.data_tag, slot->dma.data_map);
slot->dma.data_map = NULL;
@@ -848,6 +891,27 @@ ahci_phy_check_events(device_t dev)
}
static void
+ahci_notify_events(device_t dev, u_int32_t status)
+{
+ struct ahci_channel *ch = device_get_softc(dev);
+ struct cam_path *dpath;
+ int i;
+
+ ATA_OUTL(ch->r_mem, AHCI_P_SNTF, status);
+ if (bootverbose)
+ device_printf(dev, "SNTF 0x%04x\n", status);
+ for (i = 0; i < 16; i++) {
+ if ((status & (1 << i)) == 0)
+ continue;
+ if (xpt_create_path(&dpath, NULL,
+ xpt_path_path_id(ch->path), i, 0) == CAM_REQ_CMP) {
+ xpt_async(AC_SCSI_AEN, dpath, NULL);
+ xpt_free_path(dpath);
+ }
+ }
+}
+
+static void
ahci_ch_intr_locked(void *data)
{
device_t dev = (device_t)data;
@@ -859,20 +923,41 @@ ahci_ch_intr_locked(void *data)
}
static void
+ahci_ch_pm(void *arg)
+{
+ device_t dev = (device_t)arg;
+ struct ahci_channel *ch = device_get_softc(dev);
+ uint32_t work;
+
+ if (ch->numrslots != 0)
+ return;
+ work = ATA_INL(ch->r_mem, AHCI_P_CMD);
+ if (ch->pm_level == 4)
+ work |= AHCI_P_CMD_PARTIAL;
+ else
+ work |= AHCI_P_CMD_SLUMBER;
+ ATA_OUTL(ch->r_mem, AHCI_P_CMD, work);
+}
+
+static void
ahci_ch_intr(void *data)
{
device_t dev = (device_t)data;
struct ahci_channel *ch = device_get_softc(dev);
- uint32_t istatus, cstatus, sstatus, ok, err;
+ uint32_t istatus, sstatus, cstatus, sntf = 0, ok, err;
enum ahci_err_type et;
int i, ccs, ncq_err = 0;
/* Read and clear interrupt statuses. */
istatus = ATA_INL(ch->r_mem, AHCI_P_IS);
+ if (istatus == 0)
+ return;
ATA_OUTL(ch->r_mem, AHCI_P_IS, istatus);
/* Read command statuses. */
- cstatus = ATA_INL(ch->r_mem, AHCI_P_CI);
sstatus = ATA_INL(ch->r_mem, AHCI_P_SACT);
+ cstatus = ATA_INL(ch->r_mem, AHCI_P_CI);
+ if ((istatus & AHCI_P_IX_SDB) && (ch->caps & AHCI_CAP_SSNTF))
+ sntf = ATA_INL(ch->r_mem, AHCI_P_SNTF);
/* Process PHY events */
if (istatus & (AHCI_P_IX_PRC | AHCI_P_IX_PC))
ahci_phy_check_events(dev);
@@ -884,17 +969,16 @@ ahci_ch_intr(void *data)
// ATA_INL(ch->r_mem, AHCI_P_SERR));
ccs = (ATA_INL(ch->r_mem, AHCI_P_CMD) & AHCI_P_CMD_CCS_MASK)
>> AHCI_P_CMD_CCS_SHIFT;
+ err = ch->rslots & (cstatus | sstatus);
/* Kick controller into sane state */
ahci_stop(dev);
ahci_start(dev);
- ok = ch->rslots & ~(cstatus | sstatus);
- err = ch->rslots & (cstatus | sstatus);
} else {
ccs = 0;
- ok = ch->rslots & ~(cstatus | sstatus);
err = 0;
}
/* Complete all successfull commands. */
+ ok = ch->rslots & ~(cstatus | sstatus);
for (i = 0; i < ch->numslots; i++) {
if ((ok >> i) & 1)
ahci_end_transaction(&ch->slot[i], AHCI_ERR_NONE);
@@ -936,6 +1020,9 @@ ahci_ch_intr(void *data)
if (ncq_err)
ahci_issue_read_log(dev);
}
+ /* Process NOTIFY events */
+ if (sntf)
+ ahci_notify_events(dev, sntf);
}
/* Must be called with channel locked. */
@@ -980,19 +1067,18 @@ ahci_begin_transaction(device_t dev, union ccb *ccb)
/* Choose empty slot. */
tag = ch->lastslot;
- do {
- tag++;
- if (tag >= ch->numslots)
+ while (ch->slot[tag].state != AHCI_SLOT_EMPTY) {
+ if (++tag >= ch->numslots)
tag = 0;
- if (ch->slot[tag].state == AHCI_SLOT_EMPTY)
- break;
- } while (tag != ch->lastslot);
- if (ch->slot[tag].state != AHCI_SLOT_EMPTY)
- device_printf(ch->dev, "ALL SLOTS BUSY!\n");
+ KASSERT(tag != ch->lastslot, ("ahci: ALL SLOTS BUSY!"));
+ }
ch->lastslot = tag;
/* Occupy chosen slot. */
slot = &ch->slot[tag];
slot->ccb = ccb;
+ /* Stop PM timer. */
+ if (ch->numrslots == 0 && ch->pm_level > 3)
+ callout_stop(&ch->pm_timer);
/* Update channel stats. */
ch->numrslots++;
if ((ccb->ccb_h.func_code == XPT_ATA_IO) &&
@@ -1162,6 +1248,10 @@ ahci_timeout(struct ahci_slot *slot)
struct ahci_channel *ch = device_get_softc(dev);
int i;
+ /* Check for stale timeout. */
+ if (slot->state != AHCI_SLOT_RUNNING)
+ return;
+
device_printf(dev, "Timeout on slot %d\n", slot->slot);
/* Kick controller into sane state. */
ahci_stop(ch->dev);
@@ -1194,8 +1284,6 @@ ahci_end_transaction(struct ahci_slot *slot, enum ahci_err_type et)
struct ahci_channel *ch = device_get_softc(dev);
union ccb *ccb = slot->ccb;
- /* Cancel command execution timeout */
- callout_stop(&slot->timeout);
bus_dmamap_sync(ch->dma.work_tag, ch->dma.work_map,
BUS_DMASYNC_POSTWRITE);
/* Read result registers to the result struct
@@ -1302,6 +1390,11 @@ ahci_end_transaction(struct ahci_slot *slot, enum ahci_err_type et)
ahci_begin_transaction(dev, fccb);
xpt_release_simq(ch->sim, TRUE);
}
+ /* Start PM timer. */
+ if (ch->numrslots == 0 && ch->pm_level > 3) {
+ callout_schedule(&ch->pm_timer,
+ (ch->pm_level == 4) ? hz / 1000 : hz / 8);
+ }
}
static void
@@ -1516,6 +1609,7 @@ static void
ahci_reset(device_t dev)
{
struct ahci_channel *ch = device_get_softc(dev);
+ struct ahci_controller *ctlr = device_get_softc(device_get_parent(dev));
int i;
if (bootverbose)
@@ -1562,10 +1656,10 @@ ahci_reset(device_t dev)
(AHCI_P_IX_CPD | AHCI_P_IX_TFE | AHCI_P_IX_HBF |
AHCI_P_IX_HBD | AHCI_P_IX_IF | AHCI_P_IX_OF |
((ch->pm_level == 0) ? AHCI_P_IX_PRC | AHCI_P_IX_PC : 0) |
- AHCI_P_IX_DP | AHCI_P_IX_UF | AHCI_P_IX_SDB |
- AHCI_P_IX_DS | AHCI_P_IX_PS | AHCI_P_IX_DHR));
+ AHCI_P_IX_DP | AHCI_P_IX_UF | (ctlr->ccc ? 0 : AHCI_P_IX_SDB) |
+ AHCI_P_IX_DS | AHCI_P_IX_PS | (ctlr->ccc ? 0 : AHCI_P_IX_DHR)));
if (bootverbose)
- device_printf(dev, "AHCI reset done: devices=%08x\n", ch->devices);
+ device_printf(dev, "AHCI reset done: device found\n");
/* Tell the XPT about the event */
xpt_async(AC_BUS_RESET, ch->path, NULL);
}
@@ -1632,6 +1726,13 @@ ahci_sata_connect(struct ahci_channel *ch)
((status & ATA_SS_SPD_MASK) != ATA_SS_SPD_NO_SPEED) &&
((status & ATA_SS_IPM_MASK) == ATA_SS_IPM_ACTIVE))
break;
+ if ((status & ATA_SS_DET_MASK) == ATA_SS_DET_PHY_OFFLINE) {
+ if (bootverbose) {
+ device_printf(ch->dev, "SATA offline status=%08x\n",
+ status);
+ }
+ return (0);
+ }
DELAY(1000);
}
if (timeout >= 100) {
@@ -1664,9 +1765,6 @@ ahci_sata_phy_reset(device_t dev, int quick)
if (bootverbose)
device_printf(dev, "hardware reset ...\n");
- ATA_OUTL(ch->r_mem, AHCI_P_SCTL, ATA_SC_IPM_DIS_PARTIAL |
- ATA_SC_IPM_DIS_SLUMBER | ATA_SC_DET_RESET);
- DELAY(50000);
if (ch->sata_rev == 1)
val = ATA_SC_SPD_SPEED_GEN1;
else if (ch->sata_rev == 2)
@@ -1676,9 +1774,13 @@ ahci_sata_phy_reset(device_t dev, int quick)
else
val = 0;
ATA_OUTL(ch->r_mem, AHCI_P_SCTL,
+ ATA_SC_DET_RESET | val |
+ ATA_SC_IPM_DIS_PARTIAL | ATA_SC_IPM_DIS_SLUMBER);
+ DELAY(5000);
+ ATA_OUTL(ch->r_mem, AHCI_P_SCTL,
ATA_SC_DET_IDLE | val | ((ch->pm_level > 0) ? 0 :
(ATA_SC_IPM_DIS_PARTIAL | ATA_SC_IPM_DIS_SLUMBER)));
- DELAY(50000);
+ DELAY(5000);
return (ahci_sata_connect(ch));
}
@@ -1739,9 +1841,9 @@ ahciaction(struct cam_sim *sim, union ccb *ccb)
uint32_t status;
cts->protocol = PROTO_ATA;
- cts->protocol_version = SCSI_REV_2;
+ cts->protocol_version = PROTO_VERSION_UNSPECIFIED;
cts->transport = XPORT_SATA;
- cts->transport_version = 2;
+ cts->transport_version = XPORT_VERSION_UNSPECIFIED;
cts->proto_specific.valid = 0;
cts->xport_specific.sata.valid = 0;
if (cts->type == CTS_TYPE_CURRENT_SETTINGS)
@@ -1834,10 +1936,13 @@ ahciaction(struct cam_sim *sim, union ccb *ccb)
strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN);
cpi->unit_number = cam_sim_unit(sim);
cpi->transport = XPORT_SATA;
- cpi->transport_version = 2;
+ cpi->transport_version = XPORT_VERSION_UNSPECIFIED;
cpi->protocol = PROTO_ATA;
- cpi->protocol_version = SCSI_REV_2;
+ cpi->protocol_version = PROTO_VERSION_UNSPECIFIED;
cpi->maxio = MAXPHYS;
+ /* ATI SB600 can't handle 256 sectors with FPDMA (NCQ). */
+ if (pci_get_devid(device_get_parent(dev)) == 0x43801002)
+ cpi->maxio = min(cpi->maxio, 128 * 512);
cpi->ccb_h.status = CAM_REQ_CMP;
xpt_done(ccb);
break;
diff --git a/sys/dev/ahci/ahci.h b/sys/dev/ahci/ahci.h
index dadbd84..9b5726a 100644
--- a/sys/dev/ahci/ahci.h
+++ b/sys/dev/ahci/ahci.h
@@ -176,6 +176,21 @@
#define AHCI_PI 0x0c
#define AHCI_VS 0x10
+#define AHCI_CCCC 0x14
+#define AHCI_CCCC_TV_MASK 0xffff0000
+#define AHCI_CCCC_TV_SHIFT 16
+#define AHCI_CCCC_CC_MASK 0x0000ff00
+#define AHCI_CCCC_CC_SHIFT 8
+#define AHCI_CCCC_INT_MASK 0x000000f8
+#define AHCI_CCCC_INT_SHIFT 3
+#define AHCI_CCCC_EN 0x00000001
+#define AHCI_CCCP 0x18
+
+#define AHCI_CAP2 0x24
+#define AHCI_CAP2_BOH 0x00000001
+#define AHCI_CAP2_NVMP 0x00000002
+#define AHCI_CAP2_APST 0x00000004
+
#define AHCI_OFFSET 0x100
#define AHCI_STEP 0x80
@@ -336,6 +351,7 @@ struct ahci_channel {
struct cam_sim *sim;
struct cam_path *path;
uint32_t caps; /* Controller capabilities */
+ uint32_t caps2; /* Controller capabilities */
int numslots; /* Number of present slots */
int pm_level; /* power management level */
int sata_rev; /* Maximum allowed SATA generation */
@@ -353,6 +369,7 @@ struct ahci_channel {
int lastslot; /* Last used slot */
int taggedtarget; /* Last tagged target */
union ccb *frozen; /* Frozen command */
+ struct callout pm_timer; /* Power management events */
};
/* structure describing a AHCI controller */
@@ -371,9 +388,13 @@ struct ahci_controller {
#define AHCI_IRQ_MODE_AFTER 1
#define AHCI_IRQ_MODE_ONE 2
} irqs[16];
+ uint32_t caps; /* Controller capabilities */
+ uint32_t caps2; /* Controller capabilities */
int numirqs;
int channels;
int ichannels;
+ int ccc; /* CCC timeout */
+ int cccv; /* CCC vector */
struct {
void (*function)(void *);
void *argument;
diff --git a/sys/dev/alc/if_alc.c b/sys/dev/alc/if_alc.c
index f3483b7..a53af77 100644
--- a/sys/dev/alc/if_alc.c
+++ b/sys/dev/alc/if_alc.c
@@ -858,7 +858,8 @@ alc_detach(device_t dev)
sc->alc_intrhand[i] = NULL;
}
}
- alc_phy_down(sc);
+ if (sc->alc_res[0] != NULL)
+ alc_phy_down(sc);
bus_release_resources(dev, sc->alc_irq_spec, sc->alc_irq);
if ((sc->alc_flags & (ALC_FLAG_MSI | ALC_FLAG_MSIX)) != 0)
pci_release_msi(dev);
diff --git a/sys/dev/amdtemp/amdtemp.c b/sys/dev/amdtemp/amdtemp.c
index ba7436a..fdf0875 100644
--- a/sys/dev/amdtemp/amdtemp.c
+++ b/sys/dev/amdtemp/amdtemp.c
@@ -269,7 +269,6 @@ amdtemp_intrhook(void *arg)
/*
* dev.cpu.N.temperature.
*/
- newbus_xlock();
nexus = device_find_child(root_bus, "nexus", 0);
acpi = device_find_child(nexus, "acpi", 0);
@@ -286,7 +285,6 @@ amdtemp_intrhook(void *arg)
"Max of sensor 0 / 1");
}
}
- newbus_xunlock();
config_intrhook_disestablish(&sc->sc_ich);
}
diff --git a/sys/dev/amr/amr.c b/sys/dev/amr/amr.c
index 688b2df..2061fcc 100644
--- a/sys/dev/amr/amr.c
+++ b/sys/dev/amr/amr.c
@@ -90,10 +90,6 @@ __FBSDID("$FreeBSD$");
SYSCTL_NODE(_hw, OID_AUTO, amr, CTLFLAG_RD, 0, "AMR driver parameters");
-/*
- * In order to get rid of Giant, amr_state should be protected by
- * a proper softc lock for the cdev operations.
- */
static d_open_t amr_open;
static d_close_t amr_close;
static d_ioctl_t amr_ioctl;
@@ -316,11 +312,9 @@ amr_startup(void *arg)
config_intrhook_disestablish(&sc->amr_ich);
sc->amr_ich.ich_func = NULL;
- newbus_xlock();
/* get up-to-date drive information */
if (amr_query_controller(sc)) {
device_printf(sc->amr_dev, "can't scan controller for drives\n");
- newbus_xunlock();
return;
}
@@ -353,7 +347,6 @@ amr_startup(void *arg)
/* interrupts will be enabled before we do anything more */
sc->amr_state |= AMR_STATE_INTEN;
- newbus_xunlock();
/*
* Start the timeout routine.
@@ -441,11 +434,7 @@ static int
amr_open(struct cdev *dev, int flags, int fmt, struct thread *td)
{
int unit = dev2unit(dev);
- struct amr_softc *sc;
-
- newbus_slock();
- sc = devclass_get_softc(devclass_find("amr"), unit);
- newbus_sunlock();
+ struct amr_softc *sc = devclass_get_softc(devclass_find("amr"), unit);
debug_called(1);
@@ -501,11 +490,7 @@ static int
amr_close(struct cdev *dev, int flags, int fmt, struct thread *td)
{
int unit = dev2unit(dev);
- struct amr_softc *sc;
-
- newbus_slock();
- sc = devclass_get_softc(devclass_find("amr"), unit);
- newbus_sunlock();
+ struct amr_softc *sc = devclass_get_softc(devclass_find("amr"), unit);
debug_called(1);
@@ -522,7 +507,6 @@ amr_rescan_drives(struct cdev *dev)
struct amr_softc *sc = (struct amr_softc *)dev->si_drv1;
int i, error = 0;
- newbus_xlock();
sc->amr_state |= AMR_STATE_REMAP_LD;
while (sc->amr_busyslots) {
device_printf(sc->amr_dev, "idle controller\n");
@@ -546,7 +530,6 @@ amr_rescan_drives(struct cdev *dev)
sc->amr_drive[i].al_disk = 0;
}
}
- newbus_xunlock();
shutdown_out:
amr_startup(sc);
@@ -822,9 +805,7 @@ amr_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int32_t flag, struct threa
struct amr_linux_ioctl ali;
int adapter, error;
- newbus_slock();
devclass = devclass_find("amr");
- newbus_sunlock();
if (devclass == NULL)
return (ENOENT);
diff --git a/sys/dev/asmc/asmc.c b/sys/dev/asmc/asmc.c
index b13f6dd..7f7f031 100644
--- a/sys/dev/asmc/asmc.c
+++ b/sys/dev/asmc/asmc.c
@@ -419,7 +419,8 @@ asmc_attach(device_t dev)
SYSCTL_ADD_PROC(sysctlctx,
SYSCTL_CHILDREN(sc->sc_light_tree),
- OID_AUTO, "control", CTLTYPE_INT | CTLFLAG_RW,
+ OID_AUTO, "control",
+ CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_ANYBODY,
dev, 0, model->smc_light_control, "I",
"Keyboard backlight brightness control");
}
diff --git a/sys/dev/ata/ata-all.c b/sys/dev/ata/ata-all.c
index 6696f0c..1460a21 100644
--- a/sys/dev/ata/ata-all.c
+++ b/sys/dev/ata/ata-all.c
@@ -54,6 +54,7 @@ __FBSDID("$FreeBSD$");
static d_ioctl_t ata_ioctl;
static struct cdevsw ata_cdevsw = {
.d_version = D_VERSION,
+ .d_flags = D_NEEDGIANT, /* we need this as newbus isn't mpsafe */
.d_ioctl = ata_ioctl,
.d_name = "ata",
};
@@ -203,9 +204,7 @@ ata_conn_event(void *context, int dummy)
{
device_t dev = (device_t)context;
- newbus_xlock();
ata_reinit(dev);
- newbus_xunlock();
}
int
@@ -247,6 +246,7 @@ ata_reinit(device_t dev)
/* reinit the children and delete any that fails */
if (!device_get_children(dev, &children, &nchildren)) {
+ mtx_lock(&Giant); /* newbus suckage it needs Giant */
for (i = 0; i < nchildren; i++) {
/* did any children go missing ? */
if (children[i] && device_is_attached(children[i]) &&
@@ -269,6 +269,7 @@ ata_reinit(device_t dev)
}
}
free(children, M_TEMP);
+ mtx_unlock(&Giant); /* newbus suckage dealt with, release Giant */
}
/* if we still have a good request put it on the queue again */
@@ -394,7 +395,6 @@ ata_ioctl(struct cdev *dev, u_long cmd, caddr_t data,
int *value = (int *)data;
int i, nchildren, error = ENOTTY;
- newbus_xlock();
switch (cmd) {
case IOCATAGMAXCHANNEL:
/* In case we have channel 0..n this will return n+1. */
@@ -405,40 +405,32 @@ ata_ioctl(struct cdev *dev, u_long cmd, caddr_t data,
case IOCATAREINIT:
if (*value >= devclass_get_maxunit(ata_devclass) ||
!(device = devclass_get_device(ata_devclass, *value)) ||
- !device_is_attached(device)) {
- newbus_xunlock();
+ !device_is_attached(device))
return ENXIO;
- }
error = ata_reinit(device);
break;
case IOCATAATTACH:
if (*value >= devclass_get_maxunit(ata_devclass) ||
!(device = devclass_get_device(ata_devclass, *value)) ||
- !device_is_attached(device)) {
- newbus_xunlock();
+ !device_is_attached(device))
return ENXIO;
- }
error = DEVICE_ATTACH(device);
break;
case IOCATADETACH:
if (*value >= devclass_get_maxunit(ata_devclass) ||
!(device = devclass_get_device(ata_devclass, *value)) ||
- !device_is_attached(device)) {
- newbus_xunlock();
+ !device_is_attached(device))
return ENXIO;
- }
error = DEVICE_DETACH(device);
break;
case IOCATADEVICES:
if (devices->channel >= devclass_get_maxunit(ata_devclass) ||
!(device = devclass_get_device(ata_devclass, devices->channel)) ||
- !device_is_attached(device)) {
- newbus_xunlock();
+ !device_is_attached(device))
return ENXIO;
- }
bzero(devices->name[0], 32);
bzero(&devices->params[0], sizeof(struct ata_params));
bzero(devices->name[1], 32);
@@ -473,7 +465,6 @@ ata_ioctl(struct cdev *dev, u_long cmd, caddr_t data,
if (ata_raid_ioctl_func)
error = ata_raid_ioctl_func(cmd, data);
}
- newbus_xunlock();
return error;
}
@@ -581,7 +572,7 @@ ata_boot_attach(void)
struct ata_channel *ch;
int ctlr;
- newbus_xlock();
+ mtx_lock(&Giant); /* newbus suckage it needs Giant */
/* kick of probe and attach on all channels */
for (ctlr = 0; ctlr < devclass_get_maxunit(ata_devclass); ctlr++) {
@@ -596,7 +587,8 @@ ata_boot_attach(void)
free(ata_delayed_attach, M_TEMP);
ata_delayed_attach = NULL;
}
- newbus_xunlock();
+
+ mtx_unlock(&Giant); /* newbus suckage dealt with, release Giant */
}
@@ -725,6 +717,7 @@ ata_identify(device_t dev)
if (bootverbose)
device_printf(dev, "Identifying devices: %08x\n", ch->devices);
+ mtx_lock(&Giant);
/* Skip existing devices. */
if (!device_get_children(dev, &children, &nchildren)) {
for (i = 0; i < nchildren; i++) {
@@ -736,8 +729,10 @@ ata_identify(device_t dev)
/* Create new devices. */
if (bootverbose)
device_printf(dev, "New devices: %08x\n", n);
- if (n == 0)
+ if (n == 0) {
+ mtx_unlock(&Giant);
return (0);
+ }
for (i = 0; i < ATA_PM; ++i) {
if (n & (((ATA_ATA_MASTER | ATA_ATAPI_MASTER) << i))) {
int unit = -1;
@@ -780,6 +775,7 @@ ata_identify(device_t dev)
}
bus_generic_probe(dev);
bus_generic_attach(dev);
+ mtx_unlock(&Giant);
return 0;
}
diff --git a/sys/dev/ata/ata-disk.c b/sys/dev/ata/ata-disk.c
index 15b9edc..c699a05 100644
--- a/sys/dev/ata/ata-disk.c
+++ b/sys/dev/ata/ata-disk.c
@@ -136,8 +136,8 @@ ad_attach(device_t dev)
if ((atadev->param.support.command2 & ATA_SUPPORT_CFA) ||
atadev->param.config == ATA_PROTO_CFA)
adp->disk->d_flags = DISKFLAG_CANDELETE;
- snprintf(adp->disk->d_ident, sizeof(adp->disk->d_ident), "ad:%s",
- atadev->param.serial);
+ strlcpy(adp->disk->d_ident, atadev->param.serial,
+ sizeof(adp->disk->d_ident));
disk_create(adp->disk, DISK_VERSION);
device_add_child(dev, "subdisk", device_get_unit(dev));
ad_firmware_geom_adjust(dev, adp->disk);
diff --git a/sys/dev/ata/ata-dma.c b/sys/dev/ata/ata-dma.c
index afc3550..770b13f 100644
--- a/sys/dev/ata/ata-dma.c
+++ b/sys/dev/ata/ata-dma.c
@@ -272,10 +272,10 @@ ata_dmaload(struct ata_request *request, void *addr, int *entries)
"FAILURE - zero length DMA transfer attempted\n");
return EIO;
}
- if (((uintptr_t)(request->data) & (ch->dma.alignment - 1)) ||
- (request->bytecount & (ch->dma.alignment - 1))) {
+ if (request->bytecount & (ch->dma.alignment - 1)) {
device_printf(request->dev,
- "FAILURE - non aligned DMA transfer attempted\n");
+ "FAILURE - odd-sized DMA transfer attempt %d %% %d\n",
+ request->bytecount, ch->dma.alignment);
return EIO;
}
if (request->bytecount > ch->dma.max_iosize) {
diff --git a/sys/dev/ath/ah_osdep.c b/sys/dev/ath/ah_osdep.c
index 7ba7817..6b11b21 100644
--- a/sys/dev/ath/ah_osdep.c
+++ b/sys/dev/ath/ah_osdep.c
@@ -110,7 +110,7 @@ ath_hal_malloc(size_t size)
void
ath_hal_free(void* p)
{
- return free(p, M_ATH_HAL);
+ free(p, M_ATH_HAL);
}
void
diff --git a/sys/dev/ath/ath_hal/ah_eeprom_v3.c b/sys/dev/ath/ath_hal/ah_eeprom_v3.c
index 20adb31..89a23c9 100644
--- a/sys/dev/ath/ath_hal/ah_eeprom_v3.c
+++ b/sys/dev/ath/ath_hal/ah_eeprom_v3.c
@@ -1759,7 +1759,7 @@ legacyEepromDetach(struct ath_hal *ah)
HAL_EEPROM *ee = AH_PRIVATE(ah)->ah_eeprom;
if (ee->ee_version >= AR_EEPROM_VER4_0 && ee->ee_eepMap == 1)
- return freeEepromRawPowerCalInfo5112(ah, ee);
+ freeEepromRawPowerCalInfo5112(ah, ee);
ath_hal_free(ee);
AH_PRIVATE(ah)->ah_eeprom = AH_NULL;
}
diff --git a/sys/dev/ath/ath_hal/ah_regdomain.c b/sys/dev/ath/ath_hal/ah_regdomain.c
index 814b9ab..fd138a4 100644
--- a/sys/dev/ath/ath_hal/ah_regdomain.c
+++ b/sys/dev/ath/ath_hal/ah_regdomain.c
@@ -573,7 +573,7 @@ static COUNTRY_CODE_TO_ENUM_RD allCountries[] = {
{ CTRY_SWITZERLAND, ETSI1_WORLD },
{ CTRY_SYRIA, NULL1_WORLD },
{ CTRY_TAIWAN, APL3_FCCA },
- { CTRY_THAILAND, NULL1_WORLD },
+ { CTRY_THAILAND, FCC3_WORLD },
{ CTRY_TRINIDAD_Y_TOBAGO,ETSI4_WORLD },
{ CTRY_TUNISIA, ETSI3_WORLD },
{ CTRY_TURKEY, ETSI3_WORLD },
diff --git a/sys/dev/ath/if_ath.c b/sys/dev/ath/if_ath.c
index a789f5e..b6fbaf8 100644
--- a/sys/dev/ath/if_ath.c
+++ b/sys/dev/ath/if_ath.c
@@ -1236,7 +1236,16 @@ ath_resume(struct ath_softc *sc)
if (sc->sc_resume_up) {
if (ic->ic_opmode == IEEE80211_M_STA) {
ath_init(sc);
- ieee80211_beacon_miss(ic);
+ /*
+ * Program the beacon registers using the last rx'd
+ * beacon frame and enable sync on the next beacon
+ * we see. This should handle the case where we
+ * wakeup and find the same AP and also the case where
+ * we wakeup and need to roam. For the latter we
+ * should get bmiss events that trigger a roam.
+ */
+ ath_beacon_config(sc, NULL);
+ sc->sc_syncbeacon = 1;
} else
ieee80211_resume_all(ic);
}
@@ -1443,7 +1452,7 @@ ath_hal_gethangstate(struct ath_hal *ah, uint32_t mask, uint32_t *hangs)
uint32_t rsize;
void *sp;
- if (!ath_hal_getdiagstate(ah, 32, &mask, sizeof(&mask), &sp, &rsize))
+ if (!ath_hal_getdiagstate(ah, 32, &mask, sizeof(mask), &sp, &rsize))
return 0;
KASSERT(rsize == sizeof(uint32_t), ("resultsize %u", rsize));
*hangs = *(uint32_t *)sp;
diff --git a/sys/dev/atkbdc/psm.c b/sys/dev/atkbdc/psm.c
index 1fbdee7..93c9acb 100644
--- a/sys/dev/atkbdc/psm.c
+++ b/sys/dev/atkbdc/psm.c
@@ -1488,9 +1488,7 @@ psmopen(struct cdev *dev, int flag, int fmt, struct thread *td)
if (sc->state & PSM_OPEN)
return (EBUSY);
- newbus_xlock();
device_busy(devclass_get_device(psm_devclass, unit));
- newbus_xunlock();
/* Initialize state */
sc->mode.level = sc->dflt_mode.level;
@@ -1645,9 +1643,7 @@ psmclose(struct cdev *dev, int flag, int fmt, struct thread *td)
/* close is almost always successful */
sc->state &= ~PSM_OPEN;
kbdc_lock(sc->kbdc, FALSE);
- newbus_xlock();
device_unbusy(devclass_get_device(psm_devclass, unit));
- newbus_xunlock();
return (0);
}
diff --git a/sys/dev/bge/if_bge.c b/sys/dev/bge/if_bge.c
index 4528762..db65ec2 100644
--- a/sys/dev/bge/if_bge.c
+++ b/sys/dev/bge/if_bge.c
@@ -3055,12 +3055,14 @@ bge_rxeof(struct bge_softc *sc)
{
struct ifnet *ifp;
int rx_npkts = 0, stdcnt = 0, jumbocnt = 0;
+ uint16_t rx_prod, rx_cons;
BGE_LOCK_ASSERT(sc);
+ rx_cons = sc->bge_rx_saved_considx;
+ rx_prod = sc->bge_ldata.bge_status_block->bge_idx[0].bge_rx_prod_idx;
/* Nothing to do. */
- if (sc->bge_rx_saved_considx ==
- sc->bge_ldata.bge_status_block->bge_idx[0].bge_rx_prod_idx)
+ if (rx_cons == rx_prod)
return (rx_npkts);
ifp = sc->bge_ifp;
@@ -3073,8 +3075,7 @@ bge_rxeof(struct bge_softc *sc)
bus_dmamap_sync(sc->bge_cdata.bge_rx_jumbo_ring_tag,
sc->bge_cdata.bge_rx_jumbo_ring_map, BUS_DMASYNC_POSTREAD);
- while (sc->bge_rx_saved_considx !=
- sc->bge_ldata.bge_status_block->bge_idx[0].bge_rx_prod_idx) {
+ while (rx_cons != rx_prod) {
struct bge_rx_bd *cur_rx;
uint32_t rxidx;
struct mbuf *m = NULL;
@@ -3089,11 +3090,10 @@ bge_rxeof(struct bge_softc *sc)
}
#endif
- cur_rx =
- &sc->bge_ldata.bge_rx_return_ring[sc->bge_rx_saved_considx];
+ cur_rx = &sc->bge_ldata.bge_rx_return_ring[rx_cons];
rxidx = cur_rx->bge_idx;
- BGE_INC(sc->bge_rx_saved_considx, sc->bge_return_ring_cnt);
+ BGE_INC(rx_cons, sc->bge_return_ring_cnt);
if (ifp->if_capenable & IFCAP_VLAN_HWTAGGING &&
cur_rx->bge_flags & BGE_RXBDFLAG_VLAN_TAG) {
@@ -3207,6 +3207,7 @@ bge_rxeof(struct bge_softc *sc)
bus_dmamap_sync(sc->bge_cdata.bge_rx_jumbo_ring_tag,
sc->bge_cdata.bge_rx_jumbo_ring_map, BUS_DMASYNC_PREWRITE);
+ sc->bge_rx_saved_considx = rx_cons;
bge_writembx(sc, BGE_MBX_RX_CONS0_LO, sc->bge_rx_saved_considx);
if (stdcnt)
bge_writembx(sc, BGE_MBX_RX_STD_PROD_LO, sc->bge_std);
diff --git a/sys/dev/bktr/bktr_os.c b/sys/dev/bktr/bktr_os.c
index 1fd458c..327c4bb 100644
--- a/sys/dev/bktr/bktr_os.c
+++ b/sys/dev/bktr/bktr_os.c
@@ -597,9 +597,7 @@ bktr_open( struct cdev *dev, int flags, int fmt, struct thread *td )
return( ENXIO );
/* Record that the device is now busy */
- newbus_xlock();
device_busy(devclass_get_device(bktr_devclass, unit));
- newbus_xunlock();
if (bt848_card != -1) {
@@ -670,11 +668,8 @@ bktr_open( struct cdev *dev, int flags, int fmt, struct thread *td )
}
/* If there was an error opening the device, undo the busy status */
- if (result != 0) {
- newbus_xlock();
+ if (result != 0)
device_unbusy(devclass_get_device(bktr_devclass, unit));
- newbus_xunlock();
- }
return( result );
}
@@ -694,7 +689,6 @@ bktr_close( struct cdev *dev, int flags, int fmt, struct thread *td )
/* Get the device data */
bktr = (struct bktr_softc*)devclass_get_softc(bktr_devclass, unit);
if (bktr == NULL) {
-
/* the device is no longer valid/functioning */
return (ENXIO);
}
@@ -711,11 +705,10 @@ bktr_close( struct cdev *dev, int flags, int fmt, struct thread *td )
break;
default:
return (ENXIO);
+ break;
}
- newbus_xlock();
device_unbusy(devclass_get_device(bktr_devclass, unit));
- newbus_xunlock();
return( result );
}
diff --git a/sys/dev/coretemp/coretemp.c b/sys/dev/coretemp/coretemp.c
index d639eec..0226c8f 100644
--- a/sys/dev/coretemp/coretemp.c
+++ b/sys/dev/coretemp/coretemp.c
@@ -48,6 +48,8 @@ __FBSDID("$FreeBSD$");
#include <machine/cputypes.h>
#include <machine/md_var.h>
+#define TZ_ZEROC 2732
+
struct coretemp_softc {
device_t sc_dev;
int sc_tjmax;
@@ -193,8 +195,8 @@ coretemp_attach(device_t dev)
SYSCTL_CHILDREN(device_get_sysctl_tree(pdev)),
OID_AUTO, "temperature",
CTLTYPE_INT | CTLFLAG_RD,
- dev, 0, coretemp_get_temp_sysctl, "I",
- "Current temperature in degC");
+ dev, 0, coretemp_get_temp_sysctl, "IK",
+ "Current temperature");
return (0);
}
@@ -283,7 +285,7 @@ coretemp_get_temp_sysctl(SYSCTL_HANDLER_ARGS)
device_t dev = (device_t) arg1;
int temp;
- temp = coretemp_get_temp(dev);
+ temp = coretemp_get_temp(dev) * 10 + TZ_ZEROC;
return (sysctl_handle_int(oidp, &temp, 0, req));
}
diff --git a/sys/dev/cxgb/cxgb_main.c b/sys/dev/cxgb/cxgb_main.c
index 21ce96d..596609b 100644
--- a/sys/dev/cxgb/cxgb_main.c
+++ b/sys/dev/cxgb/cxgb_main.c
@@ -1456,7 +1456,10 @@ setup_rss(adapter_t *adap)
rspq_map[i] = nq[0] ? i % nq[0] : 0;
rspq_map[i + RSS_TABLE_SIZE / 2] = nq[1] ? i % nq[1] + nq[0] : 0;
}
+
/* Calculate the reverse RSS map table */
+ for (i = 0; i < SGE_QSETS; ++i)
+ adap->rrss_map[i] = 0xff;
for (i = 0; i < RSS_TABLE_SIZE; ++i)
if (adap->rrss_map[rspq_map[i]] == 0xff)
adap->rrss_map[rspq_map[i]] = i;
diff --git a/sys/dev/drm/drmP.h b/sys/dev/drm/drmP.h
index e630f86..cad2cee 100644
--- a/sys/dev/drm/drmP.h
+++ b/sys/dev/drm/drmP.h
@@ -148,6 +148,8 @@ MALLOC_DECLARE(DRM_MEM_CTXBITMAP);
MALLOC_DECLARE(DRM_MEM_SGLISTS);
MALLOC_DECLARE(DRM_MEM_DRAWABLE);
+SYSCTL_DECL(_hw_drm);
+
#define DRM_MAX_CTXBITMAP (PAGE_SIZE * 8)
/* Internal types and structures */
@@ -416,7 +418,6 @@ struct drm_file {
struct drm_device *dev;
int authenticated;
int master;
- int minor;
pid_t pid;
uid_t uid;
drm_magic_t magic;
diff --git a/sys/dev/drm/drm_bufs.c b/sys/dev/drm/drm_bufs.c
index 647dee9..bd31b0a 100644
--- a/sys/dev/drm/drm_bufs.c
+++ b/sys/dev/drm/drm_bufs.c
@@ -45,27 +45,35 @@ __FBSDID("$FreeBSD$");
*/
static int drm_alloc_resource(struct drm_device *dev, int resource)
{
+ struct resource *res;
+ int rid;
+
+ DRM_SPINLOCK_ASSERT(&dev->dev_lock);
+
if (resource >= DRM_MAX_PCI_RESOURCE) {
DRM_ERROR("Resource %d too large\n", resource);
return 1;
}
- DRM_UNLOCK();
if (dev->pcir[resource] != NULL) {
- DRM_LOCK();
return 0;
}
- dev->pcirid[resource] = PCIR_BAR(resource);
- dev->pcir[resource] = bus_alloc_resource_any(dev->device,
- SYS_RES_MEMORY, &dev->pcirid[resource], RF_SHAREABLE);
+ DRM_UNLOCK();
+ rid = PCIR_BAR(resource);
+ res = bus_alloc_resource_any(dev->device, SYS_RES_MEMORY, &rid,
+ RF_SHAREABLE);
DRM_LOCK();
-
- if (dev->pcir[resource] == NULL) {
+ if (res == NULL) {
DRM_ERROR("Couldn't find resource 0x%x\n", resource);
return 1;
}
+ if (dev->pcir[resource] == NULL) {
+ dev->pcirid[resource] = rid;
+ dev->pcir[resource] = res;
+ }
+
return 0;
}
diff --git a/sys/dev/drm/drm_drv.c b/sys/dev/drm/drm_drv.c
index e12f8cd..c690c34 100644
--- a/sys/dev/drm/drm_drv.c
+++ b/sys/dev/drm/drm_drv.c
@@ -53,9 +53,6 @@ static void drm_unload(struct drm_device *dev);
static drm_pci_id_list_t *drm_find_description(int vendor, int device,
drm_pci_id_list_t *idlist);
-#define DRIVER_SOFTC(unit) \
- ((struct drm_device *)devclass_get_softc(drm_devclass, unit))
-
MODULE_VERSION(drm, 1);
MODULE_DEPEND(drm, agp, 1, 1, 1);
MODULE_DEPEND(drm, pci, 1, 1, 1);
@@ -136,6 +133,9 @@ static struct cdevsw drm_cdevsw = {
static int drm_msi = 1; /* Enable by default. */
TUNABLE_INT("hw.drm.msi", &drm_msi);
+SYSCTL_NODE(_hw, OID_AUTO, drm, CTLFLAG_RW, NULL, "DRM device");
+SYSCTL_INT(_hw_drm, OID_AUTO, msi, CTLFLAG_RDTUN, &drm_msi, 1,
+ "Enable MSI interrupts for drm devices");
static struct drm_msi_blacklist_entry drm_msi_blacklist[] = {
{0x8086, 0x2772}, /* Intel i945G */ \
@@ -210,11 +210,12 @@ int drm_attach(device_t kdev, drm_pci_id_list_t *idlist)
dev->device = kdev;
#endif
dev->devnode = make_dev(&drm_cdevsw,
- unit,
+ 0,
DRM_DEV_UID,
DRM_DEV_GID,
DRM_DEV_MODE,
"dri/card%d", unit);
+ dev->devnode->si_drv1 = dev;
#if __FreeBSD_version >= 700053
dev->pci_domain = pci_get_domain(dev->device);
@@ -606,7 +607,7 @@ int drm_open(struct cdev *kdev, int flags, int fmt, DRM_STRUCTPROC *p)
struct drm_device *dev = NULL;
int retcode = 0;
- dev = DRIVER_SOFTC(dev2unit(kdev));
+ dev = kdev->si_drv1;
DRM_DEBUG("open_count = %d\n", dev->open_count);
@@ -614,13 +615,11 @@ int drm_open(struct cdev *kdev, int flags, int fmt, DRM_STRUCTPROC *p)
if (!retcode) {
atomic_inc(&dev->counts[_DRM_STAT_OPENS]);
- newbus_xlock();
DRM_LOCK();
device_busy(dev->device);
if (!dev->open_count++)
retcode = drm_firstopen(dev);
DRM_UNLOCK();
- newbus_xunlock();
}
return retcode;
@@ -634,11 +633,6 @@ void drm_close(void *data)
DRM_DEBUG("open_count = %d\n", dev->open_count);
- /*
- * We require to lock newbus here for handling device_unbusy() and
- * avoid a LOR with DRM_LOCK.
- */
- newbus_xlock();
DRM_LOCK();
if (dev->driver->preclose != NULL)
@@ -715,7 +709,6 @@ void drm_close(void *data)
}
DRM_UNLOCK();
- newbus_xunlock();
}
/* drm_ioctl is called whenever a process performs an ioctl on /dev/drm.
diff --git a/sys/dev/drm/drm_fops.c b/sys/dev/drm/drm_fops.c
index f766928..3f743e0 100644
--- a/sys/dev/drm/drm_fops.c
+++ b/sys/dev/drm/drm_fops.c
@@ -44,14 +44,13 @@ int drm_open_helper(struct cdev *kdev, int flags, int fmt, DRM_STRUCTPROC *p,
struct drm_device *dev)
{
struct drm_file *priv;
- int m = dev2unit(kdev);
int retcode;
if (flags & O_EXCL)
return EBUSY; /* No exclusive opens */
dev->flags = flags;
- DRM_DEBUG("pid = %d, minor = %d\n", DRM_CURRENTPID, m);
+ DRM_DEBUG("pid = %d, device = %s\n", DRM_CURRENTPID, devtoname(kdev));
priv = malloc(sizeof(*priv), DRM_MEM_FILES, M_NOWAIT | M_ZERO);
if (priv == NULL) {
@@ -68,7 +67,6 @@ int drm_open_helper(struct cdev *kdev, int flags, int fmt, DRM_STRUCTPROC *p,
priv->dev = dev;
priv->uid = p->td_ucred->cr_svuid;
priv->pid = p->td_proc->p_pid;
- priv->minor = m;
priv->ioctl_count = 0;
/* for compatibility root is always authenticated */
diff --git a/sys/dev/drm/drm_pciids.h b/sys/dev/drm/drm_pciids.h
index 4562e5f..3b2347e 100644
--- a/sys/dev/drm/drm_pciids.h
+++ b/sys/dev/drm/drm_pciids.h
@@ -259,9 +259,12 @@
{0x1002, 0x940F, CHIP_R600|RADEON_NEW_MEMMAP, "ATI FireGL V7600"}, \
{0x1002, 0x94A0, CHIP_RV740|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon HD 4830"}, \
{0x1002, 0x94A1, CHIP_RV740|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon HD 4850"}, \
+ {0x1002, 0x94A3, CHIP_RV740|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI FirePro M7740"}, \
{0x1002, 0x94B1, CHIP_RV740|RADEON_NEW_MEMMAP, "ATI RV740"}, \
{0x1002, 0x94B3, CHIP_RV740|RADEON_NEW_MEMMAP, "ATI Radeon HD 4770"}, \
+ {0x1002, 0x94B4, CHIP_RV740|RADEON_NEW_MEMMAP, "ATI Radeon HD 4700 Series"}, \
{0x1002, 0x94B5, CHIP_RV740|RADEON_NEW_MEMMAP, "ATI Radeon HD 4770"}, \
+ {0x1002, 0x94B9, CHIP_RV740|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI FirePro M5750"}, \
{0x1002, 0x94C0, CHIP_RV610|RADEON_NEW_MEMMAP, "RV610"}, \
{0x1002, 0x94C1, CHIP_RV610|RADEON_NEW_MEMMAP, "Radeon HD 2400 XT"}, \
{0x1002, 0x94C3, CHIP_RV610|RADEON_NEW_MEMMAP, "Radeon HD 2400 Pro"}, \
@@ -327,6 +330,11 @@
{0x1002, 0x9614, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP, "ATI Radeon 3300 Graphics"}, \
{0x1002, 0x9615, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP, "ATI Radeon 3200 Graphics"}, \
{0x1002, 0x9616, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP, "ATI Radeon 3000 Graphics"}, \
+ {0x1002, 0x9710, CHIP_RS880|RADEON_NEW_MEMMAP|RADEON_IS_IGP, "ATI Radeon HD 4200"}, \
+ {0x1002, 0x9711, CHIP_RS880|RADEON_NEW_MEMMAP|RADEON_IS_IGP, "ATI Radeon 4100"}, \
+ {0x1002, 0x9712, CHIP_RS880|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP, "ATI Mobility Radeon HD 4200"}, \
+ {0x1002, 0x9713, CHIP_RS880|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP, "ATI Mobility Radeon 4100"}, \
+ {0x1002, 0x9714, CHIP_RS880|RADEON_NEW_MEMMAP|RADEON_IS_IGP, "ATI RS880"}, \
{0x1002, 0x9440, CHIP_RV770|RADEON_NEW_MEMMAP, "ATI Radeon 4800 Series"}, \
{0x1002, 0x9441, CHIP_RV770|RADEON_NEW_MEMMAP, "ATI Radeon 4870 X2"}, \
{0x1002, 0x9442, CHIP_RV770|RADEON_NEW_MEMMAP, "ATI Radeon 4800 Series"}, \
@@ -350,6 +358,7 @@
{0x1002, 0x9487, CHIP_RV730|RADEON_NEW_MEMMAP, "ATI Radeon RV730 (AGP)"}, \
{0x1002, 0x948F, CHIP_RV730|RADEON_NEW_MEMMAP, "ATI Radeon RV730 (AGP)"}, \
{0x1002, 0x9490, CHIP_RV730|RADEON_NEW_MEMMAP, "ATI Radeon HD 4670"}, \
+ {0x1002, 0x9495, CHIP_RV730|RADEON_NEW_MEMMAP, "ATI Radeon HD 4600 Series"}, \
{0x1002, 0x9498, CHIP_RV730|RADEON_NEW_MEMMAP, "ATI Radeon HD 4650"}, \
{0x1002, 0x9480, CHIP_RV730|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon HD 4650"}, \
{0x1002, 0x9488, CHIP_RV730|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon HD 4670"}, \
@@ -366,6 +375,7 @@
{0x1002, 0x9552, CHIP_RV710|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon 4300 Series"}, \
{0x1002, 0x9553, CHIP_RV710|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon 4500 Series"}, \
{0x1002, 0x9555, CHIP_RV710|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI Mobility Radeon 4500 Series"}, \
+ {0x1002, 0x9557, CHIP_RV710|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP, "ATI FirePro RG220"}, \
{0, 0, 0, NULL}
#define r128_PCI_IDS \
diff --git a/sys/dev/drm/drm_sysctl.c b/sys/dev/drm/drm_sysctl.c
index 0d59d48..cc33283 100644
--- a/sys/dev/drm/drm_sysctl.c
+++ b/sys/dev/drm/drm_sysctl.c
@@ -298,12 +298,13 @@ static int drm_clients_info DRM_SYSCTL_HANDLER_ARGS
DRM_UNLOCK();
- DRM_SYSCTL_PRINT("\na dev pid uid magic ioctls\n");
+ DRM_SYSCTL_PRINT(
+ "\na dev pid uid magic ioctls\n");
for (i = 0; i < privcount; i++) {
priv = &tempprivs[i];
- DRM_SYSCTL_PRINT("%c %3d %5d %5d %10u %10lu\n",
+ DRM_SYSCTL_PRINT("%c %-12s %5d %5d %10u %10lu\n",
priv->authenticated ? 'y' : 'n',
- priv->minor,
+ devtoname(priv->dev->devnode),
priv->pid,
priv->uid,
priv->magic,
diff --git a/sys/dev/drm/r600_cp.c b/sys/dev/drm/r600_cp.c
index 64e98ce..2a4a6bd 100644
--- a/sys/dev/drm/r600_cp.c
+++ b/sys/dev/drm/r600_cp.c
@@ -318,7 +318,8 @@ static void r600_cp_load_microcode(drm_radeon_private_t *dev_priv)
pfp = RV670_pfp_microcode;
break;
case CHIP_RS780:
- DRM_INFO("Loading RS780 Microcode\n");
+ case CHIP_RS880:
+ DRM_INFO("Loading RS780/RS880 Microcode\n");
cp = RS780_cp_microcode;
pfp = RS780_pfp_microcode;
break;
@@ -722,6 +723,7 @@ static void r600_gfx_init(struct drm_device *dev,
break;
case CHIP_RV610:
case CHIP_RS780:
+ case CHIP_RS880:
case CHIP_RV620:
dev_priv->r600_max_pipes = 1;
dev_priv->r600_max_tile_pipes = 1;
@@ -856,7 +858,8 @@ static void r600_gfx_init(struct drm_device *dev,
((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV630) ||
((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV610) ||
((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV620) ||
- ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780))
+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780) ||
+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS880))
RADEON_WRITE(R600_DB_DEBUG, R600_PREZ_MUST_WAIT_FOR_POSTZ_DONE);
else
RADEON_WRITE(R600_DB_DEBUG, 0);
@@ -874,7 +877,8 @@ static void r600_gfx_init(struct drm_device *dev,
sq_ms_fifo_sizes = RADEON_READ(R600_SQ_MS_FIFO_SIZES);
if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV610) ||
((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV620) ||
- ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780)) {
+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780) ||
+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS880)) {
sq_ms_fifo_sizes = (R600_CACHE_FIFO_SIZE(0xa) |
R600_FETCH_FIFO_HIWATER(0xa) |
R600_DONE_FIFO_HIWATER(0xe0) |
@@ -917,7 +921,8 @@ static void r600_gfx_init(struct drm_device *dev,
R600_NUM_ES_STACK_ENTRIES(0));
} else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV610) ||
((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV620) ||
- ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780)) {
+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780) ||
+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS880)) {
/* no vertex cache */
sq_config &= ~R600_VC_ENABLE;
@@ -974,7 +979,8 @@ static void r600_gfx_init(struct drm_device *dev,
if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV610) ||
((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV620) ||
- ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780))
+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780) ||
+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS880))
RADEON_WRITE(R600_VGT_CACHE_INVALIDATION, R600_CACHE_INVALIDATION(R600_TC_ONLY));
else
RADEON_WRITE(R600_VGT_CACHE_INVALIDATION, R600_CACHE_INVALIDATION(R600_VC_AND_TC));
@@ -1017,6 +1023,7 @@ static void r600_gfx_init(struct drm_device *dev,
break;
case CHIP_RV610:
case CHIP_RS780:
+ case CHIP_RS880:
case CHIP_RV620:
gs_prim_buffer_depth = 32;
break;
@@ -1062,6 +1069,7 @@ static void r600_gfx_init(struct drm_device *dev,
switch (dev_priv->flags & RADEON_FAMILY_MASK) {
case CHIP_RV610:
case CHIP_RS780:
+ case CHIP_RS880:
case CHIP_RV620:
tc_cntl = R600_TC_L2_SIZE(8);
break;
@@ -1835,6 +1843,7 @@ int r600_do_init_cp(struct drm_device *dev, drm_radeon_init_t *init,
*/
dev_priv->vblank_crtc = DRM_RADEON_VBLANK_CRTC1;
+ dev_priv->do_boxes = 0;
dev_priv->cp_mode = init->cp_mode;
/* We don't support anything other than bus-mastering ring mode,
@@ -2092,6 +2101,8 @@ int r600_do_init_cp(struct drm_device *dev, drm_radeon_init_t *init,
r600_do_engine_reset(dev);
r600_test_writeback(dev_priv);
+ r600_cs_init(dev);
+
return 0;
}
@@ -2224,3 +2235,135 @@ int r600_cp_dispatch_indirect(struct drm_device *dev,
return 0;
}
+
+void r600_cp_dispatch_swap(struct drm_device * dev)
+{
+ drm_radeon_private_t *dev_priv = dev->dev_private;
+ drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv;
+ int nbox = sarea_priv->nbox;
+ struct drm_clip_rect *pbox = sarea_priv->boxes;
+ int i, cpp, src_pitch, dst_pitch;
+ uint64_t src, dst;
+ RING_LOCALS;
+ DRM_DEBUG("\n");
+
+ if (dev_priv->color_fmt == RADEON_COLOR_FORMAT_ARGB8888)
+ cpp = 4;
+ else
+ cpp = 2;
+
+ if (dev_priv->sarea_priv->pfCurrentPage == 0) {
+ src_pitch = dev_priv->back_pitch;
+ dst_pitch = dev_priv->front_pitch;
+ src = dev_priv->back_offset + dev_priv->fb_location;
+ dst = dev_priv->front_offset + dev_priv->fb_location;
+ } else {
+ src_pitch = dev_priv->front_pitch;
+ dst_pitch = dev_priv->back_pitch;
+ src = dev_priv->front_offset + dev_priv->fb_location;
+ dst = dev_priv->back_offset + dev_priv->fb_location;
+ }
+
+ if (r600_prepare_blit_copy(dev)) {
+ DRM_ERROR("unable to allocate vertex buffer for swap buffer\n");
+ return;
+ }
+ for (i = 0; i < nbox; i++) {
+ int x = pbox[i].x1;
+ int y = pbox[i].y1;
+ int w = pbox[i].x2 - x;
+ int h = pbox[i].y2 - y;
+
+ DRM_DEBUG("%d,%d-%d,%d\n", x, y, w, h);
+
+ r600_blit_swap(dev,
+ src, dst,
+ x, y, x, y, w, h,
+ src_pitch, dst_pitch, cpp);
+ }
+ r600_done_blit_copy(dev);
+
+ /* Increment the frame counter. The client-side 3D driver must
+ * throttle the framerate by waiting for this value before
+ * performing the swapbuffer ioctl.
+ */
+ dev_priv->sarea_priv->last_frame++;
+
+ BEGIN_RING(3);
+ R600_FRAME_AGE(dev_priv->sarea_priv->last_frame);
+ ADVANCE_RING();
+}
+
+int r600_cp_dispatch_texture(struct drm_device * dev,
+ struct drm_file *file_priv,
+ drm_radeon_texture_t * tex,
+ drm_radeon_tex_image_t * image)
+{
+ drm_radeon_private_t *dev_priv = dev->dev_private;
+ struct drm_buf *buf;
+ u32 *buffer;
+ const u8 __user *data;
+ int size, pass_size;
+ u64 src_offset, dst_offset;
+
+ if (!radeon_check_offset(dev_priv, tex->offset)) {
+ DRM_ERROR("Invalid destination offset\n");
+ return -EINVAL;
+ }
+
+ /* this might fail for zero-sized uploads - are those illegal? */
+ if (!radeon_check_offset(dev_priv, tex->offset + tex->height * tex->pitch - 1)) {
+ DRM_ERROR("Invalid final destination offset\n");
+ return -EINVAL;
+ }
+
+ size = tex->height * tex->pitch;
+
+ if (size == 0)
+ return 0;
+
+ dst_offset = tex->offset;
+
+ r600_prepare_blit_copy(dev);
+ do {
+ data = (const u8 __user *)image->data;
+ pass_size = size;
+
+ buf = radeon_freelist_get(dev);
+ if (!buf) {
+ DRM_DEBUG("EAGAIN\n");
+ if (DRM_COPY_TO_USER(tex->image, image, sizeof(*image)))
+ return -EFAULT;
+ return -EAGAIN;
+ }
+
+ if (pass_size > buf->total)
+ pass_size = buf->total;
+
+ /* Dispatch the indirect buffer.
+ */
+ buffer =
+ (u32 *) ((char *)dev->agp_buffer_map->handle + buf->offset);
+
+ if (DRM_COPY_FROM_USER(buffer, data, pass_size)) {
+ DRM_ERROR("EFAULT on pad, %d bytes\n", pass_size);
+ return -EFAULT;
+ }
+
+ buf->file_priv = file_priv;
+ buf->used = pass_size;
+ src_offset = dev_priv->gart_buffers_offset + buf->offset;
+
+ r600_blit_copy(dev, src_offset, dst_offset, pass_size);
+
+ radeon_cp_discard_buffer(dev, buf);
+
+ /* Update the input parameters for next time */
+ image->data = (const u8 __user *)image->data + pass_size;
+ dst_offset += pass_size;
+ size -= pass_size;
+ } while (size > 0);
+ r600_done_blit_copy(dev);
+
+ return 0;
+}
diff --git a/sys/dev/drm/radeon_cp.c b/sys/dev/drm/radeon_cp.c
index 3d8cf9d..734fafa 100644
--- a/sys/dev/drm/radeon_cp.c
+++ b/sys/dev/drm/radeon_cp.c
@@ -408,6 +408,15 @@ static void radeon_init_pipes(drm_radeon_private_t *dev_priv)
{
uint32_t gb_tile_config, gb_pipe_sel = 0;
+ if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV530) {
+ uint32_t z_pipe_sel = RADEON_READ(RV530_GB_PIPE_SELECT2);
+ if ((z_pipe_sel & 3) == 3)
+ dev_priv->num_z_pipes = 2;
+ else
+ dev_priv->num_z_pipes = 1;
+ } else
+ dev_priv->num_z_pipes = 1;
+
/* RS4xx/RS6xx/R4xx/R5xx */
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R420) {
gb_pipe_sel = RADEON_READ(R400_GB_PIPE_SELECT);
@@ -2060,6 +2069,8 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags)
else
dev_priv->flags |= RADEON_IS_PCI;
+ mtx_init(&dev_priv->cs.cs_mutex, "cs_mtx", NULL, MTX_DEF);
+
ret = drm_addmap(dev, drm_get_resource_start(dev, 2),
drm_get_resource_len(dev, 2), _DRM_REGISTERS,
_DRM_READ_ONLY | _DRM_DRIVER, &dev_priv->mmio);
@@ -2112,6 +2123,8 @@ int radeon_driver_unload(struct drm_device *dev)
drm_rmmap(dev, dev_priv->mmio);
+ mtx_destroy(&dev_priv->cs.cs_mutex);
+
drm_free(dev_priv, sizeof(*dev_priv), DRM_MEM_DRIVER);
dev->dev_private = NULL;
@@ -2126,9 +2139,9 @@ void radeon_commit_ring(drm_radeon_private_t *dev_priv)
/* check if the ring is padded out to 16-dword alignment */
- tail_aligned = dev_priv->ring.tail & 0xf;
+ tail_aligned = dev_priv->ring.tail & (RADEON_RING_ALIGN - 1);
if (tail_aligned) {
- int num_p2 = 16 - tail_aligned;
+ int num_p2 = RADEON_RING_ALIGN - tail_aligned;
ring = dev_priv->ring.start;
/* pad with some CP_PACKET2 */
diff --git a/sys/dev/drm/radeon_drm.h b/sys/dev/drm/radeon_drm.h
index 70d3aaa..11f2fcb 100644
--- a/sys/dev/drm/radeon_drm.h
+++ b/sys/dev/drm/radeon_drm.h
@@ -497,6 +497,8 @@ typedef struct {
#define DRM_RADEON_SURF_ALLOC 0x1a
#define DRM_RADEON_SURF_FREE 0x1b
+#define DRM_RADEON_CS 0x26
+
#define DRM_IOCTL_RADEON_CP_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CP_INIT, drm_radeon_init_t)
#define DRM_IOCTL_RADEON_CP_START DRM_IO( DRM_COMMAND_BASE + DRM_RADEON_CP_START)
#define DRM_IOCTL_RADEON_CP_STOP DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CP_STOP, drm_radeon_cp_stop_t)
@@ -524,6 +526,7 @@ typedef struct {
#define DRM_IOCTL_RADEON_SETPARAM DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_SETPARAM, drm_radeon_setparam_t)
#define DRM_IOCTL_RADEON_SURF_ALLOC DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_SURF_ALLOC, drm_radeon_surface_alloc_t)
#define DRM_IOCTL_RADEON_SURF_FREE DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_SURF_FREE, drm_radeon_surface_free_t)
+#define DRM_IOCTL_RADEON_CS DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_CS, struct drm_radeon_cs)
typedef struct drm_radeon_init {
enum {
@@ -685,6 +688,8 @@ typedef struct drm_radeon_indirect {
#define RADEON_PARAM_VBLANK_CRTC 13 /* VBLANK CRTC */
#define RADEON_PARAM_FB_LOCATION 14 /* FB location */
#define RADEON_PARAM_NUM_GB_PIPES 15 /* num GB pipes */
+#define RADEON_PARAM_DEVICE_ID 16
+#define RADEON_PARAM_NUM_Z_PIPES 17 /* num Z pipes */
typedef struct drm_radeon_getparam {
int param;
@@ -755,4 +760,23 @@ typedef struct drm_radeon_surface_free {
#define DRM_RADEON_VBLANK_CRTC1 1
#define DRM_RADEON_VBLANK_CRTC2 2
+/* New interface which obsolete all previous interface.
+ */
+#define RADEON_CHUNK_ID_RELOCS 0x01
+#define RADEON_CHUNK_ID_IB 0x02
+#define RADEON_CHUNK_ID_OLD 0xff
+
+struct drm_radeon_cs_chunk {
+ uint32_t chunk_id;
+ uint32_t length_dw;
+ uint64_t chunk_data;
+};
+
+struct drm_radeon_cs {
+ uint32_t num_chunks;
+ uint32_t cs_id;
+ uint64_t chunks; /* this points to uint64_t * which point to
+ cs chunks */
+};
+
#endif
diff --git a/sys/dev/drm/radeon_drv.h b/sys/dev/drm/radeon_drv.h
index ae1166f..a1cd48b 100644
--- a/sys/dev/drm/radeon_drv.h
+++ b/sys/dev/drm/radeon_drv.h
@@ -41,7 +41,7 @@ __FBSDID("$FreeBSD$");
#define DRIVER_NAME "radeon"
#define DRIVER_DESC "ATI Radeon"
-#define DRIVER_DATE "20080528"
+#define DRIVER_DATE "20080613"
/* Interface history:
*
@@ -102,9 +102,11 @@ __FBSDID("$FreeBSD$");
* 1.27- Add support for IGP GART
* 1.28- Add support for VBL on CRTC2
* 1.29- R500 3D cmd buffer support
+ * 1.30- Add support for occlusion queries
+ * 1.31- Add support for num Z pipes from GET_PARAM
*/
#define DRIVER_MAJOR 1
-#define DRIVER_MINOR 29
+#define DRIVER_MINOR 31
#define DRIVER_PATCHLEVEL 0
/*
@@ -145,6 +147,7 @@ enum radeon_family {
CHIP_RV635,
CHIP_RV670,
CHIP_RS780,
+ CHIP_RS880,
CHIP_RV770,
CHIP_RV740,
CHIP_RV730,
@@ -235,6 +238,46 @@ struct radeon_virt_surface {
#define PCIGART_FILE_PRIV ((void *) -1L)
};
+struct drm_radeon_kernel_chunk {
+ uint32_t chunk_id;
+ uint32_t length_dw;
+ uint32_t __user *chunk_data;
+ uint32_t *kdata;
+};
+
+struct drm_radeon_cs_parser {
+ struct drm_device *dev;
+ struct drm_file *file_priv;
+ uint32_t num_chunks;
+ struct drm_radeon_kernel_chunk *chunks;
+ int ib_index;
+ int reloc_index;
+ uint32_t card_offset;
+ void *ib;
+};
+
+/* command submission struct */
+struct drm_radeon_cs_priv {
+ struct mtx cs_mutex;
+ uint32_t id_wcnt;
+ uint32_t id_scnt;
+ uint32_t id_last_wcnt;
+ uint32_t id_last_scnt;
+
+ int (*parse)(struct drm_radeon_cs_parser *parser);
+ void (*id_emit)(struct drm_radeon_cs_parser *parser, uint32_t *id);
+ uint32_t (*id_last_get)(struct drm_device *dev);
+ /* this ib handling callback are for hidding memory manager drm
+ * from memory manager less drm, free have to emit ib discard
+ * sequence into the ring */
+ int (*ib_get)(struct drm_radeon_cs_parser *parser);
+ uint32_t (*ib_get_ptr)(struct drm_device *dev, void *ib);
+ void (*ib_free)(struct drm_radeon_cs_parser *parser, int error);
+ /* do a relocation either MM or non-MM */
+ int (*relocate)(struct drm_radeon_cs_parser *parser,
+ uint32_t *reloc, uint64_t *offset);
+};
+
#define RADEON_FLUSH_EMITED (1 << 0)
#define RADEON_PURGE_EMITED (1 << 1)
@@ -327,6 +370,7 @@ typedef struct drm_radeon_private {
unsigned long fb_aper_offset;
int num_gb_pipes;
+ int num_z_pipes;
int track_flush;
drm_local_map_t *mmio;
@@ -348,6 +392,12 @@ typedef struct drm_radeon_private {
int r700_sc_prim_fifo_size;
int r700_sc_hiz_tile_fifo_size;
int r700_sc_earlyz_tile_fifo_fize;
+ /* r6xx/r7xx drm blit vertex buffer */
+ struct drm_buf *blit_vb;
+
+ /* CS */
+ struct drm_radeon_cs_priv cs;
+ struct drm_buf *cs_buf;
} drm_radeon_private_t;
@@ -378,10 +428,10 @@ extern void radeon_set_ring_head(drm_radeon_private_t *dev_priv, u32 val);
static __inline__ int radeon_check_offset(drm_radeon_private_t *dev_priv,
u64 off)
{
- u32 fb_start = dev_priv->fb_location;
- u32 fb_end = fb_start + dev_priv->fb_size - 1;
- u32 gart_start = dev_priv->gart_vm_start;
- u32 gart_end = gart_start + dev_priv->gart_size - 1;
+ u64 fb_start = dev_priv->fb_location;
+ u64 fb_end = fb_start + dev_priv->fb_size - 1;
+ u64 gart_start = dev_priv->gart_vm_start;
+ u64 gart_end = gart_start + dev_priv->gart_size - 1;
return ((off >= fb_start && off <= fb_end) ||
(off >= gart_start && off <= gart_end));
@@ -475,6 +525,33 @@ extern int r600_cp_dispatch_indirect(struct drm_device *dev,
struct drm_buf *buf, int start, int end);
extern int r600_page_table_init(struct drm_device *dev);
extern void r600_page_table_cleanup(struct drm_device *dev, struct drm_ati_pcigart_info *gart_info);
+extern void r600_cp_dispatch_swap(struct drm_device * dev);
+extern int r600_cp_dispatch_texture(struct drm_device * dev,
+ struct drm_file *file_priv,
+ drm_radeon_texture_t * tex,
+ drm_radeon_tex_image_t * image);
+
+/* r600_blit.c */
+extern int
+r600_prepare_blit_copy(struct drm_device *dev);
+extern void
+r600_done_blit_copy(struct drm_device *dev);
+extern void
+r600_blit_copy(struct drm_device *dev,
+ uint64_t src_gpu_addr, uint64_t dst_gpu_addr,
+ int size_bytes);
+extern void
+r600_blit_swap(struct drm_device *dev,
+ uint64_t src_gpu_addr, uint64_t dst_gpu_addr,
+ int sx, int sy, int dx, int dy,
+ int w, int h, int src_pitch, int dst_pitch, int cpp);
+
+/* radeon_state.c */
+extern void radeon_cp_discard_buffer(struct drm_device * dev, struct drm_buf * buf);
+
+/* radeon_cs.c */
+extern int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *fpriv);
+extern int r600_cs_init(struct drm_device *dev);
/* Flags for stats.boxes
*/
@@ -684,6 +761,7 @@ extern void r600_page_table_cleanup(struct drm_device *dev, struct drm_ati_pciga
/* pipe config regs */
#define R400_GB_PIPE_SELECT 0x402c
+#define RV530_GB_PIPE_SELECT2 0x4124
#define R500_DYN_SCLK_PWMEM_PIPE 0x000d /* PLL */
#define R300_GB_TILE_CONFIG 0x4018
# define R300_ENABLE_TILING (1 << 0)
@@ -1826,26 +1904,38 @@ do { \
*/
#define RADEON_WAIT_UNTIL_2D_IDLE() do { \
- OUT_RING( CP_PACKET0( RADEON_WAIT_UNTIL, 0 ) ); \
+ if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) \
+ OUT_RING( CP_PACKET0( R600_WAIT_UNTIL, 0 ) ); \
+ else \
+ OUT_RING( CP_PACKET0( RADEON_WAIT_UNTIL, 0 ) ); \
OUT_RING( (RADEON_WAIT_2D_IDLECLEAN | \
RADEON_WAIT_HOST_IDLECLEAN) ); \
} while (0)
#define RADEON_WAIT_UNTIL_3D_IDLE() do { \
- OUT_RING( CP_PACKET0( RADEON_WAIT_UNTIL, 0 ) ); \
+ if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) \
+ OUT_RING( CP_PACKET0( R600_WAIT_UNTIL, 0 ) ); \
+ else \
+ OUT_RING( CP_PACKET0( RADEON_WAIT_UNTIL, 0 ) ); \
OUT_RING( (RADEON_WAIT_3D_IDLECLEAN | \
RADEON_WAIT_HOST_IDLECLEAN) ); \
} while (0)
#define RADEON_WAIT_UNTIL_IDLE() do { \
- OUT_RING( CP_PACKET0( RADEON_WAIT_UNTIL, 0 ) ); \
+ if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) \
+ OUT_RING( CP_PACKET0( R600_WAIT_UNTIL, 0 ) ); \
+ else \
+ OUT_RING( CP_PACKET0( RADEON_WAIT_UNTIL, 0 ) ); \
OUT_RING( (RADEON_WAIT_2D_IDLECLEAN | \
RADEON_WAIT_3D_IDLECLEAN | \
RADEON_WAIT_HOST_IDLECLEAN) ); \
} while (0)
#define RADEON_WAIT_UNTIL_PAGE_FLIPPED() do { \
- OUT_RING( CP_PACKET0( RADEON_WAIT_UNTIL, 0 ) ); \
+ if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) \
+ OUT_RING( CP_PACKET0( R600_WAIT_UNTIL, 0 ) ); \
+ else \
+ OUT_RING( CP_PACKET0( RADEON_WAIT_UNTIL, 0 ) ); \
OUT_RING( RADEON_WAIT_CRTC_PFLIP ); \
} while (0)
@@ -1960,14 +2050,17 @@ do { \
#define RING_LOCALS int write, _nr, _align_nr; unsigned int mask; u32 *ring;
+#define RADEON_RING_ALIGN 16
+
#define BEGIN_RING( n ) do { \
if ( RADEON_VERBOSE ) { \
DRM_INFO( "BEGIN_RING( %d )\n", (n)); \
} \
- _align_nr = (n + 0xf) & ~0xf; \
- if (dev_priv->ring.space <= (_align_nr * sizeof(u32))) { \
- COMMIT_RING(); \
- radeon_wait_ring( dev_priv, _align_nr * sizeof(u32)); \
+ _align_nr = RADEON_RING_ALIGN - ((dev_priv->ring.tail + n) & (RADEON_RING_ALIGN - 1)); \
+ _align_nr += n; \
+ if ( dev_priv->ring.space <= (_align_nr) * sizeof(u32) ) { \
+ COMMIT_RING(); \
+ radeon_wait_ring( dev_priv, (_align_nr) * sizeof(u32) ); \
} \
_nr = n; dev_priv->ring.space -= (n) * sizeof(u32); \
ring = dev_priv->ring.start; \
diff --git a/sys/dev/drm/radeon_state.c b/sys/dev/drm/radeon_state.c
index 39dcd61..e032b8f 100644
--- a/sys/dev/drm/radeon_state.c
+++ b/sys/dev/drm/radeon_state.c
@@ -1541,7 +1541,7 @@ static void radeon_cp_dispatch_vertex(struct drm_device * dev,
} while (i < nbox);
}
-static void radeon_cp_discard_buffer(struct drm_device *dev, struct drm_buf *buf)
+void radeon_cp_discard_buffer(struct drm_device *dev, struct drm_buf *buf)
{
drm_radeon_private_t *dev_priv = dev->dev_private;
drm_radeon_buf_priv_t *buf_priv = buf->dev_private;
@@ -2202,7 +2202,10 @@ static int radeon_cp_swap(struct drm_device *dev, void *data, struct drm_file *f
if (sarea_priv->nbox > RADEON_NR_SAREA_CLIPRECTS)
sarea_priv->nbox = RADEON_NR_SAREA_CLIPRECTS;
- radeon_cp_dispatch_swap(dev);
+ if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
+ r600_cp_dispatch_swap(dev);
+ else
+ radeon_cp_dispatch_swap(dev);
sarea_priv->ctx_owner = 0;
COMMIT_RING();
@@ -2399,7 +2402,10 @@ static int radeon_cp_texture(struct drm_device *dev, void *data, struct drm_file
RING_SPACE_TEST_WITH_RETURN(dev_priv);
VB_AGE_TEST_WITH_RETURN(dev_priv);
- ret = radeon_cp_dispatch_texture(dev, file_priv, tex, &image);
+ if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
+ ret = r600_cp_dispatch_texture(dev, file_priv, tex, &image);
+ else
+ ret = radeon_cp_dispatch_texture(dev, file_priv, tex, &image);
return ret;
}
@@ -3072,6 +3078,9 @@ static int radeon_cp_getparam(struct drm_device *dev, void *data, struct drm_fil
case RADEON_PARAM_NUM_GB_PIPES:
value = dev_priv->num_gb_pipes;
break;
+ case RADEON_PARAM_NUM_Z_PIPES:
+ value = dev_priv->num_z_pipes;
+ break;
default:
DRM_DEBUG("Invalid parameter %d\n", param->param);
return -EINVAL;
@@ -3156,6 +3165,14 @@ void radeon_driver_preclose(struct drm_device *dev, struct drm_file *file_priv)
void radeon_driver_lastclose(struct drm_device *dev)
{
radeon_surfaces_release(PCIGART_FILE_PRIV, dev->dev_private);
+ if (dev->dev_private) {
+ drm_radeon_private_t *dev_priv = dev->dev_private;
+
+ if (dev_priv->sarea_priv &&
+ dev_priv->sarea_priv->pfCurrentPage != 0)
+ radeon_cp_dispatch_flip(dev);
+ }
+
radeon_do_release(dev);
}
@@ -3216,7 +3233,8 @@ struct drm_ioctl_desc radeon_ioctls[] = {
DRM_IOCTL_DEF(DRM_RADEON_IRQ_WAIT, radeon_irq_wait, DRM_AUTH),
DRM_IOCTL_DEF(DRM_RADEON_SETPARAM, radeon_cp_setparam, DRM_AUTH),
DRM_IOCTL_DEF(DRM_RADEON_SURF_ALLOC, radeon_surface_alloc, DRM_AUTH),
- DRM_IOCTL_DEF(DRM_RADEON_SURF_FREE, radeon_surface_free, DRM_AUTH)
+ DRM_IOCTL_DEF(DRM_RADEON_SURF_FREE, radeon_surface_free, DRM_AUTH),
+ DRM_IOCTL_DEF(DRM_RADEON_CS, radeon_cs_ioctl, DRM_AUTH)
};
int radeon_max_ioctl = DRM_ARRAY_SIZE(radeon_ioctls);
diff --git a/sys/dev/e1000/if_em.c b/sys/dev/e1000/if_em.c
index d1fe7aa..1def876 100644
--- a/sys/dev/e1000/if_em.c
+++ b/sys/dev/e1000/if_em.c
@@ -1204,7 +1204,8 @@ em_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
em_init_locked(adapter);
EM_CORE_UNLOCK(adapter);
}
- arp_ifinit(ifp, ifa);
+ if (!(ifp->if_flags & IFF_NOARP))
+ arp_ifinit(ifp, ifa);
} else
#endif
error = ether_ioctl(ifp, command, data);
diff --git a/sys/dev/e1000/if_igb.c b/sys/dev/e1000/if_igb.c
index ee19b94..4124fa1 100644
--- a/sys/dev/e1000/if_igb.c
+++ b/sys/dev/e1000/if_igb.c
@@ -952,7 +952,8 @@ igb_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
igb_init_locked(adapter);
IGB_CORE_UNLOCK(adapter);
}
- arp_ifinit(ifp, ifa);
+ if (!(ifp->if_flags & IFF_NOARP))
+ arp_ifinit(ifp, ifa);
} else
#endif
error = ether_ioctl(ifp, command, data);
diff --git a/sys/dev/ep/if_ep.c b/sys/dev/ep/if_ep.c
index f5fd475..c5b516c 100644
--- a/sys/dev/ep/if_ep.c
+++ b/sys/dev/ep/if_ep.c
@@ -665,14 +665,13 @@ rescan:
#ifdef EP_LOCAL_STATS
sc->tx_underrun++;
#endif
- } else {
- if (status & TXS_JABBER);
- else
- ++ifp->if_collisions;
- /* TXS_MAX_COLLISION
- * we shouldn't get
- * here
- */
+ }
+ if (status & TXS_MAX_COLLISION) {
+ /*
+ * TXS_MAX_COLLISION we
+ * shouldn't get here
+ */
+ ++ifp->if_collisions;
}
++ifp->if_oerrors;
CSR_WRITE_2(sc, EP_COMMAND, TX_ENABLE);
diff --git a/sys/dev/hptrr/hptrr_osm_bsd.c b/sys/dev/hptrr/hptrr_osm_bsd.c
index 3872cde..eae952e 100644
--- a/sys/dev/hptrr/hptrr_osm_bsd.c
+++ b/sys/dev/hptrr/hptrr_osm_bsd.c
@@ -814,6 +814,10 @@ static void hpt_action(struct cam_sim *sim, union ccb *ccb)
strncpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN);
strncpy(cpi->hba_vid, "HPT ", HBA_IDLEN);
strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN);
+ cpi->transport = XPORT_SPI;
+ cpi->transport_version = 2;
+ cpi->protocol = PROTO_SCSI;
+ cpi->protocol_version = SCSI_REV_2;
cpi->ccb_h.status = CAM_REQ_CMP;
break;
}
diff --git a/sys/dev/hwpmc/hwpmc_core.c b/sys/dev/hwpmc/hwpmc_core.c
index 214e42c..d4f065b 100644
--- a/sys/dev/hwpmc/hwpmc_core.c
+++ b/sys/dev/hwpmc/hwpmc_core.c
@@ -32,10 +32,13 @@
__FBSDID("$FreeBSD$");
#include <sys/param.h>
+#include <sys/bus.h>
#include <sys/pmc.h>
#include <sys/pmckern.h>
#include <sys/systm.h>
+#include <machine/intr_machdep.h>
+#include <machine/apicvar.h>
#include <machine/cpu.h>
#include <machine/cpufunc.h>
#include <machine/specialreg.h>
@@ -1179,6 +1182,29 @@ static struct iap_event_descr iap_events[] = {
IAPDESCR(DBH_01H, 0xDB, 0x01, IAP_F_FM | IAP_F_I7),
IAPDESCR(E4H_01H, 0xE4, 0x01, IAP_F_FM | IAP_F_I7),
IAPDESCR(E5H_01H, 0xE5, 0x01, IAP_F_FM | IAP_F_I7),
+ IAPDESCR(E6H_01H, 0xE6, 0x01, IAP_F_FM | IAP_F_I7),
+ IAPDESCR(E6H_02H, 0xE6, 0x02, IAP_F_FM | IAP_F_I7),
+ IAPDESCR(E8H_01H, 0xE8, 0x01, IAP_F_FM | IAP_F_I7),
+ IAPDESCR(E8H_02H, 0xE8, 0x02, IAP_F_FM | IAP_F_I7),
+ IAPDESCR(E8H_03H, 0xE8, 0x03, IAP_F_FM | IAP_F_I7),
+ IAPDESCR(F0H_01H, 0xF0, 0x01, IAP_F_FM | IAP_F_I7),
+ IAPDESCR(F0H_02H, 0xF0, 0x02, IAP_F_FM | IAP_F_I7),
+ IAPDESCR(F0H_04H, 0xF0, 0x04, IAP_F_FM | IAP_F_I7),
+ IAPDESCR(F0H_08H, 0xF0, 0x08, IAP_F_FM | IAP_F_I7),
+ IAPDESCR(F0H_10H, 0xF0, 0x10, IAP_F_FM | IAP_F_I7),
+ IAPDESCR(F0H_20H, 0xF0, 0x20, IAP_F_FM | IAP_F_I7),
+ IAPDESCR(F0H_40H, 0xF0, 0x40, IAP_F_FM | IAP_F_I7),
+ IAPDESCR(F0H_80H, 0xF0, 0x80, IAP_F_FM | IAP_F_I7),
+ IAPDESCR(F1H_02H, 0xF1, 0x02, IAP_F_FM | IAP_F_I7),
+ IAPDESCR(F1H_04H, 0xF1, 0x04, IAP_F_FM | IAP_F_I7),
+ IAPDESCR(F1H_07H, 0xF1, 0x07, IAP_F_FM | IAP_F_I7),
+ IAPDESCR(F2H_01H, 0xF2, 0x01, IAP_F_FM | IAP_F_I7),
+ IAPDESCR(F2H_02H, 0xF2, 0x02, IAP_F_FM | IAP_F_I7),
+ IAPDESCR(F2H_04H, 0xF2, 0x04, IAP_F_FM | IAP_F_I7),
+ IAPDESCR(F2H_08H, 0xF2, 0x08, IAP_F_FM | IAP_F_I7),
+ IAPDESCR(F2H_0FH, 0xF2, 0x0F, IAP_F_FM | IAP_F_I7),
+ IAPDESCR(F3H_01H, 0xF3, 0x01, IAP_F_FM | IAP_F_I7),
+ IAPDESCR(F3H_02H, 0xF3, 0x02, IAP_F_FM | IAP_F_I7),
IAPDESCR(F3H_04H, 0xF3, 0x04, IAP_F_FM | IAP_F_I7),
IAPDESCR(F3H_08H, 0xF3, 0x08, IAP_F_FM | IAP_F_I7),
IAPDESCR(F3H_10H, 0xF3, 0x10, IAP_F_FM | IAP_F_I7),
@@ -1771,7 +1797,7 @@ core_intr(int cpu, struct trapframe *tf)
}
if (found_interrupt)
- pmc_x86_lapic_enable_pmc_interrupt();
+ lapic_reenable_pmc();
atomic_add_int(found_interrupt ? &pmc_stats.pm_intr_processed :
&pmc_stats.pm_intr_ignored, 1);
@@ -1895,7 +1921,7 @@ core2_intr(int cpu, struct trapframe *tf)
(uintmax_t) rdmsr(IA_GLOBAL_OVF_CTRL));
if (found_interrupt)
- pmc_x86_lapic_enable_pmc_interrupt();
+ lapic_reenable_pmc();
atomic_add_int(found_interrupt ? &pmc_stats.pm_intr_processed :
&pmc_stats.pm_intr_ignored, 1);
diff --git a/sys/dev/hwpmc/hwpmc_piv.c b/sys/dev/hwpmc/hwpmc_piv.c
index 565be88..8ee8518 100644
--- a/sys/dev/hwpmc/hwpmc_piv.c
+++ b/sys/dev/hwpmc/hwpmc_piv.c
@@ -32,6 +32,7 @@
__FBSDID("$FreeBSD$");
#include <sys/param.h>
+#include <sys/bus.h>
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/pmc.h>
@@ -39,6 +40,8 @@ __FBSDID("$FreeBSD$");
#include <sys/smp.h>
#include <sys/systm.h>
+#include <machine/intr_machdep.h>
+#include <machine/apicvar.h>
#include <machine/cpu.h>
#include <machine/cpufunc.h>
#include <machine/cputypes.h>
@@ -1537,7 +1540,7 @@ p4_intr(int cpu, struct trapframe *tf)
*/
if (did_interrupt)
- pmc_x86_lapic_enable_pmc_interrupt();
+ lapic_reenable_pmc();
atomic_add_int(did_interrupt ? &pmc_stats.pm_intr_processed :
&pmc_stats.pm_intr_ignored, 1);
diff --git a/sys/dev/hwpmc/hwpmc_ppro.c b/sys/dev/hwpmc/hwpmc_ppro.c
index 909bfe2..8da185b 100644
--- a/sys/dev/hwpmc/hwpmc_ppro.c
+++ b/sys/dev/hwpmc/hwpmc_ppro.c
@@ -32,6 +32,7 @@
__FBSDID("$FreeBSD$");
#include <sys/param.h>
+#include <sys/bus.h>
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/pmc.h>
@@ -39,6 +40,8 @@ __FBSDID("$FreeBSD$");
#include <sys/smp.h>
#include <sys/systm.h>
+#include <machine/intr_machdep.h>
+#include <machine/apicvar.h>
#include <machine/cpu.h>
#include <machine/cpufunc.h>
#include <machine/cputypes.h>
@@ -718,7 +721,7 @@ p6_intr(int cpu, struct trapframe *tf)
* unmasked after a PMC interrupt.
*/
if (retval)
- pmc_x86_lapic_enable_pmc_interrupt();
+ lapic_reenable_pmc();
atomic_add_int(retval ? &pmc_stats.pm_intr_processed :
&pmc_stats.pm_intr_ignored, 1);
diff --git a/sys/dev/hwpmc/hwpmc_x86.c b/sys/dev/hwpmc/hwpmc_x86.c
index b48a6b0..09d04bb 100644
--- a/sys/dev/hwpmc/hwpmc_x86.c
+++ b/sys/dev/hwpmc/hwpmc_x86.c
@@ -39,7 +39,8 @@ __FBSDID("$FreeBSD$");
#include <machine/cpu.h>
#include <machine/cputypes.h>
-#include <machine/apicreg.h>
+#include <machine/intr_machdep.h>
+#include <machine/apicvar.h>
#include <machine/pmc_mdep.h>
#include <machine/md_var.h>
@@ -47,18 +48,6 @@ __FBSDID("$FreeBSD$");
#include <vm/vm_param.h>
#include <vm/pmap.h>
-extern volatile lapic_t *lapic;
-
-void
-pmc_x86_lapic_enable_pmc_interrupt(void)
-{
- uint32_t value;
-
- value = lapic->lvt_pcint;
- value &= ~APIC_LVT_M;
- lapic->lvt_pcint = value;
-}
-
/*
* Attempt to walk a user call stack using a too-simple algorithm.
* In the general case we need unwind information associated with
@@ -252,16 +241,15 @@ pmc_md_initialize()
struct pmc_mdep *md;
/* determine the CPU kind */
- md = NULL;
if (cpu_vendor_id == CPU_VENDOR_AMD)
md = pmc_amd_initialize();
else if (cpu_vendor_id == CPU_VENDOR_INTEL)
md = pmc_intel_initialize();
else
- KASSERT(0, ("[x86,%d] Unknown vendor", __LINE__));
+ return (NULL);
/* disallow sampling if we do not have an LAPIC */
- if (md != NULL && lapic == NULL)
+ if (!lapic_enable_pmc())
for (i = 1; i < md->pmd_nclass; i++)
md->pmd_classdep[i].pcd_caps &= ~PMC_CAP_INTERRUPT;
@@ -271,6 +259,8 @@ pmc_md_initialize()
void
pmc_md_finalize(struct pmc_mdep *md)
{
+
+ lapic_disable_pmc();
if (cpu_vendor_id == CPU_VENDOR_AMD)
pmc_amd_finalize(md);
else if (cpu_vendor_id == CPU_VENDOR_INTEL)
diff --git a/sys/dev/hwpmc/pmc_events.h b/sys/dev/hwpmc/pmc_events.h
index 05078af..e7bc349 100644
--- a/sys/dev/hwpmc/pmc_events.h
+++ b/sys/dev/hwpmc/pmc_events.h
@@ -29,8 +29,18 @@
#ifndef _DEV_HWPMC_PMC_EVENTS_H_
#define _DEV_HWPMC_PMC_EVENTS_H_
-/*
- * PMC event codes.
+/*
+ * Note: Documentation on adding events can be found both in
+ * the source tree at src/share/doc/papers/hwpmc/hwpmc.ms
+ * as well as on-line at:
+ *
+ * http://wiki.freebsd.org/PmcTools/PmcHardwareHowTo
+ *
+ * Please refer to those resources before you attempt to modify
+ * this file or the hwpmc driver/subsystem.
+ */
+
+/* * PMC event codes.
*
* __PMC_EV(CLASS, SYMBOLIC-NAME)
*
@@ -973,7 +983,30 @@ __PMC_EV(IAP, EVENT_FDH_04H) \
__PMC_EV(IAP, EVENT_FDH_08H) \
__PMC_EV(IAP, EVENT_FDH_10H) \
__PMC_EV(IAP, EVENT_FDH_20H) \
-__PMC_EV(IAP, EVENT_FDH_40H)
+__PMC_EV(IAP, EVENT_FDH_40H) \
+__PMC_EV(IAP, EVENT_E6H_02H) \
+__PMC_EV(IAP, EVENT_E8H_01H) \
+__PMC_EV(IAP, EVENT_E8H_02H) \
+__PMC_EV(IAP, EVENT_E8H_03H) \
+__PMC_EV(IAP, EVENT_F0H_01H) \
+__PMC_EV(IAP, EVENT_F0H_02H) \
+__PMC_EV(IAP, EVENT_F0H_04H) \
+__PMC_EV(IAP, EVENT_F0H_08H) \
+__PMC_EV(IAP, EVENT_F0H_10H) \
+__PMC_EV(IAP, EVENT_F0H_20H) \
+__PMC_EV(IAP, EVENT_F0H_40H) \
+__PMC_EV(IAP, EVENT_F0H_80H) \
+__PMC_EV(IAP, EVENT_F1H_02H) \
+__PMC_EV(IAP, EVENT_F1H_04H) \
+__PMC_EV(IAP, EVENT_F1H_07H) \
+__PMC_EV(IAP, EVENT_F2H_01H) \
+__PMC_EV(IAP, EVENT_F2H_02H) \
+__PMC_EV(IAP, EVENT_F2H_04H) \
+__PMC_EV(IAP, EVENT_F2H_08H) \
+__PMC_EV(IAP, EVENT_F2H_0FH) \
+__PMC_EV(IAP, EVENT_F3H_01H) \
+__PMC_EV(IAP, EVENT_F3H_02H)
+
#define PMC_EV_IAP_FIRST PMC_EV_IAP_EVENT_02H_81H
#define PMC_EV_IAP_LAST PMC_EV_IAP_EVENT_FDH_40H
@@ -1894,6 +1927,29 @@ __PMC_EV_ALIAS("UOP_UNFUSION", IAP_EVENT_DBH_01H) \
__PMC_EV_ALIAS("BR_INST_DECODED", IAP_EVENT_E0H_01H) \
__PMC_EV_ALIAS("BOGUS_BR", IAP_EVENT_E4H_01H) \
__PMC_EV_ALIAS("BPU_MISSED_CALL_RET", IAP_EVENT_E5H_01H) \
+__PMC_EV_ALIAS("BACLEAR.CLEAR", IAP_EVENT_E6H_01H) \
+__PMC_EV_ALIAS("BACLEAR.BAD_TARGET", IAP_EVENT_E6H_02H) \
+__PMC_EV_ALIAS("BPU_CLEARS.EARLY", IAP_EVENT_E8H_01H) \
+__PMC_EV_ALIAS("BPU_CLEARS.LATE", IAP_EVENT_E8H_02H) \
+__PMC_EV_ALIAS("BPU_CLEARS.ANY", IAP_EVENT_E8H_03H) \
+__PMC_EV_ALIAS("L2_TRANSACTIONS.LOAD", IAP_EVENT_F0H_01H) \
+__PMC_EV_ALIAS("L2_TRANSACTIONS.RFO", IAP_EVENT_F0H_02H) \
+__PMC_EV_ALIAS("L2_TRANSACTIONS.IFETCH", IAP_EVENT_F0H_04H) \
+__PMC_EV_ALIAS("L2_TRANSACTIONS.PREFETCH", IAP_EVENT_F0H_08H) \
+__PMC_EV_ALIAS("L2_TRANSACTIONS.L1D_WB", IAP_EVENT_F0H_10H) \
+__PMC_EV_ALIAS("L2_TRANSACTIONS.FILL", IAP_EVENT_F0H_20H) \
+__PMC_EV_ALIAS("L2_TRANSACTIONS.WB", IAP_EVENT_F0H_40H) \
+__PMC_EV_ALIAS("L2_TRANSACTIONS.ANY", IAP_EVENT_F0H_80H) \
+__PMC_EV_ALIAS("L2_LINES_IN.S_STATE", IAP_EVENT_F1H_02H) \
+__PMC_EV_ALIAS("L2_LINES_IN.E_STATE", IAP_EVENT_F1H_04H) \
+__PMC_EV_ALIAS("L2_LINES_IN.ANY", IAP_EVENT_F1H_07H) \
+__PMC_EV_ALIAS("L2_LINES_OUT.DEMAND_CLEAN", IAP_EVENT_F2H_01H) \
+__PMC_EV_ALIAS("L2_LINES_OUT.DEMAND_DIRTY", IAP_EVENT_F2H_02H) \
+__PMC_EV_ALIAS("L2_LINES_OUT.PREFETCH_CLEAN", IAP_EVENT_F2H_04H) \
+__PMC_EV_ALIAS("L2_LINES_OUT.PREFETCH_DIRTY", IAP_EVENT_F2H_08H) \
+__PMC_EV_ALIAS("L2_LINES_OUT.ANY", IAP_EVENT_F2H_0FH) \
+__PMC_EV_ALIAS("L2_HW_PREFETCH.HIT", IAP_EVENT_F3H_01H) \
+__PMC_EV_ALIAS("L2_HW_PREFETCH.ALLOC", IAP_EVENT_F3H_02H) \
__PMC_EV_ALIAS("L2_HW_PREFETCH.DATA_TRIGGER", IAP_EVENT_F3H_04H) \
__PMC_EV_ALIAS("L2_HW_PREFETCH.CODE_TRIGGER", IAP_EVENT_F3H_08H) \
__PMC_EV_ALIAS("L2_HW_PREFETCH.DCA_TRIGGER", IAP_EVENT_F3H_10H) \
diff --git a/sys/dev/ips/ips_pci.c b/sys/dev/ips/ips_pci.c
index 70e7d3b..9ccaf37 100644
--- a/sys/dev/ips/ips_pci.c
+++ b/sys/dev/ips/ips_pci.c
@@ -173,12 +173,10 @@ ips_intrhook(void *arg)
struct ips_softc *sc = (struct ips_softc *)arg;
config_intrhook_disestablish(&sc->ips_ich);
- newbus_xlock();
if (ips_adapter_init(sc))
ips_pci_free(sc);
else
sc->configured = 1;
- newbus_xunlock();
}
static int ips_pci_free(ips_softc_t *sc)
diff --git a/sys/dev/iscsi/initiator/isc_cam.c b/sys/dev/iscsi/initiator/isc_cam.c
index fbd5b3d..0d87823 100644
--- a/sys/dev/iscsi/initiator/isc_cam.c
+++ b/sys/dev/iscsi/initiator/isc_cam.c
@@ -190,6 +190,8 @@ _inq(struct cam_sim *sim, union ccb *ccb, int maxluns)
strncpy(cpi->hba_vid, "iSCSI", HBA_IDLEN);
strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN);
cpi->unit_number = cam_sim_unit(sim);
+ cpi->transport = XPORT_ISCSI;
+ cpi->transport_version = 0;
cpi->ccb_h.status = CAM_REQ_CMP;
}
diff --git a/sys/dev/isp/isp_freebsd.c b/sys/dev/isp/isp_freebsd.c
index b6f172b..3d20b09 100644
--- a/sys/dev/isp/isp_freebsd.c
+++ b/sys/dev/isp/isp_freebsd.c
@@ -5280,6 +5280,10 @@ isp_default_wwn(ispsoftc_t * isp, int chan, int isactive, int iswwnn)
return (seed);
}
seed = iswwnn ? FCPARAM(isp, chan)->isp_wwnn_nvram : FCPARAM(isp, chan)->isp_wwpn_nvram;
+ if (seed) {
+ return (seed);
+ }
+ return (0x400000007F000009ull);
} else {
seed = iswwnn ? fc->def_wwnn : fc->def_wwpn;
}
diff --git a/sys/dev/ixgbe/ixgbe.c b/sys/dev/ixgbe/ixgbe.c
index bd95bdf..008ded8 100644
--- a/sys/dev/ixgbe/ixgbe.c
+++ b/sys/dev/ixgbe/ixgbe.c
@@ -46,7 +46,7 @@ int ixgbe_display_debug_stats = 0;
/*********************************************************************
* Driver version
*********************************************************************/
-char ixgbe_driver_version[] = "1.8.8";
+char ixgbe_driver_version[] = "1.8.9";
/*********************************************************************
* PCI Device ID Table
@@ -246,6 +246,15 @@ static int ixgbe_enable_msix = 1;
TUNABLE_INT("hw.ixgbe.enable_msix", &ixgbe_enable_msix);
/*
+ * Header split has seemed to be beneficial in
+ * all circumstances tested, so its on by default
+ * however this variable will allow it to be disabled
+ * for some debug purposes.
+ */
+static bool ixgbe_header_split = TRUE;
+TUNABLE_INT("hw.ixgbe.hdr_split", &ixgbe_header_split);
+
+/*
* Number of Queues, should normally
* be left at 0, it then autoconfigures to
* the number of cpus. Each queue is a pair
@@ -454,7 +463,6 @@ ixgbe_attach(device_t dev)
*/
if (nmbclusters > 0 ) {
int s;
- /* Calculate the total RX mbuf needs */
s = (ixgbe_rxd * adapter->num_queues) * ixgbe_total_ports;
if (s > nmbclusters) {
device_printf(dev, "RX Descriptors exceed "
@@ -751,7 +759,8 @@ ixgbe_mq_start_locked(struct ifnet *ifp, struct tx_ring *txr, struct mbuf *m)
struct mbuf *next;
int err = 0;
- if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
+ if (((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) ||
+ (!adapter->link_active)) {
err = drbr_enqueue(ifp, txr->br, m);
return (err);
}
@@ -1459,8 +1468,7 @@ ixgbe_msix_link(void *arg)
device_printf(adapter->dev, "\nCRITICAL: ECC ERROR!! "
"Please Reboot!!\n");
IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_ECC);
- }
- if (reg_eicr & IXGBE_EICR_GPI_SDP1) {
+ } else if (reg_eicr & IXGBE_EICR_GPI_SDP1) {
/* Clear the interrupt */
IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1);
taskqueue_enqueue(adapter->tq, &adapter->msf_task);
@@ -1883,7 +1891,11 @@ ixgbe_set_multi(struct adapter *adapter)
IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, fctrl);
+#if __FreeBSD_version < 800000
+ IF_ADDR_LOCK(ifp);
+#else
if_maddr_rlock(ifp);
+#endif
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
if (ifma->ifma_addr->sa_family != AF_LINK)
continue;
@@ -1892,7 +1904,11 @@ ixgbe_set_multi(struct adapter *adapter)
IXGBE_ETH_LENGTH_OF_ADDRESS);
mcnt++;
}
+#if __FreeBSD_version < 800000
+ IF_ADDR_UNLOCK(ifp);
+#else
if_maddr_runlock(ifp);
+#endif
update_ptr = mta;
ixgbe_update_mc_addr_list(&adapter->hw,
@@ -3534,7 +3550,10 @@ ixgbe_setup_receive_ring(struct rx_ring *rxr)
rxr->next_to_check = 0;
rxr->last_cleaned = 0;
rxr->lro_enabled = FALSE;
- rxr->hdr_split = FALSE;
+
+ /* Use header split if configured */
+ if (ixgbe_header_split)
+ rxr->hdr_split = TRUE;
bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map,
BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
@@ -3553,7 +3572,6 @@ ixgbe_setup_receive_ring(struct rx_ring *rxr)
}
INIT_DEBUGOUT("RX LRO Initialized\n");
rxr->lro_enabled = TRUE;
- rxr->hdr_split = TRUE;
lro->ifp = adapter->ifp;
}
@@ -4457,24 +4475,42 @@ ixgbe_update_stats_counters(struct adapter *adapter)
struct ifnet *ifp = adapter->ifp;;
struct ixgbe_hw *hw = &adapter->hw;
u32 missed_rx = 0, bprc, lxon, lxoff, total;
+ u64 total_missed_rx = 0;
adapter->stats.crcerrs += IXGBE_READ_REG(hw, IXGBE_CRCERRS);
for (int i = 0; i < 8; i++) {
- int mp;
- mp = IXGBE_READ_REG(hw, IXGBE_MPC(i));
- missed_rx += mp;
- adapter->stats.mpc[i] += mp;
- adapter->stats.rnbc[i] += IXGBE_READ_REG(hw, IXGBE_RNBC(i));
+ /* missed_rx tallies misses for the gprc workaround */
+ missed_rx += IXGBE_READ_REG(hw, IXGBE_MPC(i));
+ adapter->stats.mpc[i] += missed_rx;
+ /* Running comprehensive total for stats display */
+ total_missed_rx += adapter->stats.mpc[i];
+ if (hw->mac.type == ixgbe_mac_82598EB)
+ adapter->stats.rnbc[i] +=
+ IXGBE_READ_REG(hw, IXGBE_RNBC(i));
}
/* Hardware workaround, gprc counts missed packets */
adapter->stats.gprc += IXGBE_READ_REG(hw, IXGBE_GPRC);
adapter->stats.gprc -= missed_rx;
- adapter->stats.gorc += IXGBE_READ_REG(hw, IXGBE_GORCH);
- adapter->stats.gotc += IXGBE_READ_REG(hw, IXGBE_GOTCH);
- adapter->stats.tor += IXGBE_READ_REG(hw, IXGBE_TORH);
+ if (hw->mac.type == ixgbe_mac_82599EB) {
+ adapter->stats.gorc += IXGBE_READ_REG(hw, IXGBE_GORCL);
+ IXGBE_READ_REG(hw, IXGBE_GORCH); /* clears register */
+ adapter->stats.gotc += IXGBE_READ_REG(hw, IXGBE_GOTCL);
+ IXGBE_READ_REG(hw, IXGBE_GOTCH); /* clears register */
+ adapter->stats.tor += IXGBE_READ_REG(hw, IXGBE_TORL);
+ IXGBE_READ_REG(hw, IXGBE_TORH); /* clears register */
+ adapter->stats.lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXCNT);
+ adapter->stats.lxoffrxc += IXGBE_READ_REG(hw, IXGBE_LXOFFRXCNT);
+ } else {
+ adapter->stats.lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXC);
+ adapter->stats.lxoffrxc += IXGBE_READ_REG(hw, IXGBE_LXOFFRXC);
+ /* 82598 only has a counter in the high register */
+ adapter->stats.gorc += IXGBE_READ_REG(hw, IXGBE_GORCH);
+ adapter->stats.gotc += IXGBE_READ_REG(hw, IXGBE_GOTCH);
+ adapter->stats.tor += IXGBE_READ_REG(hw, IXGBE_TORH);
+ }
/*
* Workaround: mprc hardware is incorrectly counting
@@ -4494,9 +4530,6 @@ ixgbe_update_stats_counters(struct adapter *adapter)
adapter->stats.prc1522 += IXGBE_READ_REG(hw, IXGBE_PRC1522);
adapter->stats.rlec += IXGBE_READ_REG(hw, IXGBE_RLEC);
- adapter->stats.lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXCNT);
- adapter->stats.lxoffrxc += IXGBE_READ_REG(hw, IXGBE_LXOFFRXCNT);
-
lxon = IXGBE_READ_REG(hw, IXGBE_LXONTXC);
adapter->stats.lxontxc += lxon;
lxoff = IXGBE_READ_REG(hw, IXGBE_LXOFFTXC);
@@ -4532,7 +4565,7 @@ ixgbe_update_stats_counters(struct adapter *adapter)
ifp->if_collisions = 0;
/* Rx Errors */
- ifp->if_ierrors = missed_rx + adapter->stats.crcerrs +
+ ifp->if_ierrors = total_missed_rx + adapter->stats.crcerrs +
adapter->stats.rlec;
}
diff --git a/sys/dev/mfi/mfi.c b/sys/dev/mfi/mfi.c
index 0ae585e..eb18ffe 100644
--- a/sys/dev/mfi/mfi.c
+++ b/sys/dev/mfi/mfi.c
@@ -1327,11 +1327,11 @@ mfi_add_ld_complete(struct mfi_command *cm)
mfi_release_command(cm);
mtx_unlock(&sc->mfi_io_lock);
- newbus_xlock();
+ mtx_lock(&Giant);
if ((child = device_add_child(sc->mfi_dev, "mfid", -1)) == NULL) {
device_printf(sc->mfi_dev, "Failed to add logical disk\n");
free(ld_info, M_MFIBUF);
- newbus_xunlock();
+ mtx_unlock(&Giant);
mtx_lock(&sc->mfi_io_lock);
return;
}
@@ -1339,7 +1339,7 @@ mfi_add_ld_complete(struct mfi_command *cm)
device_set_ivars(child, ld_info);
device_set_desc(child, "MFI Logical Disk");
bus_generic_attach(sc->mfi_dev);
- newbus_xunlock();
+ mtx_unlock(&Giant);
mtx_lock(&sc->mfi_io_lock);
}
@@ -1805,9 +1805,9 @@ mfi_check_command_post(struct mfi_softc *sc, struct mfi_command *cm)
KASSERT(ld != NULL, ("volume dissappeared"));
if (cm->cm_frame->header.cmd_status == MFI_STAT_OK) {
mtx_unlock(&sc->mfi_io_lock);
- newbus_xlock();
+ mtx_lock(&Giant);
device_delete_child(sc->mfi_dev, ld->ld_dev);
- newbus_xunlock();
+ mtx_unlock(&Giant);
mtx_lock(&sc->mfi_io_lock);
} else
mfi_disk_enable(ld);
@@ -1815,11 +1815,11 @@ mfi_check_command_post(struct mfi_softc *sc, struct mfi_command *cm)
case MFI_DCMD_CFG_CLEAR:
if (cm->cm_frame->header.cmd_status == MFI_STAT_OK) {
mtx_unlock(&sc->mfi_io_lock);
- newbus_xlock();
+ mtx_lock(&Giant);
TAILQ_FOREACH_SAFE(ld, &sc->mfi_ld_tqh, ld_link, ldn) {
device_delete_child(sc->mfi_dev, ld->ld_dev);
}
- newbus_xunlock();
+ mtx_unlock(&Giant);
mtx_lock(&sc->mfi_io_lock);
} else {
TAILQ_FOREACH(ld, &sc->mfi_ld_tqh, ld_link)
@@ -1985,9 +1985,7 @@ mfi_ioctl(struct cdev *dev, u_long cmd, caddr_t arg, int flag, struct thread *td
adapter = ioc->mfi_adapter_no;
if (device_get_unit(sc->mfi_dev) == 0 && adapter != 0) {
- newbus_slock();
devclass = devclass_find("mfi");
- newbus_sunlock();
sc = devclass_get_softc(devclass, adapter);
}
mtx_lock(&sc->mfi_io_lock);
@@ -2175,9 +2173,7 @@ out:
struct mfi_linux_ioc_packet l_ioc;
int adapter;
- newbus_slock();
devclass = devclass_find("mfi");
- newbus_sunlock();
if (devclass == NULL)
return (ENOENT);
@@ -2198,9 +2194,7 @@ out:
struct mfi_linux_ioc_aen l_aen;
int adapter;
- newbus_slock();
devclass = devclass_find("mfi");
- newbus_sunlock();
if (devclass == NULL)
return (ENOENT);
diff --git a/sys/dev/mfi/mfi_ioctl.h b/sys/dev/mfi/mfi_ioctl.h
index 22973d7f..48e9c7f 100644
--- a/sys/dev/mfi/mfi_ioctl.h
+++ b/sys/dev/mfi/mfi_ioctl.h
@@ -27,6 +27,8 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include <dev/mfi/mfireg.h>
+
#if defined(__amd64__) /* Assume amd64 wants 32 bit Linux */
struct iovec32 {
u_int32_t iov_base;
diff --git a/sys/dev/mfi/mfireg.h b/sys/dev/mfi/mfireg.h
index be56b48..17ab4b3 100644
--- a/sys/dev/mfi/mfireg.h
+++ b/sys/dev/mfi/mfireg.h
@@ -89,7 +89,7 @@ __FBSDID("$FreeBSD$");
#define MFI_ODCR0 0xa0 /* outbound doorbell clear register0 */
#define MFI_OSP0 0xb0 /* outbound scratch pad0 */
#define MFI_1078_EIM 0x80000004 /* 1078 enable intrrupt mask */
-#define MFI_RMI 0x2 /* reply message interrupt */
+#define MFI_RMI 0x2 /* reply message interrupt */
#define MFI_1078_RM 0x80000000 /* reply 1078 message interrupt */
#define MFI_ODC 0x4 /* outbound doorbell change interrupt */
@@ -151,15 +151,41 @@ typedef enum {
MFI_DCMD_CTRL_EVENT_GETINFO = 0x01040100,
MFI_DCMD_CTRL_EVENT_GET = 0x01040300,
MFI_DCMD_CTRL_EVENT_WAIT = 0x01040500,
+ MFI_DCMD_PR_GET_STATUS = 0x01070100,
+ MFI_DCMD_PR_GET_PROPERTIES = 0x01070200,
+ MFI_DCMD_PR_SET_PROPERTIES = 0x01070300,
+ MFI_DCMD_PR_START = 0x01070400,
+ MFI_DCMD_PR_STOP = 0x01070500,
+ MFI_DCMD_TIME_SECS_GET = 0x01080201,
+ MFI_DCMD_FLASH_FW_OPEN = 0x010f0100,
+ MFI_DCMD_FLASH_FW_DOWNLOAD = 0x010f0200,
+ MFI_DCMD_FLASH_FW_FLASH = 0x010f0300,
+ MFI_DCMD_FLASH_FW_CLOSE = 0x010f0400,
+ MFI_DCMD_PD_GET_LIST = 0x02010000,
+ MFI_DCMD_PD_GET_INFO = 0x02020000,
+ MFI_DCMD_PD_STATE_SET = 0x02030100,
+ MFI_DCMD_PD_REBUILD_START = 0x02040100,
+ MFI_DCMD_PD_REBUILD_ABORT = 0x02040200,
+ MFI_DCMD_PD_CLEAR_START = 0x02050100,
+ MFI_DCMD_PD_CLEAR_ABORT = 0x02050200,
+ MFI_DCMD_PD_GET_PROGRESS = 0x02060000,
+ MFI_DCMD_PD_LOCATE_START = 0x02070100,
+ MFI_DCMD_PD_LOCATE_STOP = 0x02070200,
MFI_DCMD_LD_GET_LIST = 0x03010000,
MFI_DCMD_LD_GET_INFO = 0x03020000,
MFI_DCMD_LD_GET_PROP = 0x03030000,
MFI_DCMD_LD_SET_PROP = 0x03040000,
+ MFI_DCMD_LD_INIT_START = 0x03060100,
MFI_DCMD_LD_DELETE = 0x03090000,
MFI_DCMD_CFG_READ = 0x04010000,
MFI_DCMD_CFG_ADD = 0x04020000,
MFI_DCMD_CFG_CLEAR = 0x04030000,
+ MFI_DCMD_CFG_MAKE_SPARE = 0x04040000,
+ MFI_DCMD_CFG_REMOVE_SPARE = 0x04050000,
MFI_DCMD_CFG_FOREIGN_IMPORT = 0x04060400,
+ MFI_DCMD_BBU_GET_STATUS = 0x05010000,
+ MFI_DCMD_BBU_GET_CAPACITY_INFO =0x05020000,
+ MFI_DCMD_BBU_GET_DESIGN_INFO = 0x05030000,
MFI_DCMD_CLUSTER = 0x08000000,
MFI_DCMD_CLUSTER_RESET_ALL = 0x08010100,
MFI_DCMD_CLUSTER_RESET_LD = 0x08010200
@@ -245,6 +271,9 @@ typedef enum {
MFI_STAT_RESERVATION_IN_PROGRESS,
MFI_STAT_I2C_ERRORS_DETECTED,
MFI_STAT_PCI_ERRORS_DETECTED,
+ MFI_STAT_DIAG_FAILED,
+ MFI_STAT_BOOT_MSG_PENDING,
+ MFI_STAT_FOREIGN_CONFIG_INCOMPLETE,
MFI_STAT_INVALID_STATUS = 0xFF
} mfi_status_t;
@@ -303,6 +332,17 @@ typedef enum {
MR_LD_CACHE_ALLOW_WRITE_CACHE = 0x20,
MR_LD_CACHE_ALLOW_READ_CACHE = 0x40
} mfi_ld_cache;
+#define MR_LD_CACHE_MASK 0x7f
+
+#define MR_LD_CACHE_POLICY_READ_AHEAD_NONE 0
+#define MR_LD_CACHE_POLICY_READ_AHEAD_ALWAYS MR_LD_CACHE_READ_AHEAD
+#define MR_LD_CACHE_POLICY_READ_AHEAD_ADAPTIVE \
+ (MR_LD_CACHE_READ_AHEAD | MR_LD_CACHE_READ_ADAPTIVE)
+#define MR_LD_CACHE_POLICY_WRITE_THROUGH 0
+#define MR_LD_CACHE_POLICY_WRITE_BACK MR_LD_CACHE_WRITE_BACK
+#define MR_LD_CACHE_POLICY_IO_CACHED \
+ (MR_LD_CACHE_ALLOW_WRITE_CACHE | MR_LD_CACHE_ALLOW_READ_CACHE)
+#define MR_LD_CACHE_POLICY_IO_DIRECT 0
typedef enum {
MR_PD_CACHE_UNCHANGED = 0,
@@ -320,6 +360,7 @@ typedef enum {
#define MFI_DEFAULT_ID -1
#define MFI_MAX_LUN 8
#define MFI_MAX_LD 64
+#define MFI_MAX_PD 256
#define MFI_FRAME_SIZE 64
#define MFI_MBOX_SIZE 12
@@ -866,12 +907,10 @@ union mfi_pd_ddf_type {
} __packed;
struct mfi_pd_progress {
- struct {
- uint32_t rbld : 1;
- uint32_t patrol : 1;
- uint32_t clear : 1;
- uint32_t reserved: 29;
- } active;
+ uint32_t active;
+#define MFI_PD_PROGRESS_REBUILD (1<<0)
+#define MFI_PD_PROGRESS_PATROL (1<<1)
+#define MFI_PD_PROGRESS_CLEAR (1<<2)
struct mfi_progress rbld;
struct mfi_progress patrol;
struct mfi_progress clear;
@@ -890,8 +929,8 @@ struct mfi_pd_info {
uint32_t other_err_count;
uint32_t pred_fail_count;
uint32_t last_pred_fail_event_seq_num;
- uint16_t fw_state;
- uint8_t disable_for_removal;
+ uint16_t fw_state; /* MFI_PD_STATE_* */
+ uint8_t disabled_for_removal;
uint8_t link_speed;
union mfi_pd_ddf_type state;
struct {
@@ -918,7 +957,7 @@ struct mfi_pd_address {
uint16_t encl_device_id;
uint8_t encl_index;
uint8_t slot_number;
- uint8_t scsi_dev_type;
+ uint8_t scsi_dev_type; /* 0 = disk */
uint8_t connect_port_bitmap;
uint64_t sas_addr[2];
} __packed;
@@ -926,12 +965,19 @@ struct mfi_pd_address {
struct mfi_pd_list {
uint32_t size;
uint32_t count;
- uint8_t data;
- /*
- struct mfi_pd_address addr[];
- */
+ struct mfi_pd_address addr[0];
} __packed;
+enum mfi_pd_state {
+ MFI_PD_STATE_UNCONFIGURED_GOOD = 0x00,
+ MFI_PD_STATE_UNCONFIGURED_BAD = 0x01,
+ MFI_PD_STATE_HOT_SPARE = 0x02,
+ MFI_PD_STATE_OFFLINE = 0x10,
+ MFI_PD_STATE_FAILED = 0x11,
+ MFI_PD_STATE_REBUILD = 0x14,
+ MFI_PD_STATE_ONLINE = 0x18
+};
+
union mfi_ld_ref {
struct {
uint8_t target_id;
@@ -986,6 +1032,9 @@ struct mfi_ld_params {
uint8_t span_depth;
uint8_t state;
uint8_t init_state;
+#define MFI_LD_PARAMS_INIT_NO 0
+#define MFI_LD_PARAMS_INIT_QUICK 1
+#define MFI_LD_PARAMS_INIT_FULL 2
uint8_t is_consistent;
uint8_t reserved[23];
} __packed;
@@ -995,7 +1044,7 @@ struct mfi_ld_progress {
#define MFI_LD_PROGRESS_CC (1<<0)
#define MFI_LD_PROGRESS_BGI (1<<1)
#define MFI_LD_PROGRESS_FGI (1<<2)
-#define MFI_LD_PORGRESS_RECON (1<<3)
+#define MFI_LD_PROGRESS_RECON (1<<3)
struct mfi_progress cc;
struct mfi_progress bgi;
struct mfi_progress fgi;
@@ -1028,26 +1077,18 @@ struct mfi_ld_info {
uint8_t reserved2[16];
} __packed;
-union mfi_spare_type {
- struct {
- uint8_t is_dedicate :1;
- uint8_t is_revertable :1;
- uint8_t is_encl_affinity :1;
- uint8_t reserved :5;
- } v;
- uint8_t type;
-} __packed;
-
#define MAX_ARRAYS 16
struct mfi_spare {
union mfi_pd_ref ref;
- union mfi_spare_type spare_type;
+ uint8_t spare_type;
+#define MFI_SPARE_DEDICATED (1 << 0)
+#define MFI_SPARE_REVERTIBLE (1 << 1)
+#define MFI_SPARE_ENCL_AFFINITY (1 << 2)
uint8_t reserved[2];
uint8_t array_count;
- uint16_t array_refd[MAX_ARRAYS];
+ uint16_t array_ref[MAX_ARRAYS];
} __packed;
-#define MAX_ROW_SIZE 32
struct mfi_array {
uint64_t size;
uint8_t num_drives;
@@ -1055,13 +1096,13 @@ struct mfi_array {
uint16_t array_ref;
uint8_t pad[20];
struct {
- union mfi_pd_ref ref;
- uint16_t fw_state;
+ union mfi_pd_ref ref; /* 0xffff == missing drive */
+ uint16_t fw_state; /* MFI_PD_STATE_* */
struct {
uint8_t pd;
uint8_t slot;
} encl;
- } pd[MAX_ROW_SIZE];
+ } pd[0];
} __packed;
struct mfi_config_data {
@@ -1073,14 +1114,118 @@ struct mfi_config_data {
uint16_t spares_count;
uint16_t spares_size;
uint8_t reserved[16];
- uint8_t data;
- /*
- struct mfi_array array[];
- struct mfi_ld_config ld[];
- struct mfi_spare spare[];
- */
+ struct mfi_array array[0];
+ struct mfi_ld_config ld[0];
+ struct mfi_spare spare[0];
+} __packed;
+
+struct mfi_bbu_capacity_info {
+ uint16_t relative_charge;
+ uint16_t absolute_charge;
+ uint16_t remaining_capacity;
+ uint16_t full_charge_capacity;
+ uint16_t run_time_to_empty;
+ uint16_t average_time_to_empty;
+ uint16_t average_time_to_full;
+ uint16_t cycle_count;
+ uint16_t max_error;
+ uint16_t remaining_capacity_alarm;
+ uint16_t remaining_time_alarm;
+ uint8_t reserved[26];
+} __packed;
+
+struct mfi_bbu_design_info {
+ uint32_t mfg_date;
+ uint16_t design_capacity;
+ uint16_t design_voltage;
+ uint16_t spec_info;
+ uint16_t serial_number;
+ uint16_t pack_stat_config;
+ uint8_t mfg_name[12];
+ uint8_t device_name[8];
+ uint8_t device_chemistry[8];
+ uint8_t mfg_data[8];
+ uint8_t reserved[17];
+} __packed;
+
+struct mfi_ibbu_state {
+ uint16_t gas_guage_status;
+ uint16_t relative_charge;
+ uint16_t charger_system_state;
+ uint16_t charger_system_ctrl;
+ uint16_t charging_current;
+ uint16_t absolute_charge;
+ uint16_t max_error;
+ uint8_t reserved[18];
+} __packed;
+
+struct mfi_bbu_state {
+ uint16_t gas_guage_status;
+ uint16_t relative_charge;
+ uint16_t charger_status;
+ uint16_t remaining_capacity;
+ uint16_t full_charge_capacity;
+ uint8_t is_SOH_good;
+ uint8_t reserved[21];
} __packed;
+union mfi_bbu_status_detail {
+ struct mfi_ibbu_state ibbu;
+ struct mfi_bbu_state bbu;
+};
+
+struct mfi_bbu_status {
+ uint8_t battery_type;
+#define MFI_BBU_TYPE_NONE 0
+#define MFI_BBU_TYPE_IBBU 1
+#define MFI_BBU_TYPE_BBU 2
+ uint8_t reserved;
+ uint16_t voltage;
+ int16_t current;
+ uint16_t temperature;
+ uint32_t fw_status;
+#define MFI_BBU_STATE_PACK_MISSING (1 << 0)
+#define MFI_BBU_STATE_VOLTAGE_LOW (1 << 1)
+#define MFI_BBU_STATE_TEMPERATURE_HIGH (1 << 2)
+#define MFI_BBU_STATE_CHARGE_ACTIVE (1 << 0)
+#define MFI_BBU_STATE_DISCHARGE_ACTIVE (1 << 0)
+ uint8_t pad[20];
+ union mfi_bbu_status_detail detail;
+} __packed;
+
+enum mfi_pr_state {
+ MFI_PR_STATE_STOPPED = 0,
+ MFI_PR_STATE_READY = 1,
+ MFI_PR_STATE_ACTIVE = 2,
+ MFI_PR_STATE_ABORTED = 0xff
+};
+
+struct mfi_pr_status {
+ uint32_t num_iteration;
+ uint8_t state;
+ uint8_t num_pd_done;
+ uint8_t reserved[10];
+};
+
+enum mfi_pr_opmode {
+ MFI_PR_OPMODE_AUTO = 0,
+ MFI_PR_OPMODE_MANUAL = 1,
+ MFI_PR_OPMODE_DISABLED = 2
+};
+
+struct mfi_pr_properties {
+ uint8_t op_mode;
+ uint8_t max_pd;
+ uint8_t reserved;
+ uint8_t exclude_ld_count;
+ uint16_t excluded_ld[MFI_MAX_LD];
+ uint8_t cur_pd_map[MFI_MAX_PD / 8];
+ uint8_t last_pd_map[MFI_MAX_PD / 8];
+ uint32_t next_exec;
+ uint32_t exec_freq;
+ uint32_t clear_freq;
+};
+
#define MFI_SCSI_MAX_TARGETS 128
#define MFI_SCSI_MAX_LUNS 8
#define MFI_SCSI_INITIATOR_ID 255
diff --git a/sys/dev/mge/if_mge.c b/sys/dev/mge/if_mge.c
index ff505e9..0188ae3 100644
--- a/sys/dev/mge/if_mge.c
+++ b/sys/dev/mge/if_mge.c
@@ -69,7 +69,9 @@ __FBSDID("$FreeBSD$");
#include <dev/mii/mii.h>
#include <dev/mii/miivar.h>
-#define MV_PHY_ADDR_BASE 8
+#ifndef MII_ADDR_BASE
+#define MII_ADDR_BASE 8
+#endif
#include <dev/mge/if_mgevar.h>
#include <arm/mv/mvreg.h>
@@ -1264,14 +1266,15 @@ mge_miibus_readreg(device_t dev, int phy, int reg)
/*
* We assume static PHY address <=> device unit mapping:
- * PHY Address = MV_PHY_ADDR_BASE + devce unit.
+ * PHY Address = MII_ADDR_BASE + devce unit.
* This is true for most Marvell boards.
*
* Code below grants proper PHY detection on each device
* unit.
*/
- if ((MV_PHY_ADDR_BASE + device_get_unit(dev)) != phy)
+
+ if ((MII_ADDR_BASE + device_get_unit(dev)) != phy)
return (0);
MGE_WRITE(sc_mge0, MGE_REG_SMI, 0x1fffffff &
@@ -1292,7 +1295,7 @@ mge_miibus_writereg(device_t dev, int phy, int reg, int value)
{
uint32_t retries;
- if ((MV_PHY_ADDR_BASE + device_get_unit(dev)) != phy)
+ if ((MII_ADDR_BASE + device_get_unit(dev)) != phy)
return (0);
MGE_WRITE(sc_mge0, MGE_REG_SMI, 0x1fffffff &
diff --git a/sys/dev/mii/e1000phy.c b/sys/dev/mii/e1000phy.c
index f0d159b..4f2fa66 100644
--- a/sys/dev/mii/e1000phy.c
+++ b/sys/dev/mii/e1000phy.c
@@ -240,13 +240,11 @@ e1000phy_reset(struct mii_softc *sc)
if (esc->mii_model == MII_MODEL_MARVELL_E1116 ||
esc->mii_model == MII_MODEL_MARVELL_E1149) {
- page = PHY_READ(sc, E1000_EADR);
- /* Select page 2, MAC specific control register. */
PHY_WRITE(sc, E1000_EADR, 2);
reg = PHY_READ(sc, E1000_SCR);
reg |= E1000_SCR_RGMII_POWER_UP;
PHY_WRITE(sc, E1000_SCR, reg);
- PHY_WRITE(sc, E1000_EADR, page);
+ PHY_WRITE(sc, E1000_EADR, 0);
}
}
diff --git a/sys/dev/mlx/mlx.c b/sys/dev/mlx/mlx.c
index 9e74f62..6087216 100644
--- a/sys/dev/mlx/mlx.c
+++ b/sys/dev/mlx/mlx.c
@@ -772,9 +772,7 @@ mlx_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int32_t flag, struct threa
* Scan the controller to see whether new drives have appeared.
*/
case MLX_RESCAN_DRIVES:
- newbus_xlock();
mlx_startup(sc);
- newbus_xunlock();
return(0);
/*
diff --git a/sys/dev/mmc/mmc.c b/sys/dev/mmc/mmc.c
index 0fd424d..6872667 100644
--- a/sys/dev/mmc/mmc.c
+++ b/sys/dev/mmc/mmc.c
@@ -1496,9 +1496,7 @@ mmc_delayed_attach(void *xsc)
{
struct mmc_softc *sc = xsc;
- newbus_xlock();
mmc_scan(sc);
- newbus_xunlock();
config_intrhook_disestablish(&sc->config_intrhook);
}
diff --git a/sys/dev/mwl/if_mwl.c b/sys/dev/mwl/if_mwl.c
index c320cdb..991bc79 100644
--- a/sys/dev/mwl/if_mwl.c
+++ b/sys/dev/mwl/if_mwl.c
@@ -1738,6 +1738,10 @@ mwl_key_set(struct ieee80211vap *vap, const struct ieee80211_key *k,
* WEP keys when the sta reaches AUTH state.
*/
macaddr = vap->iv_bss->ni_bssid;
+ if ((k->wk_flags & IEEE80211_KEY_GROUP) == 0) {
+ /* XXX plumb to local sta db too for static key wep */
+ mwl_hal_keyset(hvap, &hk, vap->iv_myaddr);
+ }
} else if (vap->iv_opmode == IEEE80211_M_WDS &&
vap->iv_state != IEEE80211_S_RUN) {
/*
diff --git a/sys/dev/null/null.c b/sys/dev/null/null.c
index 0b94eb7..0f1d118 100644
--- a/sys/dev/null/null.c
+++ b/sys/dev/null/null.c
@@ -49,9 +49,6 @@ static d_write_t null_write;
static d_ioctl_t null_ioctl;
static d_read_t zero_read;
-#define NULL_MINOR 2
-#define ZERO_MINOR 12
-
static struct cdevsw null_cdevsw = {
.d_version = D_VERSION,
.d_read = (d_read_t *)nullop,
@@ -115,10 +112,10 @@ null_modevent(module_t mod __unused, int type, void *data __unused)
if (bootverbose)
printf("null: <null device, zero device>\n");
zbuf = (void *)malloc(PAGE_SIZE, M_TEMP, M_WAITOK | M_ZERO);
- null_dev = make_dev(&null_cdevsw, NULL_MINOR, UID_ROOT,
- GID_WHEEL, 0666, "null");
- zero_dev = make_dev(&zero_cdevsw, ZERO_MINOR, UID_ROOT,
- GID_WHEEL, 0666, "zero");
+ null_dev = make_dev(&null_cdevsw, 0, UID_ROOT, GID_WHEEL,
+ 0666, "null");
+ zero_dev = make_dev(&zero_cdevsw, 0, UID_ROOT, GID_WHEEL,
+ 0666, "zero");
break;
case MOD_UNLOAD:
diff --git a/sys/dev/pccbb/pccbb.c b/sys/dev/pccbb/pccbb.c
index f601185..a0585b0 100644
--- a/sys/dev/pccbb/pccbb.c
+++ b/sys/dev/pccbb/pccbb.c
@@ -464,7 +464,14 @@ cbb_event_thread(void *arg)
sc->flags |= CBB_KTHREAD_RUNNING;
while ((sc->flags & CBB_KTHREAD_DONE) == 0) {
mtx_unlock(&sc->mtx);
- newbus_xlock();
+ /*
+ * We take out Giant here because we need it deep,
+ * down in the bowels of the vm system for mapping the
+ * memory we need to read the CIS. In addition, since
+ * we are adding/deleting devices from the dev tree,
+ * and that code isn't MP safe, we have to hold Giant.
+ */
+ mtx_lock(&Giant);
status = cbb_get(sc, CBB_SOCKET_STATE);
DPRINTF(("Status is 0x%x\n", status));
if (!CBB_CARD_PRESENT(status)) {
@@ -490,7 +497,7 @@ cbb_event_thread(void *arg)
not_a_card = 0; /* We know card type */
cbb_insert(sc);
}
- newbus_xunlock();
+ mtx_unlock(&Giant);
/*
* First time through we need to tell mountroot that we're
diff --git a/sys/dev/ppbus/vpo.c b/sys/dev/ppbus/vpo.c
index f63ff49..4009178 100644
--- a/sys/dev/ppbus/vpo.c
+++ b/sys/dev/ppbus/vpo.c
@@ -427,6 +427,8 @@ vpo_action(struct cam_sim *sim, union ccb *ccb)
strncpy(cpi->hba_vid, "Iomega", HBA_IDLEN);
strncpy(cpi->dev_name, sim->sim_name, DEV_IDLEN);
cpi->unit_number = sim->unit_number;
+ cpi->transport = XPORT_PPB;
+ cpi->transport_version = 0;
cpi->ccb_h.status = CAM_REQ_CMP;
xpt_done(ccb);
diff --git a/sys/dev/pst/pst-iop.c b/sys/dev/pst/pst-iop.c
index 3fa37fd..d4e83f0 100644
--- a/sys/dev/pst/pst-iop.c
+++ b/sys/dev/pst/pst-iop.c
@@ -152,9 +152,7 @@ iop_attach(void *arg)
break;
case I2O_CLASS_RANDOM_BLOCK_STORAGE:
- newbus_xlock();
pst_add_raid(sc, &sc->lct[i]);
- newbus_xunlock();
break;
}
}
diff --git a/sys/dev/pty/pty.c b/sys/dev/pty/pty.c
new file mode 100644
index 0000000..c24396a
--- /dev/null
+++ b/sys/dev/pty/pty.c
@@ -0,0 +1,159 @@
+/*-
+ * Copyright (c) 2008 Ed Schouten <ed@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Portions of this software were developed under sponsorship from Snow
+ * B.V., the Netherlands.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/conf.h>
+#include <sys/eventhandler.h>
+#include <sys/fcntl.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/proc.h>
+#include <sys/sysctl.h>
+#include <sys/syslog.h>
+#include <sys/systm.h>
+#include <sys/tty.h>
+
+/*
+ * This driver implements a BSD-style compatibility naming scheme for
+ * the pts(4) driver. We just call into pts(4) to create the actual PTY.
+ * To make sure we don't use the same PTY multiple times, we abuse
+ * si_drv1 inside the cdev to mark whether the PTY is in use.
+ *
+ * It also implements a /dev/ptmx device node, which is useful for Linux
+ * binary emulation.
+ */
+
+static unsigned int pty_warningcnt = 1;
+SYSCTL_UINT(_kern, OID_AUTO, tty_pty_warningcnt, CTLFLAG_RW,
+ &pty_warningcnt, 0,
+ "Warnings that will be triggered upon legacy PTY allocation");
+
+static int
+ptydev_fdopen(struct cdev *dev, int fflags, struct thread *td, struct file *fp)
+{
+ int error;
+ char name[6]; /* "ttyXX" */
+
+ if (!atomic_cmpset_ptr((uintptr_t *)&dev->si_drv1, 0, 1))
+ return (EBUSY);
+
+ /* Generate device name and create PTY. */
+ strcpy(name, devtoname(dev));
+ name[0] = 't';
+
+ error = pts_alloc_external(fflags & (FREAD|FWRITE), td, fp, dev, name);
+ if (error != 0) {
+ destroy_dev_sched(dev);
+ return (error);
+ }
+
+ /* Raise a warning when a legacy PTY has been allocated. */
+ if (pty_warningcnt > 0) {
+ pty_warningcnt--;
+ log(LOG_INFO, "pid %d (%s) is using legacy pty devices%s\n",
+ td->td_proc->p_pid, td->td_name,
+ pty_warningcnt ? "" : " - not logging anymore");
+ }
+
+ return (0);
+}
+
+static struct cdevsw ptydev_cdevsw = {
+ .d_version = D_VERSION,
+ .d_fdopen = ptydev_fdopen,
+ .d_name = "ptydev",
+};
+
+static void
+pty_clone(void *arg, struct ucred *cr, char *name, int namelen,
+ struct cdev **dev)
+{
+
+ /* Cloning is already satisfied. */
+ if (*dev != NULL)
+ return;
+
+ /* Only catch /dev/ptyXX. */
+ if (namelen != 5 || bcmp(name, "pty", 3) != 0)
+ return;
+
+ /* Only catch /dev/pty[l-sL-S]X. */
+ if (!(name[3] >= 'l' && name[3] <= 's') &&
+ !(name[3] >= 'L' && name[3] <= 'S'))
+ return;
+
+ /* Only catch /dev/pty[l-sL-S][0-9a-v]. */
+ if (!(name[4] >= '0' && name[4] <= '9') &&
+ !(name[4] >= 'a' && name[4] <= 'v'))
+ return;
+
+ /* Create the controller device node. */
+ *dev = make_dev_credf(MAKEDEV_REF, &ptydev_cdevsw, 0,
+ NULL, UID_ROOT, GID_WHEEL, 0666, "%s", name);
+}
+
+static int
+ptmx_fdopen(struct cdev *dev __unused, int fflags, struct thread *td,
+ struct file *fp)
+{
+
+ return (pts_alloc(fflags & (FREAD|FWRITE), td, fp));
+}
+
+static struct cdevsw ptmx_cdevsw = {
+ .d_version = D_VERSION,
+ .d_fdopen = ptmx_fdopen,
+ .d_name = "ptmx",
+};
+
+static int
+pty_modevent(module_t mod, int type, void *data)
+{
+
+ switch(type) {
+ case MOD_LOAD:
+ EVENTHANDLER_REGISTER(dev_clone, pty_clone, 0, 1000);
+ make_dev(&ptmx_cdevsw, 0, UID_ROOT, GID_WHEEL, 0666, "ptmx");
+ break;
+ case MOD_SHUTDOWN:
+ break;
+ case MOD_UNLOAD:
+ /* XXX: No unloading support yet. */
+ return (EBUSY);
+ default:
+ return (EOPNOTSUPP);
+ }
+
+ return (0);
+}
+
+DEV_MODULE(pty, pty_modevent, NULL);
diff --git a/sys/dev/re/if_re.c b/sys/dev/re/if_re.c
index 0fc2e89..5a5790d 100644
--- a/sys/dev/re/if_re.c
+++ b/sys/dev/re/if_re.c
@@ -174,8 +174,8 @@ static struct rl_type re_devs[] = {
{ RT_VENDORID, RT_DEVICEID_8101E, 0,
"RealTek 8101E/8102E/8102EL PCIe 10/100baseTX" },
{ RT_VENDORID, RT_DEVICEID_8168, 0,
- "RealTek 8168/8168B/8168C/8168CP/8168D/8111B/8111C/8111CP PCIe "
- "Gigabit Ethernet" },
+ "RealTek 8168/8168B/8168C/8168CP/8168D/8168DP/"
+ "8111B/8111C/8111CP/8111DP PCIe Gigabit Ethernet" },
{ RT_VENDORID, RT_DEVICEID_8169, 0,
"RealTek 8169/8169S/8169SB(L)/8110S/8110SB(L) Gigabit Ethernet" },
{ RT_VENDORID, RT_DEVICEID_8169SC, 0,
@@ -217,7 +217,8 @@ static struct rl_hwrev re_hwrevs[] = {
{ RL_HWREV_8168C, RL_8169, "8168C/8111C"},
{ RL_HWREV_8168C_SPIN2, RL_8169, "8168C/8111C"},
{ RL_HWREV_8168CP, RL_8169, "8168CP/8111CP"},
- { RL_HWREV_8168D, RL_8169, "8168D"},
+ { RL_HWREV_8168D, RL_8169, "8168D/8111D"},
+ { RL_HWREV_8168DP, RL_8169, "8168DP/8111DP"},
{ 0, 0, NULL }
};
@@ -1282,6 +1283,7 @@ re_attach(device_t dev)
/* FALLTHROUGH */
case RL_HWREV_8168CP:
case RL_HWREV_8168D:
+ case RL_HWREV_8168DP:
sc->rl_flags |= RL_FLAG_PHYWAKE | RL_FLAG_PAR |
RL_FLAG_DESCV2 | RL_FLAG_MACSTAT | RL_FLAG_CMDSTOP |
RL_FLAG_AUTOPAD;
diff --git a/sys/dev/rp/rp.c b/sys/dev/rp/rp.c
index 45f59d3..520ca80 100644
--- a/sys/dev/rp/rp.c
+++ b/sys/dev/rp/rp.c
@@ -903,9 +903,7 @@ rpopen(struct tty *tp)
rp_callout_handle = timeout(rp_do_poll,
(void *)NULL, POLL_INTERVAL);
- newbus_xlock();
device_busy(rp->rp_ctlp->dev);
- newbus_xunlock();
return(0);
}
@@ -916,9 +914,7 @@ rpclose(struct tty *tp)
rp = tty_softc(tp);
rphardclose(tp);
- newbus_xlock();
device_unbusy(rp->rp_ctlp->dev);
- newbus_xunlock();
}
static void
diff --git a/sys/dev/rp/rp_pci.c b/sys/dev/rp/rp_pci.c
index e8a1c68..cbd5516 100644
--- a/sys/dev/rp/rp_pci.c
+++ b/sys/dev/rp/rp_pci.c
@@ -225,11 +225,7 @@ rp_pcidetach(device_t dev)
{
CONTROLLER_t *ctlp;
- if (device_get_state(dev) == DS_BUSY)
- return (EBUSY);
-
ctlp = device_get_softc(dev);
-
rp_pcireleaseresource(ctlp);
return (0);
@@ -240,11 +236,7 @@ rp_pcishutdown(device_t dev)
{
CONTROLLER_t *ctlp;
- if (device_get_state(dev) == DS_BUSY)
- return (EBUSY);
-
ctlp = device_get_softc(dev);
-
rp_pcireleaseresource(ctlp);
return (0);
diff --git a/sys/dev/siis/siis.c b/sys/dev/siis/siis.c
index 92b8b70..31002eb 100644
--- a/sys/dev/siis/siis.c
+++ b/sys/dev/siis/siis.c
@@ -647,6 +647,30 @@ siis_slotsfree(device_t dev)
}
static void
+siis_notify_events(device_t dev)
+{
+ struct siis_channel *ch = device_get_softc(dev);
+ struct cam_path *dpath;
+ u_int32_t status;
+ int i;
+
+ status = ATA_INL(ch->r_mem, SIIS_P_SNTF);
+ ATA_OUTL(ch->r_mem, SIIS_P_SNTF, status);
+ if (bootverbose)
+ device_printf(dev, "SNTF 0x%04x\n", status);
+ for (i = 0; i < 16; i++) {
+ if ((status & (1 << i)) == 0)
+ continue;
+ if (xpt_create_path(&dpath, NULL,
+ xpt_path_path_id(ch->path), i, 0) == CAM_REQ_CMP) {
+ xpt_async(AC_SCSI_AEN, dpath, NULL);
+ xpt_free_path(dpath);
+ }
+ }
+
+}
+
+static void
siis_phy_check_events(device_t dev)
{
struct siis_channel *ch = device_get_softc(dev);
@@ -707,6 +731,9 @@ siis_ch_intr(void *data)
/* Process PHY events */
if (istatus & SIIS_P_IX_PHYRDYCHG)
siis_phy_check_events(dev);
+ /* Process NOTIFY events */
+ if (istatus & SIIS_P_IX_SDBN)
+ siis_notify_events(dev);
/* Process command errors */
if (istatus & SIIS_P_IX_COMMERR) {
estatus = ATA_INL(ch->r_mem, SIIS_P_CMDERR);
@@ -1267,7 +1294,6 @@ siis_reset(device_t dev)
/* XXX; Commands in loading state. */
siis_end_transaction(&ch->slot[i], SIIS_ERR_INNOCENT);
}
- ATA_OUTL(ch->r_mem, SIIS_P_CTLCLR, SIIS_P_CTL_PME);
/* Reset and reconnect PHY, */
if (!siis_sata_phy_reset(dev)) {
ch->devices = 0;
@@ -1461,9 +1487,9 @@ siisaction(struct cam_sim *sim, union ccb *ccb)
uint32_t status;
cts->protocol = PROTO_ATA;
- cts->protocol_version = SCSI_REV_2;
+ cts->protocol_version = PROTO_VERSION_UNSPECIFIED;
cts->transport = XPORT_SATA;
- cts->transport_version = 2;
+ cts->transport_version = XPORT_VERSION_UNSPECIFIED;
cts->proto_specific.valid = 0;
cts->xport_specific.sata.valid = 0;
if (cts->type == CTS_TYPE_CURRENT_SETTINGS)
@@ -1548,9 +1574,9 @@ siisaction(struct cam_sim *sim, union ccb *ccb)
strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN);
cpi->unit_number = cam_sim_unit(sim);
cpi->transport = XPORT_SATA;
- cpi->transport_version = 2;
+ cpi->transport_version = XPORT_VERSION_UNSPECIFIED;
cpi->protocol = PROTO_ATA;
- cpi->protocol_version = SCSI_REV_2;
+ cpi->protocol_version = PROTO_VERSION_UNSPECIFIED;
cpi->ccb_h.status = CAM_REQ_CMP;
cpi->maxio = MAXPHYS;
xpt_done(ccb);
diff --git a/sys/dev/snp/snp.c b/sys/dev/snp/snp.c
index fcc70a5..37d9965 100644
--- a/sys/dev/snp/snp.c
+++ b/sys/dev/snp/snp.c
@@ -192,7 +192,7 @@ snp_write(struct cdev *dev, struct uio *uio, int flag)
{
struct snp_softc *ss;
struct tty *tp;
- int error, len, i;
+ int error, len;
char in[SNP_INPUT_BUFSIZE];
error = devfs_get_cdevpriv((void **)&ss);
@@ -223,14 +223,9 @@ snp_write(struct cdev *dev, struct uio *uio, int flag)
* because we shouldn't bail out when we're running
* close to the watermarks.
*/
- if (ttydisc_can_bypass(tp)) {
- ttydisc_rint_bypass(tp, in, len);
- } else {
- for (i = 0; i < len; i++)
- ttydisc_rint(tp, in[i], 0);
- }
-
+ ttydisc_rint_simple(tp, in, len);
ttydisc_rint_done(tp);
+
tty_unlock(tp);
}
diff --git a/sys/dev/sound/pci/hda/hdac.c b/sys/dev/sound/pci/hda/hdac.c
index bf99d54..4eda8be 100644
--- a/sys/dev/sound/pci/hda/hdac.c
+++ b/sys/dev/sound/pci/hda/hdac.c
@@ -1520,7 +1520,7 @@ hdac_get_capabilities(struct hdac_softc *sc)
sc->num_iss = HDAC_GCAP_ISS(gcap);
sc->num_oss = HDAC_GCAP_OSS(gcap);
sc->num_bss = HDAC_GCAP_BSS(gcap);
-
+ sc->num_sdo = HDAC_GCAP_NSDO(gcap);
sc->support_64bit = HDA_FLAG_MATCH(gcap, HDAC_GCAP_64OK);
corbsize = HDAC_READ_1(&sc->mem, HDAC_CORBSIZE);
@@ -1555,11 +1555,12 @@ hdac_get_capabilities(struct hdac_softc *sc)
return (ENXIO);
}
- HDA_BOOTHVERBOSE(
- device_printf(sc->dev, " CORB size: %d\n", sc->corb_size);
- device_printf(sc->dev, " RIRB size: %d\n", sc->rirb_size);
- device_printf(sc->dev, " Streams: ISS=%d OSS=%d BSS=%d\n",
- sc->num_iss, sc->num_oss, sc->num_bss);
+ HDA_BOOTVERBOSE(
+ device_printf(sc->dev, "Caps: OSS %d, ISS %d, BSS %d, "
+ "NSDO %d%s, CORB %d, RIRB %d\n",
+ sc->num_oss, sc->num_iss, sc->num_bss, 1 << sc->num_sdo,
+ sc->support_64bit ? ", 64bit" : "",
+ sc->corb_size, sc->rirb_size);
);
return (0);
@@ -7435,7 +7436,6 @@ hdac_attach2(void *arg)
quirks_on, quirks_off);
);
- newbus_xlock();
hdac_lock(sc);
/* Remove ourselves from the config hooks */
@@ -7675,7 +7675,6 @@ hdac_attach2(void *arg)
SYSCTL_CHILDREN(device_get_sysctl_tree(sc->dev)), OID_AUTO,
"pindump", CTLTYPE_INT | CTLFLAG_RW, sc->dev, sizeof(sc->dev),
sysctl_hdac_pindump, "I", "Dump pin states/data");
- newbus_xunlock();
}
/****************************************************************************
diff --git a/sys/dev/sound/pci/hda/hdac_private.h b/sys/dev/sound/pci/hda/hdac_private.h
index bd32967..2369a9a 100644
--- a/sys/dev/sound/pci/hda/hdac_private.h
+++ b/sys/dev/sound/pci/hda/hdac_private.h
@@ -339,6 +339,7 @@ struct hdac_softc {
int num_iss;
int num_oss;
int num_bss;
+ int num_sdo;
int support_64bit;
int streamcnt;
diff --git a/sys/dev/sound/pci/hda/hdac_reg.h b/sys/dev/sound/pci/hda/hdac_reg.h
index 9694710..813af72 100644
--- a/sys/dev/sound/pci/hda/hdac_reg.h
+++ b/sys/dev/sound/pci/hda/hdac_reg.h
@@ -136,6 +136,8 @@
(((gcap) & HDAC_GCAP_ISS_MASK) >> HDAC_GCAP_ISS_SHIFT)
#define HDAC_GCAP_OSS(gcap) \
(((gcap) & HDAC_GCAP_OSS_MASK) >> HDAC_GCAP_OSS_SHIFT)
+#define HDAC_GCAP_NSDO(gcap) \
+ (((gcap) & HDAC_GCAP_NSDO_MASK) >> HDAC_GCAP_NSDO_SHIFT)
/* GCTL - Global Control */
#define HDAC_GCTL_CRST 0x00000001
diff --git a/sys/dev/sound/usb/uaudio.c b/sys/dev/sound/usb/uaudio.c
index fe63e0d..f5d4740 100644
--- a/sys/dev/sound/usb/uaudio.c
+++ b/sys/dev/sound/usb/uaudio.c
@@ -2958,7 +2958,7 @@ uaudio_mixer_get(struct usb_device *udev, uint8_t what,
USETW(req.wIndex, mc->wIndex);
USETW(req.wLength, len);
- err = usbd_do_request(udev, &Giant, &req, data);
+ err = usbd_do_request(udev, NULL, &req, data);
if (err) {
DPRINTF("err=%s\n", usbd_errstr(err));
return (0);
@@ -3081,7 +3081,7 @@ uaudio_set_speed(struct usb_device *udev, uint8_t endpt, uint32_t speed)
data[1] = speed >> 8;
data[2] = speed >> 16;
- return (usbd_do_request(udev, &Giant, &req, data));
+ return (usbd_do_request(udev, NULL, &req, data));
}
static int
diff --git a/sys/dev/syscons/scterm-teken.c b/sys/dev/syscons/scterm-teken.c
index 36cfbb5..133d622 100644
--- a/sys/dev/syscons/scterm-teken.c
+++ b/sys/dev/syscons/scterm-teken.c
@@ -46,7 +46,7 @@ __FBSDID("$FreeBSD$");
#include <dev/syscons/syscons.h>
-#include <dev/syscons/teken/teken.h>
+#include <teken/teken.h>
static void scteken_revattr(unsigned char, teken_attr_t *);
static unsigned int scteken_attr(const teken_attr_t *);
@@ -300,12 +300,20 @@ static unsigned int
scteken_attr(const teken_attr_t *a)
{
unsigned int attr = 0;
+ teken_color_t fg, bg;
+ if (a->ta_format & TF_REVERSE) {
+ fg = a->ta_bgcolor;
+ bg = a->ta_fgcolor;
+ } else {
+ fg = a->ta_fgcolor;
+ bg = a->ta_bgcolor;
+ }
if (a->ta_format & TF_BOLD)
- attr |= fgcolors_bold[a->ta_fgcolor];
+ attr |= fgcolors_bold[fg];
else
- attr |= fgcolors_normal[a->ta_fgcolor];
- attr |= bgcolors[a->ta_bgcolor];
+ attr |= fgcolors_normal[fg];
+ attr |= bgcolors[bg];
#ifdef FG_UNDERLINE
if (a->ta_format & TF_UNDERLINE)
diff --git a/sys/dev/syscons/scvgarndr.c b/sys/dev/syscons/scvgarndr.c
index 1ab41d2..fd823ce 100644
--- a/sys/dev/syscons/scvgarndr.c
+++ b/sys/dev/syscons/scvgarndr.c
@@ -193,6 +193,8 @@ static u_short mouse_or_mask[16] = {
case 15: \
writew(pos, vga_palette15[color]); \
break; \
+ case 8: \
+ writeb(pos, (uint8_t)color); \
}
static uint32_t vga_palette32[16] = {
@@ -215,6 +217,7 @@ static uint16_t vga_palette15[16] = {
#ifndef SC_NO_CUTPASTE
static uint32_t mouse_buf32[256];
static uint16_t mouse_buf16[256];
+static uint8_t mouse_buf8[256];
#endif
#endif
@@ -498,7 +501,9 @@ vga_rndrinit(scr_stat *scp)
scp->rndr->draw_cursor = vga_pxlcursor_planar;
scp->rndr->blink_cursor = vga_pxlblink_planar;
scp->rndr->draw_mouse = vga_pxlmouse_planar;
- } else if (scp->sc->adp->va_info.vi_mem_model == V_INFO_MM_DIRECT) {
+ } else
+ if (scp->sc->adp->va_info.vi_mem_model == V_INFO_MM_DIRECT ||
+ scp->sc->adp->va_info.vi_mem_model == V_INFO_MM_PACKED) {
scp->rndr->clear = vga_pxlclear_direct;
scp->rndr->draw_border = vga_pxlborder_direct;
scp->rndr->draw = vga_vgadraw_direct;
@@ -1148,6 +1153,7 @@ vga_pxlmouse_direct(scr_stat *scp, int x, int y, int on)
int i, j;
uint32_t *u32;
uint16_t *u16;
+ uint8_t *u8;
int bpp;
if (!on)
@@ -1179,6 +1185,10 @@ vga_pxlmouse_direct(scr_stat *scp, int x, int y, int on)
u16 = (uint16_t*)(p + j * pixel_size);
writew(u16, mouse_buf16[i * 16 + j]);
break;
+ case 8:
+ u8 = (uint8_t*)(p + j * pixel_size);
+ writeb(u8, mouse_buf8[i * 16 + j]);
+ break;
}
}
@@ -1214,6 +1224,14 @@ vga_pxlmouse_direct(scr_stat *scp, int x, int y, int on)
else if (mouse_and_mask[i] & (1 << (15 - j)))
writew(u16, 0);
break;
+ case 8:
+ u8 = (uint8_t*)(p + j * pixel_size);
+ mouse_buf8[i * 16 + j] = *u8;
+ if (mouse_or_mask[i] & (1 << (15 - j)))
+ writeb(u8, 15);
+ else if (mouse_and_mask[i] & (1 << (15 - j)))
+ writeb(u8, 0);
+ break;
}
}
diff --git a/sys/dev/syscons/scvidctl.c b/sys/dev/syscons/scvidctl.c
index 045f79f..d481e06 100644
--- a/sys/dev/syscons/scvidctl.c
+++ b/sys/dev/syscons/scvidctl.c
@@ -391,6 +391,10 @@ sc_set_pixel_mode(scr_stat *scp, struct tty *tp, int xsize, int ysize,
(info.vi_depth != 15) && (info.vi_depth != 16) &&
(info.vi_depth != 24) && (info.vi_depth != 32))
return ENODEV;
+ } else if (info.vi_mem_model == V_INFO_MM_PACKED) {
+ if (!(info.vi_flags & V_INFO_LINEAR) &&
+ (info.vi_depth != 8))
+ return ENODEV;
} else
return ENODEV;
diff --git a/sys/dev/syscons/teken/Makefile b/sys/dev/syscons/teken/Makefile
deleted file mode 100644
index cbdd12b..0000000
--- a/sys/dev/syscons/teken/Makefile
+++ /dev/null
@@ -1,13 +0,0 @@
-# $FreeBSD$
-
-PROG= teken_demo
-SRCS= teken_demo.c teken.c teken_state.h
-CLEANFILES= teken_state.h teken.log
-LDADD= -lncurses -lutil
-NO_MAN=
-WARNS?= 6
-
-teken_state.h: gensequences sequences
- awk -f gensequences sequences > ${.TARGET}
-
-.include <bsd.prog.mk>
diff --git a/sys/dev/syscons/teken/gensequences b/sys/dev/syscons/teken/gensequences
deleted file mode 100644
index 86c7979..0000000
--- a/sys/dev/syscons/teken/gensequences
+++ /dev/null
@@ -1,157 +0,0 @@
-#!/usr/bin/awk -f
-
-#-
-# Copyright (c) 2008-2009 Ed Schouten <ed@FreeBSD.org>
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# $FreeBSD$
-
-function die(msg) {
- print msg;
- exit 1;
-}
-
-function cchar(str) {
- if (str == "^[")
- return "\\x1B";
-
- return str;
-}
-
-BEGIN {
-FS = "\t+"
-
-while (getline > 0) {
- if (NF == 0 || $1 ~ /^#/)
- continue;
-
- if (NF != 3 && NF != 4)
- die("Invalid line layout: " NF " columns");
-
- split($3, sequence, " +");
- nsequences = 0;
- for (s in sequence)
- nsequences++;
-
- prefix = "";
- l_prefix_name[""] = "teken_state_init";
- for (i = 1; i < nsequences; i++) {
- n = prefix sequence[i];
- l_prefix_parent[n] = prefix;
- l_prefix_suffix[n] = sequence[i];
- if (!l_prefix_name[n])
- l_prefix_name[n] = "teken_state_" ++npr;
- prefix = n;
- }
-
- suffix = sequence[nsequences];
- cmd = prefix suffix;
-
- # Fill lists
- if (l_cmd_name[cmd] != "")
- die(cmd " already exists");
- l_cmd_prefix[cmd] = prefix;
- l_cmd_suffix[cmd] = suffix;
- l_cmd_args[cmd] = $4;
- l_cmd_abbr[cmd] = $1;
- l_cmd_name[cmd] = $2;
- l_cmd_c_name[cmd] = "teken_subr_" tolower($2);
- gsub(" ", "_", l_cmd_c_name[cmd]);
-
- if ($4 != "")
- l_prefix_numbercmds[prefix]++;
-}
-
-print "/* Generated file. Do not edit. */";
-print "";
-
-for (p in l_prefix_name) {
- if (l_prefix_name[p] != "teken_state_init")
- print "static teken_state_t " l_prefix_name[p] ";";
-}
-
-for (p in l_prefix_name) {
- print "";
- print "/* '" p "' */";
- print "static void";
- print l_prefix_name[p] "(teken_t *t, teken_char_t c)";
- print "{";
-
- if (l_prefix_numbercmds[p] > 0) {
- print "";
- print "\tif (teken_state_numbers(t, c))";
- print "\t\treturn;";
- }
-
- print "";
- print "\tswitch (c) {";
- for (c in l_cmd_prefix) {
- if (l_cmd_prefix[c] != p)
- continue;
-
- print "\tcase '" cchar(l_cmd_suffix[c]) "': /* " l_cmd_abbr[c] ": " l_cmd_name[c] " */";
-
- if (l_cmd_args[c] == "v") {
- print "\t\t" l_cmd_c_name[c] "(t, t->t_curnum, t->t_nums);";
- } else {
- printf "\t\t%s(t", l_cmd_c_name[c];
- split(l_cmd_args[c], args, " ");
- for (a = 1; args[a] != ""; a++) {
- if (args[a] == "n")
- printf ", (t->t_curnum < %d || t->t_nums[%d] == 0) ? 1 : t->t_nums[%d]", a, (a - 1), (a - 1);
- else if (args[a] == "r")
- printf ", t->t_curnum < %d ? 0 : t->t_nums[%d]", a, (a - 1);
- else
- die("Invalid argument type: " args[a]);
- }
- print ");";
- }
- print "\t\tbreak;";
- }
- for (pc in l_prefix_parent) {
- if (l_prefix_parent[pc] != p)
- continue;
- print "\tcase '" cchar(l_prefix_suffix[pc]) "':";
- print "\t\tteken_state_switch(t, " l_prefix_name[pc] ");";
- print "\t\treturn;";
- }
-
- print "\tdefault:";
- if (l_prefix_name[p] == "teken_state_init") {
- print "\t\tteken_subr_regular_character(t, c);";
- } else {
- print "\t\tteken_printf(\"Unsupported sequence in " l_prefix_name[p] ": %u\\n\", (unsigned int)c);";
- }
- print "\t\tbreak;";
-
- print "\t}";
-
- if (l_prefix_name[p] != "teken_state_init") {
- print "";
- print "\tteken_state_switch(t, teken_state_init);";
- }
- print "}";
-}
-
-}
diff --git a/sys/dev/syscons/teken/sequences b/sys/dev/syscons/teken/sequences
deleted file mode 100644
index 8f7bfb4..0000000
--- a/sys/dev/syscons/teken/sequences
+++ /dev/null
@@ -1,110 +0,0 @@
-#-
-# Copyright (c) 2008-2009 Ed Schouten <ed@FreeBSD.org>
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# $FreeBSD$
-
-# File format is as follows:
-# Abbr Abbreviation of sequence name
-# Name Sequence name (will be converted to C function name)
-# Sequence Bytes that form the sequence
-# Arguments Standard value of arguments passed to this sequence
-# - `n' non-zero number (0 gets converted to 1)
-# - `r' regular numeric argument
-# - `v' means a variable number of arguments
-
-# Abbr Name Sequence Arguments
-CBT Cursor Backward Tabulation ^[ [ Z n
-CHT Cursor Forward Tabulation ^[ [ I n
-CNL Cursor Next Line ^[ [ E n
-CPL Cursor Previous Line ^[ [ F n
-CPR Cursor Position Report ^[ [ n r
-CUB Cursor Backward ^[ [ D n
-CUD Cursor Down ^[ [ B n
-CUD Cursor Down ^[ [ e n
-CUF Cursor Forward ^[ [ C n
-CUF Cursor Forward ^[ [ a n
-CUP Cursor Position ^[ [ H n n
-CUP Cursor Position ^[ [ f n n
-CUU Cursor Up ^[ [ A n
-DA1 Primary Device Attributes ^[ [ c r
-DA2 Secondary Device Attributes ^[ [ > c r
-DC Delete character ^[ [ P n
-DCS Device Control String ^[ P
-DECALN Alignment test ^[ # 8
-DECDHL Double Height Double Width Line Top ^[ # 3
-DECDHL Double Height Double Width Line Bottom ^[ # 4
-DECDWL Single Height Double Width Line ^[ # 6
-DECKPAM Keypad application mode ^[ =
-DECKPNM Keypad numeric mode ^[ >
-DECRC Restore cursor ^[ 8
-DECRC Restore cursor ^[ [ u
-DECRM Reset DEC mode ^[ [ ? l r
-DECSC Save cursor ^[ 7
-DECSC Save cursor ^[ [ s
-DECSM Set DEC mode ^[ [ ? h r
-DECSTBM Set top and bottom margins ^[ [ r r r
-DECSWL Single Height Single Width Line ^[ # 5
-DL Delete line ^[ [ M n
-DSR Device Status Report ^[ [ ? n r
-ECH Erase character ^[ [ X n
-ED Erase display ^[ [ J r
-EL Erase line ^[ [ K r
-G0SCS0 G0 SCS Special Graphics ^[ ( 0
-G0SCS1 G0 SCS US ASCII ^[ ( 1
-G0SCS2 G0 SCS Special Graphics ^[ ( 2
-G0SCSA G0 SCS UK National ^[ ( A
-G0SCSB G0 SCS US ASCII ^[ ( B
-G1SCS0 G1 SCS Special Graphics ^[ ) 0
-G1SCS1 G1 SCS US ASCII ^[ ) 1
-G1SCS2 G1 SCS Special Graphics ^[ ) 2
-G1SCSA G1 SCS UK National ^[ ) A
-G1SCSB G1 SCS US ASCII ^[ ) B
-HPA Horizontal Position Absolute ^[ [ G n
-HPA Horizontal Position Absolute ^[ [ ` n
-HTS Horizontal Tab Set ^[ H
-ICH Insert character ^[ [ @ n
-IL Insert line ^[ [ L n
-IND Index ^[ D
-NEL Next line ^[ E
-RI Reverse index ^[ M
-RIS Reset to Initial State ^[ c
-RM Reset Mode ^[ [ l r
-SD Pan Up ^[ [ T n
-SGR Set Graphic Rendition ^[ [ m v
-SM Set Mode ^[ [ h r
-ST String Terminator ^[ \\
-SU Pan Down ^[ [ S n
-TBC Tab Clear ^[ [ g r
-VPA Vertical Position Absolute ^[ [ d n
-
-# Cons25 compatibility sequences
-C25ADBG Cons25 set adapter background ^[ [ = G r
-C25ADFG Cons25 set adapter foreground ^[ [ = F r
-C25BLPD Cons25 set bell pitch duration ^[ [ = B r r
-C25CURS Cons25 set cursor type ^[ [ = S r
-C25VTSW Cons25 switch virtual terminal ^[ [ z r
-
-# VT52 compatibility
-#DECID VT52 DECID ^[ Z
diff --git a/sys/dev/syscons/teken/teken.c b/sys/dev/syscons/teken/teken.c
deleted file mode 100644
index 5a16f8d..0000000
--- a/sys/dev/syscons/teken/teken.c
+++ /dev/null
@@ -1,430 +0,0 @@
-/*-
- * Copyright (c) 2008-2009 Ed Schouten <ed@FreeBSD.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#include <sys/cdefs.h>
-#if defined(__FreeBSD__) && defined(_KERNEL)
-#include <sys/param.h>
-#include <sys/lock.h>
-#include <sys/systm.h>
-#define teken_assert(x) MPASS(x)
-#define teken_printf(x,...)
-#else /* !(__FreeBSD__ && _KERNEL) */
-#include <sys/types.h>
-#include <assert.h>
-#include <inttypes.h>
-#include <stdio.h>
-#include <string.h>
-#define teken_assert(x) assert(x)
-#define teken_printf(x,...) do { \
- if (df != NULL) \
- fprintf(df, x, ## __VA_ARGS__); \
-} while (0)
-/* debug messages */
-static FILE *df;
-#endif /* __FreeBSD__ && _KERNEL */
-
-#include "teken.h"
-
-#ifdef TEKEN_UTF8
-#include "teken_wcwidth.h"
-#else /* !TEKEN_UTF8 */
-#ifdef TEKEN_XTERM
-#define teken_wcwidth(c) ((c <= 0x1B) ? -1 : 1)
-#else /* !TEKEN_XTERM */
-#define teken_wcwidth(c) (1)
-#endif /* TEKEN_XTERM */
-#endif /* TEKEN_UTF8 */
-
-#if defined(TEKEN_XTERM) && defined(TEKEN_UTF8)
-#include "teken_scs.h"
-#else /* !(TEKEN_XTERM && TEKEN_UTF8) */
-#define teken_scs_process(t, c) (c)
-#define teken_scs_restore(t)
-#define teken_scs_save(t)
-#define teken_scs_set(t, g, ts)
-#define teken_scs_switch(t, g)
-#endif /* TEKEN_XTERM && TEKEN_UTF8 */
-
-/* Private flags for teken_format_t. */
-#define TF_REVERSE 0x08
-
-/* Private flags for t_stateflags. */
-#define TS_FIRSTDIGIT 0x01 /* First numeric digit in escape sequence. */
-#define TS_INSERT 0x02 /* Insert mode. */
-#define TS_AUTOWRAP 0x04 /* Autowrap. */
-#define TS_ORIGIN 0x08 /* Origin mode. */
-#ifdef TEKEN_XTERM
-#define TS_WRAPPED 0x10 /* Next character should be printed on col 0. */
-#else /* !TEKEN_XTERM */
-#define TS_WRAPPED 0x00 /* Simple line wrapping. */
-#endif /* TEKEN_XTERM */
-
-/* Character that blanks a cell. */
-#define BLANK ' '
-
-static teken_state_t teken_state_init;
-
-/*
- * Wrappers for hooks.
- */
-
-static inline void
-teken_funcs_bell(teken_t *t)
-{
-
- t->t_funcs->tf_bell(t->t_softc);
-}
-
-static inline void
-teken_funcs_cursor(teken_t *t)
-{
-
- teken_assert(t->t_cursor.tp_row < t->t_winsize.tp_row);
- teken_assert(t->t_cursor.tp_col < t->t_winsize.tp_col);
-
- t->t_funcs->tf_cursor(t->t_softc, &t->t_cursor);
-}
-
-static inline void
-teken_funcs_putchar(teken_t *t, const teken_pos_t *p, teken_char_t c,
- const teken_attr_t *a)
-{
- teken_attr_t ta;
-
- teken_assert(p->tp_row < t->t_winsize.tp_row);
- teken_assert(p->tp_col < t->t_winsize.tp_col);
-
- /* Apply inversion. */
- if (a->ta_format & TF_REVERSE) {
- ta.ta_format = a->ta_format;
- ta.ta_fgcolor = a->ta_bgcolor;
- ta.ta_bgcolor = a->ta_fgcolor;
- a = &ta;
- }
-
- t->t_funcs->tf_putchar(t->t_softc, p, c, a);
-}
-
-static inline void
-teken_funcs_fill(teken_t *t, const teken_rect_t *r,
- const teken_char_t c, const teken_attr_t *a)
-{
- teken_attr_t ta;
-
- teken_assert(r->tr_end.tp_row > r->tr_begin.tp_row);
- teken_assert(r->tr_end.tp_row <= t->t_winsize.tp_row);
- teken_assert(r->tr_end.tp_col > r->tr_begin.tp_col);
- teken_assert(r->tr_end.tp_col <= t->t_winsize.tp_col);
-
- /* Apply inversion. */
- if (a->ta_format & TF_REVERSE) {
- ta.ta_format = a->ta_format;
- ta.ta_fgcolor = a->ta_bgcolor;
- ta.ta_bgcolor = a->ta_fgcolor;
- a = &ta;
- }
-
- t->t_funcs->tf_fill(t->t_softc, r, c, a);
-}
-
-static inline void
-teken_funcs_copy(teken_t *t, const teken_rect_t *r, const teken_pos_t *p)
-{
-
- teken_assert(r->tr_end.tp_row > r->tr_begin.tp_row);
- teken_assert(r->tr_end.tp_row <= t->t_winsize.tp_row);
- teken_assert(r->tr_end.tp_col > r->tr_begin.tp_col);
- teken_assert(r->tr_end.tp_col <= t->t_winsize.tp_col);
- teken_assert(p->tp_row + (r->tr_end.tp_row - r->tr_begin.tp_row) <= t->t_winsize.tp_row);
- teken_assert(p->tp_col + (r->tr_end.tp_col - r->tr_begin.tp_col) <= t->t_winsize.tp_col);
-
- t->t_funcs->tf_copy(t->t_softc, r, p);
-}
-
-static inline void
-teken_funcs_param(teken_t *t, int cmd, unsigned int value)
-{
-
- t->t_funcs->tf_param(t->t_softc, cmd, value);
-}
-
-static inline void
-teken_funcs_respond(teken_t *t, const void *buf, size_t len)
-{
-
- t->t_funcs->tf_respond(t->t_softc, buf, len);
-}
-
-#include "teken_subr.h"
-#include "teken_subr_compat.h"
-
-/*
- * Programming interface.
- */
-
-void
-teken_init(teken_t *t, const teken_funcs_t *tf, void *softc)
-{
- teken_pos_t tp = { .tp_row = 24, .tp_col = 80 };
-
-#if !(defined(__FreeBSD__) && defined(_KERNEL))
- df = fopen("teken.log", "w");
- if (df != NULL)
- setvbuf(df, NULL, _IOLBF, BUFSIZ);
-#endif /* !(__FreeBSD__ && _KERNEL) */
-
- t->t_funcs = tf;
- t->t_softc = softc;
-
- t->t_nextstate = teken_state_init;
-
- t->t_defattr.ta_format = 0;
- t->t_defattr.ta_fgcolor = TC_WHITE;
- t->t_defattr.ta_bgcolor = TC_BLACK;
- teken_subr_do_reset(t);
-
-#ifdef TEKEN_UTF8
- t->t_utf8_left = 0;
-#endif /* TEKEN_UTF8 */
-
- teken_set_winsize(t, &tp);
-}
-
-static void
-teken_input_char(teken_t *t, teken_char_t c)
-{
-
- switch (c) {
- case '\0':
- break;
- case '\a':
- teken_subr_bell(t);
- break;
- case '\b':
- teken_subr_backspace(t);
- break;
- case '\n':
- case '\x0B':
- teken_subr_newline(t);
- break;
- case '\x0C':
- teken_subr_newpage(t);
- break;
-#if defined(TEKEN_XTERM) && defined(TEKEN_UTF8)
- case '\x0E':
- teken_scs_switch(t, 1);
- break;
- case '\x0F':
- teken_scs_switch(t, 0);
- break;
-#endif /* TEKEN_XTERM && TEKEN_UTF8 */
- case '\r':
- teken_subr_carriage_return(t);
- break;
- case '\t':
- teken_subr_horizontal_tab(t);
- break;
- default:
- t->t_nextstate(t, c);
- break;
- }
-
- /* Post-processing assertions. */
- teken_assert(t->t_cursor.tp_row >= t->t_originreg.ts_begin);
- teken_assert(t->t_cursor.tp_row < t->t_originreg.ts_end);
- teken_assert(t->t_cursor.tp_row < t->t_winsize.tp_row);
- teken_assert(t->t_cursor.tp_col < t->t_winsize.tp_col);
- teken_assert(t->t_saved_cursor.tp_row < t->t_winsize.tp_row);
- teken_assert(t->t_saved_cursor.tp_col < t->t_winsize.tp_col);
- teken_assert(t->t_scrollreg.ts_end <= t->t_winsize.tp_row);
- teken_assert(t->t_scrollreg.ts_begin < t->t_scrollreg.ts_end);
- /* Origin region has to be window size or the same as scrollreg. */
- teken_assert((t->t_originreg.ts_begin == t->t_scrollreg.ts_begin &&
- t->t_originreg.ts_end == t->t_scrollreg.ts_end) ||
- (t->t_originreg.ts_begin == 0 &&
- t->t_originreg.ts_end == t->t_winsize.tp_row));
-}
-
-static void
-teken_input_byte(teken_t *t, unsigned char c)
-{
-
-#ifdef TEKEN_UTF8
- /*
- * UTF-8 handling.
- */
- if ((c & 0x80) == 0x00) {
- /* One-byte sequence. */
- t->t_utf8_left = 0;
- teken_input_char(t, c);
- } else if ((c & 0xe0) == 0xc0) {
- /* Two-byte sequence. */
- t->t_utf8_left = 1;
- t->t_utf8_partial = c & 0x1f;
- } else if ((c & 0xf0) == 0xe0) {
- /* Three-byte sequence. */
- t->t_utf8_left = 2;
- t->t_utf8_partial = c & 0x0f;
- } else if ((c & 0xf8) == 0xf0) {
- /* Four-byte sequence. */
- t->t_utf8_left = 3;
- t->t_utf8_partial = c & 0x07;
- } else if ((c & 0xc0) == 0x80) {
- if (t->t_utf8_left == 0)
- return;
- t->t_utf8_left--;
- t->t_utf8_partial = (t->t_utf8_partial << 6) | (c & 0x3f);
- if (t->t_utf8_left == 0) {
- teken_printf("Got UTF-8 char %x\n", t->t_utf8_partial);
- teken_input_char(t, t->t_utf8_partial);
- }
- }
-#else /* !TEKEN_UTF8 */
- teken_input_char(t, c);
-#endif /* TEKEN_UTF8 */
-}
-
-void
-teken_input(teken_t *t, const void *buf, size_t len)
-{
- const char *c = buf;
-
- while (len-- > 0)
- teken_input_byte(t, *c++);
-}
-
-void
-teken_set_cursor(teken_t *t, const teken_pos_t *p)
-{
-
- /* XXX: bounds checking with originreg! */
- teken_assert(p->tp_row < t->t_winsize.tp_row);
- teken_assert(p->tp_col < t->t_winsize.tp_col);
-
- t->t_cursor = *p;
-}
-
-const teken_attr_t *
-teken_get_curattr(teken_t *t)
-{
-
- return (&t->t_curattr);
-}
-
-void
-teken_set_curattr(teken_t *t, const teken_attr_t *a)
-{
-
- t->t_curattr = *a;
-}
-
-const teken_attr_t *
-teken_get_defattr(teken_t *t)
-{
-
- return (&t->t_defattr);
-}
-
-void
-teken_set_defattr(teken_t *t, const teken_attr_t *a)
-{
-
- t->t_curattr = t->t_saved_curattr = t->t_defattr = *a;
-}
-
-void
-teken_set_winsize(teken_t *t, const teken_pos_t *p)
-{
-
- t->t_winsize = *p;
- /* XXX: bounds checking with cursor/etc! */
- t->t_scrollreg.ts_begin = 0;
- t->t_scrollreg.ts_end = t->t_winsize.tp_row;
- t->t_originreg = t->t_scrollreg;
-}
-
-/*
- * State machine.
- */
-
-static void
-teken_state_switch(teken_t *t, teken_state_t *s)
-{
-
- t->t_nextstate = s;
- t->t_curnum = 0;
- t->t_stateflags |= TS_FIRSTDIGIT;
-}
-
-static int
-teken_state_numbers(teken_t *t, teken_char_t c)
-{
-
- teken_assert(t->t_curnum < T_NUMSIZE);
-
- if (c >= '0' && c <= '9') {
- /*
- * Don't do math with the default value of 1 when a
- * custom number is inserted.
- */
- if (t->t_stateflags & TS_FIRSTDIGIT) {
- t->t_stateflags &= ~TS_FIRSTDIGIT;
- t->t_nums[t->t_curnum] = 0;
- } else {
- t->t_nums[t->t_curnum] *= 10;
- }
-
- t->t_nums[t->t_curnum] += c - '0';
- return (1);
- } else if (c == ';') {
- if (t->t_stateflags & TS_FIRSTDIGIT)
- t->t_nums[t->t_curnum] = 0;
-
- /* Only allow a limited set of arguments. */
- if (++t->t_curnum == T_NUMSIZE) {
- teken_state_switch(t, teken_state_init);
- return (1);
- }
-
- t->t_stateflags |= TS_FIRSTDIGIT;
- return (1);
- } else {
- if (t->t_stateflags & TS_FIRSTDIGIT && t->t_curnum > 0) {
- /* Finish off the last empty argument. */
- t->t_nums[t->t_curnum] = 0;
- t->t_curnum++;
- } else if ((t->t_stateflags & TS_FIRSTDIGIT) == 0) {
- /* Also count the last argument. */
- t->t_curnum++;
- }
- }
-
- return (0);
-}
-
-#include "teken_state.h"
diff --git a/sys/dev/syscons/teken/teken.h b/sys/dev/syscons/teken/teken.h
deleted file mode 100644
index dd19e76..0000000
--- a/sys/dev/syscons/teken/teken.h
+++ /dev/null
@@ -1,184 +0,0 @@
-/*-
- * Copyright (c) 2008-2009 Ed Schouten <ed@FreeBSD.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef _TEKEN_H_
-#define _TEKEN_H_
-
-/*
- * libteken: terminal emulation library.
- *
- * This library converts an UTF-8 stream of bytes to terminal drawing
- * commands.
- *
- * Configuration switches:
- * - TEKEN_UTF8: Enable/disable UTF-8 handling.
- * - TEKEN_XTERM: Enable xterm-style emulation, instead of cons25.
- */
-
-#if defined(__FreeBSD__) && defined(_KERNEL)
-#include "opt_teken.h"
-#endif /* __FreeBSD__ && _KERNEL */
-
-#ifdef TEKEN_UTF8
-typedef uint32_t teken_char_t;
-#else /* !TEKEN_UTF8 */
-typedef unsigned char teken_char_t;
-#endif /* TEKEN_UTF8 */
-typedef unsigned short teken_unit_t;
-typedef unsigned char teken_format_t;
-#define TF_BOLD 0x01
-#define TF_UNDERLINE 0x02
-#define TF_BLINK 0x04
-typedef unsigned char teken_color_t;
-#define TC_BLACK 0
-#define TC_RED 1
-#define TC_GREEN 2
-#define TC_BROWN 3
-#define TC_BLUE 4
-#define TC_MAGENTA 5
-#define TC_CYAN 6
-#define TC_WHITE 7
-#define TC_NCOLORS 8
-
-typedef struct {
- teken_unit_t tp_row;
- teken_unit_t tp_col;
-} teken_pos_t;
-typedef struct {
- teken_pos_t tr_begin;
- teken_pos_t tr_end;
-} teken_rect_t;
-typedef struct {
- teken_format_t ta_format;
- teken_color_t ta_fgcolor;
- teken_color_t ta_bgcolor;
-} teken_attr_t;
-typedef struct {
- teken_unit_t ts_begin;
- teken_unit_t ts_end;
-} teken_span_t;
-
-typedef struct __teken teken_t;
-
-typedef void teken_state_t(teken_t *, teken_char_t);
-
-/*
- * Drawing routines supplied by the user.
- */
-
-typedef void tf_bell_t(void *);
-typedef void tf_cursor_t(void *, const teken_pos_t *);
-typedef void tf_putchar_t(void *, const teken_pos_t *, teken_char_t,
- const teken_attr_t *);
-typedef void tf_fill_t(void *, const teken_rect_t *, teken_char_t,
- const teken_attr_t *);
-typedef void tf_copy_t(void *, const teken_rect_t *, const teken_pos_t *);
-typedef void tf_param_t(void *, int, unsigned int);
-#define TP_SHOWCURSOR 0
-#define TP_CURSORKEYS 1
-#define TP_KEYPADAPP 2
-#define TP_AUTOREPEAT 3
-#define TP_SWITCHVT 4
-#define TP_132COLS 5
-#define TP_SETBELLPD 6
-#define TP_SETBELLPD_PITCH(pd) ((pd) >> 16)
-#define TP_SETBELLPD_DURATION(pd) ((pd) & 0xffff)
-typedef void tf_respond_t(void *, const void *, size_t);
-
-typedef struct {
- tf_bell_t *tf_bell;
- tf_cursor_t *tf_cursor;
- tf_putchar_t *tf_putchar;
- tf_fill_t *tf_fill;
- tf_copy_t *tf_copy;
- tf_param_t *tf_param;
- tf_respond_t *tf_respond;
-} teken_funcs_t;
-
-#if defined(TEKEN_XTERM) && defined(TEKEN_UTF8)
-typedef teken_char_t teken_scs_t(teken_char_t);
-#endif /* TEKEN_XTERM && TEKEN_UTF8 */
-
-/*
- * Terminal state.
- */
-
-struct __teken {
- const teken_funcs_t *t_funcs;
- void *t_softc;
-
- teken_state_t *t_nextstate;
- unsigned int t_stateflags;
-
-#define T_NUMSIZE 8
- unsigned int t_nums[T_NUMSIZE];
- unsigned int t_curnum;
-
- teken_pos_t t_cursor;
- teken_attr_t t_curattr;
- teken_pos_t t_saved_cursor;
- teken_attr_t t_saved_curattr;
-
- teken_attr_t t_defattr;
- teken_pos_t t_winsize;
-
- /* For DECSTBM. */
- teken_span_t t_scrollreg;
- /* For DECOM. */
- teken_span_t t_originreg;
-
-#define T_NUMCOL 160
- unsigned int t_tabstops[T_NUMCOL / (sizeof(unsigned int) * 8)];
-
-#ifdef TEKEN_UTF8
- unsigned int t_utf8_left;
- teken_char_t t_utf8_partial;
-#endif /* TEKEN_UTF8 */
-
-#if defined(TEKEN_XTERM) && defined(TEKEN_UTF8)
- unsigned int t_curscs;
- teken_scs_t *t_saved_curscs;
- teken_scs_t *t_scs[2];
-#endif /* TEKEN_XTERM && TEKEN_UTF8 */
-};
-
-/* Initialize teken structure. */
-void teken_init(teken_t *, const teken_funcs_t *, void *);
-
-/* Deliver character input. */
-void teken_input(teken_t *, const void *, size_t);
-
-/* Get/set teken attributes. */
-const teken_attr_t *teken_get_curattr(teken_t *);
-const teken_attr_t *teken_get_defattr(teken_t *);
-void teken_set_cursor(teken_t *, const teken_pos_t *);
-void teken_set_curattr(teken_t *, const teken_attr_t *);
-void teken_set_defattr(teken_t *, const teken_attr_t *);
-void teken_set_winsize(teken_t *, const teken_pos_t *);
-
-#endif /* !_TEKEN_H_ */
diff --git a/sys/dev/syscons/teken/teken_demo.c b/sys/dev/syscons/teken/teken_demo.c
deleted file mode 100644
index 02463a7..0000000
--- a/sys/dev/syscons/teken/teken_demo.c
+++ /dev/null
@@ -1,367 +0,0 @@
-/*-
- * Copyright (c) 2008-2009 Ed Schouten <ed@FreeBSD.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#include <sys/ioctl.h>
-
-#include <assert.h>
-#include <errno.h>
-#include <inttypes.h>
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#include <ncurses.h>
-#if defined(__FreeBSD__)
-#include <libutil.h>
-#elif defined(__linux__)
-#include <pty.h>
-#else
-#include <util.h>
-#endif
-
-#include "teken.h"
-
-static tf_bell_t test_bell;
-static tf_cursor_t test_cursor;
-static tf_putchar_t test_putchar;
-static tf_fill_t test_fill;
-static tf_copy_t test_copy;
-static tf_param_t test_param;
-static tf_respond_t test_respond;
-
-static teken_funcs_t tf = {
- .tf_bell = test_bell,
- .tf_cursor = test_cursor,
- .tf_putchar = test_putchar,
- .tf_fill = test_fill,
- .tf_copy = test_copy,
- .tf_param = test_param,
- .tf_respond = test_respond,
-};
-
-struct pixel {
- teken_char_t c;
- teken_attr_t a;
-};
-
-#define NCOLS 80
-#ifdef TEKEN_XTERM
-#define NROWS 24
-#else /* !TEKEN_XTERM */
-#define NROWS 25
-#endif /* TEKEN_XTERM */
-struct pixel buffer[NCOLS][NROWS];
-
-static int ptfd;
-
-static void
-printchar(const teken_pos_t *p)
-{
- int y, x, attr = 0;
- struct pixel *px;
- char str[5] = { 0 };
-
- assert(p->tp_row < NROWS);
- assert(p->tp_col < NCOLS);
-
- getyx(stdscr, y, x);
-
- px = &buffer[p->tp_col][p->tp_row];
-
- /* Convert Unicode to UTF-8. */
-#ifdef TEKEN_UTF8
- if (px->c < 0x80) {
- str[0] = px->c;
- } else if (px->c < 0x800) {
- str[0] = 0xc0 | (px->c >> 6);
- str[1] = 0x80 | (px->c & 0x3f);
- } else if (px->c < 0x10000) {
- str[0] = 0xe0 | (px->c >> 12);
- str[1] = 0x80 | ((px->c >> 6) & 0x3f);
- str[2] = 0x80 | (px->c & 0x3f);
- } else {
- str[0] = 0xf0 | (px->c >> 18);
- str[1] = 0x80 | ((px->c >> 12) & 0x3f);
- str[2] = 0x80 | ((px->c >> 6) & 0x3f);
- str[3] = 0x80 | (px->c & 0x3f);
- }
-#else /* !TEKEN_UTF8 */
- str[0] = px->c;
-#endif /* TEKEN_UTF8 */
-
- if (px->a.ta_format & TF_BOLD)
- attr |= A_BOLD;
- if (px->a.ta_format & TF_UNDERLINE)
- attr |= A_UNDERLINE;
- if (px->a.ta_format & TF_BLINK)
- attr |= A_BLINK;
-
- bkgdset(attr | COLOR_PAIR(px->a.ta_fgcolor + 8 * px->a.ta_bgcolor));
- mvaddstr(p->tp_row, p->tp_col, str);
-
- move(y, x);
-}
-
-static void
-test_bell(void *s __unused)
-{
-
- beep();
-}
-
-static void
-test_cursor(void *s __unused, const teken_pos_t *p)
-{
-
- move(p->tp_row, p->tp_col);
-}
-
-static void
-test_putchar(void *s __unused, const teken_pos_t *p, teken_char_t c,
- const teken_attr_t *a)
-{
-
- buffer[p->tp_col][p->tp_row].c = c;
- buffer[p->tp_col][p->tp_row].a = *a;
- printchar(p);
-}
-
-static void
-test_fill(void *s, const teken_rect_t *r, teken_char_t c,
- const teken_attr_t *a)
-{
- teken_pos_t p;
-
- /* Braindead implementation of fill() - just call putchar(). */
- for (p.tp_row = r->tr_begin.tp_row; p.tp_row < r->tr_end.tp_row; p.tp_row++)
- for (p.tp_col = r->tr_begin.tp_col; p.tp_col < r->tr_end.tp_col; p.tp_col++)
- test_putchar(s, &p, c, a);
-}
-
-static void
-test_copy(void *s __unused, const teken_rect_t *r, const teken_pos_t *p)
-{
- int nrow, ncol, x, y; /* Has to be signed - >= 0 comparison */
- teken_pos_t d;
-
- /*
- * Copying is a little tricky. We must make sure we do it in
- * correct order, to make sure we don't overwrite our own data.
- */
-
- nrow = r->tr_end.tp_row - r->tr_begin.tp_row;
- ncol = r->tr_end.tp_col - r->tr_begin.tp_col;
-
- if (p->tp_row < r->tr_begin.tp_row) {
- /* Copy from top to bottom. */
- if (p->tp_col < r->tr_begin.tp_col) {
- /* Copy from left to right. */
- for (y = 0; y < nrow; y++) {
- d.tp_row = p->tp_row + y;
- for (x = 0; x < ncol; x++) {
- d.tp_col = p->tp_col + x;
- buffer[d.tp_col][d.tp_row] =
- buffer[r->tr_begin.tp_col + x][r->tr_begin.tp_row + y];
- printchar(&d);
- }
- }
- } else {
- /* Copy from right to left. */
- for (y = 0; y < nrow; y++) {
- d.tp_row = p->tp_row + y;
- for (x = ncol - 1; x >= 0; x--) {
- d.tp_col = p->tp_col + x;
- buffer[d.tp_col][d.tp_row] =
- buffer[r->tr_begin.tp_col + x][r->tr_begin.tp_row + y];
- printchar(&d);
- }
- }
- }
- } else {
- /* Copy from bottom to top. */
- if (p->tp_col < r->tr_begin.tp_col) {
- /* Copy from left to right. */
- for (y = nrow - 1; y >= 0; y--) {
- d.tp_row = p->tp_row + y;
- for (x = 0; x < ncol; x++) {
- d.tp_col = p->tp_col + x;
- buffer[d.tp_col][d.tp_row] =
- buffer[r->tr_begin.tp_col + x][r->tr_begin.tp_row + y];
- printchar(&d);
- }
- }
- } else {
- /* Copy from right to left. */
- for (y = nrow - 1; y >= 0; y--) {
- d.tp_row = p->tp_row + y;
- for (x = ncol - 1; x >= 0; x--) {
- d.tp_col = p->tp_col + x;
- buffer[d.tp_col][d.tp_row] =
- buffer[r->tr_begin.tp_col + x][r->tr_begin.tp_row + y];
- printchar(&d);
- }
- }
- }
- }
-}
-
-static void
-test_param(void *s __unused, int cmd, unsigned int value)
-{
-
- switch (cmd) {
- case TP_SHOWCURSOR:
- curs_set(value);
- break;
- case TP_KEYPADAPP:
- keypad(stdscr, value ? TRUE : FALSE);
- break;
- }
-}
-
-static void
-test_respond(void *s __unused, const void *buf, size_t len)
-{
-
- write(ptfd, buf, len);
-}
-
-static void
-redraw_border(void)
-{
- unsigned int i;
-
- for (i = 0; i < NROWS; i++)
- mvaddch(i, NCOLS, '|');
- for (i = 0; i < NCOLS; i++)
- mvaddch(NROWS, i, '-');
-
- mvaddch(NROWS, NCOLS, '+');
-}
-
-static void
-redraw_all(void)
-{
- teken_pos_t tp;
-
- for (tp.tp_row = 0; tp.tp_row < NROWS; tp.tp_row++)
- for (tp.tp_col = 0; tp.tp_col < NCOLS; tp.tp_col++)
- printchar(&tp);
-
- redraw_border();
-}
-
-int
-main(int argc __unused, char *argv[] __unused)
-{
- struct winsize ws;
- teken_t t;
- teken_pos_t tp;
- fd_set rfds;
- char b[256];
- ssize_t bl;
- const int ccolors[8] = {
- COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_YELLOW,
- COLOR_BLUE, COLOR_MAGENTA, COLOR_CYAN, COLOR_WHITE
- };
- int i, j;
-
-#ifdef TEKEN_UTF8
- setlocale(LC_CTYPE, "UTF-8");
-#endif /* TEKEN_UTF8 */
-
- tp.tp_row = ws.ws_row = NROWS;
- tp.tp_col = ws.ws_col = NCOLS;
-
- switch (forkpty(&ptfd, NULL, NULL, &ws)) {
- case -1:
- perror("forkpty");
- exit(1);
- case 0:
-#ifdef TEKEN_XTERM
- setenv("TERM", "xterm", 1);
-#else /* !TEKEN_XTERM */
- setenv("TERM", "cons25", 1);
-#endif /* TEKEN_XTERM */
-#ifdef TEKEN_UTF8
- setenv("LC_CTYPE", "UTF-8", 0);
-#endif /* TEKEN_UTF8 */
- execlp("zsh", "-zsh", NULL);
- execlp("bash", "-bash", NULL);
- execlp("sh", "-sh", NULL);
- _exit(1);
- }
-
- teken_init(&t, &tf, NULL);
- teken_set_winsize(&t, &tp);
-
- initscr();
- raw();
- start_color();
- for (i = 0; i < 8; i++)
- for (j = 0; j < 8; j++)
- init_pair(i + 8 * j, ccolors[i], ccolors[j]);
-
- redraw_border();
-
- FD_ZERO(&rfds);
-
- for (;;) {
- FD_SET(STDIN_FILENO, &rfds);
- FD_SET(ptfd, &rfds);
-
- if (select(ptfd + 1, &rfds, NULL, NULL, NULL) < 0) {
- if (errno == EINTR) {
- redraw_all();
- refresh();
- continue;
- }
- break;
- }
-
- if (FD_ISSET(STDIN_FILENO, &rfds)) {
- bl = read(STDIN_FILENO, b, sizeof b);
- if (bl <= 0)
- break;
- write(ptfd, b, bl);
- }
-
- if (FD_ISSET(ptfd, &rfds)) {
- bl = read(ptfd, b, sizeof b);
- if (bl <= 0)
- break;
- teken_input(&t, b, bl);
- refresh();
- }
- }
-
- endwin();
-
- return (0);
-}
diff --git a/sys/dev/syscons/teken/teken_scs.h b/sys/dev/syscons/teken/teken_scs.h
deleted file mode 100644
index baeb296..0000000
--- a/sys/dev/syscons/teken/teken_scs.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/*-
- * Copyright (c) 2009 Ed Schouten <ed@FreeBSD.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-static void
-teken_scs_set(teken_t *t, unsigned int g, teken_scs_t *ts)
-{
-
- t->t_scs[g] = ts;
-}
-
-static void
-teken_scs_switch(teken_t *t, unsigned int g)
-{
-
- t->t_curscs = g;
-}
-
-static void
-teken_scs_restore(teken_t *t)
-{
-
- t->t_scs[t->t_curscs] = t->t_saved_curscs;
-}
-
-static void
-teken_scs_save(teken_t *t)
-{
-
- t->t_saved_curscs = t->t_scs[t->t_curscs];
-}
-
-static teken_char_t
-teken_scs_process(teken_t *t, teken_char_t c)
-{
-
- return (t->t_scs[t->t_curscs](c));
-}
-
-/* Unicode points for VT100 box drawing. */
-static const uint16_t teken_boxdrawing[31] = {
- 0x25c6, 0x2592, 0x2409, 0x240c, 0x240d, 0x240a, 0x00b0, 0x00b1,
- 0x2424, 0x240b, 0x2518, 0x2510, 0x250c, 0x2514, 0x253c, 0x23ba,
- 0x23bb, 0x2500, 0x23bc, 0x23bd, 0x251c, 0x2524, 0x2534, 0x252c,
- 0x2502, 0x2264, 0x2265, 0x03c0, 0x2260, 0x00a3, 0x00b7
-};
-
-static teken_char_t
-teken_scs_special_graphics(teken_char_t c)
-{
-
- /* Box drawing. */
- if (c >= '`' && c <= '~')
- return (teken_boxdrawing[c - '`']);
- return (c);
-}
-
-static teken_char_t
-teken_scs_uk_national(teken_char_t c)
-{
-
- /* Pound sign. */
- if (c == '#')
- return (0xa3);
- return (c);
-}
-
-static teken_char_t
-teken_scs_us_ascii(teken_char_t c)
-{
-
- /* No processing. */
- return (c);
-}
diff --git a/sys/dev/syscons/teken/teken_stress.c b/sys/dev/syscons/teken/teken_stress.c
deleted file mode 100644
index 40d09bf..0000000
--- a/sys/dev/syscons/teken/teken_stress.c
+++ /dev/null
@@ -1,123 +0,0 @@
-/*-
- * Copyright (c) 2008-2009 Ed Schouten <ed@FreeBSD.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#include <sys/cdefs.h>
-
-#include <fcntl.h>
-#include <inttypes.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#include "teken.h"
-
-static tf_bell_t stress_bell;
-static tf_cursor_t stress_cursor;
-static tf_putchar_t stress_putchar;
-static tf_fill_t stress_fill;
-static tf_copy_t stress_copy;
-static tf_param_t stress_param;
-static tf_respond_t stress_respond;
-
-static teken_funcs_t tf = {
- .tf_bell = stress_bell,
- .tf_cursor = stress_cursor,
- .tf_putchar = stress_putchar,
- .tf_fill = stress_fill,
- .tf_copy = stress_copy,
- .tf_param = stress_param,
- .tf_respond = stress_respond,
-};
-
-static void
-stress_bell(void *s __unused)
-{
-}
-
-static void
-stress_cursor(void *s __unused, const teken_pos_t *p __unused)
-{
-}
-
-static void
-stress_putchar(void *s __unused, const teken_pos_t *p __unused,
- teken_char_t c __unused, const teken_attr_t *a __unused)
-{
-}
-
-static void
-stress_fill(void *s __unused, const teken_rect_t *r __unused,
- teken_char_t c __unused, const teken_attr_t *a __unused)
-{
-}
-
-static void
-stress_copy(void *s __unused, const teken_rect_t *r __unused,
- const teken_pos_t *p __unused)
-{
-}
-
-static void
-stress_param(void *s __unused, int cmd __unused, unsigned int value __unused)
-{
-}
-
-static void
-stress_respond(void *s __unused, const void *buf __unused, size_t len __unused)
-{
-}
-
-int
-main(int argc __unused, char *argv[] __unused)
-{
- teken_t t;
- int rnd;
- unsigned int iteration = 0;
- char buf[2048];
-
- rnd = open("/dev/urandom", O_RDONLY);
- if (rnd < 0) {
- perror("/dev/urandom");
- exit(1);
- }
-
- teken_init(&t, &tf, NULL);
-
- for (;;) {
- if (read(rnd, buf, sizeof buf) != sizeof buf) {
- perror("read");
- exit(1);
- }
-
- teken_input(&t, buf, sizeof buf);
-
- iteration++;
- if ((iteration % 10000) == 0)
- printf("Processed %u frames\n", iteration);
- }
-}
diff --git a/sys/dev/syscons/teken/teken_subr.h b/sys/dev/syscons/teken/teken_subr.h
deleted file mode 100644
index 21982e2..0000000
--- a/sys/dev/syscons/teken/teken_subr.h
+++ /dev/null
@@ -1,1209 +0,0 @@
-/*-
- * Copyright (c) 2008-2009 Ed Schouten <ed@FreeBSD.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-static void teken_subr_cursor_up(teken_t *, unsigned int);
-static void teken_subr_erase_line(teken_t *, unsigned int);
-static void teken_subr_regular_character(teken_t *, teken_char_t);
-static void teken_subr_reset_to_initial_state(teken_t *);
-static void teken_subr_save_cursor(teken_t *);
-
-static inline int
-teken_tab_isset(teken_t *t, unsigned int col)
-{
- unsigned int b, o;
-
- if (col >= T_NUMCOL)
- return ((col % 8) == 0);
-
- b = col / (sizeof(unsigned int) * 8);
- o = col % (sizeof(unsigned int) * 8);
-
- return (t->t_tabstops[b] & (1 << o));
-}
-
-static inline void
-teken_tab_clear(teken_t *t, unsigned int col)
-{
- unsigned int b, o;
-
- if (col >= T_NUMCOL)
- return;
-
- b = col / (sizeof(unsigned int) * 8);
- o = col % (sizeof(unsigned int) * 8);
-
- t->t_tabstops[b] &= ~(1 << o);
-}
-
-static inline void
-teken_tab_set(teken_t *t, unsigned int col)
-{
- unsigned int b, o;
-
- if (col >= T_NUMCOL)
- return;
-
- b = col / (sizeof(unsigned int) * 8);
- o = col % (sizeof(unsigned int) * 8);
-
- t->t_tabstops[b] |= 1 << o;
-}
-
-static void
-teken_tab_default(teken_t *t)
-{
- unsigned int i;
-
- memset(&t->t_tabstops, 0, T_NUMCOL / 8);
-
- for (i = 8; i < T_NUMCOL; i += 8)
- teken_tab_set(t, i);
-}
-
-static void
-teken_subr_do_scroll(teken_t *t, int amount)
-{
- teken_rect_t tr;
- teken_pos_t tp;
-
- teken_assert(t->t_cursor.tp_row <= t->t_winsize.tp_row);
- teken_assert(t->t_scrollreg.ts_end <= t->t_winsize.tp_row);
- teken_assert(amount != 0);
-
- /* Copy existing data 1 line up. */
- if (amount > 0) {
- /* Scroll down. */
-
- /* Copy existing data up. */
- if (t->t_scrollreg.ts_begin + amount < t->t_scrollreg.ts_end) {
- tr.tr_begin.tp_row = t->t_scrollreg.ts_begin + amount;
- tr.tr_begin.tp_col = 0;
- tr.tr_end.tp_row = t->t_scrollreg.ts_end;
- tr.tr_end.tp_col = t->t_winsize.tp_col;
- tp.tp_row = t->t_scrollreg.ts_begin;
- tp.tp_col = 0;
- teken_funcs_copy(t, &tr, &tp);
-
- tr.tr_begin.tp_row = t->t_scrollreg.ts_end - amount;
- } else {
- tr.tr_begin.tp_row = t->t_scrollreg.ts_begin;
- }
-
- /* Clear the last lines. */
- tr.tr_begin.tp_col = 0;
- tr.tr_end.tp_row = t->t_scrollreg.ts_end;
- tr.tr_end.tp_col = t->t_winsize.tp_col;
- teken_funcs_fill(t, &tr, BLANK, &t->t_curattr);
- } else {
- /* Scroll up. */
- amount = -amount;
-
- /* Copy existing data down. */
- if (t->t_scrollreg.ts_begin + amount < t->t_scrollreg.ts_end) {
- tr.tr_begin.tp_row = t->t_scrollreg.ts_begin;
- tr.tr_begin.tp_col = 0;
- tr.tr_end.tp_row = t->t_scrollreg.ts_end - amount;
- tr.tr_end.tp_col = t->t_winsize.tp_col;
- tp.tp_row = t->t_scrollreg.ts_begin + amount;
- tp.tp_col = 0;
- teken_funcs_copy(t, &tr, &tp);
-
- tr.tr_end.tp_row = t->t_scrollreg.ts_begin + amount;
- } else {
- tr.tr_end.tp_row = t->t_scrollreg.ts_end;
- }
-
- /* Clear the first lines. */
- tr.tr_begin.tp_row = t->t_scrollreg.ts_begin;
- tr.tr_begin.tp_col = 0;
- tr.tr_end.tp_col = t->t_winsize.tp_col;
- teken_funcs_fill(t, &tr, BLANK, &t->t_curattr);
- }
-}
-
-static ssize_t
-teken_subr_do_cpr(teken_t *t, unsigned int cmd, char response[16])
-{
-
- switch (cmd) {
- case 5: /* Operating status. */
- strcpy(response, "0n");
- return (2);
- case 6: { /* Cursor position. */
- int len;
-
- len = snprintf(response, 16, "%u;%uR",
- (t->t_cursor.tp_row - t->t_originreg.ts_begin) + 1,
- t->t_cursor.tp_col + 1);
-
- if (len >= 16)
- return (-1);
- return (len);
- }
- case 15: /* Printer status. */
- strcpy(response, "13n");
- return (3);
- case 25: /* UDK status. */
- strcpy(response, "20n");
- return (3);
- case 26: /* Keyboard status. */
- strcpy(response, "27;1n");
- return (5);
- default:
- teken_printf("Unknown DSR\n");
- return (-1);
- }
-}
-
-static void
-teken_subr_alignment_test(teken_t *t)
-{
- teken_rect_t tr;
-
- t->t_scrollreg.ts_begin = 0;
- t->t_scrollreg.ts_end = t->t_winsize.tp_row;
-
- t->t_cursor.tp_row = t->t_cursor.tp_col = 0;
- t->t_stateflags &= ~TS_WRAPPED;
- teken_funcs_cursor(t);
-
- tr.tr_begin.tp_row = 0;
- tr.tr_begin.tp_col = 0;
- tr.tr_end = t->t_winsize;
- teken_funcs_fill(t, &tr, 'E', &t->t_defattr);
-}
-
-static void
-teken_subr_backspace(teken_t *t)
-{
-
-#ifdef TEKEN_XTERM
- if (t->t_cursor.tp_col == 0)
- return;
-
- t->t_cursor.tp_col--;
- t->t_stateflags &= ~TS_WRAPPED;
-#else /* !TEKEN_XTERM */
- if (t->t_cursor.tp_col == 0) {
- if (t->t_cursor.tp_row == t->t_originreg.ts_begin)
- return;
- t->t_cursor.tp_row--;
- t->t_cursor.tp_col = t->t_winsize.tp_col - 1;
- } else {
- t->t_cursor.tp_col--;
- }
-#endif /* TEKEN_XTERM */
-
- teken_funcs_cursor(t);
-}
-
-static void
-teken_subr_bell(teken_t *t)
-{
-
- teken_funcs_bell(t);
-}
-
-static void
-teken_subr_carriage_return(teken_t *t)
-{
-
- t->t_cursor.tp_col = 0;
- t->t_stateflags &= ~TS_WRAPPED;
- teken_funcs_cursor(t);
-}
-
-static void
-teken_subr_cursor_backward(teken_t *t, unsigned int ncols)
-{
-
- if (ncols > t->t_cursor.tp_col)
- t->t_cursor.tp_col = 0;
- else
- t->t_cursor.tp_col -= ncols;
- t->t_stateflags &= ~TS_WRAPPED;
- teken_funcs_cursor(t);
-}
-
-static void
-teken_subr_cursor_backward_tabulation(teken_t *t, unsigned int ntabs)
-{
-
- do {
- /* Stop when we've reached the beginning of the line. */
- if (t->t_cursor.tp_col == 0)
- break;
-
- t->t_cursor.tp_col--;
-
- /* Tab marker set. */
- if (teken_tab_isset(t, t->t_cursor.tp_col))
- ntabs--;
- } while (ntabs > 0);
-
- teken_funcs_cursor(t);
-}
-
-static void
-teken_subr_cursor_down(teken_t *t, unsigned int nrows)
-{
-
- if (t->t_cursor.tp_row + nrows >= t->t_scrollreg.ts_end)
- t->t_cursor.tp_row = t->t_scrollreg.ts_end - 1;
- else
- t->t_cursor.tp_row += nrows;
- t->t_stateflags &= ~TS_WRAPPED;
- teken_funcs_cursor(t);
-}
-
-static void
-teken_subr_cursor_forward(teken_t *t, unsigned int ncols)
-{
-
- if (t->t_cursor.tp_col + ncols >= t->t_winsize.tp_col)
- t->t_cursor.tp_col = t->t_winsize.tp_col - 1;
- else
- t->t_cursor.tp_col += ncols;
- t->t_stateflags &= ~TS_WRAPPED;
- teken_funcs_cursor(t);
-}
-
-static void
-teken_subr_cursor_forward_tabulation(teken_t *t, unsigned int ntabs)
-{
-
- do {
- /* Stop when we've reached the end of the line. */
- if (t->t_cursor.tp_col == t->t_winsize.tp_col - 1)
- break;
-
- t->t_cursor.tp_col++;
-
- /* Tab marker set. */
- if (teken_tab_isset(t, t->t_cursor.tp_col))
- ntabs--;
- } while (ntabs > 0);
-
- teken_funcs_cursor(t);
-}
-
-static void
-teken_subr_cursor_next_line(teken_t *t, unsigned int ncols)
-{
-
- t->t_cursor.tp_col = 0;
- teken_subr_cursor_down(t, ncols);
-}
-
-static void
-teken_subr_cursor_position(teken_t *t, unsigned int row, unsigned int col)
-{
-
- t->t_cursor.tp_row = t->t_originreg.ts_begin + row - 1;
- if (row >= t->t_originreg.ts_end)
- t->t_cursor.tp_row = t->t_originreg.ts_end - 1;
-
- t->t_cursor.tp_col = col - 1;
- if (t->t_cursor.tp_col >= t->t_winsize.tp_col)
- t->t_cursor.tp_col = t->t_winsize.tp_col - 1;
-
- t->t_stateflags &= ~TS_WRAPPED;
- teken_funcs_cursor(t);
-}
-
-static void
-teken_subr_cursor_position_report(teken_t *t, unsigned int cmd)
-{
- char response[18] = "\x1B[";
- ssize_t len;
-
- len = teken_subr_do_cpr(t, cmd, response + 2);
- if (len < 0)
- return;
-
- teken_funcs_respond(t, response, len + 2);
-}
-
-static void
-teken_subr_cursor_previous_line(teken_t *t, unsigned int ncols)
-{
-
- t->t_cursor.tp_col = 0;
- teken_subr_cursor_up(t, ncols);
-}
-
-static void
-teken_subr_cursor_up(teken_t *t, unsigned int nrows)
-{
-
- if (t->t_scrollreg.ts_begin + nrows >= t->t_cursor.tp_row)
- t->t_cursor.tp_row = t->t_scrollreg.ts_begin;
- else
- t->t_cursor.tp_row -= nrows;
- t->t_stateflags &= ~TS_WRAPPED;
- teken_funcs_cursor(t);
-}
-
-static void
-teken_subr_delete_character(teken_t *t, unsigned int ncols)
-{
- teken_rect_t tr;
-
- tr.tr_begin.tp_row = t->t_cursor.tp_row;
- tr.tr_end.tp_row = t->t_cursor.tp_row + 1;
- tr.tr_end.tp_col = t->t_winsize.tp_col;
-
- if (t->t_cursor.tp_col + ncols >= t->t_winsize.tp_col) {
- tr.tr_begin.tp_col = t->t_cursor.tp_col;
- } else {
- /* Copy characters to the left. */
- tr.tr_begin.tp_col = t->t_cursor.tp_col + ncols;
- teken_funcs_copy(t, &tr, &t->t_cursor);
-
- tr.tr_begin.tp_col = t->t_winsize.tp_col - ncols;
- }
-
- /* Blank trailing columns. */
- teken_funcs_fill(t, &tr, BLANK, &t->t_curattr);
-}
-
-static void
-teken_subr_delete_line(teken_t *t, unsigned int nrows)
-{
- teken_rect_t tr;
-
- tr.tr_begin.tp_col = 0;
- tr.tr_end.tp_row = t->t_scrollreg.ts_end;
- tr.tr_end.tp_col = t->t_winsize.tp_col;
-
- if (t->t_cursor.tp_row + nrows >= t->t_scrollreg.ts_end) {
- tr.tr_begin.tp_row = t->t_cursor.tp_row;
- } else {
- teken_pos_t tp;
-
- /* Copy rows up. */
- tr.tr_begin.tp_row = t->t_cursor.tp_row + nrows;
- tp.tp_row = t->t_cursor.tp_row;
- tp.tp_col = 0;
- teken_funcs_copy(t, &tr, &tp);
-
- tr.tr_begin.tp_row = t->t_scrollreg.ts_end - nrows;
- }
-
- /* Blank trailing rows. */
- teken_funcs_fill(t, &tr, BLANK, &t->t_curattr);
-}
-
-static void
-teken_subr_device_control_string(teken_t *t __unused)
-{
-
- teken_printf("device control string???\n");
-}
-
-static void
-teken_subr_device_status_report(teken_t *t, unsigned int cmd)
-{
- char response[19] = "\x1B[?";
- ssize_t len;
-
- len = teken_subr_do_cpr(t, cmd, response + 3);
- if (len < 0)
- return;
-
- teken_funcs_respond(t, response, len + 3);
-}
-
-static void
-teken_subr_double_height_double_width_line_top(teken_t *t __unused)
-{
-
- teken_printf("double height double width top\n");
-}
-
-static void
-teken_subr_double_height_double_width_line_bottom(teken_t *t __unused)
-{
-
- teken_printf("double height double width bottom\n");
-}
-
-static void
-teken_subr_erase_character(teken_t *t, unsigned int ncols)
-{
- teken_rect_t tr;
-
- tr.tr_begin = t->t_cursor;
- tr.tr_end.tp_row = t->t_cursor.tp_row + 1;
-
- if (t->t_cursor.tp_col + ncols >= t->t_winsize.tp_col)
- tr.tr_end.tp_col = t->t_winsize.tp_col;
- else
- tr.tr_end.tp_col = t->t_cursor.tp_col + ncols;
-
- teken_funcs_fill(t, &tr, BLANK, &t->t_curattr);
-}
-
-static void
-teken_subr_erase_display(teken_t *t, unsigned int mode)
-{
- teken_rect_t r;
-
- r.tr_begin.tp_col = 0;
- r.tr_end.tp_col = t->t_winsize.tp_col;
-
- switch (mode) {
- case 1: /* Erase from the top to the cursor. */
- teken_subr_erase_line(t, 1);
-
- /* Erase lines above. */
- if (t->t_cursor.tp_row == 0)
- return;
- r.tr_begin.tp_row = 0;
- r.tr_end.tp_row = t->t_cursor.tp_row;
- break;
- case 2: /* Erase entire display. */
- r.tr_begin.tp_row = 0;
- r.tr_end.tp_row = t->t_winsize.tp_row;
- break;
- default: /* Erase from cursor to the bottom. */
- teken_subr_erase_line(t, 0);
-
- /* Erase lines below. */
- if (t->t_cursor.tp_row == t->t_winsize.tp_row - 1)
- return;
- r.tr_begin.tp_row = t->t_cursor.tp_row + 1;
- r.tr_end.tp_row = t->t_winsize.tp_row;
- break;
- }
-
- teken_funcs_fill(t, &r, BLANK, &t->t_curattr);
-}
-
-static void
-teken_subr_erase_line(teken_t *t, unsigned int mode)
-{
- teken_rect_t r;
-
- r.tr_begin.tp_row = t->t_cursor.tp_row;
- r.tr_end.tp_row = t->t_cursor.tp_row + 1;
-
- switch (mode) {
- case 1: /* Erase from the beginning of the line to the cursor. */
- r.tr_begin.tp_col = 0;
- r.tr_end.tp_col = t->t_cursor.tp_col + 1;
- break;
- case 2: /* Erase entire line. */
- r.tr_begin.tp_col = 0;
- r.tr_end.tp_col = t->t_winsize.tp_col;
- break;
- default: /* Erase from cursor to the end of the line. */
- r.tr_begin.tp_col = t->t_cursor.tp_col;
- r.tr_end.tp_col = t->t_winsize.tp_col;
- break;
- }
-
- teken_funcs_fill(t, &r, BLANK, &t->t_curattr);
-}
-
-static void
-teken_subr_g0_scs_special_graphics(teken_t *t __unused)
-{
-
- teken_scs_set(t, 0, teken_scs_special_graphics);
-}
-
-static void
-teken_subr_g0_scs_uk_national(teken_t *t __unused)
-{
-
- teken_scs_set(t, 0, teken_scs_uk_national);
-}
-
-static void
-teken_subr_g0_scs_us_ascii(teken_t *t __unused)
-{
-
- teken_scs_set(t, 0, teken_scs_us_ascii);
-}
-
-static void
-teken_subr_g1_scs_special_graphics(teken_t *t __unused)
-{
-
- teken_scs_set(t, 1, teken_scs_special_graphics);
-}
-
-static void
-teken_subr_g1_scs_uk_national(teken_t *t __unused)
-{
-
- teken_scs_set(t, 1, teken_scs_uk_national);
-}
-
-static void
-teken_subr_g1_scs_us_ascii(teken_t *t __unused)
-{
-
- teken_scs_set(t, 1, teken_scs_us_ascii);
-}
-
-static void
-teken_subr_horizontal_position_absolute(teken_t *t, unsigned int col)
-{
-
- t->t_cursor.tp_col = col - 1;
- if (t->t_cursor.tp_col >= t->t_winsize.tp_col)
- t->t_cursor.tp_col = t->t_winsize.tp_col - 1;
-
- t->t_stateflags &= ~TS_WRAPPED;
- teken_funcs_cursor(t);
-}
-
-static void
-teken_subr_horizontal_tab(teken_t *t)
-{
-#ifdef TEKEN_XTERM
- teken_rect_t tr;
-
- tr.tr_begin = t->t_cursor;
- teken_subr_cursor_forward_tabulation(t, 1);
- tr.tr_end.tp_row = tr.tr_begin.tp_row + 1;
- tr.tr_end.tp_col = t->t_cursor.tp_col;
-
- /* Blank region that we skipped. */
- if (tr.tr_end.tp_col > tr.tr_begin.tp_col)
- teken_funcs_fill(t, &tr, BLANK, &t->t_curattr);
-#else /* !TEKEN_XTERM */
-
- teken_subr_cursor_forward_tabulation(t, 1);
-#endif /* TEKEN_XTERM */
-}
-
-static void
-teken_subr_horizontal_tab_set(teken_t *t)
-{
-
- teken_tab_set(t, t->t_cursor.tp_col);
-}
-
-static void
-teken_subr_index(teken_t *t)
-{
-
- if (t->t_cursor.tp_row < t->t_scrollreg.ts_end - 1) {
- t->t_cursor.tp_row++;
- t->t_stateflags &= ~TS_WRAPPED;
- teken_funcs_cursor(t);
- } else {
- teken_subr_do_scroll(t, 1);
- }
-}
-
-static void
-teken_subr_insert_character(teken_t *t, unsigned int ncols)
-{
- teken_rect_t tr;
-
- tr.tr_begin = t->t_cursor;
- tr.tr_end.tp_row = t->t_cursor.tp_row + 1;
-
- if (t->t_cursor.tp_col + ncols >= t->t_winsize.tp_col) {
- tr.tr_end.tp_col = t->t_winsize.tp_col;
- } else {
- teken_pos_t tp;
-
- /* Copy characters to the right. */
- tr.tr_end.tp_col = t->t_winsize.tp_col - ncols;
- tp.tp_row = t->t_cursor.tp_row;
- tp.tp_col = t->t_cursor.tp_col + ncols;
- teken_funcs_copy(t, &tr, &tp);
-
- tr.tr_end.tp_col = t->t_cursor.tp_col + ncols;
- }
-
- /* Blank current location. */
- teken_funcs_fill(t, &tr, BLANK, &t->t_curattr);
-}
-
-static void
-teken_subr_insert_line(teken_t *t, unsigned int nrows)
-{
- teken_rect_t tr;
-
- tr.tr_begin.tp_row = t->t_cursor.tp_row;
- tr.tr_begin.tp_col = 0;
- tr.tr_end.tp_col = t->t_winsize.tp_col;
-
- if (t->t_cursor.tp_row + nrows >= t->t_scrollreg.ts_end) {
- tr.tr_end.tp_row = t->t_scrollreg.ts_end;
- } else {
- teken_pos_t tp;
-
- /* Copy lines down. */
- tr.tr_end.tp_row = t->t_scrollreg.ts_end - nrows;
- tp.tp_row = t->t_cursor.tp_row + nrows;
- tp.tp_col = 0;
- teken_funcs_copy(t, &tr, &tp);
-
- tr.tr_end.tp_row = t->t_cursor.tp_row + nrows;
- }
-
- /* Blank current location. */
- teken_funcs_fill(t, &tr, BLANK, &t->t_curattr);
-}
-
-static void
-teken_subr_keypad_application_mode(teken_t *t)
-{
-
- teken_funcs_param(t, TP_KEYPADAPP, 1);
-}
-
-static void
-teken_subr_keypad_numeric_mode(teken_t *t)
-{
-
- teken_funcs_param(t, TP_KEYPADAPP, 0);
-}
-
-static void
-teken_subr_newline(teken_t *t)
-{
-
- t->t_cursor.tp_row++;
-
- if (t->t_cursor.tp_row >= t->t_scrollreg.ts_end) {
- teken_subr_do_scroll(t, 1);
- t->t_cursor.tp_row = t->t_scrollreg.ts_end - 1;
- }
-
- t->t_stateflags &= ~TS_WRAPPED;
- teken_funcs_cursor(t);
-}
-
-static void
-teken_subr_newpage(teken_t *t)
-{
-#ifdef TEKEN_XTERM
-
- teken_subr_newline(t);
-#else /* !TEKEN_XTERM */
- teken_rect_t tr;
-
- tr.tr_begin.tp_row = tr.tr_begin.tp_col = 0;
- tr.tr_end = t->t_winsize;
- teken_funcs_fill(t, &tr, BLANK, &t->t_curattr);
-
- t->t_cursor.tp_row = t->t_cursor.tp_col = 0;
- teken_funcs_cursor(t);
-#endif /* TEKEN_XTERM */
-}
-
-static void
-teken_subr_next_line(teken_t *t)
-{
-
- t->t_cursor.tp_col = 0;
- teken_subr_newline(t);
-}
-
-static void
-teken_subr_pan_down(teken_t *t, unsigned int nrows)
-{
-
- teken_subr_do_scroll(t, (int)nrows);
-}
-
-static void
-teken_subr_pan_up(teken_t *t, unsigned int nrows)
-{
-
- teken_subr_do_scroll(t, -(int)nrows);
-}
-
-static void
-teken_subr_primary_device_attributes(teken_t *t, unsigned int request)
-{
-
- if (request == 0) {
- const char response[] = "\x1B[?1;2c";
-
- teken_funcs_respond(t, response, sizeof response - 1);
- } else {
- teken_printf("Unknown DA1\n");
- }
-}
-
-static void
-teken_subr_do_putchar(teken_t *t, const teken_pos_t *tp, teken_char_t c,
- int width)
-{
-
- if (t->t_stateflags & TS_INSERT &&
- tp->tp_col < t->t_winsize.tp_col - width) {
- teken_rect_t ctr;
- teken_pos_t ctp;
-
- /* Insert mode. Move existing characters to the right. */
- ctr.tr_begin = *tp;
- ctr.tr_end.tp_row = tp->tp_row + 1;
- ctr.tr_end.tp_col = t->t_winsize.tp_col - width;
- ctp.tp_row = tp->tp_row;
- ctp.tp_col = tp->tp_col + width;
- teken_funcs_copy(t, &ctr, &ctp);
- }
-
- teken_funcs_putchar(t, tp, c, &t->t_curattr);
-}
-
-static void
-teken_subr_regular_character(teken_t *t, teken_char_t c)
-{
- int width;
-
- c = teken_scs_process(t, c);
-
- /* XXX: Don't process zero-width characters yet. */
- width = teken_wcwidth(c);
- if (width <= 0)
- return;
-
-#ifdef TEKEN_XTERM
- if (t->t_cursor.tp_col == t->t_winsize.tp_col - 1 &&
- (t->t_stateflags & (TS_WRAPPED|TS_AUTOWRAP)) ==
- (TS_WRAPPED|TS_AUTOWRAP)) {
- teken_pos_t tp;
-
- /* Perform line wrapping. */
-
- if (t->t_cursor.tp_row == t->t_scrollreg.ts_end - 1) {
- /* Perform scrolling. */
- teken_subr_do_scroll(t, 1);
- tp.tp_row = t->t_scrollreg.ts_end - 1;
- } else {
- /* No scrolling needed. */
- tp.tp_row = t->t_cursor.tp_row + 1;
- if (tp.tp_row == t->t_winsize.tp_row) {
- /*
- * Corner case: regular character
- * outside scrolling region, but at the
- * bottom of the screen.
- */
- teken_subr_do_putchar(t, &t->t_cursor,
- c, width);
- return;
- }
- }
-
- tp.tp_col = 0;
- teken_subr_do_putchar(t, &tp, c, width);
-
- t->t_cursor.tp_row = tp.tp_row;
- t->t_cursor.tp_col = width;
- t->t_stateflags &= ~TS_WRAPPED;
- } else {
- /* No line wrapping needed. */
- teken_subr_do_putchar(t, &t->t_cursor, c, width);
- t->t_cursor.tp_col += width;
-
- if (t->t_cursor.tp_col >= t->t_winsize.tp_col) {
- t->t_stateflags |= TS_WRAPPED;
- t->t_cursor.tp_col = t->t_winsize.tp_col - 1;
- } else {
- t->t_stateflags &= ~TS_WRAPPED;
- }
- }
-#else /* !TEKEN_XTERM */
- teken_subr_do_putchar(t, &t->t_cursor, c, width);
- t->t_cursor.tp_col += width;
-
- if (t->t_cursor.tp_col >= t->t_winsize.tp_col) {
- if (t->t_cursor.tp_row == t->t_scrollreg.ts_end - 1) {
- /* Perform scrolling. */
- teken_subr_do_scroll(t, 1);
- } else {
- /* No scrolling needed. */
- if (t->t_cursor.tp_row < t->t_winsize.tp_row - 1)
- t->t_cursor.tp_row++;
- }
- t->t_cursor.tp_col = 0;
- }
-#endif /* TEKEN_XTERM */
-
- teken_funcs_cursor(t);
-}
-
-static void
-teken_subr_reset_dec_mode(teken_t *t, unsigned int cmd)
-{
-
- switch (cmd) {
- case 1: /* Cursor keys mode. */
- teken_funcs_param(t, TP_CURSORKEYS, 0);
- break;
- case 2: /* DECANM: ANSI/VT52 mode. */
- teken_printf("DECRST VT52\n");
- break;
- case 3: /* 132 column mode. */
- teken_funcs_param(t, TP_132COLS, 0);
- teken_subr_reset_to_initial_state(t);
- break;
- case 5: /* Inverse video. */
- teken_printf("DECRST inverse video\n");
- break;
- case 6: /* Origin mode. */
- t->t_stateflags &= ~TS_ORIGIN;
- t->t_originreg.ts_begin = 0;
- t->t_originreg.ts_end = t->t_winsize.tp_row;
- t->t_cursor.tp_row = t->t_cursor.tp_col = 0;
- t->t_stateflags &= ~TS_WRAPPED;
- teken_funcs_cursor(t);
- break;
- case 7: /* Autowrap mode. */
- t->t_stateflags &= ~TS_AUTOWRAP;
- break;
- case 8: /* Autorepeat mode. */
- teken_funcs_param(t, TP_AUTOREPEAT, 0);
- break;
- case 25: /* Hide cursor. */
- teken_funcs_param(t, TP_SHOWCURSOR, 0);
- break;
- case 40: /* Disallow 132 columns. */
- teken_printf("DECRST allow 132\n");
- break;
- case 45: /* Disable reverse wraparound. */
- teken_printf("DECRST reverse wraparound\n");
- break;
- case 47: /* Switch to alternate buffer. */
- teken_printf("Switch to alternate buffer\n");
- break;
- default:
- teken_printf("Unknown DECRST: %u\n", cmd);
- }
-}
-
-static void
-teken_subr_reset_mode(teken_t *t, unsigned int cmd)
-{
-
- switch (cmd) {
- case 4:
- t->t_stateflags &= ~TS_INSERT;
- break;
- default:
- teken_printf("Unknown reset mode: %u\n", cmd);
- }
-}
-
-static void
-teken_subr_do_reset(teken_t *t)
-{
-
- t->t_curattr = t->t_defattr;
- t->t_cursor.tp_row = t->t_cursor.tp_col = 0;
- t->t_stateflags = TS_AUTOWRAP;
-
- teken_scs_set(t, 0, teken_scs_us_ascii);
- teken_scs_set(t, 1, teken_scs_us_ascii);
- teken_scs_switch(t, 0);
-
- teken_subr_save_cursor(t);
- teken_tab_default(t);
-}
-
-static void
-teken_subr_reset_to_initial_state(teken_t *t)
-{
-
- teken_subr_do_reset(t);
- teken_subr_erase_display(t, 2);
- teken_funcs_param(t, TP_SHOWCURSOR, 1);
- teken_funcs_cursor(t);
-}
-
-static void
-teken_subr_restore_cursor(teken_t *t)
-{
-
- t->t_cursor = t->t_saved_cursor;
- t->t_curattr = t->t_saved_curattr;
- t->t_stateflags &= ~TS_WRAPPED;
- teken_scs_restore(t);
- teken_funcs_cursor(t);
-}
-
-static void
-teken_subr_reverse_index(teken_t *t)
-{
-
- if (t->t_cursor.tp_row > t->t_scrollreg.ts_begin) {
- t->t_cursor.tp_row--;
- t->t_stateflags &= ~TS_WRAPPED;
- teken_funcs_cursor(t);
- } else {
- teken_subr_do_scroll(t, -1);
- }
-}
-
-static void
-teken_subr_save_cursor(teken_t *t)
-{
-
- t->t_saved_cursor = t->t_cursor;
- t->t_saved_curattr = t->t_curattr;
- teken_scs_save(t);
-}
-
-static void
-teken_subr_secondary_device_attributes(teken_t *t, unsigned int request)
-{
-
- if (request == 0) {
- const char response[] = "\x1B[>0;10;0c";
- teken_funcs_respond(t, response, sizeof response - 1);
- } else {
- teken_printf("Unknown DA2\n");
- }
-}
-
-static void
-teken_subr_set_dec_mode(teken_t *t, unsigned int cmd)
-{
-
- switch (cmd) {
- case 1: /* Cursor keys mode. */
- teken_funcs_param(t, TP_CURSORKEYS, 1);
- break;
- case 2: /* DECANM: ANSI/VT52 mode. */
- teken_printf("DECSET VT52\n");
- break;
- case 3: /* 132 column mode. */
- teken_funcs_param(t, TP_132COLS, 1);
- teken_subr_reset_to_initial_state(t);
- break;
- case 5: /* Inverse video. */
- teken_printf("DECSET inverse video\n");
- break;
- case 6: /* Origin mode. */
- t->t_stateflags |= TS_ORIGIN;
- t->t_originreg = t->t_scrollreg;
- t->t_cursor.tp_row = t->t_scrollreg.ts_begin;
- t->t_cursor.tp_col = 0;
- t->t_stateflags &= ~TS_WRAPPED;
- teken_funcs_cursor(t);
- break;
- case 7: /* Autowrap mode. */
- t->t_stateflags |= TS_AUTOWRAP;
- break;
- case 8: /* Autorepeat mode. */
- teken_funcs_param(t, TP_AUTOREPEAT, 1);
- break;
- case 25: /* Display cursor. */
- teken_funcs_param(t, TP_SHOWCURSOR, 1);
- break;
- case 40: /* Allow 132 columns. */
- teken_printf("DECSET allow 132\n");
- break;
- case 45: /* Enable reverse wraparound. */
- teken_printf("DECSET reverse wraparound\n");
- break;
- case 47: /* Switch to alternate buffer. */
- teken_printf("Switch away from alternate buffer\n");
- break;
- default:
- teken_printf("Unknown DECSET: %u\n", cmd);
- }
-}
-
-static void
-teken_subr_set_mode(teken_t *t, unsigned int cmd)
-{
-
- switch (cmd) {
- case 4:
- teken_printf("Insert mode\n");
- t->t_stateflags |= TS_INSERT;
- break;
- default:
- teken_printf("Unknown set mode: %u\n", cmd);
- }
-}
-
-static void
-teken_subr_set_graphic_rendition(teken_t *t, unsigned int ncmds,
- unsigned int cmds[])
-{
- unsigned int i, n;
-
- /* No attributes means reset. */
- if (ncmds == 0) {
- t->t_curattr = t->t_defattr;
- return;
- }
-
- for (i = 0; i < ncmds; i++) {
- n = cmds[i];
-
- switch (n) {
- case 0: /* Reset. */
- t->t_curattr = t->t_defattr;
- break;
- case 1: /* Bold. */
- t->t_curattr.ta_format |= TF_BOLD;
- break;
- case 4: /* Underline. */
- t->t_curattr.ta_format |= TF_UNDERLINE;
- break;
- case 5: /* Blink. */
- t->t_curattr.ta_format |= TF_BLINK;
- break;
- case 7: /* Reverse. */
- t->t_curattr.ta_format |= TF_REVERSE;
- break;
- case 22: /* Remove bold. */
- t->t_curattr.ta_format &= ~TF_BOLD;
- break;
- case 24: /* Remove underline. */
- t->t_curattr.ta_format &= ~TF_UNDERLINE;
- break;
- case 25: /* Remove blink. */
- t->t_curattr.ta_format &= ~TF_BLINK;
- break;
- case 27: /* Remove reverse. */
- t->t_curattr.ta_format &= ~TF_REVERSE;
- break;
- case 30: /* Set foreground color: black */
- case 31: /* Set foreground color: red */
- case 32: /* Set foreground color: green */
- case 33: /* Set foreground color: brown */
- case 34: /* Set foreground color: blue */
- case 35: /* Set foreground color: magenta */
- case 36: /* Set foreground color: cyan */
- case 37: /* Set foreground color: white */
- t->t_curattr.ta_fgcolor = n - 30;
- break;
- case 39: /* Set default foreground color. */
- t->t_curattr.ta_fgcolor = t->t_defattr.ta_fgcolor;
- break;
- case 40: /* Set background color: black */
- case 41: /* Set background color: red */
- case 42: /* Set background color: green */
- case 43: /* Set background color: brown */
- case 44: /* Set background color: blue */
- case 45: /* Set background color: magenta */
- case 46: /* Set background color: cyan */
- case 47: /* Set background color: white */
- t->t_curattr.ta_bgcolor = n - 40;
- break;
- case 49: /* Set default background color. */
- t->t_curattr.ta_bgcolor = t->t_defattr.ta_bgcolor;
- break;
- default:
- teken_printf("unsupported attribute %u\n", n);
- }
- }
-}
-
-static void
-teken_subr_set_top_and_bottom_margins(teken_t *t, unsigned int top,
- unsigned int bottom)
-{
-
- /* Adjust top row number. */
- if (top > 0)
- top--;
- /* Adjust bottom row number. */
- if (bottom == 0 || bottom > t->t_winsize.tp_row)
- bottom = t->t_winsize.tp_row;
-
- /* Invalid arguments. */
- if (top >= bottom - 1) {
- top = 0;
- bottom = t->t_winsize.tp_row;
- }
-
- t->t_scrollreg.ts_begin = top;
- t->t_scrollreg.ts_end = bottom;
- if (t->t_stateflags & TS_ORIGIN) {
- /* XXX: home cursor? */
- t->t_originreg = t->t_scrollreg;
- t->t_cursor.tp_row = t->t_originreg.ts_begin;
- t->t_cursor.tp_col = 0;
- t->t_stateflags &= ~TS_WRAPPED;
- teken_funcs_cursor(t);
- }
-}
-
-static void
-teken_subr_single_height_double_width_line(teken_t *t __unused)
-{
-
- teken_printf("single height double width???\n");
-}
-
-static void
-teken_subr_single_height_single_width_line(teken_t *t __unused)
-{
-
- teken_printf("single height single width???\n");
-}
-
-static void
-teken_subr_string_terminator(teken_t *t __unused)
-{
-
- teken_printf("string terminator???\n");
-}
-
-static void
-teken_subr_tab_clear(teken_t *t, unsigned int cmd)
-{
-
- switch (cmd) {
- case 0:
- teken_tab_clear(t, t->t_cursor.tp_col);
- break;
- case 3:
- memset(&t->t_tabstops, 0, T_NUMCOL / 8);
- break;
- }
-}
-
-static void
-teken_subr_vertical_position_absolute(teken_t *t, unsigned int row)
-{
-
- t->t_cursor.tp_row = t->t_originreg.ts_begin + row - 1;
- if (row >= t->t_originreg.ts_end)
- t->t_cursor.tp_row = t->t_originreg.ts_end - 1;
-
-
- t->t_stateflags &= ~TS_WRAPPED;
- teken_funcs_cursor(t);
-}
diff --git a/sys/dev/syscons/teken/teken_subr_compat.h b/sys/dev/syscons/teken/teken_subr_compat.h
deleted file mode 100644
index 4e03c66..0000000
--- a/sys/dev/syscons/teken/teken_subr_compat.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*-
- * Copyright (c) 2008-2009 Ed Schouten <ed@FreeBSD.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-static void
-teken_subr_cons25_set_cursor_type(teken_t *t, unsigned int type)
-{
-
- teken_funcs_param(t, TP_SHOWCURSOR, type != 1);
-}
-
-static const teken_color_t cons25_colors[8] = { TC_BLACK, TC_BLUE,
- TC_GREEN, TC_CYAN, TC_RED, TC_MAGENTA, TC_BROWN, TC_WHITE };
-
-static void
-teken_subr_cons25_set_adapter_background(teken_t *t, unsigned int c)
-{
-
- t->t_defattr.ta_bgcolor = cons25_colors[c % 8];
- t->t_curattr.ta_bgcolor = cons25_colors[c % 8];
-}
-
-static void
-teken_subr_cons25_set_adapter_foreground(teken_t *t, unsigned int c)
-{
-
- t->t_defattr.ta_fgcolor = cons25_colors[c % 8];
- t->t_curattr.ta_fgcolor = cons25_colors[c % 8];
- if (c >= 8) {
- t->t_defattr.ta_format |= TF_BOLD;
- t->t_curattr.ta_format |= TF_BOLD;
- } else {
- t->t_defattr.ta_format &= ~TF_BOLD;
- t->t_curattr.ta_format &= ~TF_BOLD;
- }
-}
-
-static void
-teken_subr_cons25_switch_virtual_terminal(teken_t *t, unsigned int vt)
-{
-
- teken_funcs_param(t, TP_SWITCHVT, vt);
-}
-
-static void
-teken_subr_cons25_set_bell_pitch_duration(teken_t *t, unsigned int pitch,
- unsigned int duration)
-{
-
- teken_funcs_param(t, TP_SETBELLPD, (pitch << 16) |
- (duration & 0xffff));
-}
-
-#if 0
-static void
-teken_subr_vt52_decid(teken_t *t)
-{
- const char response[] = "\x1B/Z";
-
- teken_funcs_respond(t, response, sizeof response - 1);
-}
-#endif
diff --git a/sys/dev/syscons/teken/teken_wcwidth.h b/sys/dev/syscons/teken/teken_wcwidth.h
deleted file mode 100644
index 838fb3d..0000000
--- a/sys/dev/syscons/teken/teken_wcwidth.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Markus Kuhn -- 2007-05-26 (Unicode 5.0)
- *
- * Permission to use, copy, modify, and distribute this software
- * for any purpose and without fee is hereby granted. The author
- * disclaims all warranties with regard to this software.
- *
- * Latest version: http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c
- *
- * $FreeBSD$
- */
-
-struct interval {
- teken_char_t first;
- teken_char_t last;
-};
-
-/* auxiliary function for binary search in interval table */
-static int bisearch(teken_char_t ucs, const struct interval *table, int max) {
- int min = 0;
- int mid;
-
- if (ucs < table[0].first || ucs > table[max].last)
- return 0;
- while (max >= min) {
- mid = (min + max) / 2;
- if (ucs > table[mid].last)
- min = mid + 1;
- else if (ucs < table[mid].first)
- max = mid - 1;
- else
- return 1;
- }
-
- return 0;
-}
-
-static int teken_wcwidth(teken_char_t ucs)
-{
- /* sorted list of non-overlapping intervals of non-spacing characters */
- /* generated by "uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c" */
- static const struct interval combining[] = {
- { 0x0300, 0x036F }, { 0x0483, 0x0486 }, { 0x0488, 0x0489 },
- { 0x0591, 0x05BD }, { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 },
- { 0x05C4, 0x05C5 }, { 0x05C7, 0x05C7 }, { 0x0600, 0x0603 },
- { 0x0610, 0x0615 }, { 0x064B, 0x065E }, { 0x0670, 0x0670 },
- { 0x06D6, 0x06E4 }, { 0x06E7, 0x06E8 }, { 0x06EA, 0x06ED },
- { 0x070F, 0x070F }, { 0x0711, 0x0711 }, { 0x0730, 0x074A },
- { 0x07A6, 0x07B0 }, { 0x07EB, 0x07F3 }, { 0x0901, 0x0902 },
- { 0x093C, 0x093C }, { 0x0941, 0x0948 }, { 0x094D, 0x094D },
- { 0x0951, 0x0954 }, { 0x0962, 0x0963 }, { 0x0981, 0x0981 },
- { 0x09BC, 0x09BC }, { 0x09C1, 0x09C4 }, { 0x09CD, 0x09CD },
- { 0x09E2, 0x09E3 }, { 0x0A01, 0x0A02 }, { 0x0A3C, 0x0A3C },
- { 0x0A41, 0x0A42 }, { 0x0A47, 0x0A48 }, { 0x0A4B, 0x0A4D },
- { 0x0A70, 0x0A71 }, { 0x0A81, 0x0A82 }, { 0x0ABC, 0x0ABC },
- { 0x0AC1, 0x0AC5 }, { 0x0AC7, 0x0AC8 }, { 0x0ACD, 0x0ACD },
- { 0x0AE2, 0x0AE3 }, { 0x0B01, 0x0B01 }, { 0x0B3C, 0x0B3C },
- { 0x0B3F, 0x0B3F }, { 0x0B41, 0x0B43 }, { 0x0B4D, 0x0B4D },
- { 0x0B56, 0x0B56 }, { 0x0B82, 0x0B82 }, { 0x0BC0, 0x0BC0 },
- { 0x0BCD, 0x0BCD }, { 0x0C3E, 0x0C40 }, { 0x0C46, 0x0C48 },
- { 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 }, { 0x0CBC, 0x0CBC },
- { 0x0CBF, 0x0CBF }, { 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCD },
- { 0x0CE2, 0x0CE3 }, { 0x0D41, 0x0D43 }, { 0x0D4D, 0x0D4D },
- { 0x0DCA, 0x0DCA }, { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 },
- { 0x0E31, 0x0E31 }, { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E },
- { 0x0EB1, 0x0EB1 }, { 0x0EB4, 0x0EB9 }, { 0x0EBB, 0x0EBC },
- { 0x0EC8, 0x0ECD }, { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 },
- { 0x0F37, 0x0F37 }, { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E },
- { 0x0F80, 0x0F84 }, { 0x0F86, 0x0F87 }, { 0x0F90, 0x0F97 },
- { 0x0F99, 0x0FBC }, { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 },
- { 0x1032, 0x1032 }, { 0x1036, 0x1037 }, { 0x1039, 0x1039 },
- { 0x1058, 0x1059 }, { 0x1160, 0x11FF }, { 0x135F, 0x135F },
- { 0x1712, 0x1714 }, { 0x1732, 0x1734 }, { 0x1752, 0x1753 },
- { 0x1772, 0x1773 }, { 0x17B4, 0x17B5 }, { 0x17B7, 0x17BD },
- { 0x17C6, 0x17C6 }, { 0x17C9, 0x17D3 }, { 0x17DD, 0x17DD },
- { 0x180B, 0x180D }, { 0x18A9, 0x18A9 }, { 0x1920, 0x1922 },
- { 0x1927, 0x1928 }, { 0x1932, 0x1932 }, { 0x1939, 0x193B },
- { 0x1A17, 0x1A18 }, { 0x1B00, 0x1B03 }, { 0x1B34, 0x1B34 },
- { 0x1B36, 0x1B3A }, { 0x1B3C, 0x1B3C }, { 0x1B42, 0x1B42 },
- { 0x1B6B, 0x1B73 }, { 0x1DC0, 0x1DCA }, { 0x1DFE, 0x1DFF },
- { 0x200B, 0x200F }, { 0x202A, 0x202E }, { 0x2060, 0x2063 },
- { 0x206A, 0x206F }, { 0x20D0, 0x20EF }, { 0x302A, 0x302F },
- { 0x3099, 0x309A }, { 0xA806, 0xA806 }, { 0xA80B, 0xA80B },
- { 0xA825, 0xA826 }, { 0xFB1E, 0xFB1E }, { 0xFE00, 0xFE0F },
- { 0xFE20, 0xFE23 }, { 0xFEFF, 0xFEFF }, { 0xFFF9, 0xFFFB },
- { 0x10A01, 0x10A03 }, { 0x10A05, 0x10A06 }, { 0x10A0C, 0x10A0F },
- { 0x10A38, 0x10A3A }, { 0x10A3F, 0x10A3F }, { 0x1D167, 0x1D169 },
- { 0x1D173, 0x1D182 }, { 0x1D185, 0x1D18B }, { 0x1D1AA, 0x1D1AD },
- { 0x1D242, 0x1D244 }, { 0xE0001, 0xE0001 }, { 0xE0020, 0xE007F },
- { 0xE0100, 0xE01EF }
- };
-
- /* test for 8-bit control characters */
- if (ucs == 0)
- return 0;
- if (ucs < 32 || (ucs >= 0x7f && ucs < 0xa0))
- return -1;
-
- /* binary search in table of non-spacing characters */
- if (bisearch(ucs, combining,
- sizeof(combining) / sizeof(struct interval) - 1))
- return 0;
-
- /* if we arrive here, ucs is not a combining or C0/C1 control character */
-
- return 1 +
- (ucs >= 0x1100 &&
- (ucs <= 0x115f || /* Hangul Jamo init. consonants */
- ucs == 0x2329 || ucs == 0x232a ||
- (ucs >= 0x2e80 && ucs <= 0xa4cf &&
- ucs != 0x303f) || /* CJK ... Yi */
- (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */
- (ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility Ideographs */
- (ucs >= 0xfe10 && ucs <= 0xfe19) || /* Vertical forms */
- (ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */
- (ucs >= 0xff00 && ucs <= 0xff60) || /* Fullwidth Forms */
- (ucs >= 0xffe0 && ucs <= 0xffe6) ||
- (ucs >= 0x20000 && ucs <= 0x2fffd) ||
- (ucs >= 0x30000 && ucs <= 0x3fffd)));
-}
diff --git a/sys/dev/twe/twe.c b/sys/dev/twe/twe.c
index 2641fae..59b5027 100644
--- a/sys/dev/twe/twe.c
+++ b/sys/dev/twe/twe.c
@@ -294,10 +294,8 @@ twe_init(struct twe_softc *sc)
/*
* Scan for drives
*/
- newbus_xlock();
for (i = 0; i < TWE_MAX_UNITS; i++)
twe_add_unit(sc, i);
- newbus_xunlock();
/*
* Initialise connection with controller.
@@ -623,15 +621,11 @@ twe_ioctl(struct twe_softc *sc, int ioctlcmd, void *addr)
break;
case TWEIO_ADD_UNIT:
- newbus_xlock();
error = twe_add_unit(sc, td->td_unit);
- newbus_xunlock();
break;
case TWEIO_DEL_UNIT:
- newbus_xlock();
error = twe_del_unit(sc, td->td_unit);
- newbus_xunlock();
break;
/* XXX implement ATA PASSTHROUGH */
diff --git a/sys/dev/txp/if_txp.c b/sys/dev/txp/if_txp.c
index 619b3f7..9396f4d 100644
--- a/sys/dev/txp/if_txp.c
+++ b/sys/dev/txp/if_txp.c
@@ -1389,7 +1389,8 @@ txp_alloc_rings(struct txp_softc *sc)
/* High priority rx ring. */
error = txp_dma_alloc(sc, "hi priority rx ring",
- &sc->sc_cdata.txp_rxhiring_tag, sizeof(struct txp_rx_desc), 0,
+ &sc->sc_cdata.txp_rxhiring_tag,
+ roundup(sizeof(struct txp_rx_desc), 16), 0,
&sc->sc_cdata.txp_rxhiring_map, (void **)&sc->sc_ldata.txp_rxhiring,
sizeof(struct txp_rx_desc) * RX_ENTRIES,
&sc->sc_ldata.txp_rxhiring_paddr);
@@ -1409,7 +1410,8 @@ txp_alloc_rings(struct txp_softc *sc)
/* Low priority rx ring. */
error = txp_dma_alloc(sc, "low priority rx ring",
- &sc->sc_cdata.txp_rxloring_tag, sizeof(struct txp_rx_desc), 0,
+ &sc->sc_cdata.txp_rxloring_tag,
+ roundup(sizeof(struct txp_rx_desc), 16), 0,
&sc->sc_cdata.txp_rxloring_map, (void **)&sc->sc_ldata.txp_rxloring,
sizeof(struct txp_rx_desc) * RX_ENTRIES,
&sc->sc_ldata.txp_rxloring_paddr);
diff --git a/sys/dev/usb/controller/usb_controller.c b/sys/dev/usb/controller/usb_controller.c
index f6776f01..a925444 100644
--- a/sys/dev/usb/controller/usb_controller.c
+++ b/sys/dev/usb/controller/usb_controller.c
@@ -67,7 +67,6 @@ static device_attach_t usb_attach;
static device_detach_t usb_detach;
static void usb_attach_sub(device_t, struct usb_bus *);
-static void usb_post_init(void *);
/* static variables */
@@ -84,8 +83,6 @@ TUNABLE_INT("hw.usb.no_boot_wait", &usb_no_boot_wait);
SYSCTL_INT(_hw_usb, OID_AUTO, no_boot_wait, CTLFLAG_RDTUN, &usb_no_boot_wait, 0,
"No device enumerate waiting at boot.");
-static uint8_t usb_post_init_called = 0;
-
static devclass_t usb_devclass;
static device_method_t usb_methods[] = {
@@ -142,10 +139,8 @@ usb_attach(device_t dev)
bus->bus_roothold = root_mount_hold(device_get_nameunit(dev));
}
- if (usb_post_init_called) {
- usb_attach_sub(dev, bus);
- usb_needs_explore(bus, 1);
- }
+ usb_attach_sub(dev, bus);
+
return (0); /* return success */
}
@@ -224,6 +219,15 @@ usb_bus_explore(struct usb_proc_msg *pm)
/* avoid zero, hence that is memory default */
bus->driver_added_refcount = 1;
}
+
+ /*
+ * The following three lines of code are only here to
+ * recover from DDB:
+ */
+ usb_proc_rewakeup(&bus->control_xfer_proc);
+ usb_proc_rewakeup(&bus->giant_callback_proc);
+ usb_proc_rewakeup(&bus->non_giant_callback_proc);
+
USB_BUS_UNLOCK(bus);
/*
@@ -260,10 +264,10 @@ usb_bus_detach(struct usb_proc_msg *pm)
device_set_softc(dev, NULL);
USB_BUS_UNLOCK(bus);
- newbus_xlock();
-
/* detach children first */
+ mtx_lock(&Giant);
bus_generic_detach(dev);
+ mtx_unlock(&Giant);
/*
* Free USB Root device, but not any sub-devices, hence they
@@ -272,7 +276,6 @@ usb_bus_detach(struct usb_proc_msg *pm)
usb_free_device(udev,
USB_UNCFG_FLAG_FREE_EP0);
- newbus_xunlock();
USB_BUS_LOCK(bus);
/* clear bdev variable last */
bus->bdev = NULL;
@@ -288,6 +291,12 @@ usb_power_wdog(void *arg)
usb_callout_reset(&bus->power_wdog,
4 * hz, usb_power_wdog, arg);
+ /*
+ * The following line of code is only here to recover from
+ * DDB:
+ */
+ usb_proc_rewakeup(&bus->explore_proc); /* recover from DDB */
+
USB_BUS_UNLOCK(bus);
usb_bus_power_update(bus);
@@ -341,7 +350,6 @@ usb_bus_attach(struct usb_proc_msg *pm)
}
USB_BUS_UNLOCK(bus);
- newbus_xlock();
/* default power_mask value */
bus->hw_power_state =
@@ -374,7 +382,6 @@ usb_bus_attach(struct usb_proc_msg *pm)
err = USB_ERR_NOMEM;
}
- newbus_xunlock();
USB_BUS_LOCK(bus);
if (err) {
@@ -392,17 +399,18 @@ usb_bus_attach(struct usb_proc_msg *pm)
/*------------------------------------------------------------------------*
* usb_attach_sub
*
- * This function creates a thread which runs the USB attach code. It
- * is factored out, hence it can be called at two different places in
- * time. During bootup this function is called from
- * "usb_post_init". During hot-plug it is called directly from the
- * "usb_attach()" method.
+ * This function creates a thread which runs the USB attach code.
*------------------------------------------------------------------------*/
static void
usb_attach_sub(device_t dev, struct usb_bus *bus)
{
const char *pname = device_get_nameunit(dev);
+ mtx_lock(&Giant);
+ if (usb_devclass_ptr == NULL)
+ usb_devclass_ptr = devclass_find("usbus");
+ mtx_unlock(&Giant);
+
/* Initialise USB process messages */
bus->explore_msg[0].hdr.pm_callback = &usb_bus_explore;
bus->explore_msg[0].bus = bus;
@@ -445,52 +453,12 @@ usb_attach_sub(device_t dev, struct usb_bus *bus)
/* ignore */
}
USB_BUS_UNLOCK(bus);
- }
-}
-/*------------------------------------------------------------------------*
- * usb_post_init
- *
- * This function is called to attach all USB busses that were found
- * during bootup.
- *------------------------------------------------------------------------*/
-static void
-usb_post_init(void *arg)
-{
- struct usb_bus *bus;
- devclass_t dc;
- device_t dev;
- int max;
- int n;
-
- newbus_xlock();
-
- usb_devclass_ptr = devclass_find("usbus");
-
- dc = usb_devclass_ptr;
- if (dc) {
- max = devclass_get_maxunit(dc) + 1;
- for (n = 0; n != max; n++) {
- dev = devclass_get_device(dc, n);
- if (dev && device_is_attached(dev)) {
- bus = device_get_ivars(dev);
- if (bus)
- usb_attach_sub(dev, bus);
- }
- }
- } else {
- DPRINTFN(0, "no devclass\n");
+ /* Do initial explore */
+ usb_needs_explore(bus, 1);
}
- usb_post_init_called = 1;
-
- /* explore all USB busses in parallell */
-
- usb_needs_explore_all();
-
- newbus_xunlock();
}
-SYSINIT(usb_post_init, SI_SUB_KICK_SCHEDULER, SI_ORDER_ANY, usb_post_init, NULL);
SYSUNINIT(usb_bus_unload, SI_SUB_KLD, SI_ORDER_ANY, usb_bus_unload, NULL);
/*------------------------------------------------------------------------*
diff --git a/sys/dev/usb/input/ukbd.c b/sys/dev/usb/input/ukbd.c
index 2170b37..5816079 100644
--- a/sys/dev/usb/input/ukbd.c
+++ b/sys/dev/usb/input/ukbd.c
@@ -96,10 +96,14 @@ __FBSDID("$FreeBSD$");
#if USB_DEBUG
static int ukbd_debug = 0;
+static int ukbd_no_leds = 0;
SYSCTL_NODE(_hw_usb, OID_AUTO, ukbd, CTLFLAG_RW, 0, "USB ukbd");
SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, debug, CTLFLAG_RW,
&ukbd_debug, 0, "Debug level");
+SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, no_leds, CTLFLAG_RW,
+ &ukbd_no_leds, 0, "Disables setting of keyboard leds");
+
#endif
#define UPROTO_BOOT_KEYBOARD 1
@@ -165,6 +169,7 @@ struct ukbd_softc {
#define UKBD_FLAG_APPLE_EJECT 0x0040
#define UKBD_FLAG_APPLE_FN 0x0080
#define UKBD_FLAG_APPLE_SWAP 0x0100
+#define UKBD_FLAG_TIMER_RUNNING 0x0200
int32_t sc_mode; /* input mode (K_XLATE,K_RAW,K_CODE) */
int32_t sc_state; /* shift/lock key state */
@@ -279,6 +284,25 @@ static device_attach_t ukbd_attach;
static device_detach_t ukbd_detach;
static device_resume_t ukbd_resume;
+static uint8_t
+ukbd_any_key_pressed(struct ukbd_softc *sc)
+{
+ uint8_t i;
+ uint8_t j;
+
+ for (j = i = 0; i < UKBD_NKEYCODE; i++)
+ j |= sc->sc_odata.keycode[i];
+
+ return (j ? 1 : 0);
+}
+
+static void
+ukbd_start_timer(struct ukbd_softc *sc)
+{
+ sc->sc_flags |= UKBD_FLAG_TIMER_RUNNING;
+ usb_callout_reset(&sc->sc_callout, hz / 40, &ukbd_timeout, sc);
+}
+
static void
ukbd_put_key(struct ukbd_softc *sc, uint32_t key)
{
@@ -308,11 +332,15 @@ ukbd_do_poll(struct ukbd_softc *sc, uint8_t wait)
usbd_transfer_poll(sc->sc_xfer, UKBD_N_TRANSFER);
- DELAY(1000); /* delay 1 ms */
+ /* Delay-optimised support for repetition of keys */
- sc->sc_time_ms++;
+ if (ukbd_any_key_pressed(sc)) {
+ /* a key is pressed - need timekeeping */
+ DELAY(1000);
- /* support repetition of keys: */
+ /* 1 millisecond has passed */
+ sc->sc_time_ms += 1;
+ }
ukbd_interrupt(sc);
@@ -470,7 +498,11 @@ ukbd_timeout(void *arg)
}
ukbd_interrupt(sc);
- usb_callout_reset(&sc->sc_callout, hz / 40, &ukbd_timeout, sc);
+ if (ukbd_any_key_pressed(sc)) {
+ ukbd_start_timer(sc);
+ } else {
+ sc->sc_flags &= ~UKBD_FLAG_TIMER_RUNNING;
+ }
}
static uint8_t
@@ -582,6 +614,12 @@ ukbd_intr_callback(struct usb_xfer *xfer, usb_error_t error)
}
ukbd_interrupt(sc);
+
+ if (!(sc->sc_flags & UKBD_FLAG_TIMER_RUNNING)) {
+ if (ukbd_any_key_pressed(sc)) {
+ ukbd_start_timer(sc);
+ }
+ }
}
case USB_ST_SETUP:
tr_setup:
@@ -613,6 +651,11 @@ ukbd_set_leds_callback(struct usb_xfer *xfer, usb_error_t error)
uint8_t buf[2];
struct ukbd_softc *sc = usbd_xfer_softc(xfer);
+#if USB_DEBUG
+ if (ukbd_no_leds)
+ return;
+#endif
+
switch (USB_GET_STATE(xfer)) {
case USB_ST_TRANSFERRED:
case USB_ST_SETUP:
@@ -647,11 +690,11 @@ ukbd_set_leds_callback(struct usb_xfer *xfer, usb_error_t error)
usbd_xfer_set_frames(xfer, 2);
usbd_transfer_submit(xfer);
}
- return;
+ break;
default: /* Error */
DPRINTFN(0, "error=%s\n", usbd_errstr(error));
- return;
+ break;
}
}
@@ -745,8 +788,6 @@ ukbd_attach(device_t dev)
uint16_t n;
uint16_t hid_len;
- mtx_lock(&Giant);
-
kbd_init_struct(kbd, UKBD_DRIVER_NAME, KB_OTHER, unit, 0, 0, 0);
kbd->kb_data = (void *)sc;
@@ -831,7 +872,7 @@ ukbd_attach(device_t dev)
}
/* ignore if SETIDLE fails, hence it is not crucial */
- err = usbd_req_set_idle(sc->sc_udev, &Giant, sc->sc_iface_index, 0, 0);
+ err = usbd_req_set_idle(sc->sc_udev, NULL, sc->sc_iface_index, 0, 0);
ukbd_ioctl(kbd, KDSETLED, (caddr_t)&sc->sc_state);
@@ -854,14 +895,14 @@ ukbd_attach(device_t dev)
if (bootverbose) {
genkbd_diag(kbd, bootverbose);
}
+ /* lock keyboard mutex */
+
+ mtx_lock(&Giant);
/* start the keyboard */
usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT]);
- /* start the timer */
-
- ukbd_timeout(sc);
mtx_unlock(&Giant);
return (0); /* success */
@@ -876,8 +917,6 @@ ukbd_detach(device_t dev)
struct ukbd_softc *sc = device_get_softc(dev);
int error;
- mtx_lock(&Giant);
-
DPRINTF("\n");
if (sc->sc_flags & UKBD_FLAG_POLLING) {
@@ -913,8 +952,6 @@ ukbd_detach(device_t dev)
usb_callout_drain(&sc->sc_callout);
- mtx_unlock(&Giant);
-
DPRINTF("%s: disconnected\n",
device_get_nameunit(dev));
@@ -926,9 +963,7 @@ ukbd_resume(device_t dev)
{
struct ukbd_softc *sc = device_get_softc(dev);
- mtx_lock(&Giant);
ukbd_clear_state(&sc->sc_kbd);
- mtx_unlock(&Giant);
return (0);
}
@@ -944,7 +979,6 @@ ukbd_configure(int flags)
static int
ukbd__probe(int unit, void *arg, int flags)
{
- mtx_assert(&Giant, MA_OWNED);
return (ENXIO);
}
@@ -952,7 +986,6 @@ ukbd__probe(int unit, void *arg, int flags)
static int
ukbd_init(int unit, keyboard_t **kbdp, void *arg, int flags)
{
- mtx_assert(&Giant, MA_OWNED);
return (ENXIO);
}
@@ -960,7 +993,6 @@ ukbd_init(int unit, keyboard_t **kbdp, void *arg, int flags)
static int
ukbd_test_if(keyboard_t *kbd)
{
- mtx_assert(&Giant, MA_OWNED);
return (0);
}
@@ -968,7 +1000,6 @@ ukbd_test_if(keyboard_t *kbd)
static int
ukbd_term(keyboard_t *kbd)
{
- mtx_assert(&Giant, MA_OWNED);
return (ENXIO);
}
@@ -976,7 +1007,6 @@ ukbd_term(keyboard_t *kbd)
static int
ukbd_intr(keyboard_t *kbd, void *arg)
{
- mtx_assert(&Giant, MA_OWNED);
return (0);
}
@@ -984,7 +1014,6 @@ ukbd_intr(keyboard_t *kbd, void *arg)
static int
ukbd_lock(keyboard_t *kbd, int lock)
{
- mtx_assert(&Giant, MA_OWNED);
return (1);
}
@@ -1003,7 +1032,6 @@ ukbd_enable(keyboard_t *kbd)
mtx_unlock(&Giant);
return (retval);
}
- mtx_assert(&Giant, MA_OWNED);
KBD_ACTIVATE(kbd);
return (0);
}
@@ -1020,7 +1048,6 @@ ukbd_disable(keyboard_t *kbd)
mtx_unlock(&Giant);
return (retval);
}
- mtx_assert(&Giant, MA_OWNED);
KBD_DEACTIVATE(kbd);
return (0);
}
@@ -1049,7 +1076,6 @@ ukbd_check(keyboard_t *kbd)
if (!mtx_owned(&Giant))
return (0);
}
- mtx_assert(&Giant, MA_OWNED);
#ifdef UKBD_EMULATE_ATSCANCODE
if (sc->sc_buffered_char[0]) {
@@ -1085,7 +1111,6 @@ ukbd_check_char(keyboard_t *kbd)
if (!mtx_owned(&Giant))
return (0);
}
- mtx_assert(&Giant, MA_OWNED);
if ((sc->sc_composed_char > 0) &&
(!(sc->sc_flags & UKBD_FLAG_COMPOSE))) {
@@ -1124,7 +1149,6 @@ ukbd_read(keyboard_t *kbd, int wait)
if (!mtx_owned(&Giant))
return (-1);
}
- mtx_assert(&Giant, MA_OWNED);
#ifdef UKBD_EMULATE_ATSCANCODE
if (sc->sc_buffered_char[0]) {
@@ -1189,7 +1213,6 @@ ukbd_read_char(keyboard_t *kbd, int wait)
if (!mtx_owned(&Giant))
return (NOKEY);
}
- mtx_assert(&Giant, MA_OWNED);
next_code:
@@ -1392,7 +1415,6 @@ ukbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
*/
return (EINVAL);
}
- mtx_assert(&Giant, MA_OWNED);
switch (cmd) {
case KDGKBMODE: /* get keyboard mode */
@@ -1526,7 +1548,6 @@ ukbd_clear_state(keyboard_t *kbd)
if (!mtx_owned(&Giant)) {
return; /* XXX */
}
- mtx_assert(&Giant, MA_OWNED);
sc->sc_flags &= ~(UKBD_FLAG_COMPOSE | UKBD_FLAG_POLLING);
sc->sc_state &= LOCK_MASK; /* preserve locking key state */
@@ -1546,7 +1567,6 @@ ukbd_clear_state(keyboard_t *kbd)
static int
ukbd_get_state(keyboard_t *kbd, void *buf, size_t len)
{
- mtx_assert(&Giant, MA_OWNED);
return (len == 0) ? 1 : -1;
}
@@ -1554,7 +1574,6 @@ ukbd_get_state(keyboard_t *kbd, void *buf, size_t len)
static int
ukbd_set_state(keyboard_t *kbd, void *buf, size_t len)
{
- mtx_assert(&Giant, MA_OWNED);
return (EINVAL);
}
@@ -1571,7 +1590,6 @@ ukbd_poll(keyboard_t *kbd, int on)
mtx_unlock(&Giant);
return (retval);
}
- mtx_assert(&Giant, MA_OWNED);
if (on) {
sc->sc_flags |= UKBD_FLAG_POLLING;
diff --git a/sys/dev/usb/misc/ufm.c b/sys/dev/usb/misc/ufm.c
index c10166a..136182a 100644
--- a/sys/dev/usb/misc/ufm.c
+++ b/sys/dev/usb/misc/ufm.c
@@ -86,11 +86,9 @@ static device_attach_t ufm_attach;
static device_detach_t ufm_detach;
static usb_fifo_ioctl_t ufm_ioctl;
-static usb_fifo_open_t ufm_open;
static struct usb_fifo_methods ufm_fifo_methods = {
.f_ioctl = &ufm_ioctl,
- .f_open = &ufm_open,
.basename[0] = "ufm",
};
@@ -179,15 +177,6 @@ ufm_detach(device_t dev)
}
static int
-ufm_open(struct usb_fifo *dev, int fflags)
-{
- if ((fflags & (FWRITE | FREAD)) != (FWRITE | FREAD)) {
- return (EACCES);
- }
- return (0);
-}
-
-static int
ufm_do_req(struct ufm_softc *sc, uint8_t request,
uint16_t value, uint16_t index, uint8_t *retbuf)
{
@@ -315,6 +304,10 @@ ufm_ioctl(struct usb_fifo *fifo, u_long cmd, void *addr,
struct ufm_softc *sc = usb_fifo_softc(fifo);
int error = 0;
+ if ((fflags & (FWRITE | FREAD)) != (FWRITE | FREAD)) {
+ return (EACCES);
+ }
+
switch (cmd) {
case FM_SET_FREQ:
error = ufm_set_freq(sc, addr);
diff --git a/sys/dev/usb/net/if_aue.c b/sys/dev/usb/net/if_aue.c
index 142780f..1a2ce70 100644
--- a/sys/dev/usb/net/if_aue.c
+++ b/sys/dev/usb/net/if_aue.c
@@ -484,7 +484,7 @@ aue_miibus_writereg(device_t dev, int phy, int reg, int data)
}
if (i == AUE_TIMEOUT)
- device_printf(sc->sc_ue.ue_dev, "MII read timed out\n");
+ device_printf(sc->sc_ue.ue_dev, "MII write timed out\n");
if (!locked)
AUE_UNLOCK(sc);
@@ -603,11 +603,14 @@ aue_reset(struct aue_softc *sc)
* to set the GPIO pins high so that the PHY(s) will
* be enabled.
*
- * Note: We force all of the GPIO pins low first, *then*
- * enable the ones we want.
+ * NOTE: We used to force all of the GPIO pins low first and then
+ * enable the ones we want. This has been changed to better
+ * match the ADMtek's reference design to avoid setting the
+ * power-down configuration line of the PHY at the same time
+ * it is reset.
*/
- aue_csr_write_1(sc, AUE_GPIO0, AUE_GPIO_OUT0|AUE_GPIO_SEL0);
- aue_csr_write_1(sc, AUE_GPIO0, AUE_GPIO_OUT0|AUE_GPIO_SEL0|AUE_GPIO_SEL1);
+ aue_csr_write_1(sc, AUE_GPIO0, AUE_GPIO_SEL0|AUE_GPIO_SEL1);
+ aue_csr_write_1(sc, AUE_GPIO0, AUE_GPIO_SEL0|AUE_GPIO_SEL1|AUE_GPIO_OUT0);
if (sc->sc_flags & AUE_FLAG_LSYS) {
/* Grrr. LinkSys has to be different from everyone else. */
diff --git a/sys/dev/usb/net/if_cdce.c b/sys/dev/usb/net/if_cdce.c
index 352fcec..52ea206 100644
--- a/sys/dev/usb/net/if_cdce.c
+++ b/sys/dev/usb/net/if_cdce.c
@@ -197,9 +197,6 @@ static const struct usb_ether_methods cdce_ue_methods = {
};
static const struct usb_device_id cdce_devs[] = {
- {USB_IF_CSI(UICLASS_CDC, UISUBCLASS_ETHERNET_NETWORKING_CONTROL_MODEL, 0)},
- {USB_IF_CSI(UICLASS_CDC, UISUBCLASS_MOBILE_DIRECT_LINE_MODEL, 0)},
-
{USB_VPI(USB_VENDOR_ACERLABS, USB_PRODUCT_ACERLABS_M5632, CDCE_FLAG_NO_UNION)},
{USB_VPI(USB_VENDOR_AMBIT, USB_PRODUCT_AMBIT_NTL_250, CDCE_FLAG_NO_UNION)},
{USB_VPI(USB_VENDOR_COMPAQ, USB_PRODUCT_COMPAQ_IPAQLINUX, CDCE_FLAG_NO_UNION)},
@@ -213,6 +210,9 @@ static const struct usb_device_id cdce_devs[] = {
{USB_VPI(USB_VENDOR_SHARP, USB_PRODUCT_SHARP_SLA300, CDCE_FLAG_ZAURUS | CDCE_FLAG_NO_UNION)},
{USB_VPI(USB_VENDOR_SHARP, USB_PRODUCT_SHARP_SLC700, CDCE_FLAG_ZAURUS | CDCE_FLAG_NO_UNION)},
{USB_VPI(USB_VENDOR_SHARP, USB_PRODUCT_SHARP_SLC750, CDCE_FLAG_ZAURUS | CDCE_FLAG_NO_UNION)},
+
+ {USB_IF_CSI(UICLASS_CDC, UISUBCLASS_ETHERNET_NETWORKING_CONTROL_MODEL, 0)},
+ {USB_IF_CSI(UICLASS_CDC, UISUBCLASS_MOBILE_DIRECT_LINE_MODEL, 0)},
};
static int
diff --git a/sys/dev/usb/net/usb_ethernet.c b/sys/dev/usb/net/usb_ethernet.c
index 427137a..6cf4460 100644
--- a/sys/dev/usb/net/usb_ethernet.c
+++ b/sys/dev/usb/net/usb_ethernet.c
@@ -221,10 +221,10 @@ ue_attach_post_task(struct usb_proc_msg *_task)
if (ue->ue_methods->ue_mii_upd != NULL &&
ue->ue_methods->ue_mii_sts != NULL) {
- newbus_xlock();
+ mtx_lock(&Giant); /* device_xxx() depends on this */
error = mii_phy_probe(ue->ue_dev, &ue->ue_miibus,
ue_ifmedia_upd, ue->ue_methods->ue_mii_sts);
- newbus_xunlock();
+ mtx_unlock(&Giant);
if (error) {
device_printf(ue->ue_dev, "MII without any PHY\n");
goto error;
@@ -279,12 +279,9 @@ uether_ifdetach(struct usb_ether *ue)
/* detach miibus */
if (ue->ue_miibus != NULL) {
-
- /*
- * It is up to the callers to provide the correct
- * newbus locking.
- */
+ mtx_lock(&Giant); /* device_xxx() depends on this */
device_delete_child(ue->ue_dev, ue->ue_miibus);
+ mtx_unlock(&Giant);
}
/* detach ethernet */
diff --git a/sys/dev/usb/serial/uipaq.c b/sys/dev/usb/serial/uipaq.c
index 79fe21e..89a4cd2 100644
--- a/sys/dev/usb/serial/uipaq.c
+++ b/sys/dev/usb/serial/uipaq.c
@@ -1103,6 +1103,10 @@ uipaq_probe(device_t dev)
if (uaa->info.bIfaceIndex != UIPAQ_IFACE_INDEX) {
return (ENXIO);
}
+ if (uaa->info.bInterfaceClass == UICLASS_IAD) {
+ DPRINTF("IAD detected - not UIPAQ serial device\n");
+ return (ENXIO);
+ }
return (usbd_lookup_id_by_uaa(uipaq_devs, sizeof(uipaq_devs), uaa));
}
diff --git a/sys/dev/usb/serial/uvisor.c b/sys/dev/usb/serial/uvisor.c
index c7175e3..3f1624b 100644
--- a/sys/dev/usb/serial/uvisor.c
+++ b/sys/dev/usb/serial/uvisor.c
@@ -95,7 +95,15 @@ SYSCTL_INT(_hw_usb_uvisor, OID_AUTO, debug, CTLFLAG_RW,
#define UVISOR_CONFIG_INDEX 0
#define UVISOR_IFACE_INDEX 0
-#define UVISOR_BUFSIZE 1024 /* bytes */
+
+/*
+ * The following buffer sizes are hardcoded due to the way the Palm
+ * firmware works. It looks like the device is not short terminating
+ * the data transferred.
+ */
+#define UVISORIBUFSIZE 0 /* Use wMaxPacketSize */
+#define UVISOROBUFSIZE 32 /* bytes */
+#define UVISOROFRAMES 32 /* units */
/* From the Linux driver */
/*
@@ -208,7 +216,8 @@ static const struct usb_config uvisor_config[UVISOR_N_TRANSFER] = {
.type = UE_BULK,
.endpoint = UE_ADDR_ANY,
.direction = UE_DIR_OUT,
- .bufsize = UVISOR_BUFSIZE, /* bytes */
+ .bufsize = UVISOROBUFSIZE * UVISOROFRAMES,
+ .frames = UVISOROFRAMES,
.flags = {.pipe_bof = 1,.force_short_xfer = 1,},
.callback = &uvisor_write_callback,
},
@@ -217,7 +226,7 @@ static const struct usb_config uvisor_config[UVISOR_N_TRANSFER] = {
.type = UE_BULK,
.endpoint = UE_ADDR_ANY,
.direction = UE_DIR_IN,
- .bufsize = UVISOR_BUFSIZE, /* bytes */
+ .bufsize = UVISORIBUFSIZE,
.flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
.callback = &uvisor_read_callback,
},
@@ -270,7 +279,7 @@ static const struct usb_device_id uvisor_devs[] = {
{USB_VPI(USB_VENDOR_PALM, USB_PRODUCT_PALM_ZIRE31, UVISOR_FLAG_PALM4)},
{USB_VPI(USB_VENDOR_SAMSUNG, USB_PRODUCT_SAMSUNG_I500, UVISOR_FLAG_PALM4)},
{USB_VPI(USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_40, 0)},
- {USB_VPI(USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_41, UVISOR_FLAG_PALM4)},
+ {USB_VPI(USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_41, 0)},
{USB_VPI(USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_S360, UVISOR_FLAG_PALM4)},
{USB_VPI(USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_NX60, UVISOR_FLAG_PALM4)},
{USB_VPI(USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_35, UVISOR_FLAG_PALM35)},
@@ -375,7 +384,6 @@ uvisor_init(struct uvisor_softc *sc, struct usb_device *udev, struct usb_config
struct uvisor_connection_info coninfo;
struct uvisor_palm_connection_info pconinfo;
uint16_t actlen;
- uWord wAvail;
uint8_t buffer[256];
if (sc->sc_flag & UVISOR_FLAG_VISOR) {
@@ -496,6 +504,9 @@ uvisor_init(struct uvisor_softc *sc, struct usb_device *udev, struct usb_config
goto done;
}
}
+#if 0
+ uWord wAvail;
+
DPRINTF("getting available bytes\n");
req.bmRequestType = UT_READ_VENDOR_ENDPOINT;
req.bRequest = UVISOR_REQUEST_BYTES_AVAILABLE;
@@ -507,6 +518,7 @@ uvisor_init(struct uvisor_softc *sc, struct usb_device *udev, struct usb_config
goto done;
}
DPRINTF("avail=%d\n", UGETW(wAvail));
+#endif
DPRINTF("done\n");
done:
@@ -579,19 +591,31 @@ uvisor_write_callback(struct usb_xfer *xfer, usb_error_t error)
struct uvisor_softc *sc = usbd_xfer_softc(xfer);
struct usb_page_cache *pc;
uint32_t actlen;
+ uint8_t x;
switch (USB_GET_STATE(xfer)) {
case USB_ST_SETUP:
case USB_ST_TRANSFERRED:
tr_setup:
- pc = usbd_xfer_get_frame(xfer, 0);
- if (ucom_get_data(&sc->sc_ucom, pc, 0,
- UVISOR_BUFSIZE, &actlen)) {
+ for (x = 0; x != UVISOROFRAMES; x++) {
+
+ usbd_xfer_set_frame_offset(xfer,
+ x * UVISOROBUFSIZE, x);
- usbd_xfer_set_frame_len(xfer, 0, actlen);
+ pc = usbd_xfer_get_frame(xfer, x);
+ if (ucom_get_data(&sc->sc_ucom, pc, 0,
+ UVISOROBUFSIZE, &actlen)) {
+ usbd_xfer_set_frame_len(xfer, x, actlen);
+ } else {
+ break;
+ }
+ }
+ /* check for data */
+ if (x != 0) {
+ usbd_xfer_set_frames(xfer, x);
usbd_transfer_submit(xfer);
}
- return;
+ break;
default: /* Error */
if (error != USB_ERR_CANCELLED) {
@@ -599,7 +623,7 @@ tr_setup:
usbd_xfer_set_stall(xfer);
goto tr_setup;
}
- return;
+ break;
}
}
diff --git a/sys/dev/usb/storage/umass.c b/sys/dev/usb/storage/umass.c
index 2e412d9..23893e4 100644
--- a/sys/dev/usb/storage/umass.c
+++ b/sys/dev/usb/storage/umass.c
@@ -124,6 +124,7 @@ __FBSDID("$FreeBSD$");
#include <dev/usb/usb.h>
#include <dev/usb/usbdi.h>
+#include <dev/usb/usb_device.h>
#include "usbdevs.h"
#include <cam/cam.h>
@@ -412,6 +413,10 @@ static const struct umass_devdescr umass_devdescr[] = {
UMASS_PROTO_DEFAULT,
NO_SYNCHRONIZE_CACHE
},
+ {USB_VENDOR_ALCOR, USB_PRODUCT_ALCOR_SDCR_6335, RID_WILDCARD,
+ UMASS_PROTO_DEFAULT,
+ NO_TEST_UNIT_READY | NO_SYNCHRONIZE_CACHE
+ },
{USB_VENDOR_ALCOR, USB_PRODUCT_ALCOR_AU6390, RID_WILDCARD,
UMASS_PROTO_DEFAULT,
NO_SYNCHRONIZE_CACHE
@@ -733,6 +738,10 @@ static const struct umass_devdescr umass_devdescr[] = {
UMASS_PROTO_UFI,
NO_QUIRKS
},
+ { USB_VENDOR_PHILIPS, USB_PRODUCT_PHILIPS_SPE3030CC, RID_WILDCARD,
+ UMASS_PROTO_DEFAULT,
+ NO_SYNCHRONIZE_CACHE
+ },
{USB_VENDOR_PLEXTOR, USB_PRODUCT_PLEXTOR_40_12_40U, RID_WILDCARD,
UMASS_PROTO_SCSI | UMASS_PROTO_BBB,
NO_TEST_UNIT_READY
@@ -893,6 +902,10 @@ static const struct umass_devdescr umass_devdescr[] = {
UMASS_PROTO_UFI | UMASS_PROTO_CBI,
NO_QUIRKS
},
+ {USB_VENDOR_TECLAST, USB_PRODUCT_TECLAST_TLC300, RID_WILDCARD,
+ UMASS_PROTO_DEFAULT,
+ NO_TEST_UNIT_READY | NO_SYNCHRONIZE_CACHE
+ },
{USB_VENDOR_TREK, USB_PRODUCT_TREK_MEMKEY, RID_WILDCARD,
UMASS_PROTO_SCSI | UMASS_PROTO_BBB,
NO_INQUIRY
@@ -965,6 +978,10 @@ static const struct umass_devdescr umass_devdescr[] = {
UMASS_PROTO_SCSI | UMASS_PROTO_BBB,
NO_SYNCHRONIZE_CACHE
},
+ {USB_VENDOR_ASUS, USB_PRODUCT_ASUS_GMSC, RID_WILDCARD,
+ UMASS_PROTO_DEFAULT,
+ NO_SYNCHRONIZE_CACHE
+ },
{VID_EOT, PID_EOT, RID_EOT, 0, 0}
};
@@ -2962,6 +2979,28 @@ umass_cam_action(struct cam_sim *sim, union ccb *ccb)
if (sc->sc_transfer.cmd_data[0] == INQUIRY) {
/*
+ * Umass devices don't generally report their serial numbers
+ * in the usual SCSI way. Emulate it here.
+ */
+ if ((sc->sc_transfer.cmd_data[1] & SI_EVPD) &&
+ sc->sc_transfer.cmd_data[2] == SVPD_UNIT_SERIAL_NUMBER &&
+ sc->sc_udev != NULL &&
+ sc->sc_udev->serial != NULL &&
+ sc->sc_udev->serial[0] != '\0') {
+ struct scsi_vpd_unit_serial_number *vpd_serial;
+
+ vpd_serial = (struct scsi_vpd_unit_serial_number *)ccb->csio.data_ptr;
+ vpd_serial->length = strlen(sc->sc_udev->serial);
+ if (vpd_serial->length > sizeof(vpd_serial->serial_num))
+ vpd_serial->length = sizeof(vpd_serial->serial_num);
+ memcpy(vpd_serial->serial_num, sc->sc_udev->serial, vpd_serial->length);
+ ccb->csio.scsi_status = SCSI_STATUS_OK;
+ ccb->ccb_h.status = CAM_REQ_CMP;
+ xpt_done(ccb);
+ goto done;
+ }
+
+ /*
* Handle EVPD inquiry for broken devices first
* NO_INQUIRY also implies NO_INQUIRY_EVPD
*/
@@ -3177,6 +3216,29 @@ umass_cam_cb(struct umass_softc *sc, union ccb *ccb, uint32_t residue,
maxsector = scsi_4btoul(rcap->addr) - 1;
scsi_ulto4b(maxsector, rcap->addr);
}
+ /*
+ * We have to add SVPD_UNIT_SERIAL_NUMBER to the list
+ * of pages supported by the device - otherwise, CAM
+ * will never ask us for the serial number if the
+ * device cannot handle that by itself.
+ */
+ if (ccb->ccb_h.func_code == XPT_SCSI_IO &&
+ sc->sc_transfer.cmd_data[0] == INQUIRY &&
+ (sc->sc_transfer.cmd_data[1] & SI_EVPD) &&
+ sc->sc_transfer.cmd_data[2] == SVPD_SUPPORTED_PAGE_LIST &&
+ sc->sc_udev != NULL &&
+ sc->sc_udev->serial != NULL &&
+ sc->sc_udev->serial[0] != '\0') {
+ struct ccb_scsiio *csio;
+ struct scsi_vpd_supported_page_list *page_list;
+
+ csio = &ccb->csio;
+ page_list = (struct scsi_vpd_supported_page_list *)csio->data_ptr;
+ if (page_list->length + 1 < SVPD_SUPPORTED_PAGES_SIZE) {
+ page_list->list[page_list->length] = SVPD_UNIT_SERIAL_NUMBER;
+ page_list->length++;
+ }
+ }
xpt_done(ccb);
break;
diff --git a/sys/dev/usb/storage/urio.c b/sys/dev/usb/storage/urio.c
index 6bb2e88..403c4c2 100644
--- a/sys/dev/usb/storage/urio.c
+++ b/sys/dev/usb/storage/urio.c
@@ -390,9 +390,6 @@ urio_open(struct usb_fifo *fifo, int fflags)
{
struct urio_softc *sc = usb_fifo_softc(fifo);
- if ((fflags & (FWRITE | FREAD)) != (FWRITE | FREAD)) {
- return (EACCES);
- }
if (fflags & FREAD) {
/* clear stall first */
mtx_lock(&sc->sc_mtx);
diff --git a/sys/dev/usb/usb.h b/sys/dev/usb/usb.h
index 68c3caf..1198398 100644
--- a/sys/dev/usb/usb.h
+++ b/sys/dev/usb/usb.h
@@ -484,6 +484,8 @@ typedef struct usb_interface_assoc_descriptor usb_interface_assoc_descriptor_t;
#define UISUBCLASS_RF 0x01
#define UIPROTO_BLUETOOTH 0x01
+#define UICLASS_IAD 0xEF /* Interface Association Descriptor */
+
#define UICLASS_APPL_SPEC 0xfe
#define UISUBCLASS_FIRMWARE_DOWNLOAD 1
#define UISUBCLASS_IRDA 2
diff --git a/sys/dev/usb/usb_busdma.c b/sys/dev/usb/usb_busdma.c
index e5d6ed7..177b94f 100644
--- a/sys/dev/usb/usb_busdma.c
+++ b/sys/dev/usb/usb_busdma.c
@@ -679,8 +679,14 @@ usb_pc_cpu_invalidate(struct usb_page_cache *pc)
/* nothing has been loaded into this page cache! */
return;
}
- bus_dmamap_sync(pc->tag, pc->map,
- BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD);
+
+ /*
+ * TODO: We currently do XXX_POSTREAD and XXX_PREREAD at the
+ * same time, but in the future we should try to isolate the
+ * different cases to optimise the code. --HPS
+ */
+ bus_dmamap_sync(pc->tag, pc->map, BUS_DMASYNC_POSTREAD);
+ bus_dmamap_sync(pc->tag, pc->map, BUS_DMASYNC_PREREAD);
}
/*------------------------------------------------------------------------*
@@ -693,8 +699,7 @@ usb_pc_cpu_flush(struct usb_page_cache *pc)
/* nothing has been loaded into this page cache! */
return;
}
- bus_dmamap_sync(pc->tag, pc->map,
- BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
+ bus_dmamap_sync(pc->tag, pc->map, BUS_DMASYNC_PREWRITE);
}
/*------------------------------------------------------------------------*
diff --git a/sys/dev/usb/usb_compat_linux.c b/sys/dev/usb/usb_compat_linux.c
index 00fc86b..604ac4d 100644
--- a/sys/dev/usb/usb_compat_linux.c
+++ b/sys/dev/usb/usb_compat_linux.c
@@ -215,12 +215,14 @@ usb_linux_probe(device_t dev)
if (uaa->usb_mode != USB_MODE_HOST) {
return (ENXIO);
}
+ mtx_lock(&Giant);
LIST_FOREACH(udrv, &usb_linux_driver_list, linux_driver_list) {
if (usb_linux_lookup_id(udrv->id_table, uaa)) {
err = 0;
break;
}
}
+ mtx_unlock(&Giant);
return (err);
}
@@ -237,7 +239,9 @@ usb_linux_get_usb_driver(struct usb_linux_softc *sc)
{
struct usb_driver *udrv;
+ mtx_lock(&Giant);
udrv = sc->sc_udrv;
+ mtx_unlock(&Giant);
return (udrv);
}
@@ -256,11 +260,13 @@ usb_linux_attach(device_t dev)
struct usb_driver *udrv;
const struct usb_device_id *id = NULL;
+ mtx_lock(&Giant);
LIST_FOREACH(udrv, &usb_linux_driver_list, linux_driver_list) {
id = usb_linux_lookup_id(udrv->id_table, uaa);
if (id)
break;
}
+ mtx_unlock(&Giant);
if (id == NULL) {
return (ENXIO);
@@ -281,7 +287,9 @@ usb_linux_attach(device_t dev)
return (ENXIO);
}
}
+ mtx_lock(&Giant);
LIST_INSERT_HEAD(&usb_linux_attached_list, sc, sc_attached_list);
+ mtx_unlock(&Giant);
/* success */
return (0);
@@ -299,12 +307,14 @@ usb_linux_detach(device_t dev)
struct usb_linux_softc *sc = device_get_softc(dev);
struct usb_driver *udrv = NULL;
+ mtx_lock(&Giant);
if (sc->sc_attached_list.le_prev) {
LIST_REMOVE(sc, sc_attached_list);
sc->sc_attached_list.le_prev = NULL;
udrv = sc->sc_udrv;
sc->sc_udrv = NULL;
}
+ mtx_unlock(&Giant);
if (udrv && udrv->disconnect) {
(udrv->disconnect) (sc->sc_ui);
@@ -464,10 +474,13 @@ usb_unlink_bsd(struct usb_xfer *xfer,
if (!usbd_transfer_pending(xfer))
return;
if (xfer->priv_fifo == (void *)urb) {
- if (drain)
+ if (drain) {
+ mtx_unlock(&Giant);
usbd_transfer_drain(xfer);
- else
+ mtx_lock(&Giant);
+ } else {
usbd_transfer_stop(xfer);
+ }
usbd_transfer_start(xfer);
}
}
@@ -1135,9 +1148,9 @@ usb_linux_register(void *arg)
{
struct usb_driver *drv = arg;
- newbus_xlock();
+ mtx_lock(&Giant);
LIST_INSERT_HEAD(&usb_linux_driver_list, drv, linux_driver_list);
- newbus_xunlock();
+ mtx_unlock(&Giant);
usb_needs_explore_all();
}
@@ -1159,16 +1172,16 @@ usb_linux_deregister(void *arg)
struct usb_linux_softc *sc;
repeat:
- newbus_xlock();
+ mtx_lock(&Giant);
LIST_FOREACH(sc, &usb_linux_attached_list, sc_attached_list) {
if (sc->sc_udrv == drv) {
+ mtx_unlock(&Giant);
device_detach(sc->sc_fbsd_dev);
- newbus_xunlock();
goto repeat;
}
}
LIST_REMOVE(drv, linux_driver_list);
- newbus_xunlock();
+ mtx_unlock(&Giant);
}
/*------------------------------------------------------------------------*
diff --git a/sys/dev/usb/usb_dev.c b/sys/dev/usb/usb_dev.c
index b7c6553..c828b24 100644
--- a/sys/dev/usb/usb_dev.c
+++ b/sys/dev/usb/usb_dev.c
@@ -217,7 +217,7 @@ usb_ref_device(struct usb_cdev_privdata *cpd,
* We need to grab the sx-lock before grabbing the
* FIFO refs to avoid deadlock at detach!
*/
- sx_xlock(cpd->udev->default_sx + 1);
+ usbd_enum_lock(cpd->udev);
mtx_lock(&usb_ref_lock);
@@ -275,14 +275,12 @@ usb_ref_device(struct usb_cdev_privdata *cpd,
}
mtx_unlock(&usb_ref_lock);
- if (crd->is_uref) {
- mtx_lock(&Giant); /* XXX */
- }
return (0);
error:
if (crd->is_uref) {
- sx_unlock(cpd->udev->default_sx + 1);
+ usbd_enum_unlock(cpd->udev);
+
if (--(cpd->udev->refcount) == 0) {
cv_signal(cpd->udev->default_cv + 1);
}
@@ -334,10 +332,9 @@ usb_unref_device(struct usb_cdev_privdata *cpd,
DPRINTFN(2, "cpd=%p is_uref=%d\n", cpd, crd->is_uref);
- if (crd->is_uref) {
- mtx_unlock(&Giant); /* XXX */
- sx_unlock(cpd->udev->default_sx + 1);
- }
+ if (crd->is_uref)
+ usbd_enum_unlock(cpd->udev);
+
mtx_lock(&usb_ref_lock);
if (crd->is_read) {
if (--(crd->rxfifo->refcount) == 0) {
@@ -1040,16 +1037,11 @@ usb_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int fflag, struct thread*
* Performance optimisation: We try to check for IOCTL's that
* don't need the USB reference first. Then we grab the USB
* reference if we need it!
- * Note that some ioctl_post handlers would need to run with the
- * newbus lock held. It cannot be acquired later because it can
- * introduce a LOR, so acquire it here.
*/
- newbus_xlock();
err = usb_ref_device(cpd, &refs, 0 /* no uref */ );
- if (err) {
- newbus_xunlock();
+ if (err)
return (ENXIO);
- }
+
fflags = cpd->fflags;
f = NULL; /* set default value */
@@ -1081,7 +1073,6 @@ usb_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int fflag, struct thread*
}
done:
usb_unref_device(cpd, &refs);
- newbus_xunlock();
return (err);
}
diff --git a/sys/dev/usb/usb_device.c b/sys/dev/usb/usb_device.c
index 2d34017..635a9b1 100644
--- a/sys/dev/usb/usb_device.c
+++ b/sys/dev/usb/usb_device.c
@@ -402,11 +402,11 @@ usb_unconfigure(struct usb_device *udev, uint8_t flag)
uint8_t do_unlock;
/* automatic locking */
- if (sx_xlocked(udev->default_sx + 1)) {
+ if (usbd_enum_is_locked(udev)) {
do_unlock = 0;
} else {
do_unlock = 1;
- sx_xlock(udev->default_sx + 1);
+ usbd_enum_lock(udev);
}
/* detach all interface drivers */
@@ -442,9 +442,8 @@ usb_unconfigure(struct usb_device *udev, uint8_t flag)
udev->curr_config_no = USB_UNCONFIG_NO;
udev->curr_config_index = USB_UNCONFIG_INDEX;
- if (do_unlock) {
- sx_unlock(udev->default_sx + 1);
- }
+ if (do_unlock)
+ usbd_enum_unlock(udev);
}
/*------------------------------------------------------------------------*
@@ -472,11 +471,11 @@ usbd_set_config_index(struct usb_device *udev, uint8_t index)
DPRINTFN(6, "udev=%p index=%d\n", udev, index);
/* automatic locking */
- if (sx_xlocked(udev->default_sx + 1)) {
+ if (usbd_enum_is_locked(udev)) {
do_unlock = 0;
} else {
do_unlock = 1;
- sx_xlock(udev->default_sx + 1);
+ usbd_enum_lock(udev);
}
usb_unconfigure(udev, USB_UNCFG_FLAG_FREE_SUBDEV);
@@ -585,9 +584,8 @@ done:
if (err) {
usb_unconfigure(udev, USB_UNCFG_FLAG_FREE_SUBDEV);
}
- if (do_unlock) {
- sx_unlock(udev->default_sx + 1);
- }
+ if (do_unlock)
+ usbd_enum_unlock(udev);
return (err);
}
@@ -823,11 +821,11 @@ usbd_set_alt_interface_index(struct usb_device *udev,
uint8_t do_unlock;
/* automatic locking */
- if (sx_xlocked(udev->default_sx + 1)) {
+ if (usbd_enum_is_locked(udev)) {
do_unlock = 0;
} else {
do_unlock = 1;
- sx_xlock(udev->default_sx + 1);
+ usbd_enum_lock(udev);
}
if (iface == NULL) {
err = USB_ERR_INVAL;
@@ -863,9 +861,9 @@ usbd_set_alt_interface_index(struct usb_device *udev,
iface->idesc->bAlternateSetting);
done:
- if (do_unlock) {
- sx_unlock(udev->default_sx + 1);
- }
+ if (do_unlock)
+ usbd_enum_unlock(udev);
+
return (err);
}
@@ -1230,11 +1228,11 @@ usb_probe_and_attach(struct usb_device *udev, uint8_t iface_index)
return (USB_ERR_INVAL);
}
/* automatic locking */
- if (sx_xlocked(udev->default_sx + 1)) {
+ if (usbd_enum_is_locked(udev)) {
do_unlock = 0;
} else {
do_unlock = 1;
- sx_xlock(udev->default_sx + 1);
+ usbd_enum_lock(udev);
}
if (udev->curr_config_index == USB_UNCONFIG_INDEX) {
@@ -1315,9 +1313,9 @@ usb_probe_and_attach(struct usb_device *udev, uint8_t iface_index)
}
}
done:
- if (do_unlock) {
- sx_unlock(udev->default_sx + 1);
- }
+ if (do_unlock)
+ usbd_enum_unlock(udev);
+
return (0);
}
@@ -1779,7 +1777,8 @@ repeat_set_config:
}
} else if (usb_test_huawei_autoinst_p(udev, &uaa) == 0) {
DPRINTFN(0, "Found Huawei auto-install disk!\n");
- err = USB_ERR_STALLED; /* fake an error */
+ /* leave device unconfigured */
+ usb_unconfigure(udev, USB_UNCFG_FLAG_FREE_SUBDEV);
}
} else {
err = 0; /* set success */
@@ -1902,15 +1901,18 @@ static void
usb_cdev_free(struct usb_device *udev)
{
struct usb_fs_privdata* pd;
+ struct cdev* pcdev;
DPRINTFN(2, "Freeing device nodes\n");
while ((pd = LIST_FIRST(&udev->pd_list)) != NULL) {
KASSERT(pd->cdev->si_drv1 == pd, ("privdata corrupt"));
- destroy_dev_sched_cb(pd->cdev, usb_cdev_cleanup, pd);
+ pcdev = pd->cdev;
pd->cdev = NULL;
LIST_REMOVE(pd, pd_next);
+ if (pcdev != NULL)
+ destroy_dev_sched_cb(pcdev, usb_cdev_cleanup, pd);
}
}
@@ -2448,3 +2450,37 @@ usbd_device_attached(struct usb_device *udev)
{
return (udev->state > USB_STATE_DETACHED);
}
+
+/* The following function locks enumerating the given USB device. */
+
+void
+usbd_enum_lock(struct usb_device *udev)
+{
+ sx_xlock(udev->default_sx + 1);
+ /*
+ * NEWBUS LOCK NOTE: We should check if any parent SX locks
+ * are locked before locking Giant. Else the lock can be
+ * locked multiple times.
+ */
+ mtx_lock(&Giant);
+}
+
+/* The following function unlocks enumerating the given USB device. */
+
+void
+usbd_enum_unlock(struct usb_device *udev)
+{
+ mtx_unlock(&Giant);
+ sx_xunlock(udev->default_sx + 1);
+}
+
+/*
+ * The following function checks the enumerating lock for the given
+ * USB device.
+ */
+
+uint8_t
+usbd_enum_is_locked(struct usb_device *udev)
+{
+ return (sx_xlocked(udev->default_sx + 1));
+}
diff --git a/sys/dev/usb/usb_device.h b/sys/dev/usb/usb_device.h
index d601c14..682e200 100644
--- a/sys/dev/usb/usb_device.h
+++ b/sys/dev/usb/usb_device.h
@@ -211,5 +211,8 @@ uint8_t usb_peer_can_wakeup(struct usb_device *udev);
struct usb_endpoint *usb_endpoint_foreach(struct usb_device *udev, struct usb_endpoint *ep);
void usb_set_device_state(struct usb_device *udev,
enum usb_dev_state state);
+void usbd_enum_lock(struct usb_device *);
+void usbd_enum_unlock(struct usb_device *);
+uint8_t usbd_enum_is_locked(struct usb_device *);
#endif /* _USB_DEVICE_H_ */
diff --git a/sys/dev/usb/usb_handle_request.c b/sys/dev/usb/usb_handle_request.c
index 2bc3eef..92bf832 100644
--- a/sys/dev/usb/usb_handle_request.c
+++ b/sys/dev/usb/usb_handle_request.c
@@ -152,8 +152,8 @@ usb_handle_set_config(struct usb_xfer *xfer, uint8_t conf_no)
* attach:
*/
USB_XFER_UNLOCK(xfer);
- newbus_xlock();
- sx_xlock(udev->default_sx + 1);
+
+ usbd_enum_lock(udev);
if (conf_no == USB_UNCONFIG_NO) {
conf_no = USB_UNCONFIG_INDEX;
@@ -176,8 +176,7 @@ usb_handle_set_config(struct usb_xfer *xfer, uint8_t conf_no)
goto done;
}
done:
- sx_unlock(udev->default_sx + 1);
- newbus_xunlock();
+ usbd_enum_unlock(udev);
USB_XFER_LOCK(xfer);
return (err);
}
@@ -190,19 +189,19 @@ usb_check_alt_setting(struct usb_device *udev,
usb_error_t err = 0;
/* automatic locking */
- if (sx_xlocked(udev->default_sx + 1)) {
+ if (usbd_enum_is_locked(udev)) {
do_unlock = 0;
} else {
do_unlock = 1;
- sx_xlock(udev->default_sx + 1);
+ usbd_enum_lock(udev);
}
if (alt_index >= usbd_get_no_alts(udev->cdesc, iface->idesc))
err = USB_ERR_INVAL;
- if (do_unlock) {
- sx_unlock(udev->default_sx + 1);
- }
+ if (do_unlock)
+ usbd_enum_unlock(udev);
+
return (err);
}
@@ -236,8 +235,8 @@ usb_handle_iface_request(struct usb_xfer *xfer,
* attach:
*/
USB_XFER_UNLOCK(xfer);
- newbus_xlock();
- sx_xlock(udev->default_sx + 1);
+
+ usbd_enum_lock(udev);
error = ENXIO;
@@ -353,20 +352,17 @@ tr_repeat:
goto tr_stalled;
}
tr_valid:
- sx_unlock(udev->default_sx + 1);
- newbus_xunlock();
+ usbd_enum_unlock(udev);
USB_XFER_LOCK(xfer);
return (0);
tr_short:
- sx_unlock(udev->default_sx + 1);
- newbus_xunlock();
+ usbd_enum_unlock(udev);
USB_XFER_LOCK(xfer);
return (USB_ERR_SHORT_XFER);
tr_stalled:
- sx_unlock(udev->default_sx + 1);
- newbus_xunlock();
+ usbd_enum_unlock(udev);
USB_XFER_LOCK(xfer);
return (USB_ERR_STALLED);
}
diff --git a/sys/dev/usb/usb_hub.c b/sys/dev/usb/usb_hub.c
index a09be96..2c81d97 100644
--- a/sys/dev/usb/usb_hub.c
+++ b/sys/dev/usb/usb_hub.c
@@ -96,6 +96,7 @@ struct uhub_current_state {
struct uhub_softc {
struct uhub_current_state sc_st;/* current state */
device_t sc_dev; /* base device */
+ struct mtx sc_mtx; /* our mutex */
struct usb_device *sc_udev; /* USB device */
struct usb_xfer *sc_xfer[UHUB_N_TRANSFER]; /* interrupt xfer */
uint8_t sc_flags;
@@ -234,10 +235,8 @@ uhub_explore_sub(struct uhub_softc *sc, struct usb_port *up)
if (child->driver_added_refcount != refcount) {
child->driver_added_refcount = refcount;
- newbus_xlock();
err = usb_probe_and_attach(child,
USB_IFACE_INDEX_ANY);
- newbus_xunlock();
if (err) {
goto done;
}
@@ -320,11 +319,9 @@ repeat:
/* detach any existing devices */
if (child) {
- newbus_xlock();
usb_free_device(child,
USB_UNCFG_FLAG_FREE_SUBDEV |
USB_UNCFG_FLAG_FREE_EP0);
- newbus_xunlock();
child = NULL;
}
/* get fresh status */
@@ -432,10 +429,8 @@ repeat:
mode = USB_MODE_HOST;
/* need to create a new child */
- newbus_xlock();
child = usb_alloc_device(sc->sc_dev, udev->bus, udev,
udev->depth + 1, portno - 1, portno, speed, mode);
- newbus_xunlock();
if (child == NULL) {
DPRINTFN(0, "could not allocate new device!\n");
goto error;
@@ -444,11 +439,9 @@ repeat:
error:
if (child) {
- newbus_xlock();
usb_free_device(child,
USB_UNCFG_FLAG_FREE_SUBDEV |
USB_UNCFG_FLAG_FREE_EP0);
- newbus_xunlock();
child = NULL;
}
if (err == 0) {
@@ -698,6 +691,8 @@ uhub_attach(device_t dev)
sc->sc_udev = udev;
sc->sc_dev = dev;
+ mtx_init(&sc->sc_mtx, "USB HUB mutex", NULL, MTX_DEF);
+
snprintf(sc->sc_name, sizeof(sc->sc_name), "%s",
device_get_nameunit(dev));
@@ -781,7 +776,7 @@ uhub_attach(device_t dev)
} else {
/* normal HUB */
err = usbd_transfer_setup(udev, &iface_index, sc->sc_xfer,
- uhub_config, UHUB_N_TRANSFER, sc, &Giant);
+ uhub_config, UHUB_N_TRANSFER, sc, &sc->sc_mtx);
}
if (err) {
DPRINTFN(0, "cannot setup interrupt transfer, "
@@ -857,9 +852,9 @@ uhub_attach(device_t dev)
/* Start the interrupt endpoint, if any */
if (sc->sc_xfer[0] != NULL) {
- USB_XFER_LOCK(sc->sc_xfer[0]);
+ mtx_lock(&sc->sc_mtx);
usbd_transfer_start(sc->sc_xfer[0]);
- USB_XFER_UNLOCK(sc->sc_xfer[0]);
+ mtx_unlock(&sc->sc_mtx);
}
/* Enable automatic power save on all USB HUBs */
@@ -875,6 +870,9 @@ error:
free(udev->hub, M_USBDEV);
udev->hub = NULL;
}
+
+ mtx_destroy(&sc->sc_mtx);
+
return (ENXIO);
}
@@ -915,6 +913,9 @@ uhub_detach(device_t dev)
free(hub, M_USBDEV);
sc->sc_udev->hub = NULL;
+
+ mtx_destroy(&sc->sc_mtx);
+
return (0);
}
@@ -987,6 +988,7 @@ uhub_child_location_string(device_t parent, device_t child,
struct usb_hub *hub = sc->sc_udev->hub;
struct hub_result res;
+ mtx_lock(&Giant);
uhub_find_iface_index(hub, child, &res);
if (!res.udev) {
DPRINTF("device not on hub\n");
@@ -998,6 +1000,7 @@ uhub_child_location_string(device_t parent, device_t child,
snprintf(buf, buflen, "port=%u interface=%u",
res.portno, res.iface_index);
done:
+ mtx_unlock(&Giant);
return (0);
}
@@ -1011,6 +1014,7 @@ uhub_child_pnpinfo_string(device_t parent, device_t child,
struct usb_interface *iface;
struct hub_result res;
+ mtx_lock(&Giant);
uhub_find_iface_index(hub, child, &res);
if (!res.udev) {
DPRINTF("device not on hub\n");
@@ -1041,6 +1045,7 @@ uhub_child_pnpinfo_string(device_t parent, device_t child,
goto done;
}
done:
+ mtx_unlock(&Giant);
return (0);
}
@@ -1778,13 +1783,13 @@ usb_dev_resume_peer(struct usb_device *udev)
/* always update hardware power! */
(bus->methods->set_hw_power) (bus);
}
- newbus_xlock();
- sx_xlock(udev->default_sx + 1);
+
+ usbd_enum_lock(udev);
/* notify all sub-devices about resume */
err = usb_suspend_resume(udev, 0);
- sx_unlock(udev->default_sx + 1);
- newbus_xunlock();
+
+ usbd_enum_unlock(udev);
/* check if peer has wakeup capability */
if (usb_peer_can_wakeup(udev)) {
@@ -1850,13 +1855,12 @@ repeat:
}
}
- newbus_xlock();
- sx_xlock(udev->default_sx + 1);
+ usbd_enum_lock(udev);
/* notify all sub-devices about suspend */
err = usb_suspend_resume(udev, 1);
- sx_unlock(udev->default_sx + 1);
- newbus_xunlock();
+
+ usbd_enum_unlock(udev);
if (usb_peer_can_wakeup(udev)) {
/* allow device to do remote wakeup */
diff --git a/sys/dev/usb/usb_process.c b/sys/dev/usb/usb_process.c
index eb79f16..eb503fd 100644
--- a/sys/dev/usb/usb_process.c
+++ b/sys/dev/usb/usb_process.c
@@ -63,10 +63,13 @@
#endif
#if (__FreeBSD_version >= 800000)
+static struct proc *usbproc;
+static int usb_pcount;
#define USB_THREAD_CREATE(f, s, p, ...) \
- kproc_create((f), (s), (p), RFHIGHPID, 0, __VA_ARGS__)
-#define USB_THREAD_SUSPEND(p) kproc_suspend(p,0)
-#define USB_THREAD_EXIT(err) kproc_exit(err)
+ kproc_kthread_add((f), (s), &usbproc, (p), RFHIGHPID, \
+ 0, "usb", __VA_ARGS__)
+#define USB_THREAD_SUSPEND(p) kthread_suspend(p,0)
+#define USB_THREAD_EXIT(err) kthread_exit()
#else
#define USB_THREAD_CREATE(f, s, p, ...) \
kthread_create((f), (s), (p), RFHIGHPID, 0, __VA_ARGS__)
@@ -181,6 +184,11 @@ usb_process(void *arg)
up->up_ptr = NULL;
cv_signal(&up->up_cv);
mtx_unlock(up->up_mtx);
+#if (__FreeBSD_version >= 800000)
+ /* Clear the proc pointer if this is the last thread. */
+ if (--usb_pcount == 0)
+ usbproc = NULL;
+#endif
USB_THREAD_EXIT(0);
}
@@ -207,8 +215,8 @@ usb_proc_create(struct usb_process *up, struct mtx *p_mtx,
TAILQ_INIT(&up->up_qhead);
- cv_init(&up->up_cv, "wmsg");
- cv_init(&up->up_drain, "dmsg");
+ cv_init(&up->up_cv, "-");
+ cv_init(&up->up_drain, "usbdrain");
if (USB_THREAD_CREATE(&usb_process, up,
&up->up_ptr, pmesg)) {
@@ -216,6 +224,9 @@ usb_proc_create(struct usb_process *up, struct mtx *p_mtx,
up->up_ptr = NULL;
goto error;
}
+#if (__FreeBSD_version >= 800000)
+ usb_pcount++;
+#endif
return (0);
error:
@@ -446,3 +457,29 @@ usb_proc_drain(struct usb_process *up)
}
mtx_unlock(up->up_mtx);
}
+
+/*------------------------------------------------------------------------*
+ * usb_proc_rewakeup
+ *
+ * This function is called to re-wakeup the the given USB
+ * process. This usually happens after that the USB system has been in
+ * polling mode, like during a panic. This function must be called
+ * having "up->up_mtx" locked.
+ *------------------------------------------------------------------------*/
+void
+usb_proc_rewakeup(struct usb_process *up)
+{
+ /* check if not initialised */
+ if (up->up_mtx == NULL)
+ return;
+ /* check if gone */
+ if (up->up_gone)
+ return;
+
+ mtx_assert(up->up_mtx, MA_OWNED);
+
+ if (up->up_msleep == 0) {
+ /* re-wakeup */
+ cv_signal(&up->up_cv);
+ }
+}
diff --git a/sys/dev/usb/usb_process.h b/sys/dev/usb/usb_process.h
index c717dc1..b4159af 100644
--- a/sys/dev/usb/usb_process.h
+++ b/sys/dev/usb/usb_process.h
@@ -49,7 +49,11 @@ struct usb_process {
struct cv up_cv;
struct cv up_drain;
+#if (__FreeBSD_version >= 800000)
+ struct thread *up_ptr;
+#else
struct proc *up_ptr;
+#endif
struct thread *up_curtd;
struct mtx *up_mtx;
@@ -71,5 +75,6 @@ void usb_proc_drain(struct usb_process *up);
void usb_proc_mwait(struct usb_process *up, void *pm0, void *pm1);
void usb_proc_free(struct usb_process *up);
void *usb_proc_msignal(struct usb_process *up, void *pm0, void *pm1);
+void usb_proc_rewakeup(struct usb_process *up);
#endif /* _USB_PROCESS_H_ */
diff --git a/sys/dev/usb/usb_transfer.c b/sys/dev/usb/usb_transfer.c
index 3c466fb..8daf475 100644
--- a/sys/dev/usb/usb_transfer.c
+++ b/sys/dev/usb/usb_transfer.c
@@ -2907,13 +2907,9 @@ usbd_transfer_poll(struct usb_xfer **ppxfer, uint16_t max)
}
/* Make sure cv_signal() and cv_broadcast() is not called */
- udev->bus->control_xfer_proc.up_dsleep = 0;
udev->bus->control_xfer_proc.up_msleep = 0;
- udev->bus->explore_proc.up_dsleep = 0;
udev->bus->explore_proc.up_msleep = 0;
- udev->bus->giant_callback_proc.up_dsleep = 0;
udev->bus->giant_callback_proc.up_msleep = 0;
- udev->bus->non_giant_callback_proc.up_dsleep = 0;
udev->bus->non_giant_callback_proc.up_msleep = 0;
/* poll USB hardware */
diff --git a/sys/dev/usb/usbdevs b/sys/dev/usb/usbdevs
index 288750c..3cb6a3a 100644
--- a/sys/dev/usb/usbdevs
+++ b/sys/dev/usb/usbdevs
@@ -360,6 +360,7 @@ vendor SMC 0x0707 Standard Microsystems
vendor PUTERCOM 0x0708 Putercom
vendor MCT 0x0711 MCT
vendor IMATION 0x0718 Imation
+vendor TECLAST 0x071b Teclast
vendor SONYERICSSON 0x0731 Sony Ericsson
vendor EICON 0x0734 Eicon Networks
vendor SYNTECH 0x0745 Syntech Information
@@ -585,6 +586,7 @@ vendor NETGEAR3 0x1385 Netgear
vendor BALTECH 0x13ad Baltech
vendor CISCOLINKSYS 0x13b1 Cisco-Linksys
vendor SHARK 0x13d2 Shark
+vendor EMTEC 0x13fe Emtec
vendor NOVATEL 0x1410 Novatel Wireless
vendor MERLIN 0x1416 Merlin
vendor WISTRONNEWEB 0x1435 Wistron NeWeb
@@ -820,6 +822,7 @@ product AKS USBHASP 0x0001 USB-HASP 0.06
/* Alcor Micro, Inc. products */
product ALCOR2 KBD_HUB 0x2802 Kbd Hub
+product ALCOR SDCR_6335 0x6335 SD/MMC Card Reader
product ALCOR TRANSCEND 0x6387 Transcend JetFlash Drive
product ALCOR MA_KBD_HUB 0x9213 MacAlly Kbd Hub
product ALCOR AU9814 0x9215 AU9814 Hub
@@ -861,6 +864,12 @@ product APC UPS 0x0002 Uninterruptible Power Supply
/* Apple Computer products */
product APPLE EXT_KBD 0x020c Apple Extended USB Keyboard
+product APPLE KBD_TP_ANSI 0x0223 Apple Internal Keyboard/Trackpad (Wellspring/ANSI)
+product APPLE KBD_TP_ISO 0x0224 Apple Internal Keyboard/Trackpad (Wellspring/ISO)
+product APPLE KBD_TP_JIS 0x0225 Apple Internal Keyboard/Trackpad (Wellspring/JIS)
+product APPLE KBD_TP_ANSI2 0x0230 Apple Internal Keyboard/Trackpad (Wellspring2/ANSI)
+product APPLE KBD_TP_ISO2 0x0231 Apple Internal Keyboard/Trackpad (Wellspring2/ISO)
+product APPLE KBD_TP_JIS2 0x0232 Apple Internal Keyboard/Trackpad (Wellspring2/JIS)
product APPLE OPTMOUSE 0x0302 Optical mouse
product APPLE MIGHTYMOUSE 0x0304 Mighty Mouse
product APPLE EXT_KBD_HUB 0x1003 Hub in Apple Extended USB Keyboard
@@ -902,6 +911,7 @@ product ASUS RT2573_1 0x1723 RT2573
product ASUS RT2573_2 0x1724 RT2573
product ASUS LCM 0x1726 LCM display
product ASUS P535 0x420f ASUS P535 PDA
+product ASUS GMSC 0x422f ASUS Generic Mass Storage
/* ATen products */
product ATEN UC1284 0x2001 Parallel printer
@@ -1971,6 +1981,7 @@ product PHILIPS HUB 0x0201 hub
product PHILIPS PCA646VC 0x0303 PCA646VC PC Camera
product PHILIPS PCVC680K 0x0308 PCVC680K Vesta Pro PC Camera
product PHILIPS DSS150 0x0471 DSS 150 Digital Speaker System
+product PHILIPS SPE3030CC 0x083a USB 2.0 External Disk
product PHILIPS SNU5600 0x1236 SNU5600
product PHILIPS UM10016 0x1552 ISP 1581 Hi-Speed USB MPEG2 Encoder Reference Kit
product PHILIPS DIVAUSB 0x1801 DIVA USB mp3 player
@@ -2345,6 +2356,9 @@ product SUN KBD_HUB 0x100e Kbd Hub
/* Super Top products */
product SUPERTOP IDE 0x6600 USB-IDE
+/* Teclast products */
+product TECLAST TLC300 0x3203 USB Media Player
+
/* Supra products */
product DIAMOND2 SUPRAEXPRESS56K 0x07da Supra Express 56K modem
product DIAMOND2 SUPRA2890 0x0b4a SupraMax 2890 56K Modem
diff --git a/sys/dev/usb/wlan/if_upgt.c b/sys/dev/usb/wlan/if_upgt.c
index 8714645..c04c398 100644
--- a/sys/dev/usb/wlan/if_upgt.c
+++ b/sys/dev/usb/wlan/if_upgt.c
@@ -465,7 +465,6 @@ upgt_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
switch (cmd) {
case SIOCSIFFLAGS:
- newbus_xlock();
if (ifp->if_flags & IFF_UP) {
if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
if ((ifp->if_flags ^ sc->sc_if_flags) &
@@ -482,7 +481,6 @@ upgt_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
sc->sc_if_flags = ifp->if_flags;
if (startall)
ieee80211_start_all(ic);
- newbus_xunlock();
break;
case SIOCGIFMEDIA:
error = ifmedia_ioctl(ifp, ifr, &ic->ic_media, cmd);
diff --git a/sys/dev/usb/wlan/if_zyd.c b/sys/dev/usb/wlan/if_zyd.c
index 9bdb6ea..493c5fa 100644
--- a/sys/dev/usb/wlan/if_zyd.c
+++ b/sys/dev/usb/wlan/if_zyd.c
@@ -2547,7 +2547,7 @@ zyd_tx_start(struct zyd_softc *sc, struct mbuf *m0, struct ieee80211_node *ni)
bits = (rate == 11) ? (totlen * 16) + 10 :
((rate == 22) ? (totlen * 8) + 10 : (totlen * 8));
- desc->plcp_length = bits / ratediv[phy];
+ desc->plcp_length = htole16(bits / ratediv[phy]);
desc->plcp_service = 0;
if (rate == 22 && (bits % 11) > 0 && (bits % 11) <= 3)
desc->plcp_service |= ZYD_PLCP_LENGEXT;
diff --git a/sys/dev/xen/blkback/blkback.c b/sys/dev/xen/blkback/blkback.c
index 535b1e0..259f2f6 100644
--- a/sys/dev/xen/blkback/blkback.c
+++ b/sys/dev/xen/blkback/blkback.c
@@ -1156,7 +1156,7 @@ vbd_add_dev(struct xenbus_device *xdev)
devclass_t dc;
int err = 0;
- newbus_xlock();
+ mtx_lock(&Giant);
/* We will add a vbd device as a child of nexus0 (for now) */
if (!(dc = devclass_find("nexus")) ||
@@ -1183,7 +1183,7 @@ vbd_add_dev(struct xenbus_device *xdev)
done:
- newbus_xunlock();
+ mtx_unlock(&Giant);
return err;
}
diff --git a/sys/dev/xen/blkfront/blkfront.c b/sys/dev/xen/blkfront/blkfront.c
index f73c812..8487e8e 100644
--- a/sys/dev/xen/blkfront/blkfront.c
+++ b/sys/dev/xen/blkfront/blkfront.c
@@ -16,7 +16,9 @@
*/
/*
- * XenoBSD block device driver
+ * XenBSD block device driver
+ *
+ * Copyright (c) 2009 Frank Suchomel, Citrix
*/
#include <sys/cdefs.h>
@@ -122,6 +124,10 @@ static int blkif_ioctl(struct disk *dp, u_long cmd, void *addr, int flag, struct
static int blkif_queue_request(struct bio *bp);
static void xb_strategy(struct bio *bp);
+// In order to quiesce the device during kernel dumps, outstanding requests to
+// DOM0 for disk reads/writes need to be accounted for.
+static int blkif_queued_requests;
+static int xb_dump(void *, void *, vm_offset_t, off_t, size_t);
/* XXX move to xb_vbd.c when VBD update support is added */
@@ -231,6 +237,7 @@ xlvbd_add(device_t dev, blkif_sector_t capacity,
sc->xb_disk->d_close = blkif_close;
sc->xb_disk->d_ioctl = blkif_ioctl;
sc->xb_disk->d_strategy = xb_strategy;
+ sc->xb_disk->d_dump = xb_dump;
sc->xb_disk->d_name = name;
sc->xb_disk->d_drv1 = sc;
sc->xb_disk->d_sectorsize = sector_size;
@@ -286,9 +293,10 @@ xb_strategy(struct bio *bp)
* Place it in the queue of disk activities for this disk
*/
mtx_lock(&blkif_io_lock);
- bioq_disksort(&sc->xb_bioq, bp);
+ bioq_disksort(&sc->xb_bioq, bp);
xb_startio(sc);
+
mtx_unlock(&blkif_io_lock);
return;
@@ -301,6 +309,81 @@ xb_strategy(struct bio *bp)
return;
}
+static void xb_quiesce(struct blkfront_info *info);
+// Quiesce the disk writes for a dump file before allowing the next buffer.
+static void
+xb_quiesce(struct blkfront_info *info)
+{
+ int mtd;
+
+ // While there are outstanding requests
+ while (blkif_queued_requests) {
+ RING_FINAL_CHECK_FOR_RESPONSES(&info->ring, mtd);
+ if (mtd) {
+ // Recieved request completions, update queue.
+ blkif_int(info);
+ }
+ if (blkif_queued_requests) {
+ // Still pending requests, wait for the disk i/o to complete
+ HYPERVISOR_block();
+ }
+ }
+}
+
+// Some bio structures for dumping core
+#define DUMP_BIO_NO 16 // 16 * 4KB = 64KB dump block
+static struct bio xb_dump_bp[DUMP_BIO_NO];
+
+// Kernel dump function for a paravirtualized disk device
+static int
+xb_dump(void *arg, void *virtual, vm_offset_t physical, off_t offset,
+ size_t length)
+{
+ int sbp;
+ int mbp;
+ size_t chunk;
+ struct disk *dp = arg;
+ struct xb_softc *sc = (struct xb_softc *) dp->d_drv1;
+ int rc = 0;
+
+ xb_quiesce(sc->xb_info); // All quiet on the western front.
+ if (length > 0) {
+ // If this lock is held, then this module is failing, and a successful
+ // kernel dump is highly unlikely anyway.
+ mtx_lock(&blkif_io_lock);
+ // Split the 64KB block into 16 4KB blocks
+ for (sbp=0; length>0 && sbp<DUMP_BIO_NO; sbp++) {
+ chunk = length > PAGE_SIZE ? PAGE_SIZE : length;
+ xb_dump_bp[sbp].bio_disk = dp;
+ xb_dump_bp[sbp].bio_pblkno = offset / dp->d_sectorsize;
+ xb_dump_bp[sbp].bio_bcount = chunk;
+ xb_dump_bp[sbp].bio_resid = chunk;
+ xb_dump_bp[sbp].bio_data = virtual;
+ xb_dump_bp[sbp].bio_cmd = BIO_WRITE;
+ xb_dump_bp[sbp].bio_done = NULL;
+
+ bioq_disksort(&sc->xb_bioq, &xb_dump_bp[sbp]);
+
+ length -= chunk;
+ offset += chunk;
+ virtual = (char *) virtual + chunk;
+ }
+ // Tell DOM0 to do the I/O
+ xb_startio(sc);
+ mtx_unlock(&blkif_io_lock);
+
+ // Must wait for the completion: the dump routine reuses the same
+ // 16 x 4KB buffer space.
+ xb_quiesce(sc->xb_info); // All quite on the eastern front
+ // If there were any errors, bail out...
+ for (mbp=0; mbp<sbp; mbp++) {
+ if ((rc = xb_dump_bp[mbp].bio_error)) break;
+ }
+ }
+ return (rc);
+}
+
+
static int
blkfront_probe(device_t dev)
{
@@ -646,6 +729,7 @@ GET_ID_FROM_FREELIST(struct blkfront_info *info)
KASSERT(nfree <= BLK_RING_SIZE, ("free %lu > RING_SIZE", nfree));
info->shadow_free = info->shadow[nfree].req.id;
info->shadow[nfree].req.id = 0x0fffffee; /* debug */
+ atomic_add_int(&blkif_queued_requests, 1);
return nfree;
}
@@ -655,6 +739,7 @@ ADD_ID_TO_FREELIST(struct blkfront_info *info, unsigned long id)
info->shadow[id].req.id = info->shadow_free;
info->shadow[id].request = 0;
info->shadow_free = id;
+ atomic_subtract_int(&blkif_queued_requests, 1);
}
static inline void
diff --git a/sys/dev/xen/console/console.c b/sys/dev/xen/console/console.c
index 68bb0ae..df5c3ee 100644
--- a/sys/dev/xen/console/console.c
+++ b/sys/dev/xen/console/console.c
@@ -45,17 +45,15 @@ static int xc_mute;
static void xcons_force_flush(void);
static void xencons_priv_interrupt(void *);
-static cn_probe_t xccnprobe;
-static cn_init_t xccninit;
-static cn_getc_t xccngetc;
-static cn_putc_t xccnputc;
-static cn_putc_t xccnputc_dom0;
-static cn_checkc_t xccncheckc;
+static cn_probe_t xc_cnprobe;
+static cn_init_t xc_cninit;
+static cn_term_t xc_cnterm;
+static cn_getc_t xc_cngetc;
+static cn_putc_t xc_cnputc;
#define XC_POLLTIME (hz/10)
-CONS_DRIVER(xc, xccnprobe, xccninit, NULL, xccngetc,
- xccncheckc, xccnputc, NULL);
+CONSOLE_DRIVER(xc);
static int xen_console_up;
static boolean_t xc_start_needed;
@@ -105,7 +103,7 @@ static struct ttydevsw xc_ttydevsw = {
};
static void
-xccnprobe(struct consdev *cp)
+xc_cnprobe(struct consdev *cp)
{
cp->cn_pri = CN_REMOTE;
sprintf(cp->cn_name, "%s0", driver_name);
@@ -113,37 +111,19 @@ xccnprobe(struct consdev *cp)
static void
-xccninit(struct consdev *cp)
+xc_cninit(struct consdev *cp)
{
CN_LOCK_INIT(cn_mtx,"XCONS LOCK");
}
-int
-xccngetc(struct consdev *dev)
-{
- int c;
- if (xc_mute)
- return 0;
- do {
- if ((c = xccncheckc(dev)) == -1) {
-#ifdef KDB
- if (!kdb_active)
-#endif
- /*
- * Polling without sleeping in Xen
- * doesn't work well. Sleeping gives
- * other things like clock a chance to
- * run
- */
- tsleep(&cn_mtx, PWAIT | PCATCH,
- "console sleep", XC_POLLTIME);
- }
- } while(c == -1);
- return c;
+
+static void
+xc_cnterm(struct consdev *cp)
+{
}
-int
-xccncheckc(struct consdev *dev)
+static int
+xc_cngetc(struct consdev *dev)
{
int ret = (xc_mute ? 0 : -1);
@@ -162,17 +142,27 @@ xccncheckc(struct consdev *dev)
}
static void
-xccnputc(struct consdev *dev, int c)
+xc_cnputc_domu(struct consdev *dev, int c)
{
xcons_putc(c);
}
static void
-xccnputc_dom0(struct consdev *dev, int c)
+xc_cnputc_dom0(struct consdev *dev, int c)
{
HYPERVISOR_console_io(CONSOLEIO_write, 1, (char *)&c);
}
+static void
+xc_cnputc(struct consdev *dev, int c)
+{
+
+ if (xen_start_info->flags & SIF_INITDOMAIN)
+ xc_cnputc_dom0(dev, c);
+ else
+ xc_cnputc_domu(dev, c);
+}
+
extern int db_active;
static boolean_t
xcons_putc(int c)
@@ -226,10 +216,6 @@ xc_attach(device_t dev)
{
int error;
- if (xen_start_info->flags & SIF_INITDOMAIN) {
- xc_consdev.cn_putc = xccnputc_dom0;
- }
-
xccons = tty_alloc(&xc_ttydevsw, NULL);
tty_makedev(xccons, NULL, "xc%r", 0);
@@ -388,7 +374,7 @@ xc_timeout(void *v)
tp = (struct tty *)v;
tty_lock(tp);
- while ((c = xccncheckc(NULL)) != -1)
+ while ((c = xc_cngetc(NULL)) != -1)
ttydisc_rint(tp, c, 0);
if (xc_start_needed) {
diff --git a/sys/dev/xen/netback/netback.c b/sys/dev/xen/netback/netback.c
index cabc4ab..a6111e2 100644
--- a/sys/dev/xen/netback/netback.c
+++ b/sys/dev/xen/netback/netback.c
@@ -1388,7 +1388,7 @@ vif_add_dev(struct xenbus_device *xdev)
devclass_t dc;
int err = 0;
- newbus_xlock();
+ mtx_lock(&Giant);
/* We will add a vif device as a child of nexus0 (for now) */
if (!(dc = devclass_find("nexus")) ||
@@ -1415,7 +1415,7 @@ vif_add_dev(struct xenbus_device *xdev)
done:
- newbus_xunlock();
+ mtx_unlock(&Giant);
return err;
}
OpenPOWER on IntegriCloud