diff options
author | Vitaly Andrianov | 2019-09-09 07:12:25 -0500 |
---|---|---|
committer | Mahesh Radhakrishnan | 2019-09-16 12:20:47 -0500 |
commit | b098655fc837efd25b87cb7e3c1ad8f81139c34b (patch) | |
tree | f3eafed4b435fc53702aecbe1f39137da864b9ea | |
parent | 2054fd8ec9f8c1d8ea971d25790814ea03b6edb3 (diff) | |
download | emac-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.h | 41 | ||||
-rw-r--r-- | firmware/icss_dualmac/src/rxl2_txl2.asm | 1 |
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 |
73 | P_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) |
87 | P_W32 .macro full_lable | 75 | P_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 | |||
85 | P_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 | ||
98 | P_W32_ABORT .macro | 90 | P_W32_ABORT .macro |
@@ -136,6 +128,13 @@ md_lab2?: | |||
136 | eop_lab?: | 128 | eop_lab?: |
137 | .endm | 129 | .endm |
138 | 130 | ||
131 | READ_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 | ||
165 | tx_cont1a?: ;eop | 160 | tx_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 |
617 | rxb0_full: ;psi fifo in bsram full | 617 | rxb0_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 |