Lines Matching defs:mscp

163 		aprint_error_dev(&sc->sc_dev, "unable to create mscp DMA map, error = %d\n",
169 aprint_error_dev(&sc->sc_dev, "unable to load mscp DMA map, error = %d\n",
198 uha_reset_mscp(struct uha_softc *sc, struct uha_mscp *mscp)
201 mscp->flags = 0;
205 * A mscp (and hence a mbx-out) is put onto the free list.
208 uha_free_mscp(struct uha_softc *sc, struct uha_mscp *mscp)
213 uha_reset_mscp(sc, mscp);
214 TAILQ_INSERT_HEAD(&sc->sc_free_mscp, mscp, chain);
219 uha_init_mscp(struct uha_softc *sc, struct uha_mscp *mscp)
229 &mscp->dmamap_xfer);
231 aprint_error_dev(&sc->sc_dev, "can't create mscp DMA map, error = %d\n",
240 mscp->hashkey = sc->sc_dmamap_mscp->dm_segs[0].ds_addr +
241 UHA_MSCP_OFF(mscp);
242 hashnum = MSCP_HASH(mscp->hashkey);
243 mscp->nexthash = sc->sc_mscphash[hashnum];
244 sc->sc_mscphash[hashnum] = mscp;
245 uha_reset_mscp(sc, mscp);
255 struct uha_mscp *mscp;
260 mscp = &mscpstore[i];
261 if ((error = uha_init_mscp(sc, mscp)) != 0) {
262 aprint_error_dev(&sc->sc_dev, "unable to initialize mscp, error = %d\n",
266 TAILQ_INSERT_TAIL(&sc->sc_free_mscp, mscp, chain);
273 * Get a free mscp
281 struct uha_mscp *mscp;
285 mscp = TAILQ_FIRST(&sc->sc_free_mscp);
286 if (mscp != NULL) {
287 TAILQ_REMOVE(&sc->sc_free_mscp, mscp, chain);
288 mscp->flags |= MSCP_ALLOC;
291 return (mscp);
295 * given a physical address, find the mscp that it corresponds to.
301 struct uha_mscp *mscp = sc->sc_mscphash[hashnum];
303 while (mscp) {
304 if (mscp->hashkey == mscp_phys)
306 mscp = mscp->nexthash;
308 return (mscp);
312 * We have a mscp which has been processed by the adaptor, now we look to see
316 uha_done(struct uha_softc *sc, struct uha_mscp *mscp)
320 struct scsipi_xfer *xs = mscp->xs;
325 UHA_MSCP_OFF(mscp), sizeof(struct uha_mscp),
333 bus_dmamap_sync(dmat, mscp->dmamap_xfer, 0,
334 mscp->dmamap_xfer->dm_mapsize,
337 bus_dmamap_unload(dmat, mscp->dmamap_xfer);
344 if ((mscp->flags & MSCP_ALLOC) == 0) {
350 if (mscp->host_stat != UHA_NO_ERR) {
351 switch (mscp->host_stat) {
357 mscp->host_stat);
360 } else if (mscp->target_stat != SCSI_OK) {
361 switch (mscp->target_stat) {
363 s1 = &mscp->mscp_sense;
373 mscp->target_stat);
379 uha_free_mscp(sc, mscp);
404 struct uha_mscp *mscp;
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)) {
446 mscp->opcode = UHA_TSP;
448 mscp->ca = 0x01;
449 memcpy(&mscp->scsi_cmd, xs->cmd, mscp->scsi_cmd_length);
451 mscp->xdir = UHA_SDET;
452 mscp->dcn = 0x00;
453 mscp->chan = 0x00;
454 mscp->target = periph->periph_target;
455 mscp->lun = periph->periph_lun;
456 mscp->scsi_cmd_length = xs->cmdlen;
457 mscp->sense_ptr = sc->sc_dmamap_mscp->dm_segs[0].ds_addr +
458 UHA_MSCP_OFF(mscp) + offsetof(struct uha_mscp, mscp_sense);
459 mscp->req_sense_length = sizeof(mscp->mscp_sense);
460 mscp->host_stat = 0x00;
461 mscp->target_stat = 0x00;
468 mscp->dmamap_xfer, (struct uio *)xs->data,
477 mscp->dmamap_xfer, xs->data, xs->datalen,
499 uha_free_mscp(sc, mscp);
504 bus_dmamap_sync(dmat, mscp->dmamap_xfer, 0,
505 mscp->dmamap_xfer->dm_mapsize,
514 seg < mscp->dmamap_xfer->dm_nsegs; seg++) {
515 mscp->uha_dma[seg].seg_addr =
516 mscp->dmamap_xfer->dm_segs[seg].ds_addr;
517 mscp->uha_dma[seg].seg_len =
518 mscp->dmamap_xfer->dm_segs[seg].ds_len;
521 mscp->data_addr =
523 UHA_MSCP_OFF(mscp) + offsetof(struct uha_mscp,
525 mscp->data_length = xs->datalen;
526 mscp->sgth = 0x01;
527 mscp->sg_num = seg;
529 mscp->data_addr = (physaddr)0;
530 mscp->data_length = 0;
531 mscp->sgth = 0x00;
532 mscp->sg_num = 0;
534 mscp->link_id = 0;
535 mscp->link_addr = (physaddr)0;
538 UHA_MSCP_OFF(mscp), sizeof(struct uha_mscp),
542 (sc->start_mbox)(sc, mscp);
551 if ((sc->poll)(sc, xs, mscp->timeout)) {
552 uha_timeout(mscp);
553 if ((sc->poll)(sc, xs, mscp->timeout))
554 uha_timeout(mscp);
575 struct uha_mscp *mscp = arg;
576 struct scsipi_xfer *xs = mscp->xs;
587 if (mscp->flags & MSCP_ABORT) {
594 mscp->xs->error = XS_TIMEOUT;
595 mscp->timeout = UHA_ABORT_TIMEOUT;
596 mscp->flags |= MSCP_ABORT;
597 (sc->start_mbox)(sc, mscp);