// SPDX-License-Identifier: GPL-2.0+
/************************************************************************
 *
 *	io_edgeport.h	Edgeport Linux Interface definitions
 *
 *	Copyright (C) 2000 Inside Out Networks, Inc.
 *
 ************************************************************************/

#if !defined(_IO_EDGEPORT_H_)
#define	_IO_EDGEPORT_H_


#define MAX_RS232_PORTS		8	/* Max # of RS-232 ports per device */

/* typedefs that the insideout headers need */
#ifndef LOW8
	#define LOW8(a)		((unsigned char)(a & 0xff))
#endif
#ifndef HIGH8
	#define HIGH8(a)	((unsigned char)((a & 0xff00) >> 8))
#endif

#ifndef __KERNEL__
#define __KERNEL__
#endif

#include "io_usbvend.h"



/* The following table is used to map the USBx port number to
 * the device serial number (or physical USB path), */
#define MAX_EDGEPORTS	64

struct comMapper {
	char	SerialNumber[MAX_SERIALNUMBER_LEN+1];	/* Serial number/usb path */
	int	numPorts;				/* Number of ports */
	int	Original[MAX_RS232_PORTS];		/* Port numbers set by IOCTL */
	int	Port[MAX_RS232_PORTS];			/* Actual used port numbers */
};


#define EDGEPORT_CONFIG_DEVICE "/proc/edgeport"

/* /proc/edgeport Interface
 * This interface uses read/write/lseek interface to talk to the edgeport driver
 * the following read functions are supported: */
#define PROC_GET_MAPPING_TO_PATH	1
#define PROC_GET_COM_ENTRY		2
#define PROC_GET_EDGE_MANUF_DESCRIPTOR	3
#define PROC_GET_BOOT_DESCRIPTOR	4
#define PROC_GET_PRODUCT_INFO		5
#define PROC_GET_STRINGS		6
#define PROC_GET_CURRENT_COM_MAPPING	7

/* The parameters to the lseek() for the read is: */
#define PROC_READ_SETUP(Command, Argument)	((Command) + ((Argument)<<8))


/* the following write functions are supported: */
#define PROC_SET_COM_MAPPING		1
#define PROC_SET_COM_ENTRY		2


/* The following structure is passed to the write */
struct procWrite {
	int	Command;
	union {
		struct comMapper	Entry;
		int			ComMappingBasedOnUSBPort;	/* Boolean value */
	} u;
};

/*
 *	Product information read from the Edgeport
 */
struct edgeport_product_info {
	__u16	ProductId;			/* Product Identifier */
	__u8	NumPorts;			/* Number of ports on edgeport */
	__u8	ProdInfoVer;			/* What version of structure is this? */

	__u32	IsServer        :1;		/* Set if Server */
	__u32	IsRS232         :1;		/* Set if RS-232 ports exist */
	__u32	IsRS422         :1;		/* Set if RS-422 ports exist */
	__u32	IsRS485         :1;		/* Set if RS-485 ports exist */
	__u32	IsReserved      :28;		/* Reserved for later expansion */

	__u8	RomSize;			/* Size of ROM/E2PROM in K */
	__u8	RamSize;			/* Size of external RAM in K */
	__u8	CpuRev;				/* CPU revision level (chg only if s/w visible) */
	__u8	BoardRev;			/* PCB revision level (chg only if s/w visible) */

	__u8	BootMajorVersion;		/* Boot Firmware version: xx. */
	__u8	BootMinorVersion;		/*			  yy. */
	__le16	BootBuildNumber;		/*			  zzzz (LE format) */

	__u8	FirmwareMajorVersion;		/* Operational Firmware version:xx. */
	__u8	FirmwareMinorVersion;		/*				yy. */
	__le16	FirmwareBuildNumber;		/*				zzzz (LE format) */

	__u8	ManufactureDescDate[3];		/* MM/DD/YY when descriptor template was compiled */
	__u8	HardwareType;

	__u8	iDownloadFile;			/* What to download to EPiC device */
	__u8	EpicVer;			/* What version of EPiC spec this device supports */

	struct edge_compatibility_bits Epic;
};

/*
 *	Edgeport Stringblock String locations
 */
#define EDGESTRING_MANUFNAME		1	/* Manufacture Name */
#define EDGESTRING_PRODNAME		2	/* Product Name */
#define EDGESTRING_SERIALNUM		3	/* Serial Number */
#define EDGESTRING_ASSEMNUM		4	/* Assembly Number */
#define EDGESTRING_OEMASSEMNUM		5	/* OEM Assembly Number */
#define EDGESTRING_MANUFDATE		6	/* Manufacture Date */
#define EDGESTRING_ORIGSERIALNUM	7	/* Serial Number */

struct string_block {
	__u16	NumStrings;			/* Number of strings in block */
	__u16	Strings[1];			/* Start of string block */
};



#endif
