You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by gn...@apache.org on 2020/03/31 20:58:18 UTC
[incubator-nuttx] branch master updated: Check return from
nxsem_wait_uninterruptible This commit is only for those files under
drivers/1wire, drivers/bch, drivers/can and drivers/mmcsd.
This is an automated email from the ASF dual-hosted git repository.
gnutt pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 997d4fa Check return from nxsem_wait_uninterruptible This commit is only for those files under drivers/1wire, drivers/bch, drivers/can and drivers/mmcsd.
997d4fa is described below
commit 997d4fabb062276c9cf10cd43b0c950a54e0ca7d
Author: Ouss4 <ab...@gmail.com>
AuthorDate: Tue Mar 31 22:19:07 2020 +0100
Check return from nxsem_wait_uninterruptible
This commit is only for those files under drivers/1wire, drivers/bch,
drivers/can and drivers/mmcsd.
---
drivers/1wire/1wire.c | 53 ++++++++++++++----
drivers/1wire/1wire_internal.h | 6 ++-
drivers/1wire/ds28e17.c | 84 ++++++++++++++++++++++-------
drivers/bch/bch.h | 2 +-
drivers/bch/bchdev_driver.c | 49 ++++++++++++++---
drivers/bch/bchlib_sem.c | 4 +-
drivers/can/mcp2515.c | 119 ++++++++++++++++++++++++++++-------------
drivers/mmcsd/mmcsd_sdio.c | 71 ++++++++++++++++++++----
drivers/mmcsd/mmcsd_spi.c | 76 +++++++++++++++++++-------
9 files changed, 355 insertions(+), 109 deletions(-)
diff --git a/drivers/1wire/1wire.c b/drivers/1wire/1wire.c
index f793dbf..3f86bf5 100644
--- a/drivers/1wire/1wire.c
+++ b/drivers/1wire/1wire.c
@@ -143,7 +143,7 @@ static inline void onewire_sem_destroy(FAR struct onewire_sem_s *sem)
nxsem_destroy(&sem->sem);
}
-/************************************************************************************
+/****************************************************************************
* Name: onewire_pm_prepare
*
* Description:
@@ -170,7 +170,7 @@ static inline void onewire_sem_destroy(FAR struct onewire_sem_s *sem)
* power state change). Drivers are not permitted to return non-zero
* values when reverting back to higher power consumption modes!
*
- ************************************************************************************/
+ ****************************************************************************/
#ifdef CONFIG_PM
static int onewire_pm_prepare(FAR struct pm_callback_s *cb, int domain,
enum pm_state_e pmstate)
@@ -190,6 +190,7 @@ static int onewire_pm_prepare(FAR struct pm_callback_s *cb, int domain,
case PM_STANDBY:
case PM_SLEEP:
+
/* Check if exclusive lock for the bus master is held. */
if (nxsem_getvalue(&master->devsem.sem, &sval) < 0)
@@ -208,6 +209,7 @@ static int onewire_pm_prepare(FAR struct pm_callback_s *cb, int domain,
break;
default:
+
/* Should not get here */
break;
@@ -229,9 +231,10 @@ static int onewire_pm_prepare(FAR struct pm_callback_s *cb, int domain,
*
****************************************************************************/
-void onewire_sem_wait(FAR struct onewire_master_s *master)
+int onewire_sem_wait(FAR struct onewire_master_s *master)
{
pid_t me;
+ int ret;
/* Do we already hold the semaphore? */
@@ -248,13 +251,19 @@ void onewire_sem_wait(FAR struct onewire_master_s *master)
else
{
- nxsem_wait_uninterruptible(&master->devsem.sem);
+ ret = nxsem_wait(master->devsem.sem);
+ if (ret < 0)
+ {
+ return ret;
+ }
/* Now we hold the semaphore */
master->devsem.holder = me;
master->devsem.count = 1;
}
+
+ return OK;
}
/****************************************************************************
@@ -298,7 +307,10 @@ void onewire_sem_post(FAR struct onewire_master_s *master)
int onewire_reset_resume(FAR struct onewire_master_s *master)
{
int ret;
- uint8_t buf[] = { ONEWIRE_CMD_RESUME };
+ uint8_t buf[] =
+ {
+ ONEWIRE_CMD_RESUME
+ };
ret = ONEWIRE_RESET(master->dev);
if (ret < 0)
@@ -320,8 +332,16 @@ int onewire_reset_select(FAR struct onewire_slave_s *slave)
{
FAR struct onewire_master_s *master = slave->master;
uint64_t tmp;
- uint8_t skip_rom[1] = { ONEWIRE_CMD_SKIP_ROM };
- uint8_t match_rom[9] = { ONEWIRE_CMD_MATCH_ROM, 0 };
+ uint8_t skip_rom[1] =
+ {
+ ONEWIRE_CMD_SKIP_ROM
+ };
+
+ uint8_t match_rom[9] =
+ {
+ ONEWIRE_CMD_MATCH_ROM, 0
+ };
+
int ret;
ret = ONEWIRE_RESET(master->dev);
@@ -355,8 +375,16 @@ int onewire_reset_select(FAR struct onewire_slave_s *slave)
int onewire_readrom(FAR struct onewire_master_s *master, FAR uint64_t *rom)
{
- uint8_t txbuf[] = { ONEWIRE_CMD_READ_ROM };
- uint8_t rxbuf[8] = { 0 };
+ uint8_t txbuf[] =
+ {
+ ONEWIRE_CMD_READ_ROM
+ };
+
+ uint8_t rxbuf[8] =
+ {
+ 0
+ };
+
uint64_t tmp = -1;
int ret;
@@ -492,7 +520,9 @@ int onewire_triplet(FAR struct onewire_master_s *master,
int onewire_search(FAR struct onewire_master_s *master,
int family,
bool alarmonly,
- CODE void (*cb_search)(int family, uint64_t romcode, FAR void *arg),
+ CODE void (*cb_search)(int family,
+ uint64_t romcode,
+ FAR void *arg),
FAR void *arg)
{
FAR struct onewire_dev_s *dev = master->dev;
@@ -704,7 +734,8 @@ FAR struct onewire_master_s *
DEBUGASSERT(dev != NULL);
DEBUGASSERT(maxslaves > 0);
- master = (FAR struct onewire_master_s *)kmm_malloc(sizeof(struct onewire_master_s));
+ master = (FAR struct onewire_master_s *)
+ kmm_malloc(sizeof(struct onewire_master_s));
if (master == NULL)
{
i2cerr("ERROR: Failed to allocate\n");
diff --git a/drivers/1wire/1wire_internal.h b/drivers/1wire/1wire_internal.h
index 62f8082..63668e5 100644
--- a/drivers/1wire/1wire_internal.h
+++ b/drivers/1wire/1wire_internal.h
@@ -92,7 +92,7 @@ bool onewire_check_crc16(FAR const uint8_t *input, uint16_t len,
/* Rest are from 1wire.c */
-void onewire_sem_wait(FAR struct onewire_master_s *master);
+int onewire_sem_wait(FAR struct onewire_master_s *master);
void onewire_sem_post(FAR struct onewire_master_s *master);
int onewire_addslave(FAR struct onewire_master_s *master,
@@ -163,7 +163,9 @@ int onewire_triplet(FAR struct onewire_master_s *master,
int onewire_search(FAR struct onewire_master_s *master,
int family,
bool alarmonly,
- CODE void (*cb_search)(int family, uint64_t romcode, FAR void *arg),
+ CODE void (*cb_search)(int family,
+ uint64_t romcode,
+ FAR void *arg),
FAR void *arg);
/****************************************************************************
diff --git a/drivers/1wire/ds28e17.c b/drivers/1wire/ds28e17.c
index b183e22..8e92ad3 100644
--- a/drivers/1wire/ds28e17.c
+++ b/drivers/1wire/ds28e17.c
@@ -160,7 +160,7 @@ static const struct i2c_ops_s ds_i2c_ops =
*
****************************************************************************/
-static inline void ds_i2c_sem_wait(FAR struct i2c_master_s *i2cdev)
+static inline int ds_i2c_sem_wait(FAR struct i2c_master_s *i2cdev)
{
FAR struct ds_i2c_inst_s *inst = (FAR struct ds_i2c_inst_s *)i2cdev;
FAR struct onewire_master_s *master = inst->master;
@@ -205,11 +205,13 @@ static int ds_error(uint8_t buf[])
i2cerr("I2C device not responding\n");
return -ENXIO;
}
+
if (buf[0] & DS_STATUS_START)
{
i2cerr("I2C status start\n");
return -EAGAIN;
}
+
if (buf[0] != 0 || buf[1] != 0)
{
i2cerr("I2C IO error\n");
@@ -286,7 +288,8 @@ static int ds_busywait(FAR struct ds_i2c_inst_s *inst, size_t length)
up_udelay(delay);
}
- } while (retries-- > 0);
+ }
+ while (retries-- > 0);
i2cwarn("busywait timeout\n");
return -ETIMEDOUT;
@@ -461,7 +464,8 @@ static int ds_i2c_write(FAR struct ds_i2c_inst_s *inst, uint16_t i2c_addr,
*
****************************************************************************/
-static int ds_i2c_write_read(FAR struct ds_i2c_inst_s *inst, uint16_t i2c_addr,
+static int ds_i2c_write_read(FAR struct ds_i2c_inst_s *inst,
+ uint16_t i2c_addr,
FAR const uint8_t *wbuffer, ssize_t wlength,
FAR uint8_t *rbuffer, ssize_t rlength)
{
@@ -552,7 +556,8 @@ static int ds_i2c_write_read(FAR struct ds_i2c_inst_s *inst, uint16_t i2c_addr,
return ONEWIRE_READ(master->dev, rbuffer, rlength);
}
-static int ds_i2c_setfrequency(FAR struct ds_i2c_inst_s *inst, uint32_t frequency)
+static int ds_i2c_setfrequency(FAR struct ds_i2c_inst_s *inst,
+ uint32_t frequency)
{
FAR struct onewire_master_s *master = inst->master;
uint8_t buf[2];
@@ -645,15 +650,15 @@ static int ds_i2c_process(FAR struct i2c_master_s *i2cdev,
* the common case of write followed by read to a same address.
*/
- if (i < count - 1 && msgs[i].addr == msgs[i+1].addr &&
+ if (i < count - 1 && msgs[i].addr == msgs[i + 1].addr &&
(msgs[i].flags & I2C_M_READ) == 0 &&
- (msgs[i+1].flags & I2C_M_READ))
+ (msgs[i + 1].flags & I2C_M_READ))
{
/* Write-read combined transfer. */
ret = ds_i2c_write_read(inst, msgs[i].addr,
msgs[i].buffer, msgs[i].length,
- msgs[i+1].buffer, msgs[i+1].length);
+ msgs[i + 1].buffer, msgs[i + 1].length);
if (ret < 0)
{
i = ret;
@@ -668,7 +673,8 @@ static int ds_i2c_process(FAR struct i2c_master_s *i2cdev,
{
/* Read transfer. */
- ret = ds_i2c_read(inst, msgs[i].addr, msgs[i].buffer, msgs[i].length);
+ ret = ds_i2c_read(inst, msgs[i].addr, msgs[i].buffer,
+ msgs[i].length);
if (ret < 0)
{
i = ret;
@@ -681,8 +687,8 @@ static int ds_i2c_process(FAR struct i2c_master_s *i2cdev,
{
/* Write transfer. Stop condition only for last transfer. */
- ret = ds_i2c_write(inst, msgs[i].addr, msgs[i].buffer, msgs[i].length,
- i == (count-1));
+ ret = ds_i2c_write(inst, msgs[i].addr, msgs[i].buffer,
+ msgs[i].length, i == (count - 1));
if (ret < 0)
{
i = ret;
@@ -696,8 +702,9 @@ static int ds_i2c_process(FAR struct i2c_master_s *i2cdev,
if (i < count)
{
- /* Yes. Resume to same DS28E17. */
- /* Oddness: Skip-ROM does not set RS-bit needed by resume. */
+ /* Yes. Resume to same DS28E17.
+ * Oddness: Skip-ROM does not set RS-bit needed by resume.
+ */
if (master->nslaves > 1)
{
@@ -707,6 +714,7 @@ static int ds_i2c_process(FAR struct i2c_master_s *i2cdev,
{
ret = onewire_reset_select(&inst->slave);
}
+
if (ret < 0)
{
i = ret;
@@ -734,7 +742,12 @@ static int ds_i2c_reset(FAR struct i2c_master_s *i2cdev)
FAR struct onewire_master_s *master = inst->master;
int ret;
- ds_i2c_sem_wait(i2cdev);
+ ret = ds_i2c_sem_wait(i2cdev);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
ret = ONEWIRE_RESET(master->dev);
ds_i2c_sem_post(i2cdev);
@@ -756,7 +769,12 @@ static int ds_i2c_transfer(FAR struct i2c_master_s *i2cdev,
{
int ret;
- ds_i2c_sem_wait(i2cdev);
+ ret = ds_i2c_sem_wait(i2cdev);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
ret = ds_i2c_process(i2cdev, msgs, count);
ds_i2c_sem_post(i2cdev);
@@ -773,8 +791,16 @@ static int ds_i2c_transfer(FAR struct i2c_master_s *i2cdev,
static int ds28e17_selftest(FAR struct ds_i2c_inst_s *inst)
{
FAR struct onewire_master_s *master = inst->master;
- uint8_t txbuf[] = { ONEWIRE_CMD_READ_ROM };
- uint8_t rxbuf[8] = { 0 };
+ uint8_t txbuf[] =
+ {
+ ONEWIRE_CMD_READ_ROM
+ };
+
+ uint8_t rxbuf[8] =
+ {
+ 0
+ };
+
uint64_t rom;
uint8_t crc;
int ret;
@@ -843,7 +869,9 @@ static int ds28e17_selftest(FAR struct ds_i2c_inst_s *inst)
****************************************************************************/
int ds28e17_search(FAR struct ds28e17_dev_s *priv,
- void (*cb_search)(int family, uint64_t romcode, void *arg),
+ void (*cb_search)(int family,
+ uint64_t romcode,
+ void *arg),
void *arg)
{
FAR struct onewire_master_s *master = (FAR struct onewire_master_s *)priv;
@@ -851,7 +879,12 @@ int ds28e17_search(FAR struct ds28e17_dev_s *priv,
DEBUGASSERT(master != NULL && cb_search != NULL);
- onewire_sem_wait(master);
+ ret = onewire_sem_wait(master);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
ret = onewire_search(master, DS_FAMILY, false, cb_search, arg);
onewire_sem_post(master);
@@ -881,6 +914,7 @@ FAR struct i2c_master_s *
{
FAR struct ds_i2c_inst_s *inst; /* device, single instance */
FAR struct onewire_master_s *master = (FAR struct onewire_master_s *)priv;
+ int ret;
DEBUGASSERT(master != NULL);
@@ -903,7 +937,13 @@ FAR struct i2c_master_s *
/* We need a recursive lock as this may be called from a search callback. */
- onewire_sem_wait(master);
+ ret = onewire_sem_wait(master);
+ if (ret < 0)
+ {
+ kmm_free(inst);
+ i2cerr("ERROR: Failed to acquire lock\n");
+ return NULL;
+ }
if (onewire_addslave(master, &inst->slave) < 0)
{
@@ -953,7 +993,11 @@ int ds28e17_lower_half_unregister(FAR struct ds28e17_dev_s *priv,
FAR struct onewire_master_s *master = inst->master;
int ret;
- onewire_sem_wait(master);
+ ret = onewire_sem_wait(master);
+ if (ret < 0)
+ {
+ return ret;
+ }
ret = onewire_removeslave(master, &inst->slave);
if (ret < 0)
diff --git a/drivers/bch/bch.h b/drivers/bch/bch.h
index b1c5920..f6f4134 100644
--- a/drivers/bch/bch.h
+++ b/drivers/bch/bch.h
@@ -97,7 +97,7 @@ EXTERN const struct file_operations bch_fops;
* Public Function Prototypes
****************************************************************************/
-EXTERN void bchlib_semtake(FAR struct bchlib_s *bch);
+EXTERN int bchlib_semtake(FAR struct bchlib_s *bch);
EXTERN int bchlib_flushsector(FAR struct bchlib_s *bch);
EXTERN int bchlib_readsector(FAR struct bchlib_s *bch, size_t sector);
diff --git a/drivers/bch/bchdev_driver.c b/drivers/bch/bchdev_driver.c
index 6a2afc5..8d10cd8 100644
--- a/drivers/bch/bchdev_driver.c
+++ b/drivers/bch/bchdev_driver.c
@@ -140,7 +140,12 @@ static int bch_open(FAR struct file *filep)
/* Increment the reference count */
- bchlib_semtake(bch);
+ ret = bchlib_semtake(bch);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
if (bch->refs == MAX_OPENCNT)
{
ret = -EMFILE;
@@ -170,9 +175,16 @@ static int bch_close(FAR struct file *filep)
DEBUGASSERT(inode && inode->i_private);
bch = (FAR struct bchlib_s *)inode->i_private;
+ /* Get exclusive access */
+
+ ret = bchlib_semtake(bch);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
/* Flush any dirty pages remaining in the cache */
- bchlib_semtake(bch);
bchlib_flushsector(bch);
/* Decrement the reference count (I don't use bchlib_decref() because I
@@ -231,7 +243,11 @@ static off_t bch_seek(FAR struct file *filep, off_t offset, int whence)
DEBUGASSERT(inode && inode->i_private);
bch = (FAR struct bchlib_s *)inode->i_private;
- bchlib_semtake(bch);
+ ret = bchlib_semtake(bch);
+ if (ret < 0)
+ {
+ return (off_t)ret;
+ }
/* Determine the new, requested file position */
@@ -298,7 +314,12 @@ static ssize_t bch_read(FAR struct file *filep, FAR char *buffer, size_t len)
DEBUGASSERT(inode && inode->i_private);
bch = (FAR struct bchlib_s *)inode->i_private;
- bchlib_semtake(bch);
+ ret = bchlib_semtake(bch);
+ if (ret < 0)
+ {
+ return (ssize_t)ret;
+ }
+
ret = bchlib_read(bch, buffer, filep->f_pos, len);
if (ret > 0)
{
@@ -325,7 +346,12 @@ static ssize_t bch_write(FAR struct file *filep, FAR const char *buffer,
if (!bch->readonly)
{
- bchlib_semtake(bch);
+ ret = bchlib_semtake(bch);
+ if (ret < 0)
+ {
+ return (ssize_t)ret;
+ }
+
ret = bchlib_write(bch, buffer, filep->f_pos, len);
if (ret > 0)
{
@@ -366,7 +392,12 @@ static int bch_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
FAR struct bchlib_s **bchr =
(FAR struct bchlib_s **)((uintptr_t)arg);
- bchlib_semtake(bch);
+ ret = bchlib_semtake(bch);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
if (!bchr || bch->refs == MAX_OPENCNT)
{
ret = -EINVAL;
@@ -454,7 +485,11 @@ static int bch_unlink(FAR struct inode *inode)
/* Get exclusive access to the BCH device */
- bchlib_semtake(bch);
+ ret = bchlib_semtake(bch);
+ if (ret < 0)
+ {
+ return ret;
+ }
/* Indicate that the driver has been unlinked */
diff --git a/drivers/bch/bchlib_sem.c b/drivers/bch/bchlib_sem.c
index 1495a93..999a963 100644
--- a/drivers/bch/bchlib_sem.c
+++ b/drivers/bch/bchlib_sem.c
@@ -53,7 +53,7 @@
* Name: bch_semtake
****************************************************************************/
-void bchlib_semtake(FAR struct bchlib_s *bch)
+int bchlib_semtake(FAR struct bchlib_s *bch)
{
- nxsem_wait_uninterruptible(&bch->sem);
+ return nxsem_wait(&bch->sem);
}
diff --git a/drivers/can/mcp2515.c b/drivers/can/mcp2515.c
index d42335a..940725a 100644
--- a/drivers/can/mcp2515.c
+++ b/drivers/can/mcp2515.c
@@ -211,25 +211,25 @@ enum can_state_s
struct mcp2515_can_s
{
struct mcp2515_config_s *config; /* The constant configuration */
- uint8_t state; /* See enum can_state_s */
- uint8_t nalloc; /* Number of allocated filters */
- sem_t locksem; /* Enforces mutually exclusive access */
- sem_t txfsem; /* Used to wait for TX FIFO availability */
- uint32_t btp; /* Current bit timing */
- uint8_t rxints; /* Configured RX interrupts */
- uint8_t txints; /* Configured TX interrupts */
+ uint8_t state; /* See enum can_state_s */
+ uint8_t nalloc; /* Number of allocated filters */
+ sem_t locksem; /* Enforces mutually exclusive access */
+ sem_t txfsem; /* Used to wait for TX FIFO availability */
+ uint32_t btp; /* Current bit timing */
+ uint8_t rxints; /* Configured RX interrupts */
+ uint8_t txints; /* Configured TX interrupts */
#ifdef CONFIG_CAN_ERRORS
- uint32_t olderrors; /* Used to detect the changes in error states */
+ uint32_t olderrors; /* Used to detect the changes in error states */
#endif
- uint8_t filters; /* Standard/Extende filter bit allocator. */
- uint8_t txbuffers; /* TX Buffers bit allocator. */
+ uint8_t filters; /* Standard/Extende filter bit allocator. */
+ uint8_t txbuffers; /* TX Buffers bit allocator. */
FAR uint8_t *spi_txbuf;
FAR uint8_t *spi_rxbuf;
#ifdef CONFIG_MCP2515_REGDEBUG
- uintptr_t regaddr; /* Last register address read */
- uint32_t regval; /* Last value read from the register */
- unsigned int count; /* Number of times that the value was read */
+ uintptr_t regaddr; /* Last register address read */
+ uint32_t regval; /* Last value read from the register */
+ unsigned int count; /* Number of times that the value was read */
#endif
};
@@ -241,10 +241,11 @@ struct mcp2515_can_s
static void mcp2515_readregs(FAR struct mcp2515_can_s *priv, uint8_t regaddr,
FAR uint8_t *buffer, uint8_t len);
-static void mcp2515_writeregs(FAR struct mcp2515_can_s *priv, uint8_t regaddr,
+static void mcp2515_writeregs(FAR struct mcp2515_can_s *priv,
+ uint8_t regaddr,
FAR const uint8_t *buffer, uint8_t len);
-static void mcp2515_modifyreg(FAR struct mcp2515_can_s *priv, uint8_t regaddr,
- uint8_t mask, uint8_t value);
+static void mcp2515_modifyreg(FAR struct mcp2515_can_s *priv,
+ uint8_t regaddr, uint8_t mask, uint8_t value);
#ifdef CONFIG_MCP2515_REGDEBUG
static void mcp2515_dumpregs(FAR struct mcp2515_can_s *priv,
FAR const char *msg);
@@ -254,7 +255,7 @@ static void mcp2515_dumpregs(FAR struct mcp2515_can_s *priv,
/* Semaphore helpers */
-static void mcp2515_dev_lock(FAR struct mcp2515_can_s *priv);
+static int mcp2515_dev_lock(FAR struct mcp2515_can_s *priv);
#define mcp2515_dev_unlock(priv) nxsem_post(&priv->locksem)
/* MCP2515 helpers */
@@ -427,7 +428,8 @@ static void mcp2515_transfer(FAR struct mcp2515_can_s *priv, uint8_t len)
*
****************************************************************************/
-static void mcp2515_writeregs(FAR struct mcp2515_can_s *priv, uint8_t regaddr,
+static void mcp2515_writeregs(FAR struct mcp2515_can_s *priv,
+ uint8_t regaddr,
FAR const uint8_t *buffer, uint8_t len)
{
FAR struct mcp2515_config_s *config = priv->config;
@@ -480,8 +482,8 @@ static void mcp2515_writeregs(FAR struct mcp2515_can_s *priv, uint8_t regaddr,
*
****************************************************************************/
-static void mcp2515_modifyreg(FAR struct mcp2515_can_s *priv, uint8_t regaddr,
- uint8_t mask, uint8_t value)
+static void mcp2515_modifyreg(FAR struct mcp2515_can_s *priv,
+ uint8_t regaddr, uint8_t mask, uint8_t value)
{
FAR struct mcp2515_config_s *config = priv->config;
uint8_t wr[4] =
@@ -543,9 +545,9 @@ static void mcp2515_dumpregs(FAR struct mcp2515_can_s *priv,
*
****************************************************************************/
-static void mcp2515_dev_lock(FAR struct mcp2515_can_s *priv)
+static int mcp2515_dev_lock(FAR struct mcp2515_can_s *priv)
{
- nxsem_wait_uninterruptible(&priv->locksem);
+ return nxsem_wait(&priv->locksem);
}
/****************************************************************************
@@ -573,13 +575,18 @@ static int mcp2515_add_extfilter(FAR struct mcp2515_can_s *priv,
uint8_t offset;
uint8_t mode = CAN_FILTER_MASK;
int ndx;
+ int ret;
DEBUGASSERT(priv != NULL && priv->config != NULL);
config = priv->config;
/* Get exclusive excess to the MCP2515 hardware */
- mcp2515_dev_lock(priv);
+ ret = mcp2515_dev_lock(priv);
+ if (ret < 0)
+ {
+ return ret;
+ }
/* Find an unused standard filter */
@@ -684,7 +691,8 @@ static int mcp2515_add_extfilter(FAR struct mcp2515_can_s *priv,
/* STD0 - STD2 */
regval = (regval) |
- (uint8_t)(((extconfig->xf_id1 & 0x1c0000) >> 16) << 3);
+ (uint8_t)(((extconfig->xf_id1 &
+ 0x1c0000) >> 16) << 3);
mcp2515_writeregs(priv, MCP2515_RXF0SIDL + offset +
((priv->nalloc - 1) * 4), ®val, 1);
@@ -714,7 +722,8 @@ static int mcp2515_add_extfilter(FAR struct mcp2515_can_s *priv,
/* STD0 - STD2 */
regval = (regval) |
- (uint8_t)(((extconfig->xf_id2 & 0x1c0000) >> 16) << 3);
+ (uint8_t)(((extconfig->xf_id2 &
+ 0x1c0000) >> 16) << 3);
mcp2515_writeregs(priv, MCP2515_RXM0SIDL + offset, ®val, 1);
/* STD3 - STD10 */
@@ -801,6 +810,7 @@ static int mcp2515_del_extfilter(FAR struct mcp2515_can_s *priv, int ndx)
FAR struct mcp2515_config_s *config;
uint8_t regval;
uint8_t offset;
+ int ret;
DEBUGASSERT(priv != NULL && priv->config != NULL);
config = priv->config;
@@ -818,7 +828,11 @@ static int mcp2515_del_extfilter(FAR struct mcp2515_can_s *priv, int ndx)
/* Get exclusive excess to the MCP2515 hardware */
- mcp2515_dev_lock(priv);
+ ret = mcp2515_dev_lock(priv);
+ if (ret < 0)
+ {
+ return ret;
+ }
/* Check if this filter is really assigned */
@@ -902,13 +916,18 @@ static int mcp2515_add_stdfilter(FAR struct mcp2515_can_s *priv,
uint8_t offset;
uint8_t mode = CAN_FILTER_MASK;
int ndx;
+ int ret;
DEBUGASSERT(priv != NULL && priv->config != NULL);
config = priv->config;
/* Get exclusive excess to the MCP2515 hardware */
- mcp2515_dev_lock(priv);
+ ret = mcp2515_dev_lock(priv);
+ if (ret < 0)
+ {
+ return ret;
+ }
/* Find an unused standard filter */
@@ -1074,6 +1093,7 @@ static int mcp2515_del_stdfilter(FAR struct mcp2515_can_s *priv, int ndx)
FAR struct mcp2515_config_s *config;
uint8_t regval;
uint8_t offset;
+ int ret;
DEBUGASSERT(priv != NULL && priv->config != NULL);
config = priv->config;
@@ -1091,7 +1111,11 @@ static int mcp2515_del_stdfilter(FAR struct mcp2515_can_s *priv, int ndx)
/* Get exclusive excess to the MCP2515 hardware */
- mcp2515_dev_lock(priv);
+ ret = mcp2515_dev_lock(priv);
+ if (ret < 0)
+ {
+ return ret;
+ }
/* Check if this filter is really assigned */
@@ -1166,6 +1190,7 @@ static int mcp2515_del_stdfilter(FAR struct mcp2515_can_s *priv, int ndx)
static void mcp2515_reset_lowlevel(FAR struct mcp2515_can_s *priv)
{
FAR struct mcp2515_config_s *config;
+ int ret;
DEBUGASSERT(priv);
config = priv->config;
@@ -1175,7 +1200,11 @@ static void mcp2515_reset_lowlevel(FAR struct mcp2515_can_s *priv)
/* Get exclusive access to the MCP2515 peripheral */
- mcp2515_dev_lock(priv);
+ ret = mcp2515_dev_lock(priv);
+ if (ret < 0)
+ {
+ return;
+ }
/* Send SPI reset command to MCP2515 */
@@ -1263,7 +1292,11 @@ static int mcp2515_setup(FAR struct can_dev_s *dev)
/* Get exclusive access to the MCP2515 peripheral */
- mcp2515_dev_lock(priv);
+ ret = mcp2515_dev_lock(priv);
+ if (ret < 0)
+ {
+ return ret;
+ }
/* MCP2515 hardware initialization */
@@ -1521,15 +1554,14 @@ static int mcp2515_ioctl(FAR struct can_dev_s *dev, int cmd,
* PHSEG1 == PHSEG2 (PHSEG2 = TSEG2)
*
* See more at:
+ * http://www.analog.com/en/analog-dialogue/articles/configure-can-bit-timing.html
*
- * http://www.analog.com/en/analog-dialogue/articles/configure-can-bit-timing.html
*/
phseg1 = tseg2;
prseg = tseg1 - phseg1;
- brp = (uint32_t)
- (((float) MCP2515_CANCLK_FREQUENCY /
+ brp = (uint32_t)(((float) MCP2515_CANCLK_FREQUENCY /
((float)(tseg1 + tseg2 + 1) * (float)(2 * bt->bt_baud))) - 1);
/* Save the value of the new bit timing register */
@@ -1716,6 +1748,7 @@ static int mcp2515_send(FAR struct can_dev_s *dev, FAR struct can_msg_s *msg)
uint8_t regval;
uint8_t txbuf;
unsigned int nbytes;
+ int ret;
DEBUGASSERT(dev);
priv = dev->cd_priv;
@@ -1729,11 +1762,21 @@ static int mcp2515_send(FAR struct can_dev_s *dev, FAR struct can_msg_s *msg)
/* Get exclusive access to the MCP2515 peripheral */
- mcp2515_dev_lock(priv);
+ ret = mcp2515_dev_lock(priv);
+ if (ret < 0)
+ {
+ return ret;
+ }
/* Acquire buffer */
- nxsem_wait(&priv->txfsem);
+ ret = nxsem_wait(&priv->txfsem);
+ if (ret < 0)
+ {
+ mcp2515_dev_unlock(priv);
+ return ret;
+ }
+
DEBUGASSERT(priv->txbuffers != 0);
txbuf = ffs(priv->txbuffers) - 1;
@@ -2485,7 +2528,8 @@ FAR struct mcp2515_can_s *
caninfo("Starting mcp2515_instantiate()!\n");
- priv = (FAR struct mcp2515_can_s *)kmm_malloc(sizeof(struct mcp2515_can_s));
+ priv = (FAR struct mcp2515_can_s *)
+ kmm_malloc(sizeof(struct mcp2515_can_s));
if (priv == NULL)
{
canerr("ERROR: Failed to allocate instance of mcp2515_can_s!\n");
@@ -2553,7 +2597,8 @@ FAR struct mcp2515_can_s *
*
****************************************************************************/
-FAR struct can_dev_s *mcp2515_initialize(FAR struct mcp2515_can_s *mcp2515can)
+FAR struct can_dev_s *mcp2515_initialize(
+ FAR struct mcp2515_can_s *mcp2515can)
{
FAR struct can_dev_s *dev;
diff --git a/drivers/mmcsd/mmcsd_sdio.c b/drivers/mmcsd/mmcsd_sdio.c
index c34aedd..3504316 100644
--- a/drivers/mmcsd/mmcsd_sdio.c
+++ b/drivers/mmcsd/mmcsd_sdio.c
@@ -142,7 +142,7 @@ struct mmcsd_state_s
/* Misc Helpers *************************************************************/
-static void mmcsd_takesem(FAR struct mmcsd_state_s *priv);
+static int mmcsd_takesem(FAR struct mmcsd_state_s *priv);
#ifndef CONFIG_SDIO_MUXBUS
# define mmcsd_givesem(p) nxsem_post(&priv->sem);
@@ -256,13 +256,19 @@ static const struct block_operations g_bops =
* Misc Helpers
****************************************************************************/
-static void mmcsd_takesem(FAR struct mmcsd_state_s *priv)
+static int mmcsd_takesem(FAR struct mmcsd_state_s *priv)
{
+ int ret;
+
/* Take the semaphore, giving exclusive access to the driver (perhaps
* waiting)
*/
- nxsem_wait_uninterruptible(&priv->sem);
+ ret = nxsem_wait_uninterruptible(&priv->sem);
+ if (ret < 0)
+ {
+ return ret;
+ }
/* Lock the bus if mutually exclusive access to the SDIO bus is required
* on this platform.
@@ -271,6 +277,8 @@ static void mmcsd_takesem(FAR struct mmcsd_state_s *priv)
#ifdef CONFIG_SDIO_MUXBUS
SDIO_LOCK(priv->dev, TRUE);
#endif
+
+ return ret;
}
#ifdef CONFIG_SDIO_MUXBUS
@@ -2144,6 +2152,7 @@ static ssize_t mmcsd_flush(FAR void *dev, FAR const uint8_t *buffer,
static int mmcsd_open(FAR struct inode *inode)
{
FAR struct mmcsd_state_s *priv;
+ int ret;
finfo("Entry\n");
DEBUGASSERT(inode && inode->i_private);
@@ -2152,7 +2161,13 @@ static int mmcsd_open(FAR struct inode *inode)
/* Just increment the reference count on the driver */
DEBUGASSERT(priv->crefs < MAX_CREFS);
- mmcsd_takesem(priv);
+
+ ret = mmcsd_takesem(priv);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
priv->crefs++;
mmcsd_givesem(priv);
return OK;
@@ -2168,6 +2183,7 @@ static int mmcsd_open(FAR struct inode *inode)
static int mmcsd_close(FAR struct inode *inode)
{
FAR struct mmcsd_state_s *priv;
+ int ret;
finfo("Entry\n");
DEBUGASSERT(inode && inode->i_private);
@@ -2176,7 +2192,12 @@ static int mmcsd_close(FAR struct inode *inode)
/* Decrement the reference count on the block driver */
DEBUGASSERT(priv->crefs > 0);
- mmcsd_takesem(priv);
+ ret = mmcsd_takesem(priv);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
priv->crefs--;
mmcsd_givesem(priv);
return OK;
@@ -2208,7 +2229,11 @@ static ssize_t mmcsd_read(FAR struct inode *inode, unsigned char *buffer,
if (nsectors > 0)
{
- mmcsd_takesem(priv);
+ ret = mmcsd_takesem(priv);
+ if (ret < 0)
+ {
+ return (ssize_t)ret;
+ }
#if defined(CONFIG_DRVR_READAHEAD)
/* Get the data from the read-ahead buffer */
@@ -2282,7 +2307,11 @@ static ssize_t mmcsd_write(FAR struct inode *inode,
finfo("sector: %lu nsectors: %u sectorsize: %u\n",
(unsigned long)startsector, nsectors, priv->blocksize);
- mmcsd_takesem(priv);
+ ret = mmcsd_takesem(priv);
+ if (ret < 0)
+ {
+ return (ssize_t)ret;
+ }
#if defined(CONFIG_DRVR_WRITEBUFFER)
/* Write the data to the write buffer */
@@ -2349,7 +2378,12 @@ static int mmcsd_geometry(FAR struct inode *inode, struct geometry *geometry)
/* Is there a (supported) card inserted in the slot? */
priv = (FAR struct mmcsd_state_s *)inode->i_private;
- mmcsd_takesem(priv);
+ ret = mmcsd_takesem(priv);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
if (IS_EMPTY(priv))
{
/* No.. return ENODEV */
@@ -2402,7 +2436,12 @@ static int mmcsd_ioctl(FAR struct inode *inode, int cmd, unsigned long arg)
/* Process the IOCTL by command */
- mmcsd_takesem(priv);
+ ret = mmcsd_takesem(priv);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
switch (cmd)
{
case BIOC_PROBE: /* Check for media in the slot */
@@ -2467,13 +2506,19 @@ static int mmcsd_ioctl(FAR struct inode *inode, int cmd, unsigned long arg)
static void mmcsd_mediachange(FAR void *arg)
{
FAR struct mmcsd_state_s *priv = (FAR struct mmcsd_state_s *)arg;
+ int ret;
finfo("arg: %p\n", arg);
DEBUGASSERT(priv);
/* Is there a card present in the slot? */
- mmcsd_takesem(priv);
+ ret = mmcsd_takesem(priv);
+ if (ret < 0)
+ {
+ return;
+ }
+
if (SDIO_PRESENT(priv->dev))
{
/* No... process the card insertion. This could cause chaos if we
@@ -3518,7 +3563,11 @@ static int mmcsd_hwinitialize(FAR struct mmcsd_state_s *priv)
{
int ret;
- mmcsd_takesem(priv);
+ ret = mmcsd_takesem(priv);
+ if (ret < 0)
+ {
+ return ret;
+ }
/* Get the capabilities of the SDIO driver */
diff --git a/drivers/mmcsd/mmcsd_spi.c b/drivers/mmcsd/mmcsd_spi.c
index ce82a86..44cf2bd 100644
--- a/drivers/mmcsd/mmcsd_spi.c
+++ b/drivers/mmcsd/mmcsd_spi.c
@@ -163,7 +163,7 @@ struct mmcsd_cmdinfo_s
/* Misc *********************************************************************/
-static void mmcsd_semtake(FAR struct mmcsd_slot_s *slot);
+static int mmcsd_semtake(FAR struct mmcsd_slot_s *slot);
static void mmcsd_semgive(FAR struct mmcsd_slot_s *slot);
/* Card SPI interface *******************************************************/
@@ -386,8 +386,20 @@ static const struct mmcsd_cmdinfo_s g_acmd41 =
* Name: mmcsd_semtake
****************************************************************************/
-static void mmcsd_semtake(FAR struct mmcsd_slot_s *slot)
+static int mmcsd_semtake(FAR struct mmcsd_slot_s *slot)
{
+ int ret;
+
+ /* Get exclusive access to the MMC/SD device (possibly unnecessary if
+ * SPI_LOCK is also implemented as a semaphore).
+ */
+
+ ret = nxsem_wait_uninterruptible(&slot->sem);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
/* Get exclusive access to the SPI bus (if necessary) */
SPI_LOCK(slot->spi, true);
@@ -401,11 +413,7 @@ static void mmcsd_semtake(FAR struct mmcsd_slot_s *slot)
SPI_HWFEATURES(slot->spi, 0);
SPI_SETFREQUENCY(slot->spi, slot->spispeed);
- /* Get exclusive access to the MMC/SD device (possibly unnecessary if
- * SPI_LOCK is also implemented as a semaphore).
- */
-
- nxsem_wait_uninterruptible(&slot->sem);
+ return ret;
}
/****************************************************************************
@@ -414,10 +422,6 @@ static void mmcsd_semtake(FAR struct mmcsd_slot_s *slot)
static void mmcsd_semgive(FAR struct mmcsd_slot_s *slot)
{
- /* Relinquish the lock on the MMC/SD device */
-
- nxsem_post(&slot->sem);
-
/* Relinquish the lock on the SPI bus */
/* The card may need up to 8 SCLK cycles to sample the CS status
@@ -429,6 +433,10 @@ static void mmcsd_semgive(FAR struct mmcsd_slot_s *slot)
/* Relinquish exclusive access to the SPI bus */
SPI_LOCK(slot->spi, false);
+
+ /* Relinquish the lock on the MMC/SD device */
+
+ nxsem_post(&slot->sem);
}
/****************************************************************************
@@ -1105,10 +1113,16 @@ static int mmcsd_open(FAR struct inode *inode)
}
#endif
+ ret = mmcsd_semtake(slot);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
/* Verify that an MMC/SD card has been inserted */
ret = -ENODEV;
- mmcsd_semtake(slot);
+
if ((SPI_STATUS(spi, SPIDEV_MMCSD(0)) & SPI_STATUS_PRESENT) != 0)
{
/* Yes.. a card is present. Has it been initialized? */
@@ -1164,8 +1178,9 @@ static ssize_t mmcsd_read(FAR struct inode *inode, unsigned char *buffer,
FAR struct spi_dev_s *spi;
size_t nbytes;
off_t offset;
- uint8_t response;
+ uint8_t response;
int i;
+ int ret;
finfo("start_sector=%d nsectors=%d\n", start_sector, nsectors);
@@ -1229,7 +1244,12 @@ static ssize_t mmcsd_read(FAR struct inode *inode, unsigned char *buffer,
/* Select the slave */
- mmcsd_semtake(slot);
+ ret = mmcsd_semtake(slot);
+ if (ret < 0)
+ {
+ return (ssize_t)ret;
+ }
+
SPI_SELECT(spi, SPIDEV_MMCSD(0), true);
/* Single or multiple block read? */
@@ -1321,6 +1341,7 @@ static ssize_t mmcsd_write(FAR struct inode *inode,
off_t offset;
uint8_t response;
int i;
+ int ret;
finfo("start_sector=%d nsectors=%d\n", start_sector, nsectors);
@@ -1394,7 +1415,12 @@ static ssize_t mmcsd_write(FAR struct inode *inode,
/* Select the slave */
- mmcsd_semtake(slot);
+ ret = mmcsd_semtake(slot);
+ if (ret < 0)
+ {
+ return (ssize_t)ret;
+ }
+
SPI_SELECT(spi, SPIDEV_MMCSD(0), true);
/* Single or multiple block transfer? */
@@ -1536,7 +1562,12 @@ static int mmcsd_geometry(FAR struct inode *inode, struct geometry *geometry)
/* Re-sample the CSD */
- mmcsd_semtake(slot);
+ ret = mmcsd_semtake(slot);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
SPI_SELECT(spi, SPIDEV_MMCSD(0), true);
ret = mmcsd_getcsd(slot, csd);
SPI_SELECT(spi, SPIDEV_MMCSD(0), false);
@@ -1901,7 +1932,12 @@ static void mmcsd_mediachanged(void *arg)
/* Save the current slot state and reassess the new state */
- mmcsd_semtake(slot);
+ ret = mmcsd_semtake(slot);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
oldstate = slot->state;
/* Check if media was removed or inserted */
@@ -2004,7 +2040,11 @@ int mmcsd_spislotinitialize(int minor, int slotno, FAR struct spi_dev_s *spi)
* configured for the MMC/SD card
*/
- mmcsd_semtake(slot);
+ ret = mmcsd_semtake(slot);
+ if (ret < 0)
+ {
+ return ret;
+ }
/* Initialize for the media in the slot (if any) */