]> www.infradead.org Git - linux.git/commitdiff
ata: libata: Cleanup libata-transport
authorDamien Le Moal <dlemoal@kernel.org>
Mon, 19 Aug 2024 02:32:15 +0000 (11:32 +0900)
committerDamien Le Moal <dlemoal@kernel.org>
Sat, 7 Sep 2024 01:16:55 +0000 (10:16 +0900)
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>
drivers/ata/libata-transport.c

index 48800cd0e75d56f2132a299d157918176466aae3..d9a1888eac34d4831f1b3b0c424c6e6a981597dd 100644 (file)
@@ -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