Gregor Best | 23 May 2012 17:22
Picon
Gravatar

Re: wpi: add sensor for rfkill

On Wed, May 23, 2012 at 09:12:20AM +0200, Tobias Ulmer wrote:
> [...]
> This a read-only sensor, it has no effect on misbehaving
> hardware as far as I can tell.
> [...]

That is right. If I recall correctly, the very reason for introducing real hardware killswitches was so
that the OS could not
interfere with and override the kill switch in case the device needs to operate in RF-sensitive environments.

> [...]
> Gregor: try adding '-p' to cvs diff
> [...]

Thanks for the hint. An updated patch is attached.

-- 
    Gregor Best
Index: dev/pci/if_wpi.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_wpi.c,v
retrieving revision 1.110
diff -u -p -r1.110 if_wpi.c
--- dev/pci/if_wpi.c	2 Jun 2011 18:36:53 -0000	1.110
+++ dev/pci/if_wpi.c	23 May 2012 15:17:34 -0000
 <at>  <at>  -33,6 +33,9  <at>  <at> 
 #include <sys/conf.h>
 #include <sys/device.h>
 #include <sys/workq.h>
+#ifndef SMALL_KERNEL
+#include <sys/sensors.h>
+#endif

 #include <machine/bus.h>
 #include <machine/endian.h>
 <at>  <at>  -149,6 +152,9  <at>  <at>  void		wpi_hw_stop(struct wpi_softc *);
 int		wpi_init(struct ifnet *);
 void		wpi_stop(struct ifnet *, int);

+#ifndef SMALL_KERNEL
+void wpi_sensor_refresh(void *);
+#endif
 #ifdef WPI_DEBUG
 #define DPRINTF(x)	do { if (wpi_debug > 0) printf x; } while (0)
 #define DPRINTFN(n, x)	do { if (wpi_debug >= (n)) printf x; } while (0)
 <at>  <at>  -326,6 +332,19  <at>  <at>  wpi_attach(struct device *parent, struct
 	wpi_radiotap_attach(sc);
 #endif
 	timeout_set(&sc->calib_to, wpi_calib_timeout, sc);
+
+#ifndef SMALL_KERNEL
+	strlcpy(sc->sc_sensor.desc, "Radio enabled", sizeof("Radio enabled"));
+	sc->sc_sensor.type = SENSOR_INDICATOR;
+	sc->sc_sensor.status = SENSOR_S_UNSPEC;
+
+	strlcpy(sc->sc_sensordev.xname, sc->sc_dev.dv_xname, sizeof(sc->sc_sensordev.xname));
+	sensordev_install(&sc->sc_sensordev);
+	sensor_attach(&sc->sc_sensordev, &sc->sc_sensor);
+	if (sc->sc_sensor_task == NULL)
+		sc->sc_sensor_task = sensor_task_register(sc, wpi_sensor_refresh, 10);
+#endif
+
 	return;

 	/* Free allocated memory if something failed during attachment. */
 <at>  <at>  -380,6 +399,12  <at>  <at>  wpi_detach(struct device *self, int flag
 	ieee80211_ifdetach(ifp);
 	if_detach(ifp);

+#ifndef SMALL_KERNEL
+	sensor_detach(&sc->sc_sensordev, &sc->sc_sensor);
+	if (sc->sc_sensor_task != NULL)
+		sensor_task_unregister(sc->sc_sensor_task);
+	sensordev_deinstall(&sc->sc_sensordev);
+#endif
 	return 0;
 }

 <at>  <at>  -489,6 +514,15  <at>  <at>  wpi_prph_write_region_4(struct wpi_softc
 	for (; count > 0; count--, data++, addr += 4)
 		wpi_prph_write(sc, addr, *data);
 }
+
+#ifndef SMALL_KERNEL
+void
+wpi_sensor_refresh(void *arg)
+{
+	struct wpi_softc *sc = arg;
+	sc->sc_sensor.value = wpi_prph_read(sc, WPI_APMG_RFKILL) & 1;
+}
+#endif

 static __inline uint32_t
 wpi_mem_read(struct wpi_softc *sc, uint32_t addr)
Index: dev/pci/if_wpivar.h
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_wpivar.h,v
retrieving revision 1.23
diff -u -p -r1.23 if_wpivar.h
--- dev/pci/if_wpivar.h	7 Sep 2010 16:21:45 -0000	1.23
+++ dev/pci/if_wpivar.h	23 May 2012 15:17:35 -0000
 <at>  <at>  -199,4 +199,7  <at>  <at>  struct wpi_softc {
 #define sc_txtap	sc_txtapu.th
 	int			sc_txtap_len;
 #endif
+	struct ksensor sc_sensor;
+	struct ksensordev sc_sensordev;
+	struct sensor_task *sc_sensor_task;
 };


Gmane