aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/ide-floppy.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ide/ide-floppy.c')
-rw-r--r--drivers/ide/ide-floppy.c392
1 files changed, 114 insertions, 278 deletions
diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c
index d36f155470a4..cf0aa25470ee 100644
--- a/drivers/ide/ide-floppy.c
+++ b/drivers/ide/ide-floppy.c
@@ -16,6 +16,7 @@
16 */ 16 */
17 17
18#define DRV_NAME "ide-floppy" 18#define DRV_NAME "ide-floppy"
19#define PFX DRV_NAME ": "
19 20
20#define IDEFLOPPY_VERSION "1.00" 21#define IDEFLOPPY_VERSION "1.00"
21 22
@@ -48,17 +49,17 @@
48 49
49#include "ide-floppy.h" 50#include "ide-floppy.h"
50 51
51/* define to see debug info */ 52/* module parameters */
52#define IDEFLOPPY_DEBUG_LOG 0 53static unsigned long debug_mask;
54module_param(debug_mask, ulong, 0644);
53 55
54/* #define IDEFLOPPY_DEBUG(fmt, args...) printk(KERN_INFO fmt, ## args) */ 56/* define to see debug info */
55#define IDEFLOPPY_DEBUG(fmt, args...) 57#define IDEFLOPPY_DEBUG_LOG 0
56 58
57#if IDEFLOPPY_DEBUG_LOG 59#if IDEFLOPPY_DEBUG_LOG
58#define debug_log(fmt, args...) \ 60#define ide_debug_log(lvl, fmt, args...) __ide_debug_log(lvl, fmt, args)
59 printk(KERN_INFO "ide-floppy: " fmt, ## args)
60#else 61#else
61#define debug_log(fmt, args...) do {} while (0) 62#define ide_debug_log(lvl, fmt, args...) do {} while (0)
62#endif 63#endif
63 64
64/* 65/*
@@ -73,18 +74,17 @@
73#define CAPACITY_CURRENT 0x02 74#define CAPACITY_CURRENT 0x02
74#define CAPACITY_NO_CARTRIDGE 0x03 75#define CAPACITY_NO_CARTRIDGE 0x03
75 76
76#define IDEFLOPPY_TICKS_DELAY HZ/20 /* default delay for ZIP 100 (50ms) */ 77/*
78 * The following delay solves a problem with ATAPI Zip 100 drive where BSY bit
79 * was apparently being deasserted before the unit was ready to receive data.
80 */
81#define IDEFLOPPY_PC_DELAY (HZ/20) /* default delay for ZIP 100 (50ms) */
77 82
78/* Error code returned in rq->errors to the higher part of the driver. */ 83/* Error code returned in rq->errors to the higher part of the driver. */
79#define IDEFLOPPY_ERROR_GENERAL 101 84#define IDEFLOPPY_ERROR_GENERAL 101
80 85
81static DEFINE_MUTEX(idefloppy_ref_mutex); 86static DEFINE_MUTEX(idefloppy_ref_mutex);
82 87
83#define to_ide_floppy(obj) container_of(obj, struct ide_floppy_obj, kref)
84
85#define ide_floppy_g(disk) \
86 container_of((disk)->private_data, struct ide_floppy_obj, driver)
87
88static void idefloppy_cleanup_obj(struct kref *); 88static void idefloppy_cleanup_obj(struct kref *);
89 89
90static struct ide_floppy_obj *ide_floppy_get(struct gendisk *disk) 90static struct ide_floppy_obj *ide_floppy_get(struct gendisk *disk)
@@ -92,7 +92,7 @@ static struct ide_floppy_obj *ide_floppy_get(struct gendisk *disk)
92 struct ide_floppy_obj *floppy = NULL; 92 struct ide_floppy_obj *floppy = NULL;
93 93
94 mutex_lock(&idefloppy_ref_mutex); 94 mutex_lock(&idefloppy_ref_mutex);
95 floppy = ide_floppy_g(disk); 95 floppy = ide_drv_g(disk, ide_floppy_obj);
96 if (floppy) { 96 if (floppy) {
97 if (ide_device_get(floppy->drive)) 97 if (ide_device_get(floppy->drive))
98 floppy = NULL; 98 floppy = NULL;
@@ -123,13 +123,21 @@ static int idefloppy_end_request(ide_drive_t *drive, int uptodate, int nsecs)
123 struct request *rq = HWGROUP(drive)->rq; 123 struct request *rq = HWGROUP(drive)->rq;
124 int error; 124 int error;
125 125
126 debug_log("Reached %s\n", __func__); 126 ide_debug_log(IDE_DBG_FUNC, "Call %s\n", __func__);
127 127
128 switch (uptodate) { 128 switch (uptodate) {
129 case 0: error = IDEFLOPPY_ERROR_GENERAL; break; 129 case 0:
130 case 1: error = 0; break; 130 error = IDEFLOPPY_ERROR_GENERAL;
131 default: error = uptodate; 131 break;
132
133 case 1:
134 error = 0;
135 break;
136
137 default:
138 error = uptodate;
132 } 139 }
140
133 if (error) 141 if (error)
134 floppy->failed_pc = NULL; 142 floppy->failed_pc = NULL;
135 /* Why does this happen? */ 143 /* Why does this happen? */
@@ -156,13 +164,13 @@ static void idefloppy_update_buffers(ide_drive_t *drive,
156 idefloppy_end_request(drive, 1, 0); 164 idefloppy_end_request(drive, 1, 0);
157} 165}
158 166
159static void ide_floppy_callback(ide_drive_t *drive) 167static void ide_floppy_callback(ide_drive_t *drive, int dsc)
160{ 168{
161 idefloppy_floppy_t *floppy = drive->driver_data; 169 idefloppy_floppy_t *floppy = drive->driver_data;
162 struct ide_atapi_pc *pc = floppy->pc; 170 struct ide_atapi_pc *pc = drive->pc;
163 int uptodate = pc->error ? 0 : 1; 171 int uptodate = pc->error ? 0 : 1;
164 172
165 debug_log("Reached %s\n", __func__); 173 ide_debug_log(IDE_DBG_FUNC, "Call %s\n", __func__);
166 174
167 if (floppy->failed_pc == pc) 175 if (floppy->failed_pc == pc)
168 floppy->failed_pc = NULL; 176 floppy->failed_pc = NULL;
@@ -171,7 +179,7 @@ static void ide_floppy_callback(ide_drive_t *drive)
171 (pc->rq && blk_pc_request(pc->rq))) 179 (pc->rq && blk_pc_request(pc->rq)))
172 uptodate = 1; /* FIXME */ 180 uptodate = 1; /* FIXME */
173 else if (pc->c[0] == GPCMD_REQUEST_SENSE) { 181 else if (pc->c[0] == GPCMD_REQUEST_SENSE) {
174 u8 *buf = floppy->pc->buf; 182 u8 *buf = pc->buf;
175 183
176 if (!pc->error) { 184 if (!pc->error) {
177 floppy->sense_key = buf[2] & 0x0F; 185 floppy->sense_key = buf[2] & 0x0F;
@@ -181,99 +189,20 @@ static void ide_floppy_callback(ide_drive_t *drive)
181 (u16)get_unaligned((u16 *)&buf[16]) : 0x10000; 189 (u16)get_unaligned((u16 *)&buf[16]) : 0x10000;
182 190
183 if (floppy->failed_pc) 191 if (floppy->failed_pc)
184 debug_log("pc = %x, ", floppy->failed_pc->c[0]); 192 ide_debug_log(IDE_DBG_PC, "pc = %x, ",
193 floppy->failed_pc->c[0]);
185 194
186 debug_log("sense key = %x, asc = %x, ascq = %x\n", 195 ide_debug_log(IDE_DBG_SENSE, "sense key = %x, asc = %x,"
187 floppy->sense_key, floppy->asc, floppy->ascq); 196 "ascq = %x\n", floppy->sense_key,
197 floppy->asc, floppy->ascq);
188 } else 198 } else
189 printk(KERN_ERR "Error in REQUEST SENSE itself - " 199 printk(KERN_ERR PFX "Error in REQUEST SENSE itself - "
190 "Aborting request!\n"); 200 "Aborting request!\n");
191 } 201 }
192 202
193 idefloppy_end_request(drive, uptodate, 0); 203 idefloppy_end_request(drive, uptodate, 0);
194} 204}
195 205
196void ide_floppy_create_request_sense_cmd(struct ide_atapi_pc *pc)
197{
198 ide_init_pc(pc);
199 pc->c[0] = GPCMD_REQUEST_SENSE;
200 pc->c[4] = 255;
201 pc->req_xfer = 18;
202}
203
204/*
205 * Called when an error was detected during the last packet command. We queue a
206 * request sense packet command in the head of the request list.
207 */
208static void idefloppy_retry_pc(ide_drive_t *drive)
209{
210 struct ide_floppy_obj *floppy = drive->driver_data;
211 struct request *rq = &floppy->request_sense_rq;
212 struct ide_atapi_pc *pc = &floppy->request_sense_pc;
213
214 (void)ide_read_error(drive);
215 ide_floppy_create_request_sense_cmd(pc);
216 ide_queue_pc_head(drive, floppy->disk, pc, rq);
217}
218
219/* The usual interrupt handler called during a packet command. */
220static ide_startstop_t idefloppy_pc_intr(ide_drive_t *drive)
221{
222 idefloppy_floppy_t *floppy = drive->driver_data;
223
224 return ide_pc_intr(drive, floppy->pc, idefloppy_pc_intr,
225 WAIT_FLOPPY_CMD, NULL, idefloppy_update_buffers,
226 idefloppy_retry_pc, NULL, ide_io_buffers);
227}
228
229/*
230 * What we have here is a classic case of a top half / bottom half interrupt
231 * service routine. In interrupt mode, the device sends an interrupt to signal
232 * that it is ready to receive a packet. However, we need to delay about 2-3
233 * ticks before issuing the packet or we gets in trouble.
234 */
235static int idefloppy_transfer_pc(ide_drive_t *drive)
236{
237 idefloppy_floppy_t *floppy = drive->driver_data;
238
239 /* Send the actual packet */
240 drive->hwif->tp_ops->output_data(drive, NULL, floppy->pc->c, 12);
241
242 /* Timeout for the packet command */
243 return WAIT_FLOPPY_CMD;
244}
245
246/*
247 * Called as an interrupt (or directly). When the device says it's ready for a
248 * packet, we schedule the packet transfer to occur about 2-3 ticks later in
249 * transfer_pc.
250 */
251static ide_startstop_t idefloppy_start_pc_transfer(ide_drive_t *drive)
252{
253 idefloppy_floppy_t *floppy = drive->driver_data;
254 struct ide_atapi_pc *pc = floppy->pc;
255 ide_expiry_t *expiry;
256 unsigned int timeout;
257
258 /*
259 * The following delay solves a problem with ATAPI Zip 100 drives
260 * where the Busy flag was apparently being deasserted before the
261 * unit was ready to receive data. This was happening on a
262 * 1200 MHz Athlon system. 10/26/01 25msec is too short,
263 * 40 and 50msec work well. idefloppy_pc_intr will not be actually
264 * used until after the packet is moved in about 50 msec.
265 */
266 if (drive->atapi_flags & IDE_AFLAG_ZIP_DRIVE) {
267 timeout = floppy->ticks;
268 expiry = &idefloppy_transfer_pc;
269 } else {
270 timeout = WAIT_FLOPPY_CMD;
271 expiry = NULL;
272 }
273
274 return ide_transfer_pc(drive, pc, idefloppy_pc_intr, timeout, expiry);
275}
276
277static void ide_floppy_report_error(idefloppy_floppy_t *floppy, 206static void ide_floppy_report_error(idefloppy_floppy_t *floppy,
278 struct ide_atapi_pc *pc) 207 struct ide_atapi_pc *pc)
279{ 208{
@@ -283,7 +212,7 @@ static void ide_floppy_report_error(idefloppy_floppy_t *floppy,
283 floppy->ascq == 0x00) 212 floppy->ascq == 0x00)
284 return; 213 return;
285 214
286 printk(KERN_ERR "ide-floppy: %s: I/O error, pc = %2x, key = %2x, " 215 printk(KERN_ERR PFX "%s: I/O error, pc = %2x, key = %2x, "
287 "asc = %2x, ascq = %2x\n", 216 "asc = %2x, ascq = %2x\n",
288 floppy->drive->name, pc->c[0], floppy->sense_key, 217 floppy->drive->name, pc->c[0], floppy->sense_key,
289 floppy->asc, floppy->ascq); 218 floppy->asc, floppy->ascq);
@@ -298,8 +227,9 @@ static ide_startstop_t idefloppy_issue_pc(ide_drive_t *drive,
298 if (floppy->failed_pc == NULL && 227 if (floppy->failed_pc == NULL &&
299 pc->c[0] != GPCMD_REQUEST_SENSE) 228 pc->c[0] != GPCMD_REQUEST_SENSE)
300 floppy->failed_pc = pc; 229 floppy->failed_pc = pc;
230
301 /* Set the current packet command */ 231 /* Set the current packet command */
302 floppy->pc = pc; 232 drive->pc = pc;
303 233
304 if (pc->retries > IDEFLOPPY_MAX_PC_RETRIES) { 234 if (pc->retries > IDEFLOPPY_MAX_PC_RETRIES) {
305 if (!(pc->flags & PC_FLAG_SUPPRESS_ERROR)) 235 if (!(pc->flags & PC_FLAG_SUPPRESS_ERROR))
@@ -308,16 +238,15 @@ static ide_startstop_t idefloppy_issue_pc(ide_drive_t *drive,
308 pc->error = IDEFLOPPY_ERROR_GENERAL; 238 pc->error = IDEFLOPPY_ERROR_GENERAL;
309 239
310 floppy->failed_pc = NULL; 240 floppy->failed_pc = NULL;
311 drive->pc_callback(drive); 241 drive->pc_callback(drive, 0);
312 return ide_stopped; 242 return ide_stopped;
313 } 243 }
314 244
315 debug_log("Retry number - %d\n", pc->retries); 245 ide_debug_log(IDE_DBG_FUNC, "%s: Retry #%d\n", __func__, pc->retries);
316 246
317 pc->retries++; 247 pc->retries++;
318 248
319 return ide_issue_pc(drive, pc, idefloppy_start_pc_transfer, 249 return ide_issue_pc(drive, WAIT_FLOPPY_CMD, NULL);
320 WAIT_FLOPPY_CMD, NULL);
321} 250}
322 251
323void ide_floppy_create_read_capacity_cmd(struct ide_atapi_pc *pc) 252void ide_floppy_create_read_capacity_cmd(struct ide_atapi_pc *pc)
@@ -347,23 +276,23 @@ void ide_floppy_create_mode_sense_cmd(struct ide_atapi_pc *pc, u8 page_code)
347 length += 32; 276 length += 32;
348 break; 277 break;
349 default: 278 default:
350 printk(KERN_ERR "ide-floppy: unsupported page code " 279 printk(KERN_ERR PFX "unsupported page code in %s\n", __func__);
351 "in create_mode_sense_cmd\n");
352 } 280 }
353 put_unaligned(cpu_to_be16(length), (u16 *) &pc->c[7]); 281 put_unaligned(cpu_to_be16(length), (u16 *) &pc->c[7]);
354 pc->req_xfer = length; 282 pc->req_xfer = length;
355} 283}
356 284
357static void idefloppy_create_rw_cmd(idefloppy_floppy_t *floppy, 285static void idefloppy_create_rw_cmd(ide_drive_t *drive,
358 struct ide_atapi_pc *pc, struct request *rq, 286 struct ide_atapi_pc *pc, struct request *rq,
359 unsigned long sector) 287 unsigned long sector)
360{ 288{
289 idefloppy_floppy_t *floppy = drive->driver_data;
361 int block = sector / floppy->bs_factor; 290 int block = sector / floppy->bs_factor;
362 int blocks = rq->nr_sectors / floppy->bs_factor; 291 int blocks = rq->nr_sectors / floppy->bs_factor;
363 int cmd = rq_data_dir(rq); 292 int cmd = rq_data_dir(rq);
364 293
365 debug_log("create_rw10_cmd: block == %d, blocks == %d\n", 294 ide_debug_log(IDE_DBG_FUNC, "%s: block: %d, blocks: %d\n", __func__,
366 block, blocks); 295 block, blocks);
367 296
368 ide_init_pc(pc); 297 ide_init_pc(pc);
369 pc->c[0] = cmd == READ ? GPCMD_READ_10 : GPCMD_WRITE_10; 298 pc->c[0] = cmd == READ ? GPCMD_READ_10 : GPCMD_WRITE_10;
@@ -408,41 +337,42 @@ static ide_startstop_t idefloppy_do_request(ide_drive_t *drive,
408 struct ide_atapi_pc *pc; 337 struct ide_atapi_pc *pc;
409 unsigned long block = (unsigned long)block_s; 338 unsigned long block = (unsigned long)block_s;
410 339
411 debug_log("%s: dev: %s, cmd: 0x%x, cmd_type: %x, errors: %d\n", 340 ide_debug_log(IDE_DBG_FUNC, "%s: dev: %s, cmd: 0x%x, cmd_type: %x, "
412 __func__, rq->rq_disk ? rq->rq_disk->disk_name : "?", 341 "errors: %d\n",
413 rq->cmd[0], rq->cmd_type, rq->errors); 342 __func__, rq->rq_disk ? rq->rq_disk->disk_name : "?",
343 rq->cmd[0], rq->cmd_type, rq->errors);
414 344
415 debug_log("%s: sector: %ld, nr_sectors: %ld, current_nr_sectors: %d\n", 345 ide_debug_log(IDE_DBG_FUNC, "%s: sector: %ld, nr_sectors: %ld, "
416 __func__, (long)rq->sector, rq->nr_sectors, 346 "current_nr_sectors: %d\n",
417 rq->current_nr_sectors); 347 __func__, (long)rq->sector, rq->nr_sectors,
348 rq->current_nr_sectors);
418 349
419 if (rq->errors >= ERROR_MAX) { 350 if (rq->errors >= ERROR_MAX) {
420 if (floppy->failed_pc) 351 if (floppy->failed_pc)
421 ide_floppy_report_error(floppy, floppy->failed_pc); 352 ide_floppy_report_error(floppy, floppy->failed_pc);
422 else 353 else
423 printk(KERN_ERR "ide-floppy: %s: I/O error\n", 354 printk(KERN_ERR PFX "%s: I/O error\n", drive->name);
424 drive->name); 355
425 idefloppy_end_request(drive, 0, 0); 356 idefloppy_end_request(drive, 0, 0);
426 return ide_stopped; 357 return ide_stopped;
427 } 358 }
428 if (blk_fs_request(rq)) { 359 if (blk_fs_request(rq)) {
429 if (((long)rq->sector % floppy->bs_factor) || 360 if (((long)rq->sector % floppy->bs_factor) ||
430 (rq->nr_sectors % floppy->bs_factor)) { 361 (rq->nr_sectors % floppy->bs_factor)) {
431 printk(KERN_ERR "%s: unsupported r/w request size\n", 362 printk(KERN_ERR PFX "%s: unsupported r/w rq size\n",
432 drive->name); 363 drive->name);
433 idefloppy_end_request(drive, 0, 0); 364 idefloppy_end_request(drive, 0, 0);
434 return ide_stopped; 365 return ide_stopped;
435 } 366 }
436 pc = &floppy->queued_pc; 367 pc = &floppy->queued_pc;
437 idefloppy_create_rw_cmd(floppy, pc, rq, block); 368 idefloppy_create_rw_cmd(drive, pc, rq, block);
438 } else if (blk_special_request(rq)) { 369 } else if (blk_special_request(rq)) {
439 pc = (struct ide_atapi_pc *) rq->buffer; 370 pc = (struct ide_atapi_pc *) rq->buffer;
440 } else if (blk_pc_request(rq)) { 371 } else if (blk_pc_request(rq)) {
441 pc = &floppy->queued_pc; 372 pc = &floppy->queued_pc;
442 idefloppy_blockpc_cmd(floppy, pc, rq); 373 idefloppy_blockpc_cmd(floppy, pc, rq);
443 } else { 374 } else {
444 blk_dump_rq_flags(rq, 375 blk_dump_rq_flags(rq, PFX "unsupported command in queue");
445 "ide-floppy: unsupported command in queue");
446 idefloppy_end_request(drive, 0, 0); 376 idefloppy_end_request(drive, 0, 0);
447 return ide_stopped; 377 return ide_stopped;
448 } 378 }
@@ -475,8 +405,7 @@ static int ide_floppy_get_flexible_disk_page(ide_drive_t *drive)
475 ide_floppy_create_mode_sense_cmd(&pc, IDEFLOPPY_FLEXIBLE_DISK_PAGE); 405 ide_floppy_create_mode_sense_cmd(&pc, IDEFLOPPY_FLEXIBLE_DISK_PAGE);
476 406
477 if (ide_queue_pc_tail(drive, disk, &pc)) { 407 if (ide_queue_pc_tail(drive, disk, &pc)) {
478 printk(KERN_ERR "ide-floppy: Can't get flexible disk page" 408 printk(KERN_ERR PFX "Can't get flexible disk page params\n");
479 " parameters\n");
480 return 1; 409 return 1;
481 } 410 }
482 411
@@ -499,7 +428,7 @@ static int ide_floppy_get_flexible_disk_page(ide_drive_t *drive)
499 capacity = cyls * heads * sectors * sector_size; 428 capacity = cyls * heads * sectors * sector_size;
500 429
501 if (memcmp(page, &floppy->flexible_disk_page, 32)) 430 if (memcmp(page, &floppy->flexible_disk_page, 32))
502 printk(KERN_INFO "%s: %dkB, %d/%d/%d CHS, %d kBps, " 431 printk(KERN_INFO PFX "%s: %dkB, %d/%d/%d CHS, %d kBps, "
503 "%d sector size, %d rpm\n", 432 "%d sector size, %d rpm\n",
504 drive->name, capacity / 1024, cyls, heads, 433 drive->name, capacity / 1024, cyls, heads,
505 sectors, transfer_rate / 8, sector_size, rpm); 434 sectors, transfer_rate / 8, sector_size, rpm);
@@ -511,7 +440,7 @@ static int ide_floppy_get_flexible_disk_page(ide_drive_t *drive)
511 lba_capacity = floppy->blocks * floppy->block_size; 440 lba_capacity = floppy->blocks * floppy->block_size;
512 441
513 if (capacity < lba_capacity) { 442 if (capacity < lba_capacity) {
514 printk(KERN_NOTICE "%s: The disk reports a capacity of %d " 443 printk(KERN_NOTICE PFX "%s: The disk reports a capacity of %d "
515 "bytes, but the drive only handles %d\n", 444 "bytes, but the drive only handles %d\n",
516 drive->name, lba_capacity, capacity); 445 drive->name, lba_capacity, capacity);
517 floppy->blocks = floppy->block_size ? 446 floppy->blocks = floppy->block_size ?
@@ -541,7 +470,7 @@ static int ide_floppy_get_capacity(ide_drive_t *drive)
541 470
542 ide_floppy_create_read_capacity_cmd(&pc); 471 ide_floppy_create_read_capacity_cmd(&pc);
543 if (ide_queue_pc_tail(drive, disk, &pc)) { 472 if (ide_queue_pc_tail(drive, disk, &pc)) {
544 printk(KERN_ERR "ide-floppy: Can't get floppy parameters\n"); 473 printk(KERN_ERR PFX "Can't get floppy parameters\n");
545 return 1; 474 return 1;
546 } 475 }
547 header_len = pc.buf[3]; 476 header_len = pc.buf[3];
@@ -554,8 +483,9 @@ static int ide_floppy_get_capacity(ide_drive_t *drive)
554 blocks = be32_to_cpup((__be32 *)&pc.buf[desc_start]); 483 blocks = be32_to_cpup((__be32 *)&pc.buf[desc_start]);
555 length = be16_to_cpup((__be16 *)&pc.buf[desc_start + 6]); 484 length = be16_to_cpup((__be16 *)&pc.buf[desc_start + 6]);
556 485
557 debug_log("Descriptor %d: %dkB, %d blocks, %d sector size\n", 486 ide_debug_log(IDE_DBG_PROBE, "Descriptor %d: %dkB, %d blocks, "
558 i, blocks * length / 1024, blocks, length); 487 "%d sector size\n",
488 i, blocks * length / 1024, blocks, length);
559 489
560 if (i) 490 if (i)
561 continue; 491 continue;
@@ -575,23 +505,24 @@ static int ide_floppy_get_capacity(ide_drive_t *drive)
575 case CAPACITY_CURRENT: 505 case CAPACITY_CURRENT:
576 /* Normal Zip/LS-120 disks */ 506 /* Normal Zip/LS-120 disks */
577 if (memcmp(cap_desc, &floppy->cap_desc, 8)) 507 if (memcmp(cap_desc, &floppy->cap_desc, 8))
578 printk(KERN_INFO "%s: %dkB, %d blocks, %d " 508 printk(KERN_INFO PFX "%s: %dkB, %d blocks, %d "
579 "sector size\n", drive->name, 509 "sector size\n",
580 blocks * length / 1024, blocks, length); 510 drive->name, blocks * length / 1024,
511 blocks, length);
581 memcpy(&floppy->cap_desc, cap_desc, 8); 512 memcpy(&floppy->cap_desc, cap_desc, 8);
582 513
583 if (!length || length % 512) { 514 if (!length || length % 512) {
584 printk(KERN_NOTICE "%s: %d bytes block size " 515 printk(KERN_NOTICE PFX "%s: %d bytes block size"
585 "not supported\n", drive->name, length); 516 " not supported\n", drive->name, length);
586 } else { 517 } else {
587 floppy->blocks = blocks; 518 floppy->blocks = blocks;
588 floppy->block_size = length; 519 floppy->block_size = length;
589 floppy->bs_factor = length / 512; 520 floppy->bs_factor = length / 512;
590 if (floppy->bs_factor != 1) 521 if (floppy->bs_factor != 1)
591 printk(KERN_NOTICE "%s: warning: non " 522 printk(KERN_NOTICE PFX "%s: Warning: "
592 "512 bytes block size not " 523 "non 512 bytes block size not "
593 "fully supported\n", 524 "fully supported\n",
594 drive->name); 525 drive->name);
595 rc = 0; 526 rc = 0;
596 } 527 }
597 break; 528 break;
@@ -600,15 +531,16 @@ static int ide_floppy_get_capacity(ide_drive_t *drive)
600 * This is a KERN_ERR so it appears on screen 531 * This is a KERN_ERR so it appears on screen
601 * for the user to see 532 * for the user to see
602 */ 533 */
603 printk(KERN_ERR "%s: No disk in drive\n", drive->name); 534 printk(KERN_ERR PFX "%s: No disk in drive\n",
535 drive->name);
604 break; 536 break;
605 case CAPACITY_INVALID: 537 case CAPACITY_INVALID:
606 printk(KERN_ERR "%s: Invalid capacity for disk " 538 printk(KERN_ERR PFX "%s: Invalid capacity for disk "
607 "in drive\n", drive->name); 539 "in drive\n", drive->name);
608 break; 540 break;
609 } 541 }
610 debug_log("Descriptor 0 Code: %d\n", 542 ide_debug_log(IDE_DBG_PROBE, "Descriptor 0 Code: %d\n",
611 pc.buf[desc_start + 4] & 0x03); 543 pc.buf[desc_start + 4] & 0x03);
612 } 544 }
613 545
614 /* Clik! disk does not support get_flexible_disk_page */ 546 /* Clik! disk does not support get_flexible_disk_page */
@@ -620,7 +552,7 @@ static int ide_floppy_get_capacity(ide_drive_t *drive)
620 return rc; 552 return rc;
621} 553}
622 554
623static sector_t idefloppy_capacity(ide_drive_t *drive) 555sector_t ide_floppy_capacity(ide_drive_t *drive)
624{ 556{
625 idefloppy_floppy_t *floppy = drive->driver_data; 557 idefloppy_floppy_t *floppy = drive->driver_data;
626 unsigned long capacity = floppy->blocks * floppy->bs_factor; 558 unsigned long capacity = floppy->blocks * floppy->bs_factor;
@@ -628,46 +560,14 @@ static sector_t idefloppy_capacity(ide_drive_t *drive)
628 return capacity; 560 return capacity;
629} 561}
630 562
631#ifdef CONFIG_IDE_PROC_FS
632ide_devset_rw_field(bios_cyl, bios_cyl);
633ide_devset_rw_field(bios_head, bios_head);
634ide_devset_rw_field(bios_sect, bios_sect);
635
636static int get_ticks(ide_drive_t *drive)
637{
638 idefloppy_floppy_t *floppy = drive->driver_data;
639 return floppy->ticks;
640}
641
642static int set_ticks(ide_drive_t *drive, int arg)
643{
644 idefloppy_floppy_t *floppy = drive->driver_data;
645 floppy->ticks = arg;
646 return 0;
647}
648
649IDE_DEVSET(ticks, DS_SYNC, get_ticks, set_ticks);
650
651static const struct ide_proc_devset idefloppy_settings[] = {
652 IDE_PROC_DEVSET(bios_cyl, 0, 1023),
653 IDE_PROC_DEVSET(bios_head, 0, 255),
654 IDE_PROC_DEVSET(bios_sect, 0, 63),
655 IDE_PROC_DEVSET(ticks, 0, 255),
656 { 0 },
657};
658#endif
659
660static void idefloppy_setup(ide_drive_t *drive, idefloppy_floppy_t *floppy) 563static void idefloppy_setup(ide_drive_t *drive, idefloppy_floppy_t *floppy)
661{ 564{
662 u16 *id = drive->id; 565 u16 *id = drive->id;
663 u8 gcw[2];
664
665 *((u16 *)&gcw) = id[ATA_ID_CONFIG];
666 566
667 drive->pc_callback = ide_floppy_callback; 567 drive->pc_callback = ide_floppy_callback;
568 drive->pc_update_buffers = idefloppy_update_buffers;
569 drive->pc_io_buffers = ide_io_buffers;
668 570
669 if (((gcw[0] & 0x60) >> 5) == 1)
670 drive->atapi_flags |= IDE_AFLAG_DRQ_INTERRUPT;
671 /* 571 /*
672 * We used to check revisions here. At this point however I'm giving up. 572 * We used to check revisions here. At this point however I'm giving up.
673 * Just assume they are all broken, its easier. 573 * Just assume they are all broken, its easier.
@@ -680,7 +580,7 @@ static void idefloppy_setup(ide_drive_t *drive, idefloppy_floppy_t *floppy)
680 if (!strncmp((char *)&id[ATA_ID_PROD], "IOMEGA ZIP 100 ATAPI", 20)) { 580 if (!strncmp((char *)&id[ATA_ID_PROD], "IOMEGA ZIP 100 ATAPI", 20)) {
681 drive->atapi_flags |= IDE_AFLAG_ZIP_DRIVE; 581 drive->atapi_flags |= IDE_AFLAG_ZIP_DRIVE;
682 /* This value will be visible in the /proc/ide/hdx/settings */ 582 /* This value will be visible in the /proc/ide/hdx/settings */
683 floppy->ticks = IDEFLOPPY_TICKS_DELAY; 583 drive->pc_delay = IDEFLOPPY_PC_DELAY;
684 blk_queue_max_sectors(drive->queue, 64); 584 blk_queue_max_sectors(drive->queue, 64);
685 } 585 }
686 586
@@ -714,7 +614,7 @@ static void ide_floppy_remove(ide_drive_t *drive)
714 614
715static void idefloppy_cleanup_obj(struct kref *kref) 615static void idefloppy_cleanup_obj(struct kref *kref)
716{ 616{
717 struct ide_floppy_obj *floppy = to_ide_floppy(kref); 617 struct ide_floppy_obj *floppy = to_ide_drv(kref, ide_floppy_obj);
718 ide_drive_t *drive = floppy->drive; 618 ide_drive_t *drive = floppy->drive;
719 struct gendisk *g = floppy->disk; 619 struct gendisk *g = floppy->disk;
720 620
@@ -724,24 +624,6 @@ static void idefloppy_cleanup_obj(struct kref *kref)
724 kfree(floppy); 624 kfree(floppy);
725} 625}
726 626
727#ifdef CONFIG_IDE_PROC_FS
728static int proc_idefloppy_read_capacity(char *page, char **start, off_t off,
729 int count, int *eof, void *data)
730{
731 ide_drive_t*drive = (ide_drive_t *)data;
732 int len;
733
734 len = sprintf(page, "%llu\n", (long long)idefloppy_capacity(drive));
735 PROC_IDE_READ_RETURN(page, start, off, count, eof, len);
736}
737
738static ide_proc_entry_t idefloppy_proc[] = {
739 { "capacity", S_IFREG|S_IRUGO, proc_idefloppy_read_capacity, NULL },
740 { "geometry", S_IFREG|S_IRUGO, proc_ide_read_geometry, NULL },
741 { NULL, 0, NULL, NULL }
742};
743#endif /* CONFIG_IDE_PROC_FS */
744
745static int ide_floppy_probe(ide_drive_t *); 627static int ide_floppy_probe(ide_drive_t *);
746 628
747static ide_driver_t idefloppy_driver = { 629static ide_driver_t idefloppy_driver = {
@@ -753,13 +635,12 @@ static ide_driver_t idefloppy_driver = {
753 .probe = ide_floppy_probe, 635 .probe = ide_floppy_probe,
754 .remove = ide_floppy_remove, 636 .remove = ide_floppy_remove,
755 .version = IDEFLOPPY_VERSION, 637 .version = IDEFLOPPY_VERSION,
756 .media = ide_floppy,
757 .do_request = idefloppy_do_request, 638 .do_request = idefloppy_do_request,
758 .end_request = idefloppy_end_request, 639 .end_request = idefloppy_end_request,
759 .error = __ide_error, 640 .error = __ide_error,
760#ifdef CONFIG_IDE_PROC_FS 641#ifdef CONFIG_IDE_PROC_FS
761 .proc = idefloppy_proc, 642 .proc = ide_floppy_proc,
762 .settings = idefloppy_settings, 643 .settings = ide_floppy_settings,
763#endif 644#endif
764}; 645};
765 646
@@ -770,14 +651,14 @@ static int idefloppy_open(struct inode *inode, struct file *filp)
770 ide_drive_t *drive; 651 ide_drive_t *drive;
771 int ret = 0; 652 int ret = 0;
772 653
773 debug_log("Reached %s\n", __func__);
774
775 floppy = ide_floppy_get(disk); 654 floppy = ide_floppy_get(disk);
776 if (!floppy) 655 if (!floppy)
777 return -ENXIO; 656 return -ENXIO;
778 657
779 drive = floppy->drive; 658 drive = floppy->drive;
780 659
660 ide_debug_log(IDE_DBG_FUNC, "Call %s\n", __func__);
661
781 floppy->openers++; 662 floppy->openers++;
782 663
783 if (floppy->openers == 1) { 664 if (floppy->openers == 1) {
@@ -822,10 +703,10 @@ out_put_floppy:
822static int idefloppy_release(struct inode *inode, struct file *filp) 703static int idefloppy_release(struct inode *inode, struct file *filp)
823{ 704{
824 struct gendisk *disk = inode->i_bdev->bd_disk; 705 struct gendisk *disk = inode->i_bdev->bd_disk;
825 struct ide_floppy_obj *floppy = ide_floppy_g(disk); 706 struct ide_floppy_obj *floppy = ide_drv_g(disk, ide_floppy_obj);
826 ide_drive_t *drive = floppy->drive; 707 ide_drive_t *drive = floppy->drive;
827 708
828 debug_log("Reached %s\n", __func__); 709 ide_debug_log(IDE_DBG_FUNC, "Call %s\n", __func__);
829 710
830 if (floppy->openers == 1) { 711 if (floppy->openers == 1) {
831 ide_set_media_lock(drive, disk, 0); 712 ide_set_media_lock(drive, disk, 0);
@@ -841,7 +722,8 @@ static int idefloppy_release(struct inode *inode, struct file *filp)
841 722
842static int idefloppy_getgeo(struct block_device *bdev, struct hd_geometry *geo) 723static int idefloppy_getgeo(struct block_device *bdev, struct hd_geometry *geo)
843{ 724{
844 struct ide_floppy_obj *floppy = ide_floppy_g(bdev->bd_disk); 725 struct ide_floppy_obj *floppy = ide_drv_g(bdev->bd_disk,
726 ide_floppy_obj);
845 ide_drive_t *drive = floppy->drive; 727 ide_drive_t *drive = floppy->drive;
846 728
847 geo->heads = drive->bios_head; 729 geo->heads = drive->bios_head;
@@ -850,64 +732,15 @@ static int idefloppy_getgeo(struct block_device *bdev, struct hd_geometry *geo)
850 return 0; 732 return 0;
851} 733}
852 734
853static int ide_floppy_lockdoor(ide_drive_t *drive, struct ide_atapi_pc *pc,
854 unsigned long arg, unsigned int cmd)
855{
856 idefloppy_floppy_t *floppy = drive->driver_data;
857 struct gendisk *disk = floppy->disk;
858 int prevent = (arg && cmd != CDROMEJECT) ? 1 : 0;
859
860 if (floppy->openers > 1)
861 return -EBUSY;
862
863 ide_set_media_lock(drive, disk, prevent);
864
865 if (cmd == CDROMEJECT)
866 ide_do_start_stop(drive, disk, 2);
867
868 return 0;
869}
870
871static int idefloppy_ioctl(struct inode *inode, struct file *file,
872 unsigned int cmd, unsigned long arg)
873{
874 struct block_device *bdev = inode->i_bdev;
875 struct ide_floppy_obj *floppy = ide_floppy_g(bdev->bd_disk);
876 ide_drive_t *drive = floppy->drive;
877 struct ide_atapi_pc pc;
878 void __user *argp = (void __user *)arg;
879 int err;
880
881 if (cmd == CDROMEJECT || cmd == CDROM_LOCKDOOR)
882 return ide_floppy_lockdoor(drive, &pc, arg, cmd);
883
884 err = ide_floppy_format_ioctl(drive, file, cmd, argp);
885 if (err != -ENOTTY)
886 return err;
887
888 /*
889 * skip SCSI_IOCTL_SEND_COMMAND (deprecated)
890 * and CDROM_SEND_PACKET (legacy) ioctls
891 */
892 if (cmd != CDROM_SEND_PACKET && cmd != SCSI_IOCTL_SEND_COMMAND)
893 err = scsi_cmd_ioctl(file, bdev->bd_disk->queue,
894 bdev->bd_disk, cmd, argp);
895
896 if (err == -ENOTTY)
897 err = generic_ide_ioctl(drive, file, bdev, cmd, arg);
898
899 return err;
900}
901
902static int idefloppy_media_changed(struct gendisk *disk) 735static int idefloppy_media_changed(struct gendisk *disk)
903{ 736{
904 struct ide_floppy_obj *floppy = ide_floppy_g(disk); 737 struct ide_floppy_obj *floppy = ide_drv_g(disk, ide_floppy_obj);
905 ide_drive_t *drive = floppy->drive; 738 ide_drive_t *drive = floppy->drive;
906 int ret; 739 int ret;
907 740
908 /* do not scan partitions twice if this is a removable device */ 741 /* do not scan partitions twice if this is a removable device */
909 if (drive->attach) { 742 if (drive->dev_flags & IDE_DFLAG_ATTACH) {
910 drive->attach = 0; 743 drive->dev_flags &= ~IDE_DFLAG_ATTACH;
911 return 0; 744 return 0;
912 } 745 }
913 ret = !!(drive->atapi_flags & IDE_AFLAG_MEDIA_CHANGED); 746 ret = !!(drive->atapi_flags & IDE_AFLAG_MEDIA_CHANGED);
@@ -917,8 +750,8 @@ static int idefloppy_media_changed(struct gendisk *disk)
917 750
918static int idefloppy_revalidate_disk(struct gendisk *disk) 751static int idefloppy_revalidate_disk(struct gendisk *disk)
919{ 752{
920 struct ide_floppy_obj *floppy = ide_floppy_g(disk); 753 struct ide_floppy_obj *floppy = ide_drv_g(disk, ide_floppy_obj);
921 set_capacity(disk, idefloppy_capacity(floppy->drive)); 754 set_capacity(disk, ide_floppy_capacity(floppy->drive));
922 return 0; 755 return 0;
923} 756}
924 757
@@ -926,7 +759,7 @@ static struct block_device_operations idefloppy_ops = {
926 .owner = THIS_MODULE, 759 .owner = THIS_MODULE,
927 .open = idefloppy_open, 760 .open = idefloppy_open,
928 .release = idefloppy_release, 761 .release = idefloppy_release,
929 .ioctl = idefloppy_ioctl, 762 .ioctl = ide_floppy_ioctl,
930 .getgeo = idefloppy_getgeo, 763 .getgeo = idefloppy_getgeo,
931 .media_changed = idefloppy_media_changed, 764 .media_changed = idefloppy_media_changed,
932 .revalidate_disk = idefloppy_revalidate_disk 765 .revalidate_disk = idefloppy_revalidate_disk
@@ -944,14 +777,14 @@ static int ide_floppy_probe(ide_drive_t *drive)
944 goto failed; 777 goto failed;
945 778
946 if (!ide_check_atapi_device(drive, DRV_NAME)) { 779 if (!ide_check_atapi_device(drive, DRV_NAME)) {
947 printk(KERN_ERR "ide-floppy: %s: not supported by this version" 780 printk(KERN_ERR PFX "%s: not supported by this version of "
948 " of ide-floppy\n", drive->name); 781 DRV_NAME "\n", drive->name);
949 goto failed; 782 goto failed;
950 } 783 }
951 floppy = kzalloc(sizeof(idefloppy_floppy_t), GFP_KERNEL); 784 floppy = kzalloc(sizeof(idefloppy_floppy_t), GFP_KERNEL);
952 if (!floppy) { 785 if (!floppy) {
953 printk(KERN_ERR "ide-floppy: %s: Can't allocate a floppy" 786 printk(KERN_ERR PFX "%s: Can't allocate a floppy structure\n",
954 " structure\n", drive->name); 787 drive->name);
955 goto failed; 788 goto failed;
956 } 789 }
957 790
@@ -971,13 +804,16 @@ static int ide_floppy_probe(ide_drive_t *drive)
971 804
972 drive->driver_data = floppy; 805 drive->driver_data = floppy;
973 806
807 drive->debug_mask = debug_mask;
808
974 idefloppy_setup(drive, floppy); 809 idefloppy_setup(drive, floppy);
810 drive->dev_flags |= IDE_DFLAG_ATTACH;
975 811
976 g->minors = 1 << PARTN_BITS; 812 g->minors = 1 << PARTN_BITS;
977 g->driverfs_dev = &drive->gendev; 813 g->driverfs_dev = &drive->gendev;
978 g->flags = drive->removable ? GENHD_FL_REMOVABLE : 0; 814 if (drive->dev_flags & IDE_DFLAG_REMOVABLE)
815 g->flags = GENHD_FL_REMOVABLE;
979 g->fops = &idefloppy_ops; 816 g->fops = &idefloppy_ops;
980 drive->attach = 1;
981 add_disk(g); 817 add_disk(g);
982 return 0; 818 return 0;
983 819
@@ -994,7 +830,7 @@ static void __exit idefloppy_exit(void)
994 830
995static int __init idefloppy_init(void) 831static int __init idefloppy_init(void)
996{ 832{
997 printk("ide-floppy driver " IDEFLOPPY_VERSION "\n"); 833 printk(KERN_INFO DRV_NAME " driver " IDEFLOPPY_VERSION "\n");
998 return driver_register(&idefloppy_driver.gen_driver); 834 return driver_register(&idefloppy_driver.gen_driver);
999} 835}
1000 836