diff options
Diffstat (limited to 'drivers/tty/ipwireless/tty.c')
| -rw-r--r-- | drivers/tty/ipwireless/tty.c | 81 | 
1 files changed, 35 insertions, 46 deletions
diff --git a/drivers/tty/ipwireless/tty.c b/drivers/tty/ipwireless/tty.c index 4daf962f705..f8b5fa0093a 100644 --- a/drivers/tty/ipwireless/tty.c +++ b/drivers/tty/ipwireless/tty.c @@ -44,14 +44,13 @@  #define TTYTYPE_RAS_RAW  (2)  struct ipw_tty { +	struct tty_port port;  	int index;  	struct ipw_hardware *hardware;  	unsigned int channel_idx;  	unsigned int secondary_channel_idx;  	int tty_type;  	struct ipw_network *network; -	struct tty_struct *linux_tty; -	int open_count;  	unsigned int control_lines;  	struct mutex ipw_tty_mutex;  	int tx_bytes_queued; @@ -73,23 +72,6 @@ static char *tty_type_name(int tty_type)  	return channel_names[tty_type];  } -static void report_registering(struct ipw_tty *tty) -{ -	char *iftype = tty_type_name(tty->tty_type); - -	printk(KERN_INFO IPWIRELESS_PCCARD_NAME -	       ": registering %s device ttyIPWp%d\n", iftype, tty->index); -} - -static void report_deregistering(struct ipw_tty *tty) -{ -	char *iftype = tty_type_name(tty->tty_type); - -	printk(KERN_INFO IPWIRELESS_PCCARD_NAME -	       ": deregistering %s device ttyIPWp%d\n", iftype, -	       tty->index); -} -  static struct ipw_tty *get_tty(int index)  {  	/* @@ -117,12 +99,12 @@ static int ipw_open(struct tty_struct *linux_tty, struct file *filp)  		mutex_unlock(&tty->ipw_tty_mutex);  		return -ENODEV;  	} -	if (tty->open_count == 0) +	if (tty->port.count == 0)  		tty->tx_bytes_queued = 0; -	tty->open_count++; +	tty->port.count++; -	tty->linux_tty = linux_tty; +	tty->port.tty = linux_tty;  	linux_tty->driver_data = tty;  	linux_tty->low_latency = 1; @@ -136,13 +118,13 @@ static int ipw_open(struct tty_struct *linux_tty, struct file *filp)  static void do_ipw_close(struct ipw_tty *tty)  { -	tty->open_count--; +	tty->port.count--; -	if (tty->open_count == 0) { -		struct tty_struct *linux_tty = tty->linux_tty; +	if (tty->port.count == 0) { +		struct tty_struct *linux_tty = tty->port.tty;  		if (linux_tty != NULL) { -			tty->linux_tty = NULL; +			tty->port.tty = NULL;  			linux_tty->driver_data = NULL;  			if (tty->tty_type == TTYTYPE_MODEM) @@ -159,7 +141,7 @@ static void ipw_hangup(struct tty_struct *linux_tty)  		return;  	mutex_lock(&tty->ipw_tty_mutex); -	if (tty->open_count == 0) { +	if (tty->port.count == 0) {  		mutex_unlock(&tty->ipw_tty_mutex);  		return;  	} @@ -182,13 +164,13 @@ void ipwireless_tty_received(struct ipw_tty *tty, unsigned char *data,  	int work = 0;  	mutex_lock(&tty->ipw_tty_mutex); -	linux_tty = tty->linux_tty; +	linux_tty = tty->port.tty;  	if (linux_tty == NULL) {  		mutex_unlock(&tty->ipw_tty_mutex);  		return;  	} -	if (!tty->open_count) { +	if (!tty->port.count) {  		mutex_unlock(&tty->ipw_tty_mutex);  		return;  	} @@ -230,7 +212,7 @@ static int ipw_write(struct tty_struct *linux_tty,  		return -ENODEV;  	mutex_lock(&tty->ipw_tty_mutex); -	if (!tty->open_count) { +	if (!tty->port.count) {  		mutex_unlock(&tty->ipw_tty_mutex);  		return -EINVAL;  	} @@ -270,7 +252,7 @@ static int ipw_write_room(struct tty_struct *linux_tty)  	if (!tty)  		return -ENODEV; -	if (!tty->open_count) +	if (!tty->port.count)  		return -EINVAL;  	room = IPWIRELESS_TX_QUEUE_SIZE - tty->tx_bytes_queued; @@ -312,7 +294,7 @@ static int ipw_chars_in_buffer(struct tty_struct *linux_tty)  	if (!tty)  		return 0; -	if (!tty->open_count) +	if (!tty->port.count)  		return 0;  	return tty->tx_bytes_queued; @@ -393,7 +375,7 @@ static int ipw_tiocmget(struct tty_struct *linux_tty)  	if (!tty)  		return -ENODEV; -	if (!tty->open_count) +	if (!tty->port.count)  		return -EINVAL;  	return get_control_lines(tty); @@ -409,7 +391,7 @@ ipw_tiocmset(struct tty_struct *linux_tty,  	if (!tty)  		return -ENODEV; -	if (!tty->open_count) +	if (!tty->port.count)  		return -EINVAL;  	return set_control_lines(tty, set, clear); @@ -423,7 +405,7 @@ static int ipw_ioctl(struct tty_struct *linux_tty,  	if (!tty)  		return -ENODEV; -	if (!tty->open_count) +	if (!tty->port.count)  		return -EINVAL;  	/* FIXME: Exactly how is the tty object locked here .. */ @@ -492,6 +474,7 @@ static int add_tty(int j,  	ttys[j]->network = network;  	ttys[j]->tty_type = tty_type;  	mutex_init(&ttys[j]->ipw_tty_mutex); +	tty_port_init(&ttys[j]->port);  	tty_register_device(ipw_tty_driver, j, NULL);  	ipwireless_associate_network_tty(network, channel_idx, ttys[j]); @@ -500,8 +483,12 @@ static int add_tty(int j,  		ipwireless_associate_network_tty(network,  						 secondary_channel_idx,  						 ttys[j]); -	if (get_tty(j) == ttys[j]) -		report_registering(ttys[j]); +	/* check if we provide raw device (if loopback is enabled) */ +	if (get_tty(j)) +		printk(KERN_INFO IPWIRELESS_PCCARD_NAME +		       ": registering %s device ttyIPWp%d\n", +		       tty_type_name(tty_type), j); +  	return 0;  } @@ -560,19 +547,21 @@ void ipwireless_tty_free(struct ipw_tty *tty)  		if (ttyj) {  			mutex_lock(&ttyj->ipw_tty_mutex); -			if (get_tty(j) == ttyj) -				report_deregistering(ttyj); +			if (get_tty(j)) +				printk(KERN_INFO IPWIRELESS_PCCARD_NAME +				       ": deregistering %s device ttyIPWp%d\n", +				       tty_type_name(ttyj->tty_type), j);  			ttyj->closing = 1; -			if (ttyj->linux_tty != NULL) { +			if (ttyj->port.tty != NULL) {  				mutex_unlock(&ttyj->ipw_tty_mutex); -				tty_hangup(ttyj->linux_tty); -				/* Wait till the tty_hangup has completed */ -				flush_work_sync(&ttyj->linux_tty->hangup_work); +				tty_vhangup(ttyj->port.tty);  				/* FIXME: Exactly how is the tty object locked here  				   against a parallel ioctl etc */ +				/* FIXME2: hangup does not mean all processes +				 * are gone */  				mutex_lock(&ttyj->ipw_tty_mutex);  			} -			while (ttyj->open_count) +			while (ttyj->port.count)  				do_ipw_close(ttyj);  			ipwireless_disassociate_network_ttys(network,  							     ttyj->channel_idx); @@ -661,8 +650,8 @@ ipwireless_tty_notify_control_line_change(struct ipw_tty *tty,  	 */  	if ((old_control_lines & IPW_CONTROL_LINE_DCD)  			&& !(tty->control_lines & IPW_CONTROL_LINE_DCD) -			&& tty->linux_tty) { -		tty_hangup(tty->linux_tty); +			&& tty->port.tty) { +		tty_hangup(tty->port.tty);  	}  }  |