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
11extern void abort(void);
12
13struct epic_rx_desc
14{
15  unsigned int next;
16};
17
18struct epic_private
19{
20  struct epic_rx_desc *rx_ring;
21  unsigned int rx_skbuff[5];
22};
23
24static 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
36static int check_rx_ring[5] = { 12,14,16,18,10 };
37
38int 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