summaryrefslogtreecommitdiffstats
path: root/drivers/staging/gdm724x/gdm_tty.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/gdm724x/gdm_tty.c')
-rw-r--r--drivers/staging/gdm724x/gdm_tty.c45
1 files changed, 19 insertions, 26 deletions
diff --git a/drivers/staging/gdm724x/gdm_tty.c b/drivers/staging/gdm724x/gdm_tty.c
index 5bcf88224e90..c1530b76cd86 100644
--- a/drivers/staging/gdm724x/gdm_tty.c
+++ b/drivers/staging/gdm724x/gdm_tty.c
@@ -89,19 +89,22 @@ static int gdm_tty_install(struct tty_driver *driver, struct tty_struct *tty)
mutex_lock(&gdm_table_lock);
gdm = gdm_table[i][j];
- mutex_unlock(&gdm_table_lock);
- if (gdm == NULL)
+ if (gdm == NULL) {
+ mutex_unlock(&gdm_table_lock);
return -ENODEV;
+ }
tty_port_get(&gdm->port);
ret = tty_standard_install(driver, tty);
if (ret) {
tty_port_put(&gdm->port);
+ mutex_unlock(&gdm_table_lock);
return ret;
}
tty->driver_data = gdm;
+ mutex_unlock(&gdm_table_lock);
return 0;
}
@@ -130,14 +133,13 @@ static void gdm_tty_close(struct tty_struct *tty, struct file *filp)
tty_port_close(&gdm->port, tty, filp);
}
-static int gdm_tty_recv_complete(void *data, int len, int index, int minor, int complete)
+static int gdm_tty_recv_complete(void *data,
+ int len,
+ int index,
+ struct tty_dev *tty_dev,
+ int complete)
{
- struct gdm *gdm;
-
- mutex_lock(&gdm_table_lock);
- gdm = gdm_table[index][minor];
- mutex_unlock(&gdm_table_lock);
-
+ struct gdm *gdm = tty_dev->gdm[index];
if (!GDM_TTY_READY(gdm)) {
if (complete == RECV_PACKET_PROCESS_COMPLETE)
gdm_tty_recv(gdm, gdm_tty_recv_complete);
@@ -223,31 +225,29 @@ int register_lte_tty_device(struct tty_dev *tty_dev, struct device *device)
return -ENOMEM;
mutex_lock(&gdm_table_lock);
-
for (j = 0; j < GDM_TTY_MINOR; j++) {
if (!gdm_table[i][j])
break;
}
if (j == GDM_TTY_MINOR) {
- tty_dev->minor[i] = GDM_TTY_MINOR;
+ kfree(gdm);
mutex_unlock(&gdm_table_lock);
return -EINVAL;
}
gdm_table[i][j] = gdm;
-
mutex_unlock(&gdm_table_lock);
- tty_dev->minor[i] = j;
-
+ tty_dev->gdm[i] = gdm;
tty_port_init(&gdm->port);
+
gdm->port.ops = &gdm_port_ops;
gdm->index = i;
gdm->minor = j;
gdm->tty_dev = tty_dev;
- tty_port_register_device(&gdm->port, gdm_driver[i], j, device);
+ tty_port_register_device(&gdm->port, gdm_driver[i], gdm->minor, device);
}
for (i = 0; i < MAX_ISSUE_NUM; i++)
@@ -261,31 +261,24 @@ void unregister_lte_tty_device(struct tty_dev *tty_dev)
struct gdm *gdm;
struct tty_struct *tty;
int i;
- int j;
for (i = 0; i < TTY_MAX_COUNT; i++) {
-
- j = tty_dev->minor[i];
-
- if (j >= GDM_TTY_MINOR)
+ gdm = tty_dev->gdm[i];
+ if (!gdm)
continue;
mutex_lock(&gdm_table_lock);
- gdm = gdm_table[i][j];
+ gdm_table[gdm->index][gdm->minor] = NULL;
mutex_unlock(&gdm_table_lock);
- if (!gdm)
- continue;
-
tty = tty_port_tty_get(&gdm->port);
if (tty) {
tty_vhangup(tty);
tty_kref_put(tty);
}
- tty_unregister_device(gdm_driver[i], j);
+ tty_unregister_device(gdm_driver[i], gdm->minor);
tty_port_put(&gdm->port);
-
}
}