Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1332169 > unrolled thread
| Started by | Arnd Bergmann <arnd@arndb.de> |
|---|---|
| First post | 2016-02-11 16:50 +0100 |
| Last post | 2016-02-11 16:50 +0100 |
| Articles | 9 — 3 participants |
Back to article view | Back to linux.kernel
[PATCH v2 0/6] serial: 8250: fixes for modular build Arnd Bergmann <arnd@arndb.de> - 2016-02-11 16:50 +0100
[PATCH v2 6/6] serial: 8250/ingenic: fix building with SERIAL_8250=m Arnd Bergmann <arnd@arndb.de> - 2016-02-11 16:50 +0100
Re: [PATCH v2 6/6] serial: 8250/ingenic: fix building with SERIAL_8250=m Masahiro Yamada <yamada.masahiro@socionext.com> - 2016-02-12 10:50 +0100
[PATCH v2 1/6] Revert "drivers/tty/serial: make 8250/8250_mtk.c explicitly non-modular" Arnd Bergmann <arnd@arndb.de> - 2016-02-11 16:50 +0100
Re: [PATCH v2 1/6] Revert "drivers/tty/serial: make 8250/8250_mtk.c explicitly non-modular" Paul Gortmaker <paul.gortmaker@windriver.com> - 2016-02-11 17:10 +0100
Re: [PATCH v2 1/6] Revert "drivers/tty/serial: make 8250/8250_mtk.c explicitly non-modular" Arnd Bergmann <arnd@arndb.de> - 2016-02-11 17:20 +0100
Re: [PATCH v2 1/6] Revert "drivers/tty/serial: make 8250/8250_mtk.c explicitly non-modular" Paul Gortmaker <paul.gortmaker@windriver.com> - 2016-02-11 17:30 +0100
Re: [PATCH v2 1/6] Revert "drivers/tty/serial: make 8250/8250_mtk.c explicitly non-modular" Arnd Bergmann <arnd@arndb.de> - 2016-02-11 17:40 +0100
[PATCH v2 3/6] serial: 8250/mediatek: mark PM functions as __maybe_unused Arnd Bergmann <arnd@arndb.de> - 2016-02-11 16:50 +0100
| From | Arnd Bergmann <arnd@arndb.de> |
|---|---|
| Date | 2016-02-11 16:50 +0100 |
| Subject | [PATCH v2 0/6] serial: 8250: fixes for modular build |
| Message-ID | <r11Ff-2lT-5@gated-at.bofh.it> |
This is a re-send of three patches I sent a couple of days ago, with a revert of two patches that Paul did, taking the code in the opposite direction now, towards ensuring the drivers actually work as loadable modules, which helps with 'allmodconfig' build testing. I've also added another patch for uniphier, and fixed smaller related issues that came up in further testing. Arnd
[toc] | [next] | [standalone]
| From | Arnd Bergmann <arnd@arndb.de> |
|---|---|
| Date | 2016-02-11 16:50 +0100 |
| Subject | [PATCH v2 6/6] serial: 8250/ingenic: fix building with SERIAL_8250=m |
| Message-ID | <r11Fg-2lT-17@gated-at.bofh.it> |
| In reply to | #1332169 |
The Ingenic 8250 driver has a 'bool' Kconfig symbol, but that breaks when SERIAL_8250 is a loadable module: drivers/tty/built-in.o: In function `ingenic_uart_probe': 8250_ingenic.c:(.text+0x1c1a0): undefined reference to `serial8250_register_8250_port' This changes the symbol to a 'tristate', plus a dependency on SERIAL_8250, which makes it work again. Unlike the other soc-specific backends, this one has no dependency on an architecture or a platform. I'm adding a dependency on MIPS || COMPILE_TEST as well here, to avoid showing the driver on architectures that are not interested in it. Signed-off-by: Arnd Bergmann <arnd@arndb.de> --- drivers/tty/serial/8250/8250_ingenic.c | 2 +- drivers/tty/serial/8250/Kconfig | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/drivers/tty/serial/8250/8250_ingenic.c b/drivers/tty/serial/8250/8250_ingenic.c index 97b78558caed..b0677f610863 100644 --- a/drivers/tty/serial/8250/8250_ingenic.c +++ b/drivers/tty/serial/8250/8250_ingenic.c @@ -48,7 +48,7 @@ static const struct of_device_id of_match[]; #define UART_MCR_MDCE BIT(7) #define UART_MCR_FCM BIT(6) -#ifdef CONFIG_SERIAL_EARLYCON +#if defined(CONFIG_SERIAL_EARLYCON) && !defined(MODULE) static struct earlycon_device *early_device; static uint8_t __init early_in(struct uart_port *port, int offset) diff --git a/drivers/tty/serial/8250/Kconfig b/drivers/tty/serial/8250/Kconfig index 6ae0fae4f796..32df7d5a1733 100644 --- a/drivers/tty/serial/8250/Kconfig +++ b/drivers/tty/serial/8250/Kconfig @@ -384,9 +384,10 @@ config SERIAL_8250_UNIPHIER serial ports, say Y to this option. If unsure, say N. config SERIAL_8250_INGENIC - bool "Support for Ingenic SoC serial ports" - depends on OF_FLATTREE - select LIBFDT + tristate "Support for Ingenic SoC serial ports" + depends on SERIAL_8250 + depends on (OF_FLATTREE && SERIAL_8250_CONSOLE) || !SERIAL_8250_CONSOLE + depends on MIPS || COMPILE_TEST help If you have a system using an Ingenic SoC and wish to make use of its UARTs, say Y to this option. If unsure, say N. -- 2.7.0
[toc] | [prev] | [next] | [standalone]
| From | Masahiro Yamada <yamada.masahiro@socionext.com> |
|---|---|
| Date | 2016-02-12 10:50 +0100 |
| Subject | Re: [PATCH v2 6/6] serial: 8250/ingenic: fix building with SERIAL_8250=m |
| Message-ID | <r1iwq-584-9@gated-at.bofh.it> |
| In reply to | #1332170 |
Hi Arnd, 2016-02-12 0:41 GMT+09:00 Arnd Bergmann <arnd@arndb.de>: > The Ingenic 8250 driver has a 'bool' Kconfig symbol, but that > breaks when SERIAL_8250 is a loadable module: > > drivers/tty/built-in.o: In function `ingenic_uart_probe': > 8250_ingenic.c:(.text+0x1c1a0): undefined reference to `serial8250_register_8250_port' > > This changes the symbol to a 'tristate', plus a dependency on > SERIAL_8250, which makes it work again. Unlike the other > soc-specific backends, this one has no dependency on an > architecture or a platform. I'm adding a dependency on > MIPS || COMPILE_TEST as well here, to avoid showing the driver > on architectures that are not interested in it. > > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > --- > drivers/tty/serial/8250/8250_ingenic.c | 2 +- > drivers/tty/serial/8250/Kconfig | 7 ++++--- > 2 files changed, 5 insertions(+), 4 deletions(-) > > diff --git a/drivers/tty/serial/8250/8250_ingenic.c b/drivers/tty/serial/8250/8250_ingenic.c > index 97b78558caed..b0677f610863 100644 > --- a/drivers/tty/serial/8250/8250_ingenic.c > +++ b/drivers/tty/serial/8250/8250_ingenic.c > @@ -48,7 +48,7 @@ static const struct of_device_id of_match[]; > #define UART_MCR_MDCE BIT(7) > #define UART_MCR_FCM BIT(6) > > -#ifdef CONFIG_SERIAL_EARLYCON > +#if defined(CONFIG_SERIAL_EARLYCON) && !defined(MODULE) > static struct earlycon_device *early_device; > > static uint8_t __init early_in(struct uart_port *port, int offset) The same comment applies here as 5/6. -- Best Regards Masahiro Yamada
[toc] | [prev] | [next] | [standalone]
| From | Arnd Bergmann <arnd@arndb.de> |
|---|---|
| Date | 2016-02-11 16:50 +0100 |
| Subject | [PATCH v2 1/6] Revert "drivers/tty/serial: make 8250/8250_mtk.c explicitly non-modular" |
| Message-ID | <r11Fg-2lT-19@gated-at.bofh.it> |
| In reply to | #1332169 |
This reverts commit d72d391c126e, which tried to remove dead code but
left the driver in a useless state when the main 8250 driver is a
loadable module. This would normally result in a link error, but
as the entire drivers/tty/serial/8250/ directory is only entered
when CONFIG_SERIAL_8250 is set, we never notice that the driver does
not get built in this configuration.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Fixes: d72d391c126e ("drivers/tty/serial: make 8250/8250_mtk.c explicitly non-modular")
---
drivers/tty/serial/8250/8250_mtk.c | 35 ++++++++++++++++++++++++++++-------
1 file changed, 28 insertions(+), 7 deletions(-)
diff --git a/drivers/tty/serial/8250/8250_mtk.c b/drivers/tty/serial/8250/8250_mtk.c
index 0e590b233f03..78883ca64ddd 100644
--- a/drivers/tty/serial/8250/8250_mtk.c
+++ b/drivers/tty/serial/8250/8250_mtk.c
@@ -16,7 +16,7 @@
*/
#include <linux/clk.h>
#include <linux/io.h>
-#include <linux/init.h>
+#include <linux/module.h>
#include <linux/of_irq.h>
#include <linux/of_platform.h>
#include <linux/platform_device.h>
@@ -245,6 +245,23 @@ static int mtk8250_probe(struct platform_device *pdev)
return 0;
}
+static int mtk8250_remove(struct platform_device *pdev)
+{
+ struct mtk8250_data *data = platform_get_drvdata(pdev);
+
+ pm_runtime_get_sync(&pdev->dev);
+
+ serial8250_unregister_port(data->line);
+
+ pm_runtime_disable(&pdev->dev);
+ pm_runtime_put_noidle(&pdev->dev);
+
+ if (!pm_runtime_status_suspended(&pdev->dev))
+ mtk8250_runtime_suspend(&pdev->dev);
+
+ return 0;
+}
+
#ifdef CONFIG_PM_SLEEP
static int mtk8250_suspend(struct device *dev)
{
@@ -275,18 +292,18 @@ static const struct of_device_id mtk8250_of_match[] = {
{ .compatible = "mediatek,mt6577-uart" },
{ /* Sentinel */ }
};
+MODULE_DEVICE_TABLE(of, mtk8250_of_match);
static struct platform_driver mtk8250_platform_driver = {
.driver = {
- .name = "mt6577-uart",
- .pm = &mtk8250_pm_ops,
- .of_match_table = mtk8250_of_match,
- .suppress_bind_attrs = true,
-
+ .name = "mt6577-uart",
+ .pm = &mtk8250_pm_ops,
+ .of_match_table = mtk8250_of_match,
},
.probe = mtk8250_probe,
+ .remove = mtk8250_remove,
};
-builtin_platform_driver(mtk8250_platform_driver);
+module_platform_driver(mtk8250_platform_driver);
#ifdef CONFIG_SERIAL_8250_CONSOLE
static int __init early_mtk8250_setup(struct earlycon_device *device,
@@ -302,3 +319,7 @@ static int __init early_mtk8250_setup(struct earlycon_device *device,
OF_EARLYCON_DECLARE(mtk8250, "mediatek,mt6577-uart", early_mtk8250_setup);
#endif
+
+MODULE_AUTHOR("Matthias Brugger");
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Mediatek 8250 serial port driver");
--
2.7.0
[toc] | [prev] | [next] | [standalone]
| From | Paul Gortmaker <paul.gortmaker@windriver.com> |
|---|---|
| Date | 2016-02-11 17:10 +0100 |
| Subject | Re: [PATCH v2 1/6] Revert "drivers/tty/serial: make 8250/8250_mtk.c explicitly non-modular" |
| Message-ID | <r11YC-2Ij-23@gated-at.bofh.it> |
| In reply to | #1332171 |
[[PATCH v2 1/6] Revert "drivers/tty/serial: make 8250/8250_mtk.c explicitly non-modular"] On 11/02/2016 (Thu 16:41) Arnd Bergmann wrote:
> This reverts commit d72d391c126e, which tried to remove dead code but
> left the driver in a useless state when the main 8250 driver is a
Am I misunderstanding something? The commit didn't cause the driver to
be in a useless state for 8250=m. But rather isn't that it was a
pre-existing condition, independent of the change to 8250_mtk.c to
remove the dead code in d72d391c126e?
Since the commit did not touch Kconfig or Makefile, I can't see how it
could cause some new useless state that did not already exist, and hence
the "Fixes:" tag is invalid as well.
Paul.
--
> loadable module. This would normally result in a link error, but
> as the entire drivers/tty/serial/8250/ directory is only entered
> when CONFIG_SERIAL_8250 is set, we never notice that the driver does
> not get built in this configuration.
>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> Fixes: d72d391c126e ("drivers/tty/serial: make 8250/8250_mtk.c explicitly non-modular")
> ---
> drivers/tty/serial/8250/8250_mtk.c | 35 ++++++++++++++++++++++++++++-------
> 1 file changed, 28 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/tty/serial/8250/8250_mtk.c b/drivers/tty/serial/8250/8250_mtk.c
> index 0e590b233f03..78883ca64ddd 100644
> --- a/drivers/tty/serial/8250/8250_mtk.c
> +++ b/drivers/tty/serial/8250/8250_mtk.c
> @@ -16,7 +16,7 @@
> */
> #include <linux/clk.h>
> #include <linux/io.h>
> -#include <linux/init.h>
> +#include <linux/module.h>
> #include <linux/of_irq.h>
> #include <linux/of_platform.h>
> #include <linux/platform_device.h>
> @@ -245,6 +245,23 @@ static int mtk8250_probe(struct platform_device *pdev)
> return 0;
> }
>
> +static int mtk8250_remove(struct platform_device *pdev)
> +{
> + struct mtk8250_data *data = platform_get_drvdata(pdev);
> +
> + pm_runtime_get_sync(&pdev->dev);
> +
> + serial8250_unregister_port(data->line);
> +
> + pm_runtime_disable(&pdev->dev);
> + pm_runtime_put_noidle(&pdev->dev);
> +
> + if (!pm_runtime_status_suspended(&pdev->dev))
> + mtk8250_runtime_suspend(&pdev->dev);
> +
> + return 0;
> +}
> +
> #ifdef CONFIG_PM_SLEEP
> static int mtk8250_suspend(struct device *dev)
> {
> @@ -275,18 +292,18 @@ static const struct of_device_id mtk8250_of_match[] = {
> { .compatible = "mediatek,mt6577-uart" },
> { /* Sentinel */ }
> };
> +MODULE_DEVICE_TABLE(of, mtk8250_of_match);
>
> static struct platform_driver mtk8250_platform_driver = {
> .driver = {
> - .name = "mt6577-uart",
> - .pm = &mtk8250_pm_ops,
> - .of_match_table = mtk8250_of_match,
> - .suppress_bind_attrs = true,
> -
> + .name = "mt6577-uart",
> + .pm = &mtk8250_pm_ops,
> + .of_match_table = mtk8250_of_match,
> },
> .probe = mtk8250_probe,
> + .remove = mtk8250_remove,
> };
> -builtin_platform_driver(mtk8250_platform_driver);
> +module_platform_driver(mtk8250_platform_driver);
>
> #ifdef CONFIG_SERIAL_8250_CONSOLE
> static int __init early_mtk8250_setup(struct earlycon_device *device,
> @@ -302,3 +319,7 @@ static int __init early_mtk8250_setup(struct earlycon_device *device,
>
> OF_EARLYCON_DECLARE(mtk8250, "mediatek,mt6577-uart", early_mtk8250_setup);
> #endif
> +
> +MODULE_AUTHOR("Matthias Brugger");
> +MODULE_LICENSE("GPL");
> +MODULE_DESCRIPTION("Mediatek 8250 serial port driver");
> --
> 2.7.0
>
[toc] | [prev] | [next] | [standalone]
| From | Arnd Bergmann <arnd@arndb.de> |
|---|---|
| Date | 2016-02-11 17:20 +0100 |
| Subject | Re: [PATCH v2 1/6] Revert "drivers/tty/serial: make 8250/8250_mtk.c explicitly non-modular" |
| Message-ID | <r128j-2LZ-33@gated-at.bofh.it> |
| In reply to | #1332189 |
On Thursday 11 February 2016 11:00:22 Paul Gortmaker wrote: > [[PATCH v2 1/6] Revert "drivers/tty/serial: make 8250/8250_mtk.c explicitly non-modular"] On 11/02/2016 (Thu 16:41) Arnd Bergmann wrote: > > > This reverts commit d72d391c126e, which tried to remove dead code but > > left the driver in a useless state when the main 8250 driver is a > > Am I misunderstanding something? The commit didn't cause the driver to > be in a useless state for 8250=m. But rather isn't that it was a > pre-existing condition, independent of the change to 8250_mtk.c to > remove the dead code in d72d391c126e? > > Since the commit did not touch Kconfig or Makefile, I can't see how it > could cause some new useless state that did not already exist, and hence > the "Fixes:" tag is invalid as well. My wording may have been bad here. What I meant to say is that it was broken before the patch, and still broken after the patch. The Fixes tag was meant to just be a reference to the commit I'm reverting. Arnd
[toc] | [prev] | [next] | [standalone]
| From | Paul Gortmaker <paul.gortmaker@windriver.com> |
|---|---|
| Date | 2016-02-11 17:30 +0100 |
| Subject | Re: [PATCH v2 1/6] Revert "drivers/tty/serial: make 8250/8250_mtk.c explicitly non-modular" |
| Message-ID | <r12hZ-2PX-25@gated-at.bofh.it> |
| In reply to | #1332212 |
[Re: [PATCH v2 1/6] Revert "drivers/tty/serial: make 8250/8250_mtk.c explicitly non-modular"] On 11/02/2016 (Thu 17:06) Arnd Bergmann wrote: > On Thursday 11 February 2016 11:00:22 Paul Gortmaker wrote: > > [[PATCH v2 1/6] Revert "drivers/tty/serial: make 8250/8250_mtk.c explicitly non-modular"] On 11/02/2016 (Thu 16:41) Arnd Bergmann wrote: > > > > > This reverts commit d72d391c126e, which tried to remove dead code but > > > left the driver in a useless state when the main 8250 driver is a > > > > Am I misunderstanding something? The commit didn't cause the driver to > > be in a useless state for 8250=m. But rather isn't that it was a > > pre-existing condition, independent of the change to 8250_mtk.c to > > remove the dead code in d72d391c126e? > > > > Since the commit did not touch Kconfig or Makefile, I can't see how it > > could cause some new useless state that did not already exist, and hence > > the "Fixes:" tag is invalid as well. > > My wording may have been bad here. What I meant to say is that it > was broken before the patch, and still broken after the patch. OK, no problem. I just didn't want Greg/Jiri to think I was sending them broken commits. Will need a v3 to get rid of the extra module.h anyway, so that gives you a chance to reword. > > The Fixes tag was meant to just be a reference to the commit I'm > reverting. Yeah, but since the stable people trigger off of that, and since the revert doesn't really fix anything, that is probably best removed. The stable trees don't need the revert. Thanks, Paul. -- > > Arnd
[toc] | [prev] | [next] | [standalone]
| From | Arnd Bergmann <arnd@arndb.de> |
|---|---|
| Date | 2016-02-11 17:40 +0100 |
| Subject | Re: [PATCH v2 1/6] Revert "drivers/tty/serial: make 8250/8250_mtk.c explicitly non-modular" |
| Message-ID | <r12rD-2UR-11@gated-at.bofh.it> |
| In reply to | #1332222 |
On Thursday 11 February 2016 11:28:52 Paul Gortmaker wrote: > [Re: [PATCH v2 1/6] Revert "drivers/tty/serial: make 8250/8250_mtk.c explicitly non-modular"] On 11/02/2016 (Thu 17:06) Arnd Bergmann wrote: > > > On Thursday 11 February 2016 11:00:22 Paul Gortmaker wrote: > > > [[PATCH v2 1/6] Revert "drivers/tty/serial: make 8250/8250_mtk.c explicitly non-modular"] On 11/02/2016 (Thu 16:41) Arnd Bergmann wrote: > > > > > > > This reverts commit d72d391c126e, which tried to remove dead code but > > > > left the driver in a useless state when the main 8250 driver is a > > > > > > Am I misunderstanding something? The commit didn't cause the driver to > > > be in a useless state for 8250=m. But rather isn't that it was a > > > pre-existing condition, independent of the change to 8250_mtk.c to > > > remove the dead code in d72d391c126e? > > > > > > Since the commit did not touch Kconfig or Makefile, I can't see how it > > > could cause some new useless state that did not already exist, and hence > > > the "Fixes:" tag is invalid as well. > > > > My wording may have been bad here. What I meant to say is that it > > was broken before the patch, and still broken after the patch. > > OK, no problem. I just didn't want Greg/Jiri to think I was sending them > broken commits. Will need a v3 to get rid of the extra module.h > anyway, so that gives you a chance to reword. Sure. > > > > The Fixes tag was meant to just be a reference to the commit I'm > > reverting. > > Yeah, but since the stable people trigger off of that, and since the > revert doesn't really fix anything, that is probably best removed. > The stable trees don't need the revert. Yes, good point. Arnd
[toc] | [prev] | [next] | [standalone]
| From | Arnd Bergmann <arnd@arndb.de> |
|---|---|
| Date | 2016-02-11 16:50 +0100 |
| Subject | [PATCH v2 3/6] serial: 8250/mediatek: mark PM functions as __maybe_unused |
| Message-ID | <r11Fg-2lT-25@gated-at.bofh.it> |
| In reply to | #1332169 |
The mtk8250_runtime_suspend function is not used when runtime PM is
disabled, so we get a warning about an unused function:
drivers/tty/serial/8250/8250_mtk.c:119:12: error: 'mtk8250_runtime_suspend' defined but not used [-Werror=unused-function]
static int mtk8250_runtime_suspend(struct device *dev)
This marks all the PM functions as __maybe_unused to avoid the warning,
and removes the #ifdef around the PM_SLEEP functions for consistency.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: Matthias Brugger <matthias.bgg@gmail.com>
---
drivers/tty/serial/8250/8250_mtk.c | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/drivers/tty/serial/8250/8250_mtk.c b/drivers/tty/serial/8250/8250_mtk.c
index 78883ca64ddd..6ecc6e3e82dc 100644
--- a/drivers/tty/serial/8250/8250_mtk.c
+++ b/drivers/tty/serial/8250/8250_mtk.c
@@ -116,7 +116,7 @@ mtk8250_set_termios(struct uart_port *port, struct ktermios *termios,
tty_termios_encode_baud_rate(termios, baud, baud);
}
-static int mtk8250_runtime_suspend(struct device *dev)
+static int __maybe_unused mtk8250_runtime_suspend(struct device *dev)
{
struct mtk8250_data *data = dev_get_drvdata(dev);
@@ -126,7 +126,7 @@ static int mtk8250_runtime_suspend(struct device *dev)
return 0;
}
-static int mtk8250_runtime_resume(struct device *dev)
+static int __maybe_unused mtk8250_runtime_resume(struct device *dev)
{
struct mtk8250_data *data = dev_get_drvdata(dev);
int err;
@@ -262,8 +262,7 @@ static int mtk8250_remove(struct platform_device *pdev)
return 0;
}
-#ifdef CONFIG_PM_SLEEP
-static int mtk8250_suspend(struct device *dev)
+static int __maybe_unused mtk8250_suspend(struct device *dev)
{
struct mtk8250_data *data = dev_get_drvdata(dev);
@@ -272,7 +271,7 @@ static int mtk8250_suspend(struct device *dev)
return 0;
}
-static int mtk8250_resume(struct device *dev)
+static int __maybe_unused mtk8250_resume(struct device *dev)
{
struct mtk8250_data *data = dev_get_drvdata(dev);
@@ -280,7 +279,6 @@ static int mtk8250_resume(struct device *dev)
return 0;
}
-#endif /* CONFIG_PM_SLEEP */
static const struct dev_pm_ops mtk8250_pm_ops = {
SET_SYSTEM_SLEEP_PM_OPS(mtk8250_suspend, mtk8250_resume)
--
2.7.0
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web