18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci#include <linux/kernel.h> 38c2ecf20Sopenharmony_ci#include <linux/ide.h> 48c2ecf20Sopenharmony_ci#include <linux/hdreg.h> 58c2ecf20Sopenharmony_ci#include <linux/mutex.h> 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#include "ide-disk.h" 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_cistatic DEFINE_MUTEX(ide_disk_ioctl_mutex); 108c2ecf20Sopenharmony_cistatic const struct ide_ioctl_devset ide_disk_ioctl_settings[] = { 118c2ecf20Sopenharmony_ci{ HDIO_GET_ADDRESS, HDIO_SET_ADDRESS, &ide_devset_address }, 128c2ecf20Sopenharmony_ci{ HDIO_GET_MULTCOUNT, HDIO_SET_MULTCOUNT, &ide_devset_multcount }, 138c2ecf20Sopenharmony_ci{ HDIO_GET_NOWERR, HDIO_SET_NOWERR, &ide_devset_nowerr }, 148c2ecf20Sopenharmony_ci{ HDIO_GET_WCACHE, HDIO_SET_WCACHE, &ide_devset_wcache }, 158c2ecf20Sopenharmony_ci{ HDIO_GET_ACOUSTIC, HDIO_SET_ACOUSTIC, &ide_devset_acoustic }, 168c2ecf20Sopenharmony_ci{ 0 } 178c2ecf20Sopenharmony_ci}; 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ciint ide_disk_ioctl(ide_drive_t *drive, struct block_device *bdev, fmode_t mode, 208c2ecf20Sopenharmony_ci unsigned int cmd, unsigned long arg) 218c2ecf20Sopenharmony_ci{ 228c2ecf20Sopenharmony_ci int err; 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci mutex_lock(&ide_disk_ioctl_mutex); 258c2ecf20Sopenharmony_ci err = ide_setting_ioctl(drive, bdev, cmd, arg, ide_disk_ioctl_settings); 268c2ecf20Sopenharmony_ci if (err != -EOPNOTSUPP) 278c2ecf20Sopenharmony_ci goto out; 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci err = generic_ide_ioctl(drive, bdev, cmd, arg); 308c2ecf20Sopenharmony_ciout: 318c2ecf20Sopenharmony_ci mutex_unlock(&ide_disk_ioctl_mutex); 328c2ecf20Sopenharmony_ci return err; 338c2ecf20Sopenharmony_ci} 34