From owner-svn-src-all@freebsd.org Mon May 16 09:56:50 2016 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 16FE0B3BCA6; Mon, 16 May 2016 09:56:50 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id CE1831755; Mon, 16 May 2016 09:56:49 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id u4G9unj6025382; Mon, 16 May 2016 09:56:49 GMT (envelope-from hselasky@FreeBSD.org) Received: (from hselasky@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id u4G9umAT025380; Mon, 16 May 2016 09:56:48 GMT (envelope-from hselasky@FreeBSD.org) Message-Id: <201605160956.u4G9umAT025380@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: hselasky set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky Date: Mon, 16 May 2016 09:56:48 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r299933 - in head/sys: compat/linuxkpi/common/include/linux sys X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 16 May 2016 09:56:50 -0000 Author: hselasky Date: Mon May 16 09:56:48 2016 New Revision: 299933 URL: https://svnweb.freebsd.org/changeset/base/299933 Log: Implement more Linux device related functions in the LinuxKPI. While at it use NULL for some pointer checks. Bump the FreeBSD version to force recompilation of all kernel modules due to a structure size change. Obtained from: kmacy @ MFC after: 1 week Sponsored by: Mellanox Technologies Modified: head/sys/compat/linuxkpi/common/include/linux/device.h head/sys/sys/param.h Modified: head/sys/compat/linuxkpi/common/include/linux/device.h ============================================================================== --- head/sys/compat/linuxkpi/common/include/linux/device.h Mon May 16 09:31:44 2016 (r299932) +++ head/sys/compat/linuxkpi/common/include/linux/device.h Mon May 16 09:56:48 2016 (r299933) @@ -31,6 +31,7 @@ #ifndef _LINUX_DEVICE_H_ #define _LINUX_DEVICE_H_ +#include #include #include #include @@ -71,6 +72,7 @@ struct device { unsigned int irq; unsigned int msix; unsigned int msix_max; + const struct attribute_group **groups; }; extern struct device linux_root_device; @@ -127,11 +129,12 @@ show_class_attr_string(struct class *cla #define dev_err(dev, fmt, ...) device_printf((dev)->bsddev, fmt, ##__VA_ARGS__) #define dev_warn(dev, fmt, ...) device_printf((dev)->bsddev, fmt, ##__VA_ARGS__) #define dev_info(dev, fmt, ...) device_printf((dev)->bsddev, fmt, ##__VA_ARGS__) +#define dev_notice(dev, fmt, ...) device_printf((dev)->bsddev, fmt, ##__VA_ARGS__) #define dev_printk(lvl, dev, fmt, ...) \ device_printf((dev)->bsddev, fmt, ##__VA_ARGS__) static inline void * -dev_get_drvdata(struct device *dev) +dev_get_drvdata(const struct device *dev) { return dev->driver_data; @@ -191,11 +194,106 @@ class_unregister(struct class *class) kobject_put(&class->kobj); } +static inline struct device *kobj_to_dev(struct kobject *kobj) +{ + return container_of(kobj, struct device, kobj); +} + /* - * Devices are registered and created for exporting to sysfs. create + * Devices are registered and created for exporting to sysfs. Create * implies register and register assumes the device fields have been * setup appropriately before being called. */ +static inline void +device_initialize(struct device *dev) +{ + device_t bsddev; + + bsddev = NULL; + if (dev->devt) { + int unit = MINOR(dev->devt); + bsddev = devclass_get_device(dev->class->bsdclass, unit); + } + if (bsddev != NULL) + device_set_softc(bsddev, dev); + + dev->bsddev = bsddev; + kobject_init(&dev->kobj, &linux_dev_ktype); +} + +static inline int +device_add(struct device *dev) +{ + if (dev->bsddev != NULL) { + if (dev->devt == 0) + dev->devt = makedev(0, device_get_unit(dev->bsddev)); + } + kobject_add(&dev->kobj, &dev->class->kobj, dev_name(dev)); + return (0); +} + +static inline void +device_create_release(struct device *dev) +{ + kfree(dev); +} + +static inline struct device * +device_create_groups_vargs(struct class *class, struct device *parent, + dev_t devt, void *drvdata, const struct attribute_group **groups, + const char *fmt, va_list args) +{ + struct device *dev = NULL; + int retval = -ENODEV; + + if (class == NULL || IS_ERR(class)) + goto error; + + dev = kzalloc(sizeof(*dev), GFP_KERNEL); + if (!dev) { + retval = -ENOMEM; + goto error; + } + + device_initialize(dev); + dev->devt = devt; + dev->class = class; + dev->parent = parent; + dev->groups = groups; + dev->release = device_create_release; + dev->bsddev = devclass_get_device(dev->class->bsdclass, MINOR(devt)); + dev_set_drvdata(dev, drvdata); + + retval = kobject_set_name_vargs(&dev->kobj, fmt, args); + if (retval) + goto error; + + retval = device_add(dev); + if (retval) + goto error; + + return dev; + +error: + put_device(dev); + return ERR_PTR(retval); +} + +static inline struct device * +device_create_with_groups(struct class *class, + struct device *parent, dev_t devt, void *drvdata, + const struct attribute_group **groups, const char *fmt, ...) +{ + va_list vargs; + struct device *dev; + + va_start(vargs, fmt); + dev = device_create_groups_vargs(class, parent, devt, drvdata, + groups, fmt, vargs); + va_end(vargs); + return dev; +} + static inline int device_register(struct device *dev) { @@ -233,13 +331,29 @@ device_unregister(struct device *dev) device_t bsddev; bsddev = dev->bsddev; + dev->bsddev = NULL; + mtx_lock(&Giant); - if (bsddev) + if (bsddev != NULL) device_delete_child(device_get_parent(bsddev), bsddev); mtx_unlock(&Giant); put_device(dev); } +static inline void +device_del(struct device *dev) +{ + device_t bsddev; + + bsddev = dev->bsddev; + dev->bsddev = NULL; + + mtx_lock(&Giant); + if (bsddev != NULL) + device_delete_child(device_get_parent(bsddev), bsddev); + mtx_unlock(&Giant); +} + struct device *device_create(struct class *class, struct device *parent, dev_t devt, void *drvdata, const char *fmt, ...); @@ -251,7 +365,7 @@ device_destroy(struct class *class, dev_ unit = MINOR(devt); bsddev = devclass_get_device(class->bsdclass, unit); - if (bsddev) + if (bsddev != NULL) device_unregister(device_get_softc(bsddev)); } Modified: head/sys/sys/param.h ============================================================================== --- head/sys/sys/param.h Mon May 16 09:31:44 2016 (r299932) +++ head/sys/sys/param.h Mon May 16 09:56:48 2016 (r299933) @@ -58,7 +58,7 @@ * in the range 5 to 9. */ #undef __FreeBSD_version -#define __FreeBSD_version 1100108 /* Master, propagated to newvers */ +#define __FreeBSD_version 1100109 /* Master, propagated to newvers */ /* * __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,