Enable device class group attributes in the LinuxKPI.

Bump the __FreeBSD_version to force recompilation of
external kernel modules due to structure change.

Differential Revision:	https://reviews.freebsd.org/D21564
Submitted by:	Greg V <greg@unrelenting.technology>
MFC after:	1 week
Sponsored by:	Mellanox Technologies
This commit is contained in:
hselasky 2019-11-04 14:19:09 +00:00
parent 7f3607ae6e
commit 6698b2cae6
3 changed files with 23 additions and 4 deletions

View File

@ -54,6 +54,7 @@ struct class {
struct kobject kobj;
devclass_t bsdclass;
const struct dev_pm_ops *pm;
const struct attribute_group **dev_groups;
void (*class_release)(struct class *class);
void (*dev_release)(struct device *dev);
char * (*devnode)(struct device *dev, umode_t *mode);
@ -424,6 +425,8 @@ done:
kobject_init(&dev->kobj, &linux_dev_ktype);
kobject_add(&dev->kobj, &dev->class->kobj, dev_name(dev));
sysfs_create_groups(&dev->kobj, dev->class->dev_groups);
return (0);
}
@ -432,6 +435,8 @@ device_unregister(struct device *dev)
{
device_t bsddev;
sysfs_remove_groups(&dev->kobj, dev->class->dev_groups);
bsddev = dev->bsddev;
dev->bsddev = NULL;

View File

@ -62,12 +62,13 @@ struct attribute_group {
#define ATTRIBUTE_GROUPS(_name) \
static struct attribute_group _name##_group = { \
.name = __stringify(_name), \
.attrs = _name##_attrs, \
}; \
static struct attribute_group *_name##_groups[] = { \
static const struct attribute_group *_name##_groups[] = { \
&_name##_group, \
NULL, \
};
}
/*
* Handle our generic '\0' terminated 'C' string.
@ -210,14 +211,27 @@ sysfs_create_groups(struct kobject *kobj, const struct attribute_group **grps)
int error = 0;
int i;
if (grps == NULL)
goto done;
for (i = 0; grps[i] && !error; i++)
error = sysfs_create_group(kobj, grps[i]);
while (error && --i >= 0)
sysfs_remove_group(kobj, grps[i]);
done:
return (error);
}
static inline void
sysfs_remove_groups(struct kobject *kobj, const struct attribute_group **grps)
{
int i;
if (grps == NULL)
return;
for (i = 0; grps[i]; i++)
sysfs_remove_group(kobj, grps[i]);
}
static inline int
sysfs_merge_group(struct kobject *kobj, const struct attribute_group *grp)
{

View File

@ -60,7 +60,7 @@
* in the range 5 to 9.
*/
#undef __FreeBSD_version
#define __FreeBSD_version 1300054 /* Master, propagated to newvers */
#define __FreeBSD_version 1300055 /* Master, propagated to newvers */
/*
* __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,