s390/claw: switch to ccwgroup_create_dev
Switch to the new ccwgroup_create_dev interface. Also wrap device attributes in a struct device_type and let the driver core create these attributes automagically. Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com> Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
00d5bdd17b
commit
2ced5514b3
1 changed files with 54 additions and 78 deletions
|
@ -230,8 +230,6 @@ static ssize_t claw_rbuff_show(struct device *dev,
|
||||||
static ssize_t claw_rbuff_write(struct device *dev,
|
static ssize_t claw_rbuff_write(struct device *dev,
|
||||||
struct device_attribute *attr,
|
struct device_attribute *attr,
|
||||||
const char *buf, size_t count);
|
const char *buf, size_t count);
|
||||||
static int claw_add_files(struct device *dev);
|
|
||||||
static void claw_remove_files(struct device *dev);
|
|
||||||
|
|
||||||
/* Functions for System Validate */
|
/* Functions for System Validate */
|
||||||
static int claw_process_control( struct net_device *dev, struct ccwbk * p_ccw);
|
static int claw_process_control( struct net_device *dev, struct ccwbk * p_ccw);
|
||||||
|
@ -266,7 +264,7 @@ static struct ccwgroup_driver claw_group_driver = {
|
||||||
},
|
},
|
||||||
.max_slaves = 2,
|
.max_slaves = 2,
|
||||||
.driver_id = 0xC3D3C1E6,
|
.driver_id = 0xC3D3C1E6,
|
||||||
.probe = claw_probe,
|
.setup = claw_probe,
|
||||||
.remove = claw_remove_device,
|
.remove = claw_remove_device,
|
||||||
.set_online = claw_new_device,
|
.set_online = claw_new_device,
|
||||||
.set_offline = claw_shutdown_device,
|
.set_offline = claw_shutdown_device,
|
||||||
|
@ -290,17 +288,14 @@ static struct ccw_driver claw_ccw_driver = {
|
||||||
.int_class = IOINT_CLW,
|
.int_class = IOINT_CLW,
|
||||||
};
|
};
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t claw_driver_group_store(struct device_driver *ddrv,
|
||||||
claw_driver_group_store(struct device_driver *ddrv, const char *buf,
|
const char *buf, size_t count)
|
||||||
size_t count)
|
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
err = ccwgroup_create_from_string(claw_root_dev,
|
err = ccwgroup_create_dev(claw_root_dev, claw_group_driver.driver_id,
|
||||||
claw_group_driver.driver_id,
|
&claw_group_driver, 2, buf);
|
||||||
&claw_ccw_driver, 2, buf);
|
|
||||||
return err ? err : count;
|
return err ? err : count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static DRIVER_ATTR(group, 0200, NULL, claw_driver_group_store);
|
static DRIVER_ATTR(group, 0200, NULL, claw_driver_group_store);
|
||||||
|
|
||||||
static struct attribute *claw_group_attrs[] = {
|
static struct attribute *claw_group_attrs[] = {
|
||||||
|
@ -321,60 +316,6 @@ static const struct attribute_group *claw_group_attr_groups[] = {
|
||||||
* Key functions
|
* Key functions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*----------------------------------------------------------------*
|
|
||||||
* claw_probe *
|
|
||||||
* this function is called for each CLAW device. *
|
|
||||||
*----------------------------------------------------------------*/
|
|
||||||
static int
|
|
||||||
claw_probe(struct ccwgroup_device *cgdev)
|
|
||||||
{
|
|
||||||
int rc;
|
|
||||||
struct claw_privbk *privptr=NULL;
|
|
||||||
|
|
||||||
CLAW_DBF_TEXT(2, setup, "probe");
|
|
||||||
if (!get_device(&cgdev->dev))
|
|
||||||
return -ENODEV;
|
|
||||||
privptr = kzalloc(sizeof(struct claw_privbk), GFP_KERNEL);
|
|
||||||
dev_set_drvdata(&cgdev->dev, privptr);
|
|
||||||
if (privptr == NULL) {
|
|
||||||
probe_error(cgdev);
|
|
||||||
put_device(&cgdev->dev);
|
|
||||||
CLAW_DBF_TEXT_(2, setup, "probex%d", -ENOMEM);
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
privptr->p_mtc_envelope= kzalloc( MAX_ENVELOPE_SIZE, GFP_KERNEL);
|
|
||||||
privptr->p_env = kzalloc(sizeof(struct claw_env), GFP_KERNEL);
|
|
||||||
if ((privptr->p_mtc_envelope==NULL) || (privptr->p_env==NULL)) {
|
|
||||||
probe_error(cgdev);
|
|
||||||
put_device(&cgdev->dev);
|
|
||||||
CLAW_DBF_TEXT_(2, setup, "probex%d", -ENOMEM);
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
memcpy(privptr->p_env->adapter_name,WS_NAME_NOT_DEF,8);
|
|
||||||
memcpy(privptr->p_env->host_name,WS_NAME_NOT_DEF,8);
|
|
||||||
memcpy(privptr->p_env->api_type,WS_NAME_NOT_DEF,8);
|
|
||||||
privptr->p_env->packing = 0;
|
|
||||||
privptr->p_env->write_buffers = 5;
|
|
||||||
privptr->p_env->read_buffers = 5;
|
|
||||||
privptr->p_env->read_size = CLAW_FRAME_SIZE;
|
|
||||||
privptr->p_env->write_size = CLAW_FRAME_SIZE;
|
|
||||||
rc = claw_add_files(&cgdev->dev);
|
|
||||||
if (rc) {
|
|
||||||
probe_error(cgdev);
|
|
||||||
put_device(&cgdev->dev);
|
|
||||||
dev_err(&cgdev->dev, "Creating the /proc files for a new"
|
|
||||||
" CLAW device failed\n");
|
|
||||||
CLAW_DBF_TEXT_(2, setup, "probex%d", rc);
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
privptr->p_env->p_priv = privptr;
|
|
||||||
cgdev->cdev[0]->handler = claw_irq_handler;
|
|
||||||
cgdev->cdev[1]->handler = claw_irq_handler;
|
|
||||||
CLAW_DBF_TEXT(2, setup, "prbext 0");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
} /* end of claw_probe */
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------*
|
/*-------------------------------------------------------------------*
|
||||||
* claw_tx *
|
* claw_tx *
|
||||||
*-------------------------------------------------------------------*/
|
*-------------------------------------------------------------------*/
|
||||||
|
@ -3090,7 +3031,6 @@ claw_remove_device(struct ccwgroup_device *cgdev)
|
||||||
dev_info(&cgdev->dev, " will be removed.\n");
|
dev_info(&cgdev->dev, " will be removed.\n");
|
||||||
if (cgdev->state == CCWGROUP_ONLINE)
|
if (cgdev->state == CCWGROUP_ONLINE)
|
||||||
claw_shutdown_device(cgdev);
|
claw_shutdown_device(cgdev);
|
||||||
claw_remove_files(&cgdev->dev);
|
|
||||||
kfree(priv->p_mtc_envelope);
|
kfree(priv->p_mtc_envelope);
|
||||||
priv->p_mtc_envelope=NULL;
|
priv->p_mtc_envelope=NULL;
|
||||||
kfree(priv->p_env);
|
kfree(priv->p_env);
|
||||||
|
@ -3318,7 +3258,6 @@ claw_rbuff_write(struct device *dev, struct device_attribute *attr,
|
||||||
CLAW_DBF_TEXT_(2, setup, "RB=%d", p_env->read_buffers);
|
CLAW_DBF_TEXT_(2, setup, "RB=%d", p_env->read_buffers);
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static DEVICE_ATTR(read_buffer, 0644, claw_rbuff_show, claw_rbuff_write);
|
static DEVICE_ATTR(read_buffer, 0644, claw_rbuff_show, claw_rbuff_write);
|
||||||
|
|
||||||
static struct attribute *claw_attr[] = {
|
static struct attribute *claw_attr[] = {
|
||||||
|
@ -3329,24 +3268,61 @@ static struct attribute *claw_attr[] = {
|
||||||
&dev_attr_host_name.attr,
|
&dev_attr_host_name.attr,
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct attribute_group claw_attr_group = {
|
static struct attribute_group claw_attr_group = {
|
||||||
.attrs = claw_attr,
|
.attrs = claw_attr,
|
||||||
};
|
};
|
||||||
|
static const struct attribute_group *claw_attr_groups[] = {
|
||||||
|
&claw_attr_group,
|
||||||
|
NULL,
|
||||||
|
};
|
||||||
|
static const struct device_type claw_devtype = {
|
||||||
|
.name = "claw",
|
||||||
|
.groups = claw_attr_groups,
|
||||||
|
};
|
||||||
|
|
||||||
static int
|
/*----------------------------------------------------------------*
|
||||||
claw_add_files(struct device *dev)
|
* claw_probe *
|
||||||
|
* this function is called for each CLAW device. *
|
||||||
|
*----------------------------------------------------------------*/
|
||||||
|
static int claw_probe(struct ccwgroup_device *cgdev)
|
||||||
{
|
{
|
||||||
CLAW_DBF_TEXT(2, setup, "add_file");
|
struct claw_privbk *privptr = NULL;
|
||||||
return sysfs_create_group(&dev->kobj, &claw_attr_group);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
CLAW_DBF_TEXT(2, setup, "probe");
|
||||||
claw_remove_files(struct device *dev)
|
if (!get_device(&cgdev->dev))
|
||||||
{
|
return -ENODEV;
|
||||||
CLAW_DBF_TEXT(2, setup, "rem_file");
|
privptr = kzalloc(sizeof(struct claw_privbk), GFP_KERNEL);
|
||||||
sysfs_remove_group(&dev->kobj, &claw_attr_group);
|
dev_set_drvdata(&cgdev->dev, privptr);
|
||||||
|
if (privptr == NULL) {
|
||||||
|
probe_error(cgdev);
|
||||||
|
put_device(&cgdev->dev);
|
||||||
|
CLAW_DBF_TEXT_(2, setup, "probex%d", -ENOMEM);
|
||||||
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
privptr->p_mtc_envelope = kzalloc(MAX_ENVELOPE_SIZE, GFP_KERNEL);
|
||||||
|
privptr->p_env = kzalloc(sizeof(struct claw_env), GFP_KERNEL);
|
||||||
|
if ((privptr->p_mtc_envelope == NULL) || (privptr->p_env == NULL)) {
|
||||||
|
probe_error(cgdev);
|
||||||
|
put_device(&cgdev->dev);
|
||||||
|
CLAW_DBF_TEXT_(2, setup, "probex%d", -ENOMEM);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
memcpy(privptr->p_env->adapter_name, WS_NAME_NOT_DEF, 8);
|
||||||
|
memcpy(privptr->p_env->host_name, WS_NAME_NOT_DEF, 8);
|
||||||
|
memcpy(privptr->p_env->api_type, WS_NAME_NOT_DEF, 8);
|
||||||
|
privptr->p_env->packing = 0;
|
||||||
|
privptr->p_env->write_buffers = 5;
|
||||||
|
privptr->p_env->read_buffers = 5;
|
||||||
|
privptr->p_env->read_size = CLAW_FRAME_SIZE;
|
||||||
|
privptr->p_env->write_size = CLAW_FRAME_SIZE;
|
||||||
|
privptr->p_env->p_priv = privptr;
|
||||||
|
cgdev->cdev[0]->handler = claw_irq_handler;
|
||||||
|
cgdev->cdev[1]->handler = claw_irq_handler;
|
||||||
|
cgdev->dev.type = &claw_devtype;
|
||||||
|
CLAW_DBF_TEXT(2, setup, "prbext 0");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
} /* end of claw_probe */
|
||||||
|
|
||||||
/*--------------------------------------------------------------------*
|
/*--------------------------------------------------------------------*
|
||||||
* claw_init and cleanup *
|
* claw_init and cleanup *
|
||||||
|
|
Loading…
Add table
Reference in a new issue