X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fraw%2Fifpga%2Fbase%2Fopae_spi_transaction.c;h=013efee3e60b372aa0a907c7d5e7b8f9e942b5b2;hb=0d6ef740e411180a40e93419e403690ab788985f;hp=06ca62598c2b07ee32e1ea22392d2a674d8a733d;hpb=ec2613b746d42d2911dfdc3f7ff5bd0b79a01211;p=dpdk.git diff --git a/drivers/raw/ifpga/base/opae_spi_transaction.c b/drivers/raw/ifpga/base/opae_spi_transaction.c index 06ca62598c..013efee3e6 100644 --- a/drivers/raw/ifpga/base/opae_spi_transaction.c +++ b/drivers/raw/ifpga/base/opae_spi_transaction.c @@ -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); + } }