[S390] set modalias for ccw bus uevents.

Add the MODALIAS environment variable for ccw bus uevents.

Signed-off-by: Peter Oberparleiter <peter.oberparleiter@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
Peter Oberparleiter 2006-09-20 15:59:49 +02:00 committed by Martin Schwidefsky
parent 250b2dc833
commit db0c2d5908

View File

@ -52,53 +52,81 @@ ccw_bus_match (struct device * dev, struct device_driver * drv)
return 1; return 1;
} }
/* /* Store modalias string delimited by prefix/suffix string into buffer with
* Hotplugging interface for ccw devices. * specified size. Return length of resulting string (excluding trailing '\0')
* Heavily modeled on pci and usb hotplug. * even if string doesn't fit buffer (snprintf semantics). */
*/ static int snprint_alias(char *buf, size_t size, const char *prefix,
static int struct ccw_device_id *id, const char *suffix)
ccw_uevent (struct device *dev, char **envp, int num_envp, {
char *buffer, int buffer_size) int len;
len = snprintf(buf, size, "%sccw:t%04Xm%02X", prefix, id->cu_type,
id->cu_model);
if (len > size)
return len;
buf += len;
size -= len;
if (id->dev_type != 0)
len += snprintf(buf, size, "dt%04Xdm%02X%s", id->dev_type,
id->dev_model, suffix);
else
len += snprintf(buf, size, "dtdm%s", suffix);
return len;
}
/* Set up environment variables for ccw device uevent. Return 0 on success,
* non-zero otherwise. */
static int ccw_uevent(struct device *dev, char **envp, int num_envp,
char *buffer, int buffer_size)
{ {
struct ccw_device *cdev = to_ccwdev(dev); struct ccw_device *cdev = to_ccwdev(dev);
struct ccw_device_id *id = &(cdev->id);
int i = 0; int i = 0;
int length = 0; int len;
if (!cdev) /* CU_TYPE= */
return -ENODEV; len = snprintf(buffer, buffer_size, "CU_TYPE=%04X", id->cu_type) + 1;
if (len > buffer_size || i >= num_envp)
/* what we want to pass to /sbin/hotplug */
envp[i++] = buffer;
length += scnprintf(buffer, buffer_size - length, "CU_TYPE=%04X",
cdev->id.cu_type);
if ((buffer_size - length <= 0) || (i >= num_envp))
return -ENOMEM; return -ENOMEM;
++length;
buffer += length;
envp[i++] = buffer; envp[i++] = buffer;
length += scnprintf(buffer, buffer_size - length, "CU_MODEL=%02X", buffer += len;
cdev->id.cu_model); buffer_size -= len;
if ((buffer_size - length <= 0) || (i >= num_envp))
/* CU_MODEL= */
len = snprintf(buffer, buffer_size, "CU_MODEL=%02X", id->cu_model) + 1;
if (len > buffer_size || i >= num_envp)
return -ENOMEM; return -ENOMEM;
++length; envp[i++] = buffer;
buffer += length; buffer += len;
buffer_size -= len;
/* The next two can be zero, that's ok for us */ /* The next two can be zero, that's ok for us */
envp[i++] = buffer; /* DEV_TYPE= */
length += scnprintf(buffer, buffer_size - length, "DEV_TYPE=%04X", len = snprintf(buffer, buffer_size, "DEV_TYPE=%04X", id->dev_type) + 1;
cdev->id.dev_type); if (len > buffer_size || i >= num_envp)
if ((buffer_size - length <= 0) || (i >= num_envp))
return -ENOMEM; return -ENOMEM;
++length; envp[i++] = buffer;
buffer += length; buffer += len;
buffer_size -= len;
envp[i++] = buffer; /* DEV_MODEL= */
length += scnprintf(buffer, buffer_size - length, "DEV_MODEL=%02X", len = snprintf(buffer, buffer_size, "DEV_MODEL=%02X",
cdev->id.dev_model); (unsigned char) id->dev_model) + 1;
if ((buffer_size - length <= 0) || (i >= num_envp)) if (len > buffer_size || i >= num_envp)
return -ENOMEM; return -ENOMEM;
envp[i++] = buffer;
buffer += len;
buffer_size -= len;
/* MODALIAS= */
len = snprint_alias(buffer, buffer_size, "MODALIAS=", id, "") + 1;
if (len > buffer_size || i >= num_envp)
return -ENOMEM;
envp[i++] = buffer;
buffer += len;
buffer_size -= len;
envp[i] = NULL; envp[i] = NULL;
@ -251,16 +279,11 @@ modalias_show (struct device *dev, struct device_attribute *attr, char *buf)
{ {
struct ccw_device *cdev = to_ccwdev(dev); struct ccw_device *cdev = to_ccwdev(dev);
struct ccw_device_id *id = &(cdev->id); struct ccw_device_id *id = &(cdev->id);
int ret; int len;
ret = sprintf(buf, "ccw:t%04Xm%02X", len = snprint_alias(buf, PAGE_SIZE, "", id, "\n") + 1;
id->cu_type, id->cu_model);
if (id->dev_type != 0) return len > PAGE_SIZE ? PAGE_SIZE : len;
ret += sprintf(buf + ret, "dt%04Xdm%02X\n",
id->dev_type, id->dev_model);
else
ret += sprintf(buf + ret, "dtdm\n");
return ret;
} }
static ssize_t static ssize_t