Commit | Line | Data |
---|---|---|
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 | * | |
3ab9cb88 | 6 | * @(#)if_uba.h 6.4 (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 | */ | |
41 | struct 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 | */ | |
51 | struct 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 | */ | |
64 | struct 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 */ | |
70 | }; | |
71 | #define ifw_addr ifrw.ifrw_addr | |
72 | #define ifw_bdp ifrw.ifrw_bdp | |
3ab9cb88 | 73 | #define ifw_flags ifrw.ifrw_flags |
822a4f2c MK |
74 | #define ifw_info ifrw.ifrw_info |
75 | #define ifw_proto ifrw.ifrw_proto | |
76 | #define ifw_mr ifrw.ifrw_mr | |
77 | ||
78 | /* | |
79 | * Most interfaces have a single receive and a single transmit buffer, | |
80 | * and use struct ifuba to store all of the unibus information. | |
81 | */ | |
82 | struct ifuba { | |
83 | struct ifubinfo ifu_info; | |
84 | struct ifrw ifu_r; | |
85 | struct ifxmt ifu_xmt; | |
4ad6429c | 86 | }; |
8a13b737 | 87 | |
822a4f2c MK |
88 | #define ifu_uban ifu_info.iff_uban |
89 | #define ifu_hlen ifu_info.iff_hlen | |
90 | #define ifu_uba ifu_info.iff_uba | |
91 | #define ifu_flags ifu_info.iff_flags | |
92 | #define ifu_w ifu_xmt.ifrw | |
93 | #define ifu_xtofree ifu_xmt.ifw_xtofree | |
94 | ||
8a13b737 | 95 | #ifdef KERNEL |
822a4f2c MK |
96 | #define if_ubainit(ifuba, uban, hlen, nmr) \ |
97 | if_ubaminit(&(ifuba)->ifu_info, uban, hlen, nmr, \ | |
98 | &(ifuba)->ifu_r, 1, &(ifuba)->ifu_w, 1) | |
99 | #define if_rubaget(ifu, totlen, off0, ifp) \ | |
100 | if_ubaget(&(ifu)->ifu_info, &(ifu)->ifu_r, totlen, off0, ifp) | |
101 | #define if_wubaput(ifu, m) \ | |
102 | if_ubaput(&(ifu)->ifu_info, &(ifu)->ifu_w, m) | |
103 | struct mbuf *if_ubaget(); | |
8a13b737 | 104 | #endif |