e9c6d94e9288cdb16a10a411cf50320906fe6476
[librecmc/librecmc.git] / target / linux / storm / patches / 1006-gmac-napi-tx.patch
1 Index: linux-2.6.23.17/drivers/net/sl351x_gmac.c
2 ===================================================================
3 --- linux-2.6.23.17.orig/drivers/net/sl351x_gmac.c
4 +++ linux-2.6.23.17/drivers/net/sl351x_gmac.c
5 @@ -43,9 +43,13 @@
6  
7  #include <linux/mtd/kvctl.h>
8  
9 +#define GET_RPTR(x) ((x) & 0xFFFF)
10 +#define GET_WPTR(x) ((x) >> 16)
11 +
12  #define         MIDWAY
13  #define         SL_LEPUS
14 -#define VITESSE_G5SWITCH       1
15 +// #define VITESSE_G5SWITCH    1
16 +#undef VITESSE_G5SWITCH
17  
18  #ifndef CONFIG_SL351x_RXTOE
19  //#define CONFIG_SL351x_RXTOE  1
20 @@ -126,7 +130,6 @@ static      char _debug_prefetch_buf[_DEBUG_P
21   *************************************************************/
22  static int     gmac_initialized = 0;
23  TOE_INFO_T toe_private_data;
24 -static int             do_again = 0;
25  static int rx_poll_enabled;
26  spinlock_t gmac_fq_lock;
27  unsigned int FLAG_SWITCH;
28 @@ -190,7 +193,7 @@ void mac_get_sw_tx_weight(struct net_dev
29  void mac_set_sw_tx_weight(struct net_device *dev, char *weight);
30  void mac_get_hw_tx_weight(struct net_device *dev, char *weight);
31  void mac_set_hw_tx_weight(struct net_device *dev, char *weight);
32 -static inline void toe_gmac_fill_free_q(void);
33 +static inline void toe_gmac_fill_free_q(int count);
34  
35  #ifdef VITESSE_G5SWITCH
36  extern int Get_Set_port_status(void);
37 @@ -295,12 +298,14 @@ static int __init gmac_init_module(void)
38         for(j = 0; i<CONFIG_MAC_NUM; j++)
39         {
40                 i=j;
41 +#ifdef VITESSE_G5SWITCH
42                 if(Giga_switch){                // if gswitch present, swap eth0/1
43                         if(j==0)
44                                 i=1;
45                         else if(j==1)
46                                 i=0;
47                 }
48 +#endif
49  
50                 tp = (GMAC_INFO_T *)&toe_private_data.gmac[i];
51                 tp->dev = NULL;
52 @@ -459,7 +464,7 @@ void mac_init_drv(void)
53                 toe->gmac[1].dma_base_addr = TOE_GMAC1_DMA_BASE;
54          toe->gmac[0].auto_nego_cfg = 1;
55          toe->gmac[1].auto_nego_cfg = 1;
56 -#ifdef CONFIG_SL3516_ASIC
57 +#ifndef CONFIG_SL3516_ASIC
58          toe->gmac[0].speed_cfg = GMAC_SPEED_1000;
59          toe->gmac[1].speed_cfg = GMAC_SPEED_1000;
60  #else
61 @@ -508,7 +513,7 @@ void mac_init_drv(void)
62                 // Write GLOBAL_QUEUE_THRESHOLD_REG
63                 threshold.bits32 = 0;
64                 threshold.bits.swfq_empty = (TOE_SW_FREEQ_DESC_NUM > 256) ? 255 :
65 -                                                       TOE_SW_FREEQ_DESC_NUM/2;
66 +                                                       TOE_SW_FREEQ_DESC_NUM/16;
67                 threshold.bits.hwfq_empty = (TOE_HW_FREEQ_DESC_NUM > 256) ? 256/4 :
68                                                         TOE_HW_FREEQ_DESC_NUM/4;
69                 threshold.bits.toe_class = (TOE_TOE_DESC_NUM > 256) ? 256/4 :
70 @@ -613,18 +618,25 @@ static void toe_init_free_queue(void)
71         rwptr_reg.bits.rptr = 0;
72         toe->fq_rx_rwptr.bits32 = rwptr_reg.bits32;
73         writel(rwptr_reg.bits32, TOE_GLOBAL_BASE + GLOBAL_SWFQ_RWPTR_REG);
74 +       printk("SWFQ: %08X\n", readl(TOE_GLOBAL_BASE + GLOBAL_SWFQ_RWPTR_REG));
75  
76         // SW Free Queue Descriptors
77         for (i=0; i<TOE_SW_FREEQ_DESC_NUM; i++)
78         {
79 +               void *data = NULL;
80                 sw_desc_ptr->word0.bits.buffer_size = SW_RX_BUF_SIZE;
81 -               sw_desc_ptr->word1.bits.sw_id = i;      // used to locate skb
82 +               sw_desc_ptr->word1.bits.sw_id = 0;      // used to locate skb
83                 if ( (skb = dev_alloc_skb(SW_RX_BUF_SIZE))==NULL)  /* allocate socket buffer */
84                 {
85                         printk("%s::skb buffer allocation fail !\n",__func__); while(1);
86                 }
87 -               REG32(skb->data) = (unsigned int)skb;
88 +
89 +               data = skb->data;
90                 skb_reserve(skb, SKB_RESERVE_BYTES);
91 +
92 +               REG32(data + 0) = (unsigned int)skb;
93 +               REG32(data + 4) = (unsigned short)i;
94 +
95                 // toe->rx_skb[i] = skb;
96                 sw_desc_ptr->word2.buf_adr = (unsigned int)__pa(skb->data);
97  //             consistent_sync((unsigned int)desc_ptr, sizeof(GMAC_RXDESC_T), PCI_DMA_TODEVICE);
98 @@ -851,14 +863,14 @@ static void toe_init_hwtx_queue(void)
99  *----------------------------------------------------------------------*/
100  static void toe_init_default_queue(void)
101  {
102 -       TOE_INFO_T                              *toe;
103 +       TOE_INFO_T              *toe;
104         volatile NONTOE_QHDR_T  *qhdr;
105 -       GMAC_RXDESC_T                   *desc_ptr;
106 -       DMA_SKB_SIZE_T                  skb_size;
107 +       GMAC_RXDESC_T           *desc_ptr;
108 +       DMA_SKB_SIZE_T          skb_size;
109  
110         toe = (TOE_INFO_T *)&toe_private_data;
111         desc_ptr = (GMAC_RXDESC_T *)DMA_MALLOC((TOE_DEFAULT_Q0_DESC_NUM * sizeof(GMAC_RXDESC_T)),
112 -                                                                                       (dma_addr_t *)&toe->gmac[0].default_desc_base_dma);
113 +                                              (dma_addr_t *)&toe->gmac[0].default_desc_base_dma);
114         if (!desc_ptr)
115         {
116                 printk("%s::DMA_MALLOC fail !\n",__func__);
117 @@ -866,14 +878,17 @@ static void toe_init_default_queue(void)
118         }
119         memset((void *)desc_ptr, 0, TOE_DEFAULT_Q0_DESC_NUM * sizeof(GMAC_RXDESC_T));
120         toe->gmac[0].default_desc_base = (unsigned int)desc_ptr;
121 +       printk("toe->gmac[0].default_desc_base_dma: %08X\n", toe->gmac[0].default_desc_base_dma);
122 +
123         toe->gmac[0].default_desc_num = TOE_DEFAULT_Q0_DESC_NUM;
124         qhdr = (volatile NONTOE_QHDR_T *)TOE_DEFAULT_Q0_HDR_BASE;
125         qhdr->word0.base_size = ((unsigned int)toe->gmac[0].default_desc_base_dma & NONTOE_QHDR0_BASE_MASK) | TOE_DEFAULT_Q0_DESC_POWER;
126         qhdr->word1.bits32 = 0;
127         toe->gmac[0].rx_rwptr.bits32 = 0;
128         toe->gmac[0].default_qhdr = (NONTOE_QHDR_T *)qhdr;
129 +
130         desc_ptr = (GMAC_RXDESC_T *)DMA_MALLOC((TOE_DEFAULT_Q1_DESC_NUM * sizeof(GMAC_RXDESC_T)),
131 -                                                                                       (dma_addr_t *)&toe->gmac[1].default_desc_base_dma);
132 +                                              (dma_addr_t *)&toe->gmac[1].default_desc_base_dma);
133         if (!desc_ptr)
134         {
135                 printk("%s::DMA_MALLOC fail !\n",__func__);
136 @@ -1071,12 +1086,16 @@ static void toe_init_gmac(struct net_dev
137  
138             data = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_SELECT_0_REG) & ~tp->intr0_selected;
139             writel(data, TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_SELECT_0_REG);
140 +
141             data = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_SELECT_1_REG) & ~tp->intr1_selected;
142             writel(data, TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_SELECT_1_REG);
143 +
144             data = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_SELECT_2_REG) & ~tp->intr2_selected;
145             writel(data, TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_SELECT_2_REG);
146 +
147             data = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_SELECT_3_REG) & ~tp->intr3_selected;
148             writel(data, TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_SELECT_3_REG);
149 +
150             data = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_SELECT_4_REG) & ~tp->intr4_selected;
151             writel(data, TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_SELECT_4_REG);
152         }
153 @@ -1176,11 +1195,11 @@ static int toe_gmac_init_chip(struct net
154         GMAC_CONFIG2_T  config2_val;
155         GMAC_CONFIG0_T  config0,config0_mask;
156         GMAC_CONFIG1_T  config1;
157 -       #ifdef CONFIG_SL351x_NAT
158         GMAC_CONFIG3_T  config3_val;
159 -       #endif
160         GMAC_TX_WCR0_T  hw_weigh;
161         GMAC_TX_WCR1_T  sw_weigh;
162 +
163 +       uint32_t weight = 0;
164  //     GMAC_HASH_ENABLE_REG0_T hash_ctrl;
165  //
166  #if 0 /* mac address will be set in late_initcall */
167 @@ -1202,24 +1221,23 @@ static int toe_gmac_init_chip(struct net
168         //      config1.bits32 = 0x002004;      //next version
169         /* set flow control threshold */
170         config1.bits32 = 0;
171 -       config1.bits.set_threshold = 32 / 2;
172 -       config1.bits.rel_threshold = 32 / 4 * 3;
173 +       config1.bits.set_threshold = (32 / 2);
174 +       config1.bits.rel_threshold = (32 / 4) * 3;
175         gmac_write_reg(tp->base_addr, GMAC_CONFIG1, config1.bits32, 0xffffffff);
176  
177 -       /* set flow control threshold */
178 +       /* TODO: set flow control threshold */
179         config2_val.bits32 = 0;
180 -       config2_val.bits.set_threshold = TOE_SW_FREEQ_DESC_NUM/2;
181 -       config2_val.bits.rel_threshold = TOE_SW_FREEQ_DESC_NUM*3/4;
182 +       config2_val.bits.set_threshold = TOE_SW_FREEQ_DESC_NUM/4;
183 +       config2_val.bits.rel_threshold = TOE_SW_FREEQ_DESC_NUM/2;
184         gmac_write_reg(tp->base_addr, GMAC_CONFIG2, config2_val.bits32,0xffffffff);
185  
186 -       #ifdef CONFIG_SL351x_NAT
187 -       /* set HW free queue flow control threshold */
188 +       /* TODO: set HW free queue flow control threshold */
189         config3_val.bits32 = 0;
190         config3_val.bits.set_threshold = PAUSE_SET_HW_FREEQ;
191         config3_val.bits.rel_threshold = PAUSE_REL_HW_FREEQ;
192         gmac_write_reg(tp->base_addr, GMAC_CONFIG3, config3_val.bits32,0xffffffff);
193 -       #endif
194 -       /* set_mcast_filter mask*/
195 +
196 +       /* TODO: set_mcast_filter mask*/
197         //      gmac_write_reg(tp->base_addr,GMAC_MCAST_FIL0,0x0,0xffffffff);
198         //  gmac_write_reg(tp->base_addr,GMAC_MCAST_FIL1,0x0,0xffffffff);
199  
200 @@ -1249,7 +1267,7 @@ static int toe_gmac_init_chip(struct net
201         config0.bits.dis_rx = 1;  /* disable rx */
202         config0.bits.dis_tx = 1;  /* disable tx */
203         config0.bits.loop_back = 0; /* enable/disable GMAC loopback */
204 -       config0.bits.rx_err_detect = 1;
205 +       config0.bits.rx_err_detect = 1; /* TODO: was 1, means disabled, 0 enabled ! */
206         config0.bits.rgmii_en = 0;
207         config0.bits.rgmm_edge = 1;
208         config0.bits.rxc_inv = 0;
209 @@ -1342,6 +1360,9 @@ static int toe_gmac_init_chip(struct net
210         gmac_write_reg(tp->dma_base_addr, GMAC_AHB_WEIGHT_REG, ahb_weight.bits32, ahb_weight_mask.bits32);
211         #endif
212  
213 +       weight = gmac_read_reg(tp->dma_base_addr, GMAC_AHB_WEIGHT_REG);
214 +       printk("====> %08X\n", weight);
215 +
216         #if defined(CONFIG_SL351x_NAT) || defined(CONFIG_SL351x_RXTOE)
217         gmac_write_reg(tp->dma_base_addr, GMAC_SPR0, IPPROTO_TCP, 0xffffffff);
218         #endif
219 @@ -1552,7 +1573,7 @@ static  void toe_gmac_tx_complete(GMAC_I
220                 rwptr.bits32 = readl(swtxq->rwptr_reg);
221                 if (rwptr.bits.rptr == swtxq->finished_idx)
222                         break;
223 -       curr_desc = (volatile GMAC_TXDESC_T *)swtxq->desc_base + swtxq->finished_idx;
224 +               curr_desc = (volatile GMAC_TXDESC_T *)swtxq->desc_base + swtxq->finished_idx;
225  //             consistent_sync((void *)curr_desc, sizeof(GMAC_TXDESC_T), PCI_DMA_FROMDEVICE);
226                 word0.bits32 = curr_desc->word0.bits32;
227                 word1.bits32 = curr_desc->word1.bits32;
228 @@ -1573,6 +1594,7 @@ static  void toe_gmac_tx_complete(GMAC_I
229                                 swtxq->finished_idx = RWPTR_ADVANCE_ONE(swtxq->finished_idx, swtxq->total_desc_num);
230                                 curr_desc = (GMAC_TXDESC_T *)swtxq->desc_base + swtxq->finished_idx;
231                                 word0.bits32 = curr_desc->word0.bits32;
232 +
233  #ifdef _DUMP_TX_TCP_CONTENT
234                                 if (curr_desc->word0.bits.buffer_size < 16)
235                                 {
236 @@ -1592,12 +1614,12 @@ static  void toe_gmac_tx_complete(GMAC_I
237                         word0.bits.status_tx_ok = 0;
238                         if (swtxq->tx_skb[swtxq->finished_idx])
239                         {
240 -                               if (interrupt)
241 -                                       dev_kfree_skb_irq(swtxq->tx_skb[swtxq->finished_idx]);
242 -                               else
243 -                                       dev_kfree_skb(swtxq->tx_skb[swtxq->finished_idx]);
244 +                               dev_kfree_skb(swtxq->tx_skb[swtxq->finished_idx]);
245                                 swtxq->tx_skb[swtxq->finished_idx] = NULL;
246 +                       } else {
247 +                               BUG();
248                         }
249 +
250                         curr_desc->word0.bits32 = word0.bits32;
251                         swtxq->curr_finished_desc = (GMAC_TXDESC_T *)curr_desc;
252                         swtxq->total_finished++;
253 @@ -1624,31 +1646,29 @@ static  void toe_gmac_tx_complete(GMAC_I
254  *----------------------------------------------------------------------*/
255  static int gmac_start_xmit(struct sk_buff *skb, struct net_device *dev)
256  {
257 -       GMAC_INFO_T                     *tp= dev->priv;
258 -//     static unsigned int     pcount = 0;
259 -//     unsigned int                    tx_qid;
260 -    DMA_RWPTR_T                                rwptr;
261 -       volatile GMAC_TXDESC_T  *curr_desc;
262 -       int                                     snd_pages = skb_shinfo(skb)->nr_frags + 1;  /* get number of descriptor */
263 -       int                                     frag_id = 0;
264 -       int                                     len, total_len = skb->len;
265 +       GMAC_INFO_T *tp= dev->priv;
266 +       DMA_RWPTR_T rwptr;
267 +       GMAC_TXDESC_T *curr_desc;
268 +       int snd_pages = skb_shinfo(skb)->nr_frags + 1;  /* get number of descriptor */
269 +       int frag_id = 0;
270 +       int len, total_len = skb->len;
271         struct net_device_stats *isPtr;
272 -       unsigned int                    free_desc;
273 -       GMAC_SWTXQ_T                    *swtxq;
274 +       unsigned int free_desc;
275 +       GMAC_SWTXQ_T *swtxq;
276         register unsigned long  word0, word1, word2, word3;
277         unsigned short                  wptr, rptr;
278  #ifdef L2_jumbo_frame
279         int header_len = skb->len;
280         struct iphdr    *ip_hdr;
281 -    struct tcphdr      *tcp_hdr;
282 -    int             tcp_hdr_len;
283 -    unsigned char      *ptr;
284 -    int             data_len,a;
285 -    unsigned int    val;
286 +       struct tcphdr   *tcp_hdr;
287 +       int             tcp_hdr_len;
288 +       unsigned char   *ptr;
289 +       int             data_len,a;
290 +       unsigned int    val;
291  #endif
292  
293  #ifdef GMAC_LEN_1_2_ISSUE
294 -       int                                             total_pages;
295 +       int total_pages;
296         total_pages = snd_pages;
297  #endif
298  
299 @@ -1664,13 +1684,6 @@ static int gmac_start_xmit(struct sk_buf
300      }
301  #endif
302  
303 -#if 0
304 -       if (storlink_ctl.recvfile==2)
305 -       {
306 -           printk("snd_pages=%d skb->len=%d\n",snd_pages,skb->len);
307 -       }
308 -#endif
309 -
310  #ifdef GMAC_USE_TXQ0
311         #define tx_qid  0
312  #endif
313 @@ -1703,9 +1716,9 @@ static int gmac_start_xmit(struct sk_buf
314         toe_gmac_tx_complete(tp, tx_qid, dev, 0);
315  
316         if (wptr >= swtxq->finished_idx)
317 -               free_desc = swtxq->total_desc_num - wptr - 1 + swtxq->finished_idx;
318 +               free_desc = swtxq->total_desc_num - wptr + swtxq->finished_idx;
319         else
320 -               free_desc = swtxq->finished_idx - wptr - 1;
321 +               free_desc = swtxq->finished_idx - wptr;
322         if (free_desc < snd_pages)
323         {
324  //             spin_unlock(&tp->tx_mutex);
325 @@ -2063,9 +2076,10 @@ void mac_start_txdma(struct net_device *
326  struct net_device_stats * gmac_get_stats(struct net_device *dev)
327  {
328      GMAC_INFO_T *tp = (GMAC_INFO_T *)dev->priv;
329 +#if 0  /* don't read stats from hardware, scary numbers. */
330      // unsigned int        flags;
331 -    unsigned int        pkt_drop;
332 -    unsigned int        pkt_error;
333 +    unsigned int        pkt_drop = 0;
334 +    unsigned int        pkt_error = 0;
335  
336      if (netif_running(dev))
337      {
338 @@ -2073,10 +2087,14 @@ struct net_device_stats * gmac_get_stats
339          // spin_lock_irqsave(&tp->lock,flags);
340          pkt_drop = gmac_read_reg(tp->base_addr,GMAC_IN_DISCARDS);
341          pkt_error = gmac_read_reg(tp->base_addr,GMAC_IN_ERRORS);
342 +       printk("**** stack: %lu, hw: %lu\n", tp->ifStatics.rx_dropped, pkt_drop);
343 +
344          tp->ifStatics.rx_dropped = tp->ifStatics.rx_dropped + pkt_drop;
345          tp->ifStatics.rx_errors = tp->ifStatics.rx_errors + pkt_error;
346          // spin_unlock_irqrestore(&tp->lock,flags);
347      }
348 +#endif
349 +
350      return &tp->ifStatics;
351  }
352  
353 @@ -2401,36 +2419,63 @@ static int gmac_close(struct net_device 
354  * toe_gmac_fill_free_q
355  * allocate buffers for free queue.
356  *----------------------------------------------------------------------*/
357 -static inline void toe_gmac_fill_free_q(void)
358 +static inline void toe_gmac_fill_free_q(int count)
359  {
360         struct sk_buff  *skb;
361         volatile DMA_RWPTR_T    fq_rwptr;
362         volatile GMAC_RXDESC_T  *fq_desc;
363 -       unsigned long   flags;
364 +       unsigned long flags;
365 +       unsigned short index;
366 +       int filled = 0;
367 +       static int entered;
368         // unsigned short max_cnt=TOE_SW_FREEQ_DESC_NUM>>1;
369  
370 +       BUG_ON(entered == 1);
371 +
372 +       entered = 1;
373 +
374 +
375         fq_rwptr.bits32 = readl(TOE_GLOBAL_BASE + GLOBAL_SWFQ_RWPTR_REG);
376         // spin_lock_irqsave(&gmac_fq_lock, flags);
377         //while ((max_cnt--) && (unsigned short)RWPTR_ADVANCE_ONE(fq_rwptr.bits.wptr,
378         //                              TOE_SW_FREEQ_DESC_NUM) != fq_rwptr.bits.rptr) {
379 -       while ((unsigned short)RWPTR_ADVANCE_ONE(fq_rwptr.bits.wptr,
380 -                                       TOE_SW_FREEQ_DESC_NUM) != fq_rwptr.bits.rptr) {
381 +       index = fq_rwptr.bits.wptr;
382 +#if 0
383 +       printk("wptr: %hu, rptr: %hu, refill idx: %hu\n",
384 +              GET_RPTR(fq_rwptr.bits32),
385 +              GET_WPTR(fq_rwptr.bits32),
386 +              index);
387 +#endif
388 +
389 +       index = RWPTR_ADVANCE_ONE(index, TOE_SW_FREEQ_DESC_NUM);
390 +       fq_desc = (GMAC_RXDESC_T*)toe_private_data.swfq_desc_base + index;
391 +       while (fq_desc->word2.buf_adr == 0) {
392 +               void *data = NULL;
393 +
394                 if ((skb = dev_alloc_skb(SW_RX_BUF_SIZE)) == NULL) {
395                         printk("%s::skb allocation fail!\n", __func__);
396 -                       //while(1);
397 -                       break;
398 +                       goto out;
399                 }
400 -               REG32(skb->data) = (unsigned int)skb;
401 +               ++ filled;
402 +               data = skb->data;
403                 skb_reserve(skb, SKB_RESERVE_BYTES);
404 -               // fq_rwptr.bits32 = readl(TOE_GLOBAL_BASE + GLOBAL_SWFQ_RWPTR_REG);
405 -               fq_rwptr.bits.wptr = RWPTR_ADVANCE_ONE(fq_rwptr.bits.wptr,
406 -                       TOE_SW_FREEQ_DESC_NUM);
407 -               fq_desc = (GMAC_RXDESC_T*)toe_private_data.swfq_desc_base+fq_rwptr.bits.wptr;
408 +
409 +               REG32(data + 0) = (unsigned int)skb;
410 +               REG32(data + 4) = (unsigned short)index;
411 +
412 +               // printk("refill skb: %p, idx: %hu\n", skb, index);
413                 fq_desc->word2.buf_adr = (unsigned int)__pa(skb->data);
414 -               SET_WPTR(TOE_GLOBAL_BASE+GLOBAL_SWFQ_RWPTR_REG, fq_rwptr.bits.wptr);
415 -               toe_private_data.fq_rx_rwptr.bits32 = fq_rwptr.bits32;
416 +       writel(0x07960202, TOE_GMAC0_BASE+GMAC_CONFIG0);
417 +               SET_WPTR(TOE_GLOBAL_BASE+GLOBAL_SWFQ_RWPTR_REG, index);
418 +       writel(0x07960200, TOE_GMAC0_BASE+GMAC_CONFIG0);
419 +
420 +               index = RWPTR_ADVANCE_ONE(index, TOE_SW_FREEQ_DESC_NUM);
421 +               fq_desc = (GMAC_RXDESC_T*)toe_private_data.swfq_desc_base+index;
422         }
423 +out:
424         // spin_unlock_irqrestore(&gmac_fq_lock, flags);
425 +
426 +       entered = 0;
427  }
428  // EXPORT_SYMBOL(toe_gmac_fill_free_q);
429  
430 @@ -2442,14 +2487,14 @@ static void gmac_registers(const char *m
431         unsigned int            status3;
432         unsigned int            status4;
433  
434 -       printk("%s\n", message);
435 -
436         status0 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_STATUS_0_REG);
437         status1 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_STATUS_1_REG);
438         status2 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_STATUS_2_REG);
439         status3 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_STATUS_3_REG);
440         status4 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_STATUS_4_REG);
441  
442 +       printk("%s\n", message);
443 +
444         printk("status: s0:%08X, s1:%08X, s2:%08X, s3:%08X, s4:%08X\n",
445                    status0, status1, status2, status3, status4);
446  
447 @@ -2468,8 +2513,9 @@ static void gmac_registers(const char *m
448         status3 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_SELECT_3_REG);
449         status4 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_SELECT_4_REG);
450  
451 -       printk("select: s0:%08X, s1:%08X, s2:%08X, s3:%08X, s4:%08X\n",
452 -                  status0, status1, status2, status3, status4);
453 +       if (status0 || status1 || status2 || status3 || status4)
454 +                       printk("select: s0:%08X, s1:%08X, s2:%08X, s3:%08X, s4:%08X\n",
455 +                                  status0, status1, status2, status3, status4);
456  }
457  /*----------------------------------------------------------------------
458  * toe_gmac_interrupt
459 @@ -2485,75 +2531,44 @@ static irqreturn_t toe_gmac_interrupt (i
460         unsigned int            status3;
461         unsigned int            status4;
462  
463 -//     struct net_device_stats *isPtr = (struct net_device_stats *)&tp->ifStatics;
464         toe = (TOE_INFO_T *)&toe_private_data;
465 -//     handle NAPI
466 -#ifdef CONFIG_SL_NAPI
467 -       /* XXX: check this, changed from 'storlink_ctl.pauseoff == 1' to if (1) */
468 -if (1)
469 -{
470 -/* disable GMAC interrupt */
471 -    //toe_gmac_disable_interrupt(tp->irq);
472  
473 -//     isPtr->interrupts++;
474 +       if (0 && rx_poll_enabled) {
475 +               gmac_registers("interrupt handler");
476 +       }
477 +
478         /* read Interrupt status */
479         status0 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_STATUS_0_REG);
480         status1 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_STATUS_1_REG);
481         status2 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_STATUS_2_REG);
482         status3 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_STATUS_3_REG);
483         status4 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_STATUS_4_REG);
484 -       // prompt warning if status bit ON but not enabled
485 +
486  #if 0
487 -       if (status0 & ~tp->intr0_enabled)
488 -               printk("Intr 0 Status error. status = 0x%X, enable = 0x%X\n",
489 -                               status0, tp->intr0_enabled);
490 -       if (status1 & ~tp->intr1_enabled)
491 -               printk("Intr 1 Status error. status = 0x%X, enable = 0x%X\n",
492 -                               status1, tp->intr1_enabled);
493 -       if (status2 & ~tp->intr2_enabled)
494 -               printk("Intr 2 Status error. status = 0x%X, enable = 0x%X\n",
495 -                               status2, tp->intr2_enabled);
496 -       if (status3 & ~tp->intr3_enabled)
497 -               printk("Intr 3 Status error. status = 0x%X, enable = 0x%X\n",
498 -                               status3, tp->intr3_enabled);
499 -       if (status4 & ~tp->intr4_enabled)
500 -               printk("Intr 4 Status error. status = 0x%X, enable = 0x%X\n",
501 -                               status4, tp->intr4_enabled);
502 +       /* handle freeq interrupt first */
503 +       if (status4 & SWFQ_EMPTY_INT_BIT)
504 +       {
505 +               toe_gmac_fill_free_q();
506 +               writel(status4 & SWFQ_EMPTY_INT_BIT, TOE_GLOBAL_BASE+GLOBAL_INTERRUPT_STATUS_4_REG);
507 +               tp->sw_fq_empty_cnt++;
508 +       }
509  #endif
510  
511 +       if (status4 & GMAC0_MIB_INT_BIT)
512 +               writel(GMAC0_MIB_INT_BIT, TOE_GLOBAL_BASE+GLOBAL_INTERRUPT_STATUS_4_REG);
513 +
514 +       if (status4 & GMAC0_RX_OVERRUN_INT_BIT)
515 +               writel(GMAC0_RX_OVERRUN_INT_BIT, TOE_GLOBAL_BASE+GLOBAL_INTERRUPT_STATUS_4_REG);
516 +
517         if (status0)
518                 writel(status0 & tp->intr0_enabled, TOE_GLOBAL_BASE+GLOBAL_INTERRUPT_STATUS_0_REG);
519 -       if (status1)
520 -               writel(status1 & tp->intr1_enabled, TOE_GLOBAL_BASE+GLOBAL_INTERRUPT_STATUS_1_REG);
521         if (status2)
522                 writel(status2 & tp->intr2_enabled, TOE_GLOBAL_BASE+GLOBAL_INTERRUPT_STATUS_2_REG);
523         if (status3)
524                 writel(status3 & tp->intr3_enabled, TOE_GLOBAL_BASE+GLOBAL_INTERRUPT_STATUS_3_REG);
525 -       if (status4)
526 -               writel(status4 & tp->intr4_enabled, TOE_GLOBAL_BASE+GLOBAL_INTERRUPT_STATUS_4_REG);
527 -
528 -#if 0
529 -       /* handle freeq interrupt first */
530 -       if (status4 & tp->intr4_enabled) {
531 -               if ((status4 & SWFQ_EMPTY_INT_BIT) && (tp->intr4_enabled & SWFQ_EMPTY_INT_BIT))
532 -               {
533 -                       // unsigned long data = REG32(TOE_GLOBAL_BASE + GLOBAL_SWFQ_RWPTR_REG);
534 -                       //gmac_write_reg(TOE_GLOBAL_BASE, GLOBAL_INTERRUPT_ENABLE_4_REG,
535 -                       //      tp->intr4_enabled & ~SWFQ_EMPTY_INT_BIT, SWFQ_EMPTY_INT_BIT);
536 -
537 -                       if (toe->gmac[0].dev && netif_running(toe->gmac[0].dev))
538 -                               toe_gmac_handle_default_rxq(toe->gmac[0].dev,&toe->gmac[0]);
539 -                       if (toe->gmac[1].dev && netif_running(toe->gmac[1].dev))
540 -                               toe_gmac_handle_default_rxq(toe->gmac[1].dev,&toe->gmac[1]);
541 -                       printk("\nfreeq int\n");
542 -                       toe_gmac_fill_free_q();
543 -                       tp->sw_fq_empty_cnt++;
544  
545 -               }
546 -       }
547 -#endif
548         // Interrupt Status 1
549 -       if (status1 & tp->intr1_enabled)
550 +       if ((status1 & 3) || (status4 & 1))
551         {
552                 #define G1_INTR0_BITS   (GMAC1_HWTQ13_EOF_INT_BIT | GMAC1_HWTQ12_EOF_INT_BIT | GMAC1_HWTQ11_EOF_INT_BIT | GMAC1_HWTQ10_EOF_INT_BIT)
553                 #define G0_INTR0_BITS   (GMAC0_HWTQ03_EOF_INT_BIT | GMAC0_HWTQ02_EOF_INT_BIT | GMAC0_HWTQ01_EOF_INT_BIT | GMAC0_HWTQ00_EOF_INT_BIT)
554 @@ -2563,7 +2578,7 @@ if (1)
555                 // because they should pass packets to upper layer
556                 if (tp->port_id == 0)
557                 {
558 -                       if (netif_running(dev) && (status1 & G0_INTR0_BITS) && (tp->intr1_enabled & G0_INTR0_BITS))
559 +                       if (((status1 & G0_INTR0_BITS) && (tp->intr1_enabled & G0_INTR0_BITS)) || (status4 & 1))
560                         {
561                                 if (status1 & GMAC0_HWTQ03_EOF_INT_BIT)
562                                         tp->hwtxq[3].eof_cnt++;
563 @@ -2574,50 +2589,51 @@ if (1)
564                                 if (status1 & GMAC0_HWTQ00_EOF_INT_BIT)
565                                         tp->hwtxq[0].eof_cnt++;
566                         }
567 -                               if (netif_running(dev) && (status1 & DEFAULT_Q0_INT_BIT) && (tp->intr1_enabled & DEFAULT_Q0_INT_BIT))
568 +                       if (status1 & DEFAULT_Q0_INT_BIT || status4 & 1)
569 +                       {
570 +                               if (likely(netif_rx_schedule_prep(dev)))
571                                 {
572 -                                       if (!rx_poll_enabled && likely(netif_rx_schedule_prep(dev)))
573 -                               {
574 -                                       unsigned int data32;
575 +                                       unsigned int data32;
576 +
577 +                                       BUG_ON(rx_poll_enabled == 1);
578  
579 -                                               if (rx_poll_enabled)
580 -                                                               gmac_registers("check #1");
581 +                                       /* Masks GMAC-0 rx interrupt */
582 +                                       data32  = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_ENABLE_1_REG);
583 +                                       data32 &= ~(DEFAULT_Q0_INT_BIT);
584 +                                       writel(data32, TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_ENABLE_1_REG);
585  
586 -                                               BUG_ON(rx_poll_enabled == 1);
587 +                                       /* Masks GMAC-0 queue empty interrupt */
588 +                                       data32  = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_ENABLE_4_REG);
589 +                                       data32 &= ~DEFAULT_Q0_INT_BIT;
590 +                                       writel(data32, TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_ENABLE_4_REG);
591  
592 +                                       __netif_rx_schedule(dev);
593 +                                       rx_poll_enabled = 1;
594 +                               } else {
595  #if 0
596 -                                       /* Masks GMAC-0 rx interrupt */
597 -                                               data32  = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_ENABLE_1_REG);
598 -                                               data32 &= ~(DEFAULT_Q0_INT_BIT);
599 -                                               writel(data32, TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_ENABLE_1_REG);
600 -
601 -                                       /* Masks GMAC-0 queue empty interrupt */
602 -                                               data32  = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_ENABLE_4_REG);
603 -                                               data32 &= ~DEFAULT_Q0_INT_BIT;
604 -                                               writel(data32, TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_ENABLE_4_REG);
605 -
606 -                                               data32  = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_SELECT_4_REG);
607 -                                               data32 &= ~DEFAULT_Q0_INT_BIT;
608 -                                               writel(data32, TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_SELECT_4_REG);
609 -#endif
610 -
611 -                                       // class-Q & TOE-Q are implemented in future
612 -                                       //data32 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_ENABLE_1_REG);
613 -                                       //data32 &= ~DEFAULT_Q0_INT_BIT;
614 -                                               //writel(data32, TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_ENABLE_1_REG);
615 -                                               //printk("\%s: DEFAULT_Q0_INT_BIT===================>>>>>>>>>>>>\n",__func__);
616 -                                               writel(0x0, TOE_GLOBAL_BASE+GLOBAL_INTERRUPT_ENABLE_1_REG);
617 -                                               //tp->total_q_cnt_napi=0;
618 -                                               //rx_time = jiffies;
619 -                                               //rx_old_bytes = isPtr->rx_bytes;
620 -                                               __netif_rx_schedule(dev);
621 -                                               rx_poll_enabled = 1;
622 -                               }
623 +                                       unsigned int data32;
624 +
625 +                                       if (rx_poll_enabled)
626 +                                               gmac_registers("->poll() running.");
627 +                                       /* Masks GMAC-0 rx interrupt */
628 +                                       data32  = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_ENABLE_1_REG);
629 +                                       data32 &= ~(DEFAULT_Q0_INT_BIT);
630 +                                       writel(data32, TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_ENABLE_1_REG);
631 +
632 +                                       /* Masks GMAC-0 queue empty interrupt */
633 +                                       data32  = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_ENABLE_4_REG);
634 +                                       data32 &= ~DEFAULT_Q0_INT_BIT;
635 +                                       writel(data32, TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_ENABLE_4_REG);
636 +#endif
637 +                               }
638 +                       } else {
639 +                               if (0)
640 +                                       gmac_registers("status1 & DEFAULT_Q0_INT_BIT || status4 & 1");
641                         }
642                 }
643 -               else if (tp->port_id == 1)
644 +               else if (tp->port_id == 1 && netif_running(dev))
645                 {
646 -                       if (netif_running(dev) && (status1 & G1_INTR0_BITS) && (tp->intr1_enabled & G1_INTR0_BITS))
647 +                       if ((status1 & G1_INTR0_BITS) && (tp->intr1_enabled & G1_INTR0_BITS))
648                         {
649                                 if (status1 & GMAC1_HWTQ13_EOF_INT_BIT)
650                                         tp->hwtxq[3].eof_cnt++;
651 @@ -2629,14 +2645,14 @@ if (1)
652                                         tp->hwtxq[0].eof_cnt++;
653                         }
654  
655 -                       if (netif_running(dev) && (status1 & DEFAULT_Q1_INT_BIT) && (tp->intr1_enabled & DEFAULT_Q1_INT_BIT))
656 +                       if ((status1 & DEFAULT_Q1_INT_BIT) && (tp->intr1_enabled & DEFAULT_Q1_INT_BIT))
657                         {
658                                 if (!rx_poll_enabled && likely(netif_rx_schedule_prep(dev)))
659 -                       {
660 -                               unsigned int data32;
661 +                               {
662 +                                       unsigned int data32;
663  
664                                         if (rx_poll_enabled)
665 -                                                       gmac_registers("check #2");
666 +                                               gmac_registers("check #2");
667  
668                                         BUG_ON(rx_poll_enabled == 1);
669  
670 @@ -2646,7 +2662,7 @@ if (1)
671                                         data32 &= ~(DEFAULT_Q1_INT_BIT);
672                                         writel(data32, TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_ENABLE_1_REG);
673  
674 -                               /* Masks GMAC-1 queue empty interrupt */
675 +                                       /* Masks GMAC-1 queue empty interrupt */
676                                         data32  = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_ENABLE_4_REG);
677                                         data32 &= ~DEFAULT_Q1_INT_BIT;
678                                         writel(data32, TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_ENABLE_4_REG);
679 @@ -2656,24 +2672,21 @@ if (1)
680                                         writel(data32, TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_SELECT_4_REG);
681  #endif
682  
683 -                               // disable GMAC-0 rx interrupt
684 -                               // class-Q & TOE-Q are implemented in future
685 -                               //data32 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_ENABLE_1_REG);
686 -                               //data32 &= ~DEFAULT_Q1_INT_BIT;
687 +                                       // disable GMAC-0 rx interrupt
688 +                                       // class-Q & TOE-Q are implemented in future
689 +                                       //data32 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_ENABLE_1_REG);
690 +                                       //data32 &= ~DEFAULT_Q1_INT_BIT;
691                                         //writel(data32, TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_ENABLE_1_REG);
692                                         //printk("\%s: 1111111111--->DEFAULT_Q1_INT_BIT===================>>>>>>>>>>>>\n",__func__);
693                                         writel(0x0, TOE_GLOBAL_BASE+GLOBAL_INTERRUPT_ENABLE_1_REG);
694                                         //tp->total_q_cnt_napi=0;
695                                         //rx_time = jiffies;
696                                         //rx_old_bytes = isPtr->rx_bytes;
697 -                               __netif_rx_schedule(dev);
698 -                               rx_poll_enabled = 1;
699 -                       }
700 +                                       __netif_rx_schedule(dev);
701 +                                       rx_poll_enabled = 1;
702 +                               }
703                         }
704                 }
705 -       } else {
706 -
707 -               gmac_registers("check #3");
708         }
709  
710         // Interrupt Status 0
711 @@ -2814,676 +2827,93 @@ if (1)
712                 }
713         }
714  
715 -       //toe_gmac_enable_interrupt(tp->irq);
716 -#ifdef IxscriptMate_1518
717 -       if (storlink_ctl.pauseoff == 1)
718 -       {
719 -               GMAC_CONFIG0_T config0;
720 -               config0.bits32 = readl(TOE_GMAC0_BASE+GMAC_CONFIG0);
721 -               config0.bits.dis_rx = 0;
722 -               writel(config0.bits32, TOE_GMAC0_BASE+GMAC_CONFIG0);
723 -               config0.bits32 = readl(TOE_GMAC1_BASE+GMAC_CONFIG0);
724 -               config0.bits.dis_rx = 0;
725 -               writel(config0.bits32, TOE_GMAC1_BASE+GMAC_CONFIG0);
726 -       }
727 -#endif
728 -//      enable_irq(gmac_irq[dev_index]);
729 -       //printk("gmac_interrupt complete!\n\n");
730 -//     return IRQ_RETVAL(handled);
731         return  IRQ_RETVAL(1);
732  }
733 -else
734 -{
735 -#endif //endif NAPI
736  
737 +/*----------------------------------------------------------------------
738 +* gmac_get_phy_vendor
739 +*----------------------------------------------------------------------*/
740 +static unsigned int gmac_get_phy_vendor(int phy_addr)
741 +{
742 +    unsigned int       reg_val;
743 +    reg_val=(mii_read(phy_addr,0x02) << 16) + mii_read(phy_addr,0x03);
744 +    return reg_val;
745 +}
746  
747 -       /* disable GMAC interrupt */
748 -    toe_gmac_disable_interrupt(tp->irq);
749 +/*----------------------------------------------------------------------
750 +* gmac_set_phy_status
751 +*----------------------------------------------------------------------*/
752 +void gmac_set_phy_status(struct net_device *dev)
753 +{
754 +       GMAC_INFO_T *tp = dev->priv;
755 +       GMAC_STATUS_T   status;
756 +       unsigned int    reg_val, ability,wan_port_id;
757 +       unsigned int    i = 0;
758  
759 -//     isPtr->interrupts++;
760 -       /* read Interrupt status */
761 -       status0 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_STATUS_0_REG);
762 -       status1 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_STATUS_1_REG);
763 -       status2 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_STATUS_2_REG);
764 -       status3 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_STATUS_3_REG);
765 -       status4 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_STATUS_4_REG);
766 -       // prompt warning if status bit ON but not enabled
767 +#ifdef VITESSE_G5SWITCH
768 +       if((tp->port_id == GMAC_PORT1)&&(Giga_switch==1)){
769  #if 0
770 -       if (status0 & ~tp->intr0_enabled)
771 -               printk("Intr 0 Status error. status = 0x%X, enable = 0x%X\n",
772 -                               status0, tp->intr0_enabled);
773 -       if (status1 & ~tp->intr1_enabled)
774 -               printk("Intr 1 Status error. status = 0x%X, enable = 0x%X\n",
775 -                               status1, tp->intr1_enabled);
776 -       if (status2 & ~tp->intr2_enabled)
777 -               printk("Intr 2 Status error. status = 0x%X, enable = 0x%X\n",
778 -                               status2, tp->intr2_enabled);
779 -       if (status3 & ~tp->intr3_enabled)
780 -               printk("Intr 3 Status error. status = 0x%X, enable = 0x%X\n",
781 -                               status3, tp->intr3_enabled);
782 -       if (status4 & ~tp->intr4_enabled)
783 -               printk("Intr 4 Status error. status = 0x%X, enable = 0x%X\n",
784 -                               status4, tp->intr4_enabled);
785 -#endif
786 -#define        INTERRUPT_SELECT                        1
787 -       if (status0)
788 -               writel(status0 & tp->intr0_enabled, TOE_GLOBAL_BASE+GLOBAL_INTERRUPT_STATUS_0_REG);
789 -       if (status1)
790 -               writel(status1 & tp->intr1_enabled, TOE_GLOBAL_BASE+GLOBAL_INTERRUPT_STATUS_1_REG);
791 -       if (status2)
792 -               writel(status2 & tp->intr2_enabled, TOE_GLOBAL_BASE+GLOBAL_INTERRUPT_STATUS_2_REG);
793 -       if (status3)
794 -               writel(status3 & tp->intr3_enabled, TOE_GLOBAL_BASE+GLOBAL_INTERRUPT_STATUS_3_REG);
795 -       if (status4)
796 -               writel(status4 & tp->intr4_enabled, TOE_GLOBAL_BASE+GLOBAL_INTERRUPT_STATUS_4_REG);
797 -
798 -       /* handle freeq interrupt first */
799 -       if (status4 & tp->intr4_enabled) {
800 -               if ((status4 & SWFQ_EMPTY_INT_BIT) && (tp->intr4_enabled & SWFQ_EMPTY_INT_BIT))
801 -               {
802 -                       // unsigned long data = REG32(TOE_GLOBAL_BASE + GLOBAL_SWFQ_RWPTR_REG);
803 -                       //gmac_write_reg(TOE_GLOBAL_BASE, GLOBAL_INTERRUPT_ENABLE_4_REG,
804 -                       //      tp->intr4_enabled & ~SWFQ_EMPTY_INT_BIT, SWFQ_EMPTY_INT_BIT);
805 -
806 -                       //gmac_write_reg(TOE_GLOBAL_BASE, GLOBAL_INTERRUPT_STATUS_4_REG,
807 -                       //      SWFQ_EMPTY_INT_BIT, SWFQ_EMPTY_INT_BIT);
808 -                       if (toe->gmac[0].dev && netif_running(toe->gmac[0].dev))
809 -                               toe_gmac_handle_default_rxq(toe->gmac[0].dev,&toe->gmac[0]);
810 -                       if (toe->gmac[1].dev && netif_running(toe->gmac[1].dev))
811 -                               toe_gmac_handle_default_rxq(toe->gmac[1].dev,&toe->gmac[1]);
812 -                       printk("\nfreeq int\n");
813 -                       toe_gmac_fill_free_q();
814 -                       tp->sw_fq_empty_cnt++;
815 -
816 -                       gmac_write_reg(TOE_GLOBAL_BASE, GLOBAL_INTERRUPT_STATUS_4_REG, status4,
817 -                               SWFQ_EMPTY_INT_BIT);
818 -               }
819 -       }
820 -
821 -       // Interrupt Status 1
822 -       if (status1 & tp->intr1_enabled)
823 -       {
824 -               #define G1_INTR0_BITS   (GMAC1_HWTQ13_EOF_INT_BIT | GMAC1_HWTQ12_EOF_INT_BIT | GMAC1_HWTQ11_EOF_INT_BIT | GMAC1_HWTQ10_EOF_INT_BIT)
825 -               #define G0_INTR0_BITS   (GMAC0_HWTQ03_EOF_INT_BIT | GMAC0_HWTQ02_EOF_INT_BIT | GMAC0_HWTQ01_EOF_INT_BIT | GMAC0_HWTQ00_EOF_INT_BIT)
826 -               // Handle GMAC 0/1 HW Tx queue 0-3 EOF events
827 -               // Only count
828 -               // TOE, Classification, and default queues interrupts are handled by ISR
829 -               // because they should pass packets to upper layer
830 -               if (tp->port_id == 0)
831 -               {
832 -#ifndef        INTERRUPT_SELECT
833 -                       if (netif_running(dev) && (status1 & G0_INTR0_BITS) && (tp->intr1_enabled & G0_INTR0_BITS))
834 -                       {
835 -                               if (status1 & GMAC0_HWTQ03_EOF_INT_BIT)
836 -                                       tp->hwtxq[3].eof_cnt++;
837 -                               if (status1 & GMAC0_HWTQ02_EOF_INT_BIT)
838 -                                       tp->hwtxq[2].eof_cnt++;
839 -                               if (status1 & GMAC0_HWTQ01_EOF_INT_BIT)
840 -                                       tp->hwtxq[1].eof_cnt++;
841 -                               if (status1 & GMAC0_HWTQ00_EOF_INT_BIT)
842 -                                       tp->hwtxq[0].eof_cnt++;
843 -#endif //INTERRUPT_SELECT
844 -#ifndef        INTERRUPT_SELECT
845 -                       }
846 -#endif //INTERRUPT_SELECT
847 -                       if (netif_running(dev) && (status1 & DEFAULT_Q0_INT_BIT) && (tp->intr1_enabled & DEFAULT_Q0_INT_BIT))
848 -                       {
849 -                               tp->default_q_intr_cnt++;
850 -                               toe_gmac_handle_default_rxq(dev, tp);
851 +               rcv_mask = SPI_read(2,0,0x10);                  // Receive mask
852 +               rcv_mask |= 0x4F;
853 +               for(i=0;i<4;i++){
854 +                       reg_val = BIT(26)|(i<<21)|(10<<16);
855 +                       SPI_write(3,0,1,reg_val);
856 +                       msleep(10);
857 +                       reg_val = SPI_read(3,0,2);
858 +                       if(reg_val & 0x0c00){
859 +                               printk("Port%d:Giga mode\n",i);
860 +                               SPI_write(1,i,0x00,0x300701B1);
861 +                               SPI_write(1,i,0x00,0x10070181);
862 +                               switch_pre_link[i]=LINK_UP;
863 +                               switch_pre_speed[i]=GMAC_SPEED_1000;
864                         }
865 -#ifdef CONFIG_SL351x_RXTOE
866 -                       if (netif_running(dev) && (status1 & TOE_IQ_ALL_BITS) &&
867 -                           (tp->intr1_enabled & TOE_IQ_ALL_BITS)) {
868 -                               //printk("status %x, bits %x, slct %x\n", status1, TOE_IQ_ALL_BITS, tp->intr1_selected);
869 -                               toe_gmac_handle_toeq(dev, tp, status1);
870 -                               //toe_gmac_handle_toeq(dev, toe, tp, status1);
871 +                       else{
872 +                               reg_val = BIT(26)|(i<<21)|(5<<16);
873 +                               SPI_write(3,0,1,reg_val);
874 +                               msleep(10);
875 +                               ability = (reg_val = SPI_read(3,0,2)&0x5e0) >>5;
876 +                               if ((ability & 0x0C)) /* 100M full duplex */
877 +                               {
878 +                                       SPI_write(1,i,0x00,0x30050472);
879 +                                       SPI_write(1,i,0x00,0x10050442);
880 +                                       printk("Port%d:100M\n",i);
881 +                                       switch_pre_link[i]=LINK_UP;
882 +                               switch_pre_speed[i]=GMAC_SPEED_100;
883 +                               }
884 +                               else if((ability & 0x03)) /* 10M full duplex */
885 +                               {
886 +                                       SPI_write(1,i,0x00,0x30050473);
887 +                                       SPI_write(1,i,0x00,0x10050443);
888 +                                       printk("Port%d:10M\n",i);
889 +                                       switch_pre_link[i]=LINK_UP;
890 +                                       switch_pre_speed[i]=GMAC_SPEED_10;
891 +                               }
892 +                               else{
893 +                                       SPI_write(1,i,0x00,BIT(16));                    // disable RX
894 +                                       SPI_write(5,0,0x0E,BIT(i));                     // dicard packet
895 +                                       while((SPI_read(5,0,0x0C)&BIT(i))==0)           // wait to be empty
896 +                                               msleep(1);
897 +
898 +                                       SPI_write(1,i,0x00,0x20000030);                 // PORT_RST
899 +                                       switch_pre_link[i]=LINK_DOWN;
900 +                                       switch_pre_speed[i]=GMAC_SPEED_10;
901 +                                       rcv_mask &= ~BIT(i);
902 +                                       SPI_write(2,0,0x10,rcv_mask);                   // Disable Receive
903 +                               }
904                         }
905 -#endif
906                 }
907 -               else if (tp->port_id == 1)
908 -               {
909 -#ifndef        INTERRUPT_SELECT
910 -                       if (netif_running(dev) && (status1 & G1_INTR0_BITS) && (tp->intr1_enabled & G1_INTR0_BITS))
911 -                       {
912 -                               if (status1 & GMAC1_HWTQ13_EOF_INT_BIT)
913 -                                       tp->hwtxq[3].eof_cnt++;
914 -                               if (status1 & GMAC1_HWTQ12_EOF_INT_BIT)
915 -                                       tp->hwtxq[2].eof_cnt++;
916 -                               if (status1 & GMAC1_HWTQ11_EOF_INT_BIT)
917 -                                       tp->hwtxq[1].eof_cnt++;
918 -                               if (status1 & GMAC1_HWTQ10_EOF_INT_BIT)
919 -                                       tp->hwtxq[0].eof_cnt++;
920 -#endif //INTERRUPT_SELECT
921 -#ifndef        INTERRUPT_SELECT
922 -                       }
923 -#endif //INTERRUPT_SELECT
924 -                       if (netif_running(dev) && (status1 & DEFAULT_Q1_INT_BIT) && (tp->intr1_enabled & DEFAULT_Q1_INT_BIT))
925 -                       {
926 -                               tp->default_q_intr_cnt++;
927 -                               toe_gmac_handle_default_rxq(dev, tp);
928 -                       }
929 -#ifdef CONFIG_SL351x_RXTOE
930 -                       if (netif_running(dev) && (status1 & TOE_IQ_ALL_BITS) &&
931 -                           (tp->intr1_enabled & TOE_IQ_ALL_BITS)) {
932 -                               //printk("status %x, bits %x, slct %x\n", status1, TOE_IQ_ALL_BITS, tp->intr1_selected);
933 -                               toe_gmac_handle_toeq(dev, tp, status1);
934 -                               //toe_gmac_handle_toeq(dev, toe, tp, status1);
935 -                       }
936  #endif
937 -               }
938 +               gmac_get_switch_status(dev);
939 +               gmac_write_reg(tp->base_addr, GMAC_STATUS, 0x7d, 0x0000007f);
940 +//             SPI_write(2,0,0x10,rcv_mask);                   // Enable Receive
941 +               return ;
942         }
943 +#endif
944  
945 +       reg_val = gmac_get_phy_vendor(tp->phy_addr);
946 +       printk("GMAC-%d Addr %d Vendor ID: 0x%08x\n", tp->port_id, tp->phy_addr, reg_val);
947  
948 -       // Interrupt Status 0
949 -       if (status0 & tp->intr0_enabled)
950 -       {
951 -
952 -               #define ERR_INTR_BITS   (GMAC0_TXDERR_INT_BIT | GMAC0_TXPERR_INT_BIT |  \
953 -                                                                GMAC1_TXDERR_INT_BIT | GMAC1_TXPERR_INT_BIT |  \
954 -                                                                GMAC0_RXDERR_INT_BIT | GMAC0_RXPERR_INT_BIT |  \
955 -                                                                GMAC1_RXDERR_INT_BIT | GMAC1_RXPERR_INT_BIT)
956 -#ifndef        INTERRUPT_SELECT
957 -               if (status0 &  ERR_INTR_BITS)
958 -               {
959 -                       if ((status0 & GMAC0_TXDERR_INT_BIT) && (tp->intr0_enabled & GMAC0_TXDERR_INT_BIT))
960 -                       {
961 -                               tp->txDerr_cnt[0]++;
962 -                               printk("GMAC0 TX AHB Bus Error!\n");
963 -                       }
964 -                       if ((status0 & GMAC0_TXPERR_INT_BIT) && (tp->intr0_enabled & GMAC0_TXPERR_INT_BIT))
965 -                       {
966 -                               tp->txPerr_cnt[0]++;
967 -                               printk("GMAC0 Tx Descriptor Protocol Error!\n");
968 -                       }
969 -                       if ((status0 & GMAC1_TXDERR_INT_BIT) && (tp->intr0_enabled & GMAC1_TXDERR_INT_BIT))
970 -                       {
971 -                               tp->txDerr_cnt[1]++;
972 -                               printk("GMAC1 Tx AHB Bus Error!\n");
973 -                       }
974 -                       if ((status0 & GMAC1_TXPERR_INT_BIT) && (tp->intr0_enabled & GMAC1_TXPERR_INT_BIT))
975 -                       {
976 -                               tp->txPerr_cnt[1]++;
977 -                               printk("GMAC1 Tx Descriptor Protocol Error!\n");
978 -                       }
979 -
980 -                       if ((status0 & GMAC0_RXDERR_INT_BIT) && (tp->intr0_enabled & GMAC0_RXDERR_INT_BIT))
981 -                       {
982 -                               tp->RxDerr_cnt[0]++;
983 -                               printk("GMAC0 Rx AHB Bus Error!\n");
984 -                       }
985 -                       if ((status0 & GMAC0_RXPERR_INT_BIT) && (tp->intr0_enabled & GMAC0_RXPERR_INT_BIT))
986 -                       {
987 -                               tp->RxPerr_cnt[0]++;
988 -                               printk("GMAC0 Rx Descriptor Protocol Error!\n");
989 -                       }
990 -                       if ((status0 & GMAC1_RXDERR_INT_BIT) && (tp->intr0_enabled & GMAC1_RXDERR_INT_BIT))
991 -                       {
992 -                               tp->RxDerr_cnt[1]++;
993 -                               printk("GMAC1 Rx AHB Bus Error!\n");
994 -                       }
995 -                       if ((status0 & GMAC1_RXPERR_INT_BIT) && (tp->intr0_enabled & GMAC1_RXPERR_INT_BIT))
996 -                       {
997 -                               tp->RxPerr_cnt[1]++;
998 -                               printk("GMAC1 Rx Descriptor Protocol Error!\n");
999 -                       }
1000 -               }
1001 -#endif //INTERRUPT_SELECT
1002 -#ifndef        GMAX_TX_INTR_DISABLED
1003 -               if (tp->port_id == 1 && netif_running(dev) &&
1004 -                       (((status0 & GMAC1_SWTQ10_FIN_INT_BIT) && (tp->intr0_enabled & GMAC1_SWTQ10_FIN_INT_BIT))
1005 -                       ||
1006 -                       ((status0 & GMAC1_SWTQ10_EOF_INT_BIT) && (tp->intr0_enabled & GMAC1_SWTQ10_EOF_INT_BIT))))
1007 -               {
1008 -                       toe_gmac_tx_complete(&toe_private_data.gmac[1], 0, dev, 1);
1009 -               }
1010 -
1011 -               if (tp->port_id == 0 && netif_running(dev) &&
1012 -                       (((status0 & GMAC0_SWTQ00_FIN_INT_BIT) && (tp->intr0_enabled & GMAC0_SWTQ00_FIN_INT_BIT))
1013 -                       ||
1014 -                       ((status0 & GMAC0_SWTQ00_EOF_INT_BIT) && (tp->intr0_enabled & GMAC0_SWTQ00_EOF_INT_BIT))))
1015 -               {
1016 -                       toe_gmac_tx_complete(&toe_private_data.gmac[0], 0, dev, 1);
1017 -               }
1018 -#endif
1019 -               // clear enabled status bits
1020 -       }
1021 -       // Interrupt Status 4
1022 -#ifndef        INTERRUPT_SELECT
1023 -       if (status4 & tp->intr4_enabled)
1024 -       {
1025 -               #define G1_INTR4_BITS           (0xff000000)
1026 -               #define G0_INTR4_BITS           (0x00ff0000)
1027 -
1028 -               if (tp->port_id == 0)
1029 -               {
1030 -                       if ((status4 & G0_INTR4_BITS) && (tp->intr4_enabled & G0_INTR4_BITS))
1031 -                       {
1032 -                               if (status4 & GMAC0_RESERVED_INT_BIT)
1033 -                                       printk("GMAC0_RESERVED_INT_BIT is ON\n");
1034 -                               if (status4 & GMAC0_MIB_INT_BIT)
1035 -                                       tp->mib_full_cnt++;
1036 -                               if (status4 & GMAC0_RX_PAUSE_ON_INT_BIT)
1037 -                                       tp->rx_pause_on_cnt++;
1038 -                               if (status4 & GMAC0_TX_PAUSE_ON_INT_BIT)
1039 -                                       tp->tx_pause_on_cnt++;
1040 -                               if (status4 & GMAC0_RX_PAUSE_OFF_INT_BIT)
1041 -                                       tp->rx_pause_off_cnt++;
1042 -                               if (status4 & GMAC0_TX_PAUSE_OFF_INT_BIT)
1043 -                                       tp->rx_pause_off_cnt++;
1044 -                               if (status4 & GMAC0_RX_OVERRUN_INT_BIT)
1045 -                                       tp->rx_overrun_cnt++;
1046 -                               if (status4 & GMAC0_STATUS_CHANGE_INT_BIT)
1047 -                                       tp->status_changed_cnt++;
1048 -                       }
1049 -               }
1050 -               else if (tp->port_id == 1)
1051 -               {
1052 -                       if ((status4 & G1_INTR4_BITS) && (tp->intr4_enabled & G1_INTR4_BITS))
1053 -                       {
1054 -                               if (status4 & GMAC1_RESERVED_INT_BIT)
1055 -                                       printk("GMAC1_RESERVED_INT_BIT is ON\n");
1056 -                               if (status4 & GMAC1_MIB_INT_BIT)
1057 -                                       tp->mib_full_cnt++;
1058 -                               if (status4 & GMAC1_RX_PAUSE_ON_INT_BIT)
1059 -                               {
1060 -                                       //printk("Gmac pause on\n");
1061 -                                       tp->rx_pause_on_cnt++;
1062 -                               }
1063 -                               if (status4 & GMAC1_TX_PAUSE_ON_INT_BIT)
1064 -                               {
1065 -                                       //printk("Gmac pause on\n");
1066 -                                       tp->tx_pause_on_cnt++;
1067 -                               }
1068 -                               if (status4 & GMAC1_RX_PAUSE_OFF_INT_BIT)
1069 -                               {
1070 -                                       //printk("Gmac pause off\n");
1071 -                                       tp->rx_pause_off_cnt++;
1072 -                               }
1073 -                               if (status4 & GMAC1_TX_PAUSE_OFF_INT_BIT)
1074 -                               {
1075 -                                       //printk("Gmac pause off\n");
1076 -                                       tp->rx_pause_off_cnt++;
1077 -                               }
1078 -                               if (status4 & GMAC1_RX_OVERRUN_INT_BIT)
1079 -                               {
1080 -                                       //printk("Gmac Rx Overrun \n");
1081 -                                       tp->rx_overrun_cnt++;
1082 -                               }
1083 -                               if (status4 & GMAC1_STATUS_CHANGE_INT_BIT)
1084 -                                       tp->status_changed_cnt++;
1085 -                       }
1086 -               }
1087 -#if 0
1088 -               if ((status4 & SWFQ_EMPTY_INT_BIT) && (tp->intr4_enabled & SWFQ_EMPTY_INT_BIT))
1089 -               {
1090 -                       // unsigned long data = REG32(TOE_GLOBAL_BASE + GLOBAL_SWFQ_RWPTR_REG);
1091 -//                     mac_stop_rxdma(tp->sc);
1092 -                       gmac_write_reg(TOE_GLOBAL_BASE, GLOBAL_INTERRUPT_ENABLE_4_REG,
1093 -                               tp->intr4_enabled & ~SWFQ_EMPTY_INT_BIT, SWFQ_EMPTY_INT_BIT);
1094 -
1095 -                       gmac_write_reg(TOE_GLOBAL_BASE, GLOBAL_INTERRUPT_STATUS_4_REG,
1096 -                               SWFQ_EMPTY_INT_BIT, SWFQ_EMPTY_INT_BIT);
1097 -                       toe_gmac_fill_free_q();
1098 -                       tp->sw_fq_empty_cnt++;
1099 -
1100 -                       gmac_write_reg(TOE_GLOBAL_BASE, GLOBAL_INTERRUPT_STATUS_4_REG, status4,
1101 -                               SWFQ_EMPTY_INT_BIT);
1102 -//#if 0
1103 -/*                     if (netif_running(dev))
1104 -                               toe_gmac_handle_default_rxq(dev, tp);
1105 -                       printk("SWFQ_EMPTY_INT_BIT is ON!\n");  // should not be happened */
1106 -//#endif
1107 -               }
1108 -#endif
1109 -       }
1110 -#endif //INTERRUPT_SELECT
1111 -       toe_gmac_enable_interrupt(tp->irq);
1112 -//enable gmac rx function when do RFC 2544
1113 -#ifdef IxscriptMate_1518
1114 -       if (storlink_ctl.pauseoff == 1)
1115 -       {
1116 -               GMAC_CONFIG0_T config0;
1117 -               config0.bits32 = readl(TOE_GMAC0_BASE+GMAC_CONFIG0);
1118 -               config0.bits.dis_rx = 0;
1119 -               writel(config0.bits32, TOE_GMAC0_BASE+GMAC_CONFIG0);
1120 -               config0.bits32 = readl(TOE_GMAC1_BASE+GMAC_CONFIG0);
1121 -               config0.bits.dis_rx = 0;
1122 -               writel(config0.bits32, TOE_GMAC1_BASE+GMAC_CONFIG0);
1123 -       }
1124 -#endif
1125 -       //printk("gmac_interrupt complete!\n\n");
1126 -//     return IRQ_RETVAL(handled);
1127 -       return  IRQ_RETVAL(1);
1128 -#ifdef CONFIG_SL_NAPI
1129 -}
1130 -#endif
1131 -}
1132 -
1133 -/*----------------------------------------------------------------------
1134 -*      toe_gmac_handle_default_rxq
1135 -*      (1) Get rx Buffer for default Rx queue
1136 -*      (2) notify or call upper-routine to handle it
1137 -*      (3) get a new buffer and insert it into SW free queue
1138 -*      (4) Note: The SW free queue Read-Write Pointer should be locked when accessing
1139 -*----------------------------------------------------------------------*/
1140 -//static inline void toe_gmac_handle_default_rxq(struct net_device *dev, GMAC_INFO_T *tp)
1141 -static void toe_gmac_handle_default_rxq(struct net_device *dev, GMAC_INFO_T *tp)
1142 -{
1143 -       TOE_INFO_T                      *toe;
1144 -    GMAC_RXDESC_T      *curr_desc;
1145 -       struct sk_buff          *skb;
1146 -    DMA_RWPTR_T                        rwptr;
1147 -       unsigned int            pkt_size;
1148 -       int                                     max_cnt;
1149 -       unsigned int        desc_count;
1150 -       unsigned int        good_frame, chksum_status, rx_status;
1151 -       struct net_device_stats *isPtr = (struct net_device_stats *)&tp->ifStatics;
1152 -
1153 -//when do ixia RFC 2544 test and packet size is select 1518 bytes,disable gmace rx function immediately after one interrupt come in.
1154 -#ifdef IxscriptMate_1518
1155 -       if (storlink_ctl.pauseoff == 1)
1156 -       {
1157 -               GMAC_CONFIG0_T config0;
1158 -               config0.bits32 = readl(TOE_GMAC0_BASE+GMAC_CONFIG0);
1159 -               config0.bits.dis_rx = 1;
1160 -               writel(config0.bits32, TOE_GMAC0_BASE+GMAC_CONFIG0);
1161 -               config0.bits32 = readl(TOE_GMAC1_BASE+GMAC_CONFIG0);
1162 -               config0.bits.dis_rx = 1;
1163 -               writel(config0.bits32, TOE_GMAC1_BASE+GMAC_CONFIG0);
1164 -       }
1165 -#endif
1166 -       rwptr.bits32 = readl(&tp->default_qhdr->word1);
1167 -#if 0
1168 -       if (rwptr.bits.rptr != tp->rx_rwptr.bits.rptr)
1169 -       {
1170 -               mac_stop_txdma((struct net_device *)tp->dev);
1171 -               printk("Default Queue HW RD ptr (0x%x) != SW RD Ptr (0x%x)\n",
1172 -                               rwptr.bits32, tp->rx_rwptr.bits.rptr);
1173 -               while(1);
1174 -       }
1175 -#endif
1176 -       toe = (TOE_INFO_T *)&toe_private_data;
1177 -       max_cnt = DEFAULT_RXQ_MAX_CNT;
1178 -       while ((--max_cnt) && rwptr.bits.rptr != rwptr.bits.wptr)
1179 -//     while (rwptr.bits.rptr != rwptr.bits.wptr)
1180 -       {
1181 -//if packet size is not 1518 for RFC 2544,enable gmac rx function.The other packet size have RX workaround.
1182 -#ifdef IxscriptMate_1518
1183 -       if (storlink_ctl.pauseoff == 1)
1184 -               {
1185 -                       if (pkt_size != 1514)
1186 -                       {
1187 -                                               GMAC_CONFIG0_T config0;
1188 -                                               config0.bits32 = readl(TOE_GMAC0_BASE+GMAC_CONFIG0);
1189 -                                               config0.bits.dis_rx = 0;
1190 -                                               writel(config0.bits32, TOE_GMAC0_BASE+GMAC_CONFIG0);
1191 -                                               config0.bits32 = readl(TOE_GMAC1_BASE+GMAC_CONFIG0);
1192 -                                               config0.bits.dis_rx = 0;
1193 -                                               writel(config0.bits32, TOE_GMAC1_BASE+GMAC_CONFIG0);
1194 -                       }
1195 -               }
1196 -#endif
1197 -       curr_desc = (GMAC_RXDESC_T *)tp->default_desc_base + rwptr.bits.rptr;
1198 -//             consistent_sync(curr_desc, sizeof(GMAC_RXDESC_T), PCI_DMA_FROMDEVICE);
1199 -               tp->default_q_cnt++;
1200 -       tp->rx_curr_desc = (unsigned int)curr_desc;
1201 -       rx_status = curr_desc->word0.bits.status;
1202 -       chksum_status = curr_desc->word0.bits.chksum_status;
1203 -       tp->rx_status_cnt[rx_status]++;
1204 -       tp->rx_chksum_cnt[chksum_status]++;
1205 -        pkt_size = curr_desc->word1.bits.byte_count;  /*total byte count in a frame*/
1206 -               desc_count = curr_desc->word0.bits.desc_count; /* get descriptor count per frame */
1207 -               good_frame=1;
1208 -               if ((curr_desc->word0.bits32 & (GMAC_RXDESC_0_T_derr | GMAC_RXDESC_0_T_perr))
1209 -                       || (pkt_size < 60)
1210 -                   || (chksum_status & 0x4)
1211 -                       || rx_status)
1212 -               {
1213 -                       good_frame = 0;
1214 -                       if (curr_desc->word0.bits32 & GMAC_RXDESC_0_T_derr)
1215 -                               printk("%s::derr (GMAC-%d)!!!\n", __func__, tp->port_id);
1216 -                       if (curr_desc->word0.bits32 & GMAC_RXDESC_0_T_perr)
1217 -                               printk("%s::perr (GMAC-%d)!!!\n", __func__, tp->port_id);
1218 -                       if (rx_status)
1219 -                       {
1220 -                               if (rx_status == 4 || rx_status == 7)
1221 -                                       isPtr->rx_crc_errors++;
1222 -//                             printk("%s::Status=%d (GMAC-%d)!!!\n", __func__, rx_status, tp->port_id);
1223 -                       }
1224 -#ifdef SL351x_GMAC_WORKAROUND
1225 -                       else if (pkt_size < 60)
1226 -                       {
1227 -                               if (tp->short_frames_cnt < GMAC_SHORT_FRAME_THRESHOLD)
1228 -                                       tp->short_frames_cnt++;
1229 -                               if (tp->short_frames_cnt >= GMAC_SHORT_FRAME_THRESHOLD)
1230 -                               {
1231 -                                       GMAC_CONFIG0_T config0;
1232 -                                       config0.bits32 = readl(TOE_GMAC0_BASE+GMAC_CONFIG0);
1233 -                                       config0.bits.dis_rx = 1;
1234 -                                       writel(config0.bits32, TOE_GMAC0_BASE+GMAC_CONFIG0);
1235 -                                       config0.bits32 = readl(TOE_GMAC1_BASE+GMAC_CONFIG0);
1236 -                                       config0.bits.dis_rx = 1;
1237 -                                       writel(config0.bits32, TOE_GMAC1_BASE+GMAC_CONFIG0);
1238 -                               }
1239 -                       }
1240 -#endif
1241 -//                     if (chksum_status)
1242 -//                             printk("%s::Checksum Status=%d (GMAC-%d)!!!\n", __func__, chksum_status, tp->port_id);
1243 -                       skb = (struct sk_buff *)(REG32(__va(curr_desc->word2.buf_adr) - SKB_RESERVE_BYTES));
1244 -                       dev_kfree_skb_irq(skb);
1245 -               }
1246 -               if (good_frame)
1247 -               {
1248 -                       if (curr_desc->word0.bits.drop)
1249 -                               printk("%s::Drop (GMAC-%d)!!!\n", __func__, tp->port_id);
1250 -//                     if (chksum_status)
1251 -//                             printk("%s::Checksum Status=%d (GMAC-%d)!!!\n", __func__, chksum_status, tp->port_id);
1252 -
1253 -               /* get frame information from the first descriptor of the frame */
1254 -#ifdef SL351x_GMAC_WORKAROUND
1255 -                       if (tp->short_frames_cnt >= GMAC_SHORT_FRAME_THRESHOLD)
1256 -                       {
1257 -                               GMAC_CONFIG0_T config0;
1258 -                               config0.bits32 = readl(TOE_GMAC0_BASE+GMAC_CONFIG0);
1259 -                               config0.bits.dis_rx = 0;
1260 -                               writel(config0.bits32, TOE_GMAC0_BASE+GMAC_CONFIG0);
1261 -                               config0.bits32 = readl(TOE_GMAC1_BASE+GMAC_CONFIG0);
1262 -                               config0.bits.dis_rx = 0;
1263 -                               writel(config0.bits32, TOE_GMAC1_BASE+GMAC_CONFIG0);
1264 -                       }
1265 -                       tp->short_frames_cnt = 0;
1266 -#endif
1267 -                       isPtr->rx_packets++;
1268 -                       skb = (struct sk_buff *)(REG32(__va(curr_desc->word2.buf_adr - SKB_RESERVE_BYTES)));
1269 -                       if (!skb)
1270 -                       {
1271 -                               printk("Fatal Error!!skb==NULL\n");
1272 -                               goto next_rx;
1273 -                       }
1274 -                       tp->curr_rx_skb = skb;
1275 -                       // consistent_sync((void *)__va(curr_desc->word2.buf_adr), pkt_size, PCI_DMA_FROMDEVICE);
1276 -
1277 -       //              curr_desc->word2.buf_adr = 0;
1278 -
1279 -                       skb_reserve (skb, RX_INSERT_BYTES);     /* 16 byte align the IP fields. */
1280 -                       skb_put(skb, pkt_size);
1281 -                       skb->dev = dev;
1282 -                       if (chksum_status == RX_CHKSUM_IP_UDP_TCP_OK)
1283 -                       {
1284 -                               skb->ip_summed = CHECKSUM_UNNECESSARY;
1285 -#ifdef CONFIG_SL351x_NAT
1286 -                               if (nat_cfg.enabled && curr_desc->word3.bits.l3_offset && curr_desc->word3.bits.l4_offset)
1287 -                               {
1288 -                                       struct iphdr    *ip_hdr;
1289 -                                       ip_hdr = (struct iphdr *)&(skb->data[curr_desc->word3.bits.l3_offset]);
1290 -                                       sl351x_nat_input(skb,
1291 -                                                                       tp->port_id,
1292 -                                                                       (void *)curr_desc->word3.bits.l3_offset,
1293 -                                                                       (void *)curr_desc->word3.bits.l4_offset);
1294 -                               }
1295 -#endif
1296 -                               skb->protocol = eth_type_trans(skb,dev); /* set skb protocol */
1297 -#if 0
1298 -#ifdef CONFIG_SL351x_RXTOE
1299 -                               if (storlink_ctl.rx_max_pktsize) {
1300 -                                       struct iphdr    *ip_hdr;
1301 -                                       struct tcphdr   *tcp_hdr;
1302 -                                       int ip_hdrlen;
1303 -
1304 -                                       ip_hdr = (struct iphdr*)&(skb->data[0]);
1305 -                                       if ((skb->protocol == __constant_htons(ETH_P_IP)) &&
1306 -                                          ((ip_hdr->protocol & 0x00ff) == IPPROTO_TCP)) {
1307 -                                               ip_hdrlen = ip_hdr->ihl << 2;
1308 -                                               tcp_hdr = (struct tcphdr*)&(skb->data[ip_hdrlen]);
1309 -                                               if (tcp_hdr->syn) {
1310 -                                                       struct toe_conn* connection = init_toeq(ip_hdr->version,
1311 -                                                                       ip_hdr, tcp_hdr, toe, &(skb->data[0]) - 14);
1312 -                                                       TCP_SKB_CB(skb)->connection = connection;
1313 -                                                       //      hash_dump_entry(TCP_SKB_CB(skb)->connection->hash_entry_index);
1314 -                                                       //              printk("%s::skb data %x, conn %x, mode %x\n",
1315 -                                                       //                      __func__, skb->data, connection, connection->mode);
1316 -                                               }
1317 -                                       }
1318 -                               }
1319 -#endif
1320 -#endif
1321 -                       }
1322 -                       else if (chksum_status == RX_CHKSUM_IP_OK_ONLY)
1323 -                       {
1324 -                               skb->ip_summed = CHECKSUM_UNNECESSARY;
1325 -#ifdef CONFIG_SL351x_NAT
1326 -                               if (nat_cfg.enabled && curr_desc->word3.bits.l3_offset && curr_desc->word3.bits.l4_offset)
1327 -                               {
1328 -                                       struct iphdr            *ip_hdr;
1329 -                                       //struct tcphdr         *tcp_hdr;
1330 -                                       ip_hdr = (struct iphdr *)&(skb->data[curr_desc->word3.bits.l3_offset]);
1331 -                                       //tcp_hdr = (struct tcphdr *)&(skb->data[curr_desc->word3.bits.l4_offset]);
1332 -                                       if (ip_hdr->protocol == IPPROTO_UDP)
1333 -                                       {
1334 -                                               sl351x_nat_input(skb,
1335 -                                                                               tp->port_id,
1336 -                                                                               (void *)curr_desc->word3.bits.l3_offset,
1337 -                                                                               (void *)curr_desc->word3.bits.l4_offset);
1338 -                                       }
1339 -                                       else if (ip_hdr->protocol == IPPROTO_GRE)
1340 -                                       {
1341 -                                               sl351x_nat_input(skb,
1342 -                                                                       tp->port_id,
1343 -                                                                       (void *)curr_desc->word3.bits.l3_offset,
1344 -                                                                       (void *)curr_desc->word3.bits.l4_offset);
1345 -                                       }
1346 -                               }
1347 -#endif
1348 -                               skb->protocol = eth_type_trans(skb,dev); /* set skb protocol */
1349 -                       }
1350 -                       else
1351 -                       {
1352 -                               skb->protocol = eth_type_trans(skb,dev); /* set skb protocol */
1353 -                       }
1354 -
1355 -                       netif_rx(skb);  /* socket rx */
1356 -                       dev->last_rx = jiffies;
1357 -
1358 -                       isPtr->rx_bytes += pkt_size;
1359 -
1360 -        }
1361 -
1362 -next_rx:
1363 -               // advance one for Rx default Q 0/1
1364 -               rwptr.bits.rptr = RWPTR_ADVANCE_ONE(rwptr.bits.rptr, tp->default_desc_num);
1365 -               SET_RPTR(&tp->default_qhdr->word1, rwptr.bits.rptr);
1366 -       tp->rx_rwptr.bits32 = rwptr.bits32;
1367 -
1368 -       }
1369 -
1370 -       /* Handles first available packets only then refill the queue. */
1371 -       toe_gmac_fill_free_q();
1372 -}
1373 -
1374 -/*----------------------------------------------------------------------
1375 -* gmac_get_phy_vendor
1376 -*----------------------------------------------------------------------*/
1377 -static unsigned int gmac_get_phy_vendor(int phy_addr)
1378 -{
1379 -    unsigned int       reg_val;
1380 -    reg_val=(mii_read(phy_addr,0x02) << 16) + mii_read(phy_addr,0x03);
1381 -    return reg_val;
1382 -}
1383 -
1384 -/*----------------------------------------------------------------------
1385 -* gmac_set_phy_status
1386 -*----------------------------------------------------------------------*/
1387 -void gmac_set_phy_status(struct net_device *dev)
1388 -{
1389 -       GMAC_INFO_T *tp = dev->priv;
1390 -       GMAC_STATUS_T   status;
1391 -       unsigned int    reg_val, ability,wan_port_id;
1392 -       unsigned int    i = 0;
1393 -
1394 -#ifdef VITESSE_G5SWITCH
1395 -       if((tp->port_id == GMAC_PORT1)&&(Giga_switch==1)){
1396 -#if 0
1397 -               rcv_mask = SPI_read(2,0,0x10);                  // Receive mask
1398 -               rcv_mask |= 0x4F;
1399 -               for(i=0;i<4;i++){
1400 -                       reg_val = BIT(26)|(i<<21)|(10<<16);
1401 -                       SPI_write(3,0,1,reg_val);
1402 -                       msleep(10);
1403 -                       reg_val = SPI_read(3,0,2);
1404 -                       if(reg_val & 0x0c00){
1405 -                               printk("Port%d:Giga mode\n",i);
1406 -                               SPI_write(1,i,0x00,0x300701B1);
1407 -                               SPI_write(1,i,0x00,0x10070181);
1408 -                               switch_pre_link[i]=LINK_UP;
1409 -                               switch_pre_speed[i]=GMAC_SPEED_1000;
1410 -                       }
1411 -                       else{
1412 -                               reg_val = BIT(26)|(i<<21)|(5<<16);
1413 -                               SPI_write(3,0,1,reg_val);
1414 -                               msleep(10);
1415 -                               ability = (reg_val = SPI_read(3,0,2)&0x5e0) >>5;
1416 -                               if ((ability & 0x0C)) /* 100M full duplex */
1417 -                               {
1418 -                                       SPI_write(1,i,0x00,0x30050472);
1419 -                                       SPI_write(1,i,0x00,0x10050442);
1420 -                                       printk("Port%d:100M\n",i);
1421 -                                       switch_pre_link[i]=LINK_UP;
1422 -                               switch_pre_speed[i]=GMAC_SPEED_100;
1423 -                               }
1424 -                               else if((ability & 0x03)) /* 10M full duplex */
1425 -                               {
1426 -                                       SPI_write(1,i,0x00,0x30050473);
1427 -                                       SPI_write(1,i,0x00,0x10050443);
1428 -                                       printk("Port%d:10M\n",i);
1429 -                                       switch_pre_link[i]=LINK_UP;
1430 -                                       switch_pre_speed[i]=GMAC_SPEED_10;
1431 -                               }
1432 -                               else{
1433 -                                       SPI_write(1,i,0x00,BIT(16));                    // disable RX
1434 -                                       SPI_write(5,0,0x0E,BIT(i));                     // dicard packet
1435 -                                       while((SPI_read(5,0,0x0C)&BIT(i))==0)           // wait to be empty
1436 -                                               msleep(1);
1437 -
1438 -                                       SPI_write(1,i,0x00,0x20000030);                 // PORT_RST
1439 -                                       switch_pre_link[i]=LINK_DOWN;
1440 -                                       switch_pre_speed[i]=GMAC_SPEED_10;
1441 -                                       rcv_mask &= ~BIT(i);
1442 -                                       SPI_write(2,0,0x10,rcv_mask);                   // Disable Receive
1443 -                               }
1444 -                       }
1445 -               }
1446 -#endif
1447 -               gmac_get_switch_status(dev);
1448 -               gmac_write_reg(tp->base_addr, GMAC_STATUS, 0x7d, 0x0000007f);
1449 -//             SPI_write(2,0,0x10,rcv_mask);                   // Enable Receive
1450 -               return ;
1451 -       }
1452 -#endif
1453 -
1454 -       reg_val = gmac_get_phy_vendor(tp->phy_addr);
1455 -       printk("GMAC-%d Addr %d Vendor ID: 0x%08x\n", tp->port_id, tp->phy_addr, reg_val);
1456 -
1457 -       switch (tp->phy_mode)
1458 +       switch (tp->phy_mode)
1459         {
1460                 case GMAC_PHY_GMII:
1461                 mii_write(tp->phy_addr,0x04,0x05e1); /* advertisement 100M full duplex, pause capable on */
1462 @@ -3552,6 +2982,7 @@ void gmac_set_phy_status(struct net_devi
1463                 status.bits.link = LINK_DOWN;
1464                 //              clear_bit(__LINK_STATE_START, &dev->state);
1465                 printk("Link Down (0x%04x) ", reg_val);
1466 +#ifdef VITESSE_G5SWITCH
1467                 if(Giga_switch == 1)
1468                 {
1469                                 wan_port_id = 1;
1470 @@ -3565,6 +2996,7 @@ void gmac_set_phy_status(struct net_devi
1471                                 storlink_ctl.link[ tp->port_id] = 0;
1472  #endif
1473                 }
1474 +#endif
1475         }
1476         else
1477         {
1478 @@ -3572,6 +3004,7 @@ void gmac_set_phy_status(struct net_devi
1479                 status.bits.link = LINK_UP;
1480                 //              set_bit(__LINK_STATE_START, &dev->state);
1481                 printk("Link Up (0x%04x) ",reg_val);
1482 +#ifdef VITESSE_G5SWITCH
1483                 if(Giga_switch == 1)
1484                 {
1485                                 wan_port_id = 1;
1486 @@ -3585,6 +3018,7 @@ void gmac_set_phy_status(struct net_devi
1487                                 storlink_ctl.link[ tp->port_id] = 1;
1488  #endif
1489                 }
1490 +#endif
1491         }
1492         //    value = mii_read(PHY_ADDR,0x05);
1493  
1494 @@ -3863,6 +3297,7 @@ void gmac_get_phy_status(struct net_devi
1495                         }
1496                 }
1497                 status.bits.link = LINK_UP; /* link up */
1498 +#ifdef VITESSE_G5SWITCH
1499                 if(Giga_switch==1)
1500                 {
1501                                 wan_port_id = 1;
1502 @@ -3874,6 +3309,7 @@ void gmac_get_phy_status(struct net_devi
1503                                 storlink_ctl.link[ tp->port_id] = 1;
1504  #endif
1505                 }
1506 +#endif
1507                 if ((ability & 0x20)==0x20)
1508                 {
1509                         if (tp->flow_control_enable == 0)
1510 @@ -3914,6 +3350,7 @@ void gmac_get_phy_status(struct net_devi
1511         else
1512         {
1513                 status.bits.link = LINK_DOWN; /* link down */
1514 +#ifdef VITESSE_G5SWITCH
1515                 if(Giga_switch == 1)
1516                 {
1517                                 wan_port_id = 1;
1518 @@ -3925,6 +3362,7 @@ void gmac_get_phy_status(struct net_devi
1519                                 storlink_ctl.link[ tp->port_id] = 0;
1520  #endif
1521                 }
1522 +#endif
1523                 if (tp->pre_phy_status == LINK_UP)
1524                 {
1525                         printk("GMAC-%d LINK_Down......\n",tp->port_id);
1526 @@ -4298,86 +3736,102 @@ static void gmac_set_rx_mode(struct net_
1527  }
1528  
1529  #ifdef CONFIG_SL_NAPI
1530 +
1531 +static int gmax_rx(struct net_device *dev, int *budget)
1532 +{
1533 +       return 0;
1534 +}
1535 +
1536 +static int gmac_tx(struct net_device *dev, int *budget)
1537 +{
1538 +       return 0;
1539 +}
1540 +
1541  /*----------------------------------------------------------------------
1542  * gmac_rx_poll
1543  *----------------------------------------------------------------------*/
1544  static int gmac_rx_poll(struct net_device *dev, int *budget)
1545  {
1546 -       TOE_INFO_T                      *toe;
1547 -    GMAC_RXDESC_T      *curr_desc;
1548 -       struct sk_buff          *skb;
1549 -    DMA_RWPTR_T                        rwptr;
1550 -    unsigned int data32;
1551 -       unsigned int            pkt_size;
1552 -       unsigned int        desc_count;
1553 -       unsigned int        good_frame, chksum_status, rx_status;
1554 -       int                 rx_pkts_num = 0;
1555 -       int                 quota = min(dev->quota, *budget);
1556 -       GMAC_INFO_T                     *tp = (GMAC_INFO_T *)dev->priv;
1557 -       unsigned int            status4;
1558 -       volatile DMA_RWPTR_T    fq_rwptr;
1559 -       // int                                  max_cnt = TOE_SW_FREEQ_DESC_NUM;//TOE_SW_FREEQ_DESC_NUM = 64
1560 -       //unsigned long         rx_old_bytes;
1561 +       TOE_INFO_T      *toe;
1562 +       GMAC_RXDESC_T   *curr_desc;
1563 +       struct sk_buff  *skb;
1564 +       DMA_RWPTR_T     rwptr;
1565 +       unsigned int    data32;
1566 +       unsigned int    pkt_size;
1567 +       unsigned int    desc_count;
1568 +       unsigned int    good_frame, chksum_status, rx_status;
1569 +       int             rx_pkts_num = 0;
1570 +       int             quota = min(dev->quota, *budget);
1571 +       GMAC_INFO_T     *tp = (GMAC_INFO_T *)dev->priv;
1572 +       unsigned int    status1;
1573 +       unsigned int    status4;
1574         struct net_device_stats *isPtr = (struct net_device_stats *)&tp->ifStatics;
1575 -       //unsigned long long    rx_time;
1576 -
1577  
1578         BUG_ON(rx_poll_enabled == 0);
1579 -#if 1
1580 -       if (do_again)
1581 -       {
1582 -                       toe_gmac_fill_free_q();
1583 -                       status4 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_STATUS_4_REG);
1584 -                       fq_rwptr.bits32 = readl(TOE_GLOBAL_BASE + GLOBAL_SWFQ_RWPTR_REG);
1585 -                       //printk("\n%s:: do_again toe_gmac_fill_free_q =======>status4=0x%x =====fq_rwptr =0x%8x======>JKJKJKJKJKJKJKJKJ \n", __func__,status4,fq_rwptr.bits32);
1586 -                       if (fq_rwptr.bits.wptr != fq_rwptr.bits.rptr)
1587 -                       {
1588 -                                               //status4 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_STATUS_4_REG);
1589 -                                               do_again =0;
1590 -                                               //netif_rx_complete(dev);
1591 -                                               gmac_write_reg(TOE_GLOBAL_BASE, GLOBAL_INTERRUPT_STATUS_4_REG, status4, 0x1);
1592 -                                               fq_rwptr.bits32 = readl(TOE_GLOBAL_BASE + GLOBAL_SWFQ_RWPTR_REG);
1593 -                                               rwptr.bits32 = readl(&tp->default_qhdr->word1);
1594 -                       }
1595 -                       else
1596 -                               return 1;
1597 -       }
1598 -#endif
1599 -       rwptr.bits32 = readl(&tp->default_qhdr->word1);
1600 -#if 0
1601 -       if (rwptr.bits.rptr != tp->rx_rwptr.bits.rptr)
1602 -       {
1603 -               mac_stop_txdma((struct net_device *)tp->dev);
1604 -               printk("Default Queue HW RD ptr (0x%x) != SW RD Ptr (0x%x)\n",
1605 -                               rwptr.bits32, tp->rx_rwptr.bits.rptr);
1606 -               while(1);
1607 -       }
1608 -#endif
1609 +
1610         toe = (TOE_INFO_T *)&toe_private_data;
1611  
1612 -       fq_rwptr.bits32 = readl(TOE_GLOBAL_BASE + GLOBAL_SWFQ_RWPTR_REG);
1613 -       //printk("%s:---Before-------------->Default Queue HW RW ptr (0x%8x),   fq_rwptr =0x%8x \n",__func__,rwptr.bits32,fq_rwptr.bits32 );
1614 -       //printk("%s:---Before while   rx_pkts_num=%d------rx_finished_idx=0x%x------->Default_Q [rwptr.bits.rptr(SW)=0x%x,   rwptr.bits.wptr(HW) = 0x%x ]---->Free_Q(SW_HW) = 0x%8x \n",__func__,rx_pkts_num,rx_finished_idx,rwptr.bits.rptr,rwptr.bits.wptr,fq_rwptr.bits32 );
1615 -//     while ((--max_cnt) && (rwptr.bits.rptr != rwptr.bits.wptr) && (rx_pkts_num < quota))
1616 +rx_poll_retry:
1617 +       status1 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_STATUS_1_REG);
1618 +       if (status1 & 1) {
1619 +               writel(1, TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_STATUS_1_REG);
1620 +       }
1621  
1622 +       rwptr.bits32 = readl(&tp->default_qhdr->word1);
1623         while ((rwptr.bits.rptr != rwptr.bits.wptr) && (rx_pkts_num < quota))
1624         {
1625 -
1626 -       curr_desc = (GMAC_RXDESC_T *)tp->default_desc_base + rwptr.bits.rptr;
1627 +               curr_desc = (GMAC_RXDESC_T *)tp->default_desc_base + rwptr.bits.rptr;
1628                 tp->default_q_cnt++;
1629 -       tp->rx_curr_desc = (unsigned int)curr_desc;
1630 -       rx_status = curr_desc->word0.bits.status;
1631 -       chksum_status = curr_desc->word0.bits.chksum_status;
1632 -       tp->rx_status_cnt[rx_status]++;
1633 -       tp->rx_chksum_cnt[chksum_status]++;
1634 -        pkt_size = curr_desc->word1.bits.byte_count;  /*total byte count in a frame*/
1635 +               tp->rx_curr_desc = (unsigned int)curr_desc;
1636 +               rx_status = curr_desc->word0.bits.status;
1637 +               chksum_status = curr_desc->word0.bits.chksum_status;
1638 +               tp->rx_status_cnt[rx_status]++;
1639 +               tp->rx_chksum_cnt[chksum_status]++;
1640 +               pkt_size = curr_desc->word1.bits.byte_count;  /*total byte count in a frame*/
1641                 desc_count = curr_desc->word0.bits.desc_count; /* get descriptor count per frame */
1642                 good_frame=1;
1643 +
1644 +               if (0) {
1645 +
1646 +                               int free, busy;
1647 +                               uint32_t rwptr1;
1648 +                               uint32_t rwptr2;
1649 +
1650 +                               rwptr1 = readl(TOE_GLOBAL_BASE + GLOBAL_SWFQ_RWPTR_REG);
1651 +                               free = (GET_WPTR(rwptr1) - GET_RPTR(rwptr1)) & 0xFF;
1652 +
1653 +                               rwptr2 = readl(&tp->default_qhdr->word1);
1654 +                               busy = (GET_RPTR(rwptr2) - GET_WPTR(rwptr2)) & 0xFF;
1655 +
1656 +                               if (GET_WPTR(rwptr1) == GET_RPTR(rwptr1)) {
1657 +                                       printk("frame  status: %d\n"
1658 +                                              "SWFQ: wptr: %hu, rptr: %hu, free: %d\n"
1659 +                                              "GMAC: wptr: %hu, rptr: %hu, free: %d\n",
1660 +                                              rx_status,
1661 +                                              GET_WPTR(rwptr1), GET_RPTR(rwptr1), free,
1662 +                                              GET_WPTR(rwptr2), GET_RPTR(rwptr2), busy);
1663 +                               }
1664 +               }
1665 +
1666 +               {
1667 +                       GMAC_RXDESC_T   *fq_desc;
1668 +                       void *data;
1669 +                       struct sk_buff *skb;
1670 +                       unsigned short idx;
1671 +
1672 +                       skb = (struct sk_buff *)(REG32(__va(curr_desc->word2.buf_adr) - SKB_RESERVE_BYTES));
1673 +                       idx = (unsigned short)(REG32(__va(curr_desc->word2.buf_adr) - SKB_RESERVE_BYTES + 4));
1674 +
1675 +                       BUG_ON(idx > TOE_SW_FREEQ_DESC_NUM);
1676 +                       BUG_ON(skb == NULL);
1677 +                       fq_desc = (GMAC_RXDESC_T*)toe->swfq_desc_base + idx;
1678 +                       fq_desc->word2.buf_adr = 0;
1679 +               }
1680 +
1681                 if ((curr_desc->word0.bits32 & (GMAC_RXDESC_0_T_derr | GMAC_RXDESC_0_T_perr))
1682 -                       || (pkt_size < 60)
1683 +                   || (pkt_size < 60)
1684                     || (chksum_status & 0x4)
1685                     || rx_status )
1686 -//                     || rx_status || (rwptr.bits.rptr > rwptr.bits.wptr ))
1687                 {
1688                         good_frame = 0;
1689                         if (curr_desc->word0.bits32 & GMAC_RXDESC_0_T_derr)
1690 @@ -4388,7 +3842,6 @@ static int gmac_rx_poll(struct net_devic
1691                         {
1692                                 if (rx_status == 4 || rx_status == 7)
1693                                         isPtr->rx_crc_errors++;
1694 -//                             printk("%s::Status=%d (GMAC-%d)!!!\n", __func__, rx_status, tp->port_id);
1695                         }
1696  #ifdef SL351x_GMAC_WORKAROUND
1697                         else if (pkt_size < 60)
1698 @@ -4407,17 +3860,32 @@ static int gmac_rx_poll(struct net_devic
1699                                 }
1700                         }
1701  #endif
1702 -//                     if (chksum_status)
1703 -//                             printk("%s::Checksum Status=%d (GMAC-%d)!!!\n", __func__, chksum_status, tp->port_id);
1704                         skb = (struct sk_buff *)(REG32(__va(curr_desc->word2.buf_adr) - SKB_RESERVE_BYTES));
1705 -                       dev_kfree_skb_irq(skb);
1706 +                       dev_kfree_skb(skb);
1707 +
1708 +                       if (0) {
1709 +                               int free, busy;
1710 +                               uint32_t rwptr1;
1711 +                               uint32_t rwptr2;
1712 +
1713 +                               rwptr1 = readl(TOE_GLOBAL_BASE + GLOBAL_SWFQ_RWPTR_REG);
1714 +                               free = (GET_WPTR(rwptr1) - GET_RPTR(rwptr1)) & 0xFF;
1715 +
1716 +                               rwptr2 = readl(&tp->default_qhdr->word1);
1717 +                               busy = (GET_RPTR(rwptr2) - GET_WPTR(rwptr2)) & 0xFF;
1718 +
1719 +                               printk("frame  status: %d\n"
1720 +                                      "SWFQ: wptr: %hu, rptr: %hu, free: %d\n"
1721 +                                      "GMAC: wptr: %hu, rptr: %hu, free: %d\n",
1722 +                                      rx_status,
1723 +                                      GET_WPTR(rwptr1), GET_RPTR(rwptr1), free,
1724 +                                      GET_WPTR(rwptr2), GET_RPTR(rwptr2), busy);
1725 +                       }
1726                 }
1727                 if (good_frame)
1728                 {
1729                         if (curr_desc->word0.bits.drop)
1730                                 printk("%s::Drop (GMAC-%d)!!!\n", __func__, tp->port_id);
1731 -//                     if (chksum_status)
1732 -//                             printk("%s::Checksum Status=%d (GMAC-%d)!!!\n", __func__, chksum_status, tp->port_id);
1733  
1734  #ifdef SL351x_GMAC_WORKAROUND
1735                         if (tp->short_frames_cnt >= GMAC_SHORT_FRAME_THRESHOLD)
1736 @@ -4432,225 +3900,118 @@ static int gmac_rx_poll(struct net_devic
1737                         }
1738                         tp->short_frames_cnt = 0;
1739  #endif
1740 -               /* get frame information from the first descriptor of the frame */
1741 +                       /* get frame information from the first descriptor of the frame */
1742                         isPtr->rx_packets++;
1743 -                       //consistent_sync((void *)__va(curr_desc->word2.buf_adr), pkt_size, PCI_DMA_FROMDEVICE);
1744 +                       consistent_sync((void *)__va(curr_desc->word2.buf_adr), pkt_size, PCI_DMA_FROMDEVICE);
1745                         skb = (struct sk_buff *)(REG32(__va(curr_desc->word2.buf_adr) - SKB_RESERVE_BYTES));
1746                         tp->curr_rx_skb = skb;
1747 -       //              curr_desc->word2.buf_adr = 0;
1748  
1749 -                   //skb_reserve (skb, SKB_RESERVE_BYTES);
1750                         skb_reserve (skb, RX_INSERT_BYTES);     /* 2 byte align the IP fields. */
1751 -                       //if ((skb->tail+pkt_size) > skb->end )
1752 -                       //printk("%s::------------->Here skb->len=%d,pkt_size= %d,skb->head=0x%x,skb->tail= 0x%x, skb->end= 0x%x\n", __func__, skb->len, pkt_size,skb->head,skb->tail,skb->end);
1753                         skb_put(skb, pkt_size);
1754  
1755 -
1756                         skb->dev = dev;
1757                         if (chksum_status == RX_CHKSUM_IP_UDP_TCP_OK)
1758                         {
1759                                 skb->ip_summed = CHECKSUM_UNNECESSARY;
1760 -#ifdef CONFIG_SL351x_NAT
1761 -                               if (nat_cfg.enabled && curr_desc->word3.bits.l3_offset && curr_desc->word3.bits.l4_offset)
1762 -                               {
1763 -                                       struct iphdr    *ip_hdr;
1764 -                                       ip_hdr = (struct iphdr *)&(skb->data[curr_desc->word3.bits.l3_offset]);
1765 -                                       sl351x_nat_input(skb,
1766 -                                                                       tp->port_id,
1767 -                                                                       (void *)curr_desc->word3.bits.l3_offset,
1768 -                                                                       (void *)curr_desc->word3.bits.l4_offset);
1769 -                               }
1770 -#endif
1771                                 skb->protocol = eth_type_trans(skb,dev); /* set skb protocol */
1772 -#if 0
1773 -#ifdef CONFIG_SL351x_RXTOE
1774 -                               if (storlink_ctl.rx_max_pktsize) {
1775 -                                       struct iphdr    *ip_hdr;
1776 -                                       struct tcphdr   *tcp_hdr;
1777 -                                       int ip_hdrlen;
1778 -
1779 -                                       ip_hdr = (struct iphdr*)&(skb->data[0]);
1780 -                                       if ((skb->protocol == __constant_htons(ETH_P_IP)) &&
1781 -                                          ((ip_hdr->protocol & 0x00ff) == IPPROTO_TCP)) {
1782 -                                               ip_hdrlen = ip_hdr->ihl << 2;
1783 -                                               tcp_hdr = (struct tcphdr*)&(skb->data[ip_hdrlen]);
1784 -                                               if (tcp_hdr->syn) {
1785 -                                                       struct toe_conn* connection = init_toeq(ip_hdr->version,
1786 -                                                                       ip_hdr, tcp_hdr, toe, &(skb->data[0]) - 14);
1787 -                                                       TCP_SKB_CB(skb)->connection = connection;
1788 -                                                       //      hash_dump_entry(TCP_SKB_CB(skb)->connection->hash_entry_index);
1789 -                                                       //              printk("%s::skb data %x, conn %x, mode %x\n",
1790 -                                                       //                      __func__, skb->data, connection, connection->mode);
1791 -                                               }
1792 -                                       }
1793 -                               }
1794 -#endif
1795 -#endif
1796                         }
1797                         else if (chksum_status == RX_CHKSUM_IP_OK_ONLY)
1798                         {
1799                                 skb->ip_summed = CHECKSUM_UNNECESSARY;
1800 -#ifdef CONFIG_SL351x_NAT
1801 -                               if (nat_cfg.enabled && curr_desc->word3.bits.l3_offset && curr_desc->word3.bits.l4_offset)
1802 -                               {
1803 -                                       struct iphdr    *ip_hdr;
1804 -                                       ip_hdr = (struct iphdr *)&(skb->data[curr_desc->word3.bits.l3_offset]);
1805 -                                       if (ip_hdr->protocol == IPPROTO_UDP)
1806 -                                       {
1807 -                                               sl351x_nat_input(skb,
1808 -                                                                               tp->port_id,
1809 -                                                                               (void *)curr_desc->word3.bits.l3_offset,
1810 -                                                                               (void *)curr_desc->word3.bits.l4_offset);
1811 -                                       }
1812 -                                       else if (ip_hdr->protocol == IPPROTO_GRE)
1813 -                                       {
1814 -                                               sl351x_nat_input(skb,
1815 -                                                                       tp->port_id,
1816 -                                                                       (void *)curr_desc->word3.bits.l3_offset,
1817 -                                                                       (void *)curr_desc->word3.bits.l4_offset);
1818 -                                       }
1819 -                               }
1820 -#endif
1821                                 skb->protocol = eth_type_trans(skb,dev); /* set skb protocol */
1822                         }
1823                         else
1824                         {
1825                                 skb->protocol = eth_type_trans(skb,dev); /* set skb protocol */
1826                         }
1827 -                       //netif_rx(skb);  /* socket rx */
1828 +
1829                         netif_receive_skb(skb); //For NAPI
1830                         dev->last_rx = jiffies;
1831  
1832                         isPtr->rx_bytes += pkt_size;
1833 -                       //printk("------------------->isPtr->rx_bytes = %d\n",isPtr->rx_bytes);
1834 -
1835 +               }
1836  
1837 -        }
1838                 // advance one for Rx default Q 0/1
1839                 rwptr.bits.rptr = RWPTR_ADVANCE_ONE(rwptr.bits.rptr, tp->default_desc_num);
1840                 SET_RPTR(&tp->default_qhdr->word1, rwptr.bits.rptr);
1841 -       tp->rx_rwptr.bits32 = rwptr.bits32;
1842 +               tp->rx_rwptr.bits32 = rwptr.bits32;
1843                 rx_pkts_num++;
1844 -               //rwptr.bits32 = readl(&tp->default_qhdr->word1);//try read default_qhdr again
1845 -               //fq_rwptr.bits32 = readl(TOE_GLOBAL_BASE + GLOBAL_SWFQ_RWPTR_REG);
1846 -               //printk("%s:---Loop  -------->rx_pkts_num=%d------------>Default Queue HW RW ptr = (0x%8x),   fq_rwptr =0x%8x \n",__func__,rx_pkts_num,rwptr.bits32,fq_rwptr.bits32 );
1847 -#if 0
1848 -               if ((status4 & 0x1) == 0)
1849 -               {
1850 -                       //if (!((dev->last_rx <= (rx_time + 2)) &&  (isPtr->rx_bytes > (rx_old_bytes + 1000000 ))))
1851 -                       if (tp->total_q_cnt_napi < 1024)
1852 -                       {
1853 -                               tp->total_q_cnt_napi++;
1854 -                               toe_gmac_fill_free_q();  //for iperf test disable
1855 -                       }
1856 -                       //else
1857 -                               //printk("%s:---isPtr->rx_bytes =%u , rx_old_bytes =%u\n",__func__,isPtr->rx_bytes,rx_old_bytes );
1858 +               // rwptr.bits32 = readl(&tp->default_qhdr->word1);
1859  
1860 +               status4 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_STATUS_4_REG);
1861 +               if (status4 & 1) {
1862 +                       writel(status4 & SWFQ_EMPTY_INT_BIT, TOE_GLOBAL_BASE+GLOBAL_INTERRUPT_STATUS_4_REG);
1863                 }
1864 +
1865 +               toe_gmac_fill_free_q(5);
1866 +       }
1867 +
1868 +#if 0
1869 +       /* avoid races with hard_start_xmit() */
1870 +
1871 +       spin_lock(&gmac_fq_lock);
1872 +       toe_gmac_tx_complete(&toe_private_data.gmac[0], 0, dev, 1);
1873 +       spin_unlock(&gmac_fq_lock);
1874  #endif
1875 -               //rwptr.bits.rptr = RWPTR_ADVANCE_ONE(rwptr.bits.rptr, tp->default_desc_num);
1876 -               //printk("%s:---Loop  -------->rx_pkts_num=%d----rwptr.bits.rptr=0x%x-------->Default Queue HW RW ptr = (0x%8x),   fq_rwptr =0x%8x \n",__func__,rx_pkts_num,rwptr.bits.rptr,rwptr.bits32,fq_rwptr.bits32 );
1877 -               //printk("%s:---Loop  rx_pkts_num=%d------rwptr.bits.rptr=0x%x------->Default_Q [rwptr.bits.rptr(SW)=0x%x,   rwptr.bits.wptr(HW) = 0x%x ]---->Free_Q(SW_HW) = 0x%8x \n",__func__,rx_pkts_num,rwptr.bits.rptr,rwptr.bits.rptr,rwptr.bits.wptr,fq_rwptr.bits32 );
1878 +
1879 +       status4 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_STATUS_4_REG);
1880 +       if (status4 & 1)
1881 +       {
1882 +               writel(status4 & SWFQ_EMPTY_INT_BIT, TOE_GLOBAL_BASE+GLOBAL_INTERRUPT_STATUS_4_REG);
1883 +               status4 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_STATUS_4_REG);
1884 +               toe_gmac_fill_free_q(rx_pkts_num);
1885         }
1886 -       // advance one for Rx default Q 0/1
1887  
1888 -               //rwptr.bits.rptr = RWPTR_ADVANCE_ONE(rwptr.bits.rptr, tp->default_desc_num);
1889 -               //SET_RPTR(&tp->default_qhdr->word1, rwptr.bits.rptr);
1890 -       //tp->rx_rwptr.bits32 = rwptr.bits32;
1891 -       //rwptr.bits.rptr = rwptr.bits.rptr;
1892 +       rwptr.bits32 = readl(&tp->default_qhdr->word1);
1893 +       if (rwptr.bits.rptr != rwptr.bits.wptr &&
1894 +           quota > rx_pkts_num)
1895 +               goto rx_poll_retry;
1896  
1897         dev->quota -= rx_pkts_num;
1898         *budget -= rx_pkts_num;
1899  
1900 -       status4 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_STATUS_4_REG);//try read SWFQ empty again
1901 -       //fq_rwptr.bits32 = readl(TOE_GLOBAL_BASE + GLOBAL_SWFQ_RWPTR_REG);
1902 -       rwptr.bits32 = readl(&tp->default_qhdr->word1); //try read default_qhdr again
1903 -       //printk("%s:---After    rx_pkts_num=%d------rwptr.bits.rptr=0x%x------->Default_Q [rwptr.bits.rptr(SW)=0x%x,   rwptr.bits.wptr(HW) = 0x%x ]---->Free_Q(SW_HW) = 0x%8x \n",__func__,rx_pkts_num,rwptr.bits.rptr,rwptr.bits.rptr,rwptr.bits.wptr,fq_rwptr.bits32 );
1904 -//     if (rwptr.bits.rptr > rwptr.bits.wptr )
1905 -//                     {
1906 -                               //toe_gmac_disable_rx(dev);
1907 -                               //wait_event_interruptible_timeout(freeq_wait,
1908 -                                       //(rx_pkts_num == 100), CMTP_INTEROP_TIMEOUT);
1909 -                               //printk("\n%s:: return 22222=======> rx_pkts_num =%d,   rwptr.bits.rptr=%d,   rwptr.bits.wptr = %d ====---------=======>JKJKJKJKJK\n",
1910 -                                       //__func__,rx_pkts_num,rwptr.bits.rptr,rwptr.bits.wptr);
1911 -//                             return 1;
1912 -//                     }
1913 -
1914 -       if (rwptr.bits.rptr == rwptr.bits.wptr)
1915 +       /* Receive queue is empty now */
1916 +       if (quota >= rx_pkts_num)
1917         {
1918 -               // unsigned int data32;
1919 -                       //printk("%s:---[rwptr.bits.rptr == rwptr.bits.wptr]   rx_pkts_num=%d------rwptr.bits.rptr=0x%x------->Default_Q [rwptr.bits.rptr(SW)=0x%x,   rwptr.bits.wptr(HW) = 0x%x ]---->Free_Q(SW_HW) = 0x%8x \n",__func__,rx_pkts_num,rwptr.bits.rptr,rwptr.bits.rptr,rwptr.bits.wptr,fq_rwptr.bits32 );
1920 -
1921 -           /* Receive descriptor is empty now */
1922 -#if 1
1923 -     if (status4 & 0x1)
1924 -                       {
1925 -                               do_again =1;
1926 -                               //writel(0x40400000, TOE_GLOBAL_BASE+GLOBAL_INTERRUPT_ENABLE_4_REG); //disable SWFQ empty interrupt
1927 -                               //toe_gmac_disable_interrupt(tp->irq);
1928 -                               tp->sw_fq_empty_cnt++;
1929 -                               //toe_gmac_disable_rx(dev);
1930 -                               writel(0x07960202, TOE_GMAC0_BASE+GMAC_CONFIG0);
1931 -                               writel(0x07960202, TOE_GMAC1_BASE+GMAC_CONFIG0);
1932 -                               //printk("\n%s ::  freeq int-----tp->sw_fq_empty_cnt  =%d---------====================----------------->\n",__func__,tp->sw_fq_empty_cnt);
1933 -                               //while ((fq_rwptr.bits.wptr >= (fq_rwptr.bits.rptr+256)) || (fq_rwptr.bits.wptr <= (fq_rwptr.bits.rptr+256)))
1934 -                               //{
1935 -                                       //gmac_write_reg(TOE_GLOBAL_BASE, GLOBAL_INTERRUPT_STATUS_4_REG, status4,
1936 -                                       //0x1);
1937 -                               //printk("\n%s::fq_rwptr.wrptr = %x =======> ===========>here \n", __func__,fq_rwptr.bits32);
1938 -                               //if ((status4 & 0x1) == 0)
1939 -                                       //break;
1940 -                                return 1;
1941 -                               //}
1942 +               unsigned long flags;
1943  
1944 +               netif_rx_complete(dev);
1945 +               rx_poll_enabled = 0;
1946 +#if 0
1947 +               status1 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_STATUS_1_REG);
1948 +               if (status1 & 1) {
1949 +                       if (netif_rx_reschedule(dev, rx_pkts_num)) {
1950 +                               rx_poll_enabled = 1;
1951 +                               return 1;
1952                         }
1953 +               }
1954  #endif
1955 -        //toe_gmac_fill_free_q();
1956 -        netif_rx_complete(dev);
1957 -
1958 -               rx_poll_enabled = 0;
1959  
1960 -               data32 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_ENABLE_1_REG);
1961 -               if (tp->port_id == 0)
1962 -                               data32 |= DEFAULT_Q0_INT_BIT;
1963 -               else
1964 -                               data32 |= DEFAULT_Q1_INT_BIT;
1965 -               writel(data32, TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_ENABLE_1_REG);
1966 +               spin_lock_irqsave(&gmac_fq_lock, flags);
1967  
1968                 data32 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_ENABLE_4_REG);
1969                 if (tp->port_id == 0)
1970 -                               data32 |= DEFAULT_Q0_INT_BIT;
1971 +                       data32 |= DEFAULT_Q0_INT_BIT;
1972                 else
1973 -                               data32 |= DEFAULT_Q1_INT_BIT;
1974 +                       data32 |= DEFAULT_Q1_INT_BIT;
1975                 writel(data32, TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_ENABLE_4_REG);
1976  
1977 -               data32 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_SELECT_4_REG);
1978 +               data32 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_ENABLE_1_REG);
1979                 if (tp->port_id == 0)
1980 -                               data32 |= DEFAULT_Q0_INT_BIT;
1981 +                       data32 |= DEFAULT_Q0_INT_BIT;
1982                 else
1983 -                               data32 |= DEFAULT_Q1_INT_BIT;
1984 -               writel(data32, TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_SELECT_4_REG);
1985 +                       data32 |= DEFAULT_Q1_INT_BIT;
1986 +               writel(data32, TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_ENABLE_1_REG);
1987  
1988 -        // enable GMAC-0 rx interrupt
1989 -        // class-Q & TOE-Q are implemented in future
1990 -        //data32 = readl(TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_ENABLE_1_REG);
1991 -        //if (tp->port_id == 0)
1992 -               //data32 |= DEFAULT_Q0_INT_BIT;
1993 -        //else
1994 -               //data32 |= DEFAULT_Q1_INT_BIT;
1995 -        //writel(data32, TOE_GLOBAL_BASE + GLOBAL_INTERRUPT_ENABLE_1_REG);
1996 -               writel(0x3, TOE_GLOBAL_BASE+GLOBAL_INTERRUPT_ENABLE_1_REG);
1997 -               //printk("\n%s::netif_rx_complete-->  rx_pkts_num =%d,   rwptr.bits.rptr=0x%x,   rwptr.bits.wptr = 0x%x ====---------=======>JKJKJKJKJK\n",
1998 -               //__func__,rx_pkts_num,rwptr.bits.rptr,rwptr.bits.wptr);
1999 -        writel(0x07960200, TOE_GMAC0_BASE+GMAC_CONFIG0);
2000 -               writel(0x07960200, TOE_GMAC1_BASE+GMAC_CONFIG0);
2001 -        return 0;
2002 -    }
2003 -    else
2004 -    {
2005 -        //printk("\n%s:: return 1 -->status4= 0x%x,rx_pkts_num =%d,   rwptr.bits.rptr=0x%x,   rwptr.bits.wptr = 0x%x  ======> \n", __func__,status4,rx_pkts_num,rwptr.bits.rptr,rwptr.bits.wptr);
2006 -        return 1;
2007 -    }
2008 +               spin_unlock_irqrestore(&gmac_fq_lock, flags);
2009 +
2010 +               return 0;
2011 +       }
2012 +       else
2013 +       {
2014 +               /* not done, will call ->poll() later. */
2015 +               return 1;
2016 +       }
2017  }
2018  #endif
2019  
2020 @@ -5114,6 +4475,7 @@ void sl351x_poll_gmac_hanged_status(u32 
2021                         {
2022                                 sl351x_nat_workaround_cnt++;
2023                                 sl351x_nat_workaround_handler();
2024 +                               printk("%():%d - workaround\n", __func__, __LINE__);
2025                         }
2026  #endif
2027  #endif
2028 @@ -5124,6 +4486,7 @@ void sl351x_poll_gmac_hanged_status(u32 
2029         }
2030  
2031  do_workaround:
2032 +       printk("doing workaround ?!\n");
2033  
2034         gmac_initialized = 0;
2035         if (hanged_state)
2036 @@ -5290,6 +4653,7 @@ static void sl351x_gmac_release_swtx_q(v
2037         GMAC_SWTXQ_T    *swtxq;
2038         DMA_RWPTR_T             rwptr;
2039  
2040 +       printk("**** %s():%d\n", __func__, __LINE__);
2041         toe = (TOE_INFO_T *)&toe_private_data;
2042         tp = (GMAC_INFO_T *)&toe->gmac[0];
2043         for (i=0; i<GMAC_NUM; i++, tp++)
2044 @@ -5341,6 +4705,7 @@ static void sl351x_gmac_release_rx_q(voi
2045         volatile GMAC_RXDESC_T  *curr_desc;
2046         struct sk_buff                  *skb;
2047  
2048 +       printk("**** %s():%d\n", __func__, __LINE__);
2049         toe = (TOE_INFO_T *)&toe_private_data;
2050         tp = (GMAC_INFO_T *)&toe->gmac[0];
2051         for (i=0; i<GMAC_NUM; i++, tp++)
2052 @@ -5374,6 +4739,7 @@ static void sl351x_gmac_release_class_q(
2053         volatile GMAC_RXDESC_T  *curr_desc;
2054         struct sk_buff                  *skb;
2055  
2056 +       printk("**** %s():%d\n", __func__, __LINE__);
2057         toe = (TOE_INFO_T *)&toe_private_data;
2058         classq = (CLASSQ_INFO_T *)&toe->classq[0];
2059         for (i=0; i<TOE_CLASS_QUEUE_NUM; i++, classq++)
2060 @@ -5410,6 +4776,7 @@ static void sl351x_gmac_release_toe_q(vo
2061         GMAC_RXDESC_T   *toe_curr_desc;
2062         struct sk_buff                  *skb;
2063  
2064 +       printk("**** %s():%d\n", __func__, __LINE__);
2065         toe = (TOE_INFO_T *)&toe_private_data;
2066         toe_qhdr = (TOE_QHDR_T *)TOE_TOE_QUE_HDR_BASE;
2067         for (i=0; i<TOE_TOE_QUEUE_NUM; i++, toe_qhdr++)
2068 Index: linux-2.6.23.17/include/asm-arm/arch-sl2312/sl351x_gmac.h
2069 ===================================================================
2070 --- linux-2.6.23.17.orig/include/asm-arm/arch-sl2312/sl351x_gmac.h
2071 +++ linux-2.6.23.17/include/asm-arm/arch-sl2312/sl351x_gmac.h
2072 @@ -107,7 +107,7 @@
2073   * The base address and descriptor number are configured at
2074   * DMA Queues Descriptor Ring Base Address/Size Register (offset 0x0004)
2075   **********************************************************************/
2076 -#define TOE_SW_FREEQ_DESC_POWER                10
2077 +#define TOE_SW_FREEQ_DESC_POWER                8
2078  #define TOE_SW_FREEQ_DESC_NUM          (1<<TOE_SW_FREEQ_DESC_POWER)
2079  #define TOE_HW_FREEQ_DESC_POWER                8
2080  #define TOE_HW_FREEQ_DESC_NUM          (1<<TOE_HW_FREEQ_DESC_POWER)
2081 @@ -123,12 +123,12 @@
2082  #define TOE_DEFAULT_Q0_DESC_NUM                (1<<TOE_DEFAULT_Q0_DESC_POWER)
2083  #define TOE_DEFAULT_Q1_DESC_POWER      8
2084  #define TOE_DEFAULT_Q1_DESC_NUM                (1<<TOE_DEFAULT_Q1_DESC_POWER)
2085 -#define TOE_TOE_DESC_POWER                     8
2086 -#define TOE_TOE_DESC_NUM                       (1<<TOE_TOE_DESC_POWER)
2087 +#define TOE_TOE_DESC_POWER             8
2088 +#define TOE_TOE_DESC_NUM               (1<<TOE_TOE_DESC_POWER)
2089  #define TOE_CLASS_DESC_POWER           8
2090 -#define TOE_CLASS_DESC_NUM                     (1<<TOE_CLASS_DESC_POWER)
2091 -#define TOE_INTR_DESC_POWER                    8
2092 -#define TOE_INTR_DESC_NUM                      (1<<TOE_INTR_DESC_POWER)
2093 +#define TOE_CLASS_DESC_NUM             (1<<TOE_CLASS_DESC_POWER)
2094 +#define TOE_INTR_DESC_POWER            8
2095 +#define TOE_INTR_DESC_NUM              (1<<TOE_INTR_DESC_POWER)
2096  
2097  #define TOE_TOE_QUEUE_MAX                      64
2098  #define TOE_TOE_QUEUE_NUM                      64