raw/ifpga/base: align send buffer for SPI
authorTianfei Zhang <tianfei.zhang@intel.com>
Thu, 14 Nov 2019 09:02:54 +0000 (17:02 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Wed, 20 Nov 2019 16:36:05 +0000 (17:36 +0100)
The length of send buffer of SPI bus should be 4bytes align.

Signed-off-by: Tianfei Zhang <tianfei.zhang@intel.com>
Signed-off-by: Andy Pei <andy.pei@intel.com>
drivers/raw/ifpga/base/opae_spi_transaction.c

index 17ec3c1..06ca625 100644 (file)
@@ -109,6 +109,34 @@ done:
        return ret;
 }
 
+static void phy_tx_pad(unsigned char *phy_buf, unsigned int phy_buf_len,
+               unsigned int *aligned_len)
+{
+       unsigned char *p = &phy_buf[phy_buf_len - 1], *dst_p;
+
+       *aligned_len = IFPGA_ALIGN(phy_buf_len, 4);
+
+       if (*aligned_len == phy_buf_len)
+               return;
+
+       dst_p = &phy_buf[*aligned_len - 1];
+
+       /* move EOP and bytes after EOP to the end of aligned size */
+       while (p > phy_buf) {
+               *dst_p = *p;
+
+               if (*p == SPI_PACKET_EOP)
+                       break;
+
+               p--;
+               dst_p--;
+       }
+
+       /* fill the hole with PHY_IDLE */
+       while (p < dst_p)
+               *p++ = SPI_BYTE_IDLE;
+}
+
 static int byte_to_core_convert(struct spi_transaction_dev *dev,
                unsigned int send_len, unsigned char *send_data,
                unsigned int resp_len, unsigned char *resp_data,
@@ -149,15 +177,19 @@ static int byte_to_core_convert(struct spi_transaction_dev *dev,
                }
        }
 
-       print_buffer("before spi:", send_packet, p-send_packet);
+       tx_len = p - send_packet;
+
+       print_buffer("before spi:", send_packet, tx_len);
 
-       reorder_phy_data(32, send_packet, p - send_packet);
+       phy_tx_pad(send_packet, tx_len, &tx_len);
+       print_buffer("after pad:", send_packet, tx_len);
 
-       print_buffer("after order to spi:", send_packet, p-send_packet);
+       reorder_phy_data(32, send_packet, tx_len);
+
+       print_buffer("after order to spi:", send_packet, tx_len);
 
        /* call spi */
        tx_buffer = send_packet;
-       tx_len = p - send_packet;
        rx_buffer = resp_packet;
        rx_len = resp_max_len;
        spi_flags = SPI_NOT_FOUND;