return LABEL_SIZE;
}
-/*
- * Generate device unique id that specifies the physical device.
- */
-static int
-dasd_eckd_generate_uid(struct dasd_device *device, struct dasd_uid *uid)
-{
- struct dasd_eckd_private *private;
- struct dasd_eckd_confdata *confdata;
-
- private = (struct dasd_eckd_private *) device->private;
- if (!private)
- return -ENODEV;
- confdata = &private->conf_data;
- if (!confdata)
- return -ENODEV;
-
- memset(uid, 0, sizeof(struct dasd_uid));
- strncpy(uid->vendor, confdata->ned1.HDA_manufacturer,
- sizeof(uid->vendor) - 1);
- EBCASC(uid->vendor, sizeof(uid->vendor) - 1);
- strncpy(uid->serial, confdata->ned1.HDA_location,
- sizeof(uid->serial) - 1);
- EBCASC(uid->serial, sizeof(uid->serial) - 1);
- uid->ssid = confdata->neq.subsystemID;
- if (confdata->ned2.sneq.flags == 0x40) {
- uid->alias = 1;
- uid->unit_addr = confdata->ned2.sneq.base_unit_addr;
- } else
- uid->unit_addr = confdata->ned1.unit_addr;
-
- return 0;
-}
-
static int
dasd_eckd_read_conf(struct dasd_device *device)
{
return 0;
}
-/*
- * Check device characteristics.
- * If the device is accessible using ECKD discipline, the device is enabled.
- */
+
static int
dasd_eckd_check_characteristics(struct dasd_device *device)
{
struct dasd_eckd_private *private;
- struct dasd_uid uid;
void *rdc_data;
int rc;
/* Read Device Characteristics */
rdc_data = (void *) &(private->rdc_data);
- memset(rdc_data, 0, sizeof(rdc_data));
rc = read_dev_chars(device->cdev, &rdc_data, 64);
if (rc) {
DEV_MESSAGE(KERN_WARNING, device,
/* Read Configuration Data */
rc = dasd_eckd_read_conf (device);
- if (rc)
- return rc;
-
- /* Generate device unique id and register in devmap */
- rc = dasd_eckd_generate_uid(device, &uid);
- if (rc)
- return rc;
-
- rc = dasd_set_uid(device->cdev, &uid);
-
return rc;
+
}
static struct dasd_ccw_req *
* (see dasd_eckd_reserve) device.
*/
static int
-dasd_eckd_release(struct dasd_device *device)
+dasd_eckd_release(struct block_device *bdev, int no, long args)
{
+ struct dasd_device *device;
struct dasd_ccw_req *cqr;
int rc;
if (!capable(CAP_SYS_ADMIN))
return -EACCES;
+ device = bdev->bd_disk->private_data;
+ if (device == NULL)
+ return -ENODEV;
+
cqr = dasd_smalloc_request(dasd_eckd_discipline.name,
1, 32, device);
if (IS_ERR(cqr)) {
* the interrupt is outstanding for a certain time.
*/
static int
-dasd_eckd_reserve(struct dasd_device *device)
+dasd_eckd_reserve(struct block_device *bdev, int no, long args)
{
+ struct dasd_device *device;
struct dasd_ccw_req *cqr;
int rc;
if (!capable(CAP_SYS_ADMIN))
return -EACCES;
+ device = bdev->bd_disk->private_data;
+ if (device == NULL)
+ return -ENODEV;
+
cqr = dasd_smalloc_request(dasd_eckd_discipline.name,
1, 32, device);
if (IS_ERR(cqr)) {
* (unconditional reserve)
*/
static int
-dasd_eckd_steal_lock(struct dasd_device *device)
+dasd_eckd_steal_lock(struct block_device *bdev, int no, long args)
{
+ struct dasd_device *device;
struct dasd_ccw_req *cqr;
int rc;
if (!capable(CAP_SYS_ADMIN))
return -EACCES;
+ device = bdev->bd_disk->private_data;
+ if (device == NULL)
+ return -ENODEV;
+
cqr = dasd_smalloc_request(dasd_eckd_discipline.name,
1, 32, device);
if (IS_ERR(cqr)) {
* Read performance statistics
*/
static int
-dasd_eckd_performance(struct dasd_device *device, void __user *argp)
+dasd_eckd_performance(struct block_device *bdev, int no, long args)
{
+ struct dasd_device *device;
struct dasd_psf_prssd_data *prssdp;
struct dasd_rssd_perf_stats_t *stats;
struct dasd_ccw_req *cqr;
struct ccw1 *ccw;
int rc;
+ device = bdev->bd_disk->private_data;
+ if (device == NULL)
+ return -ENODEV;
+
cqr = dasd_smalloc_request(dasd_eckd_discipline.name,
1 /* PSF */ + 1 /* RSSD */ ,
(sizeof (struct dasd_psf_prssd_data) +
/* Prepare for Read Subsystem Data */
prssdp = (struct dasd_psf_prssd_data *) cqr->data;
stats = (struct dasd_rssd_perf_stats_t *) (prssdp + 1);
- if (copy_to_user(argp, stats,
- sizeof(struct dasd_rssd_perf_stats_t)))
- rc = -EFAULT;
+ rc = copy_to_user((long __user *) args, (long *) stats,
+ sizeof(struct dasd_rssd_perf_stats_t));
}
dasd_sfree_request(cqr, cqr->device);
return rc;
* Returnes the cache attributes used in Define Extend (DE).
*/
static int
-dasd_eckd_get_attrib(struct dasd_device *device, void __user *argp)
+dasd_eckd_get_attrib (struct block_device *bdev, int no, long args)
{
- struct dasd_eckd_private *private =
- (struct dasd_eckd_private *)device->private;
- struct attrib_data_t attrib = private->attrib;
+ struct dasd_device *device;
+ struct dasd_eckd_private *private;
+ struct attrib_data_t attrib;
int rc;
if (!capable(CAP_SYS_ADMIN))
return -EACCES;
- if (!argp)
+ if (!args)
return -EINVAL;
- rc = 0;
- if (copy_to_user(argp, (long *) &attrib,
- sizeof (struct attrib_data_t)))
- rc = -EFAULT;
+ device = bdev->bd_disk->private_data;
+ if (device == NULL)
+ return -ENODEV;
+
+ private = (struct dasd_eckd_private *) device->private;
+ attrib = private->attrib;
+
+ rc = copy_to_user((long __user *) args, (long *) &attrib,
+ sizeof (struct attrib_data_t));
return rc;
}
* Stores the attributes for cache operation to be used in Define Extend (DE).
*/
static int
-dasd_eckd_set_attrib(struct dasd_device *device, void __user *argp)
+dasd_eckd_set_attrib(struct block_device *bdev, int no, long args)
{
- struct dasd_eckd_private *private =
- (struct dasd_eckd_private *)device->private;
+ struct dasd_device *device;
+ struct dasd_eckd_private *private;
struct attrib_data_t attrib;
if (!capable(CAP_SYS_ADMIN))
return -EACCES;
- if (!argp)
+ if (!args)
return -EINVAL;
- if (copy_from_user(&attrib, argp, sizeof(struct attrib_data_t)))
+ device = bdev->bd_disk->private_data;
+ if (device == NULL)
+ return -ENODEV;
+
+ if (copy_from_user(&attrib, (void __user *) args,
+ sizeof (struct attrib_data_t))) {
return -EFAULT;
+ }
+ private = (struct dasd_eckd_private *) device->private;
private->attrib = attrib;
DEV_MESSAGE(KERN_INFO, device,
return 0;
}
-static int
-dasd_eckd_ioctl(struct dasd_device *device, unsigned int cmd, void __user *argp)
-{
- switch (cmd) {
- case BIODASDGATTR:
- return dasd_eckd_get_attrib(device, argp);
- case BIODASDSATTR:
- return dasd_eckd_set_attrib(device, argp);
- case BIODASDPSRD:
- return dasd_eckd_performance(device, argp);
- case BIODASDRLSE:
- return dasd_eckd_release(device);
- case BIODASDRSRV:
- return dasd_eckd_reserve(device);
- case BIODASDSLCK:
- return dasd_eckd_steal_lock(device);
- default:
- return -ENOIOCTLCMD;
- }
-}
-
/*
* Print sense data and related channel program.
* Parts are printed because printk buffer is only 1024 bytes.
.free_cp = dasd_eckd_free_cp,
.dump_sense = dasd_eckd_dump_sense,
.fill_info = dasd_eckd_fill_info,
- .ioctl = dasd_eckd_ioctl,
};
static int __init
{
int ret;
+ dasd_ioctl_no_register(THIS_MODULE, BIODASDGATTR,
+ dasd_eckd_get_attrib);
+ dasd_ioctl_no_register(THIS_MODULE, BIODASDSATTR,
+ dasd_eckd_set_attrib);
+ dasd_ioctl_no_register(THIS_MODULE, BIODASDPSRD,
+ dasd_eckd_performance);
+ dasd_ioctl_no_register(THIS_MODULE, BIODASDRLSE,
+ dasd_eckd_release);
+ dasd_ioctl_no_register(THIS_MODULE, BIODASDRSRV,
+ dasd_eckd_reserve);
+ dasd_ioctl_no_register(THIS_MODULE, BIODASDSLCK,
+ dasd_eckd_steal_lock);
+
ASCEBC(dasd_eckd_discipline.ebcname, 4);
ret = ccw_driver_register(&dasd_eckd_driver);
- if (!ret)
- dasd_generic_auto_online(&dasd_eckd_driver);
- return ret;
+ if (ret) {
+ dasd_ioctl_no_unregister(THIS_MODULE, BIODASDGATTR,
+ dasd_eckd_get_attrib);
+ dasd_ioctl_no_unregister(THIS_MODULE, BIODASDSATTR,
+ dasd_eckd_set_attrib);
+ dasd_ioctl_no_unregister(THIS_MODULE, BIODASDPSRD,
+ dasd_eckd_performance);
+ dasd_ioctl_no_unregister(THIS_MODULE, BIODASDRLSE,
+ dasd_eckd_release);
+ dasd_ioctl_no_unregister(THIS_MODULE, BIODASDRSRV,
+ dasd_eckd_reserve);
+ dasd_ioctl_no_unregister(THIS_MODULE, BIODASDSLCK,
+ dasd_eckd_steal_lock);
+ return ret;
+ }
+
+ dasd_generic_auto_online(&dasd_eckd_driver);
+ return 0;
}
static void __exit
dasd_eckd_cleanup(void)
{
ccw_driver_unregister(&dasd_eckd_driver);
+
+ dasd_ioctl_no_unregister(THIS_MODULE, BIODASDGATTR,
+ dasd_eckd_get_attrib);
+ dasd_ioctl_no_unregister(THIS_MODULE, BIODASDSATTR,
+ dasd_eckd_set_attrib);
+ dasd_ioctl_no_unregister(THIS_MODULE, BIODASDPSRD,
+ dasd_eckd_performance);
+ dasd_ioctl_no_unregister(THIS_MODULE, BIODASDRLSE,
+ dasd_eckd_release);
+ dasd_ioctl_no_unregister(THIS_MODULE, BIODASDRSRV,
+ dasd_eckd_reserve);
+ dasd_ioctl_no_unregister(THIS_MODULE, BIODASDSLCK,
+ dasd_eckd_steal_lock);
}
module_init(dasd_eckd_init);