aboutsummaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/acpica/acpi_spmc.c34
-rw-r--r--sys/dev/amdsmu/amdsmu.c34
-rw-r--r--sys/dev/amdsmu/amdsmu.h19
-rw-r--r--sys/dev/amdsmu/amdsmu_reg.h5
-rw-r--r--sys/dev/asmc/asmc.c67
-rw-r--r--sys/dev/asmc/asmcvar.h2
-rw-r--r--sys/dev/bce/if_bce.c2
-rw-r--r--sys/dev/dpaa2/dpaa2_ni.c6
-rw-r--r--sys/dev/evdev/evdev_utils.c11
-rw-r--r--sys/dev/hid/hid.h2
-rw-r--r--sys/dev/hid/hkbd.c133
-rw-r--r--sys/dev/nvme/nvme_sim.c2
-rw-r--r--sys/dev/sound/usb/uaudio.c5
-rw-r--r--sys/dev/sound/usb/uaudio_pcm.c13
-rw-r--r--sys/dev/usb/input/ukbd.c136
-rw-r--r--sys/dev/usb/usbdevs7
-rw-r--r--sys/dev/vmm/vmm_dev.c16
17 files changed, 372 insertions, 122 deletions
diff --git a/sys/dev/acpica/acpi_spmc.c b/sys/dev/acpica/acpi_spmc.c
index d6d4f2d34f2f..ca7b3bd95ead 100644
--- a/sys/dev/acpica/acpi_spmc.c
+++ b/sys/dev/acpica/acpi_spmc.c
@@ -45,6 +45,7 @@ enum intel_dsm_index {
/* Only for Microsoft DSM set. */
DSM_MODERN_ENTRY_NOTIF = 7,
DSM_MODERN_EXIT_NOTIF = 8,
+ DSM_MODERN_TURN_ON_DISPLAY = 9,
};
enum amd_dsm_index {
@@ -67,7 +68,9 @@ struct dsm_set {
const char *name;
int revision;
struct uuid uuid;
+ uint64_t dsms_supported;
uint64_t dsms_expected;
+ uint64_t extra_dsms;
};
static struct dsm_set intel_dsm_set = {
@@ -107,6 +110,7 @@ static struct dsm_set ms_dsm_set = {
(1 << DSM_DISPLAY_ON_NOTIF) | (1 << DSM_ENTRY_NOTIF) |
(1 << DSM_EXIT_NOTIF) | (1 << DSM_MODERN_ENTRY_NOTIF) |
(1 << DSM_MODERN_EXIT_NOTIF),
+ .extra_dsms = (1 << DSM_MODERN_TURN_ON_DISPLAY),
};
static struct dsm_set amd_dsm_set = {
@@ -190,6 +194,11 @@ acpi_spmc_probe(device_t dev)
if (ACPI_ID_PROBE(device_get_parent(dev), dev, spmc_ids, &name) > 0)
return (ENXIO);
+ if (device_get_unit(dev) > 0) {
+ device_printf(dev, "shouldn't have more than one SPMC");
+ return (ENXIO);
+ }
+
handle = acpi_get_handle(dev);
if (handle == NULL)
return (ENXIO);
@@ -206,8 +215,8 @@ acpi_spmc_probe(device_t dev)
if (sc->dsm_sets == 0)
return (ENXIO);
- device_set_descf(dev, "Low Power S0 Idle (DSM sets 0x%x)",
- sc->dsm_sets);
+ device_set_descf(dev, "System Power Management Controller "
+ "(DSM sets 0x%x)", sc->dsm_sets);
return (0);
}
@@ -256,6 +265,8 @@ acpi_spmc_check_dsm_set(struct acpi_spmc_softc *sc, ACPI_HANDLE handle,
{
uint64_t dsms_supported = acpi_DSMQuery(handle,
(uint8_t *)&dsm_set->uuid, dsm_set->revision);
+ const uint64_t min_dsms = dsm_set->dsms_expected;
+ const uint64_t max_dsms = min_dsms | dsm_set->extra_dsms;
/*
* Check if DSM set supported at all. We do this by checking the
@@ -264,14 +275,19 @@ acpi_spmc_check_dsm_set(struct acpi_spmc_softc *sc, ACPI_HANDLE handle,
if ((dsms_supported & 1) == 0)
return;
dsms_supported &= ~1;
- if ((dsms_supported & dsm_set->dsms_expected)
- != dsm_set->dsms_expected) {
+ dsm_set->dsms_supported = dsms_supported;
+ sc->dsm_sets |= dsm_set->flag;
+
+ if ((dsms_supported & min_dsms) != min_dsms)
device_printf(sc->dev, "DSM set %s does not support expected "
"DSMs (%#" PRIx64 " vs %#" PRIx64 "). "
"Some methods may fail.\n",
- dsm_set->name, dsms_supported, dsm_set->dsms_expected);
- }
- sc->dsm_sets |= dsm_set->flag;
+ dsm_set->name, dsms_supported, min_dsms);
+
+ if ((dsms_supported & ~max_dsms) != 0)
+ device_printf(sc->dev, "DSM set %s supports more DSMs than "
+ "expected (%#" PRIx64 " vs %#" PRIx64 ").", dsm_set->name,
+ dsms_supported, max_dsms);
}
static void
@@ -596,6 +612,10 @@ acpi_spmc_exit_notif(device_t dev)
acpi_spmc_run_dsm(dev, &amd_dsm_set, AMD_DSM_EXIT_NOTIF);
if ((sc->dsm_sets & DSM_SET_MS) != 0) {
acpi_spmc_run_dsm(dev, &ms_dsm_set, DSM_EXIT_NOTIF);
+ if (ms_dsm_set.dsms_supported &
+ (1 << DSM_MODERN_TURN_ON_DISPLAY))
+ acpi_spmc_run_dsm(dev, &ms_dsm_set,
+ DSM_MODERN_TURN_ON_DISPLAY);
acpi_spmc_run_dsm(dev, &ms_dsm_set, DSM_MODERN_EXIT_NOTIF);
}
}
diff --git a/sys/dev/amdsmu/amdsmu.c b/sys/dev/amdsmu/amdsmu.c
index 9a6873b43517..7b97888887c5 100644
--- a/sys/dev/amdsmu/amdsmu.c
+++ b/sys/dev/amdsmu/amdsmu.c
@@ -58,9 +58,12 @@ amdsmu_identify(driver_t *driver, device_t parent)
static int
amdsmu_probe(device_t dev)
{
+ struct amdsmu_softc *sc;
+
if (resource_disabled("amdsmu", 0))
return (ENXIO);
- if (!amdsmu_match(device_get_parent(dev), NULL))
+ sc = device_get_softc(dev);
+ if (!amdsmu_match(device_get_parent(dev), &sc->product))
return (ENXIO);
device_set_descf(dev, "AMD System Management Unit");
@@ -154,28 +157,11 @@ static int
amdsmu_get_ip_blocks(device_t dev)
{
struct amdsmu_softc *sc = device_get_softc(dev);
- const uint16_t deviceid = pci_get_device(dev);
int err;
struct amdsmu_metrics *m = &sc->metrics;
bool active;
char sysctl_descr[32];
- /* Get IP block count. */
- switch (deviceid) {
- case PCI_DEVICEID_AMD_REMBRANDT_ROOT:
- sc->ip_block_count = 12;
- break;
- case PCI_DEVICEID_AMD_PHOENIX_ROOT:
- sc->ip_block_count = 21;
- break;
- /* TODO How many IP blocks does Strix Point (and the others) have? */
- case PCI_DEVICEID_AMD_STRIX_POINT_ROOT:
- default:
- sc->ip_block_count = nitems(amdsmu_ip_blocks_names);
- }
- KASSERT(sc->ip_block_count <= nitems(amdsmu_ip_blocks_names),
- ("too many IP blocks for array"));
-
/* Get and print out IP blocks. */
err = amdsmu_cmd(dev, SMU_MSG_GET_SUP_CONSTRAINTS, 0,
&sc->active_ip_blocks);
@@ -184,13 +170,13 @@ amdsmu_get_ip_blocks(device_t dev)
return (err);
}
device_printf(dev, "Active IP blocks: ");
- for (size_t i = 0; i < sc->ip_block_count; i++) {
+ for (size_t i = 0; i < sc->product->ip_block_count; i++) {
active = (sc->active_ip_blocks & (1 << i)) != 0;
sc->ip_blocks_active[i] = active;
if (!active)
continue;
printf("%s%s", amdsmu_ip_blocks_names[i],
- i + 1 < sc->ip_block_count ? " " : "\n");
+ i + 1 < sc->product->ip_block_count ? " " : "\n");
}
/* Create a sysctl node for IP blocks. */
@@ -203,7 +189,7 @@ amdsmu_get_ip_blocks(device_t dev)
}
/* Create a sysctl node for each IP block. */
- for (size_t i = 0; i < sc->ip_block_count; i++) {
+ for (size_t i = 0; i < sc->product->ip_block_count; i++) {
/* Create the sysctl node itself for the IP block. */
snprintf(sysctl_descr, sizeof sysctl_descr,
"Metrics about the %s AMD IP block",
@@ -293,7 +279,7 @@ amdsmu_fetch_idlemask(device_t dev)
{
struct amdsmu_softc *sc = device_get_softc(dev);
- sc->idlemask = amdsmu_read4(sc, SMU_REG_IDLEMASK);
+ sc->idlemask = amdsmu_read4(sc, sc->product->idlemask_reg);
}
static void
@@ -301,6 +287,10 @@ amdsmu_suspend(device_t dev, enum power_stype stype)
{
if (stype != POWER_STYPE_SUSPEND_TO_IDLE)
return;
+ /*
+ * XXX It seems that Cezanne needs a special workaround here for
+ * firmware versions < 64.53. See amd_pmc_verify_czn_rtc() in Linux.
+ */
if (amdsmu_cmd(dev, SMU_MSG_SLEEP_HINT, true, NULL) != 0)
device_printf(dev, "failed to hint to SMU to enter sleep");
}
diff --git a/sys/dev/amdsmu/amdsmu.h b/sys/dev/amdsmu/amdsmu.h
index 857fa21cba4e..4286d515ae77 100644
--- a/sys/dev/amdsmu/amdsmu.h
+++ b/sys/dev/amdsmu/amdsmu.h
@@ -25,10 +25,20 @@
static const struct amdsmu_product {
uint16_t amdsmu_vendorid;
uint16_t amdsmu_deviceid;
+ int16_t idlemask_reg;
+ size_t ip_block_count;
} amdsmu_products[] = {
- { CPU_VENDOR_AMD, PCI_DEVICEID_AMD_REMBRANDT_ROOT },
- { CPU_VENDOR_AMD, PCI_DEVICEID_AMD_PHOENIX_ROOT },
- { CPU_VENDOR_AMD, PCI_DEVICEID_AMD_STRIX_POINT_ROOT },
+ { CPU_VENDOR_AMD, PCI_DEVICEID_AMD_CEZANNE_ROOT,
+ SMU_REG_IDLEMASK_CEZANNE, 12 },
+ { CPU_VENDOR_AMD, PCI_DEVICEID_AMD_REMBRANDT_ROOT,
+ SMU_REG_IDLEMASK_PHOENIX, 12 },
+ { CPU_VENDOR_AMD, PCI_DEVICEID_AMD_PHOENIX_ROOT,
+ SMU_REG_IDLEMASK_PHOENIX, 21 },
+ /*
+ * XXX Strix Point (PCI_DEVICEID_AMD_STRIX_POINT_ROOT) doesn't support
+ * S0i3 and thus doesn't have an idlemask. Since our driver doesn't
+ * yet understand this, don't attach to Strix Point for the time being.
+ */
};
static const char *const amdsmu_ip_blocks_names[] = {
@@ -59,6 +69,8 @@ static const char *const amdsmu_ip_blocks_names[] = {
CTASSERT(nitems(amdsmu_ip_blocks_names) <= 32);
struct amdsmu_softc {
+ const struct amdsmu_product *product;
+
struct sysctl_ctx_list *sysctlctx;
struct sysctl_oid *sysctlnode;
@@ -76,7 +88,6 @@ struct amdsmu_softc {
uint32_t active_ip_blocks;
struct sysctl_oid *ip_blocks_sysctlnode;
- size_t ip_block_count;
struct sysctl_oid *ip_block_sysctlnodes[
nitems(amdsmu_ip_blocks_names)];
bool ip_blocks_active[
diff --git a/sys/dev/amdsmu/amdsmu_reg.h b/sys/dev/amdsmu/amdsmu_reg.h
index d45fa60941d5..6afbcf006535 100644
--- a/sys/dev/amdsmu/amdsmu_reg.h
+++ b/sys/dev/amdsmu/amdsmu_reg.h
@@ -16,6 +16,7 @@
* out? Also, there are way more of these. I couldn't find a centralized place
* which lists them though.
*/
+#define PCI_DEVICEID_AMD_CEZANNE_ROOT 0x1630
#define PCI_DEVICEID_AMD_REMBRANDT_ROOT 0x14B5
#define PCI_DEVICEID_AMD_PHOENIX_ROOT 0x14E8
#define PCI_DEVICEID_AMD_STRIX_POINT_ROOT 0x14A4
@@ -32,7 +33,9 @@
#define SMU_REG_MESSAGE 0x538
#define SMU_REG_RESPONSE 0x980
#define SMU_REG_ARGUMENT 0x9BC
-#define SMU_REG_IDLEMASK 0xD14
+
+#define SMU_REG_IDLEMASK_CEZANNE 0x94
+#define SMU_REG_IDLEMASK_PHOENIX 0xD14
enum amdsmu_res {
SMU_RES_WAIT = 0x00,
diff --git a/sys/dev/asmc/asmc.c b/sys/dev/asmc/asmc.c
index 17a282ce0b97..4a6734e22786 100644
--- a/sys/dev/asmc/asmc.c
+++ b/sys/dev/asmc/asmc.c
@@ -58,6 +58,9 @@
#include <dev/acpica/acpivar.h>
#include <dev/asmc/asmcvar.h>
+#include <dev/backlight/backlight.h>
+#include "backlight_if.h"
+
/*
* Device interface.
*/
@@ -67,6 +70,15 @@ static int asmc_detach(device_t dev);
static int asmc_resume(device_t dev);
/*
+ * Backlight interface.
+ */
+static int asmc_backlight_update_status(device_t dev,
+ struct backlight_props *props);
+static int asmc_backlight_get_status(device_t dev,
+ struct backlight_props *props);
+static int asmc_backlight_get_info(device_t dev, struct backlight_info *info);
+
+/*
* SMC functions.
*/
static int asmc_init(device_t dev);
@@ -581,6 +593,12 @@ static device_method_t asmc_methods[] = {
DEVMETHOD(device_attach, asmc_attach),
DEVMETHOD(device_detach, asmc_detach),
DEVMETHOD(device_resume, asmc_resume),
+
+ /* Backlight interface */
+ DEVMETHOD(backlight_update_status, asmc_backlight_update_status),
+ DEVMETHOD(backlight_get_status, asmc_backlight_get_status),
+ DEVMETHOD(backlight_get_info, asmc_backlight_get_info),
+
DEVMETHOD_END
};
@@ -606,8 +624,10 @@ static char *asmc_ids[] = { "APP0001", NULL };
static unsigned int light_control = 0;
+ACPI_PNP_INFO(asmc_ids);
DRIVER_MODULE(asmc, acpi, asmc_driver, NULL, NULL);
MODULE_DEPEND(asmc, acpi, 1, 1, 1);
+MODULE_DEPEND(asmc, backlight, 1, 1, 1);
static const struct asmc_model *
asmc_match(device_t dev)
@@ -799,6 +819,13 @@ asmc_attach(device_t dev)
CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_ANYBODY | CTLFLAG_MPSAFE,
dev, 0, model->smc_light_control, "I",
"Keyboard backlight brightness control");
+
+ sc->sc_kbd_bkl = backlight_register("asmc", dev);
+ if (sc->sc_kbd_bkl == NULL) {
+ device_printf(dev, "Can not register backlight\n");
+ ret = ENXIO;
+ goto err;
+ }
}
if (model->smc_sms_x == NULL)
@@ -881,6 +908,9 @@ asmc_detach(device_t dev)
{
struct asmc_softc *sc = device_get_softc(dev);
+ if (sc->sc_kbd_bkl != NULL)
+ backlight_destroy(sc->sc_kbd_bkl);
+
if (sc->sc_sms_tq) {
taskqueue_drain(sc->sc_sms_tq, &sc->sc_sms_task);
taskqueue_free(sc->sc_sms_tq);
@@ -1738,6 +1768,7 @@ static int
asmc_mbp_sysctl_light_control(SYSCTL_HANDLER_ARGS)
{
device_t dev = (device_t)arg1;
+ struct asmc_softc *sc = device_get_softc(dev);
uint8_t buf[2];
int error;
int v;
@@ -1749,6 +1780,7 @@ asmc_mbp_sysctl_light_control(SYSCTL_HANDLER_ARGS)
if (v < 0 || v > 255)
return (EINVAL);
light_control = v;
+ sc->sc_kbd_bkl_level = v * 100 / 255;
buf[0] = light_control;
buf[1] = 0x00;
asmc_key_write(dev, ASMC_KEY_LIGHTVALUE, buf, sizeof(buf));
@@ -1816,3 +1848,38 @@ asmc_wol_sysctl(SYSCTL_HANDLER_ARGS)
return (0);
}
+
+static int
+asmc_backlight_update_status(device_t dev, struct backlight_props *props)
+{
+ struct asmc_softc *sc = device_get_softc(dev);
+ uint8_t buf[2];
+
+ sc->sc_kbd_bkl_level = props->brightness;
+ light_control = props->brightness * 255 / 100;
+ buf[0] = light_control;
+ buf[1] = 0x00;
+ asmc_key_write(dev, ASMC_KEY_LIGHTVALUE, buf, sizeof(buf));
+
+ return (0);
+}
+
+static int
+asmc_backlight_get_status(device_t dev, struct backlight_props *props)
+{
+ struct asmc_softc *sc = device_get_softc(dev);
+
+ props->brightness = sc->sc_kbd_bkl_level;
+ props->nlevels = 0;
+
+ return (0);
+}
+
+static int
+asmc_backlight_get_info(device_t dev, struct backlight_info *info)
+{
+ info->type = BACKLIGHT_TYPE_KEYBOARD;
+ strlcpy(info->name, "Apple MacBook Keyboard", BACKLIGHTMAXNAMELENGTH);
+
+ return (0);
+}
diff --git a/sys/dev/asmc/asmcvar.h b/sys/dev/asmc/asmcvar.h
index 95a117f59533..cfc176559ed9 100644
--- a/sys/dev/asmc/asmcvar.h
+++ b/sys/dev/asmc/asmcvar.h
@@ -51,6 +51,8 @@ struct asmc_softc {
struct taskqueue *sc_sms_tq;
struct task sc_sms_task;
uint8_t sc_sms_intr_works;
+ struct cdev *sc_kbd_bkl;
+ uint32_t sc_kbd_bkl_level;
};
/*
diff --git a/sys/dev/bce/if_bce.c b/sys/dev/bce/if_bce.c
index 6cf39e035ea6..84992af0c6b8 100644
--- a/sys/dev/bce/if_bce.c
+++ b/sys/dev/bce/if_bce.c
@@ -8861,7 +8861,7 @@ bce_sysctl_nvram_write(SYSCTL_HANDLER_ARGS)
bzero(sc->nvram_buf, sc->bce_flash_size);
error = SYSCTL_IN(req, sc->nvram_buf, sc->bce_flash_size);
- if (error == 0)
+ if (error != 0)
return (error);
if (req->newlen == sc->bce_flash_size)
diff --git a/sys/dev/dpaa2/dpaa2_ni.c b/sys/dev/dpaa2/dpaa2_ni.c
index c72e68b8a62f..49e72c8ee14f 100644
--- a/sys/dev/dpaa2/dpaa2_ni.c
+++ b/sys/dev/dpaa2/dpaa2_ni.c
@@ -3004,6 +3004,9 @@ dpaa2_ni_tx(struct dpaa2_ni_softc *sc, struct dpaa2_channel *ch,
goto err_unload;
}
+ bus_dmamap_sync(buf->dmat, buf->dmap, BUS_DMASYNC_PREWRITE);
+ bus_dmamap_sync(sgt->dmat, sgt->dmap, BUS_DMASYNC_PREWRITE);
+
/* TODO: Enqueue several frames in a single command */
for (int i = 0; i < DPAA2_NI_ENQUEUE_RETRIES; i++) {
/* TODO: Return error codes instead of # of frames */
@@ -3013,9 +3016,6 @@ dpaa2_ni_tx(struct dpaa2_ni_softc *sc, struct dpaa2_channel *ch,
}
}
- bus_dmamap_sync(buf->dmat, buf->dmap, BUS_DMASYNC_PREWRITE);
- bus_dmamap_sync(sgt->dmat, sgt->dmap, BUS_DMASYNC_PREWRITE);
-
if (rc != 1) {
fq->chan->tx_dropped++;
if_inc_counter(sc->ifp, IFCOUNTER_OERRORS, 1);
diff --git a/sys/dev/evdev/evdev_utils.c b/sys/dev/evdev/evdev_utils.c
index a075a9be9bb7..d7b7b790dc2c 100644
--- a/sys/dev/evdev/evdev_utils.c
+++ b/sys/dev/evdev/evdev_utils.c
@@ -92,8 +92,8 @@ static uint16_t evdev_usb_scancodes[256] = {
NONE, NONE, NONE, NONE,
NONE, NONE, NONE, NONE,
/* 0xc0 - 0xdf */
- NONE, NONE, NONE, NONE,
- NONE, NONE, NONE, NONE,
+ KEY_BRIGHTNESSDOWN, KEY_BRIGHTNESSUP, KEY_SCALE, KEY_DASHBOARD,
+ KEY_KBDILLUMDOWN, KEY_KBDILLUMUP, NONE, NONE,
NONE, NONE, NONE, NONE,
NONE, NONE, NONE, NONE,
NONE, NONE, NONE, NONE,
@@ -108,7 +108,12 @@ static uint16_t evdev_usb_scancodes[256] = {
KEY_WWW, KEY_BACK, KEY_FORWARD, KEY_STOP,
KEY_FIND, KEY_SCROLLUP, KEY_SCROLLDOWN, KEY_EDIT,
KEY_SLEEP, KEY_COFFEE, KEY_REFRESH, KEY_CALC,
- NONE, NONE, NONE, NONE,
+ /*
+ * last item maps to APPLE_FN_KEY in hkbd.c. using KEY_WAKEUP instead
+ * of KEY_FN as evdev translates the latter to too high of a code for
+ * xkb to parse.
+ */
+ NONE, NONE, NONE, KEY_WAKEUP,
};
diff --git a/sys/dev/hid/hid.h b/sys/dev/hid/hid.h
index e56f8ffe772b..02709d549a56 100644
--- a/sys/dev/hid/hid.h
+++ b/sys/dev/hid/hid.h
@@ -57,8 +57,10 @@
#define HUP_SCALE 0x008c
#define HUP_CAMERA_CONTROL 0x0090
#define HUP_ARCADE 0x0091
+#define HUP_APPLE 0x00ff
#define HUP_FIDO 0xf1d0
#define HUP_MICROSOFT 0xff00
+#define HUP_HP 0xff01
/* Usages, generic desktop */
#define HUG_POINTER 0x0001
diff --git a/sys/dev/hid/hkbd.c b/sys/dev/hid/hkbd.c
index 6255c42d3b62..c98f4be69169 100644
--- a/sys/dev/hid/hkbd.c
+++ b/sys/dev/hid/hkbd.c
@@ -73,6 +73,8 @@
#include <dev/hid/hidquirk.h>
#include <dev/hid/hidrdesc.h>
+#include "usbdevs.h"
+
#ifdef EVDEV_SUPPORT
#include <dev/evdev/input.h>
#include <dev/evdev/evdev.h>
@@ -97,6 +99,7 @@
static int hkbd_debug = 0;
#endif
static int hkbd_no_leds = 0;
+static int hkbd_apple_fn_mode = 0;
static SYSCTL_NODE(_hw_hid, OID_AUTO, hkbd, CTLFLAG_RW, 0, "USB keyboard");
#ifdef HID_DEBUG
@@ -105,6 +108,8 @@ SYSCTL_INT(_hw_hid_hkbd, OID_AUTO, debug, CTLFLAG_RWTUN,
#endif
SYSCTL_INT(_hw_hid_hkbd, OID_AUTO, no_leds, CTLFLAG_RWTUN,
&hkbd_no_leds, 0, "Disables setting of keyboard leds");
+SYSCTL_INT(_hw_hid_hkbd, OID_AUTO, apple_fn_mode, CTLFLAG_RWTUN,
+ &hkbd_apple_fn_mode, 0, "0 = Fn + F1..12 -> media, 1 = F1..F12 -> media");
#define INPUT_EPOCH global_epoch_preempt
@@ -126,6 +131,10 @@ SYSCTL_INT(_hw_hid_hkbd, OID_AUTO, no_leds, CTLFLAG_RWTUN,
#define MOD_MIN 0xe0
#define MOD_MAX 0xe7
+/* check evdev_usb_scancodes[] for names */
+#define APPLE_FN_KEY 0xff
+#define APPLE_EJECT_KEY 0xec
+
struct hkbd_softc {
device_t sc_dev;
@@ -289,9 +298,9 @@ static const uint8_t hkbd_trtab[256] = {
NN, NN, NN, NN, NN, NN, NN, NN, /* D0 - D7 */
NN, NN, NN, NN, NN, NN, NN, NN, /* D8 - DF */
29, 42, 56, 105, 90, 54, 93, 106, /* E0 - E7 */
- NN, NN, NN, NN, NN, NN, NN, NN, /* E8 - EF */
+ NN, NN, NN, NN, 254, NN, NN, NN, /* E8 - EF */
NN, NN, NN, NN, NN, NN, NN, NN, /* F0 - F7 */
- NN, NN, NN, NN, NN, NN, NN, NN, /* F8 - FF */
+ NN, NN, NN, NN, NN, NN, NN, 255, /* F8 - FF */
};
static const uint8_t hkbd_boot_desc[] = { HID_KBD_BOOTPROTO_DESCR() };
@@ -516,13 +525,14 @@ hkbd_interrupt(struct hkbd_softc *sc)
continue;
hkbd_put_key(sc, key | KEY_PRESS);
- sc->sc_co_basetime = sbinuptime();
- sc->sc_delay = sc->sc_kbd.kb_delay1;
- hkbd_start_timer(sc);
-
- /* set repeat time for last key */
- sc->sc_repeat_time = now + sc->sc_kbd.kb_delay1;
- sc->sc_repeat_key = key;
+ if (key != APPLE_FN_KEY) {
+ sc->sc_co_basetime = sbinuptime();
+ sc->sc_delay = sc->sc_kbd.kb_delay1;
+ hkbd_start_timer(sc);
+ /* set repeat time for last key */
+ sc->sc_repeat_time = now + sc->sc_kbd.kb_delay1;
+ sc->sc_repeat_key = key;
+ }
}
/* synchronize old data with new data */
@@ -613,6 +623,16 @@ static uint32_t
hkbd_apple_fn(uint32_t keycode)
{
switch (keycode) {
+ case 0x0b: return 0x50; /* H -> LEFT ARROW */
+ case 0x0d: return 0x51; /* J -> DOWN ARROW */
+ case 0x0e: return 0x52; /* K -> UP ARROW */
+ case 0x0f: return 0x4f; /* L -> RIGHT ARROW */
+ case 0x36: return 0x4a; /* COMMA -> HOME */
+ case 0x37: return 0x4d; /* DOT -> END */
+ case 0x18: return 0x4b; /* U -> PGUP */
+ case 0x07: return 0x4e; /* D -> PGDN */
+ case 0x16: return 0x47; /* S -> SCROLLLOCK */
+ case 0x13: return 0x46; /* P -> SYSRQ/PRTSC */
case 0x28: return 0x49; /* RETURN -> INSERT */
case 0x2a: return 0x4c; /* BACKSPACE -> DEL */
case 0x50: return 0x4a; /* LEFT ARROW -> HOME */
@@ -623,6 +643,27 @@ hkbd_apple_fn(uint32_t keycode)
}
}
+/* separate so the sysctl doesn't butcher non-fn keys */
+static uint32_t
+hkbd_apple_fn_media(uint32_t keycode)
+{
+ switch (keycode) {
+ case 0x3a: return 0xc0; /* F1 -> BRIGHTNESS DOWN */
+ case 0x3b: return 0xc1; /* F2 -> BRIGHTNESS UP */
+ case 0x3c: return 0xc2; /* F3 -> SCALE (MISSION CTRL)*/
+ case 0x3d: return 0xc3; /* F4 -> DASHBOARD (LAUNCHPAD) */
+ case 0x3e: return 0xc4; /* F5 -> KBD BACKLIGHT DOWN */
+ case 0x3f: return 0xc5; /* F6 -> KBD BACKLIGHT UP */
+ case 0x40: return 0xea; /* F7 -> MEDIA PREV */
+ case 0x41: return 0xe8; /* F8 -> PLAY/PAUSE */
+ case 0x42: return 0xeb; /* F9 -> MEDIA NEXT */
+ case 0x43: return 0xef; /* F10 -> MUTE */
+ case 0x44: return 0xee; /* F11 -> VOLUME DOWN */
+ case 0x45: return 0xed; /* F12 -> VOLUME UP */
+ default: return keycode;
+ }
+}
+
static uint32_t
hkbd_apple_swap(uint32_t keycode)
{
@@ -675,18 +716,30 @@ hkbd_intr_callback(void *context, void *data, hid_size_t len)
/* clear modifiers */
modifiers = 0;
- /* scan through HID data */
+ /* scan through HID data and expose magic apple keys */
if ((sc->sc_flags & HKBD_FLAG_APPLE_EJECT) &&
(id == sc->sc_id_apple_eject)) {
- if (hid_get_data(buf, len, &sc->sc_loc_apple_eject))
+ if (hid_get_data(buf, len, &sc->sc_loc_apple_eject)) {
+ bit_set(sc->sc_ndata, APPLE_EJECT_KEY);
modifiers |= MOD_EJECT;
+ } else {
+ bit_clear(sc->sc_ndata, APPLE_EJECT_KEY);
+ }
}
if ((sc->sc_flags & HKBD_FLAG_APPLE_FN) &&
(id == sc->sc_id_apple_fn)) {
- if (hid_get_data(buf, len, &sc->sc_loc_apple_fn))
+ if (hid_get_data(buf, len, &sc->sc_loc_apple_fn)) {
+ bit_set(sc->sc_ndata, APPLE_FN_KEY);
modifiers |= MOD_FN;
+ } else {
+ bit_clear(sc->sc_ndata, APPLE_FN_KEY);
+ }
}
+ int apply_apple_fn_media = (modifiers & MOD_FN) ? 1 : 0;
+ if (hkbd_apple_fn_mode) /* toggle from sysctl value */
+ apply_apple_fn_media = !apply_apple_fn_media;
+
bit_foreach(sc->sc_loc_key_valid, HKBD_NKEYCODE, i) {
if (id != sc->sc_id_loc_key[i]) {
continue; /* invalid HID ID */
@@ -710,6 +763,8 @@ hkbd_intr_callback(void *context, void *data, hid_size_t len)
}
if (modifiers & MOD_FN)
key = hkbd_apple_fn(key);
+ if (apply_apple_fn_media)
+ key = hkbd_apple_fn_media(key);
if (sc->sc_flags & HKBD_FLAG_APPLE_SWAP)
key = hkbd_apple_swap(key);
if (key == KEY_NONE || key >= HKBD_NKEYCODE)
@@ -723,6 +778,8 @@ hkbd_intr_callback(void *context, void *data, hid_size_t len)
if (modifiers & MOD_FN)
key = hkbd_apple_fn(key);
+ if (apply_apple_fn_media)
+ key = hkbd_apple_fn_media(key);
if (sc->sc_flags & HKBD_FLAG_APPLE_SWAP)
key = hkbd_apple_swap(key);
if (key == KEY_NONE || key == KEY_ERROR || key >= HKBD_NKEYCODE)
@@ -783,25 +840,43 @@ hkbd_parse_hid(struct hkbd_softc *sc, const uint8_t *ptr, uint32_t len,
sc->sc_kbd_size = hid_report_size_max(ptr, len,
hid_input, &sc->sc_kbd_id);
+ const struct hid_device_info *hw = hid_get_device_info(sc->sc_dev);
+
/* investigate if this is an Apple Keyboard */
- if (hidbus_locate(ptr, len,
- HID_USAGE2(HUP_CONSUMER, HUG_APPLE_EJECT),
- hid_input, tlc_index, 0, &sc->sc_loc_apple_eject, &flags,
- &sc->sc_id_apple_eject, NULL)) {
- if (flags & HIO_VARIABLE)
- sc->sc_flags |= HKBD_FLAG_APPLE_EJECT |
- HKBD_FLAG_APPLE_SWAP;
- DPRINTFN(1, "Found Apple eject-key\n");
- }
- if (hidbus_locate(ptr, len,
- HID_USAGE2(0xFFFF, 0x0003),
- hid_input, tlc_index, 0, &sc->sc_loc_apple_fn, &flags,
- &sc->sc_id_apple_fn, NULL)) {
- if (flags & HIO_VARIABLE)
- sc->sc_flags |= HKBD_FLAG_APPLE_FN;
- DPRINTFN(1, "Found Apple FN-key\n");
+ if (hw->idVendor == USB_VENDOR_APPLE) { /* belt & braces! */
+ if (hidbus_locate(ptr, len,
+ HID_USAGE2(HUP_CONSUMER, HUG_APPLE_EJECT),
+ hid_input, tlc_index, 0, &sc->sc_loc_apple_eject, &flags,
+ &sc->sc_id_apple_eject, NULL)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= HKBD_FLAG_APPLE_EJECT |
+ HKBD_FLAG_APPLE_SWAP;
+ DPRINTFN(1, "Found Apple eject-key\n");
+ }
+ /*
+ * check the same vendor pages that linux does to find the one
+ * apple uses for the function key.
+ */
+ static const uint16_t apple_pages[] = {
+ HUP_APPLE, /* HID_UP_CUSTOM in linux */
+ HUP_MICROSOFT, /* HID_UP_MSVENDOR in linux */
+ HUP_HP, /* HID_UP_HPVENDOR2 in linux */
+ 0xFFFF /* Original FreeBSD check (Remove?) */
+ };
+ for (int i = 0; i < (int)nitems(apple_pages); i++) {
+ if (hidbus_locate(ptr, len,
+ HID_USAGE2(apple_pages[i], 0x0003),
+ hid_input, tlc_index, 0, &sc->sc_loc_apple_fn, &flags,
+ &sc->sc_id_apple_fn, NULL)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= HKBD_FLAG_APPLE_FN;
+ DPRINTFN(1, "Found Apple FN-key on page 0x%04x\n",
+ apple_pages[i]);
+ break;
+ }
+ }
}
-
+
/* figure out event buffer */
if (hidbus_locate(ptr, len,
HID_USAGE2(HUP_KEYBOARD, 0x00),
diff --git a/sys/dev/nvme/nvme_sim.c b/sys/dev/nvme/nvme_sim.c
index a4bb5df4e456..b9f09c8d1f61 100644
--- a/sys/dev/nvme/nvme_sim.c
+++ b/sys/dev/nvme/nvme_sim.c
@@ -496,4 +496,4 @@ static driver_t nvme_sim_driver = {
};
DRIVER_MODULE(nvme_sim, nvme, nvme_sim_driver, NULL, NULL);
-MODULE_VERSION(nvme_shim, 1);
+MODULE_VERSION(nvme_sim, 1);
diff --git a/sys/dev/sound/usb/uaudio.c b/sys/dev/sound/usb/uaudio.c
index dd8aa8c9fafe..65976ced8a75 100644
--- a/sys/dev/sound/usb/uaudio.c
+++ b/sys/dev/sound/usb/uaudio.c
@@ -367,7 +367,6 @@ struct uaudio_softc_child {
};
struct uaudio_softc {
- struct sndcard_func sc_sndcard_func;
struct uaudio_chan sc_rec_chan[UAUDIO_MAX_CHILD];
struct uaudio_chan sc_play_chan[UAUDIO_MAX_CHILD];
struct umidi_chan sc_midi_chan;
@@ -1112,8 +1111,6 @@ uaudio_attach(device_t dev)
/* attach the children */
- sc->sc_sndcard_func.func = SCF_PCM;
-
/*
* Only attach a PCM device if we have a playback, recording
* or mixer device present:
@@ -1130,8 +1127,6 @@ uaudio_attach(device_t dev)
DPRINTF("out of memory\n");
goto detach;
}
- device_set_ivars(sc->sc_child[i].pcm_device,
- &sc->sc_sndcard_func);
}
bus_attach_children(dev);
diff --git a/sys/dev/sound/usb/uaudio_pcm.c b/sys/dev/sound/usb/uaudio_pcm.c
index 0b3da9b20440..c24c111f983c 100644
--- a/sys/dev/sound/usb/uaudio_pcm.c
+++ b/sys/dev/sound/usb/uaudio_pcm.c
@@ -190,18 +190,7 @@ MIXER_DECLARE(ua_mixer);
static int
ua_probe(device_t dev)
{
- struct sndcard_func *func;
-
- /* the parent device has already been probed */
-
- func = device_get_ivars(dev);
-
- if ((func == NULL) ||
- (func->func != SCF_PCM)) {
- return (ENXIO);
- }
-
- return (BUS_PROBE_DEFAULT);
+ return (0);
}
static int
diff --git a/sys/dev/usb/input/ukbd.c b/sys/dev/usb/input/ukbd.c
index 57e9beac34b6..7a33a9ad2efe 100644
--- a/sys/dev/usb/input/ukbd.c
+++ b/sys/dev/usb/input/ukbd.c
@@ -95,18 +95,23 @@
#ifdef USB_DEBUG
static int ukbd_debug = 0;
+#endif
static int ukbd_no_leds = 0;
static int ukbd_pollrate = 0;
+static int ukbd_apple_fn_mode = 0;
static SYSCTL_NODE(_hw_usb, OID_AUTO, ukbd, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
"USB keyboard");
+#ifdef USB_DEBUG
SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, debug, CTLFLAG_RWTUN,
&ukbd_debug, 0, "Debug level");
+#endif
SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, no_leds, CTLFLAG_RWTUN,
&ukbd_no_leds, 0, "Disables setting of keyboard leds");
SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, pollrate, CTLFLAG_RWTUN,
&ukbd_pollrate, 0, "Force this polling rate, 1-1000Hz");
-#endif
+SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, apple_fn_mode, CTLFLAG_RWTUN,
+ &ukbd_apple_fn_mode, 0, "0 = Fn + F1..12 -> media, 1 = F1..F12 -> media");
#define UKBD_EMULATE_ATSCANCODE 1
#define UKBD_DRIVER_NAME "ukbd"
@@ -123,6 +128,10 @@ SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, pollrate, CTLFLAG_RWTUN,
#define MOD_EJECT 0x01
#define MOD_FN 0x02
+/* check evdev_usb_scancodes[] for names */
+#define APPLE_FN_KEY 0xff
+#define APPLE_EJECT_KEY 0xec
+
struct ukbd_data {
uint64_t bitmap[howmany(UKBD_NKEYCODE, 64)];
};
@@ -198,6 +207,7 @@ struct ukbd_softc {
uint16_t sc_inputs;
uint16_t sc_inputhead;
uint16_t sc_inputtail;
+ uint16_t sc_vendor_id;
uint8_t sc_leds; /* store for async led requests */
uint8_t sc_iface_index;
@@ -282,9 +292,9 @@ static const uint8_t ukbd_trtab[256] = {
NN, NN, NN, NN, NN, NN, NN, NN, /* D0 - D7 */
NN, NN, NN, NN, NN, NN, NN, NN, /* D8 - DF */
29, 42, 56, 105, 90, 54, 93, 106, /* E0 - E7 */
- NN, NN, NN, NN, NN, NN, NN, NN, /* E8 - EF */
+ NN, NN, NN, NN, 254, NN, NN, NN, /* E8 - EF */
NN, NN, NN, NN, NN, NN, NN, NN, /* F0 - F7 */
- NN, NN, NN, NN, NN, NN, NN, NN, /* F8 - FF */
+ NN, NN, NN, NN, NN, NN, NN, 255, /* F8 - FF */
};
static const uint8_t ukbd_boot_desc[] = {
@@ -582,14 +592,14 @@ ukbd_interrupt(struct ukbd_softc *sc)
sc->sc_repeat_key = 0;
} else {
ukbd_put_key(sc, key | KEY_PRESS);
-
- sc->sc_co_basetime = sbinuptime();
- sc->sc_delay = sc->sc_kbd.kb_delay1;
- ukbd_start_timer(sc);
-
- /* set repeat time for last key */
- sc->sc_repeat_time = now + sc->sc_kbd.kb_delay1;
- sc->sc_repeat_key = key;
+ if (key != APPLE_FN_KEY) {
+ sc->sc_co_basetime = sbinuptime();
+ sc->sc_delay = sc->sc_kbd.kb_delay1;
+ ukbd_start_timer(sc);
+ /* set repeat time for last key */
+ sc->sc_repeat_time = now + sc->sc_kbd.kb_delay1;
+ sc->sc_repeat_key = key;
+ }
}
}
}
@@ -669,6 +679,16 @@ static uint32_t
ukbd_apple_fn(uint32_t keycode)
{
switch (keycode) {
+ case 0x0b: return 0x50; /* H -> LEFT ARROW */
+ case 0x0d: return 0x51; /* J -> DOWN ARROW */
+ case 0x0e: return 0x52; /* K -> UP ARROW */
+ case 0x0f: return 0x4f; /* L -> RIGHT ARROW */
+ case 0x36: return 0x4a; /* COMMA -> HOME */
+ case 0x37: return 0x4d; /* DOT -> END */
+ case 0x18: return 0x4b; /* U -> PGUP */
+ case 0x07: return 0x4e; /* D -> PGDN */
+ case 0x16: return 0x47; /* S -> SCROLLLOCK */
+ case 0x13: return 0x46; /* P -> SYSRQ/PRTSC */
case 0x28: return 0x49; /* RETURN -> INSERT */
case 0x2a: return 0x4c; /* BACKSPACE -> DEL */
case 0x50: return 0x4a; /* LEFT ARROW -> HOME */
@@ -679,6 +699,27 @@ ukbd_apple_fn(uint32_t keycode)
}
}
+/* separate so the sysctl doesn't butcher non-fn keys */
+static uint32_t
+ukbd_apple_fn_media(uint32_t keycode)
+{
+ switch (keycode) {
+ case 0x3a: return 0xc0; /* F1 -> BRIGHTNESS DOWN */
+ case 0x3b: return 0xc1; /* F2 -> BRIGHTNESS UP */
+ case 0x3c: return 0xc2; /* F3 -> SCALE (MISSION CTRL)*/
+ case 0x3d: return 0xc3; /* F4 -> DASHBOARD (LAUNCHPAD) */
+ case 0x3e: return 0xc4; /* F5 -> KBD BACKLIGHT DOWN */
+ case 0x3f: return 0xc5; /* F6 -> KBD BACKLIGHT UP */
+ case 0x40: return 0xea; /* F7 -> MEDIA PREV */
+ case 0x41: return 0xe8; /* F8 -> PLAY/PAUSE */
+ case 0x42: return 0xeb; /* F9 -> MEDIA NEXT */
+ case 0x43: return 0xef; /* F10 -> MUTE */
+ case 0x44: return 0xee; /* F11 -> VOLUME DOWN */
+ case 0x45: return 0xed; /* F12 -> VOLUME UP */
+ default: return keycode;
+ }
+}
+
static uint32_t
ukbd_apple_swap(uint32_t keycode)
{
@@ -740,18 +781,34 @@ ukbd_intr_callback(struct usb_xfer *xfer, usb_error_t error)
/* clear modifiers */
modifiers = 0;
- /* scan through HID data */
+ /* scan through HID data and expose magic apple keys */
if ((sc->sc_flags & UKBD_FLAG_APPLE_EJECT) &&
(id == sc->sc_id_apple_eject)) {
- if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_eject))
+ if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_eject)) {
+ sc->sc_ndata.bitmap[APPLE_EJECT_KEY / 64] |=
+ 1ULL << (APPLE_EJECT_KEY % 64);
modifiers |= MOD_EJECT;
+ } else {
+ sc->sc_ndata.bitmap[APPLE_EJECT_KEY / 64] &=
+ ~(1ULL << (APPLE_EJECT_KEY % 64));
+ }
}
if ((sc->sc_flags & UKBD_FLAG_APPLE_FN) &&
(id == sc->sc_id_apple_fn)) {
- if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_fn))
+ if (hid_get_data(sc->sc_buffer, len, &sc->sc_loc_apple_fn)) {
+ sc->sc_ndata.bitmap[APPLE_FN_KEY / 64] |=
+ 1ULL << (APPLE_FN_KEY % 64);
modifiers |= MOD_FN;
+ } else {
+ sc->sc_ndata.bitmap[APPLE_FN_KEY / 64] &=
+ ~(1ULL << (APPLE_FN_KEY % 64));
+ }
}
+ int apply_apple_fn_media = (modifiers & MOD_FN) ? 1 : 0;
+ if (ukbd_apple_fn_mode) /* toggle from sysctl value */
+ apply_apple_fn_media = !apply_apple_fn_media;
+
for (i = 0; i != UKBD_NKEYCODE; i++) {
const uint64_t valid = sc->sc_loc_key_valid[i / 64];
const uint64_t mask = 1ULL << (i % 64);
@@ -780,6 +837,8 @@ ukbd_intr_callback(struct usb_xfer *xfer, usb_error_t error)
}
if (modifiers & MOD_FN)
key = ukbd_apple_fn(key);
+ if (apply_apple_fn_media)
+ key = ukbd_apple_fn_media(key);
if (sc->sc_flags & UKBD_FLAG_APPLE_SWAP)
key = ukbd_apple_swap(key);
if (key == KEY_NONE || key >= UKBD_NKEYCODE)
@@ -792,6 +851,8 @@ ukbd_intr_callback(struct usb_xfer *xfer, usb_error_t error)
if (modifiers & MOD_FN)
key = ukbd_apple_fn(key);
+ if (apply_apple_fn_media)
+ key = ukbd_apple_fn_media(key);
if (sc->sc_flags & UKBD_FLAG_APPLE_SWAP)
key = ukbd_apple_swap(key);
if (key == KEY_NONE || key == KEY_ERROR || key >= UKBD_NKEYCODE)
@@ -1045,21 +1106,37 @@ ukbd_parse_hid(struct ukbd_softc *sc, const uint8_t *ptr, uint32_t len)
hid_input, &sc->sc_kbd_id);
/* investigate if this is an Apple Keyboard */
- if (hid_locate(ptr, len,
- HID_USAGE2(HUP_CONSUMER, HUG_APPLE_EJECT),
- hid_input, 0, &sc->sc_loc_apple_eject, &flags,
- &sc->sc_id_apple_eject)) {
- if (flags & HIO_VARIABLE)
- sc->sc_flags |= UKBD_FLAG_APPLE_EJECT;
- DPRINTFN(1, "Found Apple eject-key\n");
- }
- if (hid_locate(ptr, len,
- HID_USAGE2(0xFFFF, 0x0003),
- hid_input, 0, &sc->sc_loc_apple_fn, &flags,
- &sc->sc_id_apple_fn)) {
- if (flags & HIO_VARIABLE)
- sc->sc_flags |= UKBD_FLAG_APPLE_FN;
- DPRINTFN(1, "Found Apple FN-key\n");
+ if (sc->sc_vendor_id == USB_VENDOR_APPLE) {
+ if (hid_locate(ptr, len,
+ HID_USAGE2(HUP_CONSUMER, HUG_APPLE_EJECT),
+ hid_input, 0, &sc->sc_loc_apple_eject, &flags,
+ &sc->sc_id_apple_eject)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= UKBD_FLAG_APPLE_EJECT;
+ DPRINTFN(1, "Found Apple eject-key\n");
+ }
+ /*
+ * check the same vendor pages that linux does to find the one
+ * apple uses for the function key.
+ */
+ static const uint16_t apple_pages[] = {
+ HUP_APPLE, /* HID_UP_CUSTOM in linux */
+ HUP_MICROSOFT, /* HID_UP_MSVENDOR in linux */
+ HUP_HP, /* HID_UP_HPVENDOR2 in linux */
+ 0xFFFF /* Original FreeBSD check (Remove?) */
+ };
+ for (int i = 0; i < (int)nitems(apple_pages); i++) {
+ if (hid_locate(ptr, len,
+ HID_USAGE2(apple_pages[i], 0x0003),
+ hid_input, 0, &sc->sc_loc_apple_fn, &flags,
+ &sc->sc_id_apple_fn)) {
+ if (flags & HIO_VARIABLE)
+ sc->sc_flags |= UKBD_FLAG_APPLE_FN;
+ DPRINTFN(1, "Found Apple FN-key on page 0x%04x\n",
+ apple_pages[i]);
+ break;
+ }
+ }
}
/* figure out event buffer */
@@ -1147,6 +1224,7 @@ ukbd_attach(device_t dev)
sc->sc_udev = uaa->device;
sc->sc_iface = uaa->iface;
+ sc->sc_vendor_id = uaa->info.idVendor;
sc->sc_iface_index = uaa->info.bIfaceIndex;
sc->sc_iface_no = uaa->info.bIfaceNum;
sc->sc_mode = K_XLATE;
diff --git a/sys/dev/usb/usbdevs b/sys/dev/usb/usbdevs
index bb039f59ce19..b0934cd63a92 100644
--- a/sys/dev/usb/usbdevs
+++ b/sys/dev/usb/usbdevs
@@ -786,6 +786,7 @@ vendor PERASO 0x2932 Peraso Technologies, Inc.
vendor PLANEX 0x2c02 Planex Communications
vendor MERCUSYS 0x2c4e Mercusys, Inc.
vendor QUECTEL 0x2c7c Quectel Wireless Solutions
+vendor NUAND 0x2cf0 Nuand LLC
vendor VIDZMEDIA 0x3275 VidzMedia Pte Ltd
vendor LINKINSTRUMENTS 0x3195 Link Instruments Inc.
vendor AEI 0x3334 AEI
@@ -1695,6 +1696,7 @@ product CYBERTAN RT2870 0x1828 RT2870
/* Cypress Semiconductor products */
product CYPRESS MOUSE 0x0001 mouse
product CYPRESS THERMO 0x0002 thermometer
+product CYPRESS FX3 0x00f3 EZ-USB FX3
product CYPRESS WISPY1A 0x0bad MetaGeek Wi-Spy
product CYPRESS KBDHUB 0x0101 Keyboard/Hub
product CYPRESS FMRADIO 0x1002 FM Radio
@@ -3556,6 +3558,11 @@ product NIKON E990 0x0102 Digital Camera E990
product NIKON LS40 0x4000 CoolScan LS40 ED
product NIKON D300 0x041a Digital Camera D300
+/* Nuand LLC products */
+product NUAND BLADERF 0x5246 bladeRF Software Defined Radio
+product NUAND BLADERF_BL 0x5247 bladeRF Bootloader
+product NUAND BLADERF2 0x5250 bladeRF 2.0 Software Defined Radio
+
/* NovaTech Products */
product NOVATECH NV902 0x9020 NovaTech NV-902W
product NOVATECH RT2573 0x9021 RT2573
diff --git a/sys/dev/vmm/vmm_dev.c b/sys/dev/vmm/vmm_dev.c
index ed8e5b2e0777..a2775023838a 100644
--- a/sys/dev/vmm/vmm_dev.c
+++ b/sys/dev/vmm/vmm_dev.c
@@ -114,7 +114,7 @@ static int devmem_create_cdev(struct vmmdev_softc *sc, int id, char *devmem);
static void vmmdev_destroy(struct vmmdev_softc *sc);
static int
-vmm_priv_check(struct ucred *ucred)
+vmm_jail_priv_check(struct ucred *ucred)
{
if (jailed(ucred) &&
(ucred->cr_prison->pr_allow & pr_allow_vmm_flag) == 0)
@@ -371,7 +371,7 @@ vmmdev_open(struct cdev *dev, int flags, int fmt, struct thread *td)
* A jail without vmm access shouldn't be able to access vmm device
* files at all, but check here just to be thorough.
*/
- error = vmm_priv_check(td->td_ucred);
+ error = vmm_jail_priv_check(td->td_ucred);
if (error != 0)
return (error);
@@ -940,7 +940,7 @@ sysctl_vmm_destroy(SYSCTL_HANDLER_ARGS)
char *buf;
int error, buflen;
- error = vmm_priv_check(req->td->td_ucred);
+ error = vmm_jail_priv_check(req->td->td_ucred);
if (error)
return (error);
@@ -1016,6 +1016,12 @@ vmmdev_create(const char *name, uint32_t flags, struct ucred *cred)
"An unprivileged user must run VMs in monitor mode"));
}
+ if ((error = vmm_jail_priv_check(cred)) != 0) {
+ sx_xunlock(&vmmdev_mtx);
+ return (EXTERROR(error,
+ "VMs cannot be created in the current jail"));
+ }
+
if (!chgvmmcnt(cred->cr_ruidinfo, 1, vm_maxvmms)) {
sx_xunlock(&vmmdev_mtx);
return (ENOMEM);
@@ -1061,7 +1067,7 @@ sysctl_vmm_create(SYSCTL_HANDLER_ARGS)
if (!vmm_initialized)
return (ENXIO);
- error = vmm_priv_check(req->td->td_ucred);
+ error = vmm_jail_priv_check(req->td->td_ucred);
if (error != 0)
return (error);
@@ -1126,7 +1132,7 @@ vmmctl_open(struct cdev *cdev, int flags, int fmt, struct thread *td)
int error;
struct vmmctl_priv *priv;
- error = vmm_priv_check(td->td_ucred);
+ error = vmm_jail_priv_check(td->td_ucred);
if (error != 0)
return (error);