1/*
2 * Constants etc. for the Bochs/Etherboot pseudo-NIC
3 *
4 * This header file must be valid C and C++.
5 *
6 * Operation of the pseudo-NIC (PNIC) is pretty simple.  To write a
7 * command plus data, first write the length of the data to
8 * PNIC_REG_LEN, then write the data a byte at a type to
9 * PNIC_REG_DATA, then write the command code to PNIC_REG_CMD.  The
10 * status will be available from PNIC_REG_STAT.  The length of any
11 * data returned will be in PNIC_REG_LEN and can be read a byte at a
12 * time from PNIC_REG_DATA.
13 */
14
15FILE_LICENCE ( GPL2_OR_LATER );
16
17/*
18 * PCI parameters
19 */
20#define PNIC_PCI_VENDOR	0xfefe	/* Hopefully these won't clash with */
21#define PNIC_PCI_DEVICE 0xefef	/* any real PCI device IDs.         */
22
23/*
24 * 'Hardware' register addresses, offset from io_base
25 */
26#define PNIC_REG_CMD	0x00	/* Command register, 2 bytes, write only */
27#define PNIC_REG_STAT	0x00	/* Status register, 2 bytes, read only */
28#define PNIC_REG_LEN	0x02	/* Length register, 2 bytes, read-write */
29#define PNIC_REG_DATA	0x04	/* Data port, 1 byte, read-write */
30/*
31 * PNIC_MAX_REG used in Bochs to claim i/o space
32 */
33#define PNIC_MAX_REG	0x04
34
35/*
36 * Command code definitions: write these into PNIC_REG_CMD
37 */
38#define PNIC_CMD_NOOP		0x0000
39#define PNIC_CMD_API_VER	0x0001
40#define PNIC_CMD_READ_MAC	0x0002
41#define PNIC_CMD_RESET		0x0003
42#define PNIC_CMD_XMIT		0x0004
43#define PNIC_CMD_RECV		0x0005
44#define PNIC_CMD_RECV_QLEN	0x0006
45#define PNIC_CMD_MASK_IRQ	0x0007
46#define PNIC_CMD_FORCE_IRQ	0x0008
47
48/*
49 * Status code definitions: read these from PNIC_REG_STAT
50 *
51 * We avoid using status codes that might be confused with
52 * randomly-read data (e.g. 0x0000, 0xffff etc.)
53 */
54#define PNIC_STATUS_OK		0x4f4b		/* 'OK' */
55#define PNIC_STATUS_UNKNOWN_CMD	0x3f3f		/* '??' */
56
57/*
58 * Other miscellaneous information
59 */
60
61#define PNIC_API_VERSION	0x0101		/* 1.1 */
62