All of lore.kernel.org
 help / color / mirror / Atom feed
From: Allen Pais <allen.lkml@gmail.com>
To: herbert@gondor.apana.org.au
Cc: davem@davemloft.net, nicolas.ferre@microchip.com,
	alexandre.belloni@bootlin.com, ludovic.desroches@microchip.com,
	jesper.nilsson@axis.com, lars.persson@axis.com,
	horia.geanta@nxp.com, aymen.sghaier@nxp.com,
	gcherian@marvell.com, thomas.lendacky@amd.com,
	john.allen@amd.com, gilad@benyossef.com, bbrezillon@kernel.org,
	arno@natisbad.org, schalla@marvell.com, matthias.bgg@gmail.com,
	jamie@jamieiles.com, giovanni.cabiddu@intel.com, heiko@sntech.de,
	krzk@kernel.org, vz@mleia.com, k.konieczny@samsung.com,
	linux-crypto@vger.kernel.org, linux-mediatek@lists.infradead.org,
	qat-linux@intel.com, linux-rockchip@lists.infradead.org,
	linux-samsung-soc@vger.kernel.org,
	Allen Pais <apais@linux.microsoft.com>,
	Romain Perier <romain.perier@gmail.com>
Subject: [PATCH v2 07/19] crypto: ccree: convert tasklets to use new tasklet_setup() API
Date: Thu,  7 Jan 2021 17:59:32 +0530	[thread overview]
Message-ID: <20210107122944.16363-4-allen.lkml@gmail.com> (raw)
In-Reply-To: <20210107122944.16363-1-allen.lkml@gmail.com>

From: Allen Pais <apais@linux.microsoft.com>

In preparation for unconditionally passing the
struct tasklet_struct pointer to all tasklet
callbacks, switch to using the new tasklet_setup()
and from_tasklet() to pass the tasklet pointer explicitly.

Signed-off-by: Romain Perier <romain.perier@gmail.com>
Signed-off-by: Allen Pais <apais@linux.microsoft.com>
---
 drivers/crypto/ccree/cc_fips.c        |  8 ++++----
 drivers/crypto/ccree/cc_request_mgr.c | 12 ++++++------
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/drivers/crypto/ccree/cc_fips.c b/drivers/crypto/ccree/cc_fips.c
index 702aefc21447..c1d03d99e3c3 100644
--- a/drivers/crypto/ccree/cc_fips.c
+++ b/drivers/crypto/ccree/cc_fips.c
@@ -8,7 +8,7 @@
 #include "cc_driver.h"
 #include "cc_fips.h"
 
-static void fips_dsr(unsigned long devarg);
+static void fips_dsr(struct tasklet_struct *tsk);
 
 struct cc_fips_handle {
 	struct tasklet_struct tasklet;
@@ -109,9 +109,9 @@ void cc_tee_handle_fips_error(struct cc_drvdata *p_drvdata)
 }
 
 /* Deferred service handler, run as interrupt-fired tasklet */
-static void fips_dsr(unsigned long devarg)
+static void fips_dsr(struct tasklet_struct *tsk)
 {
-	struct cc_drvdata *drvdata = (struct cc_drvdata *)devarg;
+	struct cc_drvdata *drvdata = from_tasklet(drvdata, tsk, tasklet);
 	u32 irq, val;
 
 	irq = (drvdata->irq & (CC_GPR0_IRQ_MASK));
@@ -143,7 +143,7 @@ int cc_fips_init(struct cc_drvdata *p_drvdata)
 	p_drvdata->fips_handle = fips_h;
 
 	dev_dbg(dev, "Initializing fips tasklet\n");
-	tasklet_init(&fips_h->tasklet, fips_dsr, (unsigned long)p_drvdata);
+	tasklet_setup(&fips_h->tasklet, fips_dsr);
 	fips_h->drvdata = p_drvdata;
 	fips_h->nb.notifier_call = cc_ree_fips_failure;
 	atomic_notifier_chain_register(&fips_fail_notif_chain, &fips_h->nb);
diff --git a/drivers/crypto/ccree/cc_request_mgr.c b/drivers/crypto/ccree/cc_request_mgr.c
index 33fb27745d52..ec0f3bf00d33 100644
--- a/drivers/crypto/ccree/cc_request_mgr.c
+++ b/drivers/crypto/ccree/cc_request_mgr.c
@@ -70,7 +70,7 @@ static const u32 cc_cpp_int_masks[CC_CPP_NUM_ALGS][CC_CPP_NUM_SLOTS] = {
 	  BIT(CC_HOST_IRR_REE_OP_ABORTED_SM_7_INT_BIT_SHIFT) }
 };
 
