Deleted Added
full compact
28c28
< __FBSDID("$FreeBSD: head/sys/dev/ipmi/ipmi.c 167950 2007-03-27 21:03:37Z n_hibma $");
---
> __FBSDID("$FreeBSD: head/sys/dev/ipmi/ipmi.c 182322 2008-08-28 02:13:53Z jhb $");
61c61
< static d_close_t ipmi_close;
---
> static void ipmi_dtor(void *arg);
65,66d64
< #define IPMI_MINOR 0
<
75d72
< .d_close = ipmi_close,
87a85
> int error;
92,97c90,95
< dev = cdev->si_drv1;
< sc = dev->ipmi_softc;
< IPMI_LOCK(sc);
< if (dev->ipmi_open) {
< IPMI_UNLOCK(sc);
< return (EBUSY);
---
> /* Initialize the per file descriptor data. */
> dev = malloc(sizeof(struct ipmi_device), M_IPMI, M_WAITOK | M_ZERO);
> error = devfs_set_cdevpriv(dev, ipmi_dtor);
> if (error) {
> free(dev, M_IPMI);
> return (error);
99c97,104
< dev->ipmi_open = 1;
---
>
> sc = cdev->si_drv1;
> TAILQ_INIT(&dev->ipmi_completed_requests);
> dev->ipmi_address = IPMI_BMC_SLAVE_ADDR;
> dev->ipmi_lun = IPMI_BMC_SMS_LUN;
> dev->ipmi_softc = sc;
> IPMI_LOCK(sc);
> sc->ipmi_opened++;
112,113c117,118
< dev = cdev->si_drv1;
< sc = dev->ipmi_softc;
---
> if (devfs_get_cdevpriv((void **)&dev))
> return (0);
114a120
> sc = cdev->si_drv1;
145,146c151,152
< static int
< ipmi_close(struct cdev *cdev, int flags, int fmt, struct thread *td)
---
> static void
> ipmi_dtor(void *arg)
151,153d156
< #ifdef CLONING
< int bit;
< #endif
155c158
< dev = cdev->si_drv1;
---
> dev = arg;
185,190c188
<
< #ifdef CLONING
< /* Detach this sub-device from the main driver. */
< bit = minor(cdev) % 32;
< sc->ipmi_cdev_mask &= ~(1 << bit);
< TAILQ_REMOVE(&sc->ipmi_cdevs, dev, ipmi_link);
---
> sc->ipmi_opened--;
194d191
< cdev->si_drv1 = NULL;
196,202d192
< destroy_dev(cdev);
< #else
< dev->ipmi_open = 0;
< IPMI_UNLOCK(sc);
< #endif
<
< return (0);
311,312c301,303
< dev = cdev->si_drv1;
< sc = dev->ipmi_softc;
---
> error = devfs_get_cdevpriv((void **)&dev);
> if (error)
> return (error);
313a305,306
> sc = cdev->si_drv1;
>
662d654
< #ifdef CLONING
664,714d655
< ipmi_clone(void *arg, struct ucred *cred, char *name, int namelen,
< struct cdev **cdev)
< {
< struct ipmi_softc *sc = arg;
< struct ipmi_device *dev;
< int minor, unit;
<
< if (*cdev != NULL)
< return;
<
< if (strcmp(name, device_get_nameunit(sc->ipmi_dev)) != 0)
< return;
<
< dev = malloc(sizeof(struct ipmi_device), M_IPMI, M_WAITOK | M_ZERO);
<
< /* Reserve a sub-device. */
< IPMI_LOCK(sc);
< minor = ffs(~(sc->ipmi_cdev_mask & 0xffff));
< if (minor == 0 || !sc->ipmi_cloning) {
< IPMI_UNLOCK(sc);
< free(dev, M_IPMI);
< return;
< }
< minor--;
< sc->ipmi_cdev_mask |= (1 << minor);
< TAILQ_INSERT_TAIL(&sc->ipmi_cdevs, dev, ipmi_link);
< IPMI_UNLOCK(sc);
<
< /* Initialize the device. */
< TAILQ_INIT(&dev->ipmi_completed_requests);
< dev->ipmi_softc = sc;
< dev->ipmi_address = IPMI_BMC_SLAVE_ADDR;
< dev->ipmi_lun = IPMI_BMC_SMS_LUN;
< unit = device_get_unit(sc->ipmi_dev);
< dev->ipmi_cdev = make_dev_cred(&ipmi_cdevsw, unit * 32 + minor, cred,
< UID_ROOT, GID_OPERATOR, 0660, "ipmi%d.%d", unit, minor);
< if (dev->ipmi_cdev == NULL) {
< IPMI_LOCK(sc);
< sc->ipmi_cdev_mask &= ~(1 << minor);
< TAILQ_REMOVE(&sc->ipmi_cdevs, dev, ipmi_link);
< IPMI_UNLOCK(sc);
< free(dev, M_IPMI);
< return;
< }
< dev->ipmi_cdev->si_drv1 = dev;
< *cdev = dev->ipmi_cdev;
< dev_ref(*cdev);
< }
< #endif
<
< static void
729,731d669
< #ifdef CLONING
< TAILQ_INIT(&sc->ipmi_cdevs);
< #endif
818,828c756
< #ifdef CLONING
< sc->ipmi_cloning = 1;
< sc->ipmi_clone_tag = EVENTHANDLER_REGISTER(dev_clone, ipmi_clone, sc,
< 1000);
< #else
< /* Initialize the device. */
< TAILQ_INIT(&sc->ipmi_idev.ipmi_completed_requests);
< sc->ipmi_idev.ipmi_softc = sc;
< sc->ipmi_idev.ipmi_address = IPMI_BMC_SLAVE_ADDR;
< sc->ipmi_idev.ipmi_lun = IPMI_BMC_SMS_LUN;
< sc->ipmi_idev.ipmi_cdev = make_dev(&ipmi_cdevsw, device_get_unit(dev),
---
> sc->ipmi_cdev = make_dev(&ipmi_cdevsw, device_get_unit(dev),
830c758
< if (sc->ipmi_idev.ipmi_cdev == NULL) {
---
> if (sc->ipmi_cdev == NULL) {
834,835c762
< sc->ipmi_idev.ipmi_cdev->si_drv1 = &sc->ipmi_idev;
< #endif
---
> sc->ipmi_cdev->si_drv1 = sc;
874,875c801
< #ifdef CLONING
< if (!TAILQ_EMPTY(&sc->ipmi_cdevs)) {
---
> if (sc->ipmi_opened) {
879,881d804
<
< /* Turn off cloning. */
< sc->ipmi_cloning = 0;
882a806,807
> if (sc->ipmi_cdev)
> destroy_dev(sc->ipmi_cdev);
884,895d808
< if (sc->ipmi_clone_tag)
< EVENTHANDLER_DEREGISTER(dev_clone, sc->ipmi_clone_tag);
< #else
< if (sc->ipmi_idev.ipmi_open) {
< IPMI_UNLOCK(sc);
< return (EBUSY);
< }
< IPMI_UNLOCK(sc);
< if (sc->ipmi_idev.ipmi_cdev)
< destroy_dev(sc->ipmi_idev.ipmi_cdev);
< #endif
<