generalize uba code to handle Q bus more gracefully
[unix-history] / usr / src / sys / vax / if / if_uba.h
CommitLineData
da7c5cc6 1/*
0880b18e 2 * Copyright (c) 1982, 1986 Regents of the University of California.
da7c5cc6
KM
3 * All rights reserved. The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
5 *
63503d24 6 * @(#)if_uba.h 7.2 (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 */
63503d24
MK
44 struct uba_regs *iff_uba; /* uba adaptor regs, in vm */
45 struct pte *iff_ubamr; /* uba map regs, in vm */
822a4f2c
MK
46 short iff_flags; /* used during uballoc's */
47};
48
49/*
50 * Information per buffer.
51 */
52struct ifrw {
53 caddr_t ifrw_addr; /* virt addr of header */
3ab9cb88
MK
54 short ifrw_bdp; /* unibus bdp */
55 short ifrw_flags; /* type, etc. */
56#define IFRW_W 0x01 /* is a transmit buffer */
822a4f2c
MK
57 int ifrw_info; /* value from ubaalloc */
58 int ifrw_proto; /* map register prototype */
59 struct pte *ifrw_mr; /* base of map registers */
60};
61
62/*
63 * Information per transmit buffer, including the above.
64 */
65struct ifxmt {
66 struct ifrw ifrw;
67 caddr_t ifw_base; /* virt addr of buffer */
68 struct pte ifw_wmap[IF_MAXNUBAMR]; /* base pages for output */
69 struct mbuf *ifw_xtofree; /* pages being dma'd out */
70 short ifw_xswapd; /* mask of clusters swapped */
92441f6e 71 short ifw_nmr; /* number of entries in wmap */
822a4f2c
MK
72};
73#define ifw_addr ifrw.ifrw_addr
74#define ifw_bdp ifrw.ifrw_bdp
3ab9cb88 75#define ifw_flags ifrw.ifrw_flags
822a4f2c
MK
76#define ifw_info ifrw.ifrw_info
77#define ifw_proto ifrw.ifrw_proto
78#define ifw_mr ifrw.ifrw_mr
79
80/*
81 * Most interfaces have a single receive and a single transmit buffer,
82 * and use struct ifuba to store all of the unibus information.
83 */
84struct ifuba {
85 struct ifubinfo ifu_info;
86 struct ifrw ifu_r;
87 struct ifxmt ifu_xmt;
4ad6429c 88};
8a13b737 89
822a4f2c
MK
90#define ifu_uban ifu_info.iff_uban
91#define ifu_hlen ifu_info.iff_hlen
92#define ifu_uba ifu_info.iff_uba
63503d24 93#define ifu_ubamr ifu_info.iff_ubamr
822a4f2c
MK
94#define ifu_flags ifu_info.iff_flags
95#define ifu_w ifu_xmt.ifrw
96#define ifu_xtofree ifu_xmt.ifw_xtofree
97
8a13b737 98#ifdef KERNEL
822a4f2c
MK
99#define if_ubainit(ifuba, uban, hlen, nmr) \
100 if_ubaminit(&(ifuba)->ifu_info, uban, hlen, nmr, \
8011f5df 101 &(ifuba)->ifu_r, 1, &(ifuba)->ifu_xmt, 1)
822a4f2c
MK
102#define if_rubaget(ifu, totlen, off0, ifp) \
103 if_ubaget(&(ifu)->ifu_info, &(ifu)->ifu_r, totlen, off0, ifp)
104#define if_wubaput(ifu, m) \
8011f5df 105 if_ubaput(&(ifu)->ifu_info, &(ifu)->ifu_xmt, m)
822a4f2c 106struct mbuf *if_ubaget();
8a13b737 107#endif