-static void comp_handler(unsigned long devarg);
+static void comp_handler(struct tasklet_struct *t);
 #ifdef COMP_IN_WQ
 static void comp_work_handler(struct work_struct *work);
 #endif
@@ -140,8 +140,7 @@ int cc_req_mgr_init(struct cc_drvdata *drvdata)
 	INIT_DELAYED_WORK(&req_mgr_h->compwork, comp_work_handler);
 #else
 	dev_dbg(dev, "Initializing completion tasklet\n");
-	tasklet_init(&req_mgr_h->comptask, comp_handler,
-		     (unsigned long)drvdata);
+	tasklet_setup(&req_mgr_h->comptask, comp_handler);
 #endif
 	req_mgr_h->hw_queue_size = cc_ioread(drvdata,
 					     CC_REG(DSCRPTR_QUEUE_SRAM_SIZE));
@@ -611,11 +610,12 @@ static inline u32 cc_axi_comp_count(struct cc_drvdata *drvdata)
 }
 
 /* Deferred service handler, run as interrupt-fired tasklet */
-static void comp_handler(unsigned long devarg)
+static void comp_handler(struct tasklet_struct *t)
 {
-	struct cc_drvdata *drvdata = (struct cc_drvdata *)devarg;
 	struct cc_req_mgr_handle *request_mgr_handle =
-						drvdata->request_mgr_handle;
+				from_tasklet(request_mgr_handle, t, comptask);
+	struct cc_drvdata *drvdata = container_of((void *)request_mgr_handle,
+				     typeof(*drvdata), request_mgr_handle);
 	struct device *dev = drvdata_to_dev(drvdata);
 	u32 irq;
 
-- 
2.25.1


WARNING: multiple messages have this Message-ID (diff)
From: Allen Pais <allen.lkml@gmail.com>
To: herbert@gondor.apana.org.au
Cc: giovanni.cabiddu@intel.com, alexandre.belloni@bootlin.com,
	aymen.sghaier@nxp.com, heiko@sntech.de, qat-linux@intel.com,
	jamie@jamieiles.com, jesper.nilsson@axis.com,
	linux-samsung-soc@vger.kernel.org, horia.geanta@nxp.com,
	k.konieczny@samsung.com, schalla@marvell.com, krzk@kernel.org,
	linux-rockchip@lists.infradead.org,
	ludovic.desroches@microchip.com, thomas.lendacky@amd.com,
	arno@natisbad.org, vz@mleia.com, gilad@benyossef.com,
	gcherian@marvell.com, linux-mediatek@lists.infradead.org,
	lars.persson@axis.com, matthias.bgg@gmail.com,
	Allen Pais <apais@linux.microsoft.com>,
	john.allen@amd.com, bbrezillon@kernel.org,
	nicolas.ferre@microchip.com, linux-crypto@vger.kernel.org,
	Romain Perier <romain.perier@gmail.com>,
	davem@davemloft.net
Subject: [PATCH v2 07/19] crypto: ccree: convert tasklets to use new tasklet_setup() API
Date: Thu,  7 Jan 2021 17:59:32 +0530	[thread overview]
Message-ID: <20210107122944.16363-4-allen.lkml@gmail.com> (raw)
In-Reply-To: <20210107122944.16363-1-allen.lkml@gmail.com>

From: Allen Pais <apais@linux.microsoft.com>

In preparation for unconditionally passing the
struct tasklet_struct pointer to all tasklet
callbacks, switch to using the new tasklet_setup()
and from_tasklet() to pass the tasklet pointer explicitly.

Signed-off-by: Romain Perier <romain.perier@gmail.com>
Signed-off-by: Allen Pais <apais@linux.microsoft.com>
---
 drivers/crypto/ccree/cc_fips.c        |  8 ++++----
 drivers/crypto/ccree/cc_request_mgr.c | 12 ++++++------
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/drivers/crypto/ccree/cc_fips.c b/drivers/crypto/ccree/cc_fips.c
index 702aefc21447..c1d03d99e3c3 100644
--- a/drivers/crypto/ccree/cc_fips.c
+++ b/drivers/crypto/ccree/cc_fips.c
@@ -8,7 +8,7 @@
 #include "cc_driver.h"
 #include "cc_fips.h"
 
-static void fips_dsr(unsigned long devarg);
+static void fips_dsr(struct tasklet_struct *tsk);
 
 struct cc_fips_handle {
 	struct tasklet_struct tasklet;
@@ -109,9 +109,9 @@ void cc_tee_handle_fips_error(struct cc_drvdata *p_drvdata)
 }
 
 /* Deferred service handler, run as interrupt-fired tasklet */
-static void fips_dsr(unsigned long devarg)
+static void fips_dsr(struct tasklet_struct *tsk)
 {
-	struct cc_drvdata *drvdata = (struct cc_drvdata *)devarg;
+	struct cc_drvdata *drvdata = from_tasklet(drvdata, tsk, tasklet);
 	u32 irq, val;
 
 	irq = (drvdata->irq & (CC_GPR0_IRQ_MASK));
@@ -143,7 +143,7 @@ int cc_fips_init(struct cc_drvdata *p_drvdata)
 	p_drvdata->fips_handle = fips_h;
 
 	dev_dbg(dev, "Initializing fips tasklet\n");
-	tasklet_init(&fips_h->tasklet, fips_dsr, (unsigned long)p_drvdata);
+	tasklet_setup(&fips_h->tasklet, fips_dsr);
 	fips_h->drvdata = p_drvdata;
 	fips_h->nb.notifier_call = cc_ree_fips_failure;
 	atomic_notifier_chain_register(&fips_fail_notif_chain, &fips_h->nb);
diff --git a/drivers/crypto/ccree/cc_request_mgr.c b/drivers/crypto/ccree/cc_request_mgr.c
index 33fb27745d52..ec0f3bf00d33 100644
--- a/drivers/crypto/ccree/cc_request_mgr.c
+++ b/drivers/crypto/ccree/cc_request_mgr.c
@@ -70,7 +70,7 @@ static const u32 cc_cpp_int_masks[CC_CPP_NUM_ALGS][CC_CPP_NUM_SLOTS] = {
 	  BIT(CC_HOST_IRR_REE_OP_ABORTED_SM_7_INT_BIT_SHIFT) }
 };
 
-static void comp_handler(unsigned long devarg);
+static void comp_handler(struct tasklet_struct *t);
 #ifdef COMP_IN_WQ
 static void comp_work_handler(struct work_struct *work);
 #endif
@@ -140,8 +140,7 @@ int cc_req_mgr_init(struct cc_drvdata *drvdata)
 	INIT_DELAYED_WORK(&req_mgr_h->compwork, comp_work_handler);
 #else
 	dev_dbg(dev, "Initializing completion tasklet\n");
-	tasklet_init(&req_mgr_h->comptask, comp_handler,
-		     (unsigned long)drvdata);
+	tasklet_setup(&req_mgr_h->comptask, comp_handler);
 #endif
 	req_mgr_h->hw_queue_size = cc_ioread(drvdata,
 					     CC_REG(DSCRPTR_QUEUE_SRAM_SIZE));
@@ -611,11 +610,12 @@ static inline u32 cc_axi_comp_count(struct cc_drvdata *drvdata)
 }
 
 /* Deferred service handler, run as interrupt-fired tasklet */
