summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/io
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/io')
-rw-r--r--usr/src/uts/common/io/cxgbe/t4nex/adapter.h4
-rw-r--r--usr/src/uts/common/io/cxgbe/t4nex/t4_nexus.c105
-rw-r--r--usr/src/uts/common/io/igb/igb_sensor.c17
-rw-r--r--usr/src/uts/common/io/ksensor/ksensor_drv.c16
-rw-r--r--usr/src/uts/common/io/ksensor/ksensor_test.c76
-rw-r--r--usr/src/uts/common/io/mlxcx/mlxcx.c15
-rw-r--r--usr/src/uts/common/io/mlxcx/mlxcx.h23
-rw-r--r--usr/src/uts/common/io/mlxcx/mlxcx_cmd.c13
-rw-r--r--usr/src/uts/common/io/mlxcx/mlxcx_gld.c27
-rw-r--r--usr/src/uts/common/io/mlxcx/mlxcx_intr.c101
-rw-r--r--usr/src/uts/common/io/mlxcx/mlxcx_reg.h28
-rw-r--r--usr/src/uts/common/io/mlxcx/mlxcx_sensor.c126
-rw-r--r--usr/src/uts/common/io/tem.c78
-rw-r--r--usr/src/uts/common/io/tem_safe.c19
-rw-r--r--usr/src/uts/common/io/usb/usba/hubdi.c137
15 files changed, 643 insertions, 142 deletions
diff --git a/usr/src/uts/common/io/cxgbe/t4nex/adapter.h b/usr/src/uts/common/io/cxgbe/t4nex/adapter.h
index 48edc44341..1192eeb43e 100644
--- a/usr/src/uts/common/io/cxgbe/t4nex/adapter.h
+++ b/usr/src/uts/common/io/cxgbe/t4nex/adapter.h
@@ -559,6 +559,10 @@ struct adapter {
kmutex_t sfl_lock; /* same cache-line as sc_lock? but that's ok */
TAILQ_HEAD(, sge_fl) sfl;
timeout_id_t sfl_timer;
+
+ /* Sensors */
+ id_t temp_sensor;
+ id_t volt_sensor;
};
enum {
diff --git a/usr/src/uts/common/io/cxgbe/t4nex/t4_nexus.c b/usr/src/uts/common/io/cxgbe/t4nex/t4_nexus.c
index ec590228b6..05732e47a1 100644
--- a/usr/src/uts/common/io/cxgbe/t4nex/t4_nexus.c
+++ b/usr/src/uts/common/io/cxgbe/t4nex/t4_nexus.c
@@ -37,6 +37,7 @@
#include <sys/mkdev.h>
#include <sys/queue.h>
#include <sys/containerof.h>
+#include <sys/sensors.h>
#include "version.h"
#include "common/common.h"
@@ -180,6 +181,18 @@ static kmutex_t t4_uld_list_lock;
static SLIST_HEAD(, uld_info) t4_uld_list;
#endif
+static int t4_temperature_read(void *, sensor_ioctl_scalar_t *);
+static int t4_voltage_read(void *, sensor_ioctl_scalar_t *);
+static const ksensor_ops_t t4_temp_ops = {
+ .kso_kind = ksensor_kind_temperature,
+ .kso_scalar = t4_temperature_read
+};
+
+static const ksensor_ops_t t4_volt_ops = {
+ .kso_kind = ksensor_kind_voltage,
+ .kso_scalar = t4_voltage_read
+};
+
int
_init(void)
{
@@ -758,7 +771,23 @@ ofld_queues:
}
sc->flags |= INTR_ALLOCATED;
- ASSERT(rc == DDI_SUCCESS);
+ if ((rc = ksensor_create_scalar_pcidev(dip, SENSOR_KIND_TEMPERATURE,
+ &t4_temp_ops, sc, "temp", &sc->temp_sensor)) != 0) {
+ cxgb_printf(dip, CE_WARN, "failed to create temperature "
+ "sensor: %d", rc);
+ rc = DDI_FAILURE;
+ goto done;
+ }
+
+ if ((rc = ksensor_create_scalar_pcidev(dip, SENSOR_KIND_VOLTAGE,
+ &t4_volt_ops, sc, "vdd", &sc->volt_sensor)) != 0) {
+ cxgb_printf(dip, CE_WARN, "failed to create voltage "
+ "sensor: %d", rc);
+ rc = DDI_FAILURE;
+ goto done;
+ }
+
+
ddi_report_dev(dip);
/*
@@ -849,6 +878,7 @@ t4_devo_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
}
/* Safe to call no matter what */
+ (void) ksensor_remove(dip, KSENSOR_ALL_IDS);
ddi_prop_remove_all(dip);
ddi_remove_minor_node(dip, NULL);
@@ -2919,3 +2949,76 @@ t4_iterate(void (*func)(int, void *), void *arg)
}
#endif
+
+static int
+t4_sensor_read(struct adapter *sc, uint32_t diag, uint32_t *valp)
+{
+ int rc;
+ struct port_info *pi = sc->port[0];
+ uint32_t param, val;
+
+ rc = begin_synchronized_op(pi, 1, 1);
+ if (rc != 0) {
+ return (rc);
+ }
+ param = V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_DEV) |
+ V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_DEV_DIAG) |
+ V_FW_PARAMS_PARAM_Y(diag);
+ rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 1, &param, &val);
+ end_synchronized_op(pi, 1);
+
+ if (rc != 0) {
+ return (rc);
+ }
+
+ if (val == 0) {
+ return (EIO);
+ }
+
+ *valp = val;
+ return (0);
+}
+
+static int
+t4_temperature_read(void *arg, sensor_ioctl_scalar_t *scalar)
+{
+ int ret;
+ struct adapter *sc = arg;
+ uint32_t val;
+
+ ret = t4_sensor_read(sc, FW_PARAM_DEV_DIAG_TMP, &val);
+ if (ret != 0) {
+ return (ret);
+ }
+
+ /*
+ * The device measures temperature in units of 1 degree Celsius. We
+ * don't know its precision.
+ */
+ scalar->sis_unit = SENSOR_UNIT_CELSIUS;
+ scalar->sis_gran = 1;
+ scalar->sis_prec = 0;
+ scalar->sis_value = val;
+
+ return (0);
+}
+
+static int
+t4_voltage_read(void *arg, sensor_ioctl_scalar_t *scalar)
+{
+ int ret;
+ struct adapter *sc = arg;
+ uint32_t val;
+
+ ret = t4_sensor_read(sc, FW_PARAM_DEV_DIAG_VDD, &val);
+ if (ret != 0) {
+ return (ret);
+ }
+
+ scalar->sis_unit = SENSOR_UNIT_VOLTS;
+ scalar->sis_gran = 1000;
+ scalar->sis_prec = 0;
+ scalar->sis_value = val;
+
+ return (0);
+}
diff --git a/usr/src/uts/common/io/igb/igb_sensor.c b/usr/src/uts/common/io/igb/igb_sensor.c
index b233af2a92..3b41a853c0 100644
--- a/usr/src/uts/common/io/igb/igb_sensor.c
+++ b/usr/src/uts/common/io/igb/igb_sensor.c
@@ -72,7 +72,7 @@
#define EMC1413_REG_EXT3_DIODE_LO 0x2b
static int
-igb_sensor_reg_temp(void *arg, sensor_ioctl_temperature_t *temp)
+igb_sensor_reg_temperature(void *arg, sensor_ioctl_scalar_t *scalar)
{
igb_t *igb = arg;
uint32_t reg;
@@ -87,17 +87,17 @@ igb_sensor_reg_temp(void *arg, sensor_ioctl_temperature_t *temp)
return (EIO);
}
- temp->sit_unit = SENSOR_UNIT_CELSIUS;
- temp->sit_gran = E1000_THMJT_RESOLUTION;
- temp->sit_prec = E1000_THMJT_PRECISION;
- temp->sit_temp = E1000_THMJT_TEMP(reg);
+ scalar->sis_unit = SENSOR_UNIT_CELSIUS;
+ scalar->sis_gran = E1000_THMJT_RESOLUTION;
+ scalar->sis_prec = E1000_THMJT_PRECISION;
+ scalar->sis_value = E1000_THMJT_TEMP(reg);
return (0);
}
static const ksensor_ops_t igb_sensor_reg_ops = {
.kso_kind = ksensor_kind_temperature,
- .kso_temp = igb_sensor_reg_temp
+ .kso_scalar = igb_sensor_reg_temperature
};
static boolean_t
@@ -106,8 +106,9 @@ igb_sensors_create_minors(igb_t *igb)
int ret;
igb_sensors_t *sp = &igb->igb_sensors;
- if ((ret = ksensor_create_temp_pcidev(igb->dip, &igb_sensor_reg_ops,
- igb, "builtin", &sp->isn_reg_ksensor)) != 0) {
+ if ((ret = ksensor_create_scalar_pcidev(igb->dip,
+ SENSOR_KIND_TEMPERATURE, &igb_sensor_reg_ops, igb, "builtin",
+ &sp->isn_reg_ksensor)) != 0) {
igb_log(igb, IGB_LOG_ERROR, "failed to create main sensor: %d",
ret);
return (B_FALSE);
diff --git a/usr/src/uts/common/io/ksensor/ksensor_drv.c b/usr/src/uts/common/io/ksensor/ksensor_drv.c
index 6810e11758..70e99287a2 100644
--- a/usr/src/uts/common/io/ksensor/ksensor_drv.c
+++ b/usr/src/uts/common/io/ksensor/ksensor_drv.c
@@ -90,15 +90,15 @@ ksensor_ioctl_kind(minor_t min, intptr_t arg, int mode)
}
static int
-ksensor_ioctl_temp(minor_t min, intptr_t arg, int mode)
+ksensor_ioctl_scalar(minor_t min, intptr_t arg, int mode)
{
int ret;
- sensor_ioctl_temperature_t temp;
+ sensor_ioctl_scalar_t scalar;
- bzero(&temp, sizeof (temp));
- ret = ksensor_op_temperature((id_t)min, &temp);
+ bzero(&scalar, sizeof (scalar));
+ ret = ksensor_op_scalar((id_t)min, &scalar);
if (ret == 0) {
- if (ddi_copyout(&temp, (void *)arg, sizeof (temp),
+ if (ddi_copyout(&scalar, (void *)arg, sizeof (scalar),
mode & FKIOCTL) != 0) {
ret = EFAULT;
}
@@ -118,10 +118,10 @@ ksensor_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp,
m = getminor(dev);
switch (cmd) {
- case SENSOR_IOCTL_TYPE:
+ case SENSOR_IOCTL_KIND:
return (ksensor_ioctl_kind(m, arg, mode));
- case SENSOR_IOCTL_TEMPERATURE:
- return (ksensor_ioctl_temp(m, arg, mode));
+ case SENSOR_IOCTL_SCALAR:
+ return (ksensor_ioctl_scalar(m, arg, mode));
default:
return (ENOTTY);
}
diff --git a/usr/src/uts/common/io/ksensor/ksensor_test.c b/usr/src/uts/common/io/ksensor/ksensor_test.c
index ea71ab5559..a98a8b77eb 100644
--- a/usr/src/uts/common/io/ksensor/ksensor_test.c
+++ b/usr/src/uts/common/io/ksensor/ksensor_test.c
@@ -32,21 +32,53 @@ typedef struct ksensor_test {
id_t kt_sensor3;
id_t kt_sensor4;
id_t kt_sensor5;
+ id_t kt_volt;
+ id_t kt_current;
} ksensor_test_t;
static int
-ksensor_test_temperature(void *arg, sensor_ioctl_temperature_t *temp)
+ksensor_test_temp(void *arg, sensor_ioctl_scalar_t *scalar)
{
- temp->sit_unit = SENSOR_UNIT_CELSIUS;
- temp->sit_gran = 4;
- temp->sit_prec = -2;
- temp->sit_temp = 23;
+ scalar->sis_unit = SENSOR_UNIT_CELSIUS;
+ scalar->sis_gran = 4;
+ scalar->sis_prec = -2;
+ scalar->sis_value = 23;
return (0);
}
static const ksensor_ops_t ksensor_test_temp_ops = {
- ksensor_kind_temperature,
- ksensor_test_temperature
+ .kso_kind = ksensor_kind_temperature,
+ .kso_scalar = ksensor_test_temp
+};
+
+static int
+ksensor_test_volt(void *arg, sensor_ioctl_scalar_t *scalar)
+{
+ scalar->sis_unit = SENSOR_UNIT_VOLTS;
+ scalar->sis_gran = 1000;
+ scalar->sis_prec = 0;
+ scalar->sis_value = 3300;
+ return (0);
+}
+
+static const ksensor_ops_t ksensor_test_volt_ops = {
+ .kso_kind = ksensor_kind_voltage,
+ .kso_scalar = ksensor_test_volt
+};
+
+static int
+ksensor_test_current(void *arg, sensor_ioctl_scalar_t *scalar)
+{
+ scalar->sis_unit = SENSOR_UNIT_AMPS;
+ scalar->sis_gran = 10;
+ scalar->sis_prec = 0;
+ scalar->sis_value = 5;
+ return (0);
+}
+
+static const ksensor_ops_t ksensor_test_current_ops = {
+ .kso_kind = ksensor_kind_current,
+ .kso_scalar = ksensor_test_current
};
static int
@@ -56,14 +88,14 @@ ksensor_test_kind_eio(void *arg, sensor_ioctl_kind_t *kindp)
}
static int
-ksensor_test_temp_eio(void *arg, sensor_ioctl_temperature_t *tempp)
+ksensor_test_temp_eio(void *arg, sensor_ioctl_scalar_t *scalar)
{
return (EIO);
}
static const ksensor_ops_t ksensor_test_eio_ops = {
- ksensor_test_kind_eio,
- ksensor_test_temp_eio
+ .kso_kind = ksensor_test_kind_eio,
+ .kso_scalar = ksensor_test_temp_eio
};
static int
@@ -107,7 +139,7 @@ ksensor_test_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
ddi_get_instance(dip));
if ((ret = ksensor_create(dip, &ksensor_test_temp_ops, NULL, buf,
"ddi_sensor:test", &kt->kt_sensor3)) != 0) {
- dev_err(dip, CE_WARN, "failed to attatch sensor %s: %d", buf,
+ dev_err(dip, CE_WARN, "failed to attach sensor %s: %d", buf,
ret);
goto err;
}
@@ -116,7 +148,7 @@ ksensor_test_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
ddi_get_instance(dip));
if ((ret = ksensor_create(dip, &ksensor_test_temp_ops, NULL, buf,
"ddi_sensor:test", &kt->kt_sensor4)) != 0) {
- dev_err(dip, CE_WARN, "failed to attatch sensor %s: %d", buf,
+ dev_err(dip, CE_WARN, "failed to attach sensor %s: %d", buf,
ret);
goto err;
}
@@ -125,7 +157,25 @@ ksensor_test_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
ddi_get_instance(dip));
if ((ret = ksensor_create(dip, &ksensor_test_eio_ops, NULL, buf,
"ddi_sensor:test", &kt->kt_sensor5)) != 0) {
- dev_err(dip, CE_WARN, "failed to attatch sensor %s: %d", buf,
+ dev_err(dip, CE_WARN, "failed to attach sensor %s: %d", buf,
+ ret);
+ goto err;
+ }
+
+ (void) snprintf(buf, sizeof (buf), "test.volt.%d.1",
+ ddi_get_instance(dip));
+ if ((ret = ksensor_create(dip, &ksensor_test_volt_ops, NULL, buf,
+ "ddi_sensor:test", &kt->kt_volt)) != 0) {
+ dev_err(dip, CE_WARN, "failed to attach sensor %s: %d", buf,
+ ret);
+ goto err;
+ }
+
+ (void) snprintf(buf, sizeof (buf), "test.current.%d.1",
+ ddi_get_instance(dip));
+ if ((ret = ksensor_create(dip, &ksensor_test_current_ops, NULL, buf,
+ "ddi_sensor:test", &kt->kt_current)) != 0) {
+ dev_err(dip, CE_WARN, "failed to attach sensor %s: %d", buf,
ret);
goto err;
}
diff --git a/usr/src/uts/common/io/mlxcx/mlxcx.c b/usr/src/uts/common/io/mlxcx/mlxcx.c
index dbad9be958..90964d2fd1 100644
--- a/usr/src/uts/common/io/mlxcx/mlxcx.c
+++ b/usr/src/uts/common/io/mlxcx/mlxcx.c
@@ -1066,6 +1066,11 @@ mlxcx_teardown(mlxcx_t *mlxp)
mlxcx_intr_disable(mlxp);
}
+ if (mlxp->mlx_attach & MLXCX_ATTACH_SENSORS) {
+ mlxcx_teardown_sensors(mlxp);
+ mlxp->mlx_attach &= ~MLXCX_ATTACH_SENSORS;
+ }
+
if (mlxp->mlx_attach & MLXCX_ATTACH_CHKTIMERS) {
mlxcx_teardown_checktimers(mlxp);
mlxp->mlx_attach &= ~MLXCX_ATTACH_CHKTIMERS;
@@ -1800,7 +1805,7 @@ mlxcx_setup_ports(mlxcx_t *mlxp)
p->mlx_port_event.mla_mlx = mlxp;
p->mlx_port_event.mla_port = p;
mutex_init(&p->mlx_port_event.mla_mtx, NULL,
- MUTEX_DRIVER, DDI_INTR_PRI(mlxp->mlx_intr_pri));
+ MUTEX_DRIVER, DDI_INTR_PRI(mlxp->mlx_async_intr_pri));
p->mlp_init |= MLXCX_PORT_INIT;
mutex_init(&p->mlp_mtx, NULL, MUTEX_DRIVER,
DDI_INTR_PRI(mlxp->mlx_intr_pri));
@@ -2716,7 +2721,7 @@ mlxcx_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
for (i = 0; i <= MLXCX_FUNC_ID_MAX; i++) {
mlxp->mlx_npages_req[i].mla_mlx = mlxp;
mutex_init(&mlxp->mlx_npages_req[i].mla_mtx, NULL,
- MUTEX_DRIVER, DDI_INTR_PRI(mlxp->mlx_intr_pri));
+ MUTEX_DRIVER, DDI_INTR_PRI(mlxp->mlx_async_intr_pri));
}
mlxp->mlx_attach |= MLXCX_ATTACH_ASYNC_TQ;
@@ -2869,6 +2874,11 @@ mlxcx_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
}
mlxp->mlx_attach |= MLXCX_ATTACH_CHKTIMERS;
+ if (!mlxcx_setup_sensors(mlxp)) {
+ goto err;
+ }
+ mlxp->mlx_attach |= MLXCX_ATTACH_SENSORS;
+
/*
* Finally, tell MAC that we exist!
*/
@@ -2913,7 +2923,6 @@ static struct dev_ops mlxcx_dev_ops = {
.devo_attach = mlxcx_attach,
.devo_detach = mlxcx_detach,
.devo_reset = nodev,
- .devo_power = ddi_power,
.devo_quiesce = ddi_quiesce_not_supported,
.devo_cb_ops = &mlxcx_cb_ops
};
diff --git a/usr/src/uts/common/io/mlxcx/mlxcx.h b/usr/src/uts/common/io/mlxcx/mlxcx.h
index 77d36447c6..e28fe89806 100644
--- a/usr/src/uts/common/io/mlxcx/mlxcx.h
+++ b/usr/src/uts/common/io/mlxcx/mlxcx.h
@@ -1009,6 +1009,15 @@ typedef struct {
uint64_t mldp_wq_check_interval_sec;
} mlxcx_drv_props_t;
+typedef struct {
+ mlxcx_t *mlts_mlx;
+ uint8_t mlts_index;
+ id_t mlts_ksensor;
+ int16_t mlts_value;
+ int16_t mlts_max_value;
+ uint8_t mlts_name[MLXCX_MTMP_NAMELEN];
+} mlxcx_temp_sensor_t;
+
typedef enum {
MLXCX_ATTACH_FM = 1 << 0,
MLXCX_ATTACH_PCI_CONFIG = 1 << 1,
@@ -1028,6 +1037,7 @@ typedef enum {
MLXCX_ATTACH_CAPS = 1 << 15,
MLXCX_ATTACH_CHKTIMERS = 1 << 16,
MLXCX_ATTACH_ASYNC_TQ = 1 << 17,
+ MLXCX_ATTACH_SENSORS = 1 << 18
} mlxcx_attach_progress_t;
struct mlxcx {
@@ -1082,6 +1092,7 @@ struct mlxcx {
* Interrupts
*/
uint_t mlx_intr_pri;
+ uint_t mlx_async_intr_pri;
uint_t mlx_intr_type; /* always MSI-X */
int mlx_intr_count;
size_t mlx_intr_size; /* allocation size */
@@ -1171,6 +1182,12 @@ struct mlxcx {
ddi_periodic_t mlx_eq_checktimer;
ddi_periodic_t mlx_cq_checktimer;
ddi_periodic_t mlx_wq_checktimer;
+
+ /*
+ * Sensors
+ */
+ uint8_t mlx_temp_nsensors;
+ mlxcx_temp_sensor_t *mlx_temp_sensors;
};
/*
@@ -1446,6 +1463,12 @@ extern const char *mlxcx_port_status_string(mlxcx_port_status_t);
extern const char *mlxcx_event_name(mlxcx_event_t);
+/*
+ * Sensor Functions
+ */
+extern boolean_t mlxcx_setup_sensors(mlxcx_t *);
+extern void mlxcx_teardown_sensors(mlxcx_t *);
+
#ifdef __cplusplus
}
#endif
diff --git a/usr/src/uts/common/io/mlxcx/mlxcx_cmd.c b/usr/src/uts/common/io/mlxcx/mlxcx_cmd.c
index c8eb1335ea..32c40ec3ea 100644
--- a/usr/src/uts/common/io/mlxcx/mlxcx_cmd.c
+++ b/usr/src/uts/common/io/mlxcx/mlxcx_cmd.c
@@ -667,7 +667,8 @@ static void
mlxcx_cmd_init(mlxcx_t *mlxp, mlxcx_cmd_t *cmd)
{
bzero(cmd, sizeof (*cmd));
- mutex_init(&cmd->mlcmd_lock, NULL, MUTEX_DRIVER, NULL);
+ mutex_init(&cmd->mlcmd_lock, NULL, MUTEX_DRIVER,
+ DDI_INTR_PRI(mlxp->mlx_async_intr_pri));
cv_init(&cmd->mlcmd_cv, NULL, CV_DRIVER, NULL);
cmd->mlcmd_token = id_alloc(mlxp->mlx_cmd.mcmd_tokens);
cmd->mlcmd_poll = mlxp->mlx_cmd.mcmd_polled;
@@ -1687,6 +1688,10 @@ mlxcx_reg_name(mlxcx_register_id_t rid)
return ("PPCNT");
case MLXCX_REG_PPLM:
return ("PPLM");
+ case MLXCX_REG_MTCAP:
+ return ("MTCAP");
+ case MLXCX_REG_MTMP:
+ return ("MTMP");
default:
return ("???");
}
@@ -1736,6 +1741,12 @@ mlxcx_cmd_access_register(mlxcx_t *mlxp, mlxcx_cmd_reg_opmod_t opmod,
case MLXCX_REG_PPLM:
dsize = sizeof (mlxcx_reg_pplm_t);
break;
+ case MLXCX_REG_MTCAP:
+ dsize = sizeof (mlxcx_reg_mtcap_t);
+ break;
+ case MLXCX_REG_MTMP:
+ dsize = sizeof (mlxcx_reg_mtmp_t);
+ break;
default:
dsize = 0;
VERIFY(0);
diff --git a/usr/src/uts/common/io/mlxcx/mlxcx_gld.c b/usr/src/uts/common/io/mlxcx/mlxcx_gld.c
index 89645bb2b1..941eb0f9e7 100644
--- a/usr/src/uts/common/io/mlxcx/mlxcx_gld.c
+++ b/usr/src/uts/common/io/mlxcx/mlxcx_gld.c
@@ -809,19 +809,32 @@ mlxcx_mac_ring_stop(mac_ring_driver_t rh)
if (wq->mlwq_state & MLXCX_WQ_BUFFERS) {
+ list_t cq_buffers;
+
+ /*
+ * Take the buffers away from the CQ. If the CQ is being
+ * processed and the WQ has been stopped, a completion
+ * which does not match to a buffer will be ignored.
+ */
+ list_create(&cq_buffers, sizeof (mlxcx_buffer_t),
+ offsetof(mlxcx_buffer_t, mlb_cq_entry));
+
+ list_move_tail(&cq_buffers, &cq->mlcq_buffers);
+
+ mutex_enter(&cq->mlcq_bufbmtx);
+ list_move_tail(&cq_buffers, &cq->mlcq_buffers_b);
+ mutex_exit(&cq->mlcq_bufbmtx);
+
+ cq->mlcq_bufcnt = 0;
+
mutex_exit(&wq->mlwq_mtx);
mutex_exit(&cq->mlcq_mtx);
/* Return any outstanding buffers to the free pool. */
- while ((buf = list_remove_head(&cq->mlcq_buffers)) != NULL) {
+ while ((buf = list_remove_head(&cq_buffers)) != NULL) {
mlxcx_buf_return_chain(mlxp, buf, B_FALSE);
}
- mutex_enter(&cq->mlcq_bufbmtx);
- while ((buf = list_remove_head(&cq->mlcq_buffers_b)) != NULL) {
- mlxcx_buf_return_chain(mlxp, buf, B_FALSE);
- }
- mutex_exit(&cq->mlcq_bufbmtx);
- cq->mlcq_bufcnt = 0;
+ list_destroy(&cq_buffers);
s = wq->mlwq_bufs;
mutex_enter(&s->mlbs_mtx);
diff --git a/usr/src/uts/common/io/mlxcx/mlxcx_intr.c b/usr/src/uts/common/io/mlxcx/mlxcx_intr.c
index f79c148d20..53ea4d683e 100644
--- a/usr/src/uts/common/io/mlxcx/mlxcx_intr.c
+++ b/usr/src/uts/common/io/mlxcx/mlxcx_intr.c
@@ -12,6 +12,7 @@
/*
* Copyright (c) 2020, the University of Queensland
* Copyright 2020 RackTop Systems, Inc.
+ * Copyright 2020 OmniOS Community Edition (OmniOSce) Association.
*/
/*
@@ -922,6 +923,20 @@ lookagain:
if (added)
goto lookagain;
+ /*
+ * This check could go just after the lookagain
+ * label, but it is a hot code path so we don't
+ * want to unnecessarily grab a lock and check
+ * a flag for a relatively rare event (the ring
+ * being stopped).
+ */
+ mutex_enter(&wq->mlwq_mtx);
+ if ((wq->mlwq_state & MLXCX_WQ_STARTED) == 0) {
+ mutex_exit(&wq->mlwq_mtx);
+ goto nextcq;
+ }
+ mutex_exit(&wq->mlwq_mtx);
+
buf = list_head(&mlcq->mlcq_buffers);
mlxcx_warn(mlxp, "got completion on CQ %x but "
"no buffer matching wqe found: %x (first "
@@ -1165,6 +1180,7 @@ mlxcx_intr_setup(mlxcx_t *mlxp)
ret = ddi_intr_get_supported_types(dip, &types);
if (ret != DDI_SUCCESS) {
+ mlxcx_warn(mlxp, "Failed to get supported interrupt types");
return (B_FALSE);
}
@@ -1176,15 +1192,21 @@ mlxcx_intr_setup(mlxcx_t *mlxp)
ret = ddi_intr_get_nintrs(dip, DDI_INTR_TYPE_MSIX, &nintrs);
if (ret != DDI_SUCCESS) {
+ mlxcx_warn(mlxp, "Failed to get number of interrupts");
return (B_FALSE);
}
if (nintrs < 2) {
- mlxcx_warn(mlxp, "%d MSI-X interrupts available, but mlxcx "
+ mlxcx_warn(mlxp, "%d MSI-X interrupts supported, but mlxcx "
"requires 2", nintrs);
return (B_FALSE);
}
ret = ddi_intr_get_navail(dip, DDI_INTR_TYPE_MSIX, &navail);
+ if (ret != DDI_SUCCESS) {
+ mlxcx_warn(mlxp,
+ "Failed to get number of available interrupts");
+ return (B_FALSE);
+ }
if (navail < 2) {
mlxcx_warn(mlxp, "%d MSI-X interrupts available, but mlxcx "
"requires 2", navail);
@@ -1203,10 +1225,14 @@ mlxcx_intr_setup(mlxcx_t *mlxp)
ret = ddi_intr_alloc(dip, mlxp->mlx_intr_handles, DDI_INTR_TYPE_MSIX,
0, navail, &mlxp->mlx_intr_count, DDI_INTR_ALLOC_NORMAL);
if (ret != DDI_SUCCESS) {
+ mlxcx_warn(mlxp, "Failed to allocate %d interrupts", navail);
mlxcx_intr_teardown(mlxp);
return (B_FALSE);
}
if (mlxp->mlx_intr_count < mlxp->mlx_intr_cq0 + 1) {
+ mlxcx_warn(mlxp, "%d MSI-X interrupts allocated, but mlxcx "
+ "requires %d", mlxp->mlx_intr_count,
+ mlxp->mlx_intr_cq0 + 1);
mlxcx_intr_teardown(mlxp);
return (B_FALSE);
}
@@ -1214,10 +1240,29 @@ mlxcx_intr_setup(mlxcx_t *mlxp)
ret = ddi_intr_get_pri(mlxp->mlx_intr_handles[0], &mlxp->mlx_intr_pri);
if (ret != DDI_SUCCESS) {
+ mlxcx_warn(mlxp, "Failed to get interrupt priority");
mlxcx_intr_teardown(mlxp);
return (B_FALSE);
}
+ /*
+ * Set the interrupt priority for the asynchronous handler higher
+ * than the ring handlers. Some operations which issue commands,
+ * and thus rely on the async interrupt handler for posting
+ * completion, do so with a CQ mutex held. The CQ mutex is also
+ * acquired during ring processing, so if the ring processing vector
+ * happens to be assigned to the same CPU as the async vector
+ * it can hold off the async interrupt thread and lead to a deadlock.
+ * By assigning a higher priority to the async vector, it will
+ * always be dispatched.
+ */
+ mlxp->mlx_async_intr_pri = mlxp->mlx_intr_pri;
+ if (mlxp->mlx_async_intr_pri < LOCK_LEVEL) {
+ mlxp->mlx_async_intr_pri++;
+ } else {
+ mlxp->mlx_intr_pri--;
+ }
+
mlxp->mlx_eqs_size = mlxp->mlx_intr_count *
sizeof (mlxcx_event_queue_t);
mlxp->mlx_eqs = kmem_zalloc(mlxp->mlx_eqs_size, KM_SLEEP);
@@ -1227,8 +1272,11 @@ mlxcx_intr_setup(mlxcx_t *mlxp)
* mutex and avl tree to be init'ed - so do it now.
*/
for (i = 0; i < mlxp->mlx_intr_count; ++i) {
+ uint_t pri = (i == 0) ? mlxp->mlx_async_intr_pri :
+ mlxp->mlx_intr_pri;
+
mutex_init(&mlxp->mlx_eqs[i].mleq_mtx, NULL, MUTEX_DRIVER,
- DDI_INTR_PRI(mlxp->mlx_intr_pri));
+ DDI_INTR_PRI(pri));
cv_init(&mlxp->mlx_eqs[i].mleq_cv, NULL, CV_DRIVER, NULL);
if (i < mlxp->mlx_intr_cq0)
@@ -1239,9 +1287,38 @@ mlxcx_intr_setup(mlxcx_t *mlxp)
offsetof(mlxcx_completion_queue_t, mlcq_eq_entry));
}
+ while (mlxp->mlx_async_intr_pri > DDI_INTR_PRI_MIN) {
+ ret = ddi_intr_set_pri(mlxp->mlx_intr_handles[0],
+ mlxp->mlx_async_intr_pri);
+ if (ret == DDI_SUCCESS)
+ break;
+ mlxcx_note(mlxp,
+ "!Failed to set interrupt priority to %u for "
+ "async interrupt vector", mlxp->mlx_async_intr_pri);
+ /*
+ * If it was not possible to set the IPL for the async
+ * interrupt to the desired value, then try a lower priority.
+ * Some PSMs can only accommodate a limited number of vectors
+ * at eatch priority level (or group of priority levels). Since
+ * the async priority must be set higher than the ring
+ * handlers, lower both. The ring handler priority is set
+ * below.
+ */
+ mlxp->mlx_async_intr_pri--;
+ mlxp->mlx_intr_pri--;
+ }
+
+ if (mlxp->mlx_async_intr_pri == DDI_INTR_PRI_MIN) {
+ mlxcx_warn(mlxp, "Failed to find an interrupt priority for "
+ "async interrupt vector");
+ mlxcx_intr_teardown(mlxp);
+ return (B_FALSE);
+ }
+
ret = ddi_intr_add_handler(mlxp->mlx_intr_handles[0], mlxcx_intr_async,
(caddr_t)mlxp, (caddr_t)&mlxp->mlx_eqs[0]);
if (ret != DDI_SUCCESS) {
+ mlxcx_warn(mlxp, "Failed to add async interrupt handler");
mlxcx_intr_teardown(mlxp);
return (B_FALSE);
}
@@ -1268,9 +1345,29 @@ mlxcx_intr_setup(mlxcx_t *mlxp)
eqt = MLXCX_EQ_TYPE_RX;
}
+ while (mlxp->mlx_intr_pri >= DDI_INTR_PRI_MIN) {
+ ret = ddi_intr_set_pri(mlxp->mlx_intr_handles[i],
+ mlxp->mlx_intr_pri);
+ if (ret == DDI_SUCCESS)
+ break;
+ mlxcx_note(mlxp, "!Failed to set interrupt priority to "
+ "%u for interrupt vector %d",
+ mlxp->mlx_intr_pri, i);
+ mlxp->mlx_intr_pri--;
+ }
+ if (mlxp->mlx_intr_pri < DDI_INTR_PRI_MIN) {
+ mlxcx_warn(mlxp,
+ "Failed to find an interrupt priority for "
+ "interrupt vector %d", i);
+ mlxcx_intr_teardown(mlxp);
+ return (B_FALSE);
+ }
+
ret = ddi_intr_add_handler(mlxp->mlx_intr_handles[i],
mlxcx_intr_n, (caddr_t)mlxp, (caddr_t)&mlxp->mlx_eqs[i]);
if (ret != DDI_SUCCESS) {
+ mlxcx_warn(mlxp, "Failed to add interrupt handler %d",
+ i);
mlxcx_intr_teardown(mlxp);
return (B_FALSE);
}
diff --git a/usr/src/uts/common/io/mlxcx/mlxcx_reg.h b/usr/src/uts/common/io/mlxcx/mlxcx_reg.h
index 1987ae06ea..4b92de92b8 100644
--- a/usr/src/uts/common/io/mlxcx/mlxcx_reg.h
+++ b/usr/src/uts/common/io/mlxcx/mlxcx_reg.h
@@ -2530,6 +2530,30 @@ typedef struct {
uint16be_t mlrd_pplm_fec_override_admin_fdr10;
} mlxcx_reg_pplm_t;
+typedef struct {
+ uint8_t mlrd_mtcap_rsvd[3];
+ uint8_t mlrd_mtcap_sensor_count;
+ uint8_t mlrd_mtcap_rsvd1[4];
+ uint64be_t mlrd_mtcap_sensor_map;
+} mlxcx_reg_mtcap_t;
+
+#define MLXCX_MTMP_NAMELEN 8
+
+typedef struct {
+ uint8_t mlrd_mtmp_rsvd[2];
+ uint16be_t mlrd_mtmp_sensor_index;
+ uint8_t mlrd_mtmp_rsvd1[2];
+ uint16be_t mlrd_mtmp_temperature;
+ bits16_t mlrd_mtmp_max_flags;
+ uint16be_t mlrd_mtmp_max_temperature;
+ bits16_t mlrd_mtmp_tee;
+ uint16be_t mlrd_mtmp_temp_thresh_hi;
+ uint8_t mlrd_mtmp_rsvd2[2];
+ uint16be_t mlrd_mtmp_temp_thresh_lo;
+ uint8_t mlrd_mtmp_rsvd3[4];
+ uint8_t mlrd_mtmp_name[MLXCX_MTMP_NAMELEN];
+} mlxcx_reg_mtmp_t;
+
typedef enum {
MLXCX_REG_PMTU = 0x5003,
MLXCX_REG_PTYS = 0x5004,
@@ -2540,6 +2564,8 @@ typedef enum {
MLXCX_REG_MCIA = 0x9014,
MLXCX_REG_PPCNT = 0x5008,
MLXCX_REG_PPLM = 0x5023,
+ MLXCX_REG_MTCAP = 0x9009,
+ MLXCX_REG_MTMP = 0x900A
} mlxcx_register_id_t;
typedef union {
@@ -2551,6 +2577,8 @@ typedef union {
mlxcx_reg_mcia_t mlrd_mcia;
mlxcx_reg_ppcnt_t mlrd_ppcnt;
mlxcx_reg_pplm_t mlrd_pplm;
+ mlxcx_reg_mtcap_t mlrd_mtcap;
+ mlxcx_reg_mtmp_t mlrd_mtmp;
} mlxcx_register_data_t;
typedef enum {
diff --git a/usr/src/uts/common/io/mlxcx/mlxcx_sensor.c b/usr/src/uts/common/io/mlxcx/mlxcx_sensor.c
new file mode 100644
index 0000000000..6d2c7d0778
--- /dev/null
+++ b/usr/src/uts/common/io/mlxcx/mlxcx_sensor.c
@@ -0,0 +1,126 @@
+/*
+ * This file and its contents are supplied under the terms of the
+ * Common Development and Distribution License ("CDDL"), version 1.0.
+ * You may only use this file in accordance with the terms of version
+ * 1.0 of the CDDL.
+ *
+ * A full copy of the text of the CDDL should have accompanied this
+ * source. A copy of the CDDL is also available via the Internet at
+ * http://www.illumos.org/license/CDDL.
+ */
+
+/*
+ * Copyright 2020 Oxide Computer Company
+ */
+
+#include <mlxcx.h>
+#include <sys/sensors.h>
+
+/*
+ * The PRM indicates that the temperature is measured in 1/8th degrees.
+ */
+#define MLXCX_TEMP_GRAN 8
+
+/*
+ * Read a single temperature sensor entry. The ksensor framework guarantees that
+ * it will only call this once for a given sensor at any time, though multiple
+ * sensors can be in parallel.
+ */
+static int
+mlxcx_temperature_read(void *arg, sensor_ioctl_scalar_t *scalar)
+{
+ boolean_t ok;
+ uint16_t tmp;
+ mlxcx_register_data_t data;
+ mlxcx_temp_sensor_t *sensor = arg;
+ mlxcx_t *mlxp = sensor->mlts_mlx;
+
+ bzero(&data, sizeof (data));
+ data.mlrd_mtmp.mlrd_mtmp_sensor_index = to_be16(sensor->mlts_index);
+ ok = mlxcx_cmd_access_register(mlxp, MLXCX_CMD_ACCESS_REGISTER_READ,
+ MLXCX_REG_MTMP, &data);
+ if (!ok) {
+ return (EIO);
+ }
+
+ tmp = from_be16(data.mlrd_mtmp.mlrd_mtmp_temperature);
+ sensor->mlts_value = (int16_t)tmp;
+ tmp = from_be16(data.mlrd_mtmp.mlrd_mtmp_max_temperature);
+ sensor->mlts_max_value = (int16_t)tmp;
+ bcopy(data.mlrd_mtmp.mlrd_mtmp_name, sensor->mlts_name,
+ sizeof (sensor->mlts_name));
+
+ scalar->sis_unit = SENSOR_UNIT_CELSIUS;
+ scalar->sis_gran = MLXCX_TEMP_GRAN;
+ scalar->sis_prec = 0;
+ scalar->sis_value = (int64_t)sensor->mlts_value;
+
+ return (0);
+}
+
+static const ksensor_ops_t mlxcx_temp_ops = {
+ .kso_kind = ksensor_kind_temperature,
+ .kso_scalar = mlxcx_temperature_read
+};
+
+void
+mlxcx_teardown_sensors(mlxcx_t *mlxp)
+{
+ if (mlxp->mlx_temp_nsensors == 0)
+ return;
+ (void) ksensor_remove(mlxp->mlx_dip, KSENSOR_ALL_IDS);
+ kmem_free(mlxp->mlx_temp_sensors, sizeof (mlxcx_temp_sensor_t) *
+ mlxp->mlx_temp_nsensors);
+}
+
+boolean_t
+mlxcx_setup_sensors(mlxcx_t *mlxp)
+{
+ mlxcx_register_data_t data;
+ boolean_t ok;
+
+ mlxp->mlx_temp_nsensors = 0;
+ bzero(&data, sizeof (data));
+ ok = mlxcx_cmd_access_register(mlxp, MLXCX_CMD_ACCESS_REGISTER_READ,
+ MLXCX_REG_MTCAP, &data);
+ if (!ok) {
+ return (B_FALSE);
+ }
+
+ if (data.mlrd_mtcap.mlrd_mtcap_sensor_count == 0) {
+ return (B_TRUE);
+ }
+
+ mlxp->mlx_temp_nsensors = data.mlrd_mtcap.mlrd_mtcap_sensor_count;
+ mlxp->mlx_temp_sensors = kmem_zalloc(sizeof (mlxcx_temp_sensor_t) *
+ mlxp->mlx_temp_nsensors, KM_SLEEP);
+
+ for (uint8_t i = 0; i < mlxp->mlx_temp_nsensors; i++) {
+ char buf[32];
+ int ret;
+
+ if (snprintf(buf, sizeof (buf), "temp%u", i) >= sizeof (buf)) {
+ mlxcx_warn(mlxp, "sensor name %u would overflow "
+ "internal buffer");
+ goto err;
+ }
+
+ mlxp->mlx_temp_sensors[i].mlts_mlx = mlxp;
+ mlxp->mlx_temp_sensors[i].mlts_index = i;
+
+ ret = ksensor_create_scalar_pcidev(mlxp->mlx_dip,
+ SENSOR_KIND_TEMPERATURE, &mlxcx_temp_ops,
+ &mlxp->mlx_temp_sensors[i], buf,
+ &mlxp->mlx_temp_sensors[i].mlts_ksensor);
+ if (ret != 0) {
+ mlxcx_warn(mlxp, "failed to create temp sensor %s: %d",
+ buf, ret);
+ goto err;
+ }
+ }
+
+ return (B_TRUE);
+err:
+ mlxcx_teardown_sensors(mlxp);
+ return (B_FALSE);
+}
diff --git a/usr/src/uts/common/io/tem.c b/usr/src/uts/common/io/tem.c
index 573e10cd66..525aa5f585 100644
--- a/usr/src/uts/common/io/tem.c
+++ b/usr/src/uts/common/io/tem.c
@@ -524,10 +524,41 @@ tems_check_videomode(struct vis_devinit *tp)
}
static void
-tems_setup_terminal(struct vis_devinit *tp, size_t height, size_t width)
+tems_setup_font(screen_size_t height, screen_size_t width)
{
bitmap_data_t *font_data;
int i;
+
+ /*
+ * set_font() will select an appropriate sized font for
+ * the number of rows and columns selected. If we don't
+ * have a font that will fit, then it will use the
+ * default builtin font and adjust the rows and columns
+ * to fit on the screen.
+ */
+ font_data = set_font(&tems.ts_c_dimension.height,
+ &tems.ts_c_dimension.width, height, width);
+
+ /*
+ * To use loaded font, we assign the loaded font data to tems.ts_font.
+ * In case of next load, the previously loaded data is freed
+ * when loading the new font.
+ */
+ for (i = 0; i < VFNT_MAPS; i++) {
+ tems.ts_font.vf_map[i] =
+ font_data->font->vf_map[i];
+ tems.ts_font.vf_map_count[i] =
+ font_data->font->vf_map_count[i];
+ }
+
+ tems.ts_font.vf_bytes = font_data->font->vf_bytes;
+ tems.ts_font.vf_width = font_data->font->vf_width;
+ tems.ts_font.vf_height = font_data->font->vf_height;
+}
+
+static void
+tems_setup_terminal(struct vis_devinit *tp, size_t height, size_t width)
+{
int old_blank_buf_size = tems.ts_c_dimension.width *
sizeof (*tems.ts_blank_line);
@@ -546,6 +577,9 @@ tems_setup_terminal(struct vis_devinit *tp, size_t height, size_t width)
tems.ts_c_dimension.height = tp->height;
tems.ts_callbacks = &tem_safe_text_callbacks;
+ tems_setup_font(16 * tp->height + BORDER_PIXELS,
+ 8 * tp->width + BORDER_PIXELS);
+
break;
case VIS_PIXEL:
@@ -559,33 +593,11 @@ tems_setup_terminal(struct vis_devinit *tp, size_t height, size_t width)
}
tems.ts_c_dimension.height = (screen_size_t)height;
tems.ts_c_dimension.width = (screen_size_t)width;
-
tems.ts_p_dimension.height = tp->height;
tems.ts_p_dimension.width = tp->width;
-
tems.ts_callbacks = &tem_safe_pix_callbacks;
- /*
- * set_font() will select a appropriate sized font for
- * the number of rows and columns selected. If we don't
- * have a font that will fit, then it will use the
- * default builtin font. set_font() will adjust the rows
- * and columns to fit on the screen.
- */
- font_data = set_font(&tems.ts_c_dimension.height,
- &tems.ts_c_dimension.width,
- tems.ts_p_dimension.height,
- tems.ts_p_dimension.width);
-
- for (i = 0; i < VFNT_MAPS; i++) {
- tems.ts_font.vf_map[i] =
- font_data->font->vf_map[i];
- tems.ts_font.vf_map_count[i] =
- font_data->font->vf_map_count[i];
- }
- tems.ts_font.vf_bytes = font_data->font->vf_bytes;
- tems.ts_font.vf_width = font_data->font->vf_width;
- tems.ts_font.vf_height = font_data->font->vf_height;
+ tems_setup_font(tp->height, tp->width);
tems.ts_p_offset.y = (tems.ts_p_dimension.height -
(tems.ts_c_dimension.height * tems.ts_font.vf_height)) / 2;
@@ -594,9 +606,7 @@ tems_setup_terminal(struct vis_devinit *tp, size_t height, size_t width)
tems.ts_pix_data_size =
tems.ts_font.vf_width * tems.ts_font.vf_height;
-
tems.ts_pix_data_size *= 4;
-
tems.ts_pdepth = tp->depth;
break;
@@ -963,6 +973,7 @@ tems_get_initial_color(tem_color_t *pcolor)
if (inverse_screen)
flags |= TEM_ATTR_SCREEN_REVERSE;
+#ifdef _HAVE_TEM_FIRMWARE
if (flags != 0) {
/*
* If either reverse flag is set, the screen is in
@@ -980,6 +991,21 @@ tems_get_initial_color(tem_color_t *pcolor)
if (pcolor->bg_color == ANSI_COLOR_WHITE)
flags |= TEM_ATTR_BRIGHT_BG;
}
+#else
+ if (flags != 0) {
+ if (pcolor->fg_color == ANSI_COLOR_WHITE)
+ flags |= TEM_ATTR_BRIGHT_BG;
+
+ if (pcolor->fg_color == ANSI_COLOR_BLACK)
+ flags &= ~TEM_ATTR_BRIGHT_BG;
+ } else {
+ /*
+ * In case of black on white we want bright white for BG.
+ */
+ if (pcolor->bg_color == ANSI_COLOR_WHITE)
+ flags |= TEM_ATTR_BRIGHT_BG;
+ }
+#endif
pcolor->a_flags = flags;
}
diff --git a/usr/src/uts/common/io/tem_safe.c b/usr/src/uts/common/io/tem_safe.c
index 5008d4a4d6..8d47a00d5f 100644
--- a/usr/src/uts/common/io/tem_safe.c
+++ b/usr/src/uts/common/io/tem_safe.c
@@ -129,9 +129,12 @@ static void tem_safe_copy_area(struct tem_vt_state *tem,
screen_pos_t e_col, screen_pos_t e_row,
screen_pos_t t_col, screen_pos_t t_row,
cred_t *credp, enum called_from called_from);
+#if 0
+/* Currently unused */
static void tem_safe_image_display(struct tem_vt_state *, uchar_t *,
int, int, screen_pos_t, screen_pos_t,
cred_t *, enum called_from);
+#endif
static void tem_safe_bell(struct tem_vt_state *tem,
enum called_from called_from);
static void tem_safe_pix_clear_prom_output(struct tem_vt_state *tem,
@@ -1568,6 +1571,7 @@ tem_safe_text_display(struct tem_vt_state *tem, term_char_t *string,
}
}
+#if 0
/*
* This function is used to blit a rectangular color image,
* unperturbed on the underlying framebuffer, to render
@@ -1600,6 +1604,7 @@ tem_safe_image_display(struct tem_vt_state *tem, uchar_t *image,
mutex_exit(&tem->tvs_lock);
mutex_exit(&tems.ts_lock);
}
+#endif
/*ARGSUSED*/
void
@@ -2385,12 +2390,22 @@ tem_safe_get_attr(struct tem_vt_state *tem, text_color_t *fg,
static void
tem_safe_get_color(text_color_t *fg, text_color_t *bg, term_char_t c)
{
+ boolean_t bold_font;
+
*fg = c.tc_fg_color;
*bg = c.tc_bg_color;
+ bold_font = tems.ts_font.vf_map_count[VFNT_MAP_BOLD] != 0;
+
+ /*
+ * If we have both normal and bold font components,
+ * we use bold font for TEM_ATTR_BOLD.
+ * The bright color is traditionally used with TEM_ATTR_BOLD,
+ * in case there is no bold font.
+ */
if (c.tc_fg_color < XLATE_NCOLORS) {
- if (TEM_ATTR_ISSET(c.tc_char,
- TEM_ATTR_BRIGHT_FG | TEM_ATTR_BOLD))
+ if (TEM_ATTR_ISSET(c.tc_char, TEM_ATTR_BRIGHT_FG) ||
+ (TEM_ATTR_ISSET(c.tc_char, TEM_ATTR_BOLD) && !bold_font))
*fg = brt_xlate[c.tc_fg_color];
else
*fg = dim_xlate[c.tc_fg_color];
diff --git a/usr/src/uts/common/io/usb/usba/hubdi.c b/usr/src/uts/common/io/usb/usba/hubdi.c
index 99d75edce3..5207a51490 100644
--- a/usr/src/uts/common/io/usb/usba/hubdi.c
+++ b/usr/src/uts/common/io/usb/usba/hubdi.c
@@ -55,48 +55,45 @@ extern boolean_t consconfig_console_is_ready(void);
/*
* Prototypes for static functions
*/
-static int usba_hubdi_bus_ctl(
- dev_info_t *dip,
- dev_info_t *rdip,
- ddi_ctl_enum_t op,
- void *arg,
- void *result);
-
-static int usba_hubdi_map_fault(
- dev_info_t *dip,
- dev_info_t *rdip,
- struct hat *hat,
- struct seg *seg,
- caddr_t addr,
- struct devpage *dp,
- pfn_t pfn,
- uint_t prot,
- uint_t lock);
+static int usba_hubdi_bus_ctl(dev_info_t *dip,
+ dev_info_t *rdip,
+ ddi_ctl_enum_t op,
+ void *arg,
+ void *result);
+
+static int usba_hubdi_map_fault(dev_info_t *dip,
+ dev_info_t *rdip,
+ struct hat *hat,
+ struct seg *seg,
+ caddr_t addr,
+ struct devpage *dp,
+ pfn_t pfn,
+ uint_t prot,
+ uint_t lock);
static int hubd_busop_get_eventcookie(dev_info_t *dip,
- dev_info_t *rdip,
- char *eventname,
- ddi_eventcookie_t *cookie);
+ dev_info_t *rdip,
+ char *eventname,
+ ddi_eventcookie_t *cookie);
static int hubd_busop_add_eventcall(dev_info_t *dip,
- dev_info_t *rdip,
- ddi_eventcookie_t cookie,
- void (*callback)(dev_info_t *dip,
- ddi_eventcookie_t cookie, void *arg,
- void *bus_impldata),
- void *arg, ddi_callback_id_t *cb_id);
+ dev_info_t *rdip,
+ ddi_eventcookie_t cookie,
+ void (*callback)(dev_info_t *dip, ddi_eventcookie_t cookie, void *arg,
+ void *bus_impldata),
+ void *arg, ddi_callback_id_t *cb_id);
static int hubd_busop_remove_eventcall(dev_info_t *dip,
- ddi_callback_id_t cb_id);
+ ddi_callback_id_t cb_id);
static int hubd_bus_config(dev_info_t *dip,
- uint_t flag,
- ddi_bus_config_op_t op,
- void *arg,
- dev_info_t **child);
+ uint_t flag,
+ ddi_bus_config_op_t op,
+ void *arg,
+ dev_info_t **child);
static int hubd_bus_unconfig(dev_info_t *dip,
- uint_t flag,
- ddi_bus_config_op_t op,
- void *arg);
+ uint_t flag,
+ ddi_bus_config_op_t op,
+ void *arg);
static int hubd_bus_power(dev_info_t *dip, void *impl_arg,
- pm_bus_power_op_t op, void *arg, void *result);
+ pm_bus_power_op_t op, void *arg, void *result);
static usb_port_t hubd_get_port_num(hubd_t *, struct devctl_iocdata *);
static dev_info_t *hubd_get_child_dip(hubd_t *, usb_port_t);
@@ -251,14 +248,14 @@ usba_hubdi_unregister(dev_info_t *dip)
/*ARGSUSED*/
static int
usba_hubdi_map_fault(dev_info_t *dip,
- dev_info_t *rdip,
- struct hat *hat,
- struct seg *seg,
- caddr_t addr,
- struct devpage *dp,
- pfn_t pfn,
- uint_t prot,
- uint_t lock)
+ dev_info_t *rdip,
+ struct hat *hat,
+ struct seg *seg,
+ caddr_t addr,
+ struct devpage *dp,
+ pfn_t pfn,
+ uint_t prot,
+ uint_t lock)
{
return (DDI_FAILURE);
}
@@ -269,9 +266,9 @@ usba_hubdi_map_fault(dev_info_t *dip,
*/
int
usba_hubdi_bind_root_hub(dev_info_t *dip,
- uchar_t *root_hub_config_descriptor,
- size_t config_length,
- usb_dev_descr_t *root_hub_device_descriptor)
+ uchar_t *root_hub_config_descriptor,
+ size_t config_length,
+ usb_dev_descr_t *root_hub_device_descriptor)
{
usba_device_t *usba_device;
usba_hcdi_t *hcdi = usba_hcdi_get_hcdi(dip);
@@ -1145,10 +1142,10 @@ hubd_post_power(hubd_t *hubd, usb_port_t port, pm_bp_child_pwrchg_t *bpc,
*/
static int
usba_hubdi_bus_ctl(dev_info_t *dip,
- dev_info_t *rdip,
- ddi_ctl_enum_t op,
- void *arg,
- void *result)
+ dev_info_t *rdip,
+ ddi_ctl_enum_t op,
+ void *arg,
+ void *result)
{
usba_device_t *hub_usba_device = usba_get_usba_device(rdip);
dev_info_t *root_hub_dip = hub_usba_device->usb_root_hub_dip;
@@ -1294,7 +1291,7 @@ usba_hubdi_bus_ctl(dev_info_t *dip,
/*
* hubd_config_one:
- * enumerate one child according to 'port'
+ * enumerate one child according to 'port'
*/
static boolean_t
@@ -2625,8 +2622,7 @@ hubd_restore_device_state(dev_info_t *dip, hubd_t *hubd)
/*
* wait at least 3 frames before accessing devices
- * (note that delay's minimal time is one clock tick which
- * is 10ms unless hires_tick has been changed)
+ * (note that delay's minimal time is one clock tick).
*/
mutex_exit(HUBD_MUTEX(hubd));
delay(drv_usectohz(10000));
@@ -3331,8 +3327,8 @@ hubd_set_hub_depth(hubd_t *hubd)
int rval;
usb_cr_t completion_reason;
usb_cb_flags_t cb_flags;
- usba_device_t *ud;
- uint16_t depth;
+ usba_device_t *ud;
+ uint16_t depth;
/*
* We only need to set the hub depth devices for hubs that are at least
@@ -6044,7 +6040,7 @@ hubd_ready_device(hubd_t *hubd, dev_info_t *child_dip, usba_device_t *child_ud,
child_ud->usb_active_cfg_ndx = config_index;
child_ud->usb_cfg = child_ud->usb_cfg_array[config_index];
child_ud->usb_cfg_length = config_descriptor.wTotalLength;
- child_ud->usb_cfg_value = config_descriptor.bConfigurationValue;
+ child_ud->usb_cfg_value = config_descriptor.bConfigurationValue;
child_ud->usb_n_ifs = config_descriptor.bNumInterfaces;
child_ud->usb_dip = child_dip;
@@ -6089,11 +6085,11 @@ hubd_ready_device(hubd_t *hubd, dev_info_t *child_dip, usba_device_t *child_ud,
*/
static int
hubd_create_child(dev_info_t *dip,
- hubd_t *hubd,
- usba_device_t *hubd_ud,
- usb_port_status_t port_status,
- usb_port_t port,
- int iteration)
+ hubd_t *hubd,
+ usba_device_t *hubd_ud,
+ usb_port_status_t port_status,
+ usb_port_t port,
+ int iteration)
{
dev_info_t *child_dip = NULL;
usb_dev_descr_t usb_dev_descr;
@@ -6869,9 +6865,9 @@ hubd_free_usba_device(hubd_t *hubd, usba_device_t *usba_device)
*/
static int
hubd_busop_get_eventcookie(dev_info_t *dip,
- dev_info_t *rdip,
- char *eventname,
- ddi_eventcookie_t *cookie)
+ dev_info_t *rdip,
+ char *eventname,
+ ddi_eventcookie_t *cookie)
{
hubd_t *hubd = (hubd_t *)hubd_get_soft_state(dip);
@@ -6891,12 +6887,11 @@ hubd_busop_get_eventcookie(dev_info_t *dip,
static int
hubd_busop_add_eventcall(dev_info_t *dip,
- dev_info_t *rdip,
- ddi_eventcookie_t cookie,
- void (*callback)(dev_info_t *dip,
- ddi_eventcookie_t cookie, void *arg,
- void *bus_impldata),
- void *arg, ddi_callback_id_t *cb_id)
+ dev_info_t *rdip,
+ ddi_eventcookie_t cookie,
+ void (*callback)(dev_info_t *dip, ddi_eventcookie_t cookie, void *arg,
+ void *bus_impldata),
+ void *arg, ddi_callback_id_t *cb_id)
{
hubd_t *hubd = (hubd_t *)hubd_get_soft_state(dip);
usb_port_t port = hubd_child_dip2port(hubd, rdip);
@@ -7671,7 +7666,7 @@ usba_hubdi_open(dev_info_t *dip, dev_t *devp, int flags, int otyp,
/* ARGSUSED */
int
usba_hubdi_close(dev_info_t *dip, dev_t dev, int flag, int otyp,
- cred_t *credp)
+ cred_t *credp)
{
hubd_t *hubd;