The error lays in the b44_poll method. It seems that the read suddenly gets a ERROR, and then it restarts the network card.
846 static int b44_poll(struct napi_struct *napi, int budget) 847 { 848 struct b44 *bp = container_of(napi, struct b44, napi); 849 int work_done; 850 851 spin_lock_irq(&bp->lock); 852 853 if (bp->istat & (ISTAT_TX | ISTAT_TO)) { 854 /* spin_lock(&bp->tx_lock); */ 855 b44_tx(bp); 856 /* spin_unlock(&bp->tx_lock); */ 857 } 858 spin_unlock_irq(&bp->lock); 859 860 work_done = 0; 861 if (bp->istat & ISTAT_RX) 862 work_done += b44_rx(bp, budget); 863 864 if (bp->istat & ISTAT_ERRORS) { 865 unsigned long flags; 866 867 spin_lock_irqsave(&bp->lock, flags); 868 b44_halt(bp); 869 b44_init_rings(bp); 870 b44_init_hw(bp, B44_FULL_RESET_SKIP_PHY); 871 netif_wake_queue(bp->dev); 872 spin_unlock_irqrestore(&bp->lock, flags); 873 work_done = 0; 874 } 875 876 if (work_done < budget) { 877 napi_complete(napi); 878 b44_enable_ints(bp); 879 } 880 881 return work_done; 882 }
it gets into 864
The error lays in the b44_poll method. It seems that the read suddenly gets a ERROR, and then it restarts the network card.
846 static int b44_poll(struct napi_struct *napi, int budget) irq(&bp- >lock); &bp->tx_ lock); */ &bp->tx_ lock); */ irq(&bp- >lock); irqsave( &bp->lock, flags); RESET_SKIP_ PHY); queue(bp- >dev); irqrestore( &bp->lock, flags); napi); ints(bp) ;
847 {
848 struct b44 *bp = container_of(napi, struct b44, napi);
849 int work_done;
850
851 spin_lock_
852
853 if (bp->istat & (ISTAT_TX | ISTAT_TO)) {
854 /* spin_lock(
855 b44_tx(bp);
856 /* spin_unlock(
857 }
858 spin_unlock_
859
860 work_done = 0;
861 if (bp->istat & ISTAT_RX)
862 work_done += b44_rx(bp, budget);
863
864 if (bp->istat & ISTAT_ERRORS) {
865 unsigned long flags;
866
867 spin_lock_
868 b44_halt(bp);
869 b44_init_rings(bp);
870 b44_init_hw(bp, B44_FULL_
871 netif_wake_
872 spin_unlock_
873 work_done = 0;
874 }
875
876 if (work_done < budget) {
877 napi_complete(
878 b44_enable_
879 }
880
881 return work_done;
882 }
it gets into 864