1 /* Test case contributed by Ingo Rohloff <rohloff@in.tum.de>.
2    Code distilled from Linux kernel.  */
3 
4 /* Compile this program with a gcc-2.95.2 using
5    "gcc -O2" and run it. The result will be that
6    rx_ring[1].next == 0   (it should be == 14)
7    and
8    ep.skbuff[4] == 5      (it should be 0)
9 */
10 
11 extern void abort(void);
12 
13 struct epic_rx_desc
14 {
15   unsigned int next;
16 };
17 
18 struct epic_private
19 {
20   struct epic_rx_desc *rx_ring;
21   unsigned int rx_skbuff[5];
22 };
23 
epic_init_ring(struct epic_private * ep)24 static void epic_init_ring(struct epic_private *ep)
25 {
26   int i;
27 
28   for (i = 0; i < 5; i++)
29   {
30     ep->rx_ring[i].next = 10 + (i+1)*2;
31     ep->rx_skbuff[i] = 0;
32   }
33   ep->rx_ring[i-1].next = 10;
34 }
35 
36 static int check_rx_ring[5] = { 12,14,16,18,10 };
37 
main(void)38 int main(void)
39 {
40   struct epic_private ep;
41   struct epic_rx_desc rx_ring[5];
42   int i;
43 
44   for (i=0;i<5;i++)
45   {
46     rx_ring[i].next=0;
47     ep.rx_skbuff[i]=5;
48   }
49 
50   ep.rx_ring=rx_ring;
51   epic_init_ring(&ep);
52 
53   for (i=0;i<5;i++)
54   {
55     if ( rx_ring[i].next != check_rx_ring[i] ) abort();
56     if ( ep.rx_skbuff[i] != 0 ) abort();
57   }
58   return 0;
59 }
60