diff options
Diffstat (limited to 'drivers/net/usb/hso.c')
| -rw-r--r-- | drivers/net/usb/hso.c | 42 | 
1 files changed, 22 insertions, 20 deletions
diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c index 837135f0390..5ddd8c4f901 100644 --- a/drivers/net/usb/hso.c +++ b/drivers/net/usb/hso.c @@ -2481,10 +2481,10 @@ static int add_net_device(struct hso_device *hso_dev)  	return 0;  } -static int hso_radio_toggle(void *data, enum rfkill_state state) +static int hso_rfkill_set_block(void *data, bool blocked)  {  	struct hso_device *hso_dev = data; -	int enabled = (state == RFKILL_STATE_UNBLOCKED); +	int enabled = !blocked;  	int rv;  	mutex_lock(&hso_dev->mutex); @@ -2498,6 +2498,10 @@ static int hso_radio_toggle(void *data, enum rfkill_state state)  	return rv;  } +static const struct rfkill_ops hso_rfkill_ops = { +	.set_block = hso_rfkill_set_block, +}; +  /* Creates and sets up everything for rfkill */  static void hso_create_rfkill(struct hso_device *hso_dev,  			     struct usb_interface *interface) @@ -2506,29 +2510,25 @@ static void hso_create_rfkill(struct hso_device *hso_dev,  	struct device *dev = &hso_net->net->dev;  	char *rfkn; -	hso_net->rfkill = rfkill_allocate(&interface_to_usbdev(interface)->dev, -				 RFKILL_TYPE_WWAN); -	if (!hso_net->rfkill) { -		dev_err(dev, "%s - Out of memory\n", __func__); -		return; -	}  	rfkn = kzalloc(20, GFP_KERNEL); -	if (!rfkn) { -		rfkill_free(hso_net->rfkill); -		hso_net->rfkill = NULL; +	if (!rfkn)  		dev_err(dev, "%s - Out of memory\n", __func__); -		return; -	} +  	snprintf(rfkn, 20, "hso-%d",  		 interface->altsetting->desc.bInterfaceNumber); -	hso_net->rfkill->name = rfkn; -	hso_net->rfkill->state = RFKILL_STATE_UNBLOCKED; -	hso_net->rfkill->data = hso_dev; -	hso_net->rfkill->toggle_radio = hso_radio_toggle; + +	hso_net->rfkill = rfkill_alloc(rfkn, +				       &interface_to_usbdev(interface)->dev, +				       RFKILL_TYPE_WWAN, +				       &hso_rfkill_ops, hso_dev); +	if (!hso_net->rfkill) { +		dev_err(dev, "%s - Out of memory\n", __func__); +		kfree(rfkn); +		return; +	}  	if (rfkill_register(hso_net->rfkill) < 0) { +		rfkill_destroy(hso_net->rfkill);  		kfree(rfkn); -		hso_net->rfkill->name = NULL; -		rfkill_free(hso_net->rfkill);  		hso_net->rfkill = NULL;  		dev_err(dev, "%s - Failed to register rfkill\n", __func__);  		return; @@ -3165,8 +3165,10 @@ static void hso_free_interface(struct usb_interface *interface)  			hso_stop_net_device(network_table[i]);  			cancel_work_sync(&network_table[i]->async_put_intf);  			cancel_work_sync(&network_table[i]->async_get_intf); -			if (rfk) +			if (rfk) {  				rfkill_unregister(rfk); +				rfkill_destroy(rfk); +			}  			hso_free_net_device(network_table[i]);  		}  	}  |