1 // SPDX-License-Identifier: GPL-2.0-only
2 #include <linux/module.h>
3 #include <linux/types.h>
4 #include <linux/string.h>
5 #include <linux/kernel.h>
6 #include <linux/errno.h>
7 #include <linux/genhd.h>
8 #include <linux/mutex.h>
10 #include <linux/hdreg.h>
11 #include <linux/dmi.h>
12 #include <linux/slab.h>
14 #if !defined(CONFIG_DEBUG_BLOCK_EXT_DEVT)
15 #define IDE_DISK_MINORS (1 << PARTN_BITS)
17 #define IDE_DISK_MINORS 0
21 #include "ide-floppy.h"
23 #define IDE_GD_VERSION "1.18"
25 /* module parameters */
26 static DEFINE_MUTEX(ide_gd_mutex
);
27 static unsigned long debug_mask
;
28 module_param(debug_mask
, ulong
, 0644);
30 static DEFINE_MUTEX(ide_disk_ref_mutex
);
32 static void ide_disk_release(struct device
*);
34 static struct ide_disk_obj
*ide_disk_get(struct gendisk
*disk
)
36 struct ide_disk_obj
*idkp
= NULL
;
38 mutex_lock(&ide_disk_ref_mutex
);
39 idkp
= ide_drv_g(disk
, ide_disk_obj
);
41 if (ide_device_get(idkp
->drive
))
44 get_device(&idkp
->dev
);
46 mutex_unlock(&ide_disk_ref_mutex
);
50 static void ide_disk_put(struct ide_disk_obj
*idkp
)
52 ide_drive_t
*drive
= idkp
->drive
;
54 mutex_lock(&ide_disk_ref_mutex
);
55 put_device(&idkp
->dev
);
56 ide_device_put(drive
);
57 mutex_unlock(&ide_disk_ref_mutex
);
60 sector_t
ide_gd_capacity(ide_drive_t
*drive
)
62 return drive
->capacity64
;
65 static int ide_gd_probe(ide_drive_t
*);
67 static void ide_gd_remove(ide_drive_t
*drive
)
69 struct ide_disk_obj
*idkp
= drive
->driver_data
;
70 struct gendisk
*g
= idkp
->disk
;
72 ide_proc_unregister_driver(drive
, idkp
->driver
);
73 device_del(&idkp
->dev
);
75 drive
->disk_ops
->flush(drive
);
77 mutex_lock(&ide_disk_ref_mutex
);
78 put_device(&idkp
->dev
);
79 mutex_unlock(&ide_disk_ref_mutex
);
82 static void ide_disk_release(struct device
*dev
)
84 struct ide_disk_obj
*idkp
= to_ide_drv(dev
, ide_disk_obj
);
85 ide_drive_t
*drive
= idkp
->drive
;
86 struct gendisk
*g
= idkp
->disk
;
88 drive
->disk_ops
= NULL
;
89 drive
->driver_data
= NULL
;
90 g
->private_data
= NULL
;
96 * On HPA drives the capacity needs to be
97 * reinitialized on resume otherwise the disk
98 * can not be used and a hard reset is required
100 static void ide_gd_resume(ide_drive_t
*drive
)
102 if (ata_id_hpa_enabled(drive
->id
))
103 (void)drive
->disk_ops
->get_capacity(drive
);
106 static const struct dmi_system_id ide_coldreboot_table
[] = {
108 /* Acer TravelMate 66x cuts power during reboot */
109 .ident
= "Acer TravelMate 660",
111 DMI_MATCH(DMI_SYS_VENDOR
, "Acer"),
112 DMI_MATCH(DMI_PRODUCT_NAME
, "TravelMate 660"),
116 { } /* terminate list */
119 static void ide_gd_shutdown(ide_drive_t
*drive
)
122 /* On Alpha, halt(8) doesn't actually turn the machine off,
123 it puts you into the sort of firmware monitor. Typically,
124 it's used to boot another kernel image, so it's not much
125 different from reboot(8). Therefore, we don't need to
126 spin down the disk in this case, especially since Alpha
127 firmware doesn't handle disks in standby mode properly.
128 On the other hand, it's reasonably safe to turn the power
129 off when the shutdown process reaches the firmware prompt,
130 as the firmware initialization takes rather long time -
131 at least 10 seconds, which should be sufficient for
132 the disk to expire its write cache. */
133 if (system_state
!= SYSTEM_POWER_OFF
) {
135 if (system_state
== SYSTEM_RESTART
&&
136 !dmi_check_system(ide_coldreboot_table
)) {
138 drive
->disk_ops
->flush(drive
);
142 printk(KERN_INFO
"Shutdown: %s\n", drive
->name
);
144 drive
->gendev
.bus
->suspend(&drive
->gendev
, PMSG_SUSPEND
);
147 #ifdef CONFIG_IDE_PROC_FS
148 static ide_proc_entry_t
*ide_disk_proc_entries(ide_drive_t
*drive
)
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
)
155 return (drive
->media
== ide_disk
) ? ide_disk_settings
156 : ide_floppy_settings
;
160 static ide_startstop_t
ide_gd_do_request(ide_drive_t
*drive
,
161 struct request
*rq
, sector_t sector
)
163 return drive
->disk_ops
->do_request(drive
, rq
, sector
);
166 static struct ide_driver ide_gd_driver
= {
168 .owner
= THIS_MODULE
,
170 .bus
= &ide_bus_type
,
172 .probe
= ide_gd_probe
,
173 .remove
= ide_gd_remove
,
174 .resume
= ide_gd_resume
,
175 .shutdown
= ide_gd_shutdown
,
176 .version
= IDE_GD_VERSION
,
177 .do_request
= ide_gd_do_request
,
178 #ifdef CONFIG_IDE_PROC_FS
179 .proc_entries
= ide_disk_proc_entries
,
180 .proc_devsets
= ide_disk_proc_devsets
,
184 static int ide_gd_open(struct block_device
*bdev
, fmode_t mode
)
186 struct gendisk
*disk
= bdev
->bd_disk
;
187 struct ide_disk_obj
*idkp
;
191 idkp
= ide_disk_get(disk
);
197 ide_debug_log(IDE_DBG_FUNC
, "enter");
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
209 * unreadable disk, so that we can get the format capacity
210 * of the drive or begin the format - Sam
212 if (ret
&& (mode
& FMODE_NDELAY
) == 0) {
217 if ((drive
->dev_flags
& IDE_DFLAG_WP
) && (mode
& FMODE_WRITE
)) {
223 * Ignore the return code from door_lock,
224 * since the open() has already succeeded,
225 * and the door_lock is irrelevant at this point.
227 drive
->disk_ops
->set_doorlock(drive
, disk
, 1);
228 if (__invalidate_device(bdev
, true))
229 pr_warn("VFS: busy inodes on changed media %s\n",
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
) {
246 static int ide_gd_unlocked_open(struct block_device
*bdev
, fmode_t mode
)
250 mutex_lock(&ide_gd_mutex
);
251 ret
= ide_gd_open(bdev
, mode
);
252 mutex_unlock(&ide_gd_mutex
);
258 static void ide_gd_release(struct gendisk
*disk
, fmode_t mode
)
260 struct ide_disk_obj
*idkp
= ide_drv_g(disk
, ide_disk_obj
);
261 ide_drive_t
*drive
= idkp
->drive
;
263 ide_debug_log(IDE_DBG_FUNC
, "enter");
265 mutex_lock(&ide_gd_mutex
);
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
;
277 mutex_unlock(&ide_gd_mutex
);
280 static int ide_gd_getgeo(struct block_device
*bdev
, struct hd_geometry
*geo
)
282 struct ide_disk_obj
*idkp
= ide_drv_g(bdev
->bd_disk
, ide_disk_obj
);
283 ide_drive_t
*drive
= idkp
->drive
;
285 geo
->heads
= drive
->bios_head
;
286 geo
->sectors
= drive
->bios_sect
;
287 geo
->cylinders
= (u16
)drive
->bios_cyl
; /* truncate */
291 static void ide_gd_unlock_native_capacity(struct gendisk
*disk
)
293 struct ide_disk_obj
*idkp
= ide_drv_g(disk
, ide_disk_obj
);
294 ide_drive_t
*drive
= idkp
->drive
;
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
,
302 unsigned int cmd
, unsigned long arg
)
304 struct ide_disk_obj
*idkp
= ide_drv_g(bdev
->bd_disk
, ide_disk_obj
);
305 ide_drive_t
*drive
= idkp
->drive
;
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
,
312 unsigned int cmd
, unsigned long arg
)
314 struct ide_disk_obj
*idkp
= ide_drv_g(bdev
->bd_disk
, ide_disk_obj
);
315 ide_drive_t
*drive
= idkp
->drive
;
317 if (!drive
->disk_ops
->compat_ioctl
)
320 return drive
->disk_ops
->compat_ioctl(drive
, bdev
, mode
, cmd
, arg
);
324 static const struct block_device_operations ide_gd_ops
= {
325 .owner
= THIS_MODULE
,
326 .open
= ide_gd_unlocked_open
,
327 .release
= ide_gd_release
,
328 .ioctl
= ide_gd_ioctl
,
330 .compat_ioctl
= ide_gd_compat_ioctl
,
332 .getgeo
= ide_gd_getgeo
,
333 .unlock_native_capacity
= ide_gd_unlock_native_capacity
,
336 static int ide_gd_probe(ide_drive_t
*drive
)
338 const struct ide_disk_ops
*disk_ops
= NULL
;
339 struct ide_disk_obj
*idkp
;
342 /* strstr("foo", "") is non-NULL */
343 if (!strstr("ide-gd", drive
->driver_req
))
346 #ifdef CONFIG_IDE_GD_ATA
347 if (drive
->media
== ide_disk
)
348 disk_ops
= &ide_ata_disk_ops
;
350 #ifdef CONFIG_IDE_GD_ATAPI
351 if (drive
->media
== ide_floppy
)
352 disk_ops
= &ide_atapi_disk_ops
;
354 if (disk_ops
== NULL
)
357 if (disk_ops
->check(drive
, DRV_NAME
) == 0) {
358 printk(KERN_ERR PFX
"%s: not supported by this driver\n",
363 idkp
= kzalloc(sizeof(*idkp
), GFP_KERNEL
);
365 printk(KERN_ERR PFX
"%s: can't allocate a disk structure\n",
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
))
384 idkp
->driver
= &ide_gd_driver
;
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
);
414 static int __init
ide_gd_init(void)
416 printk(KERN_INFO DRV_NAME
" driver " IDE_GD_VERSION
"\n");
417 return driver_register(&ide_gd_driver
.gen_driver
);
420 static void __exit
ide_gd_exit(void)
422 driver_unregister(&ide_gd_driver
.gen_driver
);
425 MODULE_ALIAS("ide:*m-disk*");
426 MODULE_ALIAS("ide-disk");
427 MODULE_ALIAS("ide:*m-floppy*");
428 MODULE_ALIAS("ide-floppy");
429 module_init(ide_gd_init
);
430 module_exit(ide_gd_exit
);
431 MODULE_LICENSE("GPL");
432 MODULE_DESCRIPTION("generic ATA/ATAPI disk driver");