-static void comp_handler(unsigned long devarg)
+static void comp_handler(struct tasklet_struct *t)
 {
-	struct cc_drvdata *drvdata = (struct cc_drvdata *)devarg;
 	struct cc_req_mgr_handle *request_mgr_handle =
-						drvdata->request_mgr_handle;
+				from_tasklet(request_mgr_handle, t, comptask);
+	struct cc_drvdata *drvdata = container_of((void *)request_mgr_handle,
+				     typeof(*drvdata), request_mgr_handle);
 	struct device *dev = drvdata_to_dev(drvdata);
 	u32 irq;
 
-- 
2.25.1


_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip

WARNING: multiple messages have this Message-ID (diff)
From: Allen Pais <allen.lkml@gmail.com>
To: herbert@gondor.apana.org.au
Cc: giovanni.cabiddu@intel.com, alexandre.belloni@bootlin.com,
	aymen.sghaier@nxp.com, heiko@sntech.de, qat-linux@intel.com,
	jamie@jamieiles.com, jesper.nilsson@axis.com,
	linux-samsung-soc@vger.kernel.org, horia.geanta@nxp.com,
	k.konieczny@samsung.com, schalla@marvell.com, krzk@kernel.org,
	linux-rockchip@lists.infradead.org,
	ludovic.desroches@microchip.com, thomas.lendacky@amd.com,
	arno@natisbad.org, vz@mleia.com, gilad@benyossef.com,
	gcherian@marvell.com, linux-mediatek@lists.infradead.org,
	lars.persson@axis.com, matthias.bgg@gmail.com,
	Allen Pais <apais@linux.microsoft.com>,
	john.allen@amd.com, bbrezillon@kernel.org,
	nicolas.ferre@microchip.com, linux-crypto@vger.kernel.org,
	Romain Perier <romain.perier@gmail.com>,
	davem@davemloft.net
Subject: [PATCH v2 07/19] crypto: ccree: convert tasklets to use new tasklet_setup() API
Date: Thu,  7 Jan 2021 17:59:32 +0530	[thread overview]
Message-ID: <20210107122944.16363-4-allen.lkml@gmail.com> (raw)
In-Reply-To: <20210107122944.16363-1-allen.lkml@gmail.com>

From: Allen Pais <apais@linux.microsoft.com>

In preparation for unconditionally passing the
struct tasklet_struct pointer to all tasklet
callbacks, switch to using the new tasklet_setup()
and from_tasklet() to pass the tasklet pointer explicitly.

Signed-off-by: Romain Perier <romain.perier@gmail.com>
Signed-off-by: Allen Pais <apais@linux.microsoft.com>
---
 drivers/crypto/ccree/cc_fips.c        |  8 ++++----
 drivers/crypto/ccree/cc_request_mgr.c | 12 ++++++------
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/drivers/crypto/ccree/cc_fips.c b/drivers/crypto/ccree/cc_fips.c
index 702aefc21447..c1d03d99e3c3 100644
--- a/drivers/crypto/ccree/cc_fips.c
+++ b/drivers/crypto/ccree/cc_fips.c
@@ -8,7 +8,7 @@
 #include "cc_driver.h"
 #include "cc_fips.h"
 
-static void fips_dsr(unsigned long devarg);
+static void fips_dsr(struct tasklet_struct *tsk);
 
 struct cc_fips_handle {
 	struct tasklet_struct tasklet;
@@ -109,9 +109,9 @@ void cc_tee_handle_fips_error(struct cc_drvdata *p_drvdata)
 }
 
 /* Deferred service handler, run as interrupt-fired tasklet */
-static void fips_dsr(unsigned long devarg)
+static void fips_dsr(struct tasklet_struct *tsk)
 {
-	struct cc_drvdata *drvdata = (struct cc_drvdata *)devarg;
+	struct cc_drvdata *drvdata = from_tasklet(drvdata, tsk, tasklet);
 	u32 irq, val;
 
 	irq = (drvdata->irq & (CC_GPR0_IRQ_MASK));
@@ -143,7 +143,7 @@ int cc_fips_init(struct cc_drvdata *p_drvdata)
 	p_drvdata->fips_handle = fips_h;
 
 	dev_dbg(dev, "Initializing fips tasklet\n");
-	tasklet_init(&fips_h->tasklet, fips_dsr, (unsigned long)p_drvdata);
+	tasklet_setup(&fips_h->tasklet, fips_dsr);
 	fips_h->drvdata = p_drvdata;
 	fips_h->nb.notifier_call = cc_ree_fips_failure;
 	atomic_notifier_chain_register(&fips_fail_notif_chain, &fips_h->nb);
diff --git a/drivers/crypto/ccree/cc_request_mgr.c b/drivers/crypto/ccree/cc_request_mgr.c
index 33fb27745d52..ec0f3bf00d33 100644
--- a/drivers/crypto/ccree/cc_request_mgr.c
+++ b/drivers/crypto/ccree/cc_request_mgr.c
@@ -70,7 +70,7 @@ static const u32 cc_cpp_int_masks[CC_CPP_NUM_ALGS][CC_CPP_NUM_SLOTS] = {
 	  BIT(CC_HOST_IRR_REE_OP_ABORTED_SM_7_INT_BIT_SHIFT) }
 };
 
-static void comp_handler(unsigned long devarg);
+static void comp_handler(struct tasklet_struct *t);
 #ifdef COMP_IN_WQ
 static void comp_work_handler(struct work_struct *work);
 #endif
@@ -140,8 +140,7 @@ int cc_req_mgr_init(struct cc_drvdata *drvdata)
 	INIT_DELAYED_WORK(&req_mgr_h->compwork, comp_work_handler);
 #else
 	dev_dbg(dev, "Initializing completion tasklet\n");
-	tasklet_init(&req_mgr_h->comptask, comp_handler,
-		     (unsigned long)drvdata);
+	tasklet_setup(&req_mgr_h->comptask, comp_handler);
 #endif
 	req_mgr_h->hw_queue_size = cc_ioread(drvdata,
 					     CC_REG(DSCRPTR_QUEUE_SRAM_SIZE));
@@ -611,11 +610,12 @@ static inline u32 cc_axi_comp_count(struct cc_drvdata *drvdata)
 }
 
 /* Deferred service handler, run as interrupt-fired tasklet */
