octeontx2-af: Sync hw mbox with bounce buffer.
authorGeetha sowjanya <gakula@marvell.com>
Thu, 14 Nov 2019 05:26:24 +0000 (10:56 +0530)
committerDavid S. Miller <davem@davemloft.net>
Fri, 15 Nov 2019 02:09:15 +0000 (18:09 -0800)
If mailbox client has a bounce buffer or a intermediate buffer where
mbox messages are framed then copy them from there to HW buffer.
If 'mbase' and 'hw_mbase' are not same then assume 'mbase' points to
bounce buffer.

This patch also adds msg_size field to mbox header to copy only valid
data instead of whole buffer.

Signed-off-by: Geetha sowjanya <gakula@marvell.com>
Signed-off-by: Sunil Goutham <sgoutham@marvell.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/marvell/octeontx2/af/mbox.c
drivers/net/ethernet/marvell/octeontx2/af/mbox.h

index 81c83d27a4248012bd6d9e75d35e390576948915..387e33fa417aadfe1fbbfd3d9e6b390bb4c9f240 100644 (file)
@@ -19,17 +19,20 @@ static const u16 msgs_offset = ALIGN(sizeof(struct mbox_hdr), MBOX_MSG_ALIGN);
 
 void otx2_mbox_reset(struct otx2_mbox *mbox, int devid)
 {
+       void *hw_mbase = mbox->hwbase + (devid * MBOX_SIZE);
        struct otx2_mbox_dev *mdev = &mbox->dev[devid];
        struct mbox_hdr *tx_hdr, *rx_hdr;
 
-       tx_hdr = mdev->mbase + mbox->tx_start;
-       rx_hdr = mdev->mbase + mbox->rx_start;
+       tx_hdr = hw_mbase + mbox->tx_start;
+       rx_hdr = hw_mbase + mbox->rx_start;
 
        spin_lock(&mdev->mbox_lock);
        mdev->msg_size = 0;
        mdev->rsp_size = 0;
        tx_hdr->num_msgs = 0;
+       tx_hdr->msg_size = 0;
        rx_hdr->num_msgs = 0;
+       rx_hdr->msg_size = 0;
        spin_unlock(&mdev->mbox_lock);
 }
 EXPORT_SYMBOL(otx2_mbox_reset);
@@ -133,16 +136,17 @@ EXPORT_SYMBOL(otx2_mbox_init);
 
 int otx2_mbox_wait_for_rsp(struct otx2_mbox *mbox, int devid)
 {
+       unsigned long timeout = jiffies + msecs_to_jiffies(MBOX_RSP_TIMEOUT);
        struct otx2_mbox_dev *mdev = &mbox->dev[devid];
-       int timeout = 0, sleep = 1;
+       struct device *sender = &mbox->pdev->dev;
 
-       while (mdev->num_msgs != mdev->msgs_acked) {
-               msleep(sleep);
-               timeout += sleep;
-               if (timeout >= MBOX_RSP_TIMEOUT)
-                       return -EIO;
+       while (!time_after(jiffies, timeout)) {
+               if (mdev->num_msgs == mdev->msgs_acked)
+                       return 0;
+               usleep_range(800, 1000);
        }
-       return 0;
+       dev_dbg(sender, "timed out while waiting for rsp\n");
+       return -EIO;
 }
 EXPORT_SYMBOL(otx2_mbox_wait_for_rsp);
 
@@ -162,13 +166,25 @@ EXPORT_SYMBOL(otx2_mbox_busy_poll_for_rsp);
 
 void otx2_mbox_msg_send(struct otx2_mbox *mbox, int devid)
 {
+       void *hw_mbase = mbox->hwbase + (devid * MBOX_SIZE);
        struct otx2_mbox_dev *mdev = &mbox->dev[devid];
        struct mbox_hdr *tx_hdr, *rx_hdr;
 
-       tx_hdr = mdev->mbase + mbox->tx_start;
-       rx_hdr = mdev->mbase + mbox->rx_start;
+       tx_hdr = hw_mbase + mbox->tx_start;
+       rx_hdr = hw_mbase + mbox->rx_start;
+
+       /* If bounce buffer is implemented copy mbox messages from
+        * bounce buffer to hw mbox memory.
+        */
+       if (mdev->mbase != hw_mbase)
+               memcpy(hw_mbase + mbox->tx_start + msgs_offset,
+                      mdev->mbase + mbox->tx_start + msgs_offset,
+                      mdev->msg_size);
 
        spin_lock(&mdev->mbox_lock);
+
+       tx_hdr->msg_size = mdev->msg_size;
+
        /* Reset header for next messages */
        mdev->msg_size = 0;
        mdev->rsp_size = 0;
@@ -215,7 +231,7 @@ struct mbox_msghdr *otx2_mbox_alloc_msg_rsp(struct otx2_mbox *mbox, int devid,
        msghdr = mdev->mbase + mbox->tx_start + msgs_offset + mdev->msg_size;
 
        /* Clear the whole msg region */
-       memset(msghdr, 0, sizeof(*msghdr) + size);
+       memset(msghdr, 0, size);
        /* Init message header with reset values */
        msghdr->ver = OTX2_MBOX_VERSION;
        mdev->msg_size += size;
index 25f0e6f7fb39feb08e01e9832535b05ac8dec476..94c198a34ecd3ac41b451092ededdad617ee2bba 100644 (file)
@@ -36,7 +36,7 @@
 
 #define INTR_MASK(pfvfs) ((pfvfs < 64) ? (BIT_ULL(pfvfs) - 1) : (~0ull))
 
-#define MBOX_RSP_TIMEOUT       1000 /* in ms, Time to wait for mbox response */
+#define MBOX_RSP_TIMEOUT       2000 /* Time(ms) to wait for mbox response */
 
 #define MBOX_MSG_ALIGN         16  /* Align mbox msg start to 16bytes */
 
@@ -75,6 +75,7 @@ struct otx2_mbox {
 
 /* Header which preceeds all mbox messages */
 struct mbox_hdr {
+       u64 msg_size;   /* Total msgs size embedded */
        u16  num_msgs;   /* No of msgs embedded */
 };