on uba reset remap already allocated pages
[unix-history] / usr / src / sys / vax / if / if_uba.c
index f715f20..c9298a2 100644 (file)
@@ -1,4 +1,4 @@
-/*     if_uba.c        4.8     81/12/23        */
+/*     if_uba.c        4.11    82/05/19        */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -11,6 +11,7 @@
 #include "../h/cmap.h"
 #include "../h/mtpr.h"
 #include "../h/vmmac.h"
 #include "../h/cmap.h"
 #include "../h/mtpr.h"
 #include "../h/vmmac.h"
+#include "../h/socket.h"
 #include "../net/in.h"
 #include "../net/in_systm.h"
 #include "../net/if.h"
 #include "../net/in.h"
 #include "../net/in_systm.h"
 #include "../net/if.h"
@@ -39,14 +40,18 @@ if_ubainit(ifu, uban, hlen, nmr)
 
 COUNT(IF_UBAINIT);
        ncl = clrnd(nmr + CLSIZE) / CLSIZE;
 
 COUNT(IF_UBAINIT);
        ncl = clrnd(nmr + CLSIZE) / CLSIZE;
-       cp = m_clalloc(2 * ncl, MPG_SPACE);
-       if (cp == 0)
-               return (0);
-       ifu->ifu_hlen = hlen;
-       ifu->ifu_uban = uban;
-       ifu->ifu_uba = uba_hd[uban].uh_uba;
-       ifu->ifu_r.ifrw_addr = cp + CLBYTES - hlen;
-       ifu->ifu_w.ifrw_addr = ifu->ifu_r.ifrw_addr + ncl * CLBYTES;
+       if (ifu->ifu_r.ifrw_addr)
+               cp = ifu->ifu_r.ifrw_addr - (CLBYTES - hlen);
+       else {
+               cp = m_clalloc(2 * ncl, MPG_SPACE);
+               if (cp == 0)
+                       return (0);
+               ifu->ifu_r.ifrw_addr = cp + CLBYTES - hlen;
+               ifu->ifu_w.ifrw_addr = ifu->ifu_r.ifrw_addr + ncl * CLBYTES;
+               ifu->ifu_hlen = hlen;
+               ifu->ifu_uban = uban;
+               ifu->ifu_uba = uba_hd[uban].uh_uba;
+       }
        if (if_ubaalloc(ifu, &ifu->ifu_r, nmr) == 0)
                goto bad;
        if (if_ubaalloc(ifu, &ifu->ifu_w, nmr) == 0)
        if (if_ubaalloc(ifu, &ifu->ifu_r, nmr) == 0)
                goto bad;
        if (if_ubaalloc(ifu, &ifu->ifu_w, nmr) == 0)
@@ -59,13 +64,14 @@ bad2:
        ubarelse(ifu->ifu_uban, &ifu->ifu_r.ifrw_info);
 bad:
        m_pgfree(cp, 2 * ncl);
        ubarelse(ifu->ifu_uban, &ifu->ifu_r.ifrw_info);
 bad:
        m_pgfree(cp, 2 * ncl);
+       ifu->ifu_r.ifrw_addr = 0;
        return (0);
 }
 
 /*
  * Setup either a ifrw structure by allocating UNIBUS map registers,
        return (0);
 }
 
 /*
  * Setup either a ifrw structure by allocating UNIBUS map registers,
- * a buffered data path, and initializing the fields of the ifrw structure
- * to minimize run-time overhead.
+ * possibly a buffered data path, and initializing the fields of
+ * the ifrw structure to minimize run-time overhead.
  */
 static
 if_ubaalloc(ifu, ifrw, nmr)
  */
 static
 if_ubaalloc(ifu, ifrw, nmr)
@@ -78,7 +84,7 @@ if_ubaalloc(ifu, ifrw, nmr)
 COUNT(IF_UBAALLOC);
        info =
            uballoc(ifu->ifu_uban, ifrw->ifrw_addr, nmr*NBPG + ifu->ifu_hlen,
 COUNT(IF_UBAALLOC);
        info =
            uballoc(ifu->ifu_uban, ifrw->ifrw_addr, nmr*NBPG + ifu->ifu_hlen,
-               UBA_NEED16|UBA_NEEDBDP);
+               ifu->ifu_flags);
        if (info == 0)
                return (0);
        ifrw->ifrw_info = info;
        if (info == 0)
                return (0);
        ifrw->ifrw_info = info;