mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 04:18:39 +08:00
ata: libata: Cleanup libata-transport
Move the ATA link transport device related functions after the ATA transport device related functions to avoid the need for forward declaring ata_tdev_add() and ata_tdev_delete(). And while at it, do the following: 1) Change ata_is_ata_dev() and ata_is_link() to return a boolean 2) Fix a pointer declaration style in ata_is_ata_dev() 3) Improve the kdoc comments for ata_tdev_free(), ata_tdev_delete(), ata_tdev_add(), ata_tlink_delete() and ata_tlink_add() No functional changes are introduced by this cleanup. Signed-off-by: Damien Le Moal <dlemoal@kernel.org> Reviewed-by: Hannes Reinecke <hare@suse.de> Reviewed-by: Niklas Cassel <cassel@kernel.org>
This commit is contained in:
parent
0f3e1eaaf7
commit
c494708d1f
@ -80,12 +80,6 @@ struct ata_internal {
|
||||
#define transport_class_to_port(dev) \
|
||||
tdev_to_port((dev)->parent)
|
||||
|
||||
|
||||
/* Device objects are always created whit link objects */
|
||||
static int ata_tdev_add(struct ata_device *dev);
|
||||
static void ata_tdev_delete(struct ata_device *dev);
|
||||
|
||||
|
||||
/*
|
||||
* Hack to allow attributes of the same name in different objects.
|
||||
*/
|
||||
@ -364,135 +358,6 @@ unsigned int ata_port_classify(struct ata_port *ap,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_port_classify);
|
||||
|
||||
/*
|
||||
* ATA link attributes
|
||||
*/
|
||||
static int noop(int x) { return x; }
|
||||
|
||||
#define ata_link_show_linkspeed(field, format) \
|
||||
static ssize_t \
|
||||
show_ata_link_##field(struct device *dev, \
|
||||
struct device_attribute *attr, char *buf) \
|
||||
{ \
|
||||
struct ata_link *link = transport_class_to_link(dev); \
|
||||
\
|
||||
return sprintf(buf, "%s\n", sata_spd_string(format(link->field))); \
|
||||
}
|
||||
|
||||
#define ata_link_linkspeed_attr(field, format) \
|
||||
ata_link_show_linkspeed(field, format) \
|
||||
static DEVICE_ATTR(field, S_IRUGO, show_ata_link_##field, NULL)
|
||||
|
||||
ata_link_linkspeed_attr(hw_sata_spd_limit, fls);
|
||||
ata_link_linkspeed_attr(sata_spd_limit, fls);
|
||||
ata_link_linkspeed_attr(sata_spd, noop);
|
||||
|
||||
|
||||
static DECLARE_TRANSPORT_CLASS(ata_link_class,
|
||||
"ata_link", NULL, NULL, NULL);
|
||||
|
||||
static void ata_tlink_release(struct device *dev)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_is_link -- check if a struct device represents a ATA link
|
||||
* @dev: device to check
|
||||
*
|
||||
* Returns:
|
||||
* %1 if the device represents a ATA link, %0 else
|
||||
*/
|
||||
static int ata_is_link(const struct device *dev)
|
||||
{
|
||||
return dev->release == ata_tlink_release;
|
||||
}
|
||||
|
||||
static int ata_tlink_match(struct attribute_container *cont,
|
||||
struct device *dev)
|
||||
{
|
||||
struct ata_internal* i = to_ata_internal(ata_scsi_transport_template);
|
||||
if (!ata_is_link(dev))
|
||||
return 0;
|
||||
return &i->link_attr_cont.ac == cont;
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_tlink_delete -- remove ATA LINK
|
||||
* @link: ATA LINK to remove
|
||||
*
|
||||
* Removes the specified ATA LINK. remove associated ATA device(s) as well.
|
||||
*/
|
||||
void ata_tlink_delete(struct ata_link *link)
|
||||
{
|
||||
struct device *dev = &link->tdev;
|
||||
struct ata_device *ata_dev;
|
||||
|
||||
ata_for_each_dev(ata_dev, link, ALL) {
|
||||
ata_tdev_delete(ata_dev);
|
||||
}
|
||||
|
||||
transport_remove_device(dev);
|
||||
device_del(dev);
|
||||
transport_destroy_device(dev);
|
||||
put_device(dev);
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_tlink_add -- initialize a transport ATA link structure
|
||||
* @link: allocated ata_link structure.
|
||||
*
|
||||
* Initialize an ATA LINK structure for sysfs. It will be added in the
|
||||
* device tree below the ATA PORT it belongs to.
|
||||
*
|
||||
* Returns %0 on success
|
||||
*/
|
||||
int ata_tlink_add(struct ata_link *link)
|
||||
{
|
||||
struct device *dev = &link->tdev;
|
||||
struct ata_port *ap = link->ap;
|
||||
struct ata_device *ata_dev;
|
||||
int error;
|
||||
|
||||
device_initialize(dev);
|
||||
dev->parent = &ap->tdev;
|
||||
dev->release = ata_tlink_release;
|
||||
if (ata_is_host_link(link))
|
||||
dev_set_name(dev, "link%d", ap->print_id);
|
||||
else
|
||||
dev_set_name(dev, "link%d.%d", ap->print_id, link->pmp);
|
||||
|
||||
transport_setup_device(dev);
|
||||
|
||||
error = device_add(dev);
|
||||
if (error) {
|
||||
goto tlink_err;
|
||||
}
|
||||
|
||||
error = transport_add_device(dev);
|
||||
if (error)
|
||||
goto tlink_transport_err;
|
||||
transport_configure_device(dev);
|
||||
|
||||
ata_for_each_dev(ata_dev, link, ALL) {
|
||||
error = ata_tdev_add(ata_dev);
|
||||
if (error) {
|
||||
goto tlink_dev_err;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
tlink_dev_err:
|
||||
while (--ata_dev >= link->device) {
|
||||
ata_tdev_delete(ata_dev);
|
||||
}
|
||||
transport_remove_device(dev);
|
||||
tlink_transport_err:
|
||||
device_del(dev);
|
||||
tlink_err:
|
||||
transport_destroy_device(dev);
|
||||
put_device(dev);
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* ATA device attributes
|
||||
*/
|
||||
@ -643,9 +508,9 @@ static void ata_tdev_release(struct device *dev)
|
||||
* @dev: device to check
|
||||
*
|
||||
* Returns:
|
||||
* %1 if the device represents a ATA device, %0 else
|
||||
* true if the device represents a ATA device, false otherwise
|
||||
*/
|
||||
static int ata_is_ata_dev(const struct device *dev)
|
||||
static bool ata_is_ata_dev(const struct device *dev)
|
||||
{
|
||||
return dev->release == ata_tdev_release;
|
||||
}
|
||||
@ -653,21 +518,22 @@ static int ata_is_ata_dev(const struct device *dev)
|
||||
static int ata_tdev_match(struct attribute_container *cont,
|
||||
struct device *dev)
|
||||
{
|
||||
struct ata_internal* i = to_ata_internal(ata_scsi_transport_template);
|
||||
struct ata_internal *i = to_ata_internal(ata_scsi_transport_template);
|
||||
|
||||
if (!ata_is_ata_dev(dev))
|
||||
return 0;
|
||||
return &i->dev_attr_cont.ac == cont;
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_tdev_free -- free a ATA LINK
|
||||
* @dev: ATA PHY to free
|
||||
* ata_tdev_free -- free an ATA transport device
|
||||
* @dev: struct ata_device owning the transport device to free
|
||||
*
|
||||
* Frees the specified ATA PHY.
|
||||
* Free the ATA transport device for the specified ATA device.
|
||||
*
|
||||
* Note:
|
||||
* This function must only be called on a PHY that has not
|
||||
* successfully been added using ata_tdev_add().
|
||||
* This function must only be called for a ATA transport device that has not
|
||||
* yet successfully been added using ata_tdev_add().
|
||||
*/
|
||||
static void ata_tdev_free(struct ata_device *dev)
|
||||
{
|
||||
@ -676,10 +542,10 @@ static void ata_tdev_free(struct ata_device *dev)
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_tdev_delete -- remove ATA device
|
||||
* @ata_dev: ATA device to remove
|
||||
* ata_tdev_delete -- remove an ATA transport device
|
||||
* @ata_dev: struct ata_device owning the transport device to delete
|
||||
*
|
||||
* Removes the specified ATA device.
|
||||
* Removes the ATA transport device for the specified ATA device.
|
||||
*/
|
||||
static void ata_tdev_delete(struct ata_device *ata_dev)
|
||||
{
|
||||
@ -690,15 +556,14 @@ static void ata_tdev_delete(struct ata_device *ata_dev)
|
||||
ata_tdev_free(ata_dev);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* ata_tdev_add -- initialize a transport ATA device structure.
|
||||
* @ata_dev: ata_dev structure.
|
||||
* ata_tdev_add -- initialize an ATA transport device
|
||||
* @ata_dev: struct ata_device owning the transport device to add
|
||||
*
|
||||
* Initialize an ATA device structure for sysfs. It will be added in the
|
||||
* device tree below the ATA LINK device it belongs to.
|
||||
* Initialize an ATA transport device for sysfs. It will be added in the
|
||||
* device tree below the ATA link device it belongs to.
|
||||
*
|
||||
* Returns %0 on success
|
||||
* Returns %0 on success and a negative error code on error.
|
||||
*/
|
||||
static int ata_tdev_add(struct ata_device *ata_dev)
|
||||
{
|
||||
@ -734,6 +599,136 @@ static int ata_tdev_add(struct ata_device *ata_dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* ATA link attributes
|
||||
*/
|
||||
static int noop(int x)
|
||||
{
|
||||
return x;
|
||||
}
|
||||
|
||||
#define ata_link_show_linkspeed(field, format) \
|
||||
static ssize_t \
|
||||
show_ata_link_##field(struct device *dev, \
|
||||
struct device_attribute *attr, char *buf) \
|
||||
{ \
|
||||
struct ata_link *link = transport_class_to_link(dev); \
|
||||
\
|
||||
return sprintf(buf, "%s\n", \
|
||||
sata_spd_string(format(link->field))); \
|
||||
}
|
||||
|
||||
#define ata_link_linkspeed_attr(field, format) \
|
||||
ata_link_show_linkspeed(field, format) \
|
||||
static DEVICE_ATTR(field, 0444, show_ata_link_##field, NULL)
|
||||
|
||||
ata_link_linkspeed_attr(hw_sata_spd_limit, fls);
|
||||
ata_link_linkspeed_attr(sata_spd_limit, fls);
|
||||
ata_link_linkspeed_attr(sata_spd, noop);
|
||||
|
||||
static DECLARE_TRANSPORT_CLASS(ata_link_class,
|
||||
"ata_link", NULL, NULL, NULL);
|
||||
|
||||
static void ata_tlink_release(struct device *dev)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_is_link -- check if a struct device represents a ATA link
|
||||
* @dev: device to check
|
||||
*
|
||||
* Returns:
|
||||
* true if the device represents a ATA link, false otherwise
|
||||
*/
|
||||
static bool ata_is_link(const struct device *dev)
|
||||
{
|
||||
return dev->release == ata_tlink_release;
|
||||
}
|
||||
|
||||
static int ata_tlink_match(struct attribute_container *cont,
|
||||
struct device *dev)
|
||||
{
|
||||
struct ata_internal *i = to_ata_internal(ata_scsi_transport_template);
|
||||
|
||||
if (!ata_is_link(dev))
|
||||
return 0;
|
||||
return &i->link_attr_cont.ac == cont;
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_tlink_delete -- remove an ATA link transport device
|
||||
* @link: struct ata_link owning the link transport device to remove
|
||||
*
|
||||
* Removes the link transport device of the specified ATA link. This also
|
||||
* removes the ATA device(s) associated with the link as well.
|
||||
*/
|
||||
void ata_tlink_delete(struct ata_link *link)
|
||||
{
|
||||
struct device *dev = &link->tdev;
|
||||
struct ata_device *ata_dev;
|
||||
|
||||
ata_for_each_dev(ata_dev, link, ALL) {
|
||||
ata_tdev_delete(ata_dev);
|
||||
}
|
||||
|
||||
transport_remove_device(dev);
|
||||
device_del(dev);
|
||||
transport_destroy_device(dev);
|
||||
put_device(dev);
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_tlink_add -- initialize an ATA link transport device
|
||||
* @ata_link: struct ata_link owning the link transport device to initialize
|
||||
*
|
||||
* Initialize an ATA link transport device for sysfs. It will be added in the
|
||||
* device tree below the ATA port it belongs to.
|
||||
*
|
||||
* Returns %0 on success and a negative error code on error.
|
||||
*/
|
||||
int ata_tlink_add(struct ata_link *link)
|
||||
{
|
||||
struct device *dev = &link->tdev;
|
||||
struct ata_port *ap = link->ap;
|
||||
struct ata_device *ata_dev;
|
||||
int error;
|
||||
|
||||
device_initialize(dev);
|
||||
dev->parent = &ap->tdev;
|
||||
dev->release = ata_tlink_release;
|
||||
if (ata_is_host_link(link))
|
||||
dev_set_name(dev, "link%d", ap->print_id);
|
||||
else
|
||||
dev_set_name(dev, "link%d.%d", ap->print_id, link->pmp);
|
||||
|
||||
transport_setup_device(dev);
|
||||
|
||||
error = device_add(dev);
|
||||
if (error)
|
||||
goto tlink_err;
|
||||
|
||||
error = transport_add_device(dev);
|
||||
if (error)
|
||||
goto tlink_transport_err;
|
||||
transport_configure_device(dev);
|
||||
|
||||
ata_for_each_dev(ata_dev, link, ALL) {
|
||||
error = ata_tdev_add(ata_dev);
|
||||
if (error)
|
||||
goto tlink_dev_err;
|
||||
}
|
||||
return 0;
|
||||
tlink_dev_err:
|
||||
while (--ata_dev >= link->device)
|
||||
ata_tdev_delete(ata_dev);
|
||||
transport_remove_device(dev);
|
||||
tlink_transport_err:
|
||||
device_del(dev);
|
||||
tlink_err:
|
||||
transport_destroy_device(dev);
|
||||
put_device(dev);
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* Setup / Teardown code
|
||||
|
Loading…
Reference in New Issue
Block a user