diff options
Diffstat (limited to 'drivers/net/jme.c')
| -rw-r--r-- | drivers/net/jme.c | 73 | 
1 files changed, 31 insertions, 42 deletions
| diff --git a/drivers/net/jme.c b/drivers/net/jme.c index b5b174a8c149..3ac262f55633 100644 --- a/drivers/net/jme.c +++ b/drivers/net/jme.c @@ -271,9 +271,7 @@ jme_reset_mac_processor(struct jme_adapter *jme)  static inline void  jme_clear_pm(struct jme_adapter *jme)  { -	jwrite32(jme, JME_PMCS, 0xFFFF0000 | jme->reg_pmcs); -	pci_set_power_state(jme->pdev, PCI_D0); -	device_set_wakeup_enable(&jme->pdev->dev, false); +	jwrite32(jme, JME_PMCS, PMCS_STMASK | jme->reg_pmcs);  }  static int @@ -753,20 +751,28 @@ jme_make_new_rx_buf(struct jme_adapter *jme, int i)  	struct jme_ring *rxring = &(jme->rxring[0]);  	struct jme_buffer_info *rxbi = rxring->bufinf + i;  	struct sk_buff *skb; +	dma_addr_t mapping;  	skb = netdev_alloc_skb(jme->dev,  		jme->dev->mtu + RX_EXTRA_LEN);  	if (unlikely(!skb))  		return -ENOMEM; +	mapping = pci_map_page(jme->pdev, virt_to_page(skb->data), +			       offset_in_page(skb->data), skb_tailroom(skb), +			       PCI_DMA_FROMDEVICE); +	if (unlikely(pci_dma_mapping_error(jme->pdev, mapping))) { +		dev_kfree_skb(skb); +		return -ENOMEM; +	} + +	if (likely(rxbi->mapping)) +		pci_unmap_page(jme->pdev, rxbi->mapping, +			       rxbi->len, PCI_DMA_FROMDEVICE); +  	rxbi->skb = skb;  	rxbi->len = skb_tailroom(skb); -	rxbi->mapping = pci_map_page(jme->pdev, -					virt_to_page(skb->data), -					offset_in_page(skb->data), -					rxbi->len, -					PCI_DMA_FROMDEVICE); - +	rxbi->mapping = mapping;  	return 0;  } @@ -1050,16 +1056,12 @@ jme_alloc_and_feed_skb(struct jme_adapter *jme, int idx)  			skb_checksum_none_assert(skb);  		if (rxdesc->descwb.flags & cpu_to_le16(RXWBFLAG_TAGON)) { -			if (jme->vlgrp) { -				jme->jme_vlan_rx(skb, jme->vlgrp, -					le16_to_cpu(rxdesc->descwb.vlan)); -				NET_STAT(jme).rx_bytes += 4; -			} else { -				dev_kfree_skb(skb); -			} -		} else { -			jme->jme_rx(skb); +			u16 vid = le16_to_cpu(rxdesc->descwb.vlan); + +			__vlan_hwaccel_put_tag(skb, vid); +			NET_STAT(jme).rx_bytes += 4;  		} +		jme->jme_rx(skb);  		if ((rxdesc->descwb.flags & cpu_to_le16(RXWBFLAG_DEST)) ==  		    cpu_to_le16(RXWBFLAG_DEST_MUL)) @@ -1817,11 +1819,9 @@ jme_powersave_phy(struct jme_adapter *jme)  {  	if (jme->reg_pmcs) {  		jme_set_100m_half(jme); -  		if (jme->reg_pmcs & (PMCS_LFEN | PMCS_LREN))  			jme_wait_link(jme); - -		jwrite32(jme, JME_PMCS, jme->reg_pmcs); +		jme_clear_pm(jme);  	} else {  		jme_phy_off(jme);  	} @@ -2286,16 +2286,6 @@ static inline void jme_resume_rx(struct jme_adapter *jme)  }  static void -jme_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp) -{ -	struct jme_adapter *jme = netdev_priv(netdev); - -	jme_pause_rx(jme); -	jme->vlgrp = grp; -	jme_resume_rx(jme); -} - -static void  jme_get_drvinfo(struct net_device *netdev,  		     struct ethtool_drvinfo *info)  { @@ -2405,7 +2395,6 @@ jme_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *ecmd)  	    test_bit(JME_FLAG_POLL, &jme->flags)) {  		clear_bit(JME_FLAG_POLL, &jme->flags);  		jme->jme_rx = netif_rx; -		jme->jme_vlan_rx = vlan_hwaccel_rx;  		dpi->cur		= PCC_P1;  		dpi->attempt		= PCC_P1;  		dpi->cnt		= 0; @@ -2415,7 +2404,6 @@ jme_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *ecmd)  		   !(test_bit(JME_FLAG_POLL, &jme->flags))) {  		set_bit(JME_FLAG_POLL, &jme->flags);  		jme->jme_rx = netif_receive_skb; -		jme->jme_vlan_rx = vlan_hwaccel_receive_skb;  		jme_interrupt_mode(jme);  	} @@ -2529,8 +2517,7 @@ jme_set_wol(struct net_device *netdev,  		jme->reg_pmcs |= PMCS_MFEN;  	jwrite32(jme, JME_PMCS, jme->reg_pmcs); - -	device_set_wakeup_enable(&jme->pdev->dev, jme->reg_pmcs); +	device_set_wakeup_enable(&jme->pdev->dev, !!(jme->reg_pmcs));  	return 0;  } @@ -2855,7 +2842,6 @@ static const struct net_device_ops jme_netdev_ops = {  	.ndo_set_multicast_list	= jme_set_multi,  	.ndo_change_mtu		= jme_change_mtu,  	.ndo_tx_timeout		= jme_tx_timeout, -	.ndo_vlan_rx_register	= jme_vlan_rx_register,  	.ndo_fix_features       = jme_fix_features,  	.ndo_set_features       = jme_set_features,  }; @@ -2938,7 +2924,6 @@ jme_init_one(struct pci_dev *pdev,  	jme->pdev = pdev;  	jme->dev = netdev;  	jme->jme_rx = netif_rx; -	jme->jme_vlan_rx = vlan_hwaccel_rx;  	jme->old_mtu = netdev->mtu = 1500;  	jme->phylink = 0;  	jme->tx_ring_size = 1 << 10; @@ -3058,6 +3043,9 @@ jme_init_one(struct pci_dev *pdev,  	jme->mii_if.mdio_write = jme_mdio_write;  	jme_clear_pm(jme); +	pci_set_power_state(jme->pdev, PCI_D0); +	device_set_wakeup_enable(&pdev->dev, true); +  	jme_set_phyfifo_5level(jme);  	jme->pcirev = pdev->revision;  	if (!jme->fpgaver) @@ -3135,8 +3123,9 @@ jme_shutdown(struct pci_dev *pdev)  	pci_pme_active(pdev, true);  } -#ifdef CONFIG_PM -static int jme_suspend(struct device *dev) +#ifdef CONFIG_PM_SLEEP +static int +jme_suspend(struct device *dev)  {  	struct pci_dev *pdev = to_pci_dev(dev);  	struct net_device *netdev = pci_get_drvdata(pdev); @@ -3175,14 +3164,14 @@ static int jme_suspend(struct device *dev)  	return 0;  } -static int jme_resume(struct device *dev) +static int +jme_resume(struct device *dev)  {  	struct pci_dev *pdev = to_pci_dev(dev);  	struct net_device *netdev = pci_get_drvdata(pdev);  	struct jme_adapter *jme = netdev_priv(netdev); -	jwrite32(jme, JME_PMCS, 0xFFFF0000 | jme->reg_pmcs); - +	jme_clear_pm(jme);  	jme_phy_on(jme);  	if (test_bit(JME_FLAG_SSET, &jme->flags))  		jme_set_settings(netdev, &jme->old_ecmd); | 
