From: Sagi Maimon <maimon.sagi@gmail.com>
To: netdev@vger.kernel.org
Cc: vadim.fedorenko@linux.dev, richardcochran@gmail.com,
kuba@kernel.org, andrew+netdev@lunn.ch, davem@davemloft.net,
edumazet@google.com, pabeni@redhat.com,
linux-kernel@vger.kernel.org, Sagi Maimon <maimon.sagi@gmail.com>
Subject: [PATCH net-next v11 0/2] ptp: ocp: add TAP CPLD support for ADVA TimeCard X1
Date: Tue, 11 Aug 2026 16:57:18 +0300 [thread overview]
Message-ID: <20260811135720.109580-1-maimon.sagi@gmail.com> (raw)
The ADVA TimeCard X1 (PCI device 0x0410) carries a Lattice MachXO3 CPLD
on the TMC I2C bus. This series adds access to it and an update path
through the kernel firmware-upload subsystem.
The card has two I2C controllers. Linux registers only the one at
0x00150000, normally routed to the config EEPROMs; the one at 0x00120000
belongs to the on-card MicroBlaze and is routed to the TMC or M.2 bus as
its firmware selects. A request/grant handshake re-routes the host
controller onto the TMC bus, where the PCA9548 and the CPLD behind its
channel 0 live. Everything here is built on that handshake.
Patch 1 adds the arbitration and the read-only interfaces on top of it.
Patch 2 adds the flashing, as requested in review.
v10: https://lore.kernel.org/all/20260805083154.3821-1-maimon.sagi@gmail.com/
Review: https://lore.kernel.org/all/20260810230735.955188-2-kuba@kernel.org/
One review point did not become a code change, so to answer it here: the
CPLD paths leaving the PCA9548 with all channels deselected is harmless.
The mux sits on the TMC bus, which the EEPROM paths never see - by the
time the grant is dropped and the host controller is back on the EEPROM
segment, the mux is not reachable from that adapter at all. Deselect-all
is also the PCA9548 power-on state, so the MicroBlaze finds it exactly as
it would after a cold boot. v11 documents this above the CPLD helpers
rather than leaving it to be re-derived.
Changes since v10:
- Split into two patches, separating the firmware flashing from the
bus access and the read-only interfaces (Jakub).
- Report the Lattice device ID as the fixed devlink version "cpld.id"
and drop the cpld_device_id sysfs attribute (Jakub). The value is
cached, so the bus arbitration is paid once per card.
- Hold the i2c core adapter lock across the whole grant window and use
__i2c_transfer(); while the host controller is routed onto the TMC
bus the EEPROMs are not behind that adapter at all, so an unarbitrated
transfer from ptp_ocp_read_eeprom(), the nvmem attributes or the at24
sysfs files would be issued onto the wrong bus.
- Register the firmware-upload node per card as adva-cpld.N; the fixed
name made the second X1 board in a host fail with -EEXIST.
- Unregister the upload first on detach, so an in-flight programming
cycle is cancelled and flushed while the I2C controller is still up.
- Restrict cpld_status to 0400 and take cpld_lock interruptibly, so a
reader cannot sit unkillable for the length of an upload or stall
device removal.
- Fix adva_x1_cpld_wait_ready(): it polled floor(max_ms / 100) times and
never re-read after the last sleep, so the 100 ms per-page budget
allowed exactly one poll. Use read_poll_timeout() with a wall-clock
deadline that also accounts for the I2C transactions.
- Cancellation: keep a request that arrives before prepare() runs,
annotate the flag with READ_ONCE/WRITE_ONCE, honour it inside the long
waits, and report it as CANCELED rather than HW_ERROR.
- Set cpld_in_config_mode before EN_CFG_TP and clear it once REFRESH is
accepted, so DIS_CFG is neither skipped after a failed wait nor sent
to a device that already rebooted.
- Retry the post-REFRESH mux reselect; its return was discarded, so a
NAK failed an update whose image was already running.
- Drop I2C_M_NOSTART: two messages in one transfer already give the
repeated-START read the ISC protocol needs, and the flag asks for the
opposite on adapters that honour it.
- Withdraw the MicroBlaze request when the grant times out, and drop the
-EBUSY check that only ever read back its own write.
- select FW_LOADER and FW_UPLOAD; without them the documented update
path does not exist.
- Correct the IDCODE to 0x612bc043 and the part to LCMXO3LF-2100.
- Add lockdep_assert_held() to the callbacks and context annotations for
the lock handed from prepare() to cleanup().
Sagi Maimon (2):
ptp: ocp: add TAP CPLD access for ADVA TimeCard X1
ptp: ocp: add TAP CPLD firmware upload for ADVA TimeCard X1
Documentation/ABI/testing/sysfs-timecard | 24 +
drivers/ptp/Kconfig | 2 +
drivers/ptp/ptp_ocp.c | 655 ++++++++++++++++++++++-
3 files changed, 677 insertions(+), 4 deletions(-)
--
2.47.0
next reply other threads:[~2026-08-11 13:57 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-11 13:57 Sagi Maimon [this message]
2026-08-11 13:57 ` [PATCH net-next v11 1/2] ptp: ocp: add TAP CPLD access for ADVA TimeCard X1 Sagi Maimon
2026-08-11 13:57 ` [PATCH net-next v11 2/2] ptp: ocp: add TAP CPLD firmware upload " Sagi Maimon
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=20260811135720.109580-1-maimon.sagi@gmail.com \
--to=maimon.sagi@gmail.com \
--cc=andrew+netdev@lunn.ch \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=richardcochran@gmail.com \
--cc=vadim.fedorenko@linux.dev \
/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.