Skip to content

Commit

Permalink
NFC: st21nfcb: Fix improper management of -EREMOTEIO error code.
Browse files Browse the repository at this point in the history
On st21nfcb the irq line might be kept to active state because of other
interfaces activity. This may generate i2c read tentative resulting in
i2c NACK.

This fix will currently let NDLC upper layer to decide when it is relevent
to signal to the physical layer when the chip as muted.

Signed-off-by: Christophe Ricard <christophe-h.ricard@st.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
  • Loading branch information
Christophe Ricard authored and Samuel Ortiz committed Sep 24, 2014
1 parent f06d87a commit 4294e32
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 15 deletions.
19 changes: 4 additions & 15 deletions drivers/nfc/st21nfcb/i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,12 +55,6 @@ struct st21nfcb_i2c_phy {
unsigned int irq_polarity;

int powered;

/*
* < 0 if hardware error occured (e.g. i2c err)
* and prevents normal operation.
*/
int hard_fault;
};

#define I2C_DUMP_SKB(info, skb) \
Expand Down Expand Up @@ -114,8 +108,8 @@ static int st21nfcb_nci_i2c_write(void *phy_id, struct sk_buff *skb)

I2C_DUMP_SKB("st21nfcb_nci_i2c_write", skb);

if (phy->hard_fault != 0)
return phy->hard_fault;
if (phy->ndlc->hard_fault != 0)
return phy->ndlc->hard_fault;

r = i2c_master_send(client, skb->data, skb->len);
if (r == -EREMOTEIO) { /* Retry, chip was in standby */
Expand Down Expand Up @@ -218,7 +212,7 @@ static irqreturn_t st21nfcb_nci_irq_thread_fn(int irq, void *phy_id)
client = phy->i2c_dev;
dev_dbg(&client->dev, "IRQ\n");

if (phy->hard_fault)
if (phy->ndlc->hard_fault)
return IRQ_HANDLED;

if (!phy->powered) {
Expand All @@ -227,13 +221,8 @@ static irqreturn_t st21nfcb_nci_irq_thread_fn(int irq, void *phy_id)
}

r = st21nfcb_nci_i2c_read(phy, &skb);
if (r == -EREMOTEIO) {
phy->hard_fault = r;
ndlc_recv(phy->ndlc, NULL);
return IRQ_HANDLED;
} else if (r == -ENOMEM || r == -EBADMSG) {
if (r == -EREMOTEIO || r == -ENOMEM || r == -EBADMSG)
return IRQ_HANDLED;
}

ndlc_recv(phy->ndlc, skb);

Expand Down
4 changes: 4 additions & 0 deletions drivers/nfc/st21nfcb/ndlc.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ struct llt_ndlc {

struct device *dev;

/*
* < 0 if hardware error occured
* and prevents normal operation.
*/
int hard_fault;
};

Expand Down

0 comments on commit 4294e32

Please sign in to comment.