#include <linux/major.h>
#include <linux/kdev_t.h>
#include <linux/device.h>
-#include <linux/mutex.h>
struct class *class3270;
#define RAW3270_FLAGS_CONSOLE 8 /* Device is the console. */
/* Semaphore to protect global data of raw3270 (devices, views, etc). */
-static DEFINE_MUTEX(raw3270_mutex);
+static DECLARE_MUTEX(raw3270_sem);
/* List of 3270 devices. */
static struct list_head raw3270_devices = LIST_HEAD_INIT(raw3270_devices);
struct raw3270_request *rq;
/* Allocate request structure */
- rq = kzalloc(sizeof(struct raw3270_request), GFP_KERNEL | GFP_DMA);
+ rq = kmalloc(sizeof(struct raw3270_request), GFP_KERNEL | GFP_DMA);
if (!rq)
return ERR_PTR(-ENOMEM);
+ memset(rq, 0, sizeof(struct raw3270_request));
/* alloc output buffer. */
if (size > 0) {
* number for it. Note: there is no device with minor 0,
* see special case for fs3270.c:fs3270_open().
*/
- mutex_lock(&raw3270_mutex);
+ down(&raw3270_sem);
/* Keep the list sorted. */
minor = RAW3270_FIRSTMINOR;
rp->minor = -1;
rp->minor = minor;
list_add_tail(&rp->list, &raw3270_devices);
}
- mutex_unlock(&raw3270_mutex);
+ up(&raw3270_sem);
/* No free minor number? Then give up. */
if (rp->minor == -1)
return -EUSERS;
if (minor <= 0)
return -ENODEV;
- mutex_lock(&raw3270_mutex);
+ down(&raw3270_sem);
rc = -ENODEV;
list_for_each_entry(rp, &raw3270_devices, list) {
if (rp->minor != minor)
spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags);
break;
}
- mutex_unlock(&raw3270_mutex);
+ up(&raw3270_sem);
return rc;
}
struct raw3270_view *view, *tmp;
unsigned long flags;
- mutex_lock(&raw3270_mutex);
+ down(&raw3270_sem);
view = ERR_PTR(-ENODEV);
list_for_each_entry(rp, &raw3270_devices, list) {
if (rp->minor != minor)
spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags);
break;
}
- mutex_unlock(&raw3270_mutex);
+ up(&raw3270_sem);
return view;
}
struct ccw_device *cdev;
/* Remove from device chain. */
- mutex_lock(&raw3270_mutex);
+ down(&raw3270_sem);
if (rp->clttydev)
class_device_destroy(class3270,
MKDEV(IBM_TTY3270_MAJOR, rp->minor));
class_device_destroy(class3270,
MKDEV(IBM_FS3270_MAJOR, rp->minor));
list_del_init(&rp->list);
- mutex_unlock(&raw3270_mutex);
+ up(&raw3270_sem);
/* Disconnect from ccw_device. */
cdev = rp->cdev;
if (!np)
return -ENOMEM;
np->notifier = notifier;
- mutex_lock(&raw3270_mutex);
+ down(&raw3270_sem);
list_add_tail(&np->list, &raw3270_notifier);
list_for_each_entry(rp, &raw3270_devices, list) {
get_device(&rp->cdev->dev);
notifier(rp->minor, 1);
}
- mutex_unlock(&raw3270_mutex);
+ up(&raw3270_sem);
return 0;
}
{
struct raw3270_notifier *np;
- mutex_lock(&raw3270_mutex);
+ down(&raw3270_sem);
list_for_each_entry(np, &raw3270_notifier, list)
if (np->notifier == notifier) {
list_del(&np->list);
kfree(np);
break;
}
- mutex_unlock(&raw3270_mutex);
+ up(&raw3270_sem);
}
/*
goto failure;
raw3270_create_attributes(rp);
set_bit(RAW3270_FLAGS_READY, &rp->flags);
- mutex_lock(&raw3270_mutex);
+ down(&raw3270_sem);
list_for_each_entry(np, &raw3270_notifier, list)
np->notifier(rp->minor, 1);
- mutex_unlock(&raw3270_mutex);
+ up(&raw3270_sem);
return 0;
failure:
}
spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
- mutex_lock(&raw3270_mutex);
+ down(&raw3270_sem);
list_for_each_entry(np, &raw3270_notifier, list)
np->notifier(rp->minor, 0);
- mutex_unlock(&raw3270_mutex);
+ up(&raw3270_sem);
/* Reset 3270 device. */
raw3270_reset_device(rp);
rc = ccw_driver_register(&raw3270_ccw_driver);
if (rc == 0) {
/* Create attributes for early (= console) device. */
- mutex_lock(&raw3270_mutex);
+ down(&raw3270_sem);
class3270 = class_create(THIS_MODULE, "3270");
list_for_each_entry(rp, &raw3270_devices, list) {
get_device(&rp->cdev->dev);
raw3270_create_attributes(rp);
}
- mutex_unlock(&raw3270_mutex);
+ up(&raw3270_sem);
}
return rc;
}