The LIMIT_FC method is the simplest to implement. The user application assesses the maximum number of outstanding Non-Posted Requests allowed at one time, MAX_NP. To calculate this value, perform these steps:
1. Determine the number of CplH credits required by a Max_Request_Size packet:
Max_Header_Count = ceiling(Max_Request_Size / RCB)
2. Determine the greatest number of maximum-sized completions supported by the CplD credit pool:
Max_Packet_Count_CplD = floor(CplD / Max_Request_Size)
3. Determine the greatest number of maximum-sized completions supported by the CplH credit pool:
Max_Packet_Count_CplH = floor(CplH / Max_Header_Count)
4. Use the smaller of the two quantities from steps 2 and 3 to obtain the maximum number of outstanding Non-Posted requests:
MAX_NP = min(Max_Packet_Count_CplH, Max_Packet_Count_CplD)
With knowledge of MAX_NP, the user application can load a register NP_PENDING with zero at reset and make sure it always stays with the range 0 to MAX_NP. When a non-posted request is transmitted, NP_PENDING decreases by one. When all completions for an outstanding non-posted request are received, NP_PENDING increases by one.
For example:
• Max_ R equ e s t _Siz e = 128B
• RCB = 64B
• CplH = 64
• CplD = 15,872B
• Max_He a d er_Coun t = 2
• Max_ P ac k et_Count_Cpl D = 124
• Max_ P ac k et_Count_Cpl H = 32
• MAX_NP = 32
Although this method is the simplest to implement, it can waste the greatest receiver space because an entire Max_Request_Size block of completion credit is allocated for each non-posted request, regardless of actual request size. The amount of waste becomes greater when the user application issues a larger proportion of short memory reads (on the order of a single DWORD), I/O reads and I/O writes.