]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
fsl/fman: add set_tstamp interface
authorYangbo Lu <yangbo.lu@nxp.com>
Mon, 25 Jun 2018 12:37:12 +0000 (20:37 +0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 26 Jun 2018 13:15:14 +0000 (22:15 +0900)
This patch is to add set_tstamp interface for memac,
dtsec, and 10GEC controllers to configure HW timestamping.

Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
Acked-by: Richard Cochran <richardcochran@gmail.com>
Acked-by: Madalin Bucur <madalin.bucur@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/freescale/fman/fman_dtsec.c
drivers/net/ethernet/freescale/fman/fman_dtsec.h
drivers/net/ethernet/freescale/fman/fman_memac.c
drivers/net/ethernet/freescale/fman/fman_memac.h
drivers/net/ethernet/freescale/fman/fman_tgec.c
drivers/net/ethernet/freescale/fman/fman_tgec.h
drivers/net/ethernet/freescale/fman/mac.c
drivers/net/ethernet/freescale/fman/mac.h

index 57b1e2b47c0a9c68a8bfeb18e166804c3fe0cacd..1ca543ac8f2cd606e5b6e5e727a4f21b96e8550e 100644 (file)
 #define DTSEC_ECNTRL_R100M             0x00000008
 #define DTSEC_ECNTRL_QSGMIIM           0x00000001
 
+#define TCTRL_TTSE                     0x00000040
 #define TCTRL_GTS                      0x00000020
 
 #define RCTRL_PAL_MASK                 0x001f0000
 #define RCTRL_PAL_SHIFT                        16
 #define RCTRL_GHTX                     0x00000400
+#define RCTRL_RTSE                     0x00000040
 #define RCTRL_GRS                      0x00000020
 #define RCTRL_MPROM                    0x00000008
 #define RCTRL_RSF                      0x00000004
@@ -1136,6 +1138,31 @@ int dtsec_set_allmulti(struct fman_mac *dtsec, bool enable)
        return 0;
 }
 
+int dtsec_set_tstamp(struct fman_mac *dtsec, bool enable)
+{
+       struct dtsec_regs __iomem *regs = dtsec->regs;
+       u32 rctrl, tctrl;
+
+       if (!is_init_done(dtsec->dtsec_drv_param))
+               return -EINVAL;
+
+       rctrl = ioread32be(&regs->rctrl);
+       tctrl = ioread32be(&regs->tctrl);
+
+       if (enable) {
+               rctrl |= RCTRL_RTSE;
+               tctrl |= TCTRL_TTSE;
+       } else {
+               rctrl &= ~RCTRL_RTSE;
+               tctrl &= ~TCTRL_TTSE;
+       }
+
+       iowrite32be(rctrl, &regs->rctrl);
+       iowrite32be(tctrl, &regs->tctrl);
+
+       return 0;
+}
+
 int dtsec_del_hash_mac_address(struct fman_mac *dtsec, enet_addr_t *eth_addr)
 {
        struct dtsec_regs __iomem *regs = dtsec->regs;
index 1a689adf5a22744a12d81f8ef1f535f1f9d420f4..5149d96ec2c15e80648700a18d6d56cb522751c6 100644 (file)
@@ -56,5 +56,6 @@ int dtsec_add_hash_mac_address(struct fman_mac *dtsec, enet_addr_t *eth_addr);
 int dtsec_del_hash_mac_address(struct fman_mac *dtsec, enet_addr_t *eth_addr);
 int dtsec_get_version(struct fman_mac *dtsec, u32 *mac_version);
 int dtsec_set_allmulti(struct fman_mac *dtsec, bool enable);
+int dtsec_set_tstamp(struct fman_mac *dtsec, bool enable);
 
 #endif /* __DTSEC_H */
index 446a97b792e3dea467f96c4fed3dfee1cd7840f4..bc6eb30aa20f1736cc49a78531a945740a76a62f 100644 (file)
@@ -964,6 +964,11 @@ int memac_set_allmulti(struct fman_mac *memac, bool enable)
        return 0;
 }
 
