/****************************************************************************
 * Copyright(c) 2000-2001 Broadcom Corporation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation.
 *
 * Name:        nicext.h
 *
 * Description: Broadcom Network Interface Card Extension (NICE) is an
 *              extension to Linux NET device kernel mode drivers.
 *              NICE is designed to provide additional functionalities,
 *              such as receive packet intercept. To support Broadcom NICE,
 *              the network device driver can be modified by adding an
 *              device ioctl handler and by indicating receiving packets
 *              to the NICE receive handler. Broadcom NICE will only be
 *              enabled by a NICE-aware intermediate driver, such as
 *              Broadcom Advanced Server Program Driver (BASP). When NICE
 *              is not enabled, the modified network device drivers
 *              functions exactly as other non-NICE aware drivers.
 *
 * Author:      Frankie Fan
 *
 * Created:     September 17, 2000
 *
 ****************************************************************************/
#ifndef _nicext_h_
#define _nicext_h_

/*
 * ioctl for NICE
 */
#define SIOCNICE                   	SIOCDEVPRIVATE+7

/*
 * SIOCNICE:
 *
 * The following structure needs to be less than IFNAMSIZ (16 bytes) because
 * we're overloading ifreq.ifr_ifru.
 *
 * If 16 bytes is not enough, we should consider relaxing this because
 * this is no field after ifr_ifru in the ifreq structure. But we may
 * run into future compatiability problem in case of changing struct ifreq.
 */
struct nice_req
{
    __u32 cmd;

    union
    {
#ifdef __KERNEL__
	/* cmd = NICE_CMD_SET_RX or NICE_CMD_GET_RX */
	struct
	{
	    void (*nrqus1_rx)( struct sk_buff*, void* );
	    void* nrqus1_ctx;
	} nrqu_nrqus1;

	/* cmd = NICE_CMD_QUERY_SUPPORT */
	struct
	{
	    __u32 nrqus2_magic;
	    __u32 nrqus2_support_rx:1;
	    __u32 nrqus2_support_vlan:1;
	    __u32 nrqus2_support_get_speed:1;
	} nrqu_nrqus2;
#endif

	/* cmd = NICE_CMD_GET_SPEED */
	struct
	{
	    unsigned int nrqus3_speed; /* 0 if link is down, */
				       /* otherwise speed in Mbps */
	} nrqu_nrqus3;

	/* cmd = NICE_CMD_BLINK_LED */
	struct
	{
	    unsigned int nrqus4_blink_time; /* blink duration in seconds */
	} nrqu_nrqus4;

    } nrq_nrqu;
};

#define nrq_rx           nrq_nrqu.nrqu_nrqus1.nrqus1_rx
#define nrq_ctx          nrq_nrqu.nrqu_nrqus1.nrqus1_ctx
#define nrq_support_rx   nrq_nrqu.nrqu_nrqus2.nrqus2_support_rx
#define nrq_magic        nrq_nrqu.nrqu_nrqus2.nrqus2_magic
#define nrq_support_vlan nrq_nrqu.nrqu_nrqus2.nrqus2_support_vlan
#define nrq_support_get_speed nrq_nrqu.nrqu_nrqus2.nrqus2_support_get_speed
#define nrq_speed        nrq_nrqu.nrqu_nrqus3.nrqus3_speed
#define nrq_blink_time   nrq_nrqu.nrqu_nrqus4.nrqus4_blink_time

/*
 * magic constants
 */
#define NICE_REQUESTOR_MAGIC            0x4543494E /* NICE in ascii */
#define NICE_DEVICE_MAGIC               0x4E494345 /* ECIN in ascii */

/*
 * command field
 */
#define NICE_CMD_QUERY_SUPPORT          0x00000001
#define NICE_CMD_SET_RX                 0x00000002
#define NICE_CMD_GET_RX                 0x00000003
#define NICE_CMD_GET_SPEED              0x00000004
#define NICE_CMD_BLINK_LED              0x00000005

#endif  /* _nicext_h_ */