diff options
Diffstat (limited to 'drivers/net/ethernet/sun')
| -rw-r--r-- | drivers/net/ethernet/sun/cassini.c | 10 | ||||
| -rw-r--r-- | drivers/net/ethernet/sun/cassini.h | 4 | ||||
| -rw-r--r-- | drivers/net/ethernet/sun/niu.c | 23 | ||||
| -rw-r--r-- | drivers/net/ethernet/sun/sunbmac.c | 1 | ||||
| -rw-r--r-- | drivers/net/ethernet/sun/sungem.c | 7 | ||||
| -rw-r--r-- | drivers/net/ethernet/sun/sunhme.c | 12 | ||||
| -rw-r--r-- | drivers/net/ethernet/sun/sunqe.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/sun/sunvnet.c | 44 | 
8 files changed, 58 insertions, 45 deletions
diff --git a/drivers/net/ethernet/sun/cassini.c b/drivers/net/ethernet/sun/cassini.c index 759441b29e5..b9ac20f4265 100644 --- a/drivers/net/ethernet/sun/cassini.c +++ b/drivers/net/ethernet/sun/cassini.c @@ -14,9 +14,7 @@   * GNU General Public License for more details.   *   * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. + * along with this program; if not, see <http://www.gnu.org/licenses/>.   *   * This driver uses the sungem driver (c) David Miller   * (davem@redhat.com) as its basis. @@ -248,7 +246,7 @@ static inline void cas_lock_tx(struct cas *cp)  	int i;  	for (i = 0; i < N_TX_RINGS; i++) -		spin_lock(&cp->tx_lock[i]); +		spin_lock_nested(&cp->tx_lock[i], i);  }  static inline void cas_lock_all(struct cas *cp) @@ -3354,7 +3352,7 @@ use_random_mac_addr:  #if defined(CONFIG_SPARC)  	addr = of_get_property(cp->of_node, "local-mac-address", NULL);  	if (addr != NULL) { -		memcpy(dev_addr, addr, 6); +		memcpy(dev_addr, addr, ETH_ALEN);  		goto done;  	}  #endif @@ -5168,7 +5166,6 @@ err_out_free_netdev:  err_out_disable_pdev:  	pci_disable_device(pdev); -	pci_set_drvdata(pdev, NULL);  	return -ENODEV;  } @@ -5206,7 +5203,6 @@ static void cas_remove_one(struct pci_dev *pdev)  	free_netdev(dev);  	pci_release_regions(pdev);  	pci_disable_device(pdev); -	pci_set_drvdata(pdev, NULL);  }  #ifdef CONFIG_PM diff --git a/drivers/net/ethernet/sun/cassini.h b/drivers/net/ethernet/sun/cassini.h index b361424d5f5..882ce168a79 100644 --- a/drivers/net/ethernet/sun/cassini.h +++ b/drivers/net/ethernet/sun/cassini.h @@ -15,9 +15,7 @@   * GNU General Public License for more details.   *   * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. + * along with this program; if not, see <http://www.gnu.org/licenses/>.   *   * vendor id: 0x108E (Sun Microsystems, Inc.)   * device id: 0xabba (Cassini) diff --git a/drivers/net/ethernet/sun/niu.c b/drivers/net/ethernet/sun/niu.c index f28460ce24a..79606f47a08 100644 --- a/drivers/net/ethernet/sun/niu.c +++ b/drivers/net/ethernet/sun/niu.c @@ -3493,10 +3493,12 @@ static int niu_process_rx_pkt(struct napi_struct *napi, struct niu *np,  	rh = (struct rx_pkt_hdr1 *) skb->data;  	if (np->dev->features & NETIF_F_RXHASH) -		skb->rxhash = ((u32)rh->hashval2_0 << 24 | -			       (u32)rh->hashval2_1 << 16 | -			       (u32)rh->hashval1_1 << 8 | -			       (u32)rh->hashval1_2 << 0); +		skb_set_hash(skb, +			     ((u32)rh->hashval2_0 << 24 | +			      (u32)rh->hashval2_1 << 16 | +			      (u32)rh->hashval1_1 << 8 | +			      (u32)rh->hashval1_2 << 0), +			     PKT_HASH_TYPE_L3);  	skb_pull(skb, sizeof(*rh));  	rp->rx_packets++; @@ -9039,7 +9041,7 @@ static void niu_try_msix(struct niu *np, u8 *ldg_num_map)  	struct msix_entry msi_vec[NIU_NUM_LDG];  	struct niu_parent *parent = np->parent;  	struct pci_dev *pdev = np->pdev; -	int i, num_irqs, err; +	int i, num_irqs;  	u8 first_ldg;  	first_ldg = (NIU_NUM_LDG / parent->num_ports) * np->port; @@ -9051,21 +9053,16 @@ static void niu_try_msix(struct niu *np, u8 *ldg_num_map)  		    (np->port == 0 ? 3 : 1));  	BUG_ON(num_irqs > (NIU_NUM_LDG / parent->num_ports)); -retry:  	for (i = 0; i < num_irqs; i++) {  		msi_vec[i].vector = 0;  		msi_vec[i].entry = i;  	} -	err = pci_enable_msix(pdev, msi_vec, num_irqs); -	if (err < 0) { +	num_irqs = pci_enable_msix_range(pdev, msi_vec, 1, num_irqs); +	if (num_irqs < 0) {  		np->flags &= ~NIU_FLAGS_MSIX;  		return;  	} -	if (err > 0) { -		num_irqs = err; -		goto retry; -	}  	np->flags |= NIU_FLAGS_MSIX;  	for (i = 0; i < num_irqs; i++) @@ -9875,7 +9872,6 @@ err_out_free_res:  err_out_disable_pdev:  	pci_disable_device(pdev); -	pci_set_drvdata(pdev, NULL);  	return err;  } @@ -9900,7 +9896,6 @@ static void niu_pci_remove_one(struct pci_dev *pdev)  		free_netdev(dev);  		pci_release_regions(pdev);  		pci_disable_device(pdev); -		pci_set_drvdata(pdev, NULL);  	}  } diff --git a/drivers/net/ethernet/sun/sunbmac.c b/drivers/net/ethernet/sun/sunbmac.c index 7217ee5d627..206c1063815 100644 --- a/drivers/net/ethernet/sun/sunbmac.c +++ b/drivers/net/ethernet/sun/sunbmac.c @@ -13,7 +13,6 @@  #include <linux/in.h>  #include <linux/string.h>  #include <linux/delay.h> -#include <linux/init.h>  #include <linux/crc32.h>  #include <linux/errno.h>  #include <linux/ethtool.h> diff --git a/drivers/net/ethernet/sun/sungem.c b/drivers/net/ethernet/sun/sungem.c index e62df2b8130..102a66fc54a 100644 --- a/drivers/net/ethernet/sun/sungem.c +++ b/drivers/net/ethernet/sun/sungem.c @@ -24,7 +24,6 @@  #include <linux/sched.h>  #include <linux/string.h>  #include <linux/delay.h> -#include <linux/init.h>  #include <linux/errno.h>  #include <linux/pci.h>  #include <linux/dma-mapping.h> @@ -689,7 +688,7 @@ static __inline__ void gem_tx(struct net_device *dev, struct gem *gp, u32 gem_st  		}  		dev->stats.tx_packets++; -		dev_kfree_skb(skb); +		dev_consume_skb_any(skb);  	}  	gp->tx_old = entry; @@ -2779,7 +2778,7 @@ static int gem_get_device_address(struct gem *gp)  		return -1;  #endif  	} -	memcpy(dev->dev_addr, addr, 6); +	memcpy(dev->dev_addr, addr, ETH_ALEN);  #else  	get_gem_mac_nonobp(gp->pdev, gp->dev->dev_addr);  #endif @@ -2806,8 +2805,6 @@ static void gem_remove_one(struct pci_dev *pdev)  		iounmap(gp->regs);  		pci_release_regions(pdev);  		free_netdev(dev); - -		pci_set_drvdata(pdev, NULL);  	}  } diff --git a/drivers/net/ethernet/sun/sunhme.c b/drivers/net/ethernet/sun/sunhme.c index e37b587b386..0dbf46f08ed 100644 --- a/drivers/net/ethernet/sun/sunhme.c +++ b/drivers/net/ethernet/sun/sunhme.c @@ -2675,10 +2675,10 @@ static int happy_meal_sbus_probe_one(struct platform_device *op, int is_qfe)  		addr = of_get_property(dp, "local-mac-address", &len); -		if (qfe_slot != -1 && addr && len == 6) -			memcpy(dev->dev_addr, addr, 6); +		if (qfe_slot != -1 && addr && len == ETH_ALEN) +			memcpy(dev->dev_addr, addr, ETH_ALEN);  		else -			memcpy(dev->dev_addr, idprom->id_ethaddr, 6); +			memcpy(dev->dev_addr, idprom->id_ethaddr, ETH_ALEN);  	}  	hp = netdev_priv(dev); @@ -3024,9 +3024,9 @@ static int happy_meal_pci_probe(struct pci_dev *pdev,  		    (addr = of_get_property(dp, "local-mac-address", &len))  			!= NULL &&  		    len == 6) { -			memcpy(dev->dev_addr, addr, 6); +			memcpy(dev->dev_addr, addr, ETH_ALEN);  		} else { -			memcpy(dev->dev_addr, idprom->id_ethaddr, 6); +			memcpy(dev->dev_addr, idprom->id_ethaddr, ETH_ALEN);  		}  #else  		get_hme_mac_nonsparc(pdev, &dev->dev_addr[0]); @@ -3170,8 +3170,6 @@ static void happy_meal_pci_remove(struct pci_dev *pdev)  	pci_release_regions(hp->happy_dev);  	free_netdev(net_dev); - -	pci_set_drvdata(pdev, NULL);  }  static DEFINE_PCI_DEVICE_TABLE(happymeal_pci_ids) = { diff --git a/drivers/net/ethernet/sun/sunqe.c b/drivers/net/ethernet/sun/sunqe.c index b072f4dba03..5695ae2411d 100644 --- a/drivers/net/ethernet/sun/sunqe.c +++ b/drivers/net/ethernet/sun/sunqe.c @@ -843,7 +843,7 @@ static int qec_ether_init(struct platform_device *op)  	if (!dev)  		return -ENOMEM; -	memcpy(dev->dev_addr, idprom->id_ethaddr, 6); +	memcpy(dev->dev_addr, idprom->id_ethaddr, ETH_ALEN);  	qe = netdev_priv(dev); diff --git a/drivers/net/ethernet/sun/sunvnet.c b/drivers/net/ethernet/sun/sunvnet.c index 3df56840a3b..d813bfb1a84 100644 --- a/drivers/net/ethernet/sun/sunvnet.c +++ b/drivers/net/ethernet/sun/sunvnet.c @@ -610,6 +610,13 @@ static int __vnet_tx_trigger(struct vnet_port *port)  	return err;  } +static inline bool port_is_up(struct vnet_port *vnet) +{ +	struct vio_driver_state *vio = &vnet->vio; + +	return !!(vio->hs_state & VIO_HS_COMPLETE); +} +  struct vnet_port *__tx_port_find(struct vnet *vp, struct sk_buff *skb)  {  	unsigned int hash = vnet_hashfn(skb->data); @@ -617,14 +624,19 @@ struct vnet_port *__tx_port_find(struct vnet *vp, struct sk_buff *skb)  	struct vnet_port *port;  	hlist_for_each_entry(port, hp, hash) { +		if (!port_is_up(port)) +			continue;  		if (ether_addr_equal(port->raddr, skb->data))  			return port;  	} -	port = NULL; -	if (!list_empty(&vp->port_list)) -		port = list_entry(vp->port_list.next, struct vnet_port, list); - -	return port; +	list_for_each_entry(port, &vp->port_list, list) { +		if (!port->switch_port) +			continue; +		if (!port_is_up(port)) +			continue; +		return port; +	} +	return NULL;  }  struct vnet_port *tx_port_find(struct vnet *vp, struct sk_buff *skb) @@ -751,7 +763,7 @@ static struct vnet_mcast_entry *__vnet_mc_find(struct vnet *vp, u8 *addr)  	struct vnet_mcast_entry *m;  	for (m = vp->mcast_list; m; m = m->next) { -		if (!memcmp(m->addr, addr, ETH_ALEN)) +		if (ether_addr_equal(m->addr, addr))  			return m;  	}  	return NULL; @@ -1083,6 +1095,24 @@ static struct vnet *vnet_find_or_create(const u64 *local_mac)  	return vp;  } +static void vnet_cleanup(void) +{ +	struct vnet *vp; +	struct net_device *dev; + +	mutex_lock(&vnet_list_mutex); +	while (!list_empty(&vnet_list)) { +		vp = list_first_entry(&vnet_list, struct vnet, list); +		list_del(&vp->list); +		dev = vp->dev; +		/* vio_unregister_driver() should have cleaned up port_list */ +		BUG_ON(!list_empty(&vp->port_list)); +		unregister_netdev(dev); +		free_netdev(dev); +	} +	mutex_unlock(&vnet_list_mutex); +} +  static const char *local_mac_prop = "local-mac-address";  static struct vnet *vnet_find_parent(struct mdesc_handle *hp, @@ -1240,7 +1270,6 @@ static int vnet_port_remove(struct vio_dev *vdev)  		kfree(port); -		unregister_netdev(vp->dev);  	}  	return 0;  } @@ -1268,6 +1297,7 @@ static int __init vnet_init(void)  static void __exit vnet_exit(void)  {  	vio_unregister_driver(&vnet_port_driver); +	vnet_cleanup();  }  module_init(vnet_init);  | 
