| .. SPDX-License-Identifier: GPL-2.0+ | 
 |  | 
 | ========================================================================= | 
 | OPEN Alliance 10BASE-T1x MAC-PHY Serial Interface (TC6) Framework Support | 
 | ========================================================================= | 
 |  | 
 | Introduction | 
 | ------------ | 
 |  | 
 | The IEEE 802.3cg project defines two 10 Mbit/s PHYs operating over a | 
 | single pair of conductors. The 10BASE-T1L (Clause 146) is a long reach | 
 | PHY supporting full duplex point-to-point operation over 1 km of single | 
 | balanced pair of conductors. The 10BASE-T1S (Clause 147) is a short reach | 
 | PHY supporting full / half duplex point-to-point operation over 15 m of | 
 | single balanced pair of conductors, or half duplex multidrop bus | 
 | operation over 25 m of single balanced pair of conductors. | 
 |  | 
 | Furthermore, the IEEE 802.3cg project defines the new Physical Layer | 
 | Collision Avoidance (PLCA) Reconciliation Sublayer (Clause 148) meant to | 
 | provide improved determinism to the CSMA/CD media access method. PLCA | 
 | works in conjunction with the 10BASE-T1S PHY operating in multidrop mode. | 
 |  | 
 | The aforementioned PHYs are intended to cover the low-speed / low-cost | 
 | applications in industrial and automotive environment. The large number | 
 | of pins (16) required by the MII interface, which is specified by the | 
 | IEEE 802.3 in Clause 22, is one of the major cost factors that need to be | 
 | addressed to fulfil this objective. | 
 |  | 
 | The MAC-PHY solution integrates an IEEE Clause 4 MAC and a 10BASE-T1x PHY | 
 | exposing a low pin count Serial Peripheral Interface (SPI) to the host | 
 | microcontroller. This also enables the addition of Ethernet functionality | 
 | to existing low-end microcontrollers which do not integrate a MAC | 
 | controller. | 
 |  | 
 | Overview | 
 | -------- | 
 |  | 
 | The MAC-PHY is specified to carry both data (Ethernet frames) and control | 
 | (register access) transactions over a single full-duplex serial peripheral | 
 | interface. | 
 |  | 
 | Protocol Overview | 
 | ----------------- | 
 |  | 
 | Two types of transactions are defined in the protocol: data transactions | 
 | for Ethernet frame transfers and control transactions for register | 
 | read/write transfers. A chunk is the basic element of data transactions | 
 | and is composed of 4 bytes of overhead plus 64 bytes of payload size for | 
 | each chunk. Ethernet frames are transferred over one or more data chunks. | 
 | Control transactions consist of one or more register read/write control | 
 | commands. | 
 |  | 
 | SPI transactions are initiated by the SPI host with the assertion of CSn | 
 | low to the MAC-PHY and ends with the deassertion of CSn high. In between | 
 | each SPI transaction, the SPI host may need time for additional | 
 | processing and to setup the next SPI data or control transaction. | 
 |  | 
 | SPI data transactions consist of an equal number of transmit (TX) and | 
 | receive (RX) chunks. Chunks in both transmit and receive directions may | 
 | or may not contain valid frame data independent from each other, allowing | 
 | for the simultaneous transmission and reception of different length | 
 | frames. | 
 |  | 
 | Each transmit data chunk begins with a 32-bit data header followed by a | 
 | data chunk payload on MOSI. The data header indicates whether transmit | 
 | frame data is present and provides the information to determine which | 
 | bytes of the payload contain valid frame data. | 
 |  | 
 | In parallel, receive data chunks are received on MISO. Each receive data | 
 | chunk consists of a data chunk payload ending with a 32-bit data footer. | 
 | The data footer indicates if there is receive frame data present within | 
 | the payload or not and provides the information to determine which bytes | 
 | of the payload contain valid frame data. | 
 |  | 
 | Reference | 
 | --------- | 
 |  | 
 | 10BASE-T1x MAC-PHY Serial Interface Specification, | 
 |  | 
 | Link: https://opensig.org/download/document/OPEN_Alliance_10BASET1x_MAC-PHY_Serial_Interface_V1.1.pdf | 
 |  | 
 | Hardware Architecture | 
 | --------------------- | 
 |  | 
 | .. code-block:: none | 
 |  | 
 |   +----------+      +-------------------------------------+ | 
 |   |          |      |                MAC-PHY              | | 
 |   |          |<---->| +-----------+  +-------+  +-------+ | | 
 |   | SPI Host |      | | SPI Slave |  |  MAC  |  |  PHY  | | | 
 |   |          |      | +-----------+  +-------+  +-------+ | | 
 |   +----------+      +-------------------------------------+ | 
 |  | 
 | Software Architecture | 
 | --------------------- | 
 |  | 
 | .. code-block:: none | 
 |  | 
 |   +----------------------------------------------------------+ | 
 |   |                 Networking Subsystem                     | | 
 |   +----------------------------------------------------------+ | 
 |             / \                             / \ | 
 |              |                               | | 
 |              |                               | | 
 |             \ /                              | | 
 |   +----------------------+     +-----------------------------+ | 
 |   |     MAC Driver       |<--->| OPEN Alliance TC6 Framework | | 
 |   +----------------------+     +-----------------------------+ | 
 |             / \                             / \ | 
 |              |                               | | 
 |              |                               | | 
 |              |                              \ / | 
 |   +----------------------------------------------------------+ | 
 |   |                    SPI Subsystem                         | | 
 |   +----------------------------------------------------------+ | 
 |                           / \ | 
 |                            | | 
 |                            | | 
 |                           \ / | 
 |   +----------------------------------------------------------+ | 
 |   |                10BASE-T1x MAC-PHY Device                 | | 
 |   +----------------------------------------------------------+ | 
 |  | 
 | Implementation | 
 | -------------- | 
 |  | 
 | MAC Driver | 
 | ~~~~~~~~~~ | 
 |  | 
 | - Probed by SPI subsystem. | 
 |  | 
 | - Initializes OA TC6 framework for the MAC-PHY. | 
 |  | 
 | - Registers and configures the network device. | 
 |  | 
 | - Sends the tx ethernet frames from n/w subsystem to OA TC6 framework. | 
 |  | 
 | OPEN Alliance TC6 Framework | 
 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
 |  | 
 | - Initializes PHYLIB interface. | 
 |  | 
 | - Registers mac-phy interrupt. | 
 |  | 
 | - Performs mac-phy register read/write operation using the control | 
 |   transaction protocol specified in the OPEN Alliance 10BASE-T1x MAC-PHY | 
 |   Serial Interface specification. | 
 |  | 
 | - Performs Ethernet frames transaction using the data transaction protocol | 
 |   for Ethernet frames specified in the OPEN Alliance 10BASE-T1x MAC-PHY | 
 |   Serial Interface specification. | 
 |  | 
 | - Forwards the received Ethernet frame from 10Base-T1x MAC-PHY to n/w | 
 |   subsystem. | 
 |  | 
 | Data Transaction | 
 | ~~~~~~~~~~~~~~~~ | 
 |  | 
 | The Ethernet frames that are typically transferred from the SPI host to | 
 | the MAC-PHY will be converted into multiple transmit data chunks. Each | 
 | transmit data chunk will have a 4 bytes header which contains the | 
 | information needed to determine the validity and the location of the | 
 | transmit frame data within the 64 bytes data chunk payload. | 
 |  | 
 | .. code-block:: none | 
 |  | 
 |   +---------------------------------------------------+ | 
 |   |                     Tx Chunk                      | | 
 |   | +---------------------------+  +----------------+ |   MOSI | 
 |   | | 64 bytes chunk payload    |  | 4 bytes header | |------------> | 
 |   | +---------------------------+  +----------------+ | | 
 |   +---------------------------------------------------+ | 
 |  | 
 | 4 bytes header contains the below fields, | 
 |  | 
 | DNC (Bit 31) - Data-Not-Control flag. This flag specifies the type of SPI | 
 |                transaction. For TX data chunks, this bit shall be ’1’. | 
 |                0 - Control command | 
 |                1 - Data chunk | 
 |  | 
 | SEQ (Bit 30) - Data Chunk Sequence. This bit is used to indicate an | 
 |                even/odd transmit data chunk sequence to the MAC-PHY. | 
 |  | 
 | NORX (Bit 29) - No Receive flag. The SPI host may set this bit to prevent | 
 |                 the MAC-PHY from conveying RX data on the MISO for the | 
 |                 current chunk (DV = 0 in the footer), indicating that the | 
 |                 host would not process it. Typically, the SPI host should | 
 |                 set NORX = 0 indicating that it will accept and process | 
 |                 any receive frame data within the current chunk. | 
 |  | 
 | RSVD (Bit 28..24) - Reserved: All reserved bits shall be ‘0’. | 
 |  | 
 | VS (Bit 23..22) - Vendor Specific. These bits are implementation specific. | 
 |                   If the MAC-PHY does not implement these bits, the host | 
 |                   shall set them to ‘0’. | 
 |  | 
 | DV (Bit 21) - Data Valid flag. The SPI host uses this bit to indicate | 
 |               whether the current chunk contains valid transmit frame data | 
 |               (DV = 1) or not (DV = 0). When ‘0’, the MAC-PHY ignores the | 
 |               chunk payload. Note that the receive path is unaffected by | 
 |               the setting of the DV bit in the data header. | 
 |  | 
 | SV (Bit 20) - Start Valid flag. The SPI host shall set this bit when the | 
 |               beginning of an Ethernet frame is present in the current | 
 |               transmit data chunk payload. Otherwise, this bit shall be | 
 |               zero. This bit is not to be confused with the Start-of-Frame | 
 |               Delimiter (SFD) byte described in IEEE 802.3 [2]. | 
 |  | 
 | SWO (Bit 19..16) - Start Word Offset. When SV = 1, this field shall | 
 |                    contain the 32-bit word offset into the transmit data | 
 |                    chunk payload that points to the start of a new | 
 |                    Ethernet frame to be transmitted. The host shall write | 
 |                    this field as zero when SV = 0. | 
 |  | 
 | RSVD (Bit 15) - Reserved: All reserved bits shall be ‘0’. | 
 |  | 
 | EV (Bit 14) - End Valid flag. The SPI host shall set this bit when the end | 
 |               of an Ethernet frame is present in the current transmit data | 
 |               chunk payload. Otherwise, this bit shall be zero. | 
 |  | 
 | EBO (Bit 13..8) - End Byte Offset. When EV = 1, this field shall contain | 
 |                   the byte offset into the transmit data chunk payload | 
 |                   that points to the last byte of the Ethernet frame to | 
 |                   transmit. This field shall be zero when EV = 0. | 
 |  | 
 | TSC (Bit 7..6) - Timestamp Capture. Request a timestamp capture when the | 
 |                  frame is transmitted onto the network. | 
 |                  00 - Do not capture a timestamp | 
 |                  01 - Capture timestamp into timestamp capture register A | 
 |                  10 - Capture timestamp into timestamp capture register B | 
 |                  11 - Capture timestamp into timestamp capture register C | 
 |  | 
 | RSVD (Bit 5..1) - Reserved: All reserved bits shall be ‘0’. | 
 |  | 
 | P (Bit 0) - Parity. Parity bit calculated over the transmit data header. | 
 |             Method used is odd parity. | 
 |  | 
 | The number of buffers available in the MAC-PHY to store the incoming | 
 | transmit data chunk payloads is represented as transmit credits. The | 
 | available transmit credits in the MAC-PHY can be read either from the | 
 | Buffer Status Register or footer (Refer below for the footer info) | 
 | received from the MAC-PHY. The SPI host should not write more data chunks | 
 | than the available transmit credits as this will lead to transmit buffer | 
 | overflow error. | 
 |  | 
 | In case the previous data footer had no transmit credits available and | 
 | once the transmit credits become available for transmitting transmit data | 
 | chunks, the MAC-PHY interrupt is asserted to SPI host. On reception of the | 
 | first data header this interrupt will be deasserted and the received | 
 | footer for the first data chunk will have the transmit credits available | 
 | information. | 
 |  | 
 | The Ethernet frames that are typically transferred from MAC-PHY to SPI | 
 | host will be sent as multiple receive data chunks. Each receive data | 
 | chunk will have 64 bytes of data chunk payload followed by 4 bytes footer | 
 | which contains the information needed to determine the validity and the | 
 | location of the receive frame data within the 64 bytes data chunk payload. | 
 |  | 
 | .. code-block:: none | 
 |  | 
 |   +---------------------------------------------------+ | 
 |   |                     Rx Chunk                      | | 
 |   | +----------------+  +---------------------------+ |   MISO | 
 |   | | 4 bytes footer |  | 64 bytes chunk payload    | |------------> | 
 |   | +----------------+  +---------------------------+ | | 
 |   +---------------------------------------------------+ | 
 |  | 
 | 4 bytes footer contains the below fields, | 
 |  | 
 | EXST (Bit 31) - Extended Status. This bit is set when any bit in the | 
 |                 STATUS0 or STATUS1 registers are set and not masked. | 
 |  | 
 | HDRB (Bit 30) - Received Header Bad. When set, indicates that the MAC-PHY | 
 |                 received a control or data header with a parity error. | 
 |  | 
 | SYNC (Bit 29) - Configuration Synchronized flag. This bit reflects the | 
 |                 state of the SYNC bit in the CONFIG0 configuration | 
 |                 register (see Table 12). A zero indicates that the MAC-PHY | 
 |                 configuration may not be as expected by the SPI host. | 
 |                 Following configuration, the SPI host sets the | 
 |                 corresponding bitin the configuration register which is | 
 |                 reflected in this field. | 
 |  | 
 | RCA (Bit 28..24) - Receive Chunks Available. The RCA field indicates to | 
 |                    the SPI host the minimum number of additional receive | 
 |                    data chunks of frame data that are available for | 
 |                    reading beyond the current receive data chunk. This | 
 |                    field is zero when there is no receive frame data | 
 |                    pending in the MAC-PHY’s buffer for reading. | 
 |  | 
 | VS (Bit 23..22) - Vendor Specific. These bits are implementation specific. | 
 |                   If not implemented, the MAC-PHY shall set these bits to | 
 |                   ‘0’. | 
 |  | 
 | DV (Bit 21) - Data Valid flag. The MAC-PHY uses this bit to indicate | 
 |               whether the current receive data chunk contains valid | 
 |               receive frame data (DV = 1) or not (DV = 0). When ‘0’, the | 
 |               SPI host shall ignore the chunk payload. | 
 |  | 
 | SV (Bit 20) - Start Valid flag. The MAC-PHY sets this bit when the current | 
 |               chunk payload contains the start of an Ethernet frame. | 
 |               Otherwise, this bit is zero. The SV bit is not to be | 
 |               confused with the Start-of-Frame Delimiter (SFD) byte | 
 |               described in IEEE 802.3 [2]. | 
 |  | 
 | SWO (Bit 19..16) - Start Word Offset. When SV = 1, this field contains the | 
 |                    32-bit word offset into the receive data chunk payload | 
 |                    containing the first byte of a new received Ethernet | 
 |                    frame. When a receive timestamp has been added to the | 
 |                    beginning of the received Ethernet frame (RTSA = 1) | 
 |                    then SWO points to the most significant byte of the | 
 |                    timestamp. This field will be zero when SV = 0. | 
 |  | 
 | FD (Bit 15) - Frame Drop. When set, this bit indicates that the MAC has | 
 |               detected a condition for which the SPI host should drop the | 
 |               received Ethernet frame. This bit is only valid at the end | 
 |               of a received Ethernet frame (EV = 1) and shall be zero at | 
 |               all other times. | 
 |  | 
 | EV (Bit 14) - End Valid flag. The MAC-PHY sets this bit when the end of a | 
 |               received Ethernet frame is present in this receive data | 
 |               chunk payload. | 
 |  | 
 | EBO (Bit 13..8) - End Byte Offset: When EV = 1, this field contains the | 
 |                   byte offset into the receive data chunk payload that | 
 |                   locates the last byte of the received Ethernet frame. | 
 |                   This field is zero when EV = 0. | 
 |  | 
 | RTSA (Bit 7) - Receive Timestamp Added. This bit is set when a 32-bit or | 
 |                64-bit timestamp has been added to the beginning of the | 
 |                received Ethernet frame. The MAC-PHY shall set this bit to | 
 |                zero when SV = 0. | 
 |  | 
 | RTSP (Bit 6) - Receive Timestamp Parity. Parity bit calculated over the | 
 |                32-bit/64-bit timestamp added to the beginning of the | 
 |                received Ethernet frame. Method used is odd parity. The | 
 |                MAC-PHY shall set this bit to zero when RTSA = 0. | 
 |  | 
 | TXC (Bit 5..1) - Transmit Credits. This field contains the minimum number | 
 |                  of transmit data chunks of frame data that the SPI host | 
 |                  can write in a single transaction without incurring a | 
 |                  transmit buffer overflow error. | 
 |  | 
 | P (Bit 0) - Parity. Parity bit calculated over the receive data footer. | 
 |             Method used is odd parity. | 
 |  | 
 | SPI host will initiate the data receive transaction based on the receive | 
 | chunks available in the MAC-PHY which is provided in the receive chunk | 
 | footer (RCA - Receive Chunks Available). SPI host will create data invalid | 
 | transmit data chunks (empty chunks) or data valid transmit data chunks in | 
 | case there are valid Ethernet frames to transmit to the MAC-PHY. The | 
 | receive chunks available in MAC-PHY can be read either from the Buffer | 
 | Status Register or footer. | 
 |  | 
 | In case the previous data footer had no receive data chunks available and | 
 | once the receive data chunks become available again for reading, the | 
 | MAC-PHY interrupt is asserted to SPI host. On reception of the first data | 
 | header this interrupt will be deasserted and the received footer for the | 
 | first data chunk will have the receive chunks available information. | 
 |  | 
 | MAC-PHY Interrupt | 
 | ~~~~~~~~~~~~~~~~~ | 
 |  | 
 | The MAC-PHY interrupt is asserted when the following conditions are met. | 
 |  | 
 | Receive chunks available - This interrupt is asserted when the previous | 
 | data footer had no receive data chunks available and once the receive | 
 | data chunks become available for reading. On reception of the first data | 
 | header this interrupt will be deasserted. | 
 |  | 
 | Transmit chunk credits available - This interrupt is asserted when the | 
 | previous data footer indicated no transmit credits available and once the | 
 | transmit credits become available for transmitting transmit data chunks. | 
 | On reception of the first data header this interrupt will be deasserted. | 
 |  | 
 | Extended status event - This interrupt is asserted when the previous data | 
 | footer indicated no extended status and once the extended event become | 
 | available. In this case the host should read status #0 register to know | 
 | the corresponding error/event. On reception of the first data header this | 
 | interrupt will be deasserted. | 
 |  | 
 | Control Transaction | 
 | ~~~~~~~~~~~~~~~~~~~ | 
 |  | 
 | 4 bytes control header contains the below fields, | 
 |  | 
 | DNC (Bit 31) - Data-Not-Control flag. This flag specifies the type of SPI | 
 |                transaction. For control commands, this bit shall be ‘0’. | 
 |                0 - Control command | 
 |                1 - Data chunk | 
 |  | 
 | HDRB (Bit 30) - Received Header Bad. When set by the MAC-PHY, indicates | 
 |                 that a header was received with a parity error. The SPI | 
 |                 host should always clear this bit. The MAC-PHY ignores the | 
 |                 HDRB value sent by the SPI host on MOSI. | 
 |  | 
 | WNR (Bit 29) - Write-Not-Read. This bit indicates if data is to be written | 
 |                to registers (when set) or read from registers | 
 |                (when clear). | 
 |  | 
 | AID (Bit 28) - Address Increment Disable. When clear, the address will be | 
 |                automatically post-incremented by one following each | 
 |                register read or write. When set, address auto increment is | 
 |                disabled allowing successive reads and writes to occur at | 
 |                the same register address. | 
 |  | 
 | MMS (Bit 27..24) - Memory Map Selector. This field selects the specific | 
 |                    register memory map to access. | 
 |  | 
 | ADDR (Bit 23..8) - Address. Address of the first register within the | 
 |                    selected memory map to access. | 
 |  | 
 | LEN (Bit 7..1) - Length. Specifies the number of registers to read/write. | 
 |                  This field is interpreted as the number of registers | 
 |                  minus 1 allowing for up to 128 consecutive registers read | 
 |                  or written starting at the address specified in ADDR. A | 
 |                  length of zero shall read or write a single register. | 
 |  | 
 | P (Bit 0) - Parity. Parity bit calculated over the control command header. | 
 |             Method used is odd parity. | 
 |  | 
 | Control transactions consist of one or more control commands. Control | 
 | commands are used by the SPI host to read and write registers within the | 
 | MAC-PHY. Each control commands are composed of a 4 bytes control command | 
 | header followed by register write data in case of control write command. | 
 |  | 
 | The MAC-PHY ignores the final 4 bytes of data from the SPI host at the end | 
 | of the control write command. The control write command is also echoed | 
 | from the MAC-PHY back to the SPI host to identify which register write | 
 | failed in case of any bus errors. The echoed Control write command will | 
 | have the first 4 bytes unused value to be ignored by the SPI host | 
 | followed by 4 bytes echoed control header followed by echoed register | 
 | write data. Control write commands can write either a single register or | 
 | multiple consecutive registers. When multiple consecutive registers are | 
 | written, the address is automatically post-incremented by the MAC-PHY. | 
 | Writing to any unimplemented or undefined registers shall be ignored and | 
 | yield no effect. | 
 |  | 
 | The MAC-PHY ignores all data from the SPI host following the control | 
 | header for the remainder of the control read command. The control read | 
 | command is also echoed from the MAC-PHY back to the SPI host to identify | 
 | which register read is failed in case of any bus errors. The echoed | 
 | Control read command will have the first 4 bytes of unused value to be | 
 | ignored by the SPI host followed by 4 bytes echoed control header followed | 
 | by register read data. Control read commands can read either a single | 
 | register or multiple consecutive registers. When multiple consecutive | 
 | registers are read, the address is automatically post-incremented by the | 
 | MAC-PHY. Reading any unimplemented or undefined registers shall return | 
 | zero. | 
 |  | 
 | Device drivers API | 
 | ================== | 
 |  | 
 | The include/linux/oa_tc6.h defines the following functions: | 
 |  | 
 | .. c:function:: struct oa_tc6 *oa_tc6_init(struct spi_device *spi, \ | 
 |                                            struct net_device *netdev) | 
 |  | 
 | Initialize OA TC6 lib. | 
 |  | 
 | .. c:function:: void oa_tc6_exit(struct oa_tc6 *tc6) | 
 |  | 
 | Free allocated OA TC6 lib. | 
 |  | 
 | .. c:function:: int oa_tc6_write_register(struct oa_tc6 *tc6, u32 address, \ | 
 |                                           u32 value) | 
 |  | 
 | Write a single register in the MAC-PHY. | 
 |  | 
 | .. c:function:: int oa_tc6_write_registers(struct oa_tc6 *tc6, u32 address, \ | 
 |                                            u32 value[], u8 length) | 
 |  | 
 | Writing multiple consecutive registers starting from @address in the MAC-PHY. | 
 | Maximum of 128 consecutive registers can be written starting at @address. | 
 |  | 
 | .. c:function:: int oa_tc6_read_register(struct oa_tc6 *tc6, u32 address, \ | 
 |                                          u32 *value) | 
 |  | 
 | Read a single register in the MAC-PHY. | 
 |  | 
 | .. c:function:: int oa_tc6_read_registers(struct oa_tc6 *tc6, u32 address, \ | 
 |                                           u32 value[], u8 length) | 
 |  | 
 | Reading multiple consecutive registers starting from @address in the MAC-PHY. | 
 | Maximum of 128 consecutive registers can be read starting at @address. | 
 |  | 
 | .. c:function:: netdev_tx_t oa_tc6_start_xmit(struct oa_tc6 *tc6, \ | 
 |                                               struct sk_buff *skb); | 
 |  | 
 | The transmit Ethernet frame in the skb is or going to be transmitted through | 
 | the MAC-PHY. | 
 |  | 
 | .. c:function:: int oa_tc6_zero_align_receive_frame_enable(struct oa_tc6 *tc6); | 
 |  | 
 | Zero align receive frame feature can be enabled to align all receive ethernet | 
 | frames data to start at the beginning of any receive data chunk payload with a | 
 | start word offset (SWO) of zero. |