[5/13] Add support for the S/390 ccw bus.
Cornelia Huck
cohuck at de.ibm.com
Mon Jun 27 02:19:46 PDT 2005
[5/13] Add support for the S/390 ccw bus.
The ccw bus on s390 contains all classic channel-attached devices.
They all have a few common properties, but also driver-specific ones.
physdev.c | 168 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 167 insertions(+), 1 deletion(-)
Index: hald/linux2/physdev.c
===================================================================
RCS file: /cvs/hal/hal/hald/linux2/physdev.c,v
retrieving revision 1.16
diff -u -r1.16 physdev.c
--- hald/linux2/physdev.c 25 Mar 2005 03:24:51 -0000 1.16
+++ hald/linux2/physdev.c 23 Jun 2005 13:59:57 -0000
@@ -841,6 +841,163 @@
/*--------------------------------------------------------------------------------------------------------------*/
+static inline void
+ccw_add_dasd_properties (HalDevice *d, const gchar *sysfs_path)
+{
+ const gchar *disc;
+
+ hal_util_set_int_from_file (d, "ccw.dasd.use_diag", sysfs_path,
+ "use_diag", 2);
+ hal_util_set_int_from_file (d, "ccw.dasd.readonly", sysfs_path,
+ "readonly", 2);
+ disc = hal_util_get_string_from_file (sysfs_path, "discipline");
+ if (disc)
+ hal_device_property_set_string(d, "ccw.dasd.discipline", disc);
+}
+
+static inline void
+ccw_add_zfcp_properties (HalDevice *d, const gchar *sysfs_path)
+{
+ int online;
+
+ /* zfcp adapter properties are only valid for online devices. */
+ if (!hal_util_get_int_from_file (sysfs_path, "online", &online, 2))
+ return;
+ if (!online)
+ return;
+
+ hal_util_set_int_from_file (d, "ccw.zfcp.in_recovery", sysfs_path,
+ "in_recovery", 2);
+ hal_util_set_int_from_file (d, "ccw.zfcp.failed", sysfs_path,
+ "failed", 2);
+}
+
+static inline void
+ccw_add_tape_properties (HalDevice *d, const gchar *sysfs_path)
+{
+ int medium_state, online;
+
+ const gchar *state_text[3] = {"unknown", "loaded", "no medium"};
+
+ hal_util_set_string_from_file (d, "ccw.tape.state", sysfs_path, "state");
+ hal_util_set_string_from_file (d, "ccw.tape.operation", sysfs_path,
+ "operation");
+ /* The following properties are only valid for online devices. */
+ if (!hal_util_get_int_from_file (sysfs_path, "online", &online, 2))
+ return;
+ if (!online)
+ return;
+ hal_util_set_int_from_file (d, "ccw.tape.blocksize", sysfs_path,
+ "blocksize", 10);
+ if (!hal_util_get_int_from_file (sysfs_path, "medium_state",
+ &medium_state, 10))
+ return;
+ hal_device_property_set_string (d, "tape.ccw.medium_state",
+ state_text[medium_state]);
+}
+
+static inline void
+ccw_add_3270_properties (HalDevice *d, const gchar *sysfs_path)
+{
+ hal_util_set_int_from_file (d, "ccw.3270.model", sysfs_path,
+ "model", 10);
+ hal_util_set_int_from_file (d, "ccw.3270.rows", sysfs_path, "rows", 10);
+ hal_util_set_int_from_file (d, "ccw.3270.columns", sysfs_path,
+ "columns", 10);
+}
+
+static HalDevice *
+ccw_add (const gchar *sysfs_path, HalDevice *parent)
+{
+ HalDevice *d;
+ const gchar *bus_id;
+ const gchar *pimpampom;
+ int pim, pam, pom;
+ const gchar *chpids;
+ int chpid[8];
+ gchar attr[25];
+ int i;
+ gchar driver_name[256];
+
+ bus_id = hal_util_get_last_element (sysfs_path);
+
+ d = hal_device_new ();
+ hal_device_property_set_string (d, "linux.sysfs_path", sysfs_path);
+ hal_device_property_set_string (d, "linux.sysfs_path_device",
+ sysfs_path);
+ hal_device_property_set_string (d, "info.bus", "ccw");
+ if (parent != NULL)
+ hal_device_property_set_string (d, "info.parent", parent->udi);
+ else
+ hal_device_property_set_string
+ (d, "info.parent",
+ "/org/freedesktop/Hal/devices/computer");
+
+ hal_util_set_driver (d, "info.linux.driver", sysfs_path);
+
+ hal_device_property_set_string (d, "ccw.bus_id", bus_id);
+ hal_util_set_int_from_file (d, "ccw.online", sysfs_path, "online", 2);
+ hal_util_set_string_from_file (d, "ccw.availablity", sysfs_path,
+ "availability");
+ hal_util_set_int_from_file (d, "ccw.cmb_enable", sysfs_path,
+ "cmb_enable", 2);
+ hal_util_set_string_from_file (d, "ccw.cutype", sysfs_path, "cutype");
+ hal_util_set_string_from_file (d, "ccw.devtype", sysfs_path, "devtype");
+
+ /* Get some values from the higher level subchannel structure.*/
+ pimpampom = hal_util_get_string_from_file (sysfs_path, "../pimpampom");
+ if (pimpampom) {
+ sscanf (pimpampom, "%x %x %x", &pim, &pam, &pom);
+ hal_device_property_set_int (d, "ccw.subchannel.pim", pim);
+ hal_device_property_set_int (d, "ccw.subchannel.pam", pam);
+ hal_device_property_set_int (d, "ccw.subchannel.pom", pom);
+ }
+
+ chpids = hal_util_get_string_from_file (sysfs_path, "../chpids");
+ if (chpids) {
+ sscanf (chpids, "%x %x %x %x %x %x %x %x", &chpid[0], &chpid[1],
+ &chpid[2], &chpid[3], &chpid[4], &chpid[5], &chpid[6],
+ &chpid[7]);
+ for (i=0; i<8 && (chpid[i] != 0); i++) {
+ g_snprintf (attr, sizeof (attr),
+ "ccw.subchannel.chpid%x", i);
+ hal_device_property_set_int (d, attr, chpid[i]);
+ }
+ }
+
+ /* Add some special properties. */
+ if (hal_util_get_driver_name (sysfs_path, driver_name)) {
+ if (!strncmp (driver_name, "dasd", 4))
+ /* Same attributes for dasd_eckd and dasd_fba. */
+ ccw_add_dasd_properties (d, sysfs_path);
+ if (!strncmp (driver_name, "zfcp", 4))
+ ccw_add_zfcp_properties (d, sysfs_path);
+ if (!strncmp (driver_name, "tape_3", 6))
+ /* For all channel attached tapes. */
+ ccw_add_tape_properties (d, sysfs_path);
+ if (!strncmp (driver_name, "3270", 4))
+ ccw_add_3270_properties (d, sysfs_path);
+ }
+ return d;
+}
+
+static gboolean
+ccw_compute_udi (HalDevice *d)
+{
+ gchar udi[256];
+
+ hal_util_compute_udi (hald_get_gdl (), udi, sizeof (udi),
+ "/org/freedesktop/Hal/devices/ccw_%s",
+ hal_device_property_get_string
+ (d, "ccw.bus_id"));
+ hal_device_set_udi (d, udi);
+ hal_device_property_set_string (d, "info.udi", udi);
+ return TRUE;
+
+}
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
static gboolean
physdev_remove (HalDevice *d)
{
@@ -919,7 +1278,15 @@
.compute_udi = ieee1394_compute_udi,
.remove = physdev_remove
};
-
+
+
+/* s390 specific busses */
+static PhysDevHandler physdev_handler_ccw = {
+ .subsystem = "ccw",
+ .add = ccw_add,
+ .compute_udi = ccw_compute_udi,
+ .remove = physdev_remove
+};
static PhysDevHandler *phys_handlers[] = {
&physdev_handler_pci,
@@ -931,6 +1312,7 @@
&physdev_handler_scsi,
&physdev_handler_mmc,
&physdev_handler_ieee1394,
+ &physdev_handler_ccw,
NULL
};
_______________________________________________
hal mailing list
hal at lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/hal
More information about the Hal
mailing list