Lines Matching full:drive

59  * The following delay solves a problem with ATAPI Zip 100 drive where BSY bit
64 static int ide_floppy_callback(ide_drive_t *drive, int dsc) in ide_floppy_callback() argument
66 struct ide_disk_obj *floppy = drive->driver_data; in ide_floppy_callback()
67 struct ide_atapi_pc *pc = drive->pc; in ide_floppy_callback()
73 if (drive->failed_pc == pc) in ide_floppy_callback()
74 drive->failed_pc = NULL; in ide_floppy_callback()
90 if (drive->failed_pc) in ide_floppy_callback()
92 drive->failed_pc->c[0]); in ide_floppy_callback()
119 floppy->drive->name, pc->c[0], floppy->sense_key, in ide_floppy_report_error()
124 static ide_startstop_t ide_floppy_issue_pc(ide_drive_t *drive, in ide_floppy_issue_pc() argument
128 struct ide_disk_obj *floppy = drive->driver_data; in ide_floppy_issue_pc()
130 if (drive->failed_pc == NULL && in ide_floppy_issue_pc()
132 drive->failed_pc = pc; in ide_floppy_issue_pc()
135 drive->pc = pc; in ide_floppy_issue_pc()
138 unsigned int done = blk_rq_bytes(drive->hwif->rq); in ide_floppy_issue_pc()
146 drive->failed_pc = NULL; in ide_floppy_issue_pc()
147 drive->pc_callback(drive, 0); in ide_floppy_issue_pc()
148 ide_complete_rq(drive, BLK_STS_IOERR, done); in ide_floppy_issue_pc()
156 return ide_issue_pc(drive, cmd); in ide_floppy_issue_pc()
192 static void idefloppy_create_rw_cmd(ide_drive_t *drive, in idefloppy_create_rw_cmd() argument
196 struct ide_disk_obj *floppy = drive->driver_data; in idefloppy_create_rw_cmd()
230 static ide_startstop_t ide_floppy_do_request(ide_drive_t *drive, in ide_floppy_do_request() argument
233 struct ide_disk_obj *floppy = drive->driver_data; in ide_floppy_do_request()
239 if (drive->debug_mask & IDE_DBG_RQ) in ide_floppy_do_request()
245 if (drive->failed_pc) { in ide_floppy_do_request()
246 ide_floppy_report_error(floppy, drive->failed_pc); in ide_floppy_do_request()
247 drive->failed_pc = NULL; in ide_floppy_do_request()
249 printk(KERN_ERR PFX "%s: I/O error\n", drive->name); in ide_floppy_do_request()
253 ide_complete_rq(drive, BLK_STS_OK, blk_rq_bytes(rq)); in ide_floppy_do_request()
264 drive->name); in ide_floppy_do_request()
268 idefloppy_create_rw_cmd(drive, pc, rq, (unsigned long)block); in ide_floppy_do_request()
287 ide_prep_sense(drive, rq); in ide_floppy_do_request()
298 ide_map_sg(drive, &cmd); in ide_floppy_do_request()
303 return ide_floppy_issue_pc(drive, &cmd, pc); in ide_floppy_do_request()
305 drive->failed_pc = NULL; in ide_floppy_do_request()
308 ide_complete_rq(drive, BLK_STS_IOERR, blk_rq_bytes(rq)); in ide_floppy_do_request()
316 static int ide_floppy_get_flexible_disk_page(ide_drive_t *drive, in ide_floppy_get_flexible_disk_page() argument
319 struct ide_disk_obj *floppy = drive->driver_data; in ide_floppy_get_flexible_disk_page()
328 if (ide_queue_pc_tail(drive, disk, pc, buf, pc->req_xfer)) { in ide_floppy_get_flexible_disk_page()
334 drive->dev_flags |= IDE_DFLAG_WP; in ide_floppy_get_flexible_disk_page()
336 drive->dev_flags &= ~IDE_DFLAG_WP; in ide_floppy_get_flexible_disk_page()
338 set_disk_ro(disk, !!(drive->dev_flags & IDE_DFLAG_WP)); in ide_floppy_get_flexible_disk_page()
354 drive->name, capacity / 1024, cyls, heads, in ide_floppy_get_flexible_disk_page()
358 drive->bios_cyl = cyls; in ide_floppy_get_flexible_disk_page()
359 drive->bios_head = heads; in ide_floppy_get_flexible_disk_page()
360 drive->bios_sect = sectors; in ide_floppy_get_flexible_disk_page()
365 "bytes, but the drive only handles %d\n", in ide_floppy_get_flexible_disk_page()
366 drive->name, lba_capacity, capacity); in ide_floppy_get_flexible_disk_page()
369 drive->capacity64 = floppy->blocks * floppy->bs_factor; in ide_floppy_get_flexible_disk_page()
376 * Determine if a media is present in the floppy drive, and if so, its LBA
379 static int ide_floppy_get_capacity(ide_drive_t *drive) in ide_floppy_get_capacity() argument
381 struct ide_disk_obj *floppy = drive->driver_data; in ide_floppy_get_capacity()
390 drive->bios_cyl = 0; in ide_floppy_get_capacity()
391 drive->bios_head = drive->bios_sect = 0; in ide_floppy_get_capacity()
394 drive->capacity64 = 0; in ide_floppy_get_capacity()
397 if (ide_queue_pc_tail(drive, disk, &pc, pc_buf, pc.req_xfer)) { in ide_floppy_get_capacity()
423 /* Clik! drive returns this instead of CAPACITY_CURRENT */ in ide_floppy_get_capacity()
425 if (!(drive->atapi_flags & IDE_AFLAG_CLIK_DRIVE)) in ide_floppy_get_capacity()
427 * If it is not a clik drive, break out in ide_floppy_get_capacity()
437 drive->name, blocks * length / 1024, in ide_floppy_get_capacity()
443 " not supported\n", drive->name, length); in ide_floppy_get_capacity()
452 drive->name); in ide_floppy_get_capacity()
453 drive->capacity64 = in ide_floppy_get_capacity()
463 printk(KERN_ERR PFX "%s: No disk in drive\n", in ide_floppy_get_capacity()
464 drive->name); in ide_floppy_get_capacity()
468 "in drive\n", drive->name); in ide_floppy_get_capacity()
476 if (!(drive->atapi_flags & IDE_AFLAG_CLIK_DRIVE)) in ide_floppy_get_capacity()
477 (void) ide_floppy_get_flexible_disk_page(drive, &pc); in ide_floppy_get_capacity()
482 static void ide_floppy_setup(ide_drive_t *drive) in ide_floppy_setup() argument
484 struct ide_disk_obj *floppy = drive->driver_data; in ide_floppy_setup()
485 u16 *id = drive->id; in ide_floppy_setup()
487 drive->pc_callback = ide_floppy_callback; in ide_floppy_setup()
499 drive->atapi_flags |= IDE_AFLAG_ZIP_DRIVE; in ide_floppy_setup()
501 drive->pc_delay = IDEFLOPPY_PC_DELAY; in ide_floppy_setup()
502 blk_queue_max_hw_sectors(drive->queue, 64); in ide_floppy_setup()
506 * Guess what? The IOMEGA Clik! drive also needs the above fix. It makes in ide_floppy_setup()
510 blk_queue_max_hw_sectors(drive->queue, 64); in ide_floppy_setup()
511 drive->atapi_flags |= IDE_AFLAG_CLIK_DRIVE; in ide_floppy_setup()
513 drive->dev_flags &= ~IDE_DFLAG_DOORLOCKING; in ide_floppy_setup()
516 (void) ide_floppy_get_capacity(drive); in ide_floppy_setup()
518 ide_proc_register_driver(drive, floppy->driver); in ide_floppy_setup()
521 static void ide_floppy_flush(ide_drive_t *drive) in ide_floppy_flush() argument
525 static int ide_floppy_init_media(ide_drive_t *drive, struct gendisk *disk) in ide_floppy_init_media() argument
529 if (ide_do_test_unit_ready(drive, disk)) in ide_floppy_init_media()
530 ide_do_start_stop(drive, disk, 1); in ide_floppy_init_media()
532 ret = ide_floppy_get_capacity(drive); in ide_floppy_init_media()
534 set_capacity(disk, ide_gd_capacity(drive)); in ide_floppy_init_media()