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 * 6 * @(#)if_uba.h 6.6 (Berkeley) 02/23/86 7 */ 8 9 /* 10 * Structure and routine definitions 11 * for UNIBUS network interfaces. 12 */ 13 14 #define IF_MAXNUBAMR 10 15 /* 16 * Each interface has structures giving information 17 * about UNIBUS resources held by the interface 18 * for each send and receive buffer. 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 */ 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 */ 53 short ifrw_bdp; /* unibus bdp */ 54 short ifrw_flags; /* type, etc. */ 55 #define IFRW_W 0x01 /* is a transmit buffer */ 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 short ifw_nmr; /* number of entries in wmap */ 71 }; 72 #define ifw_addr ifrw.ifrw_addr 73 #define ifw_bdp ifrw.ifrw_bdp 74 #define ifw_flags ifrw.ifrw_flags 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 */ 83 struct ifuba { 84 struct ifubinfo ifu_info; 85 struct ifrw ifu_r; 86 struct ifxmt ifu_xmt; 87 }; 88 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 96 #ifdef KERNEL 97 #define if_ubainit(ifuba, uban, hlen, nmr) \ 98 if_ubaminit(&(ifuba)->ifu_info, uban, hlen, nmr, \ 99 &(ifuba)->ifu_r, 1, &(ifuba)->ifu_xmt, 1) 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) \ 103 if_ubaput(&(ifu)->ifu_info, &(ifu)->ifu_xmt, m) 104 struct mbuf *if_ubaget(); 105 #endif 106