avr: introduce reference counter for network buffers.
This commit is contained in:
@@ -62,7 +62,7 @@ NET_Buffer_Alloc_noIrq:
|
||||
ldi xh, HIGH(netBuffers)
|
||||
m_fixedbuf_reserve NET_BUFFERS_SIZE, NET_BUFFERS_NUM
|
||||
brcc NET_Buffer_Alloc_end
|
||||
ldi r17, (1<<NET_IFACE_BUFFER_INUSE_BIT)
|
||||
ldi r17, (1<<NET_IFACE_BUFFER_INUSE_BIT0) ; set refcounter to 1
|
||||
st X, r17
|
||||
NET_Buffer_Alloc_end:
|
||||
ret
|
||||
@@ -80,7 +80,54 @@ NET_Buffer_ReleaseByAddr:
|
||||
push r15
|
||||
in r15, SREG
|
||||
cli
|
||||
ld r16, X
|
||||
swap r16
|
||||
andi r16, 0x0f ; ref counter now in lower nibble
|
||||
breq NET_Buffer_ReleaseByAddr_done ; refcounter 0? -> not in use
|
||||
dec r16
|
||||
breq NET_Buffer_ReleaseByAddr_release
|
||||
swap r16
|
||||
push r17
|
||||
ld r17, X
|
||||
andi r17, 0x0f
|
||||
or r16, r17
|
||||
st X, r16
|
||||
pop r17
|
||||
rjmp NET_Buffer_ReleaseByAddr_done
|
||||
NET_Buffer_ReleaseByAddr_release:
|
||||
m_fixedbuf_release
|
||||
NET_Buffer_ReleaseByAddr_done:
|
||||
out SREG, r15
|
||||
pop r15
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine NET_Buffer_IncRef @global
|
||||
;
|
||||
; @param X pointer to start of buffer
|
||||
; @clobbers R16
|
||||
|
||||
NET_Buffer_IncRef:
|
||||
push r15
|
||||
in r15, SREG
|
||||
cli
|
||||
ld r16, X
|
||||
swap r16 ; ref counter now in lower nibble
|
||||
andi r16, 0x0f
|
||||
breq NET_Buffer_IncRef_done ; refcounter 0? -> not in use
|
||||
inc r16
|
||||
breq NET_Buffer_IncRef_done ; don't increment if refcounter at max!!!
|
||||
swap r16 ; ref counter now in high nibble again
|
||||
push r17
|
||||
ld r17, X
|
||||
andi r17, 0x0f ; clear ref counter in r17
|
||||
or r16, r17 ; or new ref counter into r17
|
||||
st X, r16 ; store new header byte
|
||||
pop r17
|
||||
NET_Buffer_IncRef_done:
|
||||
out SREG, r15
|
||||
pop r15
|
||||
ret
|
||||
|
||||
Reference in New Issue
Block a user