if (test_bit (EVENT_LINK_RESET, &dev->flags)) { struct driver_info 	*info = dev->driver_info; int			retval = 0;  clear_bit (EVENT_LINK_RESET, &dev->flags); if(info->link_reset && (retval = info->link_reset(dev)) < 0) { devinfo(dev, "link reset failed (%d) usbnet usb-%s-%s, %s", retval, dev->udev->bus->bus_name, dev->udev->devpath, info->description); } }  
kevent (void *data){	struct usbnet		*dev = data;	int			status;	/* usb_clear_halt() needs a thread context */	if (test_bit (EVENT_TX_HALT, &dev->flags)) {		unlink_urbs (dev, &dev->txq);		status = usb_clear_halt (dev->udev, dev->out);		if (status < 0 && status != -EPIPE) {			if (netif_msg_tx_err (dev))				deverr (dev, "can't clear tx halt, status %d",					status);		} else {			clear_bit (EVENT_TX_HALT, &dev->flags);			netif_wake_queue (dev->net);		}	}	if (test_bit (EVENT_RX_HALT, &dev->flags)) {		unlink_urbs (dev, &dev->rxq);		status = usb_clear_halt (dev->udev, dev->in);		if (status < 0 && status != -EPIPE) {			if (netif_msg_rx_err (dev))				deverr (dev, "can't clear rx halt, status %d",					status);		} else {			clear_bit (EVENT_RX_HALT, &dev->flags);			tasklet_schedule (&dev->bh);		}	}	/* tasklet could resubmit itself forever if memory is tight */	if (test_bit (EVENT_RX_MEMORY, &dev->flags)) {		struct urb	*urb = NULL;		if (netif_running (dev->net))			urb = usb_alloc_urb (0, GFP_KERNEL);		else			clear_bit (EVENT_RX_MEMORY, &dev->flags);		if (urb != NULL) {			clear_bit (EVENT_RX_MEMORY, &dev->flags);			rx_submit (dev, urb, GFP_KERNEL);			tasklet_schedule (&dev->bh);		}	}	if (dev->flags)		devdbg (dev, "kevent done, flags = 0x%lx",			dev->flags);}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/7ea13c9c0e40d24c5f45a3a6bee8a2a39bfb1df4/usbnet.c/buggy/drivers/usb/net/usbnet.c