lint
[unix-history] / usr / src / sys / vax / if / if_uba.h
CommitLineData
da7c5cc6
KM
1/*
2 * Copyright (c) 1982 Regents of the University of California.
3 * All rights reserved. The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
5 *
8011f5df 6 * @(#)if_uba.h 6.6 (Berkeley) %G%
da7c5cc6 7 */
4ad6429c
BJ
8
9/*
10 * Structure and routine definitions
11 * for UNIBUS network interfaces.
12 */
13
b454c3ea 14#define IF_MAXNUBAMR 10
4ad6429c 15/*
822a4f2c
MK
16 * Each interface has structures giving information
17 * about UNIBUS resources held by the interface
18 * for each send and receive buffer.
4ad6429c
BJ
19 *
20 * We hold IF_NUBAMR map registers for datagram data, starting
21 * at ifr_mr. Map register ifr_mr[-1] maps the local network header
22 * ending on the page boundary. Bdp's are reserved for read and for
23 * write, given by ifr_bdp. The prototype of the map register for
24 * read and for write is saved in ifr_proto.
25 *
26 * When write transfers are not full pages on page boundaries we just
27 * copy the data into the pages mapped on the UNIBUS and start the
28 * transfer. If a write transfer is of a (1024 byte) page on a page
29 * boundary, we swap in UNIBUS pte's to reference the pages, and then
30 * remap the initial pages (from ifu_wmap) when the transfer completes.
31 *
32 * When read transfers give whole pages of data to be input, we
33 * allocate page frames from a network page list and trade them
34 * with the pages already containing the data, mapping the allocated
35 * pages to replace the input pages for the next UNIBUS data input.
36 */
822a4f2c
MK
37
38/*
39 * Information per interface.
40 */
41struct ifubinfo {
42 short iff_uban; /* uba number */
43 short iff_hlen; /* local net header length */
44 struct uba_regs *iff_uba; /* uba regs, in vm */
45 short iff_flags; /* used during uballoc's */
46};
47
48/*
49 * Information per buffer.
50 */
51struct ifrw {
52 caddr_t ifrw_addr; /* virt addr of header */
3ab9cb88
MK
53 short ifrw_bdp; /* unibus bdp */
54 short ifrw_flags; /* type, etc. */
55#define IFRW_W 0x01 /* is a transmit buffer */
822a4f2c
MK
56 int ifrw_info; /* value from ubaalloc */
57 int ifrw_proto; /* map register prototype */
58 struct pte *ifrw_mr; /* base of map registers */
59};
60
61/*
62 * Information per transmit buffer, including the above.
63 */
64struct ifxmt {
65 struct ifrw ifrw;
66 caddr_t ifw_base; /* virt addr of buffer */
67 struct pte ifw_wmap[IF_MAXNUBAMR]; /* base pages for output */
68 struct mbuf *ifw_xtofree; /* pages being dma'd out */
69 short ifw_xswapd; /* mask of clusters swapped */
92441f6e 70 short ifw_nmr; /* number of entries in wmap */
822a4f2c
MK
71};
72#define ifw_addr ifrw.ifrw_addr
73#define ifw_bdp ifrw.ifrw_bdp
3ab9cb88 74#define ifw_flags ifrw.ifrw_flags
822a4f2c
MK
75#define ifw_info ifrw.ifrw_info
76#define ifw_proto ifrw.ifrw_proto
77#define ifw_mr ifrw.ifrw_mr
78
79/*
80 * Most interfaces have a single receive and a single transmit buffer,
81 * and use struct ifuba to store all of the unibus information.
82 */
83struct ifuba {
84 struct ifubinfo ifu_info;
85 struct ifrw ifu_r;
86 struct ifxmt ifu_xmt;
4ad6429c 87};
8a13b737 88
822a4f2c
MK
89#define ifu_uban ifu_info.iff_uban
90#define ifu_hlen ifu_info.iff_hlen
91#define ifu_uba ifu_info.iff_uba
92#define ifu_flags ifu_info.iff_flags
93#define ifu_w ifu_xmt.ifrw
94#define ifu_xtofree ifu_xmt.ifw_xtofree
95
8a13b737 96#ifdef KERNEL
822a4f2c
MK
97#define if_ubainit(ifuba, uban, hlen, nmr) \
98 if_ubaminit(&(ifuba)->ifu_info, uban, hlen, nmr, \
8011f5df 99 &(ifuba)->ifu_r, 1, &(ifuba)->ifu_xmt, 1)
822a4f2c
MK
100#define if_rubaget(ifu, totlen, off0, ifp) \
101 if_ubaget(&(ifu)->ifu_info, &(ifu)->ifu_r, totlen, off0, ifp)
102#define if_wubaput(ifu, m) \
8011f5df 103 if_ubaput(&(ifu)->ifu_info, &(ifu)->ifu_xmt, m)
822a4f2c 104struct mbuf *if_ubaget();
8a13b737 105#endif