summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVitaly Andrianov2019-09-09 07:12:25 -0500
committerMahesh Radhakrishnan2019-09-16 12:20:47 -0500
commitb098655fc837efd25b87cb7e3c1ad8f81139c34b (patch)
treef3eafed4b435fc53702aecbe1f39137da864b9ea
parent2054fd8ec9f8c1d8ea971d25790814ea03b6edb3 (diff)
downloademac-lld-b098655fc837efd25b87cb7e3c1ad8f81139c34b.tar.gz
emac-lld-b098655fc837efd25b87cb7e3c1ad8f81139c34b.tar.xz
emac-lld-b098655fc837efd25b87cb7e3c1ad8f81139c34b.zip
dual_mac fw: fix possible ingress buffer management issues
P_W32 macro didn't c check "buffer full" after wrapping the wr_cur pointer. That might cause data corruption. This commit fixed this issue. Signed-off-by: Vitaly Andrianov <vitalya@ti.com>
-rw-r--r--firmware/icss_dualmac/src/psisandf.h41
-rw-r--r--firmware/icss_dualmac/src/rxl2_txl2.asm1
2 files changed, 17 insertions, 25 deletions
diff --git a/firmware/icss_dualmac/src/psisandf.h b/firmware/icss_dualmac/src/psisandf.h
index 9f38098..4d08561 100644
--- a/firmware/icss_dualmac/src/psisandf.h
+++ b/firmware/icss_dualmac/src/psisandf.h
@@ -70,29 +70,21 @@ MINPS .set 32 ;1st slot for 32 byte chunks
70;called by Rx Task 70;called by Rx Task
71;---------------------- 71;----------------------
72;push r2-r9 to a bs slot, start of packet 72;push r2-r9 to a bs slot, start of packet
73P_W32_S .macro full_lable
74 .newblock
75 mov GRegs.snf.b.wr_orig, GRegs.snf.b.wr_cur ;stash original write pointer in case we abort
76 mov r10, GRegs.snf.b.wr_cur
77 xout Q_XID, &r2, 36
78 add GRegs.snf.b.wr_cur, GRegs.snf.b.wr_cur, 1
79 qbeq full_lable, GRegs.snf.b.wr_cur, GRegs.snf.b.rd_cur
80 qbge $1, GRegs.snf.b.wr_cur, MAXPS
81 ldi GRegs.snf.b.wr_cur, MINPS
82$1:
83 .endm
84
85;push r2-r9 to a bs slot 73;push r2-r9 to a bs slot
86; GR_AUX_STATE holds slot control info (r/w ptr) 74; GR_AUX_STATE holds slot control info (r/w ptr)
87P_W32 .macro full_lable 75P_W32 .macro full_label
88 .newblock 76 .newblock
89 mov r10, GRegs.snf.b.wr_cur 77 mov r10, GRegs.snf.b.wr_cur
90 xout Q_XID, &r2, 36 78 xout Q_XID, &r2, 36
91 add GRegs.snf.b.wr_cur, GRegs.snf.b.wr_cur, 1 79 add GRegs.snf.b.wr_cur, GRegs.snf.b.wr_cur, 1
92 qbeq full_lable, GRegs.snf.b.wr_cur, GRegs.snf.b.rd_cur
93 qbge $1, GRegs.snf.b.wr_cur, MAXPS 80 qbge $1, GRegs.snf.b.wr_cur, MAXPS
94 ldi GRegs.snf.b.wr_cur, MINPS 81 ldi GRegs.snf.b.wr_cur, MINPS
95$1: 82$1: qbeq full_label, GRegs.snf.b.wr_cur, GRegs.snf.b.rd_cur
83 .endm
84
85P_W32_S .macro full_label
86 mov GRegs.snf.b.wr_orig, GRegs.snf.b.wr_cur ;stash original write pointer in case we abort
87 P_W32 full_label
96 .endm 88 .endm
97 89
98P_W32_ABORT .macro 90P_W32_ABORT .macro
@@ -136,6 +128,13 @@ md_lab2?:
136eop_lab?: 128eop_lab?:
137 .endm 129 .endm
138 130
131READ_PAGE .macro page
132 TM_DISABLE
133 mov r10.w0, page
134 xout Q_XID, &r10.w0, 2
135 xin Q_XID, &r2, 32
136 TM_ENABLE
137 .endm
139 138
140;poll routine for bg. read 32 bytes from BS and send to host in 2 psi transfers 139;poll routine for bg. read 32 bytes from BS and send to host in 2 psi transfers
141; r_s = psi state 140; r_s = psi state
@@ -145,11 +144,7 @@ PSISANDF_TX .macro more_data_label, eop_label
145;have data ready 144;have data ready
146 qbge tx_cont1a?, BgRegs.len2host, 32 145 qbge tx_cont1a?, BgRegs.len2host, 32
147;read the 32 bytes & write to PSI in 2 transactions 146;read the 32 bytes & write to PSI in 2 transactions
148 TM_DISABLE 147 READ_PAGE GRegs.snf.b.rd_cur
149 mov r10.w0, GRegs.snf.b.rd_cur
150 xout Q_XID, &r10.w0, 2
151 xin Q_XID, &r2, 32
152 TM_ENABLE
153 ldi32 r1, MD_DATA0 148 ldi32 r1, MD_DATA0
154 PSI_WRITE 149 PSI_WRITE
155 PSILOOP_STALL_TX_OK ;stall until PSI tx status good 150 PSILOOP_STALL_TX_OK ;stall until PSI tx status good
@@ -163,11 +158,7 @@ PSISANDF_TX .macro more_data_label, eop_label
163 jmp more_data_label 158 jmp more_data_label
164 159
165tx_cont1a?: ;eop 160tx_cont1a?: ;eop
166 TM_DISABLE 161 READ_PAGE GRegs.snf.b.rd_cur
167 mov r10.w0,GRegs.snf.b.rd_cur
168 xout Q_XID, &r10.w0, 2
169 xin Q_XID, &r2, 32
170 TM_ENABLE
171 add GRegs.snf.b.rd_cur, GRegs.snf.b.rd_cur, 1 162 add GRegs.snf.b.rd_cur, GRegs.snf.b.rd_cur, 1
172 qbge chk_len?, GRegs.snf.b.rd_cur, MAXPS 163 qbge chk_len?, GRegs.snf.b.rd_cur, MAXPS
173 ldi GRegs.snf.b.rd_cur,MINPS 164 ldi GRegs.snf.b.rd_cur,MINPS
diff --git a/firmware/icss_dualmac/src/rxl2_txl2.asm b/firmware/icss_dualmac/src/rxl2_txl2.asm
index 7bcdf65..84d9382 100644
--- a/firmware/icss_dualmac/src/rxl2_txl2.asm
+++ b/firmware/icss_dualmac/src/rxl2_txl2.asm
@@ -615,6 +615,7 @@ RX_B0:
615 615
616;some error/exception cases handling here 616;some error/exception cases handling here
617rxb0_full: ;psi fifo in bsram full 617rxb0_full: ;psi fifo in bsram full
618 P_W32_ABORT
618 ldi GRegs.rx.x, 0x7F80 619 ldi GRegs.rx.x, 0x7F80
619 add GRegs.snf.b.dbg_cnt, GRegs.snf.b.dbg_cnt, 1 620 add GRegs.snf.b.dbg_cnt, GRegs.snf.b.dbg_cnt, 1
620 jmp rx_b0_done 621 jmp rx_b0_done