Lines Matching +full:drive +full:- +full:mode
1 // SPDX-License-Identifier: GPL-2.0-only
20 #include "ide-disk.h"
21 #include "ide-floppy.h"
41 if (ide_device_get(idkp->drive)) in ide_disk_get()
44 get_device(&idkp->dev); in ide_disk_get()
52 ide_drive_t *drive = idkp->drive; in ide_disk_put() local
55 put_device(&idkp->dev); in ide_disk_put()
56 ide_device_put(drive); in ide_disk_put()
60 sector_t ide_gd_capacity(ide_drive_t *drive) in ide_gd_capacity() argument
62 return drive->capacity64; in ide_gd_capacity()
67 static void ide_gd_remove(ide_drive_t *drive) in ide_gd_remove() argument
69 struct ide_disk_obj *idkp = drive->driver_data; in ide_gd_remove()
70 struct gendisk *g = idkp->disk; in ide_gd_remove()
72 ide_proc_unregister_driver(drive, idkp->driver); in ide_gd_remove()
73 device_del(&idkp->dev); in ide_gd_remove()
75 drive->disk_ops->flush(drive); in ide_gd_remove()
78 put_device(&idkp->dev); in ide_gd_remove()
85 ide_drive_t *drive = idkp->drive; in ide_disk_release() local
86 struct gendisk *g = idkp->disk; in ide_disk_release()
88 drive->disk_ops = NULL; in ide_disk_release()
89 drive->driver_data = NULL; in ide_disk_release()
90 g->private_data = NULL; in ide_disk_release()
100 static void ide_gd_resume(ide_drive_t *drive) in ide_gd_resume() argument
102 if (ata_id_hpa_enabled(drive->id)) in ide_gd_resume()
103 (void)drive->disk_ops->get_capacity(drive); in ide_gd_resume()
119 static void ide_gd_shutdown(ide_drive_t *drive) argument
127 firmware doesn't handle disks in standby mode properly.
130 as the firmware initialization takes rather long time -
138 drive->disk_ops->flush(drive);
142 printk(KERN_INFO "Shutdown: %s\n", drive->name);
144 drive->gendev.bus->suspend(&drive->gendev, PMSG_SUSPEND);
148 static ide_proc_entry_t *ide_disk_proc_entries(ide_drive_t *drive) argument
150 return (drive->media == ide_disk) ? ide_disk_proc : ide_floppy_proc;
153 static const struct ide_proc_devset *ide_disk_proc_devsets(ide_drive_t *drive) argument
155 return (drive->media == ide_disk) ? ide_disk_settings
160 static ide_startstop_t ide_gd_do_request(ide_drive_t *drive, argument
163 return drive->disk_ops->do_request(drive, rq, sector);
169 .name = "ide-gd",
184 static int ide_gd_open(struct block_device *bdev, fmode_t mode) argument
186 struct gendisk *disk = bdev->bd_disk;
188 ide_drive_t *drive; local
193 return -ENXIO;
195 drive = idkp->drive;
199 idkp->openers++;
201 if ((drive->dev_flags & IDE_DFLAG_REMOVABLE) && idkp->openers == 1) {
202 drive->dev_flags &= ~IDE_DFLAG_FORMAT_IN_PROGRESS;
205 ret = drive->disk_ops->init_media(drive, disk);
208 * Allow O_NDELAY to open a drive without a disk, or with an
210 * of the drive or begin the format - Sam
212 if (ret && (mode & FMODE_NDELAY) == 0) {
213 ret = -EIO;
217 if ((drive->dev_flags & IDE_DFLAG_WP) && (mode & FMODE_WRITE)) {
218 ret = -EROFS;
227 drive->disk_ops->set_doorlock(drive, disk, 1);
230 bdev->bd_disk->disk_name);
231 drive->disk_ops->get_capacity(drive);
232 set_capacity(disk, ide_gd_capacity(drive));
233 set_bit(GD_NEED_PART_SCAN, &disk->state);
234 } else if (drive->dev_flags & IDE_DFLAG_FORMAT_IN_PROGRESS) {
235 ret = -EBUSY;
241 idkp->openers--;
246 static int ide_gd_unlocked_open(struct block_device *bdev, fmode_t mode) argument
251 ret = ide_gd_open(bdev, mode);
258 static void ide_gd_release(struct gendisk *disk, fmode_t mode) argument
261 ide_drive_t *drive = idkp->drive; local
266 if (idkp->openers == 1)
267 drive->disk_ops->flush(drive);
269 if ((drive->dev_flags & IDE_DFLAG_REMOVABLE) && idkp->openers == 1) {
270 drive->disk_ops->set_doorlock(drive, disk, 0);
271 drive->dev_flags &= ~IDE_DFLAG_FORMAT_IN_PROGRESS;
274 idkp->openers--;
282 struct ide_disk_obj *idkp = ide_drv_g(bdev->bd_disk, ide_disk_obj);
283 ide_drive_t *drive = idkp->drive; local
285 geo->heads = drive->bios_head;
286 geo->sectors = drive->bios_sect;
287 geo->cylinders = (u16)drive->bios_cyl; /* truncate */
294 ide_drive_t *drive = idkp->drive; local
295 const struct ide_disk_ops *disk_ops = drive->disk_ops;
297 if (disk_ops->unlock_native_capacity)
298 disk_ops->unlock_native_capacity(drive);
301 static int ide_gd_ioctl(struct block_device *bdev, fmode_t mode, argument
304 struct ide_disk_obj *idkp = ide_drv_g(bdev->bd_disk, ide_disk_obj);
305 ide_drive_t *drive = idkp->drive; local
307 return drive->disk_ops->ioctl(drive, bdev, mode, cmd, arg);
311 static int ide_gd_compat_ioctl(struct block_device *bdev, fmode_t mode, argument
314 struct ide_disk_obj *idkp = ide_drv_g(bdev->bd_disk, ide_disk_obj);
315 ide_drive_t *drive = idkp->drive; local
317 if (!drive->disk_ops->compat_ioctl)
318 return -ENOIOCTLCMD;
320 return drive->disk_ops->compat_ioctl(drive, bdev, mode, cmd, arg);
336 static int ide_gd_probe(ide_drive_t *drive) argument
342 /* strstr("foo", "") is non-NULL */
343 if (!strstr("ide-gd", drive->driver_req))
347 if (drive->media == ide_disk)
351 if (drive->media == ide_floppy)
357 if (disk_ops->check(drive, DRV_NAME) == 0) {
359 drive->name);
366 drive->name);
370 g = alloc_disk_node(IDE_DISK_MINORS, hwif_to_node(drive->hwif));
374 ide_init_disk(g, drive);
376 idkp->dev.parent = &drive->gendev;
377 idkp->dev.release = ide_disk_release;
378 dev_set_name(&idkp->dev, "%s", dev_name(&drive->gendev));
380 if (device_register(&idkp->dev))
383 idkp->drive = drive;
384 idkp->driver = &ide_gd_driver;
385 idkp->disk = g;
387 g->private_data = &idkp->driver;
389 drive->driver_data = idkp;
390 drive->debug_mask = debug_mask;
391 drive->disk_ops = disk_ops;
393 disk_ops->setup(drive);
395 set_capacity(g, ide_gd_capacity(drive));
397 g->minors = IDE_DISK_MINORS;
398 g->flags |= GENHD_FL_EXT_DEVT;
399 if (drive->dev_flags & IDE_DFLAG_REMOVABLE)
400 g->flags = GENHD_FL_REMOVABLE;
401 g->fops = &ide_gd_ops;
402 g->events = DISK_EVENT_MEDIA_CHANGE;
403 device_add_disk(&drive->gendev, g, NULL);
411 return -ENODEV;
425 MODULE_ALIAS("ide:*m-disk*");
426 MODULE_ALIAS("ide-disk");
427 MODULE_ALIAS("ide:*m-floppy*");
428 MODULE_ALIAS("ide-floppy");