by ARM platforms today if ptp_kvm is not supported.
>
> Fixes: 300bb1fe7671 ("ptp: arm/arm64: Enable ptp_kvm for arm/arm64")
> Signed-off-by: Jon Hunter
Acked-by: Richard Cochran
return type to void? Returning true or
> false makes no difference.
+1
Thanks,
Richard
and pass them to the
> - * switch driver
> - */
> + /* Handle tx timestamp request if has */
"if has" what?
> dsa_skb_tx_timestamp(p, skb);
>
> if (dsa_realloc_skb(skb, dev)) {
> --
> 2.25.1
>
Thanks,
Richard
h into three for
easier review.
Thanks,
Richard
o the above mentioned feature. Users will be
> able to triggered capturing the time snapshot from user-space using
> application such as testptp or any other applications that uses the
> PTP_EXTTS_REQUEST ioctl request.
>
> Cc: Richard Cochran
> Signed-off-by: Tan Tee Min
> Co-de
o:
posted Date: Wed, 7 Apr 2021 16:19:53 -0700
merged Date: Thu, 08 Apr 2021 20:30:28 +
That is a pretty good turn around time, less that 24 hours!
Oh well, too late to add my Acked-by.
Thanks,
Richard
a "v2" into the Subject line, and adding a brief change log
into the cover letter.
Thanks,
Richard
> index b164ae22e35f..d668c33a0746 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c
> @@ -135,9 +135,13 @@ static int stmmac_enable(struct ptp_clock_info *ptp,
> {
> struct stmmac_priv *priv =
> container_of(ptp, struct stmmac_priv, ptp_clock_ops);
> + void __iomem *ptpaddr = priv->ptpaddr;
> + void __iomem *ioaddr = priv->hw->pcsr;
> struct stmmac_pps_cfg *cfg;
> int ret = -EOPNOTSUPP;
> unsigned long flags;
> + u32 intr_value;
> + u32 acr_value;
Please group same types together.
Thanks,
Richard
Did you check whether all items in this list are really outdated?
Nobody shall ever blindly follow a TODO list without checking first which
points are still valid or not.
Removing that file does not magically solve the issues it describes.
--
Thanks,
//richard
into a new arch-specific file in the same directory,
> > and rename the arch-independent file to ptp_kvm_common.c.
> >
> > Reviewed-by: Andre Przywara
> > Signed-off-by: Jianyong Wu
> > Signed-off-by: Marc Zyngier
> > Link: https://lore.kernel.org/r/202012090609
ked MAC/PHY HW time stamping,
still your driver should conform to the correct pattern.
Why? Because new driver authors copy/paste stuff they find in the tree.
Thanks,
Richard
On Tue, Apr 06, 2021 at 04:18:00PM -0700, Shannon Nelson wrote:
> On 4/5/21 11:17 AM, Richard Cochran wrote:
> > On Mon, Apr 05, 2021 at 09:16:39AM -0700, Shannon Nelson wrote:
> > > On 4/4/21 4:05 PM, Richard Cochran wrote:
> > > > This check is unneeded, because the
ests from user space. The test
failing or passing determines whether the commit will be marked GOOD
or BAD. This use case is a real thing.
Thanks,
Richard
On Mon, Apr 05, 2021 at 09:28:44AM -0700, Shannon Nelson wrote:
> On 4/4/21 4:41 PM, Richard Cochran wrote:
> > On Thu, Apr 01, 2021 at 10:56:07AM -0700, Shannon Nelson wrote:
> >
> > > @@ -1150,6 +1232,10 @@ netdev_tx_t ionic_start_xmit(struct sk_buff *skb,
> &g
On Mon, Apr 05, 2021 at 09:16:39AM -0700, Shannon Nelson wrote:
> On 4/4/21 4:05 PM, Richard Cochran wrote:
> > This check is unneeded, because the ioctl layer never passes NULL here.
>
> Yes, the ioctl layer never calls this with NULL, but we call it from within
> the d
On Thu, Apr 01, 2021 at 10:56:10AM -0700, Shannon Nelson wrote:
> Let the network stack know we've got support for timestamping
> the packets.
Actually, you already advertised the support to user space in Patch 10,
so this present patch should go before that one (or together).
Thanks,
Richard
amping via the SIOCSHWTSTAMP ioctl.
In addition, the code should set
skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
once the above tests pass.
Thanks,
Richard
x rx_all %d\n",
> + config.rx_filter, rx_filt, rx_all);
> +
> + mutex_lock(&lif->phc->config_lock);
> +
> + if (tx_mode) {
> + err = ionic_lif_create_hwstamp_txq(lif);
This function NDE yet. It first appears in Patch #6. Please make
sure each patch compiles. That way, bisection always works.
Thanks,
Richard
h the
> + * current ts_config from the initial cleared state.
> + */
This check is unneeded, because the ioctl layer never passes NULL here.
> + memcpy(&config, &lif->phc->ts_config, sizeof(config));
> + memset(&lif->phc->ts_config, 0, sizeof(config));
> + }
Thanks,
Richard
= NULL;
> - unsigned int sg_desc_sz;
> unsigned int flags;
Ditto.
Thanks,
Richard
g mul_u64_u64_div_u64().
>
> Signed-off-by: Yangbo Lu
Acked-by: Richard Cochran
certain events with that, it makes more sense to provide that clock from
> the TKE driver.
It sounds like TKE + GTE together act like a PHC, and GTE doesn't
need/want its own SW interface.
Thanks,
Richard
On Mon, Mar 22, 2021 at 08:36:26AM -0700, Vinicius Costa Gomes wrote:
> After a long time, a couple of internal misunderstandings, fixing some
> typos in the delay adjustment constants and better error handling, this
> one shot method is working well.
>
> I will propose a new version, implementing
On Sat, Mar 20, 2021 at 01:44:20PM +0100, Arnd Bergmann wrote:
> Adding Richard Cochran as well, for drivers/ptp/, he may be able to
> identify whether this should be integrated into that framework in some
> form.
I'm not familiar with the GTE, but it sounds like it is a (free
r
x27;pch_ch_control_read()'
> ptp_pch: Move 'pch_*()' prototypes to shared header
> ptp: ptp_clockmatrix: Demote non-kernel-doc header to standard comment
> ptp: ptp_p: Demote non-conformant kernel-doc headers and supply a
> param description
For the series:
Acked-by: Richard Cochran
nsumed" suggests much more to me than
what is going on.
How about this? skb_reset_txtime();
Thanks,
Richard
escribed in the change in 91c0d987a9788dcc5fe26baafd73bf9242b68900
> the igp clock is disabled when the interface is down and leads to a
> system hang.
>
> So we check if the ptp clock status before reading the timecounter
> register.
>
> Signed-off-by: Heiko Thiery
> ---
> v2:
&
d in a similar way. I missed the original
patch, but the diff fragment in this thread doesn't appear to take the
mutex as it should.
Thanks,
Richard
On Tue, Feb 23, 2021 at 04:04:16PM +0100, Heiko Thiery wrote:
> It is not only the PHC clock that stops. Rather, it is the entire
> ethernet building block in the SOC that is disabled, including the
> PHC.
Sure, but why does the driver do that?
Thanks,
Richard
ice that was opened before will be gone.
If a network interface goes down, ptp4l will notice via rtnl and close
the interface. Then it re-opens the sockets on rtnl up. However, the
file descriptor representing the dynamic posix clock stays opened.
Thanks,
Richard
On Thu, Feb 11, 2021 at 11:38:45PM -0500, vincent.cheng...@renesas.com wrote:
> From: Vincent Cheng
>
> When enabling output using PTP_CLK_REQ_PEROUT, need to align the output
> clock to the internal 1 PPS clock.
>
> Signed-off-by: Vincent Cheng
Acked-by: Richard Cochran
_adj[MAX_OUTPUT][4];
> };
Looks like this removal is unrelated to the patch subject, and so it
deserves its own small patch.
Acked-by: Richard Cochran
ll means, avoid ARM churn... I remember Bad Things there...
Maybe you could take #1 and #2 for net-next?
I should probably submit 3-4 throught the SoC tree anyhow.
Thanks,
Richard
e under discussion.)
Thanks,
Richard
eh)
Back of the napkin design ideas appreciated!
Thanks,
Richard
On Wed, Jan 20, 2021 at 08:05:59PM -0800, Richard Cochran wrote:
> The NETWORK_PHY_TIMESTAMPING configuration option adds additional
> checks into the networking hot path, and it is only needed by two
> rather esoteric devices,
Correction: there are three legitimate users of PHY time
On Thu, Jan 21, 2021 at 10:27:54AM +, Russell King - ARM Linux admin wrote:
> On Wed, Jan 20, 2021 at 08:06:01PM -0800, Richard Cochran wrote:
> > The mvpp2 is an Ethernet driver, and it implements MAC style time
> > stamping of PTP frames. It has no need of the expensive optio
n options.
This has nothing to do with ARM as a platform. The same limitation
applies to x86 and all the rest.
The networking stack does not support simultaneous PHY and MAC time
stamping.
If you enable both MAC and PHY time stamping, then only one will be
reported, and that one is the PHY.
Thanks,
Richard
s.
The idea to favor the MACs, from back in July, doesn't really change
the fundamental limitations that
- MAC and PHY time stamping cannot work simultaneously, and
- Users of PHY devices (representing a tiny minority) must enable the
otherwise uninteresting NETWORK_PHY_TIMESTAMPING option at compile
time.
Thanks,
Richard
on Chip, least ways not the axm55xx SoC, includes
such a PHY time stamping device. Disable the unneeded option by
default.
Signed-off-by: Richard Cochran
---
arch/arm/configs/axm55xx_defconfig | 1 -
1 file changed, 1 deletion(-)
diff --git a/arch/arm/configs/axm55xx_defconfig
b/arch/arm
The mvpp2 is an Ethernet driver, and it implements MAC style time
stamping of PTP frames. It has no need of the expensive option to
enable PHY time stamping. Remove the incorrect dependency.
Signed-off-by: Richard Cochran
Fixes: 91dd71950bd7 ("net: mvpp2: ptp: add TAI support")
--
on Chip, least ways not the socfpga SoC, includes
such a PHY time stamping device. Disable the unneeded option by
default.
The diff includes a bit of extra churn caused by "make savedefconfig",
but the generated defconfig is now in the canonical form.
Signed-off-by: Richard Cochran
---
specialized embedded systems.
Unfortunately two unrelated drivers depend on this option, and two
defconfigs enable it. It is probably my fault for not paying enough
attention in reviews.
This series corrects the gratuitous use of NETWORK_PHY_TIMESTAMPING.
Richard Cochran (4):
net: dsa
The mv88e6xxx is a DSA driver, and it implements DSA style time
stamping of PTP frames. It has no need of the expensive option to
enable PHY time stamping. Remove the bogus dependency.
Signed-off-by: Richard Cochran
Fixes: 2fa8d3af4bad ("net: dsa: mv88e6xxx: expose switch time as
d-by: Tariq Toukan
Acked-by: Richard Cochran
ade them because the cpsw MAC supports time
stamping in a way that is inadequate.
I *think* the cpsw/phyter combination would work with your patch, but
only if the users disable CONFIG_TI_CPTS at compile time.
Thanks,
Richard
Up until now, the code always favored PHY devices and devices external
to the MAC that snoop on the MII bus. The assumption is that anyone
who builds a board with such specialty devices really wants to use
them.
Thanks,
Richard
audit testsuiite issue for the test case:
https://github.com/linux-audit/audit-testsuite/issues/64
Please see the github audit wiki for the feature overview:
https://github.com/linux-audit/audit-kernel/wiki/RFE-Audit-Container-ID
Signed-off-by: Richard Guy Briggs
Acked-by: Serge Hallyn
Acked-by
ee the github audit wiki for the feature overview:
https://github.com/linux-audit/audit-kernel/wiki/RFE-Audit-Container-ID
Signed-off-by: Richard Guy Briggs
---
Acks removed due to redo rcu/spin locking:
Acked-by: Neil Horman
Reviewed-by: Ondrej Mosnacek
---
include/linux/audit.h| 17 +++
k
orchestrator as the one that set it so it is not
possible to change the contid of another orchestrator's container.
Since the task_is_descendant() function is used in YAMA and in audit,
remove the duplication and pull the function into kernel/core/sched.c
Signed-off-by: Richard Guy B
amespace B. An
event happens in network namespace B:
type=NETFILTER_PKT ...
type=CONTAINER_ID msg=audit(:): contid=2,^1,3,^1
Signed-off-by: Richard Guy Briggs
---
kernel/audit.c | 75 +-
1 file changed, 62 insertions(+), 13 deletions(-)
diff
ned-off-by: Richard Guy Briggs
---
.../ABI/testing/procfs-audit_containerid | 16 +
fs/proc/base.c| 54 +++
include/linux/audit.h | 4 +-
include/uapi/linux/audit.h| 1 +
kern
Add audit container identifier auxiliary record to user event standalone
records.
Signed-off-by: Richard Guy Briggs
Acked-by: Neil Horman
Reviewed-by: Ondrej Mosnacek
---
kernel/audit.c | 12 +---
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/kernel/audit.c b/kernel
ked by timestamp and serial.
Signed-off-by: Richard Guy Briggs
Acked-by: Serge Hallyn
Acked-by: Neil Horman
Reviewed-by: Ondrej Mosnacek
---
include/linux/audit.h | 8
kernel/audit.h| 1 +
kernel/auditsc.c | 31 ++-
3 files changed, 35 insert
ainerid to contid
- convert initial container record to syscall aux
- fix spelling mistake of contidion in net/rfkill/core.c to avoid contid name
collision
v2
- add check for children and threads
- add network namespace container identifier list
- add NETFILTER_PKT audit container identifier logging
to reflect the new record request and reply type.
An older userspace won't break since it won't know to request this
record type.
Signed-off-by: Richard Guy Briggs
---
Acks from nhorman/omosnace should have been added in v6.
Acks dropped due to restructure audit_sig_info2 for nesting
nux-audit/audit-userspace/issues/51
Please see the github audit testsuiite issue for the test case:
https://github.com/linux-audit/audit-testsuite/issues/64
Please see the github audit wiki for the feature overview:
https://github.com/linux-audit/audit-kernel/wiki/RFE-Audit-Container-ID
S
issue for the test case:
https://github.com/linux-audit/audit-testsuite/issues/64
Please see the github audit wiki for the feature overview:
https://github.com/linux-audit/audit-kernel/wiki/RFE-Audit-Container-ID
Signed-off-by: Richard Guy Briggs
---
Acks dropped due to log drop added 7.3, r
nel/issues/90
Signed-off-by: Richard Guy Briggs
---
Acks removed due to significant code changes hiding audit task struct:
Acked-by: Neil Horman
Reviewed-by: Ondrej Mosnacek
---
fs/io-wq.c| 8 +--
fs/io_uring.c | 16 ++---
include/linux/audit.h | 49 +-
inc
if (!hdr || (hlen - nhoff) < sizeof(_hdr)) {
I'm not really familiar with the flow dissector, but why check (hlen - nhoff)
here?
None of the other cases do that. Doesn't skb_copy_bits() in
__skb_header_pointer() already handle that?
Thanks,
Richard
> +
, in turn, is over CAN).
This is specified in Annex G of IEEE 1588.
The linuxptp stack has modular design and could one day support
DeviceNET. It would be much easier for linuxptp if CAN interfaces
support hardware time stamping in the same way as other network
interfaces.
Thanks,
Richard
er in the future.
(This isn't a criticism of the current patch, though.)
Thanks,
Richard
-linux-ld: drivers/ptp/ptp_ines.o: in function `ines_ptp_ctrl_probe':
> ptp_ines.c:(.text+0x17e6): undefined reference to
> `devm_platform_ioremap_resource'
>
> Prevent builds of ptp_ines.c when HAS_IOMEM is not set.
Acked-by: Richard Cochran
27;
>
> Fixes: 539e44d26855 ("dp83640: Include hash in timestamp/packet matching")
> Signed-off-by: Arnd Bergmann
Acked-by: Richard Cochran
eries is somehow about host/guest synchronization
(but your comments do explain that that isn't the case).
How about this instead?
virtio-net: support future packet transmit time
Thanks,
Richard
ncing host with NIC is assumed if the host advertises the feature
> and implements using real hardware timestamps.
Sounds reasonable.
Thanks,
Richard
ialization/deinitialization")
> Signed-off-by: Grygorii Strashko
Acked-by: Richard Cochran
On 2020-12-21 12:14, Paul Moore wrote:
> On Mon, Dec 21, 2020 at 11:57 AM Richard Guy Briggs wrote:
> >
> > The audit-related parameters in struct task_struct should ideally be
> > collected together and accessed through a standard audit API and the audit
> > stru
ned-off-by: Richard Guy Briggs
---
.../ABI/testing/procfs-audit_containerid | 16 +
fs/proc/base.c| 54 +++
include/linux/audit.h | 4 +-
include/uapi/linux/audit.h| 1 +
kern
amespace B. An
event happens in network namespace B:
type=NETFILTER_PKT ...
type=CONTAINER_ID msg=audit(:): contid=2,^1,3,^1
Signed-off-by: Richard Guy Briggs
---
kernel/audit.c | 75 +-
1 file changed, 62 insertions(+), 13 deletions(-)
diff
://github.com/linux-audit/audit-kernel/wiki/RFE-Audit-Container-ID
Signed-off-by: Richard Guy Briggs
Acked-by: Neil Horman
Reviewed-by: Ondrej Mosnacek
---
include/linux/audit.h| 17 +++
kernel/audit.c | 229 ++-
kernel/nsproxy.c | 4 +
net
orchestrator as the one that set it so it is not
possible to change the contid of another orchestrator's container.
Since the task_is_descendant() function is used in YAMA and in audit,
remove the duplication and pull the function into kernel/core/sched.c
Signed-off-by: Richard Guy B
audit testsuiite issue for the test case:
https://github.com/linux-audit/audit-testsuite/issues/64
Please see the github audit wiki for the feature overview:
https://github.com/linux-audit/audit-kernel/wiki/RFE-Audit-Container-ID
Signed-off-by: Richard Guy Briggs
Acked-by: Serge Hallyn
Acked-by
Add audit container identifier auxiliary record to user event standalone
records.
Signed-off-by: Richard Guy Briggs
Acked-by: Neil Horman
Reviewed-by: Ondrej Mosnacek
---
kernel/audit.c | 12 +---
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/kernel/audit.c b/kernel
ked by timestamp and serial.
Signed-off-by: Richard Guy Briggs
Acked-by: Serge Hallyn
Acked-by: Neil Horman
Reviewed-by: Ondrej Mosnacek
---
include/linux/audit.h | 8
kernel/audit.h| 1 +
kernel/auditsc.c | 31 ++-
3 files changed, 35 insert
udit-userspace/issues/51
Please see the github audit testsuiite issue for the test case:
https://github.com/linux-audit/audit-testsuite/issues/64
Please see the github audit wiki for the feature overview:
https://github.com/linux-audit/audit-kernel/wiki/RFE-Audit-Container-ID
Signed-off-by: Ri
to reflect the new record request and reply type.
An older userspace won't break since it won't know to request this
record type.
Signed-off-by: Richard Guy Briggs
---
include/linux/audit.h | 7 +++
include/uapi/linux/audit.h | 1 +
kernel/audit.c
of container list funcitons
- rename containerid to contid
- convert initial container record to syscall aux
- fix spelling mistake of contidion in net/rfkill/core.c to avoid contid name
collision
v2
- add check for children and threads
- add network namespace container identifier list
- add NET
the github audit testsuiite issue for the test case:
https://github.com/linux-audit/audit-testsuite/issues/64
Please see the github audit wiki for the feature overview:
https://github.com/linux-audit/audit-kernel/wiki/RFE-Audit-Container-ID
Signed-off-by: Richard Guy Briggs
Acked-by: Serge
nel/issues/90
Signed-off-by: Richard Guy Briggs
Acked-by: Neil Horman
Reviewed-by: Ondrej Mosnacek
---
fs/io-wq.c| 8 +--
fs/io_uring.c | 16 ++---
include/linux/audit.h | 49 +-
include/linux/sched.h | 7 +-
init/init_task.c | 3 +-
init/main.c
> + temp |= PTP_TX_MOD_BAD_UDPV4_CHKSUM_FORCE_FCS_DIS_;
> + lan8814_write_page_reg(phydev, 5, PTP_TX_MOD, temp);
> + lan8814_write_page_reg(phydev, 4, PTP_OPERATING_MODE,
> +PTP_OPERATING_MODE_STANDALONE);
> + lan8814_ptp_enable(phydev);
&g
HC time continuous.
> Please remember to CC Richard, the PTP maintainer.
+1 to that, too!
Thanks,
Richard
ect warnings from strict checkpatch
Next time, please put "v2" in the Subject line. That helps reviewers
keep track.
> Signed-off-by: Min Li
Acked-by: Richard Cochran
have lots and lots
of PTP hardware supported, all of them already working with the
existing API just fine.
My preference is for a global knob for users of this hardware, either
- a compile time Kconfig option on the driver, or
- some kind of sysctl/debugfs knob
Thanks,
Richard
ly designed
hardware.
> Our driver can optimize accuracy when this flag is set, other drivers
> might be happy to implement it since they already have a slow hw
Name three other drivers that would "be happy" to implement this. Can
you name even one other?
Thanks,
Richard
not offering here about
> any standard for others to follow.
+1
Thanks,
Richard
an't just "draw the
borders" anywhere you like!
Thanks,
Richard
;
> Signed-off-by: Jonathan Lemon
Acked-by: Richard Cochran
On Thu, Dec 03, 2020 at 06:00:37PM -0800, Jonathan Lemon wrote:
> On Thu, Dec 03, 2020 at 04:56:24PM -0800, Richard Cochran wrote:
> > The name here is a bit confusing since "timex" has a special meaning
> > in the NTP/PTP API.
>
> The .gettimex64 call is used her
On Fri, Dec 04, 2020 at 03:00:50AM +0200, Vladimir Oltean wrote:
> On Thu, Dec 03, 2020 at 04:45:56PM -0800, Richard Cochran wrote:
> > Yes, that would make sense. It would bring sysfs back to feature
> > parity with the ioctls.
>
> Which is a good thing?
Yes, of cours
s either.
> + return -EOPNOTSUPP;
You can set the offset but not the frequency adjustment. Makes sense
for an atomic clock.
> +}
This driver looks fine, but I'm curious how you will use it. Can it
provide time stamping for network frames or other IO?
If not, then that seems unfortunate. Still you can regulate the Linux
system clock in software, but that of course introduces time error.
Thanks,
Richard
On Thu, Dec 03, 2020 at 04:36:26PM +0100, Christian Eggers wrote:
> Should ptp_sysfs be extended with a "pulse" attribute with calls
> enable() with only PTP_PEROUT_DUTY_CYCLE set?
Yes, that would make sense. It would bring sysfs back to feature
parity with the ioctls.
Thanks,
Richard
't you using PTP_PEROUT_DUTY_CYCLE anyhow?
Thanks,
Richard
On Mon, Nov 30, 2020 at 09:01:25PM +, tristram...@microchip.com wrote:
> The 1588 PTP engine in the KSZ switches was designed to be controlled closely
> by
> a PTP stack, so it is a little difficult to use when there is a layer of
> kernel support
> between the application and the driver.
Ar
urns 3 (three).
> + if (sscanf(version2, "%hhu.%hhu.%hhu",
> +&ver2[0], &ver2[1], &ver2[2]) < 0)
> + return -1;
Same here.
Thanks,
Richard
by: Antoine Tenart
> - [3/3] removed dead email addresses from Cc:
>
>
> This series replaces further driver internal enumeration / uses of magic
> numbers with the newly introduced PTP_MSGTYPE_* defines.
For the series:
Acked-by: Richard Cochran
cur2 = next2;
> }
> }
> +
> return result;
> }
>
> diff --git a/tools/bpf/example b/tools/bpf/example
> new file mode 100644
> index 000..a0ac81f
> --- /dev/null
> +++ b/tools/bpf/example
> @@ -0,0 +1,12
o the driver would
have to match the Req/Resp exactly and deal with rogue/buggy requests
and responses.
Thanks,
Richard
e matching correction value. That way, we avoid bogus,
hard coded values in kernel space. (This isn't implemented in
linuxptp, but it certainly could be.)
Thanks,
Richard
*/
// eight here
};
You could set 'flags' to mark this as a time stamp pair, and then
stuff the system time stamp into rsv[2].
Thoughts?
Richard
1 - 100 of 1281 matches
Mail list logo