/*      $NetBSD: scsi_ctron_ether.h,v 1.9 2005/12/11 12:23:50 christos Exp $    */

/*
* SCSI interface description
*/


/*
* SCSI command format
*/

#define CTRON_ETHERCMD2(OP, SUB) {OP, SUB}
#define CTRON_ETHER_SEND CTRON_ETHERCMD2(0xc, 0x1)
#define CTRON_ETHER_RECV 0xe1
#define CTRON_ETHER_GET_ADDR CTRON_ETHERCMD2(0xc, 0x4)
#define CTRON_ETHER_ADD_PROTO CTRON_ETHERCMD2(0xd, 0x1)
#define CTRON_ETHER_REM_PROTO CTRON_ETHERCMD2(0xd, 0x2)
#define CTRON_ETHER_SET_MODE CTRON_ETHERCMD2(0xd, 0x3)
#define CTRON_ETHER_SET_MULTI CTRON_ETHERCMD2(0xd, 0x4)
#define CTRON_ETHER_REMOVE_MULTI CTRON_ETHERCMD2(0xd, 0x5)
#define CTRON_ETHER_GET_STATS CTRON_ETHERCMD2(0xd, 0x6)
#define CTRON_ETHER_SET_MEDIA CTRON_ETHERCMD2(0xd, 0x07)
#define CTRON_ETHER_GET_MEDIA CTRON_ETHERCMD2(0xd, 0x08)
#define CTRON_ETHER_SET_ADDR CTRON_ETHERCMD2(0xd, 0xA)
#define CTRON_ETHER_LOAD_IMAGE CTRON_ETHERCMD2(0xd, 0x09)
#define IS_RECV(generic) ((generic)->opcode == 0xe1)
#define IS_SEND(generic) ((generic)->opcode == 0xc && (generic)->bytes[0] == 0x1)

struct scsi_ctron_ether_recv {
       u_int8_t opcode;        /* This really *is* all */
};

struct scsi_ctron_ether_generic {
       u_int8_t opcode[2];
       u_int8_t byte3;
       u_int8_t length[2];
       u_int8_t byte6;
};

struct scsi_ctron_ether_set_mode {
       u_int8_t opcode[2];
       u_int8_t mode;
       u_int8_t length[2];
       u_int8_t byte6;
};


struct ctron_stats {
       u_int32_t  frames_xmit;
       u_int32_t  bytes_xmit;
       u_int32_t  ucast_xmit;                  /* never incremented? */
       u_int32_t  mcast_xmit;                  /* gets ucasts and mcasts?? */
       u_int32_t  bcast_xmit;
       u_int32_t  defer_xmit;
       u_int32_t  sgl_coll;
       u_int32_t  multi_coll;
       u_int32_t  tot_xmit_err;
       u_int32_t  late_coll;
       u_int32_t  excess_coll;
       u_int32_t  int_err_xmit;
       u_int32_t  carr_err;
       u_int32_t  media_abort;
       u_int32_t  frames_rec;
       u_int32_t  bytes_rec;
       u_int32_t  ucast_rec;                   /* never incremented? */
       u_int32_t  mcast_rec;                   /* gets ucasts and mcasts?? */
       u_int32_t  bcast_rec;
       u_int32_t  tot_rec_err;
       u_int32_t  too_long;
       u_int32_t  too_short;
       u_int32_t  align_err;
       u_int32_t  crc_err;
       u_int32_t  len_err;
       u_int32_t  int_err_rec;
       u_int32_t  sqe_err;
};

struct scsi_ctron_ether_inquiry_data {
/* standard; */
       u_int8_t device;                /* 3 (T_CPU) */
       u_int8_t dev_qual2;             /* 0 (fixed) */
       u_int8_t version;               /* 0 */
       u_int8_t response_format;               /* 0 */
       u_int8_t additional_len;        /* 75!! */
       u_int8_t unused[2];             /* 0, 0 */
       u_int8_t flags;                 /* 0x18 (sync+linked!?) */
       char vendor[8];                 /* ie; "Cabletrn" or "CABLETRN" */
       char product[16];               /* ie; "EA412/...." */
       char revision[4];               /* ie; "0100" or "1.00" */
       char extra[8];                  /* ie; "00.00.19" or "01.00.00" */
/* non-standard; */
       u_int8_t hwaddr[6];             /* PROM ethernet addr */
       u_int8_t swaddr[6];             /* curr ethernet addr */
       char date[22];                  /* firmware date string (asciz) */
       u_int8_t mtype;                 /* media type?? */
       u_int8_t hwport;                /* value of h/w read port?? */
};

enum scsi_ctron_ether_media {
       CMEDIA_PRIMARY=0,               /* twisted pair */
       CMEDIA_SECONDARY=1,             /* coax */
       CMEDIA_AUTOSENSE=2              /* set_media command only */
};