• Home
  • Raw
  • Download

Lines Matching +full:i +full:- +full:drive

1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (C) 1996-1999 Gadi Oxman <gadio@netvision.net.il>
6 * Copyright (C) 2000-2002 Paul Bristow <paul@paulbristow.net>
11 * LS-120/240 SuperDisk
16 * Documentation/ide/ChangeLog.ide-floppy.1996-2002
44 #include "ide-floppy.h"
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()
68 struct request *rq = pc->rq; in ide_floppy_callback()
69 int uptodate = pc->error ? 0 : 1; in ide_floppy_callback()
73 if (drive->failed_pc == pc) in ide_floppy_callback()
74 drive->failed_pc = NULL; in ide_floppy_callback()
76 if (pc->c[0] == GPCMD_READ_10 || pc->c[0] == GPCMD_WRITE_10 || in ide_floppy_callback()
79 else if (pc->c[0] == GPCMD_REQUEST_SENSE) { in ide_floppy_callback()
81 u8 *buf = bio_data(rq->bio); in ide_floppy_callback()
83 if (!pc->error) { in ide_floppy_callback()
84 floppy->sense_key = buf[2] & 0x0F; in ide_floppy_callback()
85 floppy->asc = buf[12]; in ide_floppy_callback()
86 floppy->ascq = buf[13]; in ide_floppy_callback()
87 floppy->progress_indication = buf[15] & 0x80 ? in ide_floppy_callback()
90 if (drive->failed_pc) in ide_floppy_callback()
92 drive->failed_pc->c[0]); in ide_floppy_callback()
95 "ascq = %x", floppy->sense_key, in ide_floppy_callback()
96 floppy->asc, floppy->ascq); in ide_floppy_callback()
98 printk(KERN_ERR PFX "Error in REQUEST SENSE itself - " in ide_floppy_callback()
103 scsi_req(rq)->result = uptodate ? 0 : IDE_DRV_ERROR_GENERAL; in ide_floppy_callback()
112 if (floppy->sense_key == 0x02 && in ide_floppy_report_error()
113 floppy->asc == 0x3a && in ide_floppy_report_error()
114 floppy->ascq == 0x00) in ide_floppy_report_error()
117 printk(KERN_ERR PFX "%s: I/O error, pc = %2x, key = %2x, " in ide_floppy_report_error()
119 floppy->drive->name, pc->c[0], floppy->sense_key, in ide_floppy_report_error()
120 floppy->asc, floppy->ascq); 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()
131 pc->c[0] != GPCMD_REQUEST_SENSE) in ide_floppy_issue_pc()
132 drive->failed_pc = pc; in ide_floppy_issue_pc()
135 drive->pc = pc; in ide_floppy_issue_pc()
137 if (pc->retries > IDEFLOPPY_MAX_PC_RETRIES) { in ide_floppy_issue_pc()
138 unsigned int done = blk_rq_bytes(drive->hwif->rq); in ide_floppy_issue_pc()
140 if (!(pc->flags & PC_FLAG_SUPPRESS_ERROR)) in ide_floppy_issue_pc()
144 pc->error = IDE_DRV_ERROR_GENERAL; 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()
152 ide_debug_log(IDE_DBG_FUNC, "retry #%d", pc->retries); in ide_floppy_issue_pc()
154 pc->retries++; in ide_floppy_issue_pc()
156 return ide_issue_pc(drive, cmd); in ide_floppy_issue_pc()
162 pc->c[0] = GPCMD_READ_FORMAT_CAPACITIES; in ide_floppy_create_read_capacity_cmd()
163 pc->c[7] = 255; in ide_floppy_create_read_capacity_cmd()
164 pc->c[8] = 255; in ide_floppy_create_read_capacity_cmd()
165 pc->req_xfer = 255; in ide_floppy_create_read_capacity_cmd()
174 pc->c[0] = GPCMD_MODE_SENSE_10; in ide_floppy_create_mode_sense_cmd()
175 pc->c[1] = 0; in ide_floppy_create_mode_sense_cmd()
176 pc->c[2] = page_code; in ide_floppy_create_mode_sense_cmd()
188 put_unaligned(cpu_to_be16(length), (u16 *) &pc->c[7]); in ide_floppy_create_mode_sense_cmd()
189 pc->req_xfer = length; in ide_floppy_create_mode_sense_cmd()
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()
197 int block = sector / floppy->bs_factor; in idefloppy_create_rw_cmd()
198 int blocks = blk_rq_sectors(rq) / floppy->bs_factor; in idefloppy_create_rw_cmd()
204 pc->c[0] = cmd == READ ? GPCMD_READ_10 : GPCMD_WRITE_10; in idefloppy_create_rw_cmd()
205 put_unaligned(cpu_to_be16(blocks), (unsigned short *)&pc->c[7]); in idefloppy_create_rw_cmd()
206 put_unaligned(cpu_to_be32(block), (unsigned int *) &pc->c[2]); in idefloppy_create_rw_cmd()
208 memcpy(scsi_req(rq)->cmd, pc->c, 12); in idefloppy_create_rw_cmd()
210 pc->rq = rq; in idefloppy_create_rw_cmd()
212 pc->flags |= PC_FLAG_WRITING; in idefloppy_create_rw_cmd()
214 pc->flags |= PC_FLAG_DMA_OK; in idefloppy_create_rw_cmd()
221 memcpy(pc->c, scsi_req(rq)->cmd, sizeof(pc->c)); in idefloppy_blockpc_cmd()
222 pc->rq = rq; in idefloppy_blockpc_cmd()
224 pc->flags |= PC_FLAG_DMA_OK; in idefloppy_blockpc_cmd()
226 pc->flags |= PC_FLAG_WRITING; in idefloppy_blockpc_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()
237 ide_debug_log(IDE_DBG_FUNC, "enter, cmd: 0x%x\n", rq->cmd[0]); in ide_floppy_do_request()
239 if (drive->debug_mask & IDE_DBG_RQ) in ide_floppy_do_request()
240 blk_dump_rq_flags(rq, (rq->rq_disk in ide_floppy_do_request()
241 ? rq->rq_disk->disk_name in ide_floppy_do_request()
244 if (scsi_req(rq)->result >= ERROR_MAX) { 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()
252 scsi_req(rq)->result = 0; in ide_floppy_do_request()
253 ide_complete_rq(drive, BLK_STS_OK, blk_rq_bytes(rq)); in ide_floppy_do_request()
261 if (((long)blk_rq_pos(rq) % floppy->bs_factor) || in ide_floppy_do_request()
262 (blk_rq_sectors(rq) % floppy->bs_factor)) { in ide_floppy_do_request()
264 drive->name); in ide_floppy_do_request()
267 pc = &floppy->queued_pc; in ide_floppy_do_request()
268 idefloppy_create_rw_cmd(drive, pc, rq, (unsigned long)block); in ide_floppy_do_request()
272 pc = &floppy->queued_pc; in ide_floppy_do_request()
277 switch (ide_req(rq)->type) { in ide_floppy_do_request()
280 pc = (struct ide_atapi_pc *)ide_req(rq)->special; 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()
301 pc->rq = rq; 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()
306 if (blk_rq_is_passthrough(rq) && scsi_req(rq)->result == 0) in ide_floppy_do_request()
307 scsi_req(rq)->result = -EIO; 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()
320 struct gendisk *disk = floppy->disk; 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()
351 if (memcmp(page, &floppy->flexible_disk_page, 32)) in ide_floppy_get_flexible_disk_page()
354 drive->name, capacity / 1024, cyls, heads, in ide_floppy_get_flexible_disk_page()
357 memcpy(&floppy->flexible_disk_page, page, 32); 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()
361 lba_capacity = floppy->blocks * floppy->block_size; 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()
367 floppy->blocks = floppy->block_size ? in ide_floppy_get_flexible_disk_page()
368 capacity / floppy->block_size : 0; 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()
382 struct gendisk *disk = floppy->disk; in ide_floppy_get_capacity()
386 int i, rc = 1, blocks, length; in ide_floppy_get_capacity() local
390 drive->bios_cyl = 0; in ide_floppy_get_capacity()
391 drive->bios_head = drive->bios_sect = 0; in ide_floppy_get_capacity()
392 floppy->blocks = 0; in ide_floppy_get_capacity()
393 floppy->bs_factor = 1; 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()
405 for (i = 0; i < desc_cnt; i++) { in ide_floppy_get_capacity()
406 unsigned int desc_start = 4 + i*8; in ide_floppy_get_capacity()
413 i, blocks * length / 1024, in ide_floppy_get_capacity()
416 if (i) in ide_floppy_get_capacity()
419 * the code below is valid only for the 1st descriptor, ie i=0 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()
433 /* Normal Zip/LS-120 disks */ in ide_floppy_get_capacity()
434 if (memcmp(cap_desc, &floppy->cap_desc, 8)) in ide_floppy_get_capacity()
437 drive->name, blocks * length / 1024, in ide_floppy_get_capacity()
439 memcpy(&floppy->cap_desc, cap_desc, 8); in ide_floppy_get_capacity()
443 " not supported\n", drive->name, length); in ide_floppy_get_capacity()
445 floppy->blocks = blocks; in ide_floppy_get_capacity()
446 floppy->block_size = length; in ide_floppy_get_capacity()
447 floppy->bs_factor = length / 512; in ide_floppy_get_capacity()
448 if (floppy->bs_factor != 1) in ide_floppy_get_capacity()
452 drive->name); in ide_floppy_get_capacity()
453 drive->capacity64 = in ide_floppy_get_capacity()
454 floppy->blocks * floppy->bs_factor; 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()
490 * We used to check revisions here. At this point however I'm giving up. 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()