]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
net: lan966x: Don't read RX timestamp if not needed
authorHoratiu Vultur <horatiu.vultur@microchip.com>
Fri, 17 Mar 2023 15:27:12 +0000 (16:27 +0100)
committerDavid S. Miller <davem@davemloft.net>
Sun, 19 Mar 2023 15:21:48 +0000 (15:21 +0000)
Whenever a frame was received to the CPU, the HW is timestamping the
frame. In the IFH(Inter Frame Header) it is found the nanosecond part
of the timestamps the SW is required to read from HW the second part.
But reading the second part it seems to be a expensive operations, so
so change this such to read the second part only when rx filter is
enabled.
Doing this change gives the RX a performance boost of ~70mbit.

before:
[  5]   0.00-10.01  sec   546 MBytes   457 Mbits/sec    0 sender

now:
[  5]   0.00-10.01  sec   652 MBytes   530 Mbits/sec    0 sender

Signed-off-by: Horatiu Vultur <horatiu.vultur@microchip.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/microchip/lan966x/lan966x_fdma.c
drivers/net/ethernet/microchip/lan966x/lan966x_main.c
drivers/net/ethernet/microchip/lan966x/lan966x_main.h
drivers/net/ethernet/microchip/lan966x/lan966x_ptp.c

index 55b484b1056275c2b2409c5b14f82853c401eb95..2ed76bb61a73166ef3d8be78fe4c6d0114268760 100644 (file)
@@ -517,7 +517,7 @@ static struct sk_buff *lan966x_fdma_rx_get_frame(struct lan966x_rx *rx,
        if (likely(!(skb->dev->features & NETIF_F_RXFCS)))
                skb_trim(skb, skb->len - ETH_FCS_LEN);
 
-       lan966x_ptp_rxtstamp(lan966x, skb, timestamp);
+       lan966x_ptp_rxtstamp(lan966x, skb, src_port, timestamp);
        skb->protocol = eth_type_trans(skb, skb->dev);
 
        if (lan966x->bridge_mask & BIT(src_port)) {
index 685e8cd7658c9ed1f3ed73d33b2c6f88a271a633..4584a78c6ecbdd7b03a88f37eb60f0f5d015f08b 100644 (file)
@@ -668,7 +668,7 @@ static irqreturn_t lan966x_xtr_irq_handler(int irq, void *args)
                        *buf = val;
                }
 
-               lan966x_ptp_rxtstamp(lan966x, skb, timestamp);
+               lan966x_ptp_rxtstamp(lan966x, skb, src_port, timestamp);
                skb->protocol = eth_type_trans(skb, dev);
 
                if (lan966x->bridge_mask & BIT(src_port)) {
index cbdae0ab8bb6d285fe0167ef9b4712f2dcfcc5f0..851afb0166b19f2022f12e5c3b78c33e2b1f9207 100644 (file)
@@ -407,7 +407,8 @@ struct lan966x_port {
        struct phy *serdes;
        struct fwnode_handle *fwnode;
 
-       u8 ptp_cmd;
+       u8 ptp_tx_cmd;
+       bool ptp_rx_cmd;
        u16 ts_id;
        struct sk_buff_head tx_skbs;
 
@@ -527,7 +528,7 @@ void lan966x_ptp_deinit(struct lan966x *lan966x);
 int lan966x_ptp_hwtstamp_set(struct lan966x_port *port, struct ifreq *ifr);
 int lan966x_ptp_hwtstamp_get(struct lan966x_port *port, struct ifreq *ifr);
 void lan966x_ptp_rxtstamp(struct lan966x *lan966x, struct sk_buff *skb,
-                         u64 timestamp);
+                         u64 src_port, u64 timestamp);
 int lan966x_ptp_txtstamp_request(struct lan966x_port *port,
                                 struct sk_buff *skb);
 void lan966x_ptp_txtstamp_release(struct lan966x_port *port,
index 931e37b9a0ada4ebdfec89fbdcbf994eb3c12530..266a21a2d124698b00d1e4040b97714150d7f1da 100644 (file)
@@ -272,13 +272,13 @@ int lan966x_ptp_hwtstamp_set(struct lan966x_port *port, struct ifreq *ifr)
 
        switch (cfg.tx_type) {
        case HWTSTAMP_TX_ON:
-               port->ptp_cmd = IFH_REW_OP_TWO_STEP_PTP;
+               port->ptp_tx_cmd = IFH_REW_OP_TWO_STEP_PTP;
                break;
        case HWTSTAMP_TX_ONESTEP_SYNC:
-               port->ptp_cmd = IFH_REW_OP_ONE_STEP_PTP;
+               port->ptp_tx_cmd = IFH_REW_OP_ONE_STEP_PTP;
                break;
        case HWTSTAMP_TX_OFF:
-               port->ptp_cmd = IFH_REW_OP_NOOP;
+               port->ptp_tx_cmd = IFH_REW_OP_NOOP;
                break;
        default:
                return -ERANGE;
@@ -286,6 +286,7 @@ int lan966x_ptp_hwtstamp_set(struct lan966x_port *port, struct ifreq *ifr)
 
        switch (cfg.rx_filter) {
        case HWTSTAMP_FILTER_NONE:
+               port->ptp_rx_cmd = false;
                break;
        case HWTSTAMP_FILTER_ALL:
        case HWTSTAMP_FILTER_PTP_V1_L4_EVENT:
@@ -301,6 +302,7 @@ int lan966x_ptp_hwtstamp_set(struct lan966x_port *port, struct ifreq *ifr)
        case HWTSTAMP_FILTER_PTP_V2_SYNC:
        case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ:
        case HWTSTAMP_FILTER_NTP_ALL:
+               port->ptp_rx_cmd = true;
                cfg.rx_filter = HWTSTAMP_FILTER_ALL;
                break;
        default:
@@ -332,7 +334,7 @@ static int lan966x_ptp_classify(struct lan966x_port *port, struct sk_buff *skb)
        u8 msgtype;
        int type;
 
-       if (port->ptp_cmd == IFH_REW_OP_NOOP)
+       if (port->ptp_tx_cmd == IFH_REW_OP_NOOP)
                return IFH_REW_OP_NOOP;
 
        type = ptp_classify_raw(skb);
@@ -343,7 +345,7 @@ static int lan966x_ptp_classify(struct lan966x_port *port, struct sk_buff *skb)
        if (!header)
                return IFH_REW_OP_NOOP;
 
-       if (port->ptp_cmd == IFH_REW_OP_TWO_STEP_PTP)
+       if (port->ptp_tx_cmd == IFH_REW_OP_TWO_STEP_PTP)
                return IFH_REW_OP_TWO_STEP_PTP;
 
        /* If it is sync and run 1 step then set the correct operation,
@@ -1009,9 +1011,6 @@ static int lan966x_ptp_phc_init(struct lan966x *lan966x,
        phc->index = index;
        phc->lan966x = lan966x;
 
-       /* PTP Rx stamping is always enabled.  */
-       phc->hwtstamp_config.rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT;
-
        return 0;
 }
 
@@ -1088,14 +1087,15 @@ void lan966x_ptp_deinit(struct lan966x *lan966x)
 }
 
 void lan966x_ptp_rxtstamp(struct lan966x *lan966x, struct sk_buff *skb,
-                         u64 timestamp)
+                         u64 src_port, u64 timestamp)
 {
        struct skb_shared_hwtstamps *shhwtstamps;
        struct lan966x_phc *phc;
        struct timespec64 ts;
        u64 full_ts_in_ns;
 
-       if (!lan966x->ptp)
+       if (!lan966x->ptp ||
+           !lan966x->ports[src_port]->ptp_rx_cmd)
                return;
 
        phc = &lan966x->phc[LAN966X_PHC_PORT];