diff options
Diffstat (limited to 'drivers/net/ethernet/intel/igc/igc_leds.c')
| -rw-r--r-- | drivers/net/ethernet/intel/igc/igc_leds.c | 38 | 
1 files changed, 30 insertions, 8 deletions
diff --git a/drivers/net/ethernet/intel/igc/igc_leds.c b/drivers/net/ethernet/intel/igc/igc_leds.c index bf240c5daf86..3929b25b6ae6 100644 --- a/drivers/net/ethernet/intel/igc/igc_leds.c +++ b/drivers/net/ethernet/intel/igc/igc_leds.c @@ -236,8 +236,8 @@ static void igc_led_get_name(struct igc_adapter *adapter, int index, char *buf,  		 pci_dev_id(adapter->pdev), index);  } -static void igc_setup_ldev(struct igc_led_classdev *ldev, -			   struct net_device *netdev, int index) +static int igc_setup_ldev(struct igc_led_classdev *ldev, +			  struct net_device *netdev, int index)  {  	struct igc_adapter *adapter = netdev_priv(netdev);  	struct led_classdev *led_cdev = &ldev->led; @@ -257,24 +257,46 @@ static void igc_setup_ldev(struct igc_led_classdev *ldev,  	led_cdev->hw_control_get = igc_led_hw_control_get;  	led_cdev->hw_control_get_device = igc_led_hw_control_get_device; -	devm_led_classdev_register(&netdev->dev, led_cdev); +	return led_classdev_register(&netdev->dev, led_cdev);  }  int igc_led_setup(struct igc_adapter *adapter)  {  	struct net_device *netdev = adapter->netdev; -	struct device *dev = &netdev->dev;  	struct igc_led_classdev *leds; -	int i; +	int i, err;  	mutex_init(&adapter->led_mutex); -	leds = devm_kcalloc(dev, IGC_NUM_LEDS, sizeof(*leds), GFP_KERNEL); +	leds = kcalloc(IGC_NUM_LEDS, sizeof(*leds), GFP_KERNEL);  	if (!leds)  		return -ENOMEM; -	for (i = 0; i < IGC_NUM_LEDS; i++) -		igc_setup_ldev(leds + i, netdev, i); +	for (i = 0; i < IGC_NUM_LEDS; i++) { +		err = igc_setup_ldev(leds + i, netdev, i); +		if (err) +			goto err; +	} + +	adapter->leds = leds;  	return 0; + +err: +	for (i--; i >= 0; i--) +		led_classdev_unregister(&((leds + i)->led)); + +	kfree(leds); +	return err; +} + +void igc_led_free(struct igc_adapter *adapter) +{ +	struct igc_led_classdev *leds = adapter->leds; +	int i; + +	for (i = 0; i < IGC_NUM_LEDS; i++) +		led_classdev_unregister(&((leds + i)->led)); + +	kfree(leds);  }  |