-static void comp_handler(unsigned long devarg)
+static void comp_handler(struct tasklet_struct *t)
 {
-	struct cc_drvdata *drvdata = (struct cc_drvdata *)devarg;
 	struct cc_req_mgr_handle *request_mgr_handle =
-						drvdata->request_mgr_handle;
+				from_tasklet(request_mgr_handle, t, comptask);
+	struct cc_drvdata *drvdata = container_of((void *)request_mgr_handle,
+				     typeof(*drvdata), request_mgr_handle);
 	struct device *dev = drvdata_to_dev(drvdata);
 	u32 irq;
 
-- 
2.25.1


_______________________________________________
Linux-mediatek mailing list
Linux-mediatek@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-mediatek

  parent reply	other threads:[~2021-01-07 12:31 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-07 12:29 [PATCH v2 04/19] crypto: caam: convert tasklets to use new tasklet_setup() API Allen Pais
2021-01-07 12:29 ` Allen Pais
2021-01-07 12:29 ` Allen Pais
2021-01-07 12:29 ` [PATCH v2 05/19] crypto: cavium: " Allen Pais
2021-01-07 12:29   ` Allen Pais
2021-01-07 12:29   ` Allen Pais
2021-01-07 12:29 ` [PATCH v2 06/19] crypto: ccp: " Allen Pais
2021-01-07 12:29   ` Allen Pais
2021-01-07 12:29   ` Allen Pais
2021-01-07 12:29 ` Allen Pais [this message]
2021-01-07 12:29   ` [PATCH v2 07/19] crypto: ccree: " Allen Pais
2021-01-07 12:29   ` Allen Pais
2021-01-07 12:29 ` [PATCH v2 08/19] crypto: hifn_795x: " Allen Pais
2021-01-07 12:29   ` Allen Pais
2021-01-07 12:29   ` Allen Pais
2021-01-07 12:29 ` [PATCH v2 09/19] crypto: img-hash: " Allen Pais
2021-01-07 12:29   ` Allen Pais
2021-01-07 12:29   ` Allen Pais
2021-01-07 12:29 ` [PATCH v2 10/19] crypto: ixp4xx: " Allen Pais
2021-01-07 12:29   ` Allen Pais
2021-01-07 12:29   ` Allen Pais
2021-01-07 12:29 ` [PATCH v2 11/19] crypto: mediatek: " Allen Pais
2021-01-07 12:29   ` Allen Pais
2021-01-07 12:29   ` Allen Pais
2021-01-07 12:29 ` [PATCH v2 12/19] crypto: omap: " Allen Pais
2021-01-07 12:29   ` Allen Pais
2021-01-07 12:29   ` Allen Pais
2021-01-07 12:29 ` [PATCH v2 13/19] crypto: picoxcell: " Allen Pais
2021-01-07 12:29   ` Allen Pais
2021-01-07 12:29   ` Allen Pais
2021-01-07 12:29 ` [PATCH v2 14/19] crypto: qat: " Allen Pais
2021-01-07 12:29   ` Allen Pais
2021-01-07 12:29   ` Allen Pais
2021-01-07 12:29 ` [PATCH v2 15/19] crypto: qce: " Allen Pais
2021-01-07 12:29   ` Allen Pais
2021-01-07 12:29   ` Allen Pais
2021-01-07 12:29 ` [PATCH v2 16/19] crypto: rockchip: " Allen Pais
2021-01-07 12:29   ` Allen Pais
2021-01-07 12:29   ` Allen Pais
2021-01-07 12:40   ` Emil Renner Berthing
2021-01-07 12:40     ` Emil Renner Berthing
2021-01-07 12:40     ` Emil Renner Berthing
2021-01-07 12:45     ` Allen Pais
2021-01-07 12:45       ` Allen Pais
2021-01-07 12:45       ` Allen Pais
2021-01-07 12:29 ` [PATCH v2 17/19] crypto: s5p: " Allen Pais
2021-01-07 12:29   ` Allen Pais
2021-01-07 12:29   ` Allen Pais
2021-01-07 12:29 ` [PATCH v2 18/19] crypto: talitos: " Allen Pais
2021-01-07 12:29   ` Allen Pais
2021-01-07 12:29   ` Allen Pais
2021-01-07 12:29 ` [PATCH v2 19/19] crypto: octeontx: " Allen Pais
2021-01-07 12:29   ` Allen Pais
2021-01-07 12:29   ` Allen Pais

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=20210107122944.16363-4-allen.lkml@gmail.com \
    --to=allen.lkml@gmail.com \
    --cc=alexandre.belloni@bootlin.com \
    --cc=apais@linux.microsoft.com \
    --cc=arno@natisbad.org \
    --cc=aymen.sghaier@nxp.com \
    --cc=bbrezillon@kernel.org \
    --cc=davem@davemloft.net \
    --cc=gcherian@marvell.com \
    --cc=gilad@benyossef.com \
    --cc=giovanni.cabiddu@intel.com \
    --cc=heiko@sntech.de \
    --cc=herbert@gondor.apana.org.au \
    --cc=horia.geanta@nxp.com \
    --cc=jamie@jamieiles.com \
    --cc=jesper.nilsson@axis.com \
    --cc=john.allen@amd.com \
    --cc=k.konieczny@samsung.com \
    --cc=krzk@kernel.org \
    --cc=lars.persson@axis.com \
    --cc=linux-crypto@vger.kernel.org \
    --cc=linux-mediatek@lists.infradead.org \
    --cc=linux-rockchip@lists.infradead.org \
    --cc=linux-samsung-soc@vger.kernel.org \
    --cc=ludovic.desroches@microchip.com \
    --cc=matthias.bgg@gmail.com \
    --cc=nicolas.ferre@microchip.com \
    --cc=qat-linux@intel.com \
    --cc=romain.perier@gmail.com \
    --cc=schalla@marvell.com \
    --cc=thomas.lendacky@amd.com \
    --cc=vz@mleia.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.