|
@@ -276,6 +276,19 @@ static int scsi_bus_match(struct device *dev, struct device_driver *gendrv)
|
|
|
return (sdp->inq_periph_qual == SCSI_INQ_PQ_CON)? 1: 0;
|
|
|
}
|
|
|
|
|
|
+static int scsi_bus_uevent(struct device *dev, char **envp, int num_envp,
|
|
|
+ char *buffer, int buffer_size)
|
|
|
+{
|
|
|
+ struct scsi_device *sdev = to_scsi_device(dev);
|
|
|
+ int i = 0;
|
|
|
+ int length = 0;
|
|
|
+
|
|
|
+ add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &length,
|
|
|
+ "MODALIAS=" SCSI_DEVICE_MODALIAS_FMT, sdev->type);
|
|
|
+ envp[i] = NULL;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int scsi_bus_suspend(struct device * dev, pm_message_t state)
|
|
|
{
|
|
|
struct device_driver *drv = dev->driver;
|
|
@@ -331,6 +344,7 @@ static int scsi_bus_resume(struct device * dev)
|
|
|
struct bus_type scsi_bus_type = {
|
|
|
.name = "scsi",
|
|
|
.match = scsi_bus_match,
|
|
|
+ .uevent = scsi_bus_uevent,
|
|
|
.suspend = scsi_bus_suspend,
|
|
|
.resume = scsi_bus_resume,
|
|
|
};
|
|
@@ -558,6 +572,14 @@ show_sdev_iostat(iorequest_cnt);
|
|
|
show_sdev_iostat(iodone_cnt);
|
|
|
show_sdev_iostat(ioerr_cnt);
|
|
|
|
|
|
+static ssize_t
|
|
|
+sdev_show_modalias(struct device *dev, struct device_attribute *attr, char *buf)
|
|
|
+{
|
|
|
+ struct scsi_device *sdev;
|
|
|
+ sdev = to_scsi_device(dev);
|
|
|
+ return snprintf (buf, 20, SCSI_DEVICE_MODALIAS_FMT "\n", sdev->type);
|
|
|
+}
|
|
|
+static DEVICE_ATTR(modalias, S_IRUGO, sdev_show_modalias, NULL);
|
|
|
|
|
|
/* Default template for device attributes. May NOT be modified */
|
|
|
static struct device_attribute *scsi_sysfs_sdev_attrs[] = {
|
|
@@ -577,6 +599,7 @@ static struct device_attribute *scsi_sysfs_sdev_attrs[] = {
|
|
|
&dev_attr_iorequest_cnt,
|
|
|
&dev_attr_iodone_cnt,
|
|
|
&dev_attr_ioerr_cnt,
|
|
|
+ &dev_attr_modalias,
|
|
|
NULL
|
|
|
};
|
|
|
|