[SCSI] correct transport class abstraction to work outside SCSI
I recently tried to construct a totally generic transport class and found there were certain features missing from the current abstract transport class. Most notable is that you have to hang the data on the class_device but most of the API is framed in terms of the generic device, not the class_device. These changes are two fold - Provide the class_device to all of the setup and configure APIs - Provide and extra API to take the device and the attribute class and return the corresponding class_device Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
committed by
James Bottomley
parent
10c1b88987
commit
d0a7e57400
@@ -64,7 +64,9 @@ void transport_class_unregister(struct transport_class *tclass)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(transport_class_unregister);
|
||||
|
||||
static int anon_transport_dummy_function(struct device *dev)
|
||||
static int anon_transport_dummy_function(struct transport_container *tc,
|
||||
struct device *dev,
|
||||
struct class_device *cdev)
|
||||
{
|
||||
/* do nothing */
|
||||
return 0;
|
||||
@@ -115,9 +117,10 @@ static int transport_setup_classdev(struct attribute_container *cont,
|
||||
struct class_device *classdev)
|
||||
{
|
||||
struct transport_class *tclass = class_to_transport_class(cont->class);
|
||||
struct transport_container *tcont = attribute_container_to_transport_container(cont);
|
||||
|
||||
if (tclass->setup)
|
||||
tclass->setup(dev);
|
||||
tclass->setup(tcont, dev, classdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -178,12 +181,14 @@ void transport_add_device(struct device *dev)
|
||||
EXPORT_SYMBOL_GPL(transport_add_device);
|
||||
|
||||
static int transport_configure(struct attribute_container *cont,
|
||||
struct device *dev)
|
||||
struct device *dev,
|
||||
struct class_device *cdev)
|
||||
{
|
||||
struct transport_class *tclass = class_to_transport_class(cont->class);
|
||||
struct transport_container *tcont = attribute_container_to_transport_container(cont);
|
||||
|
||||
if (tclass->configure)
|
||||
tclass->configure(dev);
|
||||
tclass->configure(tcont, dev, cdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -202,7 +207,7 @@ static int transport_configure(struct attribute_container *cont,
|
||||
*/
|
||||
void transport_configure_device(struct device *dev)
|
||||
{
|
||||
attribute_container_trigger(dev, transport_configure);
|
||||
attribute_container_device_trigger(dev, transport_configure);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(transport_configure_device);
|
||||
|
||||
@@ -215,7 +220,7 @@ static int transport_remove_classdev(struct attribute_container *cont,
|
||||
struct transport_class *tclass = class_to_transport_class(cont->class);
|
||||
|
||||
if (tclass->remove)
|
||||
tclass->remove(dev);
|
||||
tclass->remove(tcont, dev, classdev);
|
||||
|
||||
if (tclass->remove != anon_transport_dummy_function) {
|
||||
if (tcont->statistics)
|
||||
|
Reference in New Issue
Block a user