diff options
Diffstat (limited to 'drivers/net/irda/mcs7780.c')
| -rw-r--r-- | drivers/net/irda/mcs7780.c | 76 | 
1 files changed, 31 insertions, 45 deletions
diff --git a/drivers/net/irda/mcs7780.c b/drivers/net/irda/mcs7780.c index 74b20f179ce..16f8ffb50e0 100644 --- a/drivers/net/irda/mcs7780.c +++ b/drivers/net/irda/mcs7780.c @@ -48,7 +48,6 @@  #include <linux/kernel.h>  #include <linux/types.h>  #include <linux/errno.h> -#include <linux/init.h>  #include <linux/slab.h>  #include <linux/usb.h>  #include <linux/device.h> @@ -191,8 +190,8 @@ static inline int mcs_setup_transceiver_vishay(struct mcs_cb *mcs)  		goto error;  	ret = 0; -	error: -		return ret; +error: +	return ret;  }  /* Setup a communication between mcs7780 and agilent chip. */ @@ -501,8 +500,11 @@ static inline int mcs_setup_urbs(struct mcs_cb *mcs)  		return 0;  	mcs->rx_urb = usb_alloc_urb(0, GFP_KERNEL); -	if (!mcs->rx_urb) +	if (!mcs->rx_urb) { +		usb_free_urb(mcs->tx_urb); +		mcs->tx_urb = NULL;  		return 0; +	}  	return 1;  } @@ -588,7 +590,7 @@ static int mcs_speed_change(struct mcs_cb *mcs)  	mcs_get_reg(mcs, MCS_MODE_REG, &rval); -	/* MINRXPW values recomended by MosChip */ +	/* MINRXPW values recommended by MosChip */  	if (mcs->new_speed <= 115200) {  		rval &= ~MCS_FIR; @@ -643,9 +645,9 @@ static int mcs_speed_change(struct mcs_cb *mcs)  	ret = mcs_set_reg(mcs, MCS_MODE_REG, rval);  	mcs->speed = mcs->new_speed; -	error: -		mcs->new_speed = 0; -		return ret; +error: +	mcs->new_speed = 0; +	return ret;  }  /* Ioctl calls not supported at this time.  Can be an area of future work. */ @@ -738,17 +740,20 @@ static int mcs_net_open(struct net_device *netdev)  	ret = mcs_receive_start(mcs);  	if (ret) -		goto error3; +		goto error4;  	netif_start_queue(netdev);  	return 0; -	error3: -		irlap_close(mcs->irlap); -	error2: -		kfree_skb(mcs->rx_buff.skb); -	error1: -		return ret; +error4: +	usb_free_urb(mcs->rx_urb); +	usb_free_urb(mcs->tx_urb); +error3: +	irlap_close(mcs->irlap); +error2: +	kfree_skb(mcs->rx_buff.skb); +error1: +	return ret;  }  /* Receive callback function.  */ @@ -799,7 +804,7 @@ static void mcs_receive_irq(struct urb *urb)  	ret = usb_submit_urb(urb, GFP_ATOMIC);  } -/* Transmit callback funtion.  */ +/* Transmit callback function.  */  static void mcs_send_irq(struct urb *urb)  {  	struct mcs_cb *mcs = urb->context; @@ -811,7 +816,7 @@ static void mcs_send_irq(struct urb *urb)  		netif_wake_queue(ndev);  } -/* Transmit callback funtion.  */ +/* Transmit callback function.  */  static netdev_tx_t mcs_hard_xmit(struct sk_buff *skb,  				       struct net_device *ndev)  { @@ -920,8 +925,10 @@ static int mcs_probe(struct usb_interface *intf,  	ndev->netdev_ops = &mcs_netdev_ops; -	if (!intf->cur_altsetting) +	if (!intf->cur_altsetting) { +		ret = -ENOMEM;  		goto error2; +	}  	ret = mcs_find_endpoints(mcs, intf->cur_altsetting->endpoint,  				 intf->cur_altsetting->desc.bNumEndpoints); @@ -944,11 +951,11 @@ static int mcs_probe(struct usb_interface *intf,  	usb_set_intfdata(intf, mcs);  	return 0; -	error2: -		free_netdev(ndev); +error2: +	free_netdev(ndev); -	error1: -		return ret; +error1: +	return ret;  }  /* The current device is removed, the USB layer tells us to shut down. */ @@ -959,7 +966,7 @@ static void mcs_disconnect(struct usb_interface *intf)  	if (!mcs)  		return; -	flush_scheduled_work(); +	cancel_work_sync(&mcs->work);  	unregister_netdev(mcs->netdev);  	free_netdev(mcs->netdev); @@ -968,25 +975,4 @@ static void mcs_disconnect(struct usb_interface *intf)  	IRDA_DEBUG(0, "MCS7780 now disconnected.\n");  } -/* Module insertion */ -static int __init mcs_init(void) -{ -	int result; - -	/* register this driver with the USB subsystem */ -	result = usb_register(&mcs_driver); -	if (result) -		IRDA_ERROR("usb_register failed. Error number %d\n", result); - -	return result; -} -module_init(mcs_init); - -/* Module removal */ -static void __exit mcs_exit(void) -{ -	/* deregister this driver with the USB subsystem */ -	usb_deregister(&mcs_driver); -} -module_exit(mcs_exit); - +module_usb_driver(mcs_driver);  | 
