Lines Matching refs:drive
141 ide_drive_t *drive; member
244 if (ide_device_get(tape->drive)) in ide_tape_get()
256 ide_drive_t *drive = tape->drive; in ide_tape_put() local
260 ide_device_put(drive); in ide_tape_put()
268 static void idetape_analyze_error(ide_drive_t *drive) in idetape_analyze_error() argument
270 idetape_tape_t *tape = drive->driver_data; in idetape_analyze_error()
271 struct ide_atapi_pc *pc = drive->failed_pc; in idetape_analyze_error()
272 struct request *rq = drive->hwif->rq; in idetape_analyze_error()
326 static int ide_tape_callback(ide_drive_t *drive, int dsc) in ide_tape_callback() argument
328 idetape_tape_t *tape = drive->driver_data; in ide_tape_callback()
329 struct ide_atapi_pc *pc = drive->pc; in ide_tape_callback()
330 struct request *rq = drive->hwif->rq; in ide_tape_callback()
338 ide_tape_handle_dsc(drive); in ide_tape_callback()
340 if (drive->failed_pc == pc) in ide_tape_callback()
341 drive->failed_pc = NULL; in ide_tape_callback()
345 idetape_analyze_error(drive); in ide_tape_callback()
378 static void ide_tape_stall_queue(ide_drive_t *drive) in ide_tape_stall_queue() argument
380 idetape_tape_t *tape = drive->driver_data; in ide_tape_stall_queue()
383 drive->hwif->rq->cmd[0], tape->dsc_poll_freq); in ide_tape_stall_queue()
387 ide_stall_queue(drive, tape->dsc_poll_freq); in ide_tape_stall_queue()
390 static void ide_tape_handle_dsc(ide_drive_t *drive) in ide_tape_handle_dsc() argument
392 idetape_tape_t *tape = drive->driver_data; in ide_tape_handle_dsc()
399 ide_tape_stall_queue(drive); in ide_tape_handle_dsc()
439 static ide_startstop_t ide_tape_issue_pc(ide_drive_t *drive, in ide_tape_issue_pc() argument
443 idetape_tape_t *tape = drive->driver_data; in ide_tape_issue_pc()
444 struct request *rq = drive->hwif->rq; in ide_tape_issue_pc()
446 if (drive->failed_pc == NULL && pc->c[0] != REQUEST_SENSE) in ide_tape_issue_pc()
447 drive->failed_pc = pc; in ide_tape_issue_pc()
450 drive->pc = pc; in ide_tape_issue_pc()
475 drive->failed_pc = NULL; in ide_tape_issue_pc()
476 drive->pc_callback(drive, 0); in ide_tape_issue_pc()
477 ide_complete_rq(drive, -EIO, blk_rq_bytes(rq)); in ide_tape_issue_pc()
485 return ide_issue_pc(drive, cmd); in ide_tape_issue_pc()
515 static ide_startstop_t idetape_media_access_finished(ide_drive_t *drive) in idetape_media_access_finished() argument
517 ide_hwif_t *hwif = drive->hwif; in idetape_media_access_finished()
518 idetape_tape_t *tape = drive->driver_data; in idetape_media_access_finished()
519 struct ide_atapi_pc *pc = drive->pc; in idetape_media_access_finished()
531 ide_retry_pc(drive); in idetape_media_access_finished()
537 drive->failed_pc = NULL; in idetape_media_access_finished()
539 drive->pc_callback(drive, 0); in idetape_media_access_finished()
566 static ide_startstop_t idetape_do_request(ide_drive_t *drive, in idetape_do_request() argument
569 ide_hwif_t *hwif = drive->hwif; in idetape_do_request()
570 idetape_tape_t *tape = drive->driver_data; in idetape_do_request()
583 if (drive->failed_pc && drive->pc->c[0] == REQUEST_SENSE) { in idetape_do_request()
584 pc = drive->failed_pc; in idetape_do_request()
594 if ((drive->dev_flags & IDE_DFLAG_DSC_OVERLAP) == 0 && in idetape_do_request()
596 drive->atapi_flags |= IDE_AFLAG_IGNORE_DSC; in idetape_do_request()
598 if (drive->dev_flags & IDE_DFLAG_POST_RESET) { in idetape_do_request()
599 drive->atapi_flags |= IDE_AFLAG_IGNORE_DSC; in idetape_do_request()
600 drive->dev_flags &= ~IDE_DFLAG_POST_RESET; in idetape_do_request()
603 if (!(drive->atapi_flags & IDE_AFLAG_IGNORE_DSC) && in idetape_do_request()
613 idetape_media_access_finished(drive); in idetape_do_request()
616 return ide_do_reset(drive); in idetape_do_request()
622 ide_tape_stall_queue(drive); in idetape_do_request()
625 drive->atapi_flags &= ~IDE_AFLAG_IGNORE_DSC; in idetape_do_request()
646 idetape_media_access_finished(drive); in idetape_do_request()
653 ide_prep_sense(drive, rq); in idetape_do_request()
663 ide_map_sg(drive, &cmd); in idetape_do_request()
665 return ide_tape_issue_pc(drive, &cmd, pc); in idetape_do_request()
672 static void idetape_create_write_filemark_cmd(ide_drive_t *drive, in idetape_create_write_filemark_cmd() argument
681 static int idetape_wait_ready(ide_drive_t *drive, unsigned long timeout) in idetape_wait_ready() argument
683 idetape_tape_t *tape = drive->driver_data; in idetape_wait_ready()
688 set_bit(ilog2(IDE_AFLAG_MEDIUM_PRESENT), &drive->atapi_flags); in idetape_wait_ready()
691 if (ide_do_test_unit_ready(drive, disk) == 0) in idetape_wait_ready()
698 ide_do_start_stop(drive, disk, IDETAPE_LU_LOAD_MASK); in idetape_wait_ready()
709 static int idetape_flush_tape_buffers(ide_drive_t *drive) in idetape_flush_tape_buffers() argument
711 struct ide_tape_obj *tape = drive->driver_data; in idetape_flush_tape_buffers()
715 idetape_create_write_filemark_cmd(drive, &pc, 0); in idetape_flush_tape_buffers()
716 rc = ide_queue_pc_tail(drive, tape->disk, &pc, NULL, 0); in idetape_flush_tape_buffers()
719 idetape_wait_ready(drive, 60 * 5 * HZ); in idetape_flush_tape_buffers()
723 static int ide_tape_read_position(ide_drive_t *drive) in ide_tape_read_position() argument
725 idetape_tape_t *tape = drive->driver_data; in ide_tape_read_position()
736 if (ide_queue_pc_tail(drive, tape->disk, &pc, buf, pc.req_xfer)) in ide_tape_read_position()
749 &drive->atapi_flags); in ide_tape_read_position()
758 &drive->atapi_flags); in ide_tape_read_position()
765 static void idetape_create_locate_cmd(ide_drive_t *drive, in idetape_create_locate_cmd() argument
777 static void __ide_tape_discard_merge_buffer(ide_drive_t *drive) in __ide_tape_discard_merge_buffer() argument
779 idetape_tape_t *tape = drive->driver_data; in __ide_tape_discard_merge_buffer()
784 clear_bit(ilog2(IDE_AFLAG_FILEMARK), &drive->atapi_flags); in __ide_tape_discard_merge_buffer()
800 static int idetape_position_tape(ide_drive_t *drive, unsigned int block, in idetape_position_tape() argument
803 idetape_tape_t *tape = drive->driver_data; in idetape_position_tape()
809 __ide_tape_discard_merge_buffer(drive); in idetape_position_tape()
810 idetape_wait_ready(drive, 60 * 5 * HZ); in idetape_position_tape()
811 idetape_create_locate_cmd(drive, &pc, block, partition, skip); in idetape_position_tape()
812 ret = ide_queue_pc_tail(drive, disk, &pc, NULL, 0); in idetape_position_tape()
816 ret = ide_tape_read_position(drive); in idetape_position_tape()
822 static void ide_tape_discard_merge_buffer(ide_drive_t *drive, in ide_tape_discard_merge_buffer() argument
825 idetape_tape_t *tape = drive->driver_data; in ide_tape_discard_merge_buffer()
828 __ide_tape_discard_merge_buffer(drive); in ide_tape_discard_merge_buffer()
830 position = ide_tape_read_position(drive); in ide_tape_discard_merge_buffer()
832 if (idetape_position_tape(drive, seek, 0, 0)) { in ide_tape_discard_merge_buffer()
844 static int idetape_queue_rw_tail(ide_drive_t *drive, int cmd, int size) in idetape_queue_rw_tail() argument
846 idetape_tape_t *tape = drive->driver_data; in idetape_queue_rw_tail()
855 rq = blk_get_request(drive->queue, READ, __GFP_RECLAIM); in idetape_queue_rw_tail()
862 ret = blk_rq_map_kern(drive->queue, rq, tape->buf, size, in idetape_queue_rw_tail()
868 blk_execute_rq(drive->queue, tape->disk, rq, 0); in idetape_queue_rw_tail()
894 static void idetape_create_rewind_cmd(ide_drive_t *drive, in idetape_create_rewind_cmd() argument
919 static void ide_tape_flush_merge_buffer(ide_drive_t *drive) in ide_tape_flush_merge_buffer() argument
921 idetape_tape_t *tape = drive->driver_data; in ide_tape_flush_merge_buffer()
932 idetape_queue_rw_tail(drive, REQ_IDETAPE_WRITE, aligned); in ide_tape_flush_merge_buffer()
939 static int idetape_init_rw(ide_drive_t *drive, int dir) in idetape_init_rw() argument
941 idetape_tape_t *tape = drive->driver_data; in idetape_init_rw()
950 ide_tape_discard_merge_buffer(drive, 1); in idetape_init_rw()
952 ide_tape_flush_merge_buffer(drive); in idetape_init_rw()
953 idetape_flush_tape_buffers(drive); in idetape_init_rw()
973 if (drive->dev_flags & IDE_DFLAG_DSC_OVERLAP) { in idetape_init_rw()
977 rc = idetape_queue_rw_tail(drive, cmd, 0); in idetape_init_rw()
989 static void idetape_pad_zeros(ide_drive_t *drive, int bcount) in idetape_pad_zeros() argument
991 idetape_tape_t *tape = drive->driver_data; in idetape_pad_zeros()
998 idetape_queue_rw_tail(drive, REQ_IDETAPE_WRITE, count); in idetape_pad_zeros()
1007 static int idetape_rewind_tape(ide_drive_t *drive) in idetape_rewind_tape() argument
1009 struct ide_tape_obj *tape = drive->driver_data; in idetape_rewind_tape()
1016 idetape_create_rewind_cmd(drive, &pc); in idetape_rewind_tape()
1017 ret = ide_queue_pc_tail(drive, disk, &pc, NULL, 0); in idetape_rewind_tape()
1021 ret = ide_tape_read_position(drive); in idetape_rewind_tape()
1028 static int idetape_blkdev_ioctl(ide_drive_t *drive, unsigned int cmd, in idetape_blkdev_ioctl() argument
1031 idetape_tape_t *tape = drive->driver_data; in idetape_blkdev_ioctl()
1061 static int idetape_space_over_filemarks(ide_drive_t *drive, short mt_op, in idetape_space_over_filemarks() argument
1064 idetape_tape_t *tape = drive->driver_data; in idetape_space_over_filemarks()
1084 &drive->atapi_flags)) in idetape_space_over_filemarks()
1086 ide_tape_discard_merge_buffer(drive, 0); in idetape_space_over_filemarks()
1094 return ide_queue_pc_tail(drive, disk, &pc, NULL, 0); in idetape_space_over_filemarks()
1099 retval = idetape_space_over_filemarks(drive, MTFSF, in idetape_space_over_filemarks()
1104 return idetape_space_over_filemarks(drive, MTFSF, count); in idetape_space_over_filemarks()
1131 ide_drive_t *drive = tape->drive; in idetape_chrdev_read() local
1139 if (test_bit(ilog2(IDE_AFLAG_DETECT_BS), &drive->atapi_flags)) in idetape_chrdev_read()
1145 rc = idetape_init_rw(drive, IDETAPE_DIR_READ); in idetape_chrdev_read()
1156 &drive->atapi_flags)) in idetape_chrdev_read()
1159 if (idetape_queue_rw_tail(drive, REQ_IDETAPE_READ, in idetape_chrdev_read()
1174 if (!done && test_bit(ilog2(IDE_AFLAG_FILEMARK), &drive->atapi_flags)) { in idetape_chrdev_read()
1175 idetape_space_over_filemarks(drive, MTFSF, 1); in idetape_chrdev_read()
1186 ide_drive_t *drive = tape->drive; in idetape_chrdev_write() local
1198 rc = idetape_init_rw(drive, IDETAPE_DIR_WRITE); in idetape_chrdev_write()
1207 idetape_queue_rw_tail(drive, REQ_IDETAPE_WRITE, in idetape_chrdev_write()
1225 static int idetape_write_filemark(ide_drive_t *drive) in idetape_write_filemark() argument
1227 struct ide_tape_obj *tape = drive->driver_data; in idetape_write_filemark()
1231 idetape_create_write_filemark_cmd(drive, &pc, 1); in idetape_write_filemark()
1232 if (ide_queue_pc_tail(drive, tape->disk, &pc, NULL, 0)) { in idetape_write_filemark()
1252 static int idetape_mtioctop(ide_drive_t *drive, short mt_op, int mt_count) in idetape_mtioctop() argument
1254 idetape_tape_t *tape = drive->driver_data; in idetape_mtioctop()
1269 return idetape_space_over_filemarks(drive, mt_op, mt_count); in idetape_mtioctop()
1278 ide_tape_discard_merge_buffer(drive, 1); in idetape_mtioctop()
1280 retval = idetape_write_filemark(drive); in idetape_mtioctop()
1286 ide_tape_discard_merge_buffer(drive, 0); in idetape_mtioctop()
1287 if (idetape_rewind_tape(drive)) in idetape_mtioctop()
1291 ide_tape_discard_merge_buffer(drive, 0); in idetape_mtioctop()
1292 return ide_do_start_stop(drive, disk, IDETAPE_LU_LOAD_MASK); in idetape_mtioctop()
1300 if (!ide_set_media_lock(drive, disk, 0)) in idetape_mtioctop()
1303 ide_tape_discard_merge_buffer(drive, 0); in idetape_mtioctop()
1304 retval = ide_do_start_stop(drive, disk, !IDETAPE_LU_LOAD_MASK); in idetape_mtioctop()
1307 &drive->atapi_flags); in idetape_mtioctop()
1310 ide_tape_discard_merge_buffer(drive, 0); in idetape_mtioctop()
1311 return idetape_flush_tape_buffers(drive); in idetape_mtioctop()
1313 ide_tape_discard_merge_buffer(drive, 0); in idetape_mtioctop()
1314 return ide_do_start_stop(drive, disk, in idetape_mtioctop()
1318 return ide_queue_pc_tail(drive, disk, &pc, NULL, 0); in idetape_mtioctop()
1320 (void)idetape_rewind_tape(drive); in idetape_mtioctop()
1322 return ide_queue_pc_tail(drive, disk, &pc, NULL, 0); in idetape_mtioctop()
1330 &drive->atapi_flags); in idetape_mtioctop()
1333 &drive->atapi_flags); in idetape_mtioctop()
1336 ide_tape_discard_merge_buffer(drive, 0); in idetape_mtioctop()
1337 return idetape_position_tape(drive, in idetape_mtioctop()
1340 ide_tape_discard_merge_buffer(drive, 0); in idetape_mtioctop()
1341 return idetape_position_tape(drive, 0, mt_count, 0); in idetape_mtioctop()
1345 retval = ide_set_media_lock(drive, disk, 1); in idetape_mtioctop()
1351 retval = ide_set_media_lock(drive, disk, 0); in idetape_mtioctop()
1372 ide_drive_t *drive = tape->drive; in do_idetape_chrdev_ioctl() local
1382 ide_tape_flush_merge_buffer(drive); in do_idetape_chrdev_ioctl()
1383 idetape_flush_tape_buffers(drive); in do_idetape_chrdev_ioctl()
1388 position = ide_tape_read_position(drive); in do_idetape_chrdev_ioctl()
1396 return idetape_mtioctop(drive, mtop.mt_op, mtop.mt_count); in do_idetape_chrdev_ioctl()
1418 ide_tape_discard_merge_buffer(drive, 1); in do_idetape_chrdev_ioctl()
1419 return idetape_blkdev_ioctl(drive, cmd, arg); in do_idetape_chrdev_ioctl()
1437 static void ide_tape_get_bsize_from_bdesc(ide_drive_t *drive) in ide_tape_get_bsize_from_bdesc() argument
1439 idetape_tape_t *tape = drive->driver_data; in ide_tape_get_bsize_from_bdesc()
1444 if (ide_queue_pc_tail(drive, tape->disk, &pc, buf, pc.req_xfer)) { in ide_tape_get_bsize_from_bdesc()
1465 ide_drive_t *drive; in idetape_chrdev_open() local
1480 drive = tape->drive; in idetape_chrdev_open()
1493 if (test_and_set_bit(ilog2(IDE_AFLAG_BUSY), &drive->atapi_flags)) { in idetape_chrdev_open()
1498 retval = idetape_wait_ready(drive, 60 * HZ); in idetape_chrdev_open()
1500 clear_bit(ilog2(IDE_AFLAG_BUSY), &drive->atapi_flags); in idetape_chrdev_open()
1505 ide_tape_read_position(drive); in idetape_chrdev_open()
1506 if (!test_bit(ilog2(IDE_AFLAG_ADDRESS_VALID), &drive->atapi_flags)) in idetape_chrdev_open()
1507 (void)idetape_rewind_tape(drive); in idetape_chrdev_open()
1510 ide_tape_get_bsize_from_bdesc(drive); in idetape_chrdev_open()
1522 clear_bit(ilog2(IDE_AFLAG_BUSY), &drive->atapi_flags); in idetape_chrdev_open()
1530 if (!ide_set_media_lock(drive, tape->disk, 1)) { in idetape_chrdev_open()
1547 static void idetape_write_release(ide_drive_t *drive, unsigned int minor) in idetape_write_release() argument
1549 idetape_tape_t *tape = drive->driver_data; in idetape_write_release()
1551 ide_tape_flush_merge_buffer(drive); in idetape_write_release()
1554 idetape_pad_zeros(drive, tape->blk_size * in idetape_write_release()
1559 idetape_write_filemark(drive); in idetape_write_release()
1560 idetape_flush_tape_buffers(drive); in idetape_write_release()
1561 idetape_flush_tape_buffers(drive); in idetape_write_release()
1567 ide_drive_t *drive = tape->drive; in idetape_chrdev_release() local
1572 tape = drive->driver_data; in idetape_chrdev_release()
1577 idetape_write_release(drive, minor); in idetape_chrdev_release()
1580 ide_tape_discard_merge_buffer(drive, 1); in idetape_chrdev_release()
1584 &drive->atapi_flags)) in idetape_chrdev_release()
1585 (void) idetape_rewind_tape(drive); in idetape_chrdev_release()
1589 if (!ide_set_media_lock(drive, tape->disk, 0)) in idetape_chrdev_release()
1593 clear_bit(ilog2(IDE_AFLAG_BUSY), &drive->atapi_flags); in idetape_chrdev_release()
1601 static void idetape_get_inquiry_results(ide_drive_t *drive) in idetape_get_inquiry_results() argument
1603 idetape_tape_t *tape = drive->driver_data; in idetape_get_inquiry_results()
1609 if (ide_queue_pc_tail(drive, tape->disk, &pc, pc_buf, pc.req_xfer)) { in idetape_get_inquiry_results()
1623 drive->name, tape->name, vendor_id, product_id, fw_rev); in idetape_get_inquiry_results()
1630 static void idetape_get_mode_sense_results(ide_drive_t *drive) in idetape_get_mode_sense_results() argument
1632 idetape_tape_t *tape = drive->driver_data; in idetape_get_mode_sense_results()
1638 if (ide_queue_pc_tail(drive, tape->disk, &pc, buf, pc.req_xfer)) { in idetape_get_mode_sense_results()
1660 "(assuming 650KB/sec)\n", drive->name); in idetape_get_mode_sense_results()
1665 "(assuming 650KB/sec)\n", drive->name); in idetape_get_mode_sense_results()
1673 drive->dev_flags &= ~IDE_DFLAG_DOORLOCKING; in idetape_get_mode_sense_results()
1683 static int get_##name(ide_drive_t *drive) \
1685 idetape_tape_t *tape = drive->driver_data; \
1690 static int set_##name(ide_drive_t *drive, int arg) \
1692 idetape_tape_t *tape = drive->driver_data; \
1706 static int mulf_tdsc(ide_drive_t *drive) { return 1000; } in mulf_tdsc() argument
1707 static int divf_tdsc(ide_drive_t *drive) { return HZ; } in divf_tdsc() argument
1708 static int divf_buffer(ide_drive_t *drive) { return 2; } in divf_buffer() argument
1709 static int divf_buffer_size(ide_drive_t *drive) { return 1024; } in divf_buffer_size() argument
1743 static void idetape_setup(ide_drive_t *drive, idetape_tape_t *tape, int minor) in idetape_setup() argument
1752 drive->pc_callback = ide_tape_callback; in idetape_setup()
1754 drive->dev_flags |= IDE_DFLAG_DSC_OVERLAP; in idetape_setup()
1756 if (drive->hwif->host_flags & IDE_HFLAG_NO_DSC) { in idetape_setup()
1759 drive->dev_flags &= ~IDE_DFLAG_DSC_OVERLAP; in idetape_setup()
1763 if (strstr((char *)&drive->id[ATA_ID_PROD], "Seagate STT3401")) in idetape_setup()
1764 drive->dev_flags &= ~IDE_DFLAG_DSC_OVERLAP; in idetape_setup()
1772 idetape_get_inquiry_results(drive); in idetape_setup()
1773 idetape_get_mode_sense_results(drive); in idetape_setup()
1774 ide_tape_get_bsize_from_bdesc(drive); in idetape_setup()
1797 drive->name, tape->name, *(u16 *)&tape->caps[14], in idetape_setup()
1801 (drive->dev_flags & IDE_DFLAG_USING_DMA) ? ", DMA" : ""); in idetape_setup()
1803 ide_proc_register_driver(drive, tape->driver); in idetape_setup()
1806 static void ide_tape_remove(ide_drive_t *drive) in ide_tape_remove() argument
1808 idetape_tape_t *tape = drive->driver_data; in ide_tape_remove()
1810 ide_proc_unregister_driver(drive, tape->driver); in ide_tape_remove()
1822 ide_drive_t *drive = tape->drive; in ide_tape_release() local
1827 drive->dev_flags &= ~IDE_DFLAG_DSC_OVERLAP; in ide_tape_release()
1828 drive->driver_data = NULL; in ide_tape_release()
1841 ide_drive_t *drive = (ide_drive_t *) m->private; in idetape_name_proc_show() local
1842 idetape_tape_t *tape = drive->driver_data; in idetape_name_proc_show()
1867 static ide_proc_entry_t *ide_tape_proc_entries(ide_drive_t *drive) in ide_tape_proc_entries() argument
1872 static const struct ide_proc_devset *ide_tape_proc_devsets(ide_drive_t *drive) in ide_tape_proc_devsets() argument
1934 ide_drive_t *drive = tape->drive; in idetape_ioctl() local
1938 err = generic_ide_ioctl(drive, bdev, cmd, arg); in idetape_ioctl()
1940 err = idetape_blkdev_ioctl(drive, cmd, arg); in idetape_ioctl()
1953 static int ide_tape_probe(ide_drive_t *drive) in ide_tape_probe() argument
1961 if (!strstr(DRV_NAME, drive->driver_req)) in ide_tape_probe()
1964 if (drive->media != ide_tape) in ide_tape_probe()
1967 if ((drive->dev_flags & IDE_DFLAG_ID_READ) && in ide_tape_probe()
1968 ide_check_atapi_device(drive, DRV_NAME) == 0) { in ide_tape_probe()
1970 " the driver\n", drive->name); in ide_tape_probe()
1976 drive->name); in ide_tape_probe()
1984 ide_init_disk(g, drive); in ide_tape_probe()
1986 tape->dev.parent = &drive->gendev; in ide_tape_probe()
1988 dev_set_name(&tape->dev, "%s", dev_name(&drive->gendev)); in ide_tape_probe()
1993 tape->drive = drive; in ide_tape_probe()
1999 drive->driver_data = tape; in ide_tape_probe()
2007 idetape_setup(drive, tape, minor); in ide_tape_probe()
2009 device_create(idetape_sysfs_class, &drive->gendev, in ide_tape_probe()
2011 device_create(idetape_sysfs_class, &drive->gendev, in ide_tape_probe()