/******************************************************************************
 * Copyright (c) 2004, 2008 IBM Corporation
 * All rights reserved.
 * This program and the accompanying materials
 * are made available under the terms of the BSD License
 * which accompanies this distribution, and is available at
 * http://www.opensource.org/licenses/bsd-license.php
 *
 * Contributors:
 *     IBM Corporation - initial implementation
 *****************************************************************************/

#ifndef _NETDRIVER_INT_H
#define _NETDRIVER_INT_H
#include <stddef.h>
#include <unistd.h> /* ssize_t */
#include <fileio.h>

#if defined(__GNUC__) && !defined(UNUSED)
# define UNUSED __attribute__((unused))
#else
# define UNUSED
#endif

typedef struct {
	unsigned int addr;
	unsigned int size;
	int type;
} bar_t;

typedef enum {
	CONFIG_TYPE_PCI,
	CONFIG_TYPE_VIO
} mod_config_type;

typedef struct {
	mod_config_type config_type;
	unsigned long long puid;
	unsigned int bus;
	unsigned int devfn;
	unsigned int vendor_id;
	unsigned int device_id;
	unsigned int revision_id;
	unsigned int class_code;
	bar_t bars[6];
	unsigned int interrupt_line;
} pci_config_t;

typedef struct {
	mod_config_type config_type;
	unsigned int reg_len;
	unsigned int reg[12];
	char	     compat[64];
} vio_config_t;

#define MOD_TYPE_NETWORK 0
#define MOD_TYPE_OTHER   1

typedef int (*mod_init_t)  (void);
typedef int (*mod_term_t)  (void);
typedef int (*mod_socket_t)(snk_fileio_t *, int dom, int type, int proto);
typedef int (*mod_open_t)  (snk_fileio_t *, const char *, int);
typedef int (*mod_read_t)  (char *, int);
typedef int (*mod_write_t) (char *, int);
typedef int (*mod_ioctl_t) (int, void *);

typedef struct {
	int version;
	int type;
	int running;
	void *link_addr;
	mod_init_t   init;
	mod_term_t   term;
	mod_socket_t socket;
	mod_open_t   open;
	mod_read_t   read;
	mod_write_t  write;
	mod_ioctl_t  ioctl;

	char mac_addr[6];
} snk_module_t;

#define MODULES_MAX 10
extern snk_module_t *snk_modules[MODULES_MAX];

typedef int (*print_t) (const char *, ...);
typedef void (*us_delay_t) (unsigned int);
typedef void (*ms_delay_t) (unsigned int);
typedef int (*pci_config_read_t) (long long puid, int size,
				  int bus, int devfn, int offset);
typedef int (*pci_config_write_t) (long long puid, int size,
				   int bus, int devfn, int offset, int value);
typedef void *(*malloc_aligned_t) (size_t, int);
typedef void *(*malloc_t) (size_t);
typedef void (*free_t)    (void *);
typedef int (*strcmp_t)   (const char *, const char *);
typedef int (*snk_call_t) (int, char **);
typedef unsigned int (*io_read_t) (void *, size_t);
typedef int (*io_write_t) (void *, unsigned int, size_t);
typedef unsigned int (*romfs_lookup_t) (const char *name, void **addr);
typedef void (*translate_addr_t) (unsigned long *);

typedef int (*k_open_t) (const char *, int);
typedef int (*k_close_t) (int);
typedef ssize_t (*k_read_t) (int, void *, size_t);
typedef ssize_t (*k_write_t) (int, const void *, size_t);
typedef int (*k_ioctl_t) (int, int, void *);

typedef void (*modules_remove_t) (int);
typedef snk_module_t *(*modules_load_t) (int);

typedef long (*dma_map_in_t)(void *address, long size, int cachable);
typedef void (*dma_map_out_t)(void *address, long devaddr, long size);

typedef struct {
	int version;
	print_t print;
	us_delay_t us_delay;
	ms_delay_t ms_delay;
	pci_config_read_t pci_config_read;
	pci_config_write_t pci_config_write;
	malloc_t k_malloc;
	malloc_aligned_t k_malloc_aligned;
	free_t k_free;
	strcmp_t strcmp;
	snk_call_t snk_call;
	io_read_t io_read;
	io_write_t io_write;
	romfs_lookup_t k_romfs_lookup;
	translate_addr_t translate_addr;
	union {
		pci_config_t pci_conf;
		vio_config_t vio_conf;
	};
	k_open_t k_open;
	k_close_t k_close;
	k_read_t k_read;
	k_write_t k_write;
	k_ioctl_t k_ioctl;
	modules_remove_t modules_remove;
	modules_load_t modules_load;
	dma_map_in_t dma_map_in;
	dma_map_out_t dma_map_out;
} snk_kernel_t;

/* Entry of module */
snk_module_t *module_init(snk_kernel_t * snk_kernel_int,
                          pci_config_t * pciconf);


/*
 * Constants for different kinds of IOCTL requests
 */

#define SIOCETHTOOL  0x1000

/*
 * special structure and constants for IOCTL requests of type ETHTOOL
 */

#define ETHTOOL_GMAC         0x03
#define ETHTOOL_SMAC         0x04
#define ETHTOOL_VERSION      0x05

typedef struct {
	int idx;
	char address[6];
} ioctl_ethtool_mac_t;

typedef struct {
	unsigned int length;
	char *text;
} ioctl_ethtool_version_t;


/*
 * default structure and constants for IOCTL requests
 */

#define IF_NAME_SIZE 0xFF

typedef struct {
	char if_name[IF_NAME_SIZE];
	int subcmd;
	union {
		ioctl_ethtool_mac_t mac;
		ioctl_ethtool_version_t version;
	} data;
} ioctl_net_data_t;

#endif				/* _NETDRIVER_INT_H */
