xdc
xdc_rqinit(struct xd_iorq *rq, struct xdc_softc *xdc, struct xd_softc *xd,
rq->xdc = xdc;
? 0 : iorq->xdc->ipl;
iorq->xdc->ipl;
iorq->xdc->ipl;
? 0 : iorq->xdc->ipl;
dvma_kvtopa(iorq->dbuf, iorq->xdc->bustype);
if (xdcsc->xdc->xdc_csr & XDC_ADDING) {
XDC_GO(xdcsc->xdc, iopbaddr); /* go! */
struct xdc *xdc = xdcsc->xdc;
XDC_WAIT(xdc, count, XDC_MAXTIME, (XDC_REMIOPB | XDC_F_ERROR));
XDC_GO(xdcsc->xdc, addr); /* go! */
XDC_WAIT(xdcsc->xdc, del, XDC_RESETUSEC, XDC_REMIOPB);
xdcsc->xdc->xdc_csr = XDC_RESET;
XDC_WAIT(xdcsc->xdc, del, XDC_RESETUSEC, XDC_RESET);
xdcsc->xdc->xdc_csr = XDC_CLRRIO; /* clear RIO */
xdcsc->xdc->xdc_csr = XDC_RESET;
XDC_WAIT(xdcsc->xdc, del, XDC_RESETUSEC, XDC_RESET);
(xdcsc->xdc->xdc_csr & XDC_ADDING) == 0) {
struct xdc *xdc = xdcsc->xdc;
if (xdc->xdc_csr & XDC_F_ERROR) {
errno = xdc->xdc_f_err;
if (xdc->xdc_csr & XDC_REMIOPB) {
xdc->xdc_csr = XDC_CLRRIO;
device_xname(iorq->xdc->sc_dev));
xdcsc->xdc->xdc_csr, xdcsc->nwait, xdcsc->nfree, xdcsc->nrun,
CFATTACH_DECL_NEW(xdc, sizeof(struct xdc_softc),
struct xdc_softc *xdc = device_private(self);
xdc->sc_dev = self;
xdc->xdc = (struct xdc *)bus_mapin(ca->ca_bustype, ca->ca_paddr,
sizeof(struct xdc));
xdc->bustype = ca->ca_bustype;
xdc->ipl = ca->ca_intpri;
xdc->vector = ca->ca_intvec;
xdc->sc_drives[lcv] = NULL;
xdc->iopbase = (struct xd_iopb *)dvma_malloc(XDC_MAXIOPB *
memset(xdc->iopbase, 0, XDC_MAXIOPB * sizeof(struct xd_iopb));
xdc->dvmaiopb = (struct xd_iopb *)dvma_kvtopa(xdc->iopbase,
xdc->bustype);
xdc->reqs = kmem_zalloc(XDC_MAXIOPB * sizeof(struct xd_iorq),
xdc->reqs[lcv].iopb = &xdc->iopbase[lcv];
xdc->freereq[lcv] = lcv;
xdc->iopbase[lcv].fixd = 1; /* always the same */
xdc->iopbase[lcv].naddrmod = XDC_ADDRMOD; /* always the same */
xdc->iopbase[lcv].intr_vec = xdc->vector; /* always the same */
xdc->nfree = XDC_MAXIOPB;
xdc->nrun = 0;
xdc->waithead = xdc->waitend = xdc->nwait = 0;
xdc->ndone = 0;
bufq_alloc(&xdc->sc_wq, "fcfs", 0);
callout_init(&xdc->sc_tick_ch, 0);
rqno = xdc_cmd(xdc, XDCMD_RDP, XDFUN_CTL, 0, 0, 0, 0, XD_SUB_POLL);
ctl = (struct xd_iopb_ctrl *)&xdc->iopbase[rqno];
if (xdc->reqs[rqno].errno)
xdc_e2str(xdc->reqs[rqno].errno));
XDC_DONE(xdc, rqno, err);
XDC_DONE(xdc, rqno, err);
rqno = xdc_cmd(xdc, XDCMD_WRP, XDFUN_CTL, 0, 0, 0, 0, XD_SUB_POLL);
XDC_DONE(xdc, rqno, err);
isr_add_vectored(xdcintr, xdc, ca->ca_intpri, ca->ca_intvec);
evcnt_attach_dynamic(&xdc->sc_intrcnt, EVCNT_TYPE_INTR, NULL,
callout_reset(&xdc->sc_tick_ch, XDC_TICKCNT, xdc_tick, xdc);
struct xdc_softc *xdc = device_private(parent);
xd->parent = xdc;
xdc->sc_drives[xa->driveno] = xd;
struct xdc_softc *xdc;
xdc = xd->parent;
rqno = xdc_cmd(xdc, XDCMD_RST, 0, xd->xd_drive, 0, 0, 0, fullmode);
XDC_DONE(xdc, rqno, err);
rqno = xdc_cmd(xdc, XDCMD_WRP, XDFUN_FMT, xd->xd_drive,
XDC_DONE(xdc, rqno, err);
rqno = xdc_cmd(xdc, XDCMD_RDP, XDFUN_DRV, xd->xd_drive,
driopb = (struct xd_iopb_drive *)&xdc->iopbase[rqno];
XDC_DONE(xdc, rqno, err);
rqno = xdc_cmd(xdc, XDCMD_WRP, XDFUN_DRV, xd->xd_drive,
XDC_DONE(xdc, rqno, err);
rqno = xdc_cmd(xdc, XDCMD_RD, 0, xd->xd_drive,
XDC_DONE(xdc, rqno, err);
rqno = xdc_cmd(xdc, XDCMD_WRP, XDFUN_DRV, xd->xd_drive,
XDC_DONE(xdc, rqno, err);
rqno = xdc_cmd(xdc, XDCMD_RD, 0, xd->xd_drive,
XDC_DONE(xdc, rqno, err);
struct xdc *xdc; /* vaddr of vme registers */
struct xdc_softc *xdc; /* who we are working with */
xdc_rqinit(struct xd_iorq *rq, struct xdc_softc *xdc, struct xd_softc *xd, int md, u_long blk, int cnt, void *db, struct buf *bp)
rq->xdc = xdc;
: iorq->xdc->ipl;
iorq->xdc->ipl;
iorq->xdc->ipl;
: iorq->xdc->ipl;
if (xdcsc->xdc->xdc_csr & XDC_ADDING) {
XDC_GO(xdcsc->xdc, iopbaddr); /* go! */
struct xdc *xdc = xdcsc->xdc;
XDC_WAIT(xdc, count, XDC_MAXTIME, (XDC_REMIOPB | XDC_F_ERROR));
XDC_GO(xdcsc->xdc, addr); /* go! */
XDC_WAIT(xdcsc->xdc, del, XDC_RESETUSEC, XDC_REMIOPB);
xdcsc->xdc->xdc_csr = XDC_RESET;
XDC_WAIT(xdcsc->xdc, del, XDC_RESETUSEC, XDC_RESET);
xdcsc->xdc->xdc_csr = XDC_CLRRIO; /* clear RIO */
xdcsc->xdc->xdc_csr = XDC_RESET;
XDC_WAIT(xdcsc->xdc, del, XDC_RESETUSEC, XDC_RESET);
(xdcsc->xdc->xdc_csr & XDC_ADDING) == 0) {
struct xdc *xdc = xdcsc->xdc;
if (xdc->xdc_csr & XDC_F_ERROR) {
errnum = xdc->xdc_f_err;
if (xdc->xdc_csr & XDC_REMIOPB) {
xdc->xdc_csr = XDC_CLRRIO;
: device_xname(iorq->xdc->sc_dev));
xdcsc->xdc->xdc_csr, xdcsc->nwait, xdcsc->nfree, xdcsc->nrun,
CFATTACH_DECL_NEW(xdc, sizeof(struct xdc_softc),
struct xdc *xdc = (void *)handle; /* XXX */
xdc->xdc_csr = XDC_RESET;
XDC_WAIT(xdc, del, XDC_RESETUSEC, XDC_RESET);
if (vme_space_alloc(ct, va->r[0].offset, sizeof(struct xdc), mod))
error = vme_probe(ct, va->r[0].offset, sizeof(struct xdc),
vme_space_free(va->va_vct, va->r[0].offset, sizeof(struct xdc), mod);
struct xdc_softc *xdc = device_private(self);
xdc->sc_dev = self;
xdc->dmatag = va->va_bdt;
if (vme_space_alloc(ct, va->r[0].offset, sizeof(struct xdc), mod))
if (vme_space_map(ct, va->r[0].offset, sizeof(struct xdc),
xdc->xdc = (struct xdc *) bh; /* XXX */
xdc->ipl = va->ilevel;
xdc->vector = va->ivector;
xdc->sc_drives[lcv] = NULL;
&xdc->auxmap)) != 0) {
aprint_error_dev(xdc->sc_dev, "DMA buffer map create error %d\n",
&xdc->iopmap)) != 0) {
aprint_error_dev(xdc->sc_dev, "DMA buffer map create error %d\n",
if ((error = xd_dmamem_alloc(xdc->dmatag, xdc->iopmap, &seg, &rseg,
(void **)&xdc->iopbase,
aprint_error_dev(xdc->sc_dev, "DMA buffer alloc error %d\n",
xdc->dvmaiopb = (struct xd_iopb *)(u_long)BUS_ADDR_PADDR(busaddr);
memset(xdc->iopbase, 0, XDC_MAXIOPB * sizeof(struct xd_iopb));
xdc->reqs = malloc(XDC_MAXIOPB * sizeof(struct xd_iorq),
xdc->reqs[lcv].iopb = &xdc->iopbase[lcv];
xdc->reqs[lcv].dmaiopb = &xdc->dvmaiopb[lcv];
xdc->freereq[lcv] = lcv;
xdc->iopbase[lcv].fixd = 1; /* always the same */
xdc->iopbase[lcv].naddrmod = XDC_ADDRMOD; /* always the same */
xdc->iopbase[lcv].intr_vec = xdc->vector; /* always the same */
&xdc->reqs[lcv].dmamap)) != 0) {
aprint_error_dev(xdc->sc_dev, "DMA buffer map create error %d\n",
xdc->nfree = XDC_MAXIOPB;
xdc->nrun = 0;
xdc->waithead = xdc->waitend = xdc->nwait = 0;
xdc->ndone = 0;
bufq_alloc(&xdc->sc_wq, "fcfs", 0);
callout_init(&xdc->sc_tick_ch, 0);
rqno = xdc_cmd(xdc, XDCMD_RDP, XDFUN_CTL, 0, 0, 0, 0, XD_SUB_POLL);
ctl = (struct xd_iopb_ctrl *) &xdc->iopbase[rqno];
if (xdc->reqs[rqno].errnum)
printf(": %s: ", xdc_e2str(xdc->reqs[rqno].errnum));
XDC_DONE(xdc, rqno, error);
XDC_DONE(xdc, rqno, error);
rqno = xdc_cmd(xdc, XDCMD_WRP, XDFUN_CTL, 0, 0, 0, 0, XD_SUB_POLL);
XDC_DONE(xdc, rqno, error);
aprint_error_dev(xdc->sc_dev, "controller config error: %s\n",
vme_intr_establish(ct, ih, IPL_BIO, xdcintr, xdc);
evcnt_attach_dynamic(&xdc->sc_intrcnt, EVCNT_TYPE_INTR, NULL,
device_xname(xdc->sc_dev), "intr");
callout_reset(&xdc->sc_tick_ch, XDC_TICKCNT, xdc_tick, xdc);
struct xdc_softc *xdc = device_private(parent);
xd->parent = xdc;
xdc->sc_drives[xa->driveno] = xd;
if ((error = xd_dmamem_alloc(xdc->dmatag, xdc->auxmap, &seg, &rseg,
aprint_error_dev(xdc->sc_dev, "DMA buffer alloc error %d\n",
rqno = xdc_cmd(xdc, XDCMD_RST, 0, xd->xd_drive, 0, 0, 0, fmode);
XDC_DONE(xdc, rqno, error);
rqno = xdc_cmd(xdc, XDCMD_WRP, XDFUN_FMT, xd->xd_drive, 0, 0, 0, fmode);
XDC_DONE(xdc, rqno, error);
rqno = xdc_cmd(xdc, XDCMD_RDP, XDFUN_DRV, xd->xd_drive, 0, 0, 0, fmode);
driopb = (struct xd_iopb_drive *) &xdc->iopbase[rqno];
XDC_DONE(xdc, rqno, error);
rqno = xdc_cmd(xdc, XDCMD_WRP, XDFUN_DRV, xd->xd_drive, 0, 0, 0, fmode);
XDC_DONE(xdc, rqno, error);
rqno = xdc_cmd(xdc, XDCMD_RD, 0, xd->xd_drive, 0, 1, dmaddr, fmode);
XDC_DONE(xdc, rqno, error);
rqno = xdc_cmd(xdc, XDCMD_WRP, XDFUN_DRV, xd->xd_drive, 0, 0, 0, fmode);
XDC_DONE(xdc, rqno, error);
rqno = xdc_cmd(xdc, XDCMD_RD, 0, xd->xd_drive, blk, 1, dmaddr, fmode);
XDC_DONE(xdc, rqno, error);
xd_dmamem_free(xdc->dmatag, xdc->auxmap,
struct xdc *xdc; /* vaddr of vme registers */
struct xdc_softc *xdc; /* who we are working with */