#include "../machine/pte.h"
#include "../vaxuba/ubavar.h"
struct uba_device
*dninfo
[NDN
];
int dnprobe(), dnattach(), dnintr();
u_short dnstd
[] = { 0175200 };
struct uba_driver dndriver
=
{ dnprobe
, 0, dnattach
, 0, dnstd
, "dn", dninfo
};
#define CRQ 0x001 /* call request */
#define DPR 0x002 /* digit present */
#define MENABLE 0x004 /* master enable */
#define MAINT 0x008 /* maintenance mode */
#define PND 0x010 /* present next digit */
#define DSS 0x020 /* data set status */
#define IENABLE 0x040 /* interrupt enable */
#define DONE 0x080 /* operation complete */
#define DLO 0x1000 /* data line occupied */
#define ACR 0x4000 /* abandon call and retry */
#define PWI 0x8000 /* power indicate */
#define DNUNIT(dev) (minor(dev)>>2)
#define DNREG(dev) ((dev)&03)
#define OBUFSIZ 40 /* largest phone # dialer can handle */
* There's no good way to determine the correct number of dialers attached
* to a single device (especially when dialers such as Vadic-821 MACS
* exist which can address four chassis, each with its own dialer).
register int br
, cvec
; /* value-result, must be r11, r10 */
register struct dndevice
*dnaddr
= (struct dndevice
*)reg
;
br
= 0; cvec
= 0; br
= cvec
; cvec
= br
;
* If there's at least one dialer out there it better be
dnaddr
->dn_reg
[0] = MENABLE
|IENABLE
|DONE
;
return (sizeof (struct dndevice
));
register struct dndevice
*dp
;
register u_short unit
, *dnreg
;
register struct uba_device
*ui
;
if ((unit
= DNUNIT(dev
)) >= NDN
|| (ui
= dninfo
[unit
]) == 0 ||
dp
= (struct dndevice
*)ui
->ui_addr
;
if (dp
->dn_reg
[dialer
] & PWI
)
dnreg
= &(dp
->dn_reg
[dialer
]);
dp
->dn_reg
[0] |= MENABLE
;
*dnreg
= IENABLE
|MENABLE
|CRQ
;
register struct dndevice
*dp
;
dp
= (struct dndevice
*)dninfo
[DNUNIT(dev
)]->ui_addr
;
dp
->dn_reg
[DNREG(dev
)] = MENABLE
;
register struct dndevice
*dp
;
dp
= (struct dndevice
*)dninfo
[DNUNIT(dev
)]->ui_addr
;
dnreg
= &(dp
->dn_reg
[DNREG(dev
)]);
cc
= MIN(uio
->uio_resid
, OBUFSIZ
);
error
= uiomove(cp
, cc
, UIO_WRITE
, uio
);
while ((*dnreg
& (PWI
|ACR
|DSS
)) == 0 && cc
>= 0) {
if ((*dnreg
& PND
) == 0 || cc
== 0)
sleep((caddr_t
)dnreg
, DNPRI
);
sleep((caddr_t
)&lbolt
, DNPRI
);
sleep((caddr_t
)&lbolt
, DNPRI
);
sleep((caddr_t
)&lbolt
, DNPRI
);
if (*cp
< '0' || *cp
> '9')
*dnreg
= (*cp
<< 8) | (IENABLE
|MENABLE
|DPR
|CRQ
);
sleep((caddr_t
)dnreg
, DNPRI
);
register u_short
*basereg
, *dnreg
;
basereg
= (u_short
*)dninfo
[dev
]->ui_addr
;
for (dnreg
= basereg
; dnreg
< basereg
+ 4; dnreg
++)