From: Mika Westerberg <mika.westerberg@linux.intel.com>
To: linux-usb@vger.kernel.org
Cc: Michael Jamet <michael.jamet@intel.com>,
Yehezkel Bernat <YehezkelShB@gmail.com>,
Andreas Noever <andreas.noever@gmail.com>,
Isaac Hazan <isaac.hazan@intel.com>,
Mika Westerberg <mika.westerberg@linux.intel.com>,
Lukas Wunner <lukas@wunner.de>,
"David S . Miller" <davem@davemloft.net>,
Jakub Kicinski <kuba@kernel.org>,
netdev@vger.kernel.org
Subject: [PATCH 09/18] thunderbolt: Add tb_property_copy_dir()
Date: Thu, 4 Mar 2021 15:31:16 +0300 [thread overview]
Message-ID: <20210304123125.43630-10-mika.westerberg@linux.intel.com> (raw)
In-Reply-To: <20210304123125.43630-1-mika.westerberg@linux.intel.com>
This function takes a deep copy of the properties. We need this in order
to support more dynamic properties per XDomain connection as required by
the USB4 inter-domain service spec.
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
---
drivers/thunderbolt/property.c | 71 ++++++++++++++++++++++++++++++++++
include/linux/thunderbolt.h | 1 +
2 files changed, 72 insertions(+)
diff --git a/drivers/thunderbolt/property.c b/drivers/thunderbolt/property.c
index d5b0cdb8f0b1..dc555cda98e6 100644
--- a/drivers/thunderbolt/property.c
+++ b/drivers/thunderbolt/property.c
@@ -501,6 +501,77 @@ ssize_t tb_property_format_dir(const struct tb_property_dir *dir, u32 *block,
return ret < 0 ? ret : 0;
}
+/**
+ * tb_property_copy_dir() - Take a deep copy of directory
+ * @dir: Directory to copy
+ *
+ * This function takes a deep copy of @dir and returns back the copy. In
+ * case of error returns %NULL. The resulting directory needs to be
+ * released by calling tb_property_free_dir().
+ */
+struct tb_property_dir *tb_property_copy_dir(const struct tb_property_dir *dir)
+{
+ struct tb_property *property, *p = NULL;
+ struct tb_property_dir *d;
+
+ if (!dir)
+ return NULL;
+
+ d = tb_property_create_dir(dir->uuid);
+ if (!d)
+ return NULL;
+
+ list_for_each_entry(property, &dir->properties, list) {
+ struct tb_property *p;
+
+ p = tb_property_alloc(property->key, property->type);
+ if (!p)
+ goto err_free;
+
+ p->length = property->length;
+
+ switch (property->type) {
+ case TB_PROPERTY_TYPE_DIRECTORY:
+ p->value.dir = tb_property_copy_dir(property->value.dir);
+ if (!p->value.dir)
+ goto err_free;
+ break;
+
+ case TB_PROPERTY_TYPE_DATA:
+ p->value.data = kmemdup(property->value.data,
+ property->length * 4,
+ GFP_KERNEL);
+ if (!p->value.data)
+ goto err_free;
+ break;
+
+ case TB_PROPERTY_TYPE_TEXT:
+ p->value.text = kzalloc(p->length * 4, GFP_KERNEL);
+ if (!p->value.text)
+ goto err_free;
+ strcpy(p->value.text, property->value.text);
+ break;
+
+ case TB_PROPERTY_TYPE_VALUE:
+ p->value.immediate = property->value.immediate;
+ break;
+
+ default:
+ break;
+ }
+
+ list_add_tail(&p->list, &d->properties);
+ }
+
+ return d;
+
+err_free:
+ kfree(p);
+ tb_property_free_dir(d);
+
+ return NULL;
+}
+
/**
* tb_property_add_immediate() - Add immediate property to directory
* @parent: Directory to add the property
diff --git a/include/linux/thunderbolt.h b/include/linux/thunderbolt.h
index 7ec977161f5c..003a9ad29168 100644
--- a/include/linux/thunderbolt.h
+++ b/include/linux/thunderbolt.h
@@ -146,6 +146,7 @@ struct tb_property_dir *tb_property_parse_dir(const u32 *block,
size_t block_len);
ssize_t tb_property_format_dir(const struct tb_property_dir *dir, u32 *block,
size_t block_len);
+struct tb_property_dir *tb_property_copy_dir(const struct tb_property_dir *dir);
struct tb_property_dir *tb_property_create_dir(const uuid_t *uuid);
void tb_property_free_dir(struct tb_property_dir *dir);
int tb_property_add_immediate(struct tb_property_dir *parent, const char *key,
--
2.30.1
next prev parent reply other threads:[~2021-03-04 12:34 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-04 12:31 [PATCH 00/18] thunderbolt: Align with USB4 inter-domain and DROM specs Mika Westerberg
2021-03-04 12:31 ` [PATCH 01/18] thunderbolt: Disable retry logic for intra-domain control packets Mika Westerberg
2021-03-04 12:31 ` [PATCH 02/18] thunderbolt: Do not pass timeout for tb_cfg_reset() Mika Westerberg
2021-03-04 12:31 ` [PATCH 03/18] thunderbolt: Decrease control channel timeout for software connection manager Mika Westerberg
2021-03-04 12:31 ` [PATCH 04/18] Documentation / thunderbolt: Drop speed/lanes entries for XDomain Mika Westerberg
2021-03-04 12:31 ` [PATCH 05/18] thunderbolt: Add more logging to XDomain connections Mika Westerberg
2021-03-04 12:31 ` [PATCH 06/18] thunderbolt: Do not re-establish XDomain DMA paths automatically Mika Westerberg
2021-03-04 12:31 ` [PATCH 07/18] thunderbolt: Use pseudo-random number as initial property block generation Mika Westerberg
2021-03-04 12:31 ` [PATCH 08/18] thunderbolt: Align XDomain protocol timeouts with the spec Mika Westerberg
2021-03-04 12:31 ` Mika Westerberg [this message]
2021-03-04 12:31 ` [PATCH 10/18] thunderbolt: Add support for maxhopid XDomain property Mika Westerberg
2021-03-04 12:31 ` [PATCH 11/18] thunderbolt: Use dedicated flow control for DMA tunnels Mika Westerberg
2021-03-04 12:31 ` [PATCH 12/18] thunderbolt: Drop unused tb_port_set_initial_credits() Mika Westerberg
2021-03-04 12:31 ` [PATCH 13/18] thunderbolt: Allow multiple DMA tunnels over a single XDomain connection Mika Westerberg
2021-03-04 12:31 ` [PATCH 14/18] net: thunderbolt: Align the driver to the USB4 networking spec Mika Westerberg
2021-03-04 12:31 ` [PATCH 15/18] thunderbolt: Add KUnit tests for XDomain properties Mika Westerberg
2021-03-04 12:31 ` [PATCH 16/18] thunderbolt: Add KUnit tests for DMA tunnels Mika Westerberg
2021-03-04 12:31 ` [PATCH 17/18] thunderbolt: Check quirks in tb_switch_add() Mika Westerberg
2021-03-04 12:31 ` [PATCH 18/18] thunderbolt: Add support for USB4 DROM Mika Westerberg
2021-03-18 15:30 ` [PATCH 00/18] thunderbolt: Align with USB4 inter-domain and DROM specs Mika Westerberg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210304123125.43630-10-mika.westerberg@linux.intel.com \
--to=mika.westerberg@linux.intel.com \
--cc=YehezkelShB@gmail.com \
--cc=andreas.noever@gmail.com \
--cc=davem@davemloft.net \
--cc=isaac.hazan@intel.com \
--cc=kuba@kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=lukas@wunner.de \
--cc=michael.jamet@intel.com \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).