diff options
Diffstat (limited to 'drivers/net/ethernet/micrel')
| -rw-r--r-- | drivers/net/ethernet/micrel/ks8695net.c | 7 | ||||
| -rw-r--r-- | drivers/net/ethernet/micrel/ks8842.c | 6 | ||||
| -rw-r--r-- | drivers/net/ethernet/micrel/ks8851.c | 79 | ||||
| -rw-r--r-- | drivers/net/ethernet/micrel/ks8851_mll.c | 4 | ||||
| -rw-r--r-- | drivers/net/ethernet/micrel/ksz884x.c | 23 | 
5 files changed, 93 insertions, 26 deletions
diff --git a/drivers/net/ethernet/micrel/ks8695net.c b/drivers/net/ethernet/micrel/ks8695net.c index 106eb972f2a..6c7c78baedc 100644 --- a/drivers/net/ethernet/micrel/ks8695net.c +++ b/drivers/net/ethernet/micrel/ks8695net.c @@ -21,7 +21,6 @@  #include <linux/ioport.h>  #include <linux/netdevice.h>  #include <linux/etherdevice.h> -#include <linux/init.h>  #include <linux/interrupt.h>  #include <linux/skbuff.h>  #include <linux/spinlock.h> @@ -1505,15 +1504,15 @@ ks8695_probe(struct platform_device *pdev)  	if (ksp->phyiface_regs && ksp->link_irq == -1) {  		ks8695_init_switch(ksp);  		ksp->dtype = KS8695_DTYPE_LAN; -		SET_ETHTOOL_OPS(ndev, &ks8695_ethtool_ops); +		ndev->ethtool_ops = &ks8695_ethtool_ops;  	} else if (ksp->phyiface_regs && ksp->link_irq != -1) {  		ks8695_init_wan_phy(ksp);  		ksp->dtype = KS8695_DTYPE_WAN; -		SET_ETHTOOL_OPS(ndev, &ks8695_wan_ethtool_ops); +		ndev->ethtool_ops = &ks8695_wan_ethtool_ops;  	} else {  		/* No initialisation since HPNA does not have a PHY */  		ksp->dtype = KS8695_DTYPE_HPNA; -		SET_ETHTOOL_OPS(ndev, &ks8695_ethtool_ops); +		ndev->ethtool_ops = &ks8695_ethtool_ops;  	}  	/* And bring up the net_device with the net core */ diff --git a/drivers/net/ethernet/micrel/ks8842.c b/drivers/net/ethernet/micrel/ks8842.c index 0951f7aca1e..822616e3c37 100644 --- a/drivers/net/ethernet/micrel/ks8842.c +++ b/drivers/net/ethernet/micrel/ks8842.c @@ -459,8 +459,7 @@ static int ks8842_tx_frame_dma(struct sk_buff *skb, struct net_device *netdev)  		sg_dma_len(&ctl->sg) += 4 - sg_dma_len(&ctl->sg) % 4;  	ctl->adesc = dmaengine_prep_slave_sg(ctl->chan, -		&ctl->sg, 1, DMA_MEM_TO_DEV, -		DMA_PREP_INTERRUPT | DMA_COMPL_SKIP_SRC_UNMAP); +		&ctl->sg, 1, DMA_MEM_TO_DEV, DMA_PREP_INTERRUPT);  	if (!ctl->adesc)  		return NETDEV_TX_BUSY; @@ -571,8 +570,7 @@ static int __ks8842_start_new_rx_dma(struct net_device *netdev)  		sg_dma_len(sg) = DMA_BUFFER_SIZE;  		ctl->adesc = dmaengine_prep_slave_sg(ctl->chan, -			sg, 1, DMA_DEV_TO_MEM, -			DMA_PREP_INTERRUPT | DMA_COMPL_SKIP_SRC_UNMAP); +			sg, 1, DMA_DEV_TO_MEM, DMA_PREP_INTERRUPT);  		if (!ctl->adesc)  			goto out; diff --git a/drivers/net/ethernet/micrel/ks8851.c b/drivers/net/ethernet/micrel/ks8851.c index 727b546a9eb..66d4ab703f4 100644 --- a/drivers/net/ethernet/micrel/ks8851.c +++ b/drivers/net/ethernet/micrel/ks8851.c @@ -23,8 +23,11 @@  #include <linux/crc32.h>  #include <linux/mii.h>  #include <linux/eeprom_93cx6.h> +#include <linux/regulator/consumer.h>  #include <linux/spi/spi.h> +#include <linux/gpio.h> +#include <linux/of_gpio.h>  #include "ks8851.h" @@ -83,6 +86,9 @@ union ks8851_tx_hdr {   * @rc_rxqcr: Cached copy of KS_RXQCR.   * @eeprom_size: Companion eeprom size in Bytes, 0 if no eeprom   * @eeprom: 93CX6 EEPROM state for accessing on-board EEPROM. + * @vdd_reg:	Optional regulator supplying the chip + * @vdd_io: Optional digital power supply for IO + * @gpio: Optional reset_n gpio   *   * The @lock ensures that the chip is protected when certain operations are   * in progress. When the read or write packet transfer is in progress, most @@ -130,6 +136,9 @@ struct ks8851_net {  	struct spi_transfer	spi_xfer2[2];  	struct eeprom_93cx6	eeprom; +	struct regulator	*vdd_reg; +	struct regulator	*vdd_io; +	int			gpio;  };  static int msg_enable; @@ -1401,6 +1410,7 @@ static int ks8851_probe(struct spi_device *spi)  	struct ks8851_net *ks;  	int ret;  	unsigned cider; +	int gpio;  	ndev = alloc_etherdev(sizeof(struct ks8851_net));  	if (!ndev) @@ -1414,6 +1424,54 @@ static int ks8851_probe(struct spi_device *spi)  	ks->spidev = spi;  	ks->tx_space = 6144; +	gpio = of_get_named_gpio_flags(spi->dev.of_node, "reset-gpios", +				       0, NULL); +	if (gpio == -EPROBE_DEFER) { +		ret = gpio; +		goto err_gpio; +	} + +	ks->gpio = gpio; +	if (gpio_is_valid(gpio)) { +		ret = devm_gpio_request_one(&spi->dev, gpio, +					    GPIOF_OUT_INIT_LOW, "ks8851_rst_n"); +		if (ret) { +			dev_err(&spi->dev, "reset gpio request failed\n"); +			goto err_gpio; +		} +	} + +	ks->vdd_io = devm_regulator_get(&spi->dev, "vdd-io"); +	if (IS_ERR(ks->vdd_io)) { +		ret = PTR_ERR(ks->vdd_io); +		goto err_reg_io; +	} + +	ret = regulator_enable(ks->vdd_io); +	if (ret) { +		dev_err(&spi->dev, "regulator vdd_io enable fail: %d\n", +			ret); +		goto err_reg_io; +	} + +	ks->vdd_reg = devm_regulator_get(&spi->dev, "vdd"); +	if (IS_ERR(ks->vdd_reg)) { +		ret = PTR_ERR(ks->vdd_reg); +		goto err_reg; +	} + +	ret = regulator_enable(ks->vdd_reg); +	if (ret) { +		dev_err(&spi->dev, "regulator vdd enable fail: %d\n", +			ret); +		goto err_reg; +	} + +	if (gpio_is_valid(gpio)) { +		usleep_range(10000, 11000); +		gpio_set_value(gpio, 1); +	} +  	mutex_init(&ks->lock);  	spin_lock_init(&ks->statelock); @@ -1453,7 +1511,7 @@ static int ks8851_probe(struct spi_device *spi)  	skb_queue_head_init(&ks->txq); -	SET_ETHTOOL_OPS(ndev, &ks8851_ethtool_ops); +	ndev->ethtool_ops = &ks8851_ethtool_ops;  	SET_NETDEV_DEV(ndev, &spi->dev);  	spi_set_drvdata(spi, ks); @@ -1508,8 +1566,15 @@ static int ks8851_probe(struct spi_device *spi)  err_netdev:  	free_irq(ndev->irq, ks); -err_id:  err_irq: +	if (gpio_is_valid(gpio)) +		gpio_set_value(gpio, 0); +err_id: +	regulator_disable(ks->vdd_reg); +err_reg: +	regulator_disable(ks->vdd_io); +err_reg_io: +err_gpio:  	free_netdev(ndev);  	return ret;  } @@ -1523,14 +1588,24 @@ static int ks8851_remove(struct spi_device *spi)  	unregister_netdev(priv->netdev);  	free_irq(spi->irq, priv); +	if (gpio_is_valid(priv->gpio)) +		gpio_set_value(priv->gpio, 0); +	regulator_disable(priv->vdd_reg); +	regulator_disable(priv->vdd_io);  	free_netdev(priv->netdev);  	return 0;  } +static const struct of_device_id ks8851_match_table[] = { +	{ .compatible = "micrel,ks8851" }, +	{ } +}; +  static struct spi_driver ks8851_driver = {  	.driver = {  		.name = "ks8851", +		.of_match_table = ks8851_match_table,  		.owner = THIS_MODULE,  		.pm = &ks8851_pm_ops,  	}, diff --git a/drivers/net/ethernet/micrel/ks8851_mll.c b/drivers/net/ethernet/micrel/ks8851_mll.c index 075f4e21d33..c83d16dc7cd 100644 --- a/drivers/net/ethernet/micrel/ks8851_mll.c +++ b/drivers/net/ethernet/micrel/ks8851_mll.c @@ -1248,7 +1248,7 @@ static void ks_set_mac(struct ks_net *ks, u8 *data)  	w = ((u & 0xFF) << 8) | ((u >> 8) & 0xFF);  	ks_wrreg16(ks, KS_MARL, w); -	memcpy(ks->mac_addr, data, 6); +	memcpy(ks->mac_addr, data, ETH_ALEN);  	if (ks->enabled)  		ks_start_rx(ks); @@ -1651,7 +1651,7 @@ static int ks8851_probe(struct platform_device *pdev)  	}  	netdev_info(netdev, "Mac address is: %pM\n", ks->mac_addr); -	memcpy(netdev->dev_addr, ks->mac_addr, 6); +	memcpy(netdev->dev_addr, ks->mac_addr, ETH_ALEN);  	ks_set_mac(ks, netdev->dev_addr); diff --git a/drivers/net/ethernet/micrel/ksz884x.c b/drivers/net/ethernet/micrel/ksz884x.c index 8ebc352bcbe..064a48d0c36 100644 --- a/drivers/net/ethernet/micrel/ksz884x.c +++ b/drivers/net/ethernet/micrel/ksz884x.c @@ -4128,10 +4128,10 @@ static int hw_add_addr(struct ksz_hw *hw, u8 *mac_addr)  	int i;  	int j = ADDITIONAL_ENTRIES; -	if (!memcmp(hw->override_addr, mac_addr, ETH_ALEN)) +	if (ether_addr_equal(hw->override_addr, mac_addr))  		return 0;  	for (i = 0; i < hw->addr_list_size; i++) { -		if (!memcmp(hw->address[i], mac_addr, ETH_ALEN)) +		if (ether_addr_equal(hw->address[i], mac_addr))  			return 0;  		if (ADDITIONAL_ENTRIES == j && empty_addr(hw->address[i]))  			j = i; @@ -4149,7 +4149,7 @@ static int hw_del_addr(struct ksz_hw *hw, u8 *mac_addr)  	int i;  	for (i = 0; i < hw->addr_list_size; i++) { -		if (!memcmp(hw->address[i], mac_addr, ETH_ALEN)) { +		if (ether_addr_equal(hw->address[i], mac_addr)) {  			memset(hw->address[i], 0, ETH_ALEN);  			writel(0, hw->io + ADD_ADDR_INCR * i +  				KS_ADD_ADDR_0_HI); @@ -4832,7 +4832,7 @@ static inline void copy_old_skb(struct sk_buff *old, struct sk_buff *skb)  	skb->csum = old->csum;  	skb_set_network_header(skb, ETH_HLEN); -	dev_kfree_skb(old); +	dev_consume_skb_any(old);  }  /** @@ -4930,7 +4930,7 @@ static void netdev_tx_timeout(struct net_device *dev)  		 * Only reset the hardware if time between calls is long  		 * enough.  		 */ -		if (jiffies - last_reset <= dev->watchdog_timeo) +		if (time_before_eq(jiffies, last_reset + dev->watchdog_timeo))  			hw_priv = NULL;  	} @@ -5853,15 +5853,12 @@ static int netdev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)  	struct dev_info *hw_priv = priv->adapter;  	struct ksz_hw *hw = &hw_priv->hw;  	struct ksz_port *port = &priv->port; -	int rc;  	int result = 0;  	struct mii_ioctl_data *data = if_mii(ifr);  	if (down_interruptible(&priv->proc_sem))  		return -ERESTARTSYS; -	/* assume success */ -	rc = 0;  	switch (cmd) {  	/* Get address of MII PHY in use. */  	case SIOCGMIIPHY: @@ -7075,6 +7072,7 @@ static int pcidev_init(struct pci_dev *pdev, const struct pci_device_id *id)  		dev = alloc_etherdev(sizeof(struct dev_priv));  		if (!dev)  			goto pcidev_init_reg_err; +		SET_NETDEV_DEV(dev, &pdev->dev);  		info->netdev[i] = dev;  		priv = netdev_priv(dev); @@ -7104,13 +7102,12 @@ static int pcidev_init(struct pci_dev *pdev, const struct pci_device_id *id)  			       ETH_ALEN);  		else {  			memcpy(dev->dev_addr, sw->other_addr, ETH_ALEN); -			if (!memcmp(sw->other_addr, hw->override_addr, -				    ETH_ALEN)) +			if (ether_addr_equal(sw->other_addr, hw->override_addr))  				dev->dev_addr[5] += port->first_port;  		}  		dev->netdev_ops = &netdev_ops; -		SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); +		dev->ethtool_ops = &netdev_ethtool_ops;  		if (register_netdev(dev))  			goto pcidev_init_reg_err;  		port_set_power_saving(port, true); @@ -7150,8 +7147,6 @@ static void pcidev_exit(struct pci_dev *pdev)  	struct platform_info *info = pci_get_drvdata(pdev);  	struct dev_info *hw_priv = &info->dev_info; -	pci_set_drvdata(pdev, NULL); -  	release_mem_region(pci_resource_start(pdev, 0),  		pci_resource_len(pdev, 0));  	for (i = 0; i < hw_priv->hw.dev_count; i++) { @@ -7227,7 +7222,7 @@ static int pcidev_suspend(struct pci_dev *pdev, pm_message_t state)  static char pcidev_name[] = "ksz884xp"; -static struct pci_device_id pcidev_table[] = { +static DEFINE_PCI_DEVICE_TABLE(pcidev_table) = {  	{ PCI_VENDOR_ID_MICREL_KS, 0x8841,  		PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },  	{ PCI_VENDOR_ID_MICREL_KS, 0x8842,  | 
