net/ice: support flow ops thread safe
[dpdk.git] / drivers / raw / ifpga / base / opae_spi_transaction.c
index 06ca625..013efee 100644 (file)
@@ -154,6 +154,8 @@ static int byte_to_core_convert(struct spi_transaction_dev *dev,
        unsigned int rx_len = 0;
        int retry = 0;
        int spi_flags;
+       unsigned long timeout = msecs_to_timer_cycles(1000);
+       unsigned long ticks;
        unsigned int resp_max_len = 2 * resp_len;
 
        print_buffer("before bytes:", send_data, send_len);
@@ -207,8 +209,11 @@ read_again:
        if (ret != SPI_FOUND_EOP) {
                tx_buffer = NULL;
                tx_len = 0;
-               if (retry++ > 10) {
-                       dev_err(NULL, "cannot found valid data from SPI\n");
+               ticks = rte_get_timer_cycles();
+               if (time_after(ticks, timeout) &&
+                               retry++ > SPI_MAX_RETRY) {
+                       dev_err(NULL, "Have retry %d, found invalid packet data\n",
+                               retry);
                        return -EBUSY;
                }
 
@@ -427,23 +432,36 @@ static int do_transaction(struct spi_transaction_dev *dev, unsigned int addr,
 int spi_transaction_read(struct spi_transaction_dev *dev, unsigned int addr,
                unsigned int size, unsigned char *data)
 {
-       return do_transaction(dev, addr, size, data,
+       int ret;
+
+       pthread_mutex_lock(&dev->lock);
+       ret = do_transaction(dev, addr, size, data,
                        (size > SPI_REG_BYTES) ?
                        SPI_TRAN_SEQ_READ : SPI_TRAN_NON_SEQ_READ);
+       pthread_mutex_unlock(&dev->lock);
+
+       return ret;
 }
 
 int spi_transaction_write(struct spi_transaction_dev *dev, unsigned int addr,
                unsigned int size, unsigned char *data)
 {
-       return do_transaction(dev, addr, size, data,
+       int ret;
+
+       pthread_mutex_lock(&dev->lock);
+       ret = do_transaction(dev, addr, size, data,
                        (size > SPI_REG_BYTES) ?
                        SPI_TRAN_SEQ_WRITE : SPI_TRAN_NON_SEQ_WRITE);
+       pthread_mutex_unlock(&dev->lock);
+
+       return ret;
 }
 
 struct spi_transaction_dev *spi_transaction_init(struct altera_spi_device *dev,
                int chipselect)
 {
        struct spi_transaction_dev *spi_tran_dev;
+       int ret;
 
        spi_tran_dev = opae_malloc(sizeof(struct spi_transaction_dev));
        if (!spi_tran_dev)
@@ -453,18 +471,28 @@ struct spi_transaction_dev *spi_transaction_init(struct altera_spi_device *dev,
        spi_tran_dev->chipselect = chipselect;
 
        spi_tran_dev->buffer = opae_malloc(sizeof(struct spi_tran_buffer));
-       if (!spi_tran_dev->buffer) {
-               opae_free(spi_tran_dev);
-               return NULL;
+       if (!spi_tran_dev->buffer)
+               goto err;
+
+       ret = pthread_mutex_init(&spi_tran_dev->lock, NULL);
+       if (ret) {
+               dev_err(spi_tran_dev, "fail to init mutex lock\n");
+               goto err;
        }
 
        return spi_tran_dev;
+
+err:
+       opae_free(spi_tran_dev);
+       return NULL;
 }
 
 void spi_transaction_remove(struct spi_transaction_dev *dev)
 {
        if (dev && dev->buffer)
                opae_free(dev->buffer);
-       if (dev)
+       if (dev) {
+               pthread_mutex_destroy(&dev->lock);
                opae_free(dev);
+       }
 }