Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2acdb169 authored by Paul Fulghum's avatar Paul Fulghum Committed by Linus Torvalds
Browse files

synclink_gt: add compat_ioctl



Add support for 32 bit ioctl on 64 bit systems for synclink_gt

Cc: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarPaul Fulghum <paulkf@microgate.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 4c64c30a
Loading
Loading
Loading
Loading
+107 −0
Original line number Original line Diff line number Diff line
@@ -1170,6 +1170,112 @@ static int ioctl(struct tty_struct *tty, struct file *file,
	return 0;
	return 0;
}
}


/*
 * support for 32 bit ioctl calls on 64 bit systems
 */
#ifdef CONFIG_COMPAT
static long get_params32(struct slgt_info *info, struct MGSL_PARAMS32 __user *user_params)
{
	struct MGSL_PARAMS32 tmp_params;

	DBGINFO(("%s get_params32\n", info->device_name));
	tmp_params.mode            = (compat_ulong_t)info->params.mode;
	tmp_params.loopback        = info->params.loopback;
	tmp_params.flags           = info->params.flags;
	tmp_params.encoding        = info->params.encoding;
	tmp_params.clock_speed     = (compat_ulong_t)info->params.clock_speed;
	tmp_params.addr_filter     = info->params.addr_filter;
	tmp_params.crc_type        = info->params.crc_type;
	tmp_params.preamble_length = info->params.preamble_length;
	tmp_params.preamble        = info->params.preamble;
	tmp_params.data_rate       = (compat_ulong_t)info->params.data_rate;
	tmp_params.data_bits       = info->params.data_bits;
	tmp_params.stop_bits       = info->params.stop_bits;
	tmp_params.parity          = info->params.parity;
	if (copy_to_user(user_params, &tmp_params, sizeof(struct MGSL_PARAMS32)))
		return -EFAULT;
	return 0;
}

static long set_params32(struct slgt_info *info, struct MGSL_PARAMS32 __user *new_params)
{
	struct MGSL_PARAMS32 tmp_params;

	DBGINFO(("%s set_params32\n", info->device_name));
	if (copy_from_user(&tmp_params, new_params, sizeof(struct MGSL_PARAMS32)))
		return -EFAULT;

	spin_lock(&info->lock);
	info->params.mode            = tmp_params.mode;
	info->params.loopback        = tmp_params.loopback;
	info->params.flags           = tmp_params.flags;
	info->params.encoding        = tmp_params.encoding;
	info->params.clock_speed     = tmp_params.clock_speed;
	info->params.addr_filter     = tmp_params.addr_filter;
	info->params.crc_type        = tmp_params.crc_type;
	info->params.preamble_length = tmp_params.preamble_length;
	info->params.preamble        = tmp_params.preamble;
	info->params.data_rate       = tmp_params.data_rate;
	info->params.data_bits       = tmp_params.data_bits;
	info->params.stop_bits       = tmp_params.stop_bits;
	info->params.parity          = tmp_params.parity;
	spin_unlock(&info->lock);

 	change_params(info);

	return 0;
}

static long slgt_compat_ioctl(struct tty_struct *tty, struct file *file,
			 unsigned int cmd, unsigned long arg)
{
	struct slgt_info *info = tty->driver_data;
	int rc = -ENOIOCTLCMD;

	if (sanity_check(info, tty->name, "compat_ioctl"))
		return -ENODEV;
	DBGINFO(("%s compat_ioctl() cmd=%08X\n", info->device_name, cmd));

	switch (cmd) {

	case MGSL_IOCSPARAMS32:
		rc = set_params32(info, compat_ptr(arg));
		break;

	case MGSL_IOCGPARAMS32:
		rc = get_params32(info, compat_ptr(arg));
		break;

	case MGSL_IOCGPARAMS:
	case MGSL_IOCSPARAMS:
	case MGSL_IOCGTXIDLE:
	case MGSL_IOCGSTATS:
	case MGSL_IOCWAITEVENT:
	case MGSL_IOCGIF:
	case MGSL_IOCSGPIO:
	case MGSL_IOCGGPIO:
	case MGSL_IOCWAITGPIO:
	case TIOCGICOUNT:
		rc = ioctl(tty, file, cmd, (unsigned long)(compat_ptr(arg)));
		break;

	case MGSL_IOCSTXIDLE:
	case MGSL_IOCTXENABLE:
	case MGSL_IOCRXENABLE:
	case MGSL_IOCTXABORT:
	case TIOCMIWAIT:
	case MGSL_IOCSIF:
		rc = ioctl(tty, file, cmd, arg);
		break;
	}

	DBGINFO(("%s compat_ioctl() cmd=%08X rc=%d\n", info->device_name, cmd, rc));
	return rc;
}
#else
#define slgt_compat_ioctl NULL
#endif /* ifdef CONFIG_COMPAT */

