Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
Pull s390 updates from Martin Schwidefsky: "Just a random collection of bug-fixes and cleanups, nothing new in this merge request." * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: (46 commits) s390/ap: Fix wrong or missing comments s390/ap: move receive callback to message struct s390/dasd: re-prioritize partition detection message s390/qeth: reshuffle initialization s390/qeth: cleanup drv attr usage s390/claw: cleanup drv attr usage s390/lcs: cleanup drv attr usage s390/ctc: cleanup drv attr usage s390/ccwgroup: remove ccwgroup_create_from_string s390/qeth: stop using struct ccwgroup driver for discipline callbacks s390/qeth: switch to ccwgroup_create_dev s390/claw: switch to ccwgroup_create_dev s390/lcs: switch to ccwgroup_create_dev s390/ctcm: switch to ccwgroup_create_dev s390/ccwgroup: exploit ccwdev_by_dev_id s390/ccwgroup: introduce ccwgroup_create_dev s390: fix race on TIF_MCCK_PENDING s390/barrier: make use of fast-bcr facility s390/barrier: cleanup barrier functions s390/claw: remove "eieio" calls ...
此提交包含在:
@@ -136,7 +136,6 @@ static inline void
|
||||
claw_set_busy(struct net_device *dev)
|
||||
{
|
||||
((struct claw_privbk *)dev->ml_priv)->tbusy = 1;
|
||||
eieio();
|
||||
}
|
||||
|
||||
static inline void
|
||||
@@ -144,13 +143,11 @@ claw_clear_busy(struct net_device *dev)
|
||||
{
|
||||
clear_bit(0, &(((struct claw_privbk *) dev->ml_priv)->tbusy));
|
||||
netif_wake_queue(dev);
|
||||
eieio();
|
||||
}
|
||||
|
||||
static inline int
|
||||
claw_check_busy(struct net_device *dev)
|
||||
{
|
||||
eieio();
|
||||
return ((struct claw_privbk *) dev->ml_priv)->tbusy;
|
||||
}
|
||||
|
||||
@@ -233,8 +230,6 @@ static ssize_t claw_rbuff_show(struct device *dev,
|
||||
static ssize_t claw_rbuff_write(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
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 */
|
||||
static int claw_process_control( struct net_device *dev, struct ccwbk * p_ccw);
|
||||
@@ -267,12 +262,10 @@ static struct ccwgroup_driver claw_group_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "claw",
|
||||
},
|
||||
.max_slaves = 2,
|
||||
.driver_id = 0xC3D3C1E6,
|
||||
.probe = claw_probe,
|
||||
.remove = claw_remove_device,
|
||||
.set_online = claw_new_device,
|
||||
.set_offline = claw_shutdown_device,
|
||||
.setup = claw_probe,
|
||||
.remove = claw_remove_device,
|
||||
.set_online = claw_new_device,
|
||||
.set_offline = claw_shutdown_device,
|
||||
.prepare = claw_pm_prepare,
|
||||
};
|
||||
|
||||
@@ -293,30 +286,24 @@ static struct ccw_driver claw_ccw_driver = {
|
||||
.int_class = IOINT_CLW,
|
||||
};
|
||||
|
||||
static ssize_t
|
||||
claw_driver_group_store(struct device_driver *ddrv, const char *buf,
|
||||
size_t count)
|
||||
static ssize_t claw_driver_group_store(struct device_driver *ddrv,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
int err;
|
||||
err = ccwgroup_create_from_string(claw_root_dev,
|
||||
claw_group_driver.driver_id,
|
||||
&claw_ccw_driver, 2, buf);
|
||||
err = ccwgroup_create_dev(claw_root_dev, &claw_group_driver, 2, buf);
|
||||
return err ? err : count;
|
||||
}
|
||||
|
||||
static DRIVER_ATTR(group, 0200, NULL, claw_driver_group_store);
|
||||
|
||||
static struct attribute *claw_group_attrs[] = {
|
||||
static struct attribute *claw_drv_attrs[] = {
|
||||
&driver_attr_group.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static struct attribute_group claw_group_attr_group = {
|
||||
.attrs = claw_group_attrs,
|
||||
static struct attribute_group claw_drv_attr_group = {
|
||||
.attrs = claw_drv_attrs,
|
||||
};
|
||||
|
||||
static const struct attribute_group *claw_group_attr_groups[] = {
|
||||
&claw_group_attr_group,
|
||||
static const struct attribute_group *claw_drv_attr_groups[] = {
|
||||
&claw_drv_attr_group,
|
||||
NULL,
|
||||
};
|
||||
|
||||
@@ -324,60 +311,6 @@ static const struct attribute_group *claw_group_attr_groups[] = {
|
||||
* 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 *
|
||||
*-------------------------------------------------------------------*/
|
||||
@@ -3093,7 +3026,6 @@ claw_remove_device(struct ccwgroup_device *cgdev)
|
||||
dev_info(&cgdev->dev, " will be removed.\n");
|
||||
if (cgdev->state == CCWGROUP_ONLINE)
|
||||
claw_shutdown_device(cgdev);
|
||||
claw_remove_files(&cgdev->dev);
|
||||
kfree(priv->p_mtc_envelope);
|
||||
priv->p_mtc_envelope=NULL;
|
||||
kfree(priv->p_env);
|
||||
@@ -3321,7 +3253,6 @@ claw_rbuff_write(struct device *dev, struct device_attribute *attr,
|
||||
CLAW_DBF_TEXT_(2, setup, "RB=%d", p_env->read_buffers);
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(read_buffer, 0644, claw_rbuff_show, claw_rbuff_write);
|
||||
|
||||
static struct attribute *claw_attr[] = {
|
||||
@@ -3332,40 +3263,73 @@ static struct attribute *claw_attr[] = {
|
||||
&dev_attr_host_name.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static struct attribute_group claw_attr_group = {
|
||||
.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");
|
||||
return sysfs_create_group(&dev->kobj, &claw_attr_group);
|
||||
}
|
||||
struct claw_privbk *privptr = NULL;
|
||||
|
||||
static void
|
||||
claw_remove_files(struct device *dev)
|
||||
{
|
||||
CLAW_DBF_TEXT(2, setup, "rem_file");
|
||||
sysfs_remove_group(&dev->kobj, &claw_attr_group);
|
||||
}
|
||||
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;
|
||||
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 *
|
||||
*---------------------------------------------------------------------*/
|
||||
|
||||
static void __exit
|
||||
claw_cleanup(void)
|
||||
static void __exit claw_cleanup(void)
|
||||
{
|
||||
driver_remove_file(&claw_group_driver.driver,
|
||||
&driver_attr_group);
|
||||
ccwgroup_driver_unregister(&claw_group_driver);
|
||||
ccw_driver_unregister(&claw_ccw_driver);
|
||||
root_device_unregister(claw_root_dev);
|
||||
claw_unregister_debug_facility();
|
||||
pr_info("Driver unloaded\n");
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -3374,8 +3338,7 @@ claw_cleanup(void)
|
||||
*
|
||||
* @return 0 on success, !0 on error.
|
||||
*/
|
||||
static int __init
|
||||
claw_init(void)
|
||||
static int __init claw_init(void)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
@@ -3394,7 +3357,7 @@ claw_init(void)
|
||||
ret = ccw_driver_register(&claw_ccw_driver);
|
||||
if (ret)
|
||||
goto ccw_err;
|
||||
claw_group_driver.driver.groups = claw_group_attr_groups;
|
||||
claw_group_driver.driver.groups = claw_drv_attr_groups;
|
||||
ret = ccwgroup_driver_register(&claw_group_driver);
|
||||
if (ret)
|
||||
goto ccwgroup_err;
|
||||
|
@@ -1296,6 +1296,11 @@ static void ctcm_irq_handler(struct ccw_device *cdev,
|
||||
|
||||
}
|
||||
|
||||
static const struct device_type ctcm_devtype = {
|
||||
.name = "ctcm",
|
||||
.groups = ctcm_attr_groups,
|
||||
};
|
||||
|
||||
/**
|
||||
* Add ctcm specific attributes.
|
||||
* Add ctcm private data.
|
||||
@@ -1307,7 +1312,6 @@ static void ctcm_irq_handler(struct ccw_device *cdev,
|
||||
static int ctcm_probe_device(struct ccwgroup_device *cgdev)
|
||||
{
|
||||
struct ctcm_priv *priv;
|
||||
int rc;
|
||||
|
||||
CTCM_DBF_TEXT_(SETUP, CTC_DBF_INFO,
|
||||
"%s %p",
|
||||
@@ -1324,17 +1328,11 @@ static int ctcm_probe_device(struct ccwgroup_device *cgdev)
|
||||
put_device(&cgdev->dev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
rc = ctcm_add_files(&cgdev->dev);
|
||||
if (rc) {
|
||||
kfree(priv);
|
||||
put_device(&cgdev->dev);
|
||||
return rc;
|
||||
}
|
||||
priv->buffer_size = CTCM_BUFSIZE_DEFAULT;
|
||||
cgdev->cdev[0]->handler = ctcm_irq_handler;
|
||||
cgdev->cdev[1]->handler = ctcm_irq_handler;
|
||||
dev_set_drvdata(&cgdev->dev, priv);
|
||||
cgdev->dev.type = &ctcm_devtype;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1611,11 +1609,6 @@ static int ctcm_new_device(struct ccwgroup_device *cgdev)
|
||||
goto out_dev;
|
||||
}
|
||||
|
||||
if (ctcm_add_attributes(&cgdev->dev)) {
|
||||
result = -ENODEV;
|
||||
goto out_unregister;
|
||||
}
|
||||
|
||||
strlcpy(priv->fsm->name, dev->name, sizeof(priv->fsm->name));
|
||||
|
||||
dev_info(&dev->dev,
|
||||
@@ -1629,8 +1622,6 @@ static int ctcm_new_device(struct ccwgroup_device *cgdev)
|
||||
priv->channel[CTCM_WRITE]->id, priv->protocol);
|
||||
|
||||
return 0;
|
||||
out_unregister:
|
||||
unregister_netdev(dev);
|
||||
out_dev:
|
||||
ctcm_free_netdevice(dev);
|
||||
out_ccw2:
|
||||
@@ -1669,7 +1660,6 @@ static int ctcm_shutdown_device(struct ccwgroup_device *cgdev)
|
||||
/* Close the device */
|
||||
ctcm_close(dev);
|
||||
dev->flags &= ~IFF_RUNNING;
|
||||
ctcm_remove_attributes(&cgdev->dev);
|
||||
channel_free(priv->channel[CTCM_READ]);
|
||||
} else
|
||||
dev = NULL;
|
||||
@@ -1711,7 +1701,6 @@ static void ctcm_remove_device(struct ccwgroup_device *cgdev)
|
||||
|
||||
if (cgdev->state == CCWGROUP_ONLINE)
|
||||
ctcm_shutdown_device(cgdev);
|
||||
ctcm_remove_files(&cgdev->dev);
|
||||
dev_set_drvdata(&cgdev->dev, NULL);
|
||||
kfree(priv);
|
||||
put_device(&cgdev->dev);
|
||||
@@ -1778,9 +1767,7 @@ static struct ccwgroup_driver ctcm_group_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = CTC_DRIVER_NAME,
|
||||
},
|
||||
.max_slaves = 2,
|
||||
.driver_id = 0xC3E3C3D4, /* CTCM */
|
||||
.probe = ctcm_probe_device,
|
||||
.setup = ctcm_probe_device,
|
||||
.remove = ctcm_remove_device,
|
||||
.set_online = ctcm_new_device,
|
||||
.set_offline = ctcm_shutdown_device,
|
||||
@@ -1789,31 +1776,25 @@ static struct ccwgroup_driver ctcm_group_driver = {
|
||||
.restore = ctcm_pm_resume,
|
||||
};
|
||||
|
||||
static ssize_t
|
||||
ctcm_driver_group_store(struct device_driver *ddrv, const char *buf,
|
||||
size_t count)
|
||||
static ssize_t ctcm_driver_group_store(struct device_driver *ddrv,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = ccwgroup_create_from_string(ctcm_root_dev,
|
||||
ctcm_group_driver.driver_id,
|
||||
&ctcm_ccw_driver, 2, buf);
|
||||
err = ccwgroup_create_dev(ctcm_root_dev, &ctcm_group_driver, 2, buf);
|
||||
return err ? err : count;
|
||||
}
|
||||
|
||||
static DRIVER_ATTR(group, 0200, NULL, ctcm_driver_group_store);
|
||||
|
||||
static struct attribute *ctcm_group_attrs[] = {
|
||||
static struct attribute *ctcm_drv_attrs[] = {
|
||||
&driver_attr_group.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static struct attribute_group ctcm_group_attr_group = {
|
||||
.attrs = ctcm_group_attrs,
|
||||
static struct attribute_group ctcm_drv_attr_group = {
|
||||
.attrs = ctcm_drv_attrs,
|
||||
};
|
||||
|
||||
static const struct attribute_group *ctcm_group_attr_groups[] = {
|
||||
&ctcm_group_attr_group,
|
||||
static const struct attribute_group *ctcm_drv_attr_groups[] = {
|
||||
&ctcm_drv_attr_group,
|
||||
NULL,
|
||||
};
|
||||
|
||||
@@ -1829,7 +1810,6 @@ static const struct attribute_group *ctcm_group_attr_groups[] = {
|
||||
*/
|
||||
static void __exit ctcm_exit(void)
|
||||
{
|
||||
driver_remove_file(&ctcm_group_driver.driver, &driver_attr_group);
|
||||
ccwgroup_driver_unregister(&ctcm_group_driver);
|
||||
ccw_driver_unregister(&ctcm_ccw_driver);
|
||||
root_device_unregister(ctcm_root_dev);
|
||||
@@ -1867,7 +1847,7 @@ static int __init ctcm_init(void)
|
||||
ret = ccw_driver_register(&ctcm_ccw_driver);
|
||||
if (ret)
|
||||
goto ccw_err;
|
||||
ctcm_group_driver.driver.groups = ctcm_group_attr_groups;
|
||||
ctcm_group_driver.driver.groups = ctcm_drv_attr_groups;
|
||||
ret = ccwgroup_driver_register(&ctcm_group_driver);
|
||||
if (ret)
|
||||
goto ccwgroup_err;
|
||||
|
@@ -225,13 +225,7 @@ struct ctcm_priv {
|
||||
int ctcm_open(struct net_device *dev);
|
||||
int ctcm_close(struct net_device *dev);
|
||||
|
||||
/*
|
||||
* prototypes for non-static sysfs functions
|
||||
*/
|
||||
int ctcm_add_attributes(struct device *dev);
|
||||
void ctcm_remove_attributes(struct device *dev);
|
||||
int ctcm_add_files(struct device *dev);
|
||||
void ctcm_remove_files(struct device *dev);
|
||||
extern const struct attribute_group *ctcm_attr_groups[];
|
||||
|
||||
/*
|
||||
* Compatibility macros for busy handling
|
||||
|
@@ -13,6 +13,7 @@
|
||||
#define KMSG_COMPONENT "ctcm"
|
||||
#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/sysfs.h>
|
||||
#include <linux/slab.h>
|
||||
#include "ctcm_main.h"
|
||||
@@ -108,10 +109,12 @@ static void ctcm_print_statistics(struct ctcm_priv *priv)
|
||||
}
|
||||
|
||||
static ssize_t stats_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct ccwgroup_device *gdev = to_ccwgroupdev(dev);
|
||||
struct ctcm_priv *priv = dev_get_drvdata(dev);
|
||||
if (!priv)
|
||||
|
||||
if (!priv || gdev->state != CCWGROUP_ONLINE)
|
||||
return -ENODEV;
|
||||
ctcm_print_statistics(priv);
|
||||
return sprintf(buf, "0\n");
|
||||
@@ -190,34 +193,14 @@ static struct attribute *ctcm_attr[] = {
|
||||
&dev_attr_protocol.attr,
|
||||
&dev_attr_type.attr,
|
||||
&dev_attr_buffer.attr,
|
||||
&dev_attr_stats.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static struct attribute_group ctcm_attr_group = {
|
||||
.attrs = ctcm_attr,
|
||||
};
|
||||
|
||||
int ctcm_add_attributes(struct device *dev)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = device_create_file(dev, &dev_attr_stats);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
void ctcm_remove_attributes(struct device *dev)
|
||||
{
|
||||
device_remove_file(dev, &dev_attr_stats);
|
||||
}
|
||||
|
||||
int ctcm_add_files(struct device *dev)
|
||||
{
|
||||
return sysfs_create_group(&dev->kobj, &ctcm_attr_group);
|
||||
}
|
||||
|
||||
void ctcm_remove_files(struct device *dev)
|
||||
{
|
||||
sysfs_remove_group(&dev->kobj, &ctcm_attr_group);
|
||||
}
|
||||
|
||||
const struct attribute_group *ctcm_attr_groups[] = {
|
||||
&ctcm_attr_group,
|
||||
NULL,
|
||||
};
|
||||
|
@@ -2040,10 +2040,17 @@ static struct attribute * lcs_attrs[] = {
|
||||
&dev_attr_recover.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static struct attribute_group lcs_attr_group = {
|
||||
.attrs = lcs_attrs,
|
||||
};
|
||||
static const struct attribute_group *lcs_attr_groups[] = {
|
||||
&lcs_attr_group,
|
||||
NULL,
|
||||
};
|
||||
static const struct device_type lcs_devtype = {
|
||||
.name = "lcs",
|
||||
.groups = lcs_attr_groups,
|
||||
};
|
||||
|
||||
/**
|
||||
* lcs_probe_device is called on establishing a new ccwgroup_device.
|
||||
@@ -2052,7 +2059,6 @@ static int
|
||||
lcs_probe_device(struct ccwgroup_device *ccwgdev)
|
||||
{
|
||||
struct lcs_card *card;
|
||||
int ret;
|
||||
|
||||
if (!get_device(&ccwgdev->dev))
|
||||
return -ENODEV;
|
||||
@@ -2064,12 +2070,6 @@ lcs_probe_device(struct ccwgroup_device *ccwgdev)
|
||||
put_device(&ccwgdev->dev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
ret = sysfs_create_group(&ccwgdev->dev.kobj, &lcs_attr_group);
|
||||
if (ret) {
|
||||
lcs_free_card(card);
|
||||
put_device(&ccwgdev->dev);
|
||||
return ret;
|
||||
}
|
||||
dev_set_drvdata(&ccwgdev->dev, card);
|
||||
ccwgdev->cdev[0]->handler = lcs_irq;
|
||||
ccwgdev->cdev[1]->handler = lcs_irq;
|
||||
@@ -2078,7 +2078,9 @@ lcs_probe_device(struct ccwgroup_device *ccwgdev)
|
||||
card->thread_start_mask = 0;
|
||||
card->thread_allowed_mask = 0;
|
||||
card->thread_running_mask = 0;
|
||||
return 0;
|
||||
ccwgdev->dev.type = &lcs_devtype;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -2306,9 +2308,9 @@ lcs_remove_device(struct ccwgroup_device *ccwgdev)
|
||||
}
|
||||
if (card->dev)
|
||||
unregister_netdev(card->dev);
|
||||
sysfs_remove_group(&ccwgdev->dev.kobj, &lcs_attr_group);
|
||||
lcs_cleanup_card(card);
|
||||
lcs_free_card(card);
|
||||
dev_set_drvdata(&ccwgdev->dev, NULL);
|
||||
put_device(&ccwgdev->dev);
|
||||
}
|
||||
|
||||
@@ -2393,9 +2395,7 @@ static struct ccwgroup_driver lcs_group_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "lcs",
|
||||
},
|
||||
.max_slaves = 2,
|
||||
.driver_id = 0xD3C3E2,
|
||||
.probe = lcs_probe_device,
|
||||
.setup = lcs_probe_device,
|
||||
.remove = lcs_remove_device,
|
||||
.set_online = lcs_new_device,
|
||||
.set_offline = lcs_shutdown_device,
|
||||
@@ -2406,30 +2406,24 @@ static struct ccwgroup_driver lcs_group_driver = {
|
||||
.restore = lcs_restore,
|
||||
};
|
||||
|
||||
static ssize_t
|
||||
lcs_driver_group_store(struct device_driver *ddrv, const char *buf,
|
||||
size_t count)
|
||||
static ssize_t lcs_driver_group_store(struct device_driver *ddrv,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
int err;
|
||||
err = ccwgroup_create_from_string(lcs_root_dev,
|
||||
lcs_group_driver.driver_id,
|
||||
&lcs_ccw_driver, 2, buf);
|
||||
err = ccwgroup_create_dev(lcs_root_dev, &lcs_group_driver, 2, buf);
|
||||
return err ? err : count;
|
||||
}
|
||||
|
||||
static DRIVER_ATTR(group, 0200, NULL, lcs_driver_group_store);
|
||||
|
||||
static struct attribute *lcs_group_attrs[] = {
|
||||
static struct attribute *lcs_drv_attrs[] = {
|
||||
&driver_attr_group.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static struct attribute_group lcs_group_attr_group = {
|
||||
.attrs = lcs_group_attrs,
|
||||
static struct attribute_group lcs_drv_attr_group = {
|
||||
.attrs = lcs_drv_attrs,
|
||||
};
|
||||
|
||||
static const struct attribute_group *lcs_group_attr_groups[] = {
|
||||
&lcs_group_attr_group,
|
||||
static const struct attribute_group *lcs_drv_attr_groups[] = {
|
||||
&lcs_drv_attr_group,
|
||||
NULL,
|
||||
};
|
||||
|
||||
@@ -2453,7 +2447,7 @@ __init lcs_init_module(void)
|
||||
rc = ccw_driver_register(&lcs_ccw_driver);
|
||||
if (rc)
|
||||
goto ccw_err;
|
||||
lcs_group_driver.driver.groups = lcs_group_attr_groups;
|
||||
lcs_group_driver.driver.groups = lcs_drv_attr_groups;
|
||||
rc = ccwgroup_driver_register(&lcs_group_driver);
|
||||
if (rc)
|
||||
goto ccwgroup_err;
|
||||
@@ -2479,8 +2473,6 @@ __exit lcs_cleanup_module(void)
|
||||
{
|
||||
pr_info("Terminating lcs module.\n");
|
||||
LCS_DBF_TEXT(0, trace, "cleanup");
|
||||
driver_remove_file(&lcs_group_driver.driver,
|
||||
&driver_attr_group);
|
||||
ccwgroup_driver_unregister(&lcs_group_driver);
|
||||
ccw_driver_unregister(&lcs_ccw_driver);
|
||||
root_device_unregister(lcs_root_dev);
|
||||
|
@@ -707,7 +707,16 @@ struct qeth_discipline {
|
||||
qdio_handler_t *input_handler;
|
||||
qdio_handler_t *output_handler;
|
||||
int (*recover)(void *ptr);
|
||||
struct ccwgroup_driver *ccwgdriver;
|
||||
int (*setup) (struct ccwgroup_device *);
|
||||
void (*remove) (struct ccwgroup_device *);
|
||||
int (*set_online) (struct ccwgroup_device *);
|
||||
int (*set_offline) (struct ccwgroup_device *);
|
||||
void (*shutdown)(struct ccwgroup_device *);
|
||||
int (*prepare) (struct ccwgroup_device *);
|
||||
void (*complete) (struct ccwgroup_device *);
|
||||
int (*freeze)(struct ccwgroup_device *);
|
||||
int (*thaw) (struct ccwgroup_device *);
|
||||
int (*restore)(struct ccwgroup_device *);
|
||||
};
|
||||
|
||||
struct qeth_vlan_vid {
|
||||
@@ -771,7 +780,7 @@ struct qeth_card {
|
||||
struct qeth_perf_stats perf_stats;
|
||||
int read_or_write_problem;
|
||||
struct qeth_osn_info osn_info;
|
||||
struct qeth_discipline discipline;
|
||||
struct qeth_discipline *discipline;
|
||||
atomic_t force_alloc_skb;
|
||||
struct service_level qeth_service_level;
|
||||
struct qdio_ssqd_desc ssqd;
|
||||
@@ -837,16 +846,15 @@ static inline int qeth_is_diagass_supported(struct qeth_card *card,
|
||||
return card->info.diagass_support & (__u32)cmd;
|
||||
}
|
||||
|
||||
extern struct ccwgroup_driver qeth_l2_ccwgroup_driver;
|
||||
extern struct ccwgroup_driver qeth_l3_ccwgroup_driver;
|
||||
extern struct qeth_discipline qeth_l2_discipline;
|
||||
extern struct qeth_discipline qeth_l3_discipline;
|
||||
extern const struct attribute_group *qeth_generic_attr_groups[];
|
||||
extern const struct attribute_group *qeth_osn_attr_groups[];
|
||||
|
||||
const char *qeth_get_cardname_short(struct qeth_card *);
|
||||
int qeth_realloc_buffer_pool(struct qeth_card *, int);
|
||||
int qeth_core_load_discipline(struct qeth_card *, enum qeth_discipline_id);
|
||||
void qeth_core_free_discipline(struct qeth_card *);
|
||||
int qeth_core_create_device_attributes(struct device *);
|
||||
void qeth_core_remove_device_attributes(struct device *);
|
||||
int qeth_core_create_osn_attributes(struct device *);
|
||||
void qeth_core_remove_osn_attributes(struct device *);
|
||||
void qeth_buffer_reclaim_work(struct work_struct *);
|
||||
|
||||
/* exports for qeth discipline device drivers */
|
||||
|
@@ -1363,7 +1363,7 @@ static void qeth_start_kernel_thread(struct work_struct *work)
|
||||
card->write.state != CH_STATE_UP)
|
||||
return;
|
||||
if (qeth_do_start_thread(card, QETH_RECOVER_THREAD)) {
|
||||
ts = kthread_run(card->discipline.recover, (void *)card,
|
||||
ts = kthread_run(card->discipline->recover, (void *)card,
|
||||
"qeth_recover");
|
||||
if (IS_ERR(ts)) {
|
||||
qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD);
|
||||
@@ -3337,7 +3337,7 @@ static void qeth_flush_buffers(struct qeth_qdio_out_q *queue, int index,
|
||||
if (rc) {
|
||||
queue->card->stats.tx_errors += count;
|
||||
/* ignore temporary SIGA errors without busy condition */
|
||||
if (rc == QDIO_ERROR_SIGA_TARGET)
|
||||
if (rc == -ENOBUFS)
|
||||
return;
|
||||
QETH_CARD_TEXT(queue->card, 2, "flushbuf");
|
||||
QETH_CARD_TEXT_(queue->card, 2, " q%d", queue->queue_no);
|
||||
@@ -3531,7 +3531,7 @@ void qeth_qdio_output_handler(struct ccw_device *ccwdev,
|
||||
int i;
|
||||
|
||||
QETH_CARD_TEXT(card, 6, "qdouhdl");
|
||||
if (qdio_error & QDIO_ERROR_ACTIVATE_CHECK_CONDITION) {
|
||||
if (qdio_error & QDIO_ERROR_FATAL) {
|
||||
QETH_CARD_TEXT(card, 2, "achkcond");
|
||||
netif_stop_queue(card->dev);
|
||||
qeth_schedule_recovery(card);
|
||||
@@ -4627,7 +4627,7 @@ static int qeth_qdio_establish(struct qeth_card *card)
|
||||
goto out_free_in_sbals;
|
||||
}
|
||||
for (i = 0; i < card->qdio.no_in_queues; ++i)
|
||||
queue_start_poll[i] = card->discipline.start_poll;
|
||||
queue_start_poll[i] = card->discipline->start_poll;
|
||||
|
||||
qeth_qdio_establish_cq(card, in_sbal_ptrs, queue_start_poll);
|
||||
|
||||
@@ -4651,8 +4651,8 @@ static int qeth_qdio_establish(struct qeth_card *card)
|
||||
init_data.qib_param_field = qib_param_field;
|
||||
init_data.no_input_qs = card->qdio.no_in_queues;
|
||||
init_data.no_output_qs = card->qdio.no_out_queues;
|
||||
init_data.input_handler = card->discipline.input_handler;
|
||||
init_data.output_handler = card->discipline.output_handler;
|
||||
init_data.input_handler = card->discipline->input_handler;
|
||||
init_data.output_handler = card->discipline->output_handler;
|
||||
init_data.queue_start_poll_array = queue_start_poll;
|
||||
init_data.int_parm = (unsigned long) card;
|
||||
init_data.input_sbal_addr_array = (void **) in_sbal_ptrs;
|
||||
@@ -4737,13 +4737,6 @@ static struct ccw_driver qeth_ccw_driver = {
|
||||
.remove = ccwgroup_remove_ccwdev,
|
||||
};
|
||||
|
||||
static int qeth_core_driver_group(const char *buf, struct device *root_dev,
|
||||
unsigned long driver_id)
|
||||
{
|
||||
return ccwgroup_create_from_string(root_dev, driver_id,
|
||||
&qeth_ccw_driver, 3, buf);
|
||||
}
|
||||
|
||||
int qeth_core_hardsetup_card(struct qeth_card *card)
|
||||
{
|
||||
int retries = 0;
|
||||
@@ -5040,17 +5033,15 @@ int qeth_core_load_discipline(struct qeth_card *card,
|
||||
mutex_lock(&qeth_mod_mutex);
|
||||
switch (discipline) {
|
||||
case QETH_DISCIPLINE_LAYER3:
|
||||
card->discipline.ccwgdriver = try_then_request_module(
|
||||
symbol_get(qeth_l3_ccwgroup_driver),
|
||||
"qeth_l3");
|
||||
card->discipline = try_then_request_module(
|
||||
symbol_get(qeth_l3_discipline), "qeth_l3");
|
||||
break;
|
||||
case QETH_DISCIPLINE_LAYER2:
|
||||
card->discipline.ccwgdriver = try_then_request_module(
|
||||
symbol_get(qeth_l2_ccwgroup_driver),
|
||||
"qeth_l2");
|
||||
card->discipline = try_then_request_module(
|
||||
symbol_get(qeth_l2_discipline), "qeth_l2");
|
||||
break;
|
||||
}
|
||||
if (!card->discipline.ccwgdriver) {
|
||||
if (!card->discipline) {
|
||||
dev_err(&card->gdev->dev, "There is no kernel module to "
|
||||
"support discipline %d\n", discipline);
|
||||
rc = -EINVAL;
|
||||
@@ -5062,12 +5053,21 @@ int qeth_core_load_discipline(struct qeth_card *card,
|
||||
void qeth_core_free_discipline(struct qeth_card *card)
|
||||
{
|
||||
if (card->options.layer2)
|
||||
symbol_put(qeth_l2_ccwgroup_driver);
|
||||
symbol_put(qeth_l2_discipline);
|
||||
else
|
||||
symbol_put(qeth_l3_ccwgroup_driver);
|
||||
card->discipline.ccwgdriver = NULL;
|
||||
symbol_put(qeth_l3_discipline);
|
||||
card->discipline = NULL;
|
||||
}
|
||||
|
||||
static const struct device_type qeth_generic_devtype = {
|
||||
.name = "qeth_generic",
|
||||
.groups = qeth_generic_attr_groups,
|
||||
};
|
||||
static const struct device_type qeth_osn_devtype = {
|
||||
.name = "qeth_osn",
|
||||
.groups = qeth_osn_attr_groups,
|
||||
};
|
||||
|
||||
static int qeth_core_probe_device(struct ccwgroup_device *gdev)
|
||||
{
|
||||
struct qeth_card *card;
|
||||
@@ -5122,18 +5122,17 @@ static int qeth_core_probe_device(struct ccwgroup_device *gdev)
|
||||
}
|
||||
|
||||
if (card->info.type == QETH_CARD_TYPE_OSN)
|
||||
rc = qeth_core_create_osn_attributes(dev);
|
||||
gdev->dev.type = &qeth_osn_devtype;
|
||||
else
|
||||
rc = qeth_core_create_device_attributes(dev);
|
||||
if (rc)
|
||||
goto err_dbf;
|
||||
gdev->dev.type = &qeth_generic_devtype;
|
||||
|
||||
switch (card->info.type) {
|
||||
case QETH_CARD_TYPE_OSN:
|
||||
case QETH_CARD_TYPE_OSM:
|
||||
rc = qeth_core_load_discipline(card, QETH_DISCIPLINE_LAYER2);
|
||||
if (rc)
|
||||
goto err_attr;
|
||||
rc = card->discipline.ccwgdriver->probe(card->gdev);
|
||||
goto err_dbf;
|
||||
rc = card->discipline->setup(card->gdev);
|
||||
if (rc)
|
||||
goto err_disc;
|
||||
case QETH_CARD_TYPE_OSD:
|
||||
@@ -5151,11 +5150,6 @@ static int qeth_core_probe_device(struct ccwgroup_device *gdev)
|
||||
|
||||
err_disc:
|
||||
qeth_core_free_discipline(card);
|
||||
err_attr:
|
||||
if (card->info.type == QETH_CARD_TYPE_OSN)
|
||||
qeth_core_remove_osn_attributes(dev);
|
||||
else
|
||||
qeth_core_remove_device_attributes(dev);
|
||||
err_dbf:
|
||||
debug_unregister(card->debug);
|
||||
err_card:
|
||||
@@ -5172,14 +5166,8 @@ static void qeth_core_remove_device(struct ccwgroup_device *gdev)
|
||||
|
||||
QETH_DBF_TEXT(SETUP, 2, "removedv");
|
||||
|
||||
if (card->info.type == QETH_CARD_TYPE_OSN) {
|
||||
qeth_core_remove_osn_attributes(&gdev->dev);
|
||||
} else {
|
||||
qeth_core_remove_device_attributes(&gdev->dev);
|
||||
}
|
||||
|
||||
if (card->discipline.ccwgdriver) {
|
||||
card->discipline.ccwgdriver->remove(gdev);
|
||||
if (card->discipline) {
|
||||
card->discipline->remove(gdev);
|
||||
qeth_core_free_discipline(card);
|
||||
}
|
||||
|
||||
@@ -5199,7 +5187,7 @@ static int qeth_core_set_online(struct ccwgroup_device *gdev)
|
||||
int rc = 0;
|
||||
int def_discipline;
|
||||
|
||||
if (!card->discipline.ccwgdriver) {
|
||||
if (!card->discipline) {
|
||||
if (card->info.type == QETH_CARD_TYPE_IQD)
|
||||
def_discipline = QETH_DISCIPLINE_LAYER3;
|
||||
else
|
||||
@@ -5207,11 +5195,11 @@ static int qeth_core_set_online(struct ccwgroup_device *gdev)
|
||||
rc = qeth_core_load_discipline(card, def_discipline);
|
||||
if (rc)
|
||||
goto err;
|
||||
rc = card->discipline.ccwgdriver->probe(card->gdev);
|
||||
rc = card->discipline->setup(card->gdev);
|
||||
if (rc)
|
||||
goto err;
|
||||
}
|
||||
rc = card->discipline.ccwgdriver->set_online(gdev);
|
||||
rc = card->discipline->set_online(gdev);
|
||||
err:
|
||||
return rc;
|
||||
}
|
||||
@@ -5219,58 +5207,52 @@ err:
|
||||
static int qeth_core_set_offline(struct ccwgroup_device *gdev)
|
||||
{
|
||||
struct qeth_card *card = dev_get_drvdata(&gdev->dev);
|
||||
return card->discipline.ccwgdriver->set_offline(gdev);
|
||||
return card->discipline->set_offline(gdev);
|
||||
}
|
||||
|
||||
static void qeth_core_shutdown(struct ccwgroup_device *gdev)
|
||||
{
|
||||
struct qeth_card *card = dev_get_drvdata(&gdev->dev);
|
||||
if (card->discipline.ccwgdriver &&
|
||||
card->discipline.ccwgdriver->shutdown)
|
||||
card->discipline.ccwgdriver->shutdown(gdev);
|
||||
if (card->discipline && card->discipline->shutdown)
|
||||
card->discipline->shutdown(gdev);
|
||||
}
|
||||
|
||||
static int qeth_core_prepare(struct ccwgroup_device *gdev)
|
||||
{
|
||||
struct qeth_card *card = dev_get_drvdata(&gdev->dev);
|
||||
if (card->discipline.ccwgdriver &&
|
||||
card->discipline.ccwgdriver->prepare)
|
||||
return card->discipline.ccwgdriver->prepare(gdev);
|
||||
if (card->discipline && card->discipline->prepare)
|
||||
return card->discipline->prepare(gdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void qeth_core_complete(struct ccwgroup_device *gdev)
|
||||
{
|
||||
struct qeth_card *card = dev_get_drvdata(&gdev->dev);
|
||||
if (card->discipline.ccwgdriver &&
|
||||
card->discipline.ccwgdriver->complete)
|
||||
card->discipline.ccwgdriver->complete(gdev);
|
||||
if (card->discipline && card->discipline->complete)
|
||||
card->discipline->complete(gdev);
|
||||
}
|
||||
|
||||
static int qeth_core_freeze(struct ccwgroup_device *gdev)
|
||||
{
|
||||
struct qeth_card *card = dev_get_drvdata(&gdev->dev);
|
||||
if (card->discipline.ccwgdriver &&
|
||||
card->discipline.ccwgdriver->freeze)
|
||||
return card->discipline.ccwgdriver->freeze(gdev);
|
||||
if (card->discipline && card->discipline->freeze)
|
||||
return card->discipline->freeze(gdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qeth_core_thaw(struct ccwgroup_device *gdev)
|
||||
{
|
||||
struct qeth_card *card = dev_get_drvdata(&gdev->dev);
|
||||
if (card->discipline.ccwgdriver &&
|
||||
card->discipline.ccwgdriver->thaw)
|
||||
return card->discipline.ccwgdriver->thaw(gdev);
|
||||
if (card->discipline && card->discipline->thaw)
|
||||
return card->discipline->thaw(gdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qeth_core_restore(struct ccwgroup_device *gdev)
|
||||
{
|
||||
struct qeth_card *card = dev_get_drvdata(&gdev->dev);
|
||||
if (card->discipline.ccwgdriver &&
|
||||
card->discipline.ccwgdriver->restore)
|
||||
return card->discipline.ccwgdriver->restore(gdev);
|
||||
if (card->discipline && card->discipline->restore)
|
||||
return card->discipline->restore(gdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -5279,8 +5261,7 @@ static struct ccwgroup_driver qeth_core_ccwgroup_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "qeth",
|
||||
},
|
||||
.driver_id = 0xD8C5E3C8,
|
||||
.probe = qeth_core_probe_device,
|
||||
.setup = qeth_core_probe_device,
|
||||
.remove = qeth_core_remove_device,
|
||||
.set_online = qeth_core_set_online,
|
||||
.set_offline = qeth_core_set_offline,
|
||||
@@ -5292,21 +5273,30 @@ static struct ccwgroup_driver qeth_core_ccwgroup_driver = {
|
||||
.restore = qeth_core_restore,
|
||||
};
|
||||
|
||||
static ssize_t
|
||||
qeth_core_driver_group_store(struct device_driver *ddrv, const char *buf,
|
||||
size_t count)
|
||||
static ssize_t qeth_core_driver_group_store(struct device_driver *ddrv,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
int err;
|
||||
err = qeth_core_driver_group(buf, qeth_core_root_dev,
|
||||
qeth_core_ccwgroup_driver.driver_id);
|
||||
if (err)
|
||||
return err;
|
||||
else
|
||||
return count;
|
||||
}
|
||||
|
||||
err = ccwgroup_create_dev(qeth_core_root_dev,
|
||||
&qeth_core_ccwgroup_driver, 3, buf);
|
||||
|
||||
return err ? err : count;
|
||||
}
|
||||
static DRIVER_ATTR(group, 0200, NULL, qeth_core_driver_group_store);
|
||||
|
||||
static struct attribute *qeth_drv_attrs[] = {
|
||||
&driver_attr_group.attr,
|
||||
NULL,
|
||||
};
|
||||
static struct attribute_group qeth_drv_attr_group = {
|
||||
.attrs = qeth_drv_attrs,
|
||||
};
|
||||
static const struct attribute_group *qeth_drv_attr_groups[] = {
|
||||
&qeth_drv_attr_group,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static struct {
|
||||
const char str[ETH_GSTRING_LEN];
|
||||
} qeth_ethtool_stats_keys[] = {
|
||||
@@ -5544,49 +5534,41 @@ static int __init qeth_core_init(void)
|
||||
rc = qeth_register_dbf_views();
|
||||
if (rc)
|
||||
goto out_err;
|
||||
rc = ccw_driver_register(&qeth_ccw_driver);
|
||||
if (rc)
|
||||
goto ccw_err;
|
||||
rc = ccwgroup_driver_register(&qeth_core_ccwgroup_driver);
|
||||
if (rc)
|
||||
goto ccwgroup_err;
|
||||
rc = driver_create_file(&qeth_core_ccwgroup_driver.driver,
|
||||
&driver_attr_group);
|
||||
if (rc)
|
||||
goto driver_err;
|
||||
qeth_core_root_dev = root_device_register("qeth");
|
||||
rc = IS_ERR(qeth_core_root_dev) ? PTR_ERR(qeth_core_root_dev) : 0;
|
||||
if (rc)
|
||||
goto register_err;
|
||||
|
||||
qeth_core_header_cache = kmem_cache_create("qeth_hdr",
|
||||
sizeof(struct qeth_hdr) + ETH_HLEN, 64, 0, NULL);
|
||||
if (!qeth_core_header_cache) {
|
||||
rc = -ENOMEM;
|
||||
goto slab_err;
|
||||
}
|
||||
|
||||
qeth_qdio_outbuf_cache = kmem_cache_create("qeth_buf",
|
||||
sizeof(struct qeth_qdio_out_buffer), 0, 0, NULL);
|
||||
if (!qeth_qdio_outbuf_cache) {
|
||||
rc = -ENOMEM;
|
||||
goto cqslab_err;
|
||||
}
|
||||
rc = ccw_driver_register(&qeth_ccw_driver);
|
||||
if (rc)
|
||||
goto ccw_err;
|
||||
qeth_core_ccwgroup_driver.driver.groups = qeth_drv_attr_groups;
|
||||
rc = ccwgroup_driver_register(&qeth_core_ccwgroup_driver);
|
||||
if (rc)
|
||||
goto ccwgroup_err;
|
||||
|
||||
return 0;
|
||||
|
||||
ccwgroup_err:
|
||||
ccw_driver_unregister(&qeth_ccw_driver);
|
||||
ccw_err:
|
||||
kmem_cache_destroy(qeth_qdio_outbuf_cache);
|
||||
cqslab_err:
|
||||
kmem_cache_destroy(qeth_core_header_cache);
|
||||
slab_err:
|
||||
root_device_unregister(qeth_core_root_dev);
|
||||
register_err:
|
||||
driver_remove_file(&qeth_core_ccwgroup_driver.driver,
|
||||
&driver_attr_group);
|
||||
driver_err:
|
||||
ccwgroup_driver_unregister(&qeth_core_ccwgroup_driver);
|
||||
ccwgroup_err:
|
||||
ccw_driver_unregister(&qeth_ccw_driver);
|
||||
ccw_err:
|
||||
QETH_DBF_MESSAGE(2, "Initialization failed with code %d\n", rc);
|
||||
qeth_unregister_dbf_views();
|
||||
out_err:
|
||||
pr_err("Initializing the qeth device driver failed\n");
|
||||
@@ -5595,13 +5577,11 @@ out_err:
|
||||
|
||||
static void __exit qeth_core_exit(void)
|
||||
{
|
||||
root_device_unregister(qeth_core_root_dev);
|
||||
driver_remove_file(&qeth_core_ccwgroup_driver.driver,
|
||||
&driver_attr_group);
|
||||
ccwgroup_driver_unregister(&qeth_core_ccwgroup_driver);
|
||||
ccw_driver_unregister(&qeth_ccw_driver);
|
||||
kmem_cache_destroy(qeth_qdio_outbuf_cache);
|
||||
kmem_cache_destroy(qeth_core_header_cache);
|
||||
root_device_unregister(qeth_core_root_dev);
|
||||
qeth_unregister_dbf_views();
|
||||
pr_info("core functions removed\n");
|
||||
}
|
||||
|
@@ -434,8 +434,8 @@ static ssize_t qeth_dev_layer2_store(struct device *dev,
|
||||
goto out;
|
||||
else {
|
||||
card->info.mac_bits = 0;
|
||||
if (card->discipline.ccwgdriver) {
|
||||
card->discipline.ccwgdriver->remove(card->gdev);
|
||||
if (card->discipline) {
|
||||
card->discipline->remove(card->gdev);
|
||||
qeth_core_free_discipline(card);
|
||||
}
|
||||
}
|
||||
@@ -444,7 +444,7 @@ static ssize_t qeth_dev_layer2_store(struct device *dev,
|
||||
if (rc)
|
||||
goto out;
|
||||
|
||||
rc = card->discipline.ccwgdriver->probe(card->gdev);
|
||||
rc = card->discipline->setup(card->gdev);
|
||||
out:
|
||||
mutex_unlock(&card->discipline_mutex);
|
||||
return rc ? rc : count;
|
||||
@@ -693,7 +693,6 @@ static struct attribute *qeth_blkt_device_attrs[] = {
|
||||
&dev_attr_inter_jumbo.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static struct attribute_group qeth_device_blkt_group = {
|
||||
.name = "blkt",
|
||||
.attrs = qeth_blkt_device_attrs,
|
||||
@@ -716,11 +715,16 @@ static struct attribute *qeth_device_attrs[] = {
|
||||
&dev_attr_hw_trap.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static struct attribute_group qeth_device_attr_group = {
|
||||
.attrs = qeth_device_attrs,
|
||||
};
|
||||
|
||||
const struct attribute_group *qeth_generic_attr_groups[] = {
|
||||
&qeth_device_attr_group,
|
||||
&qeth_device_blkt_group,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static struct attribute *qeth_osn_device_attrs[] = {
|
||||
&dev_attr_state.attr,
|
||||
&dev_attr_chpid.attr,
|
||||
@@ -730,37 +734,10 @@ static struct attribute *qeth_osn_device_attrs[] = {
|
||||
&dev_attr_recover.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static struct attribute_group qeth_osn_device_attr_group = {
|
||||
.attrs = qeth_osn_device_attrs,
|
||||
};
|
||||
|
||||
int qeth_core_create_device_attributes(struct device *dev)
|
||||
{
|
||||
int ret;
|
||||
ret = sysfs_create_group(&dev->kobj, &qeth_device_attr_group);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = sysfs_create_group(&dev->kobj, &qeth_device_blkt_group);
|
||||
if (ret)
|
||||
sysfs_remove_group(&dev->kobj, &qeth_device_attr_group);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void qeth_core_remove_device_attributes(struct device *dev)
|
||||
{
|
||||
sysfs_remove_group(&dev->kobj, &qeth_device_attr_group);
|
||||
sysfs_remove_group(&dev->kobj, &qeth_device_blkt_group);
|
||||
}
|
||||
|
||||
int qeth_core_create_osn_attributes(struct device *dev)
|
||||
{
|
||||
return sysfs_create_group(&dev->kobj, &qeth_osn_device_attr_group);
|
||||
}
|
||||
|
||||
void qeth_core_remove_osn_attributes(struct device *dev)
|
||||
{
|
||||
sysfs_remove_group(&dev->kobj, &qeth_osn_device_attr_group);
|
||||
return;
|
||||
}
|
||||
const struct attribute_group *qeth_osn_attr_groups[] = {
|
||||
&qeth_osn_device_attr_group,
|
||||
NULL,
|
||||
};
|
||||
|
@@ -882,12 +882,6 @@ static int qeth_l2_probe_device(struct ccwgroup_device *gdev)
|
||||
INIT_LIST_HEAD(&card->mc_list);
|
||||
card->options.layer2 = 1;
|
||||
card->info.hwtrap = 0;
|
||||
card->discipline.start_poll = qeth_qdio_start_poll;
|
||||
card->discipline.input_handler = (qdio_handler_t *)
|
||||
qeth_qdio_input_handler;
|
||||
card->discipline.output_handler = (qdio_handler_t *)
|
||||
qeth_qdio_output_handler;
|
||||
card->discipline.recover = qeth_l2_recover;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1227,8 +1221,12 @@ out:
|
||||
return rc;
|
||||
}
|
||||
|
||||
struct ccwgroup_driver qeth_l2_ccwgroup_driver = {
|
||||
.probe = qeth_l2_probe_device,
|
||||
struct qeth_discipline qeth_l2_discipline = {
|
||||
.start_poll = qeth_qdio_start_poll,
|
||||
.input_handler = (qdio_handler_t *) qeth_qdio_input_handler,
|
||||
.output_handler = (qdio_handler_t *) qeth_qdio_output_handler,
|
||||
.recover = qeth_l2_recover,
|
||||
.setup = qeth_l2_probe_device,
|
||||
.remove = qeth_l2_remove_device,
|
||||
.set_online = qeth_l2_set_online,
|
||||
.set_offline = qeth_l2_set_offline,
|
||||
@@ -1237,7 +1235,7 @@ struct ccwgroup_driver qeth_l2_ccwgroup_driver = {
|
||||
.thaw = qeth_l2_pm_resume,
|
||||
.restore = qeth_l2_pm_resume,
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(qeth_l2_ccwgroup_driver);
|
||||
EXPORT_SYMBOL_GPL(qeth_l2_discipline);
|
||||
|
||||
static int qeth_osn_send_control_data(struct qeth_card *card, int len,
|
||||
struct qeth_cmd_buffer *iob)
|
||||
|
@@ -3298,12 +3298,6 @@ static int qeth_l3_probe_device(struct ccwgroup_device *gdev)
|
||||
qeth_l3_create_device_attributes(&gdev->dev);
|
||||
card->options.layer2 = 0;
|
||||
card->info.hwtrap = 0;
|
||||
card->discipline.start_poll = qeth_qdio_start_poll;
|
||||
card->discipline.input_handler = (qdio_handler_t *)
|
||||
qeth_qdio_input_handler;
|
||||
card->discipline.output_handler = (qdio_handler_t *)
|
||||
qeth_qdio_output_handler;
|
||||
card->discipline.recover = qeth_l3_recover;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -3578,8 +3572,12 @@ out:
|
||||
return rc;
|
||||
}
|
||||
|
||||
struct ccwgroup_driver qeth_l3_ccwgroup_driver = {
|
||||
.probe = qeth_l3_probe_device,
|
||||
struct qeth_discipline qeth_l3_discipline = {
|
||||
.start_poll = qeth_qdio_start_poll,
|
||||
.input_handler = (qdio_handler_t *) qeth_qdio_input_handler,
|
||||
.output_handler = (qdio_handler_t *) qeth_qdio_output_handler,
|
||||
.recover = qeth_l3_recover,
|
||||
.setup = qeth_l3_probe_device,
|
||||
.remove = qeth_l3_remove_device,
|
||||
.set_online = qeth_l3_set_online,
|
||||
.set_offline = qeth_l3_set_offline,
|
||||
@@ -3588,7 +3586,7 @@ struct ccwgroup_driver qeth_l3_ccwgroup_driver = {
|
||||
.thaw = qeth_l3_pm_resume,
|
||||
.restore = qeth_l3_pm_resume,
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(qeth_l3_ccwgroup_driver);
|
||||
EXPORT_SYMBOL_GPL(qeth_l3_discipline);
|
||||
|
||||
static int qeth_l3_ip_event(struct notifier_block *this,
|
||||
unsigned long event, void *ptr)
|
||||
|
新增問題並參考
封鎖使用者