diff options
Diffstat (limited to 'drivers/net/ethernet/nvidia/forcedeth.c')
| -rw-r--r-- | drivers/net/ethernet/nvidia/forcedeth.c | 89 | 
1 files changed, 49 insertions, 40 deletions
diff --git a/drivers/net/ethernet/nvidia/forcedeth.c b/drivers/net/ethernet/nvidia/forcedeth.c index 098b96dad66..9afc536c573 100644 --- a/drivers/net/ethernet/nvidia/forcedeth.c +++ b/drivers/net/ethernet/nvidia/forcedeth.c @@ -26,8 +26,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/>.   *   * Known bugs:   * We suspect that on some hardware no TX done interrupts are generated. @@ -59,7 +58,6 @@  #include <linux/skbuff.h>  #include <linux/mii.h>  #include <linux/random.h> -#include <linux/init.h>  #include <linux/if_vlan.h>  #include <linux/dma-mapping.h>  #include <linux/slab.h> @@ -408,7 +406,7 @@ union ring_type {  #define NV_RX_DESCRIPTORVALID	(1<<16)  #define NV_RX_MISSEDFRAME	(1<<17) -#define NV_RX_SUBSTRACT1	(1<<18) +#define NV_RX_SUBTRACT1		(1<<18)  #define NV_RX_ERROR1		(1<<23)  #define NV_RX_ERROR2		(1<<24)  #define NV_RX_ERROR3		(1<<25) @@ -425,7 +423,7 @@ union ring_type {  #define NV_RX2_CHECKSUM_IP_TCP	(0x14000000)  #define NV_RX2_CHECKSUM_IP_UDP	(0x18000000)  #define NV_RX2_DESCRIPTORVALID	(1<<29) -#define NV_RX2_SUBSTRACT1	(1<<25) +#define NV_RX2_SUBTRACT1	(1<<25)  #define NV_RX2_ERROR1		(1<<18)  #define NV_RX2_ERROR2		(1<<19)  #define NV_RX2_ERROR3		(1<<20) @@ -1755,19 +1753,19 @@ nv_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *storage)  	/* software stats */  	do { -		syncp_start = u64_stats_fetch_begin_bh(&np->swstats_rx_syncp); +		syncp_start = u64_stats_fetch_begin_irq(&np->swstats_rx_syncp);  		storage->rx_packets       = np->stat_rx_packets;  		storage->rx_bytes         = np->stat_rx_bytes;  		storage->rx_dropped       = np->stat_rx_dropped;  		storage->rx_missed_errors = np->stat_rx_missed_errors; -	} while (u64_stats_fetch_retry_bh(&np->swstats_rx_syncp, syncp_start)); +	} while (u64_stats_fetch_retry_irq(&np->swstats_rx_syncp, syncp_start));  	do { -		syncp_start = u64_stats_fetch_begin_bh(&np->swstats_tx_syncp); +		syncp_start = u64_stats_fetch_begin_irq(&np->swstats_tx_syncp);  		storage->tx_packets = np->stat_tx_packets;  		storage->tx_bytes   = np->stat_tx_bytes;  		storage->tx_dropped = np->stat_tx_dropped; -	} while (u64_stats_fetch_retry_bh(&np->swstats_tx_syncp, syncp_start)); +	} while (u64_stats_fetch_retry_irq(&np->swstats_tx_syncp, syncp_start));  	/* If the nic supports hw counters then retrieve latest values */  	if (np->driver_data & DEV_HAS_STATISTICS_V123) { @@ -2233,7 +2231,7 @@ static netdev_tx_t nv_start_xmit(struct sk_buff *skb, struct net_device *dev)  		if (pci_dma_mapping_error(np->pci_dev,  					  np->put_tx_ctx->dma)) {  			/* on DMA mapping error - drop the packet */ -			kfree_skb(skb); +			dev_kfree_skb_any(skb);  			u64_stats_update_begin(&np->swstats_tx_syncp);  			np->stat_tx_dropped++;  			u64_stats_update_end(&np->swstats_tx_syncp); @@ -2279,7 +2277,7 @@ static netdev_tx_t nv_start_xmit(struct sk_buff *skb, struct net_device *dev)  					if (unlikely(tmp_tx_ctx++ == np->last_tx_ctx))  						tmp_tx_ctx = np->first_tx_ctx;  				} while (tmp_tx_ctx != np->put_tx_ctx); -				kfree_skb(skb); +				dev_kfree_skb_any(skb);  				np->put_tx_ctx = start_tx_ctx;  				u64_stats_update_begin(&np->swstats_tx_syncp);  				np->stat_tx_dropped++; @@ -2382,7 +2380,7 @@ static netdev_tx_t nv_start_xmit_optimized(struct sk_buff *skb,  		if (pci_dma_mapping_error(np->pci_dev,  					  np->put_tx_ctx->dma)) {  			/* on DMA mapping error - drop the packet */ -			kfree_skb(skb); +			dev_kfree_skb_any(skb);  			u64_stats_update_begin(&np->swstats_tx_syncp);  			np->stat_tx_dropped++;  			u64_stats_update_end(&np->swstats_tx_syncp); @@ -2429,7 +2427,7 @@ static netdev_tx_t nv_start_xmit_optimized(struct sk_buff *skb,  					if (unlikely(tmp_tx_ctx++ == np->last_tx_ctx))  						tmp_tx_ctx = np->first_tx_ctx;  				} while (tmp_tx_ctx != np->put_tx_ctx); -				kfree_skb(skb); +				dev_kfree_skb_any(skb);  				np->put_tx_ctx = start_tx_ctx;  				u64_stats_update_begin(&np->swstats_tx_syncp);  				np->stat_tx_dropped++; @@ -2834,7 +2832,7 @@ static int nv_rx_process(struct net_device *dev, int limit)  					}  					/* framing errors are soft errors */  					else if ((flags & NV_RX_ERROR_MASK) == NV_RX_FRAMINGERR) { -						if (flags & NV_RX_SUBSTRACT1) +						if (flags & NV_RX_SUBTRACT1)  							len--;  					}  					/* the rest are hard errors */ @@ -2865,7 +2863,7 @@ static int nv_rx_process(struct net_device *dev, int limit)  					}  					/* framing errors are soft errors */  					else if ((flags & NV_RX2_ERROR_MASK) == NV_RX2_FRAMINGERR) { -						if (flags & NV_RX2_SUBSTRACT1) +						if (flags & NV_RX2_SUBTRACT1)  							len--;  					}  					/* the rest are hard errors */ @@ -2939,7 +2937,7 @@ static int nv_rx_process_optimized(struct net_device *dev, int limit)  				}  				/* framing errors are soft errors */  				else if ((flags & NV_RX2_ERROR_MASK) == NV_RX2_FRAMINGERR) { -					if (flags & NV_RX2_SUBSTRACT1) +					if (flags & NV_RX2_SUBTRACT1)  						len--;  				}  				/* the rest are hard errors */ @@ -3932,7 +3930,7 @@ static int nv_request_irq(struct net_device *dev, int intr_test)  {  	struct fe_priv *np = get_nvpriv(dev);  	u8 __iomem *base = get_hwbase(dev); -	int ret = 1; +	int ret;  	int i;  	irqreturn_t (*handler)(int foo, void *data); @@ -3948,14 +3946,18 @@ static int nv_request_irq(struct net_device *dev, int intr_test)  	if (np->msi_flags & NV_MSI_X_CAPABLE) {  		for (i = 0; i < (np->msi_flags & NV_MSI_X_VECTORS_MASK); i++)  			np->msi_x_entry[i].entry = i; -		ret = pci_enable_msix(np->pci_dev, np->msi_x_entry, (np->msi_flags & NV_MSI_X_VECTORS_MASK)); -		if (ret == 0) { +		ret = pci_enable_msix_range(np->pci_dev, +					    np->msi_x_entry, +					    np->msi_flags & NV_MSI_X_VECTORS_MASK, +					    np->msi_flags & NV_MSI_X_VECTORS_MASK); +		if (ret > 0) {  			np->msi_flags |= NV_MSI_X_ENABLED;  			if (optimization_mode == NV_OPTIMIZATION_MODE_THROUGHPUT && !intr_test) {  				/* Request irq for rx handling */  				sprintf(np->name_rx, "%s-rx", dev->name); -				if (request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector, -						nv_nic_irq_rx, IRQF_SHARED, np->name_rx, dev) != 0) { +				ret = request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector, +						  nv_nic_irq_rx, IRQF_SHARED, np->name_rx, dev); +				if (ret) {  					netdev_info(dev,  						    "request_irq failed for rx %d\n",  						    ret); @@ -3965,8 +3967,9 @@ static int nv_request_irq(struct net_device *dev, int intr_test)  				}  				/* Request irq for tx handling */  				sprintf(np->name_tx, "%s-tx", dev->name); -				if (request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_TX].vector, -						nv_nic_irq_tx, IRQF_SHARED, np->name_tx, dev) != 0) { +				ret = request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_TX].vector, +						  nv_nic_irq_tx, IRQF_SHARED, np->name_tx, dev); +				if (ret) {  					netdev_info(dev,  						    "request_irq failed for tx %d\n",  						    ret); @@ -3976,8 +3979,9 @@ static int nv_request_irq(struct net_device *dev, int intr_test)  				}  				/* Request irq for link and timer handling */  				sprintf(np->name_other, "%s-other", dev->name); -				if (request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_OTHER].vector, -						nv_nic_irq_other, IRQF_SHARED, np->name_other, dev) != 0) { +				ret = request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_OTHER].vector, +						  nv_nic_irq_other, IRQF_SHARED, np->name_other, dev); +				if (ret) {  					netdev_info(dev,  						    "request_irq failed for link %d\n",  						    ret); @@ -3993,7 +3997,9 @@ static int nv_request_irq(struct net_device *dev, int intr_test)  				set_msix_vector_map(dev, NV_MSI_X_VECTOR_OTHER, NVREG_IRQ_OTHER);  			} else {  				/* Request irq for all interrupts */ -				if (request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector, handler, IRQF_SHARED, dev->name, dev) != 0) { +				ret = request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector, +						  handler, IRQF_SHARED, dev->name, dev); +				if (ret) {  					netdev_info(dev,  						    "request_irq failed %d\n",  						    ret); @@ -4007,13 +4013,15 @@ static int nv_request_irq(struct net_device *dev, int intr_test)  				writel(0, base + NvRegMSIXMap1);  			}  			netdev_info(dev, "MSI-X enabled\n"); +			return 0;  		}  	} -	if (ret != 0 && np->msi_flags & NV_MSI_CAPABLE) { +	if (np->msi_flags & NV_MSI_CAPABLE) {  		ret = pci_enable_msi(np->pci_dev);  		if (ret == 0) {  			np->msi_flags |= NV_MSI_ENABLED; -			if (request_irq(np->pci_dev->irq, handler, IRQF_SHARED, dev->name, dev) != 0) { +			ret = request_irq(np->pci_dev->irq, handler, IRQF_SHARED, dev->name, dev); +			if (ret) {  				netdev_info(dev, "request_irq failed %d\n",  					    ret);  				pci_disable_msi(np->pci_dev); @@ -4027,13 +4035,12 @@ static int nv_request_irq(struct net_device *dev, int intr_test)  			/* enable msi vector 0 */  			writel(NVREG_MSI_VECTOR_0_ENABLED, base + NvRegMSIIrqMask);  			netdev_info(dev, "MSI enabled\n"); +			return 0;  		}  	} -	if (ret != 0) { -		if (request_irq(np->pci_dev->irq, handler, IRQF_SHARED, dev->name, dev) != 0) -			goto out_err; -	} +	if (request_irq(np->pci_dev->irq, handler, IRQF_SHARED, dev->name, dev) != 0) +		goto out_err;  	return 0;  out_free_tx: @@ -4278,8 +4285,8 @@ static int nv_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)  		if (np->duplex)  			ecmd->duplex = DUPLEX_FULL;  	} else { -		speed = -1; -		ecmd->duplex = -1; +		speed = SPEED_UNKNOWN; +		ecmd->duplex = DUPLEX_UNKNOWN;  	}  	ethtool_cmd_speed_set(ecmd, speed);  	ecmd->autoneg = np->autoneg; @@ -5150,8 +5157,10 @@ static void nv_self_test(struct net_device *dev, struct ethtool_test *test, u64  {  	struct fe_priv *np = netdev_priv(dev);  	u8 __iomem *base = get_hwbase(dev); -	int result; -	memset(buffer, 0, nv_get_sset_count(dev, ETH_SS_TEST)*sizeof(u64)); +	int result, count; + +	count = nv_get_sset_count(dev, ETH_SS_TEST); +	memset(buffer, 0, count * sizeof(u64));  	if (!nv_link_test(dev)) {  		test->flags |= ETH_TEST_FL_FAILED; @@ -5195,7 +5204,7 @@ static void nv_self_test(struct net_device *dev, struct ethtool_test *test, u64  			return;  		} -		if (!nv_loopback_test(dev)) { +		if (count > NV_TEST_COUNT_BASE && !nv_loopback_test(dev)) {  			test->flags |= ETH_TEST_FL_FAILED;  			buffer[3] = 1;  		} @@ -5619,6 +5628,8 @@ static int nv_probe(struct pci_dev *pci_dev, const struct pci_device_id *id)  	spin_lock_init(&np->lock);  	spin_lock_init(&np->hwstats_lock);  	SET_NETDEV_DEV(dev, &pci_dev->dev); +	u64_stats_init(&np->swstats_rx_syncp); +	u64_stats_init(&np->swstats_tx_syncp);  	init_timer(&np->oom_kick);  	np->oom_kick.data = (unsigned long) dev; @@ -5755,7 +5766,7 @@ static int nv_probe(struct pci_dev *pci_dev, const struct pci_device_id *id)  		dev->netdev_ops = &nv_netdev_ops_optimized;  	netif_napi_add(dev, &np->napi, nv_napi_poll, RX_WORK_PER_LOOP); -	SET_ETHTOOL_OPS(dev, &ops); +	dev->ethtool_ops = &ops;  	dev->watchdog_timeo = NV_WATCHDOG_TIMEO;  	pci_set_drvdata(pci_dev, dev); @@ -6016,7 +6027,6 @@ static int nv_probe(struct pci_dev *pci_dev, const struct pci_device_id *id)  out_error:  	if (phystate_orig)  		writel(phystate|NVREG_ADAPTCTL_RUNNING, base + NvRegAdapterControl); -	pci_set_drvdata(pci_dev, NULL);  out_freering:  	free_rings(dev);  out_unmap: @@ -6087,7 +6097,6 @@ static void nv_remove(struct pci_dev *pci_dev)  	pci_release_regions(pci_dev);  	pci_disable_device(pci_dev);  	free_netdev(dev); -	pci_set_drvdata(pci_dev, NULL);  }  #ifdef CONFIG_PM_SLEEP  | 