/*
/*
 * proc fs support
 * proc fs support
 */
 */
@@ -3446,6 +3552,7 @@ static const struct tty_operations ops = {
	.chars_in_buffer = chars_in_buffer,
	.chars_in_buffer = chars_in_buffer,
	.flush_buffer = flush_buffer,
	.flush_buffer = flush_buffer,
	.ioctl = ioctl,
	.ioctl = ioctl,
	.compat_ioctl = slgt_compat_ioctl,
	.throttle = throttle,
	.throttle = throttle,
	.unthrottle = unthrottle,
	.unthrottle = unthrottle,
	.send_xchar = send_xchar,
	.send_xchar = send_xchar,
+1 −1
Original line number Original line Diff line number Diff line
@@ -140,7 +140,6 @@ header-y += snmp.h
header-y += sockios.h
header-y += sockios.h
header-y += som.h
header-y += som.h
header-y += sound.h
header-y += sound.h
header-y += synclink.h
header-y += taskstats.h
header-y += taskstats.h
header-y += telephony.h
header-y += telephony.h
header-y += termios.h
header-y += termios.h
@@ -320,6 +319,7 @@ unifdef-y += sonypi.h
unifdef-y += soundcard.h
unifdef-y += soundcard.h
unifdef-y += stat.h
unifdef-y += stat.h
unifdef-y += stddef.h
unifdef-y += stddef.h
unifdef-y += synclink.h
unifdef-y += sysctl.h
unifdef-y += sysctl.h
unifdef-y += tcp.h
unifdef-y += tcp.h
unifdef-y += time.h
unifdef-y += time.h
+24 −0
Original line number Original line Diff line number Diff line
@@ -291,4 +291,28 @@ struct gpio_desc {
#define MGSL_IOCGGPIO		_IOR(MGSL_MAGIC_IOC,17,struct gpio_desc)
#define MGSL_IOCGGPIO		_IOR(MGSL_MAGIC_IOC,17,struct gpio_desc)
#define MGSL_IOCWAITGPIO	_IOWR(MGSL_MAGIC_IOC,18,struct gpio_desc)
#define MGSL_IOCWAITGPIO	_IOWR(MGSL_MAGIC_IOC,18,struct gpio_desc)


#ifdef __KERNEL__
/* provide 32 bit ioctl compatibility on 64 bit systems */
#ifdef CONFIG_COMPAT
#include <linux/compat.h>
struct MGSL_PARAMS32 {
	compat_ulong_t	mode;
	unsigned char	loopback;
	unsigned short	flags;
	unsigned char	encoding;
	compat_ulong_t	clock_speed;
	unsigned char	addr_filter;
	unsigned short	crc_type;
	unsigned char	preamble_length;
	unsigned char	preamble;
	compat_ulong_t	data_rate;
	unsigned char	data_bits;
	unsigned char	stop_bits;
	unsigned char	parity;
};
#define MGSL_IOCSPARAMS32 _IOW(MGSL_MAGIC_IOC,0,struct MGSL_PARAMS32)
#define MGSL_IOCGPARAMS32 _IOR(MGSL_MAGIC_IOC,1,struct MGSL_PARAMS32)
#endif
#endif

#endif /* _SYNCLINK_H_ */
#endif /* _SYNCLINK_H_ */