/* Two PHYs share the same 1588 processor and it's to be entirely configured *throughthebasePHYofthisprocessor.
*/ /* phydev->bus->mdio_lock should be locked when using this function */ staticint phy_ts_base_write(struct phy_device *phydev, u32 regnum, u16 val)
{ struct vsc8531_private *priv = phydev->priv;
/* phydev->bus->mdio_lock should be locked when using this function */ staticint phy_ts_base_read(struct phy_device *phydev, u32 regnum)
{ struct vsc8531_private *priv = phydev->priv;
val = vsc85xx_ts_read_csr(phydev, EGRESS, MSCC_PHY_ANA_ETH1_NTX_PROT);
val &= ~ANA_ETH1_NTX_PROT_SIG_OFF_MASK;
val |= ANA_ETH1_NTX_PROT_SIG_OFF(0);
vsc85xx_ts_write_csr(phydev, EGRESS, MSCC_PHY_ANA_ETH1_NTX_PROT, val);
val = vsc85xx_ts_read_csr(phydev, EGRESS, MSCC_PHY_ANA_FSB_CFG);
val &= ~ANA_FSB_ADDR_FROM_BLOCK_SEL_MASK;
val |= ANA_FSB_ADDR_FROM_ETH1;
vsc85xx_ts_write_csr(phydev, EGRESS, MSCC_PHY_ANA_FSB_CFG, val);
reg = vsc85xx_ts_read_csr(ptp->phydev, PROCESSOR,
MSCC_PHY_PTP_EGR_TS_FIFO(0)); if (reg & PTP_EGR_TS_FIFO_EMPTY) return;
*p++ = reg & 0xff;
*p++ = (reg >> 8) & 0xff;
/* Read the current FIFO item. Reading FIFO6 pops the next one. */ for (i = 1; i < 7; i++) {
reg = vsc85xx_ts_read_csr(ptp->phydev, PROCESSOR,
MSCC_PHY_PTP_EGR_TS_FIFO(i));
*p++ = reg & 0xff;
*p++ = (reg >> 8) & 0xff;
*p++ = (reg >> 16) & 0xff;
*p++ = (reg >> 24) & 0xff;
}
len = skb_queue_len_lockless(&ptp->tx_queue); if (len < 1) return;
while (len--) {
skb = skb_dequeue(&ptp->tx_queue); if (!skb) return;
/* Can't get the signature of the packet, won't ever *beabletohaveonesolet'sdequeuethepacket.
*/ if (get_sig(skb, skb_sig) < 0) {
kfree_skb(skb); continue;
}
/* Check if we found the signature we were looking for. */ if (!memcmp(skb_sig, fifo.sig, sizeof(fifo.sig))) {
memset(&shhwtstamps, 0, sizeof(shhwtstamps));
shhwtstamps.hwtstamp = ktime_set(fifo.secs, fifo.ns);
skb_complete_tx_timestamp(skb, &shhwtstamps);
return;
}
/* Valid signature but does not match the one of the *packetintheFIFOrightnow,rescheduleitforlater *packets.
*/
skb_queue_tail(&ptp->tx_queue, skb);
}
}
/* If other timestamps are available in the FIFO, process them. */
reg = vsc85xx_ts_read_csr(ptp->phydev, PROCESSOR,
MSCC_PHY_PTP_EGR_TS_FIFO_CTRL);
} while (PTP_EGR_FIFO_LEVEL_LAST_READ(reg) > 1);
}
val = vsc85xx_ts_read_csr(phydev, blk,
MSCC_ANA_ETH1_FLOW_MATCH_MODE(0));
val &= ~ANA_ETH1_FLOW_MATCH_VLAN_TAG_MASK;
val |= ANA_ETH1_FLOW_MATCH_VLAN_VERIFY;
vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_ETH1_FLOW_MATCH_MODE(0),
val);
vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_MATCH2_UPPER,
PTP_EV_PORT); /* Match on dest port only, ignore src */
vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_MASK2_UPPER, 0xffff);
vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_MATCH2_LOWER, 0);
vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_MASK2_LOWER, 0);
val = vsc85xx_ts_read_csr(phydev, blk, MSCC_ANA_IP1_FLOW_ENA(0));
val &= ~IP1_FLOW_ENA_CHANNEL_MASK_MASK;
val |= base ? IP1_FLOW_VALID_CH0 : IP1_FLOW_VALID_CH1;
vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_FLOW_ENA(0), val);
val = PTP_AUTO_ADJ_NS_ROLLOVER(adj);
val |= scaled_ppm > 0 ? PTP_AUTO_ADJ_ADD_1NS : PTP_AUTO_ADJ_SUB_1NS;
mutex_lock(&priv->phc_lock);
/* Update the ppb val in nano seconds to the auto adjust reg. */
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_AUTO_ADJ,
val);
/* The auto adjust update val is set to 0 after write operation. */
val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_CTRL);
val |= PTP_LTC_CTRL_AUTO_ADJ_UPDATE;
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_CTRL, val);
val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_CTRL);
val |= PTP_LTC_CTRL_SAVE_ENA;
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_CTRL, val);
/* Local Time Counter (LTC) is put in SAVE* regs on rising edge of *LOAD_SAVEpin.
*/
mutex_lock(&shared->gpio_lock);
gpiod_set_value(priv->load_save, 1);
val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
MSCC_PHY_PTP_LTC_SAVED_SEC_MSB);
ts->tv_sec = ((time64_t)val) << 32;
val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
MSCC_PHY_PTP_LTC_SAVED_SEC_LSB);
ts->tv_sec += val;
val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_CTRL);
val |= PTP_LTC_CTRL_LOAD_ENA;
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_CTRL, val);
/* Local Time Counter (LTC) is set from LOAD* regs on rising edge of *LOAD_SAVEpin.
*/
mutex_lock(&shared->gpio_lock);
gpiod_set_value(priv->load_save, 1);
val &= ~PTP_LTC_CTRL_LOAD_ENA;
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_CTRL, val);
val = vsc85xx_ts_read_csr(phydev, blk, MSCC_PHY_ANA_ETH1_NTX_PROT);
val &= ~ANA_ETH1_NTX_PROT_COMPARATOR_MASK;
val |= next_comp;
vsc85xx_ts_write_csr(phydev, blk, MSCC_PHY_ANA_ETH1_NTX_PROT, val);
val = ANA_ETH1_NXT_PROT_ETYPE_MATCH(etype) |
ANA_ETH1_NXT_PROT_ETYPE_MATCH_ENA;
vsc85xx_ts_write_csr(phydev, blk,
MSCC_PHY_ANA_ETH1_NXT_PROT_ETYPE_MATCH, val);
for (i = 0; i < ARRAY_SIZE(msgs); i++) { if (blk == INGRESS)
vsc85xx_ts_ptp_action_flow(phydev, blk, msgs[i],
PTP_WRITE_NS); elseif (msgs[i] == PTP_MSGTYPE_SYNC && one_step) /* no need to know Sync t when sending in one_step */
vsc85xx_ts_ptp_action_flow(phydev, blk, msgs[i],
PTP_WRITE_1588); else
vsc85xx_ts_ptp_action_flow(phydev, blk, msgs[i],
PTP_SAVE_IN_TS_FIFO);
val = vsc85xx_ts_read_csr(phydev, blk,
MSCC_ANA_PTP_FLOW_ENA(i));
val &= ~PTP_FLOW_ENA; if (enable)
val |= PTP_FLOW_ENA;
vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_PTP_FLOW_ENA(i),
val);
}
val = vsc85xx_ts_read_csr(phydev, blk, MSCC_ANA_ETH1_FLOW_ENA(0));
val &= ~ETH1_FLOW_ENA; if (enable)
val |= ETH1_FLOW_ENA;
vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_ETH1_FLOW_ENA(0), val);
/* Matching UDP protocol number */
val = ANA_IP1_NXT_PROT_IP_MATCH1_PROT_MASK(0xff) |
ANA_IP1_NXT_PROT_IP_MATCH1_PROT_MATCH(IPPROTO_UDP) |
ANA_IP1_NXT_PROT_IP_MATCH1_PROT_OFF(9);
vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_IP_MATCH1,
val);
/* End of IP protocol, start of next protocol (UDP) */
vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_OFFSET2,
ANA_IP1_NXT_PROT_OFFSET2(20));
val = vsc85xx_ts_read_csr(phydev, blk,
MSCC_ANA_IP1_NXT_PROT_UDP_CHKSUM);
val &= ~(IP1_NXT_PROT_UDP_CHKSUM_OFF_MASK |
IP1_NXT_PROT_UDP_CHKSUM_WIDTH_MASK);
val |= IP1_NXT_PROT_UDP_CHKSUM_WIDTH(2);
val &= ~(IP1_NXT_PROT_UDP_CHKSUM_UPDATE |
IP1_NXT_PROT_UDP_CHKSUM_CLEAR); /* UDP checksum offset in IPv4 packet *accordingto:https://tools.ietf.org/html/rfc768
*/
val |= IP1_NXT_PROT_UDP_CHKSUM_OFF(26); if (enable)
val |= IP1_NXT_PROT_UDP_CHKSUM_CLEAR;
vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_NXT_PROT_UDP_CHKSUM,
val);
val = vsc85xx_ts_read_csr(phydev, blk, MSCC_ANA_IP1_FLOW_ENA(0));
val &= ~(IP1_FLOW_MATCH_ADDR_MASK | IP1_FLOW_ENA);
val |= IP1_FLOW_MATCH_DEST_SRC_ADDR; if (enable)
val |= IP1_FLOW_ENA;
vsc85xx_ts_write_csr(phydev, blk, MSCC_ANA_IP1_FLOW_ENA(0), val);
val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
MSCC_PHY_PTP_ANALYZER_MODE); /* Disable INGRESS and EGRESS so engine eng_id can be reconfigured */
val &= ~(PTP_ANALYZER_MODE_EGR_ENA(BIT(eng_id)) |
PTP_ANALYZER_MODE_INGR_ENA(BIT(eng_id)));
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_ANALYZER_MODE,
val);
switch (cfg->tx_type) { case HWTSTAMP_TX_ONESTEP_SYNC:
one_step = true; break; case HWTSTAMP_TX_ON: break; case HWTSTAMP_TX_OFF:
skb_queue_purge(&vsc8531->ptp->tx_queue); break; default: return -ERANGE;
}
vsc8531->ptp->tx_type = cfg->tx_type;
switch (cfg->rx_filter) { case HWTSTAMP_FILTER_NONE: break; case HWTSTAMP_FILTER_PTP_V2_L4_EVENT: /* ETH->IP->UDP->PTP */ break; case HWTSTAMP_FILTER_PTP_V2_L2_EVENT: /* ETH->PTP */ break; default: return -ERANGE;
}
vsc8531->ptp->rx_filter = cfg->rx_filter;
mutex_lock(&vsc8531->ts_lock);
/* Disable predictor while configuring the 1588 block */
val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
MSCC_PHY_PTP_INGR_PREDICTOR);
val &= ~PTP_INGR_PREDICTOR_EN;
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_INGR_PREDICTOR,
val);
val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
MSCC_PHY_PTP_EGR_PREDICTOR);
val &= ~PTP_EGR_PREDICTOR_EN;
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_PREDICTOR,
val);
/* Bypass egress or ingress blocks if timestamping isn't used */
val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_IFACE_CTRL);
val &= ~(PTP_IFACE_CTRL_EGR_BYPASS | PTP_IFACE_CTRL_INGR_BYPASS); if (vsc8531->ptp->tx_type == HWTSTAMP_TX_OFF)
val |= PTP_IFACE_CTRL_EGR_BYPASS; if (vsc8531->ptp->rx_filter == HWTSTAMP_FILTER_NONE)
val |= PTP_IFACE_CTRL_INGR_BYPASS;
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_IFACE_CTRL, val);
/* Resetting FIFO so that it's empty after reconfiguration */
vsc85xx_ts_reset_fifo(phydev);
vsc85xx_ts_engine_init(phydev, one_step);
/* Re-enable predictors now */
val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
MSCC_PHY_PTP_INGR_PREDICTOR);
val |= PTP_INGR_PREDICTOR_EN;
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_INGR_PREDICTOR,
val);
val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
MSCC_PHY_PTP_EGR_PREDICTOR);
val |= PTP_EGR_PREDICTOR_EN;
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_PREDICTOR,
val);
if (!vsc8584_is_1588_input_clk_configured(phydev)) {
phy_lock_mdio_bus(phydev);
/* 1588_DIFF_INPUT_CLK configuration: Use an external clock for *theLTC,asper3.13.29intheVSC8584datasheet.
*/
phy_ts_base_write(phydev, MSCC_EXT_PAGE_ACCESS,
MSCC_PHY_PAGE_1588);
phy_ts_base_write(phydev, 29, 0x7ae0);
phy_ts_base_write(phydev, 30, 0xb71c);
phy_ts_base_write(phydev, MSCC_EXT_PAGE_ACCESS,
MSCC_PHY_PAGE_STANDARD);
phy_unlock_mdio_bus(phydev);
vsc8584_set_input_clk_configured(phydev);
}
/* Disable predictor before configuring the 1588 block */
val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
MSCC_PHY_PTP_INGR_PREDICTOR);
val &= ~PTP_INGR_PREDICTOR_EN;
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_INGR_PREDICTOR,
val);
val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
MSCC_PHY_PTP_EGR_PREDICTOR);
val &= ~PTP_EGR_PREDICTOR_EN;
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_PREDICTOR,
val);
/* By default, the internal clock of fixed rate 250MHz is used */
val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_CTRL);
val &= ~PTP_LTC_CTRL_CLK_SEL_MASK;
val |= PTP_LTC_CTRL_CLK_SEL_INTERNAL_250;
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_CTRL, val);
val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_SEQUENCE);
val &= ~PTP_LTC_SEQUENCE_A_MASK;
val |= PTP_LTC_SEQUENCE_A(ltc_seq_a[PHC_CLK_250MHZ]);
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_SEQUENCE, val);
val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_SEQ);
val &= ~(PTP_LTC_SEQ_ERR_MASK | PTP_LTC_SEQ_ADD_SUB); if (ltc_seq_e[PHC_CLK_250MHZ])
val |= PTP_LTC_SEQ_ADD_SUB;
val |= PTP_LTC_SEQ_ERR(ltc_seq_e[PHC_CLK_250MHZ]);
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_LTC_SEQ, val);
val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
MSCC_PHY_PTP_ACCUR_CFG_STATUS);
val |= PTP_ACCUR_CALIB_TRIGG;
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_ACCUR_CFG_STATUS,
val);
val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
MSCC_PHY_PTP_ACCUR_CFG_STATUS);
val &= ~PTP_ACCUR_CALIB_TRIGG;
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_ACCUR_CFG_STATUS,
val);
/* Do not access FIFO via SI */
val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
MSCC_PHY_PTP_TSTAMP_FIFO_SI);
val &= ~PTP_TSTAMP_FIFO_SI_EN;
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_TSTAMP_FIFO_SI,
val);
val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
MSCC_PHY_PTP_INGR_REWRITER_CTRL);
val &= ~PTP_INGR_REWRITER_REDUCE_PREAMBLE;
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_INGR_REWRITER_CTRL,
val);
val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
MSCC_PHY_PTP_EGR_REWRITER_CTRL);
val &= ~PTP_EGR_REWRITER_REDUCE_PREAMBLE;
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_REWRITER_CTRL,
val);
/* Put the flag that indicates the frame has been modified to bit 7 */
val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
MSCC_PHY_PTP_INGR_REWRITER_CTRL);
val |= PTP_INGR_REWRITER_FLAG_BIT_OFF(7) | PTP_INGR_REWRITER_FLAG_VAL;
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_INGR_REWRITER_CTRL,
val);
val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
MSCC_PHY_PTP_EGR_REWRITER_CTRL);
val |= PTP_EGR_REWRITER_FLAG_BIT_OFF(7);
val &= ~PTP_EGR_REWRITER_FLAG_VAL;
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_REWRITER_CTRL,
val);
/* 30bit mode for RX timestamp, only the nanoseconds are kept in *reservedfield.
*/
val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
MSCC_PHY_PTP_INGR_TSP_CTRL);
val |= PHY_PTP_INGR_TSP_CTRL_FRACT_NS;
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_INGR_TSP_CTRL,
val);
val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_TSP_CTRL);
val |= PHY_PTP_EGR_TSP_CTRL_FRACT_NS;
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_TSP_CTRL, val);
val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
MSCC_PHY_PTP_SERIAL_TOD_IFACE);
val |= PTP_SERIAL_TOD_IFACE_LS_AUTO_CLR;
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_SERIAL_TOD_IFACE,
val);
vsc85xx_ts_fsb_init(phydev);
/* Set the Egress timestamp FIFO configuration and status register */
val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
MSCC_PHY_PTP_EGR_TS_FIFO_CTRL);
val &= ~(PTP_EGR_TS_FIFO_SIG_BYTES_MASK | PTP_EGR_TS_FIFO_THRESH_MASK); /* 16 bytes for the signature, 10 for the timestamp in the TS FIFO */
val |= PTP_EGR_TS_FIFO_SIG_BYTES(16) | PTP_EGR_TS_FIFO_THRESH(7);
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_EGR_TS_FIFO_CTRL,
val);
vsc85xx_ts_reset_fifo(phydev);
val = PTP_IFACE_CTRL_CLK_ENA; if (!IS_ENABLED(CONFIG_MACSEC))
val |= PTP_IFACE_CTRL_GMII_PROT;
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_IFACE_CTRL, val);
vsc85xx_ts_set_latencies(phydev);
val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_VERSION_CODE);
val = vsc85xx_ts_read_csr(phydev, PROCESSOR, MSCC_PHY_PTP_IFACE_CTRL);
val |= PTP_IFACE_CTRL_EGR_BYPASS;
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_IFACE_CTRL, val);
val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
MSCC_PHY_PTP_ANALYZER_MODE); /* Disable INGRESS and EGRESS so engine eng_id can be reconfigured */
val &= ~(PTP_ANALYZER_MODE_EGR_ENA_MASK |
PTP_ANALYZER_MODE_INGR_ENA_MASK |
PTP_ANA_INGR_ENCAP_FLOW_MODE_MASK |
PTP_ANA_EGR_ENCAP_FLOW_MODE_MASK); /* Strict matching in flow (packets should match flows from the same *indexinallenabledcomparators(exceptPTP)).
*/
val |= PTP_ANA_SPLIT_ENCAP_FLOW | PTP_ANA_INGR_ENCAP_FLOW_MODE(0x7) |
PTP_ANA_EGR_ENCAP_FLOW_MODE(0x7);
vsc85xx_ts_write_csr(phydev, PROCESSOR, MSCC_PHY_PTP_ANALYZER_MODE,
val);
int vsc8584_ptp_init(struct phy_device *phydev)
{ switch (phydev->phy_id & phydev->drv->phy_id_mask) { case PHY_ID_VSC8572: case PHY_ID_VSC8574: case PHY_ID_VSC8575: case PHY_ID_VSC8582: case PHY_ID_VSC8584: return __vsc8584_init_ptp(phydev);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.