Home | History | Annotate | Download | only in pci

Lines Matching defs:tr

435 twa_request_wait_handler(struct twa_request *tr)
438 wakeup(tr);
483 twa_release_request(struct twa_request *tr)
488 sc = tr->tr_sc;
490 if ((tr->tr_flags & TWA_CMD_AEN) == 0) {
492 TAILQ_INSERT_TAIL(&tr->tr_sc->twa_free, tr, tr_link);
494 if (__predict_false((tr->tr_sc->twa_sc_flags &
496 tr->tr_sc->twa_sc_flags &= ~TWA_STATE_REQUEST_WAIT;
500 tr->tr_flags &= ~TWA_CMD_AEN_BUSY;
504 twa_unmap_request(struct twa_request *tr)
506 struct twa_softc *sc = tr->tr_sc;
511 if (tr->tr_data != NULL) {
512 if (tr->tr_cmd_pkt_type & TWA_CMD_PKT_TYPE_9K)
513 cmd_status = tr->tr_command->command.cmd_pkt_9k.status;
516 tr->tr_command->command.cmd_pkt_7k.generic.status;
518 if (tr->tr_flags & TWA_CMD_DATA_OUT) {
519 bus_dmamap_sync(tr->tr_sc->twa_dma_tag, tr->tr_dma_map,
520 0, tr->tr_length, BUS_DMASYNC_POSTREAD);
525 if (tr->tr_flags & TWA_CMD_DATA_COPY_NEEDED)
527 memcpy(tr->tr_real_data, tr->tr_data,
528 tr->tr_real_length);
530 if (tr->tr_flags & TWA_CMD_DATA_IN)
531 bus_dmamap_sync(tr->tr_sc->twa_dma_tag, tr->tr_dma_map,
532 0, tr->tr_length, BUS_DMASYNC_POSTWRITE);
534 bus_dmamap_unload(sc->twa_dma_tag, tr->tr_dma_map);
538 if (tr->tr_flags & TWA_CMD_DATA_COPY_NEEDED) {
540 uvm_km_kmem_free(kmem_va_arena, (vaddr_t)tr->tr_data,
541 tr->tr_length);
543 tr->tr_data = tr->tr_real_data;
544 tr->tr_length = tr->tr_real_length;
553 * Input: tr -- ptr to request pkt
560 twa_wait_request(struct twa_request *tr, uint32_t timeout)
566 tr->tr_flags |= TWA_CMD_SLEEP_ON_REQUEST;
567 tr->tr_callback = twa_request_wait_handler;
568 tr->tr_status = TWA_CMD_BUSY;
570 rv = twa_map_request(tr);
579 while (tr->tr_status != TWA_CMD_COMPLETE) {
580 rv = tr->tr_error;
583 if ((rv = tsleep(tr, PRIBIO, "twawait", timeout * hz)) == 0)
596 if (tr->tr_status == TWA_CMD_BUSY)
597 twa_reset(tr->tr_sc);
601 TAILQ_REMOVE(&tr->tr_sc->twa_pending, tr,
605 twa_unmap_request(tr);
606 if (tr->tr_data)
607 free(tr->tr_data, M_DEVBUF);
609 twa_release_request(tr);
630 * Input: tr -- ptr to request pkt
637 twa_immediate_request(struct twa_request *tr, uint32_t timeout)
642 rv = twa_map_request(tr);
654 rv = tr->tr_error;
658 twa_done(tr->tr_sc);
660 if (tr->tr_status == TWA_CMD_COMPLETE)
676 if (tr->tr_status == TWA_CMD_BUSY)
677 twa_reset(tr->tr_sc);
681 TAILQ_REMOVE(&tr->tr_sc->twa_pending, tr, tr_link);
683 twa_unmap_request(tr);
684 if (tr->tr_data)
685 free(tr->tr_data, M_DEVBUF);
687 twa_release_request(tr);
693 twa_inquiry(struct twa_request *tr, int lunid)
698 if (tr->tr_data == NULL)
701 memset(tr->tr_data, 0, TWA_SECTOR_SIZE);
703 tr->tr_length = TWA_SECTOR_SIZE;
704 tr->tr_cmd_pkt_type = TWA_CMD_PKT_TYPE_9K;
705 tr->tr_flags |= TWA_CMD_DATA_IN | TWA_CMD_DATA_OUT;
707 tr_9k_cmd = &tr->tr_command->command.cmd_pkt_9k;
711 tr_9k_cmd->request_id = tr->tr_request_id;
724 ((struct scsipi_inquiry_data *)tr->tr_data)->device =
727 error = twa_immediate_request(tr, TWA_REQUEST_TIMEOUT_PERIOD);
731 if (((struct scsipi_inquiry_data *)tr->tr_data)->device ==
749 twa_read_capacity(struct twa_request *tr, int lunid)
755 if (tr->tr_data == NULL)
758 memset(tr->tr_data, 0, TWA_SECTOR_SIZE);
760 tr->tr_length = TWA_SECTOR_SIZE;
761 tr->tr_cmd_pkt_type = TWA_CMD_PKT_TYPE_9K;
762 tr->tr_flags |= TWA_CMD_DATA_OUT;
764 tr_9k_cmd = &tr->tr_command->command.cmd_pkt_9k;
768 tr_9k_cmd->request_id = tr->tr_request_id;
776 error = twa_immediate_request(tr, TWA_REQUEST_TIMEOUT_PERIOD);
781 ((struct scsipi_read_capacity_16_data *)tr->tr_data)->addr) + 1);
784 tr->tr_data)->addr) + 1;
791 twa_request_sense(struct twa_request *tr, int lunid)
796 if (tr->tr_data == NULL)
799 memset(tr->tr_data, 0, TWA_SECTOR_SIZE);
801 tr->tr_length = TWA_SECTOR_SIZE;
802 tr->tr_cmd_pkt_type = TWA_CMD_PKT_TYPE_9K;
803 tr->tr_flags |= TWA_CMD_DATA_OUT;
805 tr_9k_cmd = &tr->tr_command->command.cmd_pkt_9k;
809 tr_9k_cmd->request_id = tr->tr_request_id;
822 if ((tr->tr_flags & TWA_CMD_AEN) != 0)
823 error = twa_map_request(tr);
825 error = twa_immediate_request(tr, TWA_REQUEST_TIMEOUT_PERIOD);
833 struct twa_request *tr;
899 tr = &(sc->twa_req_buf[i]);
900 tr->tr_command = tc;
901 tr->tr_cmd_phys = sc->twa_cmd_pkt_phys +
903 tr->tr_request_id = i;
904 tr->tr_sc = sc;
915 &tr->tr_dma_map)) != 0) {
923 sc->twa_lookup[i] = tr;
924 twa_release_request(tr);
926 tr->tr_flags |= TWA_CMD_AEN;
978 struct twa_request *tr;
986 if ((tr = twa_get_request(sc, 0)) == NULL) {
991 tr->tr_cmd_pkt_type |= TWA_CMD_PKT_TYPE_INTERNAL;
993 tr->tr_data = malloc(TWA_SECTOR_SIZE, M_DEVBUF, M_WAITOK);
997 if (twa_inquiry(tr, unit) == 0) {
1000 ((struct scsipi_inquiry_data *)tr->tr_data));
1003 twa_read_capacity(tr, unit);
1026 free(tr->tr_data, M_DEVBUF);
1028 twa_release_request(tr);
1038 twa_check_busy_q(struct twa_request *tr)
1041 struct twa_softc *sc = tr->tr_sc;
1044 if (tr->tr_request_id == rq->tr_request_id) {
1046 } else if (tr->bp == rq->bp && tr->bp != 0) {
1061 twa_start(struct twa_request *tr)
1063 struct twa_softc *sc = tr->tr_sc;
1082 TWA_WRITE_COMMAND_QUEUE_LOW(sc, tr->tr_cmd_phys +
1092 if (tr->tr_status != TWA_CMD_PENDING) {
1093 tr->tr_status = TWA_CMD_PENDING;
1094 TAILQ_INSERT_TAIL(&tr->tr_sc->twa_pending,
1095 tr, tr_link);
1102 (char *)tr->tr_command - (char *)sc->twa_cmds,
1111 TWA_WRITE_COMMAND_QUEUE_HIGH(sc, tr->tr_cmd_phys +
1115 TWA_WRITE_COMMAND_QUEUE(sc, tr->tr_cmd_phys +
1120 tr->tr_status = TWA_CMD_BUSY;
1123 twa_check_busy_q(tr);
1127 TAILQ_INSERT_TAIL(&tr->tr_sc->twa_busy, tr, tr_link);
1185 struct twa_request *tr;
1189 while ((tr = TAILQ_FIRST(&sc->twa_busy)) != NULL) {
1190 TAILQ_REMOVE(&sc->twa_busy, tr, tr_link);
1192 twa_unmap_request(tr);
1193 if ((tr->tr_cmd_pkt_type & TWA_CMD_PKT_TYPE_INTERNAL) ||
1194 (tr->tr_cmd_pkt_type & TWA_CMD_PKT_TYPE_IOCTL)) {
1196 if (tr->tr_data)
1197 free(tr->tr_data, M_DEVBUF);
1198 twa_release_request(tr);
1201 tr->tr_command->command.cmd_pkt_9k.status = EIO;
1202 if (tr->tr_callback)
1203 tr->tr_callback(tr);
1211 struct twa_request *tr;
1218 while ((tr = TAILQ_FIRST(&sc->twa_pending)) != NULL) {
1219 TAILQ_REMOVE(&sc->twa_pending, tr, tr_link);
1221 if ((error = twa_start(tr))) {
1223 tr->tr_status = TWA_CMD_PENDING;
1226 TAILQ_INSERT_HEAD(&tr->tr_sc->twa_pending,
1227 tr, tr_link);
1231 if (tr->tr_flags & TWA_CMD_SLEEP_ON_REQUEST) {
1232 tr->tr_error = error;
1233 tr->tr_callback(tr);
1248 struct twa_request *tr;
1254 if ((tr = twa_get_request(sc, 0)) == NULL) {
1258 tr->tr_cmd_pkt_type |= TWA_CMD_PKT_TYPE_INTERNAL;
1259 tr->tr_callback = NULL;
1261 tr->tr_data = malloc(TWA_SECTOR_SIZE, M_DEVBUF, M_NOWAIT);
1263 if (tr->tr_data == NULL) {
1268 if (twa_request_sense(tr, 0) != 0) {
1281 twa_done(tr->tr_sc);
1283 if (tr->tr_status != TWA_CMD_BUSY)
1288 if (tr->tr_status != TWA_CMD_COMPLETE) {
1293 if ((error = tr->tr_command->command.cmd_pkt_9k.status))
1296 cmd_hdr = (struct twa_command_header *)(tr->tr_data);
1302 free(tr->tr_data, M_DEVBUF);
1303 twa_release_request(tr);
1306 if (tr) {
1307 if (tr->tr_data)
1308 free(tr->tr_data, M_DEVBUF);
1310 twa_release_request(tr);
1318 twa_check_response_q(struct twa_request *tr, int clear)
1334 req = tr;
1336 if ((tr->tr_cmd_pkt_type & TWA_CMD_PKT_TYPE_EXTERNAL) != 0) {
1337 /* XXX this is bogus ! req can't be anything else but tr ! */
1338 if (req->tr_request_id == tr->tr_request_id)
1340 tr->tr_request_id);
1343 if (tr->bp == hist[j])
1345 tr->tr_request_id);
1347 req = tr;
1357 struct twa_request *tr;
1369 tr = sc->sc_twa_request + rq.u.response_id;
1371 twa_check_response_q(tr, 0);
1374 twa_unmap_request(tr);
1376 tr->tr_status = TWA_CMD_COMPLETE;
1377 TAILQ_REMOVE(&tr->tr_sc->twa_busy, tr, tr_link);
1379 if (tr->tr_callback)
1380 tr->tr_callback(tr);
1704 twa_submit_io(struct twa_request *tr)
1708 if ((error = twa_start(tr))) {
1712 tr->tr_error = error;
1736 struct twa_request *tr = (struct twa_request *)arg;
1737 struct twa_command_packet *cmdpkt = tr->tr_command;
1743 if (tr->tr_cmd_pkt_type & TWA_CMD_PKT_TYPE_9K) {
1758 if (tr->tr_flags & TWA_CMD_DATA_IN)
1759 bus_dmamap_sync(trtr->tr_dma_map, 0,
1760 tr->tr_length, BUS_DMASYNC_PREWRITE);
1761 if (tr->tr_flags & TWA_CMD_DATA_OUT) {
1766 if (tr->tr_flags & TWA_CMD_DATA_COPY_NEEDED)
1767 memcpy(tr->tr_data, tr->tr_real_data,
1768 tr->tr_real_length);
1769 bus_dmamap_sync(tr->tr_sc->twa_dma_tag, tr->tr_dma_map, 0,
1770 tr->tr_length, BUS_DMASYNC_PREREAD);
1772 error = twa_submit_io(tr);
1775 twa_unmap_request(tr);
1782 if (tr->tr_callback)
1783 twa_release_request(tr);
1793 * Input: tr -- ptr to request pkt
1799 twa_map_request(struct twa_request *tr)
1801 struct twa_softc *sc = tr->tr_sc;
1805 if (tr->tr_data != NULL) {
1807 if (((u_long)tr->tr_data & (511)) != 0) {
1808 tr->tr_flags |= TWA_CMD_DATA_COPY_NEEDED;
1809 tr->tr_real_data = tr->tr_data;
1810 tr->tr_real_length = tr->tr_length;
1813 tr->tr_length, (VM_NOSLEEP | VM_INSTANTFIT),
1814 (vmem_addr_t *)&tr->tr_data);
1818 tr->tr_data = tr->tr_real_data;
1819 tr->tr_length = tr->tr_real_length;
1822 if ((tr->tr_flags & TWA_CMD_DATA_IN) != 0)
1823 memcpy(tr->tr_data, tr->tr_real_data,
1824 tr->tr_length);
1830 rv = bus_dmamap_load(sc->twa_dma_tag, tr->tr_dma_map,
1831 tr->tr_data, tr->tr_length, NULL,
1835 if ((tr->tr_flags & TWA_CMD_DATA_COPY_NEEDED) != 0) {
1838 (vaddr_t)tr->tr_data, tr->tr_length);
1844 if ((rv = twa_setup_data_dmamap(tr,
1845 tr->tr_dma_map->dm_segs,
1846 tr->tr_dma_map->dm_nsegs))) {
1848 if (tr->tr_flags & TWA_CMD_DATA_COPY_NEEDED) {
1851 (vaddr_t)tr->tr_data, tr->tr_length);
1853 tr->tr_data = tr->tr_real_data;
1854 tr->tr_length = tr->tr_real_length;
1859 if ((rv = twa_submit_io(tr)))
1860 twa_unmap_request(tr);
1976 struct twa_request *tr = 0;
1990 tr = twa_get_request_wait(sc, 0);
1991 KASSERT(tr != NULL);
1999 if ((tr->tr_length = data_buf_size_adjusted)) {
2000 if ((tr->tr_data = malloc(data_buf_size_adjusted,
2007 (void *) (tr->tr_data),
2011 tr->tr_flags |= TWA_CMD_DATA_IN | TWA_CMD_DATA_OUT;
2013 tr->tr_cmd_pkt_type |= TWA_CMD_PKT_TYPE_IOCTL;
2014 cmdpkt = tr->tr_command;
2020 tr->tr_request_id;
2023 if ((error = twa_wait_request(tr, TWA_REQUEST_TIMEOUT_PERIOD))) {
2034 if (tr->tr_length)
2035 error = copyout(tr->tr_data, user_buf->pdata,
2039 if (tr->tr_data)
2040 free(tr->tr_data, M_DEVBUF);
2042 if (tr)
2043 twa_release_request(tr);
2315 size_t param_size, void (* callback)(struct twa_request *tr),
2319 struct twa_request *tr;
2323 if ((tr = twa_get_request(sc, 0)) == NULL) {
2328 tr->tr_cmd_pkt_type |= TWA_CMD_PKT_TYPE_INTERNAL;
2338 tr->tr_data = *param;
2339 tr->tr_length = TWA_SECTOR_SIZE;
2340 tr->tr_flags = TWA_CMD_DATA_IN | TWA_CMD_DATA_OUT;
2343 cmd = &(tr->tr_command->command.cmd_pkt_7k);
2345 tr->tr_command->cmd_hdr.header_desc.size_header = 128;
2350 cmd->param.request_id = tr->tr_request_id;
2362 rv = twa_immediate_request(tr, TWA_REQUEST_TIMEOUT_PERIOD);
2371 twa_release_request(tr);
2375 tr->tr_callback = callback;
2376 rv = twa_map_request(tr);
2380 if (tr)
2381 twa_release_request(tr);
2401 void *data, void (* callback)(struct twa_request *tr))
2403 struct twa_request *tr;
2408 tr = twa_get_request(sc, 0);
2409 if (tr == NULL)
2412 tr->tr_cmd_pkt_type |= TWA_CMD_PKT_TYPE_INTERNAL;
2419 tr->tr_data = param;
2420 tr->tr_length = TWA_SECTOR_SIZE;
2421 tr->tr_flags = TWA_CMD_DATA_IN | TWA_CMD_DATA_OUT;
2424 cmd = &(tr->tr_command->command.cmd_pkt_7k);
2426 tr->tr_command->cmd_hdr.header_desc.size_header = 128;
2431 cmd->param.request_id = tr->tr_request_id;
2444 error = twa_immediate_request(tr, TWA_REQUEST_TIMEOUT_PERIOD);
2458 twa_release_request(tr);
2462 tr->tr_callback = callback;
2463 if ((error = twa_map_request(tr)))
2471 if (tr)
2472 twa_release_request(tr);
2516 struct twa_request *tr;
2521 if ((tr = twa_get_request(sc, 0)) == NULL)
2523 tr->tr_cmd_pkt_type |= TWA_CMD_PKT_TYPE_INTERNAL;
2525 init_connect = &(tr->tr_command->command.cmd_pkt_7k.init_connect);
2527 tr->tr_command->cmd_hdr.header_desc.size_header = 128;
2530 init_connect->request_id = tr->tr_request_id;
2548 error = twa_immediate_request(tr, TWA_REQUEST_TIMEOUT_PERIOD);
2564 twa_release_request(tr);
2568 if (tr)
2569 twa_release_request(tr);
2701 struct twa_request *tr;
2706 if ((tr = twa_get_request(sc, TWA_CMD_AEN)) == NULL) {
2710 tr->tr_cmd_pkt_type |= TWA_CMD_PKT_TYPE_INTERNAL;
2711 tr->tr_callback = twa_aen_callback;
2712 tr->tr_data = malloc(TWA_SECTOR_SIZE, M_DEVBUF, M_NOWAIT);
2713 if (twa_request_sense(tr, 0) != 0) {
2714 if (tr->tr_data)
2715 free(tr->tr_data, M_DEVBUF);
2716 twa_release_request(tr);
2728 * Input: tr -- ptr to completed request pkt
2733 twa_aen_callback(struct twa_request *tr)
2737 struct twa_softc *sc = tr->tr_sc;
2739 (struct twa_command_header *)(tr->tr_data);
2741 &(tr->tr_command->command.cmd_pkt_9k);
2744 if ((tr->tr_cmd_pkt_type & TWA_CMD_PKT_TYPE_9K) &&
2752 printf("%x\t", tr->tr_command->cmd_hdr.sense_data[i]);
2756 printf("%x\t", ((int8_t *)(tr->tr_data))[i]);
2759 if (tr->tr_data)
2760 free(tr->tr_data, M_DEVBUF);
2761 twa_release_request(tr);
2878 twa_request_init(struct twa_request *tr, int flags)
2880 tr->tr_data = NULL;
2881 tr->tr_real_data = NULL;
2882 tr->tr_length = 0;
2883 tr->tr_real_length = 0;
2884 tr->tr_status = TWA_CMD_SETUP;/* command is in setup phase */
2885 tr->tr_flags = flags;
2886 tr->tr_error = 0;
2887 tr->tr_callback = NULL;
2888 tr->tr_cmd_pkt_type = 0;
2889 tr->bp = 0;
2897 if (tr->tr_command->command.cmd_pkt_9k.status)
2898 memset(tr->tr_command, 0,
2901 memset(&(tr->tr_command->command), 0, 28);
2907 struct twa_request *tr;
2913 while ((tr = TAILQ_FIRST(&sc->twa_free)) == NULL) {
2917 TAILQ_REMOVE(&sc->twa_free, tr, tr_link);
2921 twa_request_init(tr, flags);
2923 return(tr);
2930 struct twa_request *tr;
2937 tr = sc->sc_twa_request;
2944 if (__predict_false((tr =
2949 TAILQ_REMOVE(&sc->twa_free, tr, tr_link);
2953 twa_request_init(tr, flags);
2955 return(tr);