summaryrefslogtreecommitdiff
path: root/drivers/net/ethernet
diff options
context:
space:
mode:
authorShengzhou Liu <Shengzhou.Liu@freescale.com>2012-10-26 13:10:36 (GMT)
committerFleming Andrew-AFLEMING <AFLEMING@freescale.com>2013-04-08 23:10:10 (GMT)
commit8050a6a82c5143463fd320e84325fa3b4fcd9880 (patch)
tree72eb86c60f73fae1efa00ebde0077359e0bf519f /drivers/net/ethernet
parent5c6f7b7e113f3ac022b3778ae02b1beb65b770c5 (diff)
downloadlinux-fsl-qoriq-8050a6a82c5143463fd320e84325fa3b4fcd9880.tar.xz
dpaa_1588: fix defective processing of circular buffer
There was a defective processing after finding the desired item. circ_buf->tail should not be pointed to idx+1, which will cause the drop of the valid items after idx, it should be pointed to tail+1. when buffer is full, we remove the oldest entry. Change-Id: I1286cd06bae26555a3b3209c996f160ea3ed883c Signed-off-by: Shengzhou Liu <Shengzhou.Liu@freescale.com> (cherry picked from commit d755f709f407b3963a4579daa81418c8da3103f7) Reviewed-on: http://git.am.freescale.net:8181/1035 Reviewed-by: Fleming Andrew-AFLEMING <AFLEMING@freescale.com> Tested-by: Fleming Andrew-AFLEMING <AFLEMING@freescale.com>
Diffstat (limited to 'drivers/net/ethernet')
-rw-r--r--drivers/net/ethernet/freescale/dpa/dpaa_1588.c21
-rw-r--r--drivers/net/ethernet/freescale/dpa/dpaa_1588.h2
2 files changed, 14 insertions, 9 deletions
diff --git a/drivers/net/ethernet/freescale/dpa/dpaa_1588.c b/drivers/net/ethernet/freescale/dpa/dpaa_1588.c
index 2ac2a01..8413b1e 100644
--- a/drivers/net/ethernet/freescale/dpa/dpaa_1588.c
+++ b/drivers/net/ethernet/freescale/dpa/dpaa_1588.c
@@ -72,10 +72,8 @@ static int dpa_ptp_insert(struct dpa_ptp_circ_buf *ptp_buf,
head = circ_buf->head;
tail = circ_buf->tail;
- if (CIRC_SPACE(head, tail, size) <= 0) {
- spin_unlock_irqrestore(&ptp_buf->ptp_lock, flags);
- return 1;
- }
+ if (CIRC_SPACE(head, tail, size) <= 0)
+ circ_buf->tail = (tail + 1) & (size - 1);
tmp = (struct dpa_ptp_data *)(circ_buf->buf) + head;
memcpy(tmp, data, sizeof(struct dpa_ptp_data));
@@ -119,7 +117,7 @@ static int dpa_ptp_find_and_remove(struct dpa_ptp_circ_buf *ptp_buf,
int size = ptp_buf->size;
int head, tail, idx;
unsigned long flags;
- struct dpa_ptp_data *tmp;
+ struct dpa_ptp_data *tmp, *tmp2;
struct dpa_ptp_ident *tmp_ident;
spin_lock_irqsave(&ptp_buf->ptp_lock, flags);
@@ -127,7 +125,7 @@ static int dpa_ptp_find_and_remove(struct dpa_ptp_circ_buf *ptp_buf,
head = circ_buf->head;
tail = idx = circ_buf->tail;
- if (CIRC_CNT_TO_END(head, tail, size) == 0) {
+ if (CIRC_CNT(head, tail, size) == 0) {
spin_unlock_irqrestore(&ptp_buf->ptp_lock, flags);
return 1;
}
@@ -141,7 +139,6 @@ static int dpa_ptp_find_and_remove(struct dpa_ptp_circ_buf *ptp_buf,
}
if (idx == head) {
- circ_buf->tail = head;
spin_unlock_irqrestore(&ptp_buf->ptp_lock, flags);
return 1;
}
@@ -149,7 +146,15 @@ static int dpa_ptp_find_and_remove(struct dpa_ptp_circ_buf *ptp_buf,
ts->sec = tmp->ts.sec;
ts->nsec = tmp->ts.nsec;
- circ_buf->tail = (idx + 1) & (size - 1);
+ if (idx != tail) {
+ while (CIRC_CNT(idx, tail, size) > 0) {
+ tmp = (struct dpa_ptp_data *)(circ_buf->buf) + idx;
+ idx = (idx - 1) & (size - 1);
+ tmp2 = (struct dpa_ptp_data *)(circ_buf->buf) + idx;
+ *tmp = *tmp2;
+ }
+ }
+ circ_buf->tail = (tail + 1) & (size - 1);
spin_unlock_irqrestore(&ptp_buf->ptp_lock, flags);
diff --git a/drivers/net/ethernet/freescale/dpa/dpaa_1588.h b/drivers/net/ethernet/freescale/dpa/dpaa_1588.h
index ac2fc73..eda0e3a 100644
--- a/drivers/net/ethernet/freescale/dpa/dpaa_1588.h
+++ b/drivers/net/ethernet/freescale/dpa/dpaa_1588.h
@@ -27,7 +27,7 @@
#include <linux/fsl_qman.h>
#define DEFAULT_PTP_RX_BUF_SZ 2048
-#define DEFAULT_PTP_TX_BUF_SZ 512
+#define DEFAULT_PTP_TX_BUF_SZ 1024
/* 1588 private ioctl calls */
#define PTP_ENBL_TXTS_IOCTL SIOCDEVPRIVATE