Lines Matching defs:mscp
163 "unable to create mscp DMA map, error = %d\n", error);
169 "unable to load mscp DMA map, error = %d\n", error);
197 uha_reset_mscp(struct uha_softc *sc, struct uha_mscp *mscp)
200 mscp->flags = 0;
204 * A mscp (and hence a mbx-out) is put onto the free list.
207 uha_free_mscp(struct uha_softc *sc, struct uha_mscp *mscp)
212 uha_reset_mscp(sc, mscp);
213 TAILQ_INSERT_HEAD(&sc->sc_free_mscp, mscp, chain);
218 uha_init_mscp(struct uha_softc *sc, struct uha_mscp *mscp)
224 * Create the DMA map for this MSCP.
228 &mscp->dmamap_xfer);
231 "can't create mscp DMA map, error = %d\n", error);
239 mscp->hashkey = sc->sc_dmamap_mscp->dm_segs[0].ds_addr +
240 UHA_MSCP_OFF(mscp);
241 hashnum = MSCP_HASH(mscp->hashkey);
242 mscp->nexthash = sc->sc_mscphash[hashnum];
243 sc->sc_mscphash[hashnum] = mscp;
244 uha_reset_mscp(sc, mscp);
254 struct uha_mscp *mscp;
259 mscp = &mscpstore[i];
260 if ((error = uha_init_mscp(sc, mscp)) != 0) {
262 "unable to initialize mscp, error = %d\n", error);
265 TAILQ_INSERT_TAIL(&sc->sc_free_mscp, mscp, chain);
272 * Get a free mscp
280 struct uha_mscp *mscp;
284 mscp = TAILQ_FIRST(&sc->sc_free_mscp);
285 if (mscp != NULL) {
286 TAILQ_REMOVE(&sc->sc_free_mscp, mscp, chain);
287 mscp->flags |= MSCP_ALLOC;
290 return (mscp);
294 * given a physical address, find the mscp that it corresponds to.
300 struct uha_mscp *mscp = sc->sc_mscphash[hashnum];
302 while (mscp) {
303 if (mscp->hashkey == mscp_phys)
305 mscp = mscp->nexthash;
307 return (mscp);
311 * We have a mscp which has been processed by the adaptor, now we look to see
315 uha_done(struct uha_softc *sc, struct uha_mscp *mscp)
319 struct scsipi_xfer *xs = mscp->xs;
324 UHA_MSCP_OFF(mscp), sizeof(struct uha_mscp),
332 bus_dmamap_sync(dmat, mscp->dmamap_xfer, 0,
333 mscp->dmamap_xfer->dm_mapsize,
336 bus_dmamap_unload(dmat, mscp->dmamap_xfer);
343 if ((mscp->flags & MSCP_ALLOC) == 0) {
349 if (mscp->host_stat != UHA_NO_ERR) {
350 switch (mscp->host_stat) {
356 mscp->host_stat);
359 } else if (mscp->target_stat != SCSI_OK) {
360 switch (mscp->target_stat) {
362 s1 = &mscp->mscp_sense;
372 "target_stat %x\n", mscp->target_stat);
378 uha_free_mscp(sc, mscp);
404 struct uha_mscp *mscp;
416 /* Get an MSCP to use. */
417 mscp = uha_get_mscp(sc);
423 if (mscp == NULL) {
425 printf("unable to allocate mscp\n");
430 mscp->xs = xs;
431 mscp->timeout = xs->timeout;
434 * Put all the arguments for the xfer in the mscp
437 mscp->opcode = UHA_SDR;
438 mscp->ca = 0x01;
440 if (xs->cmdlen > sizeof(mscp->scsi_cmd)) {
442 "cmdlen %d too large for MSCP\n",
447 mscp->opcode = UHA_TSP;
449 mscp->ca = 0x01;
450 memcpy(&mscp->scsi_cmd, xs->cmd, mscp->scsi_cmd_length);
452 mscp->xdir = UHA_SDET;
453 mscp->dcn = 0x00;
454 mscp->chan = 0x00;
455 mscp->target = periph->periph_target;
456 mscp->lun = periph->periph_lun;
457 mscp->scsi_cmd_length = xs->cmdlen;
458 mscp->sense_ptr = sc->sc_dmamap_mscp->dm_segs[0].ds_addr +
459 UHA_MSCP_OFF(mscp) + offsetof(struct uha_mscp, mscp_sense);
460 mscp->req_sense_length = sizeof(mscp->mscp_sense);
461 mscp->host_stat = 0x00;
462 mscp->target_stat = 0x00;
469 mscp->dmamap_xfer, (struct uio *)xs->data,
478 mscp->dmamap_xfer, xs->data, xs->datalen,
500 uha_free_mscp(sc, mscp);
505 bus_dmamap_sync(dmat, mscp->dmamap_xfer, 0,
506 mscp->dmamap_xfer->dm_mapsize,
515 seg < mscp->dmamap_xfer->dm_nsegs; seg++) {
516 mscp->uha_dma[seg].seg_addr =
517 mscp->dmamap_xfer->dm_segs[seg].ds_addr;
518 mscp->uha_dma[seg].seg_len =
519 mscp->dmamap_xfer->dm_segs[seg].ds_len;
522 mscp->data_addr =
524 UHA_MSCP_OFF(mscp) + offsetof(struct uha_mscp,
526 mscp->data_length = xs->datalen;
527 mscp->sgth = 0x01;
528 mscp->sg_num = seg;
530 mscp->data_addr = (physaddr)0;
531 mscp->data_length = 0;
532 mscp->sgth = 0x00;
533 mscp->sg_num = 0;
535 mscp->link_id = 0;
536 mscp->link_addr = (physaddr)0;
539 UHA_MSCP_OFF(mscp), sizeof(struct uha_mscp),
543 (sc->start_mbox)(sc, mscp);
552 if ((sc->poll)(sc, xs, mscp->timeout)) {
553 uha_timeout(mscp);
554 if ((sc->poll)(sc, xs, mscp->timeout))
555 uha_timeout(mscp);
576 struct uha_mscp *mscp = arg;
577 struct scsipi_xfer *xs = mscp->xs;
588 if (mscp->flags & MSCP_ABORT) {
595 mscp->xs->error = XS_TIMEOUT;
596 mscp->timeout = UHA_ABORT_TIMEOUT;
597 mscp->flags |= MSCP_ABORT;
598 (sc->start_mbox)(sc, mscp);