|
|
1.1 ! root 1: #include "dr.h" ! 2: #if NDR > 0 ! 3: ! 4: /* DRV11-W DMA interface driver utility ! 5: * ! 6: */ ! 7: ! 8: #include "../machine/pte.h" ! 9: #include "../machine/mtpr.h" ! 10: #include "../h/param.h" ! 11: #include "../h/conf.h" ! 12: #include "../h/dir.h" ! 13: #include "../h/user.h" ! 14: #include "../h/proc.h" ! 15: #include "../h/map.h" ! 16: #include "../h/ioctl.h" ! 17: #include "../h/buf.h" ! 18: #include "../h/vm.h" ! 19: #include "../h/uio.h" ! 20: ! 21: #include "../vba/vbavar.h" ! 22: #include "../h/drreg.h" ! 23: ! 24: extern struct vba_device *drinfo[]; ! 25: extern struct dr_aux dr_aux[]; ! 26: ! 27: #define YES 1 ! 28: #define NO 0 ! 29: ! 30: #define RSUNIT(dev) (minor(dev) & 7) ! 31: ! 32: #define SPL_UP spl8 ! 33: ! 34: /* -------- Per-unit data -------- */ ! 35: ! 36: extern struct dr_aux dr_aux[]; ! 37: extern struct vba_device *drinfo[]; ! 38: ! 39: dr11open (dev, flag) ! 40: dev_t dev; ! 41: int flag; ! 42: { ! 43: if (!(suser())) return(EPERM); ! 44: return 0; ! 45: } ! 46: ! 47: dr11close (dev) ! 48: dev_t dev; ! 49: { ! 50: return; ! 51: } ! 52: ! 53: ! 54: dr11ioctl(dev, cmd, data, flag) ! 55: dev_t dev; ! 56: int cmd; ! 57: struct dr11io *data; ! 58: int flag; ! 59: { ! 60: register int unit = data->arg[0]; ! 61: register struct dr_aux *dra; ! 62: register struct rsdevice *rsaddr; ! 63: struct dr11io dio; ! 64: ushort temp, s, errcode, status; ! 65: ! 66: dra = &dr_aux[unit]; ! 67: if (!(dra->dr_flags & DR_PRES)) return(ENODEV); ! 68: rsaddr = RSADDR(unit); ! 69: switch (cmd) { ! 70: ! 71: case DR11STAT: ! 72: /* Copy back dr11 status to user */ ! 73: data->arg[0] = dra->dr_flags; ! 74: data->arg[1] = rsaddr->dr_cstat; ! 75: data->arg[2] = dra->dr_istat; /* Status reg. at last interrupt */ ! 76: data->arg[3] = rsaddr->dr_data; /* P-i/o input data */ ! 77: status = (ushort)((rsaddr->dr_addmod << 8) & 0xff00); ! 78: data->arg[4] = status | (ushort)(rsaddr->dr_intvect & 0xff); ! 79: data->arg[5] = rsaddr->dr_range; ! 80: data->arg[6] = rsaddr->dr_rahi; ! 81: data->arg[7] = rsaddr->dr_ralo; ! 82: break; ! 83: case DR11LOOP: ! 84: /* Perform loopback test -- MUST HAVE LOOPBACK CABLE ATTACHED -- ! 85: Test results are printed on system console */ ! 86: dr11loop(rsaddr,dra,unit); ! 87: break; ! 88: ! 89: default: ! 90: break; ! 91: } ! 92: ! 93: #ifdef DR_DEBUG ! 94: /* ! 95: +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! 96: printf("\n\t------------- DR11 Status ------------"); ! 97: printf("\n\t dr_flags CSR istat idata modvec dmacnt hiadr loadr"); ! 98: printf("\n\t %lx %lx %lx %lx %lx %ld %lx %lx\n", ! 99: data->arg[0],data->arg[1],data->arg[2],data->arg[3] & 0xffff, ! 100: data->arg[4],data->arg[5],data->arg[6],data->arg[7]); ! 101: +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! 102: */ ! 103: #endif ! 104: ! 105: return 0; ! 106: } ! 107: ! 108: #define NPAT 2 ! 109: #define DMATBL 20 ! 110: ushort tstpat[DMATBL] = { 0xAAAA, 0x5555}; ! 111: long DMAin = 0; ! 112: ! 113: dr11loop(dr,dra,unit) ! 114: struct rsdevice *dr; ! 115: struct dr_aux *dra; ! 116: long unit; ! 117: { register long result, ix; ! 118: long baddr, wait; ! 119: ! 120: dr->dr_cstat = MCLR; /* Clear board & device, disable intr */ ! 121: ! 122: /* Perform loopback test -- MUST HAVE LOOPBACK CABLE ATTACHED -- ! 123: Test results are printed on system console */ ! 124: printf("\n\t ----- DR11 unit %ld loopback test -----",unit); ! 125: ! 126: printf("\n\t Program I/O ..."); ! 127: for (ix=0;ix<NPAT;ix++) { ! 128: dr->dr_data = tstpat[ix]; /* Write to Data out register */ ! 129: result = (dr->dr_data & 0xFFFF); /* Read it back */ ! 130: if (result != tstpat[ix]) { ! 131: printf("Failed, expected : %lx --- actual : %lx", ! 132: tstpat[ix],result); ! 133: return; ! 134: } ! 135: } ! 136: ! 137: printf("OK\n\t Functions & Status Bits ..."); ! 138: dr->dr_cstat = (FCN1 | FCN3); ! 139: result = dr->dr_cstat & 0xffff; /* Read them back */ ! 140: if ((result & (STTC | STTA)) != (STTC |STTA)) { ! 141: printf("Failed, expected : %lx --- actual : %lx, ISR:%lx", ! 142: (STTA|STTC),(result & (STTA|STTC)), result); ! 143: return; ! 144: } ! 145: dr->dr_cstat = FCN2; ! 146: result = dr->dr_cstat & 0xffff; /* Read them back */ ! 147: if ((result & STTB) != STTB) { ! 148: printf("Failed, expected : %lx --- actual : %lx, ISR:%lx", ! 149: STTB,(result & STTB), result); ! 150: return; ! 151: } ! 152: ! 153: printf("OK\n\t DMA output ..."); ! 154: ! 155: if (DMAin) goto dmain; ! 156: ! 157: /* Initialize DMA data buffer */ ! 158: for(ix=0;ix<DMATBL;ix++) tstpat[ix] = 0xCCCC + ix; ! 159: tstpat[DMATBL-1] = 0xCCCC; /* Last word output */ ! 160: ! 161: /* Setup normal DMA */ ! 162: baddr = (long)vtoph(0,tstpat); /* Virtual --> physical */ ! 163: dr->dr_walo = (ushort)((baddr >> 1) & 0xffff); ! 164: dr->dr_wahi = (ushort)((baddr >> 17) & 0x7fff); ! 165: ! 166: /* Set DMA range count: (number of words - 1) */ ! 167: dr->dr_range = (ushort)(DMATBL - 1); ! 168: ! 169: /* Set address modifier code to be used for DMA access to memory */ ! 170: dr->dr_addmod = (char)DRADDMOD; ! 171: ! 172: /* Clear dmaf and attf to assure a clean dma start, also disable ! 173: attention interrupt ! 174: */ ! 175: dr->dr_pulse = (ushort)(RDMA|RATN|RMSK); /* Use pulse register */ ! 176: dr->dr_cstat = (GO|CYCL); /* GO...... */ ! 177: ! 178: /* Wait for DMA complete; REDY and DMAF are true in ISR */ ! 179: wait = 0; ! 180: while ((result=(dr->dr_cstat & (REDY | DMAF))) != (REDY|DMAF)) { ! 181: printf("\n\tWait for DMA complete...ISR : %lx",result); ! 182: if (++wait > 5) { ! 183: printf("\n\t DMA output fails...timeout!!, ISR:%lx", ! 184: result); ! 185: return; ! 186: } ! 187: } ! 188: ! 189: result = dr->dr_data & 0xffff; /* Read last word output */ ! 190: if (result != 0xCCCC) { ! 191: printf("\n\t Fails, expected : %lx --- actual : %lx", ! 192: 0xCCCC,result); ! 193: return; ! 194: } ! 195: ! 196: printf("OK\n\t DMA input ..."); ! 197: ! 198: dmain: ! 199: dr->dr_data = 0x1111; /* DMA input data */ ! 200: /* Setup normal DMA */ ! 201: baddr = (long)vtoph(0,tstpat); /* Virtual --> physical */ ! 202: dr->dr_walo = (ushort)((baddr >> 1) & 0xffff); ! 203: dr->dr_wahi = (ushort)((baddr >> 17) & 0x7fff); ! 204: ! 205: /* Set DMA range count: (number of words - 1) */ ! 206: dr->dr_range = (ushort)(DMATBL - 1); ! 207: ! 208: /* Set address modifier code to be used for DMA access to memory */ ! 209: dr->dr_addmod = (char)DRADDMOD; ! 210: /* Set FCN1 in ICR to DMA in*/ ! 211: dr->dr_cstat = FCN1; ! 212: ! 213: if (!(dra->dr_flags & DR_LOOPTST)) { ! 214: /* Use pulse reg */ ! 215: dr->dr_pulse = (ushort)(RDMA|RATN|RMSK|CYCL|GO); ! 216: /* Wait for DMA complete; REDY and DMAF are true in ISR */ ! 217: wait = 0; ! 218: while ((result=(dr->dr_cstat & (REDY | DMAF))) ! 219: != (REDY|DMAF)) { ! 220: printf("\n\tWait for DMA to complete...ISR:%lx",result); ! 221: if (++wait > 5) { ! 222: printf("\n\t DMA input timeout!!, ISR:%lx", ! 223: result); ! 224: return; ! 225: } ! 226: } ! 227: } ! 228: else { ! 229: /* Enable DMA e-o-r interrupt */ ! 230: dr->dr_pulse = (ushort)(IENB|RDMA|RATN|CYCL|GO); ! 231: /* Wait for DMA complete; DR_LOOPTST is false in dra->dr_flags*/ ! 232: wait = 0; ! 233: while (dra->dr_flags & DR_LOOPTST) { ! 234: result = dr->dr_cstat & 0xffff; ! 235: printf("\n\tWait for DMA e-o-r intr...ISR:%lx",result); ! 236: if (++wait > 7) { ! 237: printf("\n\t DMA e-o-r timeout!!, ISR:%lx", ! 238: result); ! 239: dra->dr_flags &= ~DR_LOOPTST; ! 240: return; ! 241: } ! 242: } ! 243: dra->dr_flags |= DR_LOOPTST; ! 244: } ! 245: ! 246: mtpr(tstpat,P1DC); /* Purge cache */ ! 247: mtpr((0x3ff+(long)tstpat),P1DC); ! 248: for(ix=0;ix<DMATBL;ix++) { ! 249: if (tstpat[ix] != 0x1111) { ! 250: printf("\n\t Fails, ix:%ld,expected : %lx --- actual : %lx", ! 251: ix,0x1111,tstpat[ix]); ! 252: return; ! 253: } ! 254: } ! 255: if (!(dra->dr_flags & DR_LOOPTST)) { ! 256: dra->dr_flags |= DR_LOOPTST; ! 257: printf(" OK..\n\tDMA end of range interrupt..."); ! 258: goto dmain; ! 259: } ! 260: ! 261: ! 262: printf(" OK..\n\tAttention interrupt...."); ! 263: /* Pulse FCN2 in pulse register with IENB */ ! 264: dr->dr_pulse = (ushort)(IENB|RDMA); ! 265: dr->dr_pulse = (ushort)FCN2; ! 266: ! 267: /* Wait for ATTN interrupt; DR_LOOPTST is false in dra->dr_flags*/ ! 268: wait = 0; ! 269: while (dra->dr_flags & DR_LOOPTST) { ! 270: result = dr->dr_cstat & 0xffff; ! 271: printf("\n\tWait for Attention intr...ISR:%lx",result); ! 272: if (++wait > 7) { ! 273: printf("\n\t Attention interrupt timeout!!, ISR:%lx", ! 274: result); ! 275: dra->dr_flags &= ~DR_LOOPTST; ! 276: return; ! 277: } ! 278: } ! 279: dra->dr_flags &= ~DR_LOOPTST; ! 280: printf(" OK..\n\tDone..."); ! 281: } ! 282: ! 283: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.