Lines Matching defs:ocb
261 STAILQ_ENTRY(sbp_ocb) ocb;
267 sizeof(ocb->orb) + sizeof(ocb->ind_ptr), (op));
302 struct sbp_ocb *ocb;
785 sdev->ocb = (struct sbp_ocb *)sdev->dma.v_addr;
786 sdev->login = (struct sbp_login_res *)&sdev->ocb[SBP_QUEUE_LEN];
787 memset((char *)sdev->ocb, 0,
792 struct sbp_ocb *ocb = &sdev->ocb[i];
794 ocb->index = i;
795 ocb->bus_addr =
798 SBP_IND_MAX, SBP_SEG_MAX, 0, 0, &ocb->dmamap)) {
804 sbp_free_ocb(sdev, ocb); /* into free queue */
1286 struct sbp_ocb *ocb;
1289 ocb = STAILQ_FIRST(&sdev->ocbs);
1290 if (ocb != NULL)
1291 sbp_orb_pointer(sdev, ocb);
1297 sbp_orb_pointer(struct sbp_dev *sdev, struct sbp_ocb *ocb)
1305 sdev->bustgtlun, (uint32_t)ocb->bus_addr);
1327 xfer->send.payload[1] = htonl((uint32_t)ocb->bus_addr);
1331 ocb->xs->error = XS_DRIVER_STUFFUP;
1332 scsipi_done(ocb->xs);
1451 struct sbp_ocb *ocb;
1461 ocb = STAILQ_FIRST(&target->mgm_ocb_queue);
1462 if (target->mgm_ocb_cur != NULL || ocb == NULL) {
1466 STAILQ_REMOVE_HEAD(&target->mgm_ocb_queue, ocb);
1470 if ((ocb = sbp_get_ocb(sdev)) == NULL) {
1476 ocb->flags = OCB_ACT_MGM;
1477 ocb->sdev = sdev;
1479 memset(ocb->orb, 0, sizeof(ocb->orb));
1480 ocb->orb[6] = htonl((nid << 16) | SBP_BIND_HI);
1481 ocb->orb[7] = htonl(SBP_DEV2ADDR(dv_unit, sdev->lun_id));
1493 ocb->orb[0] = ocb->orb[1] = 0; /* password */
1494 ocb->orb[2] = htonl(nid << 16);
1495 ocb->orb[3] = htonl(sdev->dma.bus_addr + sbp_login_off);
1496 ocb->orb[4] = htonl(ORB_NOTIFY | sdev->lun_id);
1498 ocb->orb[4] |= htonl(ORB_EXV);
1499 ocb->orb[5] = htonl(SBP_LOGIN_SIZE);
1506 ocb->orb[0] = htonl((0 << 16) | 0);
1507 ocb->orb[1] = htonl(aocb->bus_addr & 0xffffffff);
1514 ocb->orb[4] = htonl(ORB_NOTIFY | func | sdev->login->id);
1521 STAILQ_INSERT_TAIL(&sdev->target->mgm_ocb_queue, ocb, ocb);
1526 target->mgm_ocb_cur = ocb;
1528 callout_reset(&target->mgm_ocb_timeout, 5 * hz, sbp_mgm_timeout, ocb);
1540 xfer->send.payload[1] = htonl(ocb->bus_addr & 0xffffffff);
1544 SBP_ORB_DMA_SYNC(sdev->dma, ocb->index, BUS_DMASYNC_PREWRITE);
1550 sbp_print_scsi_cmd(struct sbp_ocb *ocb)
1552 struct scsipi_xfer *xs = ocb->xs;
1557 device_xname(ocb->sdev->target->sbp->sc_fd.dev),
1571 sbp_scsi_status(struct sbp_status *sbp_status, struct sbp_ocb *ocb)
1574 struct scsi_sense_data *sense = &ocb->xs->sense.scsi_sense;
1579 sbp_print_scsi_cmd(ocb);
1583 ocb->sdev->bustgtlun,
1630 ocb->xs->error = XS_SENSE;
1631 ocb->xs->xs_status = sbp_cmd_status->status;
1646 aprint_error_dev(ocb->sdev->target->sbp->sc_fd.dev,
1648 __func__, ocb->sdev->bustgtlun, sbp_cmd_status->status);
1653 sbp_fix_inq_data(struct sbp_ocb *ocb)
1655 struct scsipi_xfer *xs = ocb->xs;
1660 sdev = ocb->sdev;
1719 struct sbp_ocb *ocb;
1766 ocb = NULL;
1771 ocb = target->mgm_ocb_cur;
1772 if (ocb != NULL)
1773 if (OCB_MATCH(ocb, sbp_status)) {
1778 ocb = sbp_dequeue_ocb(sdev, sbp_status);
1779 if (ocb == NULL)
1781 "%s:%s: No ocb(%x) on the queue\n", __func__,
1845 if (ocb == NULL)
1848 switch (ntohl(ocb->orb[4]) & ORB_FMT_MSK) {
1854 switch (ocb->flags) {
1856 orb_fun = ntohl(ocb->orb[4]) & ORB_FUN_MSK;
1939 if (ocb->xs != NULL) {
1940 struct scsipi_xfer *xs = ocb->xs;
1943 sbp_scsi_status(sbp_status, ocb);
1953 sbp_fix_inq_data(ocb);
1963 sbp_free_ocb(sdev, ocb);
2042 bus_dmamap_destroy(sc->sc_dmat, sdev->ocb[i].dmamap);
2160 struct sbp_ocb *ocb = (struct sbp_ocb *)arg;
2161 struct sbp_dev *sdev = ocb->sdev;
2166 __func__, sdev->bustgtlun, (uint32_t)ocb->bus_addr);
2168 sbp_free_ocb(sdev, ocb);
2182 struct sbp_ocb *ocb = (struct sbp_ocb *)arg;
2183 struct sbp_dev *sdev = ocb->sdev;
2187 __func__, sdev->bustgtlun, (uint32_t)ocb->bus_addr);
2223 struct sbp_ocb *ocb;
2266 ocb = sbp_get_ocb(sdev);
2268 if (ocb == NULL) {
2278 ocb->flags = OCB_ACT_CMD;
2279 ocb->sdev = sdev;
2280 ocb->xs = xs;
2281 ocb->orb[0] = htonl(1 << 31);
2282 ocb->orb[1] = 0;
2283 ocb->orb[2] = htonl(((sc->sc_fd.fc->nodeid | FWLOCALBUS) << 16));
2284 ocb->orb[3] = htonl(ocb->bus_addr + IND_PTR_OFFSET);
2286 ocb->orb[4] =
2290 ocb->orb[4] |= htonl(ORB_CMD_IN);
2296 memcpy((void *)&ocb->orb[5], cdb, xs->cmdlen);
2298 printf("ORB %08x %08x %08x %08x\n", ntohl(ocb->orb[0]), ntohl(ocb->orb[1]), ntohl(ocb->orb[2]), ntohl(ocb->orb[3]));
2299 printf("ORB %08x %08x %08x %08x\n", ntohl(ocb->orb[4]), ntohl(ocb->orb[5]), ntohl(ocb->orb[6]), ntohl(ocb->orb[7]));
2302 error = bus_dmamap_load(sc->sc_dmat, ocb->dmamap,
2310 sbp_execute_ocb(ocb, ocb->dmamap->dm_segs,
2311 ocb->dmamap->dm_nsegs);
2313 sbp_execute_ocb(ocb, NULL, 0);
2319 sbp_execute_ocb(struct sbp_ocb *ocb, bus_dma_segment_t *segments, int seg)
2338 ocb->orb[3] = htonl(s->ds_addr);
2339 ocb->orb[4] |= htonl(s->ds_len);
2354 ocb->ind_ptr[i].hi = htonl(s->ds_len << 16);
2355 ocb->ind_ptr[i].lo = htonl(s->ds_addr);
2357 ocb->orb[4] |= htonl(ORB_CMD_PTBL | seg);
2361 struct sbp_softc *sc = ocb->sdev->target->sbp;
2362 const int flag = (ntohl(ocb->orb[4]) & ORB_CMD_IN) ?
2365 bus_dmamap_sync(sc->sc_dmat, ocb->dmamap,
2366 0, ocb->dmamap->dm_mapsize, flag);
2368 prev = sbp_enqueue_ocb(ocb->sdev, ocb);
2369 SBP_ORB_DMA_SYNC(ocb->sdev->dma, ocb->index, BUS_DMASYNC_PREWRITE);
2372 if (ocb->sdev->last_ocb != NULL)
2373 sbp_doorbell(ocb->sdev);
2375 sbp_orb_pointer(ocb->sdev, ocb);
2378 if (prev == NULL || (ocb->sdev->flags & ORB_LINK_DEAD) != 0) {
2379 ocb->sdev->flags &= ~ORB_LINK_DEAD;
2380 sbp_orb_pointer(ocb->sdev, ocb);
2388 struct sbp_ocb *ocb;
2398 for (ocb = STAILQ_FIRST(&sdev->ocbs); ocb != NULL; ocb = next) {
2399 next = STAILQ_NEXT(ocb, ocb);
2400 if (OCB_MATCH(ocb, sbp_status)) {
2402 SBP_ORB_DMA_SYNC(sdev->dma, ocb->index,
2404 STAILQ_REMOVE(&sdev->ocbs, ocb, sbp_ocb, ocb);
2405 if (ocb->xs != NULL)
2406 callout_stop(&ocb->xs->xs_callout);
2407 if (ntohl(ocb->orb[4]) & 0xffff) {
2409 (ntohl(ocb->orb[4]) & ORB_CMD_IN) ?
2413 bus_dmamap_sync(sc->sc_dmat, ocb->dmamap,
2414 0, ocb->dmamap->dm_mapsize, flag);
2415 bus_dmamap_unload(sc->sc_dmat, ocb->dmamap);
2437 if (ocb && use_doorbell) {
2444 sdev->last_ocb = ocb;
2451 if (ocb && order > 0)
2456 return ocb;
2460 sbp_enqueue_ocb(struct sbp_dev *sdev, struct sbp_ocb *ocb)
2467 __func__, sdev->bustgtlun, (uintmax_t)ocb->bus_addr);
2471 STAILQ_FOREACH(tocb, &sdev->ocbs, ocb)
2474 STAILQ_INSERT_TAIL(&sdev->ocbs, ocb, ocb);
2477 callout_reset(&ocb->xs->xs_callout, mstohz(ocb->xs->timeout),
2478 sbp_timeout, ocb);
2486 (uintmax_t)prev2->bus_addr, (uintmax_t)ocb->bus_addr);
2494 *(volatile uint32_t *)&prev2->orb[1] = htonl(ocb->bus_addr);
2505 struct sbp_ocb *ocb;
2509 ocb = STAILQ_FIRST(&sdev->free_ocbs);
2510 if (ocb == NULL) {
2513 "ocb shortage!!!\n");
2516 ocb);
2517 ocb->xs = NULL;
2518 return ocb;
2522 sbp_free_ocb(struct sbp_dev *sdev, struct sbp_ocb *ocb)
2527 ocb->flags = 0;
2528 ocb->xs = NULL;
2531 STAILQ_INSERT_TAIL(&sdev->free_ocbs, ocb, ocb);
2544 sbp_abort_ocb(struct sbp_ocb *ocb, int status)
2549 sdev = ocb->sdev;
2553 __func__, sdev->bustgtlun, (uintmax_t)ocb->bus_addr);
2556 if (ocb->xs != NULL)
2557 sbp_print_scsi_cmd(ocb);
2559 if (ntohl(ocb->orb[4]) & 0xffff) {
2560 const int flag = (ntohl(ocb->orb[4]) & ORB_CMD_IN) ?
2563 bus_dmamap_sync(sc->sc_dmat, ocb->dmamap,
2564 0, ocb->dmamap->dm_mapsize, flag);
2565 bus_dmamap_unload(sc->sc_dmat, ocb->dmamap);
2567 if (ocb->xs != NULL) {
2568 callout_stop(&ocb->xs->xs_callout);
2569 ocb->xs->error = status;
2570 scsipi_done(ocb->xs);
2572 sbp_free_ocb(sdev, ocb);
2579 struct sbp_ocb *ocb, *next;
2588 for (ocb = STAILQ_FIRST(&temp); ocb != NULL; ocb = next) {
2589 next = STAILQ_NEXT(ocb, ocb);
2590 sbp_abort_ocb(ocb, status);