1: int32_t AG903_OSPMgrSetFIFO(
AG903_OSPMgrHandle *handle, uint32_t setcnt)
2: {
3: int32_t rc =
AG903_ENONE;
4: uint8_t ch;
5:
OSPCmdDesc *desc;
6: uint8_t ovf = 0;
7: uint8_t siz = 0;
8: uint32_t MaxLen;
9:
10:
if(NULL == handle) {
11: rc = -
AG903_EINVAL;
12: }
13:
14: rc = OSPMgrCheckHandle(handle, &ch);
15:
if(
AG903_ENONE != rc) {
16:
17:
return -
AG903_EINVAL;
18: }
19:
if(NULL == OspChStat[ch].cmdbuf) {
20:
21:
return -
AG903_ENODATA;
22: }
23:
24: desc = (
OSPCmdDesc*)OspChStat[ch].cmdbuf;
25:
if(0 == desc->CurLen) {
26:
27:
return -
AG903_ENODATA;
28: }
29:
30:
if (setcnt > desc->CurLen) {
31:
32:
return -
AG903_EINVAL;
33: }
34:
35:
AG903_OSPPrmFIFOSTAT(ch, &ovf, &siz);
36:
37:
if (ovf ==
true) {
38:
39:
return -
AG903_EOVERFLOW;
40: }
41:
if ((siz == 0) || (siz < setcnt)) {
42:
43:
return -
AG903_EBUSY;
44: }
45:
46:
#if AG903_OSP_CMD_PARSE
47:
if (rc ==
AG903_ENONE) {
48: rc = OSPMgrParseCommand(desc);
49: }
50:
#endif
51:
52:
if (AG903_OSP_BUFMODE_RING == desc->BuffMode) {
53: MaxLen = desc->BufLen;
54: }
55:
else {
56: MaxLen = desc->CurLen;
57: }
58:
59:
if ((desc->RdBuf + setcnt) > (desc->Buf + MaxLen)) {
60: uint32_t Len;
61:
74: Len = (desc->Buf + MaxLen) - desc->RdBuf;
75:
AG903_OSPPrmFIFODT(ch, desc->RdBuf, Len);
76:
77: desc->RdBuf = desc->Buf;
78: setcnt -= Len;
79:
80:
if (AG903_OSP_BUFMODE_RING == desc->BuffMode) {
81: desc->CurLen -= Len;
82: }
83: }
84:
85:
AG903_OSPPrmFIFODT(ch, desc->RdBuf, setcnt);
86: desc->RdBuf += setcnt;
87:
88:
if (AG903_OSP_BUFMODE_RING == desc->BuffMode) {
89: desc->CurLen -= setcnt;
90: }
91:
92:
if (desc->RdBuf >= (desc->Buf + MaxLen)) {
93: desc->RdBuf = desc->Buf;
94: }
95:
96:
return rc;
97: }