diff options
Diffstat (limited to 'drivers/ide/ide-floppy.c')
-rw-r--r-- | drivers/ide/ide-floppy.c | 392 |
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 | 53 | static unsigned long debug_mask; |
54 | module_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 | ||
81 | static DEFINE_MUTEX(idefloppy_ref_mutex); | 86 | static 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 | |||
88 | static void idefloppy_cleanup_obj(struct kref *); | 88 | static void idefloppy_cleanup_obj(struct kref *); |
89 | 89 | ||
90 | static struct ide_floppy_obj *ide_floppy_get(struct gendisk *disk) | 90 | static 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 | ||
159 | static void ide_floppy_callback(ide_drive_t *drive) | 167 | static 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 | ||
196 | void 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 | */ | ||
208 | static 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. */ | ||
220 | static 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 | */ | ||
235 | static 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 | */ | ||
251 | static 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 | |||
277 | static void ide_floppy_report_error(idefloppy_floppy_t *floppy, | 206 | static 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 | ||
323 | void ide_floppy_create_read_capacity_cmd(struct ide_atapi_pc *pc) | 252 | void 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 | ||
357 | static void idefloppy_create_rw_cmd(idefloppy_floppy_t *floppy, | 285 | static 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 | ||
623 | static sector_t idefloppy_capacity(ide_drive_t *drive) | 555 | sector_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 | ||
632 | ide_devset_rw_field(bios_cyl, bios_cyl); | ||
633 | ide_devset_rw_field(bios_head, bios_head); | ||
634 | ide_devset_rw_field(bios_sect, bios_sect); | ||
635 | |||
636 | static int get_ticks(ide_drive_t *drive) | ||
637 | { | ||
638 | idefloppy_floppy_t *floppy = drive->driver_data; | ||
639 | return floppy->ticks; | ||
640 | } | ||
641 | |||
642 | static 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 | |||
649 | IDE_DEVSET(ticks, DS_SYNC, get_ticks, set_ticks); | ||
650 | |||
651 | static 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 | |||
660 | static void idefloppy_setup(ide_drive_t *drive, idefloppy_floppy_t *floppy) | 563 | static 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 | ||
715 | static void idefloppy_cleanup_obj(struct kref *kref) | 615 | static 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 | ||
728 | static 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 | |||
738 | static 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 | |||
745 | static int ide_floppy_probe(ide_drive_t *); | 627 | static int ide_floppy_probe(ide_drive_t *); |
746 | 628 | ||
747 | static ide_driver_t idefloppy_driver = { | 629 | static 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: | |||
822 | static int idefloppy_release(struct inode *inode, struct file *filp) | 703 | static 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 | ||
842 | static int idefloppy_getgeo(struct block_device *bdev, struct hd_geometry *geo) | 723 | static 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 | ||
853 | static 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 | |||
871 | static 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 | |||
902 | static int idefloppy_media_changed(struct gendisk *disk) | 735 | static 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 | ||
918 | static int idefloppy_revalidate_disk(struct gendisk *disk) | 751 | static 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 | ||
995 | static int __init idefloppy_init(void) | 831 | static 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 | ||