+int memac_set_tstamp(struct fman_mac *memac, bool enable)
+{
+       return 0; /* Always enabled. */
+}
+
 int memac_del_hash_mac_address(struct fman_mac *memac, enet_addr_t *eth_addr)
 {
        struct memac_regs __iomem *regs = memac->regs;
index b5a50338ed9ae21dd824129295ec868454c1da1a..b2c671ec0ce7909dc4ae0f79e40487430ed8f9e1 100644 (file)
@@ -58,5 +58,6 @@ int memac_set_exception(struct fman_mac *memac,
 int memac_add_hash_mac_address(struct fman_mac *memac, enet_addr_t *eth_addr);
 int memac_del_hash_mac_address(struct fman_mac *memac, enet_addr_t *eth_addr);
 int memac_set_allmulti(struct fman_mac *memac, bool enable);
+int memac_set_tstamp(struct fman_mac *memac, bool enable);
 
 #endif /* __MEMAC_H */
index 284735d4ebe9bbd452fd902c6723a6deb99cbd69..40705938eeccfb4e532d9d2732774934172bac6c 100644 (file)
@@ -44,6 +44,7 @@
 #define TGEC_TX_IPG_LENGTH_MASK        0x000003ff
 
 /* Command and Configuration Register (COMMAND_CONFIG) */
+#define CMD_CFG_EN_TIMESTAMP           0x00100000
 #define CMD_CFG_NO_LEN_CHK             0x00020000
 #define CMD_CFG_PAUSE_IGNORE           0x00000100
 #define CMF_CFG_CRC_FWD                        0x00000040
@@ -588,6 +589,26 @@ int tgec_set_allmulti(struct fman_mac *tgec, bool enable)
        return 0;
 }
 
+int tgec_set_tstamp(struct fman_mac *tgec, bool enable)
+{
+       struct tgec_regs __iomem *regs = tgec->regs;
+       u32 tmp;
+
+       if (!is_init_done(tgec->cfg))
+               return -EINVAL;
+
+       tmp = ioread32be(&regs->command_config);
+
+       if (enable)
+               tmp |= CMD_CFG_EN_TIMESTAMP;
+       else
+               tmp &= ~CMD_CFG_EN_TIMESTAMP;
+
+       iowrite32be(tmp, &regs->command_config);
+
+       return 0;
+}
+
 int tgec_del_hash_mac_address(struct fman_mac *tgec, enet_addr_t *eth_addr)
 {
        struct tgec_regs __iomem *regs = tgec->regs;
index cbbd3b422a98b43a50a0c5a1e33705051f9b02dd..3bfd1062b386dea6ecc2ea3cfa58463a29166cd1 100644 (file)
@@ -52,5 +52,6 @@ int tgec_add_hash_mac_address(struct fman_mac *tgec, enet_addr_t *eth_addr);
 int tgec_del_hash_mac_address(struct fman_mac *tgec, enet_addr_t *eth_addr);
 int tgec_get_version(struct fman_mac *tgec, u32 *mac_version);
 int tgec_set_allmulti(struct fman_mac *tgec, bool enable);
+int tgec_set_tstamp(struct fman_mac *tgec, bool enable);
 
 #endif /* __TGEC_H */
index 7b5b95f52c098535942f625001847a2ea26dbeb3..a847b9c3b31a9a4e5c9c6f9734973c89d596e4c6 100644 (file)
@@ -471,6 +471,7 @@ static void setup_dtsec(struct mac_device *mac_dev)
        mac_dev->set_rx_pause           = dtsec_accept_rx_pause_frames;
        mac_dev->set_exception          = dtsec_set_exception;
        mac_dev->set_allmulti           = dtsec_set_allmulti;
+       mac_dev->set_tstamp             = dtsec_set_tstamp;
        mac_dev->set_multi              = set_multi;
        mac_dev->start                  = start;
        mac_dev->stop                   = stop;
@@ -490,6 +491,7 @@ static void setup_tgec(struct mac_device *mac_dev)
        mac_dev->set_rx_pause           = tgec_accept_rx_pause_frames;
        mac_dev->set_exception          = tgec_set_exception;
        mac_dev->set_allmulti           = tgec_set_allmulti;
+       mac_dev->set_tstamp             = tgec_set_tstamp;
        mac_dev->set_multi              = set_multi;
        mac_dev->start                  = start;
        mac_dev->stop                   = stop;
@@ -509,6 +511,7 @@ static void setup_memac(struct mac_device *mac_dev)
        mac_dev->set_rx_pause           = memac_accept_rx_pause_frames;
        mac_dev->set_exception          = memac_set_exception;
        mac_dev->set_allmulti           = memac_set_allmulti;
+       mac_dev->set_tstamp             = memac_set_tstamp;
        mac_dev->set_multi              = set_multi;
        mac_dev->start                  = start;
        mac_dev->stop                   = stop;
index b520cec120ee0af8fc571f8820079cffad8e4371..824a81a9f35072cdd39a0a8ba5ba041f20da1301 100644 (file)
@@ -68,6 +68,7 @@ struct mac_device {
        int (*set_promisc)(struct fman_mac *mac_dev, bool enable);
        int (*change_addr)(struct fman_mac *mac_dev, enet_addr_t *enet_addr);
        int (*set_allmulti)(struct fman_mac *mac_dev, bool enable);
+       int (*set_tstamp)(struct fman_mac *mac_dev, bool enable);
        int (*set_multi)(struct net_device *net_dev,
                         struct mac_device *mac_dev);
        int (*set_rx_pause)(struct fman_mac *mac_dev, bool en);