Skip to content
Snippets Groups Projects
netdev.c 200 KiB
Newer Older
  • Learn to ignore specific revisions
  • /* Intel PRO/1000 Linux driver
     * Copyright(c) 1999 - 2014 Intel Corporation.
     *
     * This program is free software; you can redistribute it and/or modify it
     * under the terms and conditions of the GNU General Public License,
     * version 2, as published by the Free Software Foundation.
     *
     * This program is distributed in the hope it will be useful, but WITHOUT
     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
     * more details.
     *
     * The full GNU General Public License is included in this distribution in
     * the file called "COPYING".
     *
     * Contact Information:
     * Linux NICS <linux.nics@intel.com>
     * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
     * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
     */
    
    #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
    
    
    #include <linux/module.h>
    #include <linux/types.h>
    #include <linux/init.h>
    #include <linux/pci.h>
    #include <linux/vmalloc.h>
    #include <linux/pagemap.h>
    #include <linux/delay.h>
    #include <linux/netdevice.h>
    
    #include <linux/interrupt.h>
    
    #include <linux/tcp.h>
    #include <linux/ipv6.h>
    
    #include <net/checksum.h>
    #include <net/ip6_checksum.h>
    #include <linux/ethtool.h>
    #include <linux/if_vlan.h>
    #include <linux/cpu.h>
    #include <linux/smp.h>
    
    #include <linux/pm_qos.h>
    
    #include <linux/pm_runtime.h>
    
    #include <linux/aer.h>
    
    #include <linux/prefetch.h>
    
    #define DRV_EXTRAVERSION "-k"
    
    #define DRV_VERSION "2.3.2" DRV_EXTRAVERSION
    
    char e1000e_driver_name[] = "e1000e";
    const char e1000e_driver_version[] = DRV_VERSION;
    
    
    #define DEFAULT_MSG_ENABLE (NETIF_MSG_DRV|NETIF_MSG_PROBE|NETIF_MSG_LINK)
    static int debug = -1;
    module_param(debug, int, 0);
    MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)");
    
    
    static const struct e1000_info *e1000_info_tbl[] = {
    	[board_82571]		= &e1000_82571_info,
    	[board_82572]		= &e1000_82572_info,
    	[board_82573]		= &e1000_82573_info,
    
    	[board_82574]		= &e1000_82574_info,
    
    	[board_82583]		= &e1000_82583_info,
    
    	[board_80003es2lan]	= &e1000_es2_info,
    	[board_ich8lan]		= &e1000_ich8_info,
    	[board_ich9lan]		= &e1000_ich9_info,
    
    	[board_ich10lan]	= &e1000_ich10_info,
    
    	[board_pchlan]		= &e1000_pch_info,
    
    	[board_pch2lan]		= &e1000_pch2_info,
    
    	[board_pch_lpt]		= &e1000_pch_lpt_info,
    
    struct e1000_reg_info {
    	u32 ofs;
    	char *name;
    };
    
    static const struct e1000_reg_info e1000_reg_info_tbl[] = {
    	/* General Registers */
    	{E1000_CTRL, "CTRL"},
    	{E1000_STATUS, "STATUS"},
    	{E1000_CTRL_EXT, "CTRL_EXT"},
    
    	/* Interrupt Registers */
    	{E1000_ICR, "ICR"},
    
    
    	{E1000_RDLEN(0), "RDLEN"},
    	{E1000_RDH(0), "RDH"},
    	{E1000_RDT(0), "RDT"},
    
    	{E1000_RDTR, "RDTR"},
    	{E1000_RXDCTL(0), "RXDCTL"},
    	{E1000_ERT, "ERT"},
    
    	{E1000_RDBAL(0), "RDBAL"},
    	{E1000_RDBAH(0), "RDBAH"},
    
    	{E1000_RDFH, "RDFH"},
    	{E1000_RDFT, "RDFT"},
    	{E1000_RDFHS, "RDFHS"},
    	{E1000_RDFTS, "RDFTS"},
    	{E1000_RDFPC, "RDFPC"},
    
    
    	{E1000_TDBAL(0), "TDBAL"},
    	{E1000_TDBAH(0), "TDBAH"},
    	{E1000_TDLEN(0), "TDLEN"},
    	{E1000_TDH(0), "TDH"},
    	{E1000_TDT(0), "TDT"},
    
    	{E1000_TIDV, "TIDV"},
    	{E1000_TXDCTL(0), "TXDCTL"},
    	{E1000_TADV, "TADV"},
    	{E1000_TARC(0), "TARC"},
    	{E1000_TDFH, "TDFH"},
    	{E1000_TDFT, "TDFT"},
    	{E1000_TDFHS, "TDFHS"},
    	{E1000_TDFTS, "TDFTS"},
    	{E1000_TDFPC, "TDFPC"},
    
    	/* List Terminator */
    
     * e1000_regdump - register printout routine
    
     * @hw: pointer to the HW structure
     * @reginfo: pointer to the register info table
     **/
    
    static void e1000_regdump(struct e1000_hw *hw, struct e1000_reg_info *reginfo)
    {
    	int n = 0;
    	char rname[16];
    	u32 regs[8];
    
    	switch (reginfo->ofs) {
    	case E1000_RXDCTL(0):
    		for (n = 0; n < 2; n++)
    			regs[n] = __er32(hw, E1000_RXDCTL(n));
    		break;
    	case E1000_TXDCTL(0):
    		for (n = 0; n < 2; n++)
    			regs[n] = __er32(hw, E1000_TXDCTL(n));
    		break;
    	case E1000_TARC(0):
    		for (n = 0; n < 2; n++)
    			regs[n] = __er32(hw, E1000_TARC(n));
    		break;
    	default:
    
    		pr_info("%-15s %08x\n",
    			reginfo->name, __er32(hw, reginfo->ofs));
    
    		return;
    	}
    
    	snprintf(rname, 16, "%s%s", reginfo->name, "[0-1]");
    
    	pr_info("%-15s %08x %08x\n", rname, regs[0], regs[1]);
    
    static void e1000e_dump_ps_pages(struct e1000_adapter *adapter,
    				 struct e1000_buffer *bi)
    {
    	int i;
    	struct e1000_ps_page *ps_page;
    
    	for (i = 0; i < adapter->rx_ps_pages; i++) {
    		ps_page = &bi->ps_pages[i];
    
    		if (ps_page->page) {
    			pr_info("packet dump for ps_page %d:\n", i);
    			print_hex_dump(KERN_INFO, "", DUMP_PREFIX_ADDRESS,
    				       16, 1, page_address(ps_page->page),
    				       PAGE_SIZE, true);
    		}
    	}
    }
    
    
     * e1000e_dump - Print registers, Tx-ring and Rx-ring
    
     * @adapter: board private structure
     **/
    
    static void e1000e_dump(struct e1000_adapter *adapter)
    {
    	struct net_device *netdev = adapter->netdev;
    	struct e1000_hw *hw = &adapter->hw;
    	struct e1000_reg_info *reginfo;
    	struct e1000_ring *tx_ring = adapter->tx_ring;
    	struct e1000_tx_desc *tx_desc;
    
    	struct e1000_buffer *buffer_info;
    	struct e1000_ring *rx_ring = adapter->rx_ring;
    	union e1000_rx_desc_packet_split *rx_desc_ps;
    
    	union e1000_rx_desc_extended *rx_desc;
    
    		__le64 a;
    		__le64 b;
    		__le64 c;
    		__le64 d;
    
    	u32 staterr;
    	int i = 0;
    
    	if (!netif_msg_hw(adapter))
    		return;
    
    	/* Print netdevice Info */
    	if (netdev) {
    		dev_info(&adapter->pdev->dev, "Net device Info\n");
    
    		pr_info("Device Name     state            trans_start      last_rx\n");
    
    		pr_info("%-15s %016lX %016lX %016lX\n", netdev->name,
    			netdev->state, netdev->trans_start, netdev->last_rx);
    
    	}
    
    	/* Print Registers */
    	dev_info(&adapter->pdev->dev, "Register Dump\n");
    
    	pr_info(" Register Name   Value\n");
    
    	for (reginfo = (struct e1000_reg_info *)e1000_reg_info_tbl;
    	     reginfo->name; reginfo++) {
    		e1000_regdump(hw, reginfo);
    	}
    
    
    	if (!netdev || !netif_running(netdev))
    
    	dev_info(&adapter->pdev->dev, "Tx Ring Summary\n");
    
    	pr_info("Queue [NTU] [NTC] [bi(ntc)->dma  ] leng ntw timestamp\n");
    
    	buffer_info = &tx_ring->buffer_info[tx_ring->next_to_clean];
    
    	pr_info(" %5d %5X %5X %016llX %04X %3X %016llX\n",
    		0, tx_ring->next_to_use, tx_ring->next_to_clean,
    		(unsigned long long)buffer_info->dma,
    		buffer_info->length,
    		buffer_info->next_to_watch,
    		(unsigned long long)buffer_info->time_stamp);
    
    	if (!netif_msg_tx_done(adapter))
    		goto rx_ring_summary;
    
    
    	dev_info(&adapter->pdev->dev, "Tx Ring Dump\n");
    
    
    	/* Transmit Descriptor Formats - DEXT[29] is 0 (Legacy) or 1 (Extended)
    	 *
    	 * Legacy Transmit Descriptor
    	 *   +--------------------------------------------------------------+
    	 * 0 |         Buffer Address [63:0] (Reserved on Write Back)       |
    	 *   +--------------------------------------------------------------+
    	 * 8 | Special  |    CSS     | Status |  CMD    |  CSO   |  Length  |
    	 *   +--------------------------------------------------------------+
    	 *   63       48 47        36 35    32 31     24 23    16 15        0
    	 *
    	 * Extended Context Descriptor (DTYP=0x0) for TSO or checksum offload
    	 *   63      48 47    40 39       32 31             16 15    8 7      0
    	 *   +----------------------------------------------------------------+
    	 * 0 |  TUCSE  | TUCS0  |   TUCSS   |     IPCSE       | IPCS0 | IPCSS |
    	 *   +----------------------------------------------------------------+
    	 * 8 |   MSS   | HDRLEN | RSV | STA | TUCMD | DTYP |      PAYLEN      |
    	 *   +----------------------------------------------------------------+
    	 *   63      48 47    40 39 36 35 32 31   24 23  20 19                0
    	 *
    	 * Extended Data Descriptor (DTYP=0x1)
    	 *   +----------------------------------------------------------------+
    	 * 0 |                     Buffer Address [63:0]                      |
    	 *   +----------------------------------------------------------------+
    	 * 8 | VLAN tag |  POPTS  | Rsvd | Status | Command | DTYP |  DTALEN  |
    	 *   +----------------------------------------------------------------+
    	 *   63       48 47     40 39  36 35    32 31     24 23  20 19        0
    	 */
    
    	pr_info("Tl[desc]     [address 63:0  ] [SpeCssSCmCsLen] [bi->dma       ] leng  ntw timestamp        bi->skb <-- Legacy format\n");
    	pr_info("Tc[desc]     [Ce CoCsIpceCoS] [MssHlRSCm0Plen] [bi->dma       ] leng  ntw timestamp        bi->skb <-- Ext Context format\n");
    	pr_info("Td[desc]     [address 63:0  ] [VlaPoRSCm1Dlen] [bi->dma       ] leng  ntw timestamp        bi->skb <-- Ext Data format\n");
    
    	for (i = 0; tx_ring->desc && (i < tx_ring->count); i++) {
    
    		const char *next_desc;
    
    		tx_desc = E1000_TX_DESC(*tx_ring, i);
    		buffer_info = &tx_ring->buffer_info[i];
    		u0 = (struct my_u0 *)tx_desc;
    		if (i == tx_ring->next_to_use && i == tx_ring->next_to_clean)
    
    			next_desc = " NTC/U";
    
    		else if (i == tx_ring->next_to_use)
    
    			next_desc = " NTU";
    
    		else if (i == tx_ring->next_to_clean)
    
    			next_desc = " NTC";
    
    			next_desc = "";
    		pr_info("T%c[0x%03X]    %016llX %016llX %016llX %04X  %3X %016llX %p%s\n",
    			(!(le64_to_cpu(u0->b) & (1 << 29)) ? 'l' :
    			 ((le64_to_cpu(u0->b) & (1 << 20)) ? 'd' : 'c')),
    			i,
    			(unsigned long long)le64_to_cpu(u0->a),
    			(unsigned long long)le64_to_cpu(u0->b),
    			(unsigned long long)buffer_info->dma,
    			buffer_info->length, buffer_info->next_to_watch,
    			(unsigned long long)buffer_info->time_stamp,
    			buffer_info->skb, next_desc);
    
    		if (netif_msg_pktdata(adapter) && buffer_info->skb)
    
    			print_hex_dump(KERN_INFO, "", DUMP_PREFIX_ADDRESS,
    
    				       16, 1, buffer_info->skb->data,
    				       buffer_info->skb->len, true);
    
    	dev_info(&adapter->pdev->dev, "Rx Ring Summary\n");
    
    	pr_info("Queue [NTU] [NTC]\n");
    	pr_info(" %5d %5X %5X\n",
    		0, rx_ring->next_to_use, rx_ring->next_to_clean);
    
    	if (!netif_msg_rx_status(adapter))
    
    	dev_info(&adapter->pdev->dev, "Rx Ring Dump\n");
    
    	switch (adapter->rx_ps_pages) {
    	case 1:
    	case 2:
    	case 3:
    		/* [Extended] Packet Split Receive Descriptor Format
    		 *
    		 *    +-----------------------------------------------------+
    		 *  0 |                Buffer Address 0 [63:0]              |
    		 *    +-----------------------------------------------------+
    		 *  8 |                Buffer Address 1 [63:0]              |
    		 *    +-----------------------------------------------------+
    		 * 16 |                Buffer Address 2 [63:0]              |
    		 *    +-----------------------------------------------------+
    		 * 24 |                Buffer Address 3 [63:0]              |
    		 *    +-----------------------------------------------------+
    		 */
    
    		pr_info("R  [desc]      [buffer 0 63:0 ] [buffer 1 63:0 ] [buffer 2 63:0 ] [buffer 3 63:0 ] [bi->dma       ] [bi->skb] <-- Ext Pkt Split format\n");
    
    		/* [Extended] Receive Descriptor (Write-Back) Format
    		 *
    		 *   63       48 47    32 31     13 12    8 7    4 3        0
    		 *   +------------------------------------------------------+
    		 * 0 | Packet   | IP     |  Rsvd   | MRQ   | Rsvd | MRQ RSS |
    		 *   | Checksum | Ident  |         | Queue |      |  Type   |
    		 *   +------------------------------------------------------+
    		 * 8 | VLAN Tag | Length | Extended Error | Extended Status |
    		 *   +------------------------------------------------------+
    		 *   63       48 47    32 31            20 19               0
    		 */
    
    		pr_info("RWB[desc]      [ck ipid mrqhsh] [vl   l0 ee  es] [ l3  l2  l1 hs] [reserved      ] ---------------- [bi->skb] <-- Ext Rx Write-Back format\n");
    
    		for (i = 0; i < rx_ring->count; i++) {
    
    			const char *next_desc;
    
    			buffer_info = &rx_ring->buffer_info[i];
    			rx_desc_ps = E1000_RX_DESC_PS(*rx_ring, i);
    			u1 = (struct my_u1 *)rx_desc_ps;
    			staterr =
    
    			    le32_to_cpu(rx_desc_ps->wb.middle.status_error);
    
    
    			if (i == rx_ring->next_to_use)
    				next_desc = " NTU";
    			else if (i == rx_ring->next_to_clean)
    				next_desc = " NTC";
    			else
    				next_desc = "";
    
    
    			if (staterr & E1000_RXD_STAT_DD) {
    				/* Descriptor Done */
    
    				pr_info("%s[0x%03X]     %016llX %016llX %016llX %016llX ---------------- %p%s\n",
    					"RWB", i,
    					(unsigned long long)le64_to_cpu(u1->a),
    					(unsigned long long)le64_to_cpu(u1->b),
    					(unsigned long long)le64_to_cpu(u1->c),
    					(unsigned long long)le64_to_cpu(u1->d),
    					buffer_info->skb, next_desc);
    
    				pr_info("%s[0x%03X]     %016llX %016llX %016llX %016llX %016llX %p%s\n",
    					"R  ", i,
    					(unsigned long long)le64_to_cpu(u1->a),
    					(unsigned long long)le64_to_cpu(u1->b),
    					(unsigned long long)le64_to_cpu(u1->c),
    					(unsigned long long)le64_to_cpu(u1->d),
    					(unsigned long long)buffer_info->dma,
    					buffer_info->skb, next_desc);
    
    					e1000e_dump_ps_pages(adapter,
    							     buffer_info);
    
    		/* Extended Receive Descriptor (Read) Format
    
    		 *   +-----------------------------------------------------+
    		 * 0 |                Buffer Address [63:0]                |
    		 *   +-----------------------------------------------------+
    		 * 8 |                      Reserved                       |
    		 *   +-----------------------------------------------------+
    
    		pr_info("R  [desc]      [buf addr 63:0 ] [reserved 63:0 ] [bi->dma       ] [bi->skb] <-- Ext (Read) format\n");
    
    		/* Extended Receive Descriptor (Write-Back) Format
    		 *
    		 *   63       48 47    32 31    24 23            4 3        0
    		 *   +------------------------------------------------------+
    		 *   |     RSS Hash      |        |               |         |
    		 * 0 +-------------------+  Rsvd  |   Reserved    | MRQ RSS |
    		 *   | Packet   | IP     |        |               |  Type   |
    		 *   | Checksum | Ident  |        |               |         |
    		 *   +------------------------------------------------------+
    		 * 8 | VLAN Tag | Length | Extended Error | Extended Status |
    		 *   +------------------------------------------------------+
    		 *   63       48 47    32 31            20 19               0
    		 */
    
    		pr_info("RWB[desc]      [cs ipid    mrq] [vt   ln xe  xs] [bi->skb] <-- Ext (Write-Back) format\n");
    
    
    		for (i = 0; i < rx_ring->count; i++) {
    
    			const char *next_desc;
    
    
    			buffer_info = &rx_ring->buffer_info[i];
    
    			rx_desc = E1000_RX_DESC_EXT(*rx_ring, i);
    			u1 = (struct my_u1 *)rx_desc;
    			staterr = le32_to_cpu(rx_desc->wb.upper.status_error);
    
    
    			if (i == rx_ring->next_to_use)
    				next_desc = " NTU";
    			else if (i == rx_ring->next_to_clean)
    				next_desc = " NTC";
    			else
    				next_desc = "";
    
    
    			if (staterr & E1000_RXD_STAT_DD) {
    				/* Descriptor Done */
    
    				pr_info("%s[0x%03X]     %016llX %016llX ---------------- %p%s\n",
    					"RWB", i,
    					(unsigned long long)le64_to_cpu(u1->a),
    					(unsigned long long)le64_to_cpu(u1->b),
    					buffer_info->skb, next_desc);
    
    				pr_info("%s[0x%03X]     %016llX %016llX %016llX %p%s\n",
    					"R  ", i,
    					(unsigned long long)le64_to_cpu(u1->a),
    					(unsigned long long)le64_to_cpu(u1->b),
    					(unsigned long long)buffer_info->dma,
    					buffer_info->skb, next_desc);
    
    				if (netif_msg_pktdata(adapter) &&
    				    buffer_info->skb)
    
    					print_hex_dump(KERN_INFO, "",
    						       DUMP_PREFIX_ADDRESS, 16,
    						       1,
    
    						       adapter->rx_buffer_len,
    						       true);
    			}
    
    /**
     * e1000_desc_unused - calculate if we have unused descriptors
     **/
    static int e1000_desc_unused(struct e1000_ring *ring)
    {
    	if (ring->next_to_clean > ring->next_to_use)
    		return ring->next_to_clean - ring->next_to_use - 1;
    
    	return ring->count + ring->next_to_clean - ring->next_to_use - 1;
    }
    
    
    /**
     * e1000e_systim_to_hwtstamp - convert system time value to hw time stamp
     * @adapter: board private structure
     * @hwtstamps: time stamp structure to update
     * @systim: unsigned 64bit system time value.
     *
     * Convert the system time value stored in the RX/TXSTMP registers into a
     * hwtstamp which can be used by the upper level time stamping functions.
     *
     * The 'systim_lock' spinlock is used to protect the consistency of the
     * system time value. This is needed because reading the 64 bit time
     * value involves reading two 32 bit registers. The first read latches the
     * value.
     **/
    static void e1000e_systim_to_hwtstamp(struct e1000_adapter *adapter,
    				      struct skb_shared_hwtstamps *hwtstamps,
    				      u64 systim)
    {
    	u64 ns;
    	unsigned long flags;
    
    	spin_lock_irqsave(&adapter->systim_lock, flags);
    	ns = timecounter_cyc2time(&adapter->tc, systim);
    	spin_unlock_irqrestore(&adapter->systim_lock, flags);
    
    	memset(hwtstamps, 0, sizeof(*hwtstamps));
    	hwtstamps->hwtstamp = ns_to_ktime(ns);
    }
    
    /**
     * e1000e_rx_hwtstamp - utility function which checks for Rx time stamp
     * @adapter: board private structure
     * @status: descriptor extended error and status field
     * @skb: particular skb to include time stamp
     *
     * If the time stamp is valid, convert it into the timecounter ns value
     * and store that result into the shhwtstamps structure which is passed
     * up the network stack.
     **/
    static void e1000e_rx_hwtstamp(struct e1000_adapter *adapter, u32 status,
    			       struct sk_buff *skb)
    {
    	struct e1000_hw *hw = &adapter->hw;
    	u64 rxstmp;
    
    	if (!(adapter->flags & FLAG_HAS_HW_TIMESTAMP) ||
    	    !(status & E1000_RXDEXT_STATERR_TST) ||
    	    !(er32(TSYNCRXCTL) & E1000_TSYNCRXCTL_VALID))
    		return;
    
    	/* The Rx time stamp registers contain the time stamp.  No other
    	 * received packet will be time stamped until the Rx time stamp
    	 * registers are read.  Because only one packet can be time stamped
    	 * at a time, the register values must belong to this packet and
    	 * therefore none of the other additional attributes need to be
    	 * compared.
    	 */
    	rxstmp = (u64)er32(RXSTMPL);
    	rxstmp |= (u64)er32(RXSTMPH) << 32;
    	e1000e_systim_to_hwtstamp(adapter, skb_hwtstamps(skb), rxstmp);
    
    	adapter->flags2 &= ~FLAG2_CHECK_RX_HWTSTAMP;
    }
    
    
     * e1000_receive_skb - helper function to handle Rx indications
    
     * @adapter: board private structure
    
     * @staterr: descriptor extended error and status field as written by hardware
    
     * @vlan: descriptor vlan field as written by hardware (no le/be conversion)
     * @skb: pointer to sk_buff to be indicated to stack
     **/
    static void e1000_receive_skb(struct e1000_adapter *adapter,
    
    			      struct net_device *netdev, struct sk_buff *skb,
    
    	u16 tag = le16_to_cpu(vlan);
    
    
    	e1000e_rx_hwtstamp(adapter, staterr, skb);
    
    
    	skb->protocol = eth_type_trans(skb, netdev);
    
    
    	if (staterr & E1000_RXD_STAT_VP)
    
    		__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), tag);
    
    
    	napi_gro_receive(&adapter->napi, skb);
    
     * e1000_rx_checksum - Receive Checksum Offload
    
     * @adapter: board private structure
     * @status_err: receive descriptor status and error fields
     * @csum: receive descriptor csum field
     * @sk_buff: socket buffer with received data
    
     **/
    static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err,
    
    			      struct sk_buff *skb)
    
    {
    	u16 status = (u16)status_err;
    	u8 errors = (u8)(status_err >> 24);
    
    
    	skb_checksum_none_assert(skb);
    
    	/* Rx checksum disabled */
    	if (!(adapter->netdev->features & NETIF_F_RXCSUM))
    		return;
    
    
    	/* Ignore Checksum bit is set */
    	if (status & E1000_RXD_STAT_IXSM)
    		return;
    
    	/* TCP/UDP checksum error bit or IP checksum error bit is set */
    	if (errors & (E1000_RXD_ERR_TCPE | E1000_RXD_ERR_IPE)) {
    
    		/* let the stack verify checksum errors */
    		adapter->hw_csum_err++;
    		return;
    	}
    
    	/* TCP/UDP Checksum has not been calculated */
    	if (!(status & (E1000_RXD_STAT_TCPCS | E1000_RXD_STAT_UDPCS)))
    		return;
    
    	/* It must be a TCP or UDP packet with a valid checksum */
    
    	skb->ip_summed = CHECKSUM_UNNECESSARY;
    
    static void e1000e_update_rdt_wa(struct e1000_ring *rx_ring, unsigned int i)
    
    	struct e1000_adapter *adapter = rx_ring->adapter;
    
    	struct e1000_hw *hw = &adapter->hw;
    
    	s32 ret_val = __ew32_prepare(hw);
    
    	writel(i, rx_ring->tail);
    
    	if (unlikely(!ret_val && (i != readl(rx_ring->tail)))) {
    
    		u32 rctl = er32(RCTL);
    		ew32(RCTL, rctl & ~E1000_RCTL_EN);
    		e_err("ME firmware caused invalid RDT - resetting\n");
    		schedule_work(&adapter->reset_task);
    	}
    }
    
    
    static void e1000e_update_tdt_wa(struct e1000_ring *tx_ring, unsigned int i)
    
    	struct e1000_adapter *adapter = tx_ring->adapter;
    
    	struct e1000_hw *hw = &adapter->hw;
    
    	s32 ret_val = __ew32_prepare(hw);
    
    	writel(i, tx_ring->tail);
    
    	if (unlikely(!ret_val && (i != readl(tx_ring->tail)))) {
    
    		u32 tctl = er32(TCTL);
    		ew32(TCTL, tctl & ~E1000_TCTL_EN);
    		e_err("ME firmware caused invalid TDT - resetting\n");
    		schedule_work(&adapter->reset_task);
    	}
    }
    
    
     * e1000_alloc_rx_buffers - Replace used receive buffers
    
     * @rx_ring: Rx descriptor ring
    
    static void e1000_alloc_rx_buffers(struct e1000_ring *rx_ring,
    
    				   int cleaned_count, gfp_t gfp)
    
    	struct e1000_adapter *adapter = rx_ring->adapter;
    
    	struct net_device *netdev = adapter->netdev;
    	struct pci_dev *pdev = adapter->pdev;
    
    	union e1000_rx_desc_extended *rx_desc;
    
    	struct e1000_buffer *buffer_info;
    	struct sk_buff *skb;
    	unsigned int i;
    
    	unsigned int bufsz = adapter->rx_buffer_len;
    
    
    	i = rx_ring->next_to_use;
    	buffer_info = &rx_ring->buffer_info[i];
    
    	while (cleaned_count--) {
    		skb = buffer_info->skb;
    		if (skb) {
    			skb_trim(skb, 0);
    			goto map_skb;
    		}
    
    
    		skb = __netdev_alloc_skb_ip_align(netdev, bufsz, gfp);
    
    		if (!skb) {
    			/* Better luck next round */
    			adapter->alloc_rx_buff_failed++;
    			break;
    		}
    
    		buffer_info->skb = skb;
    map_skb:
    
    		buffer_info->dma = dma_map_single(&pdev->dev, skb->data,
    
    						  DMA_FROM_DEVICE);
    		if (dma_mapping_error(&pdev->dev, buffer_info->dma)) {
    
    			dev_err(&pdev->dev, "Rx DMA map failed\n");
    
    		rx_desc = E1000_RX_DESC_EXT(*rx_ring, i);
    		rx_desc->read.buffer_addr = cpu_to_le64(buffer_info->dma);
    
    		if (unlikely(!(i & (E1000_RX_BUFFER_WRITE - 1)))) {
    
    			/* Force memory writes to complete before letting h/w
    
    			 * know there are new descriptors to fetch.  (Only
    			 * applicable for weak-ordered memory model archs,
    			 * such as IA-64).
    			 */
    			wmb();
    
    			if (adapter->flags2 & FLAG2_PCIM2PCI_ARBITER_WA)
    
    				e1000e_update_rdt_wa(rx_ring, i);
    
    		i++;
    		if (i == rx_ring->count)
    			i = 0;
    		buffer_info = &rx_ring->buffer_info[i];
    	}
    
    
    	rx_ring->next_to_use = i;
    
    }
    
    /**
     * e1000_alloc_rx_buffers_ps - Replace used receive buffers; packet split
    
     * @rx_ring: Rx descriptor ring
    
    static void e1000_alloc_rx_buffers_ps(struct e1000_ring *rx_ring,
    
    				      int cleaned_count, gfp_t gfp)
    
    	struct e1000_adapter *adapter = rx_ring->adapter;
    
    	struct net_device *netdev = adapter->netdev;
    	struct pci_dev *pdev = adapter->pdev;
    	union e1000_rx_desc_packet_split *rx_desc;
    	struct e1000_buffer *buffer_info;
    	struct e1000_ps_page *ps_page;
    	struct sk_buff *skb;
    	unsigned int i, j;
    
    	i = rx_ring->next_to_use;
    	buffer_info = &rx_ring->buffer_info[i];
    
    	while (cleaned_count--) {
    		rx_desc = E1000_RX_DESC_PS(*rx_ring, i);
    
    		for (j = 0; j < PS_PAGE_BUFFERS; j++) {
    
    			ps_page = &buffer_info->ps_pages[j];
    			if (j >= adapter->rx_ps_pages) {
    				/* all unused desc entries get hw null ptr */
    
    				rx_desc->read.buffer_addr[j + 1] =
    				    ~cpu_to_le64(0);
    
    				continue;
    			}
    			if (!ps_page->page) {
    
    				ps_page->page = alloc_page(gfp);
    
    					adapter->alloc_rx_buff_failed++;
    					goto no_buffers;
    				}
    
    				ps_page->dma = dma_map_page(&pdev->dev,
    							    ps_page->page,
    							    0, PAGE_SIZE,
    							    DMA_FROM_DEVICE);
    				if (dma_mapping_error(&pdev->dev,
    						      ps_page->dma)) {
    
    					dev_err(&adapter->pdev->dev,
    
    						"Rx DMA page map failed\n");
    
    					adapter->rx_dma_failed++;
    					goto no_buffers;
    
    			/* Refresh the desc even if buffer_addrs
    
    			 * didn't change because each write-back
    			 * erases this info.
    			 */
    
    			rx_desc->read.buffer_addr[j + 1] =
    			    cpu_to_le64(ps_page->dma);
    
    		skb = __netdev_alloc_skb_ip_align(netdev, adapter->rx_ps_bsize0,
    
    
    		if (!skb) {
    			adapter->alloc_rx_buff_failed++;
    			break;
    		}
    
    		buffer_info->skb = skb;
    
    		buffer_info->dma = dma_map_single(&pdev->dev, skb->data,
    
    						  DMA_FROM_DEVICE);
    		if (dma_mapping_error(&pdev->dev, buffer_info->dma)) {
    
    			dev_err(&pdev->dev, "Rx DMA map failed\n");
    
    			adapter->rx_dma_failed++;
    			/* cleanup skb */
    			dev_kfree_skb_any(skb);
    			buffer_info->skb = NULL;
    			break;
    		}
    
    		rx_desc->read.buffer_addr[0] = cpu_to_le64(buffer_info->dma);
    
    
    		if (unlikely(!(i & (E1000_RX_BUFFER_WRITE - 1)))) {
    
    			/* Force memory writes to complete before letting h/w
    
    			 * know there are new descriptors to fetch.  (Only
    			 * applicable for weak-ordered memory model archs,
    			 * such as IA-64).
    			 */
    			wmb();
    
    			if (adapter->flags2 & FLAG2_PCIM2PCI_ARBITER_WA)
    
    				e1000e_update_rdt_wa(rx_ring, i << 1);
    
    		i++;
    		if (i == rx_ring->count)
    			i = 0;
    		buffer_info = &rx_ring->buffer_info[i];
    	}
    
    no_buffers:
    
    	rx_ring->next_to_use = i;
    
    /**
     * e1000_alloc_jumbo_rx_buffers - Replace used jumbo receive buffers
    
     * @rx_ring: Rx descriptor ring
    
     * @cleaned_count: number of buffers to allocate this pass
     **/
    
    
    static void e1000_alloc_jumbo_rx_buffers(struct e1000_ring *rx_ring,
    
    					 int cleaned_count, gfp_t gfp)
    
    	struct e1000_adapter *adapter = rx_ring->adapter;
    
    	struct net_device *netdev = adapter->netdev;
    	struct pci_dev *pdev = adapter->pdev;
    
    	union e1000_rx_desc_extended *rx_desc;
    
    	struct e1000_buffer *buffer_info;
    	struct sk_buff *skb;
    	unsigned int i;
    
    	unsigned int bufsz = 256 - 16;	/* for skb_reserve */
    
    
    	i = rx_ring->next_to_use;
    	buffer_info = &rx_ring->buffer_info[i];
    
    	while (cleaned_count--) {
    		skb = buffer_info->skb;
    		if (skb) {
    			skb_trim(skb, 0);
    			goto check_page;
    		}
    
    
    		skb = __netdev_alloc_skb_ip_align(netdev, bufsz, gfp);
    
    		if (unlikely(!skb)) {
    			/* Better luck next round */
    			adapter->alloc_rx_buff_failed++;
    			break;
    		}
    
    		buffer_info->skb = skb;
    check_page:
    		/* allocate a new page if necessary */
    		if (!buffer_info->page) {
    
    			buffer_info->page = alloc_page(gfp);
    
    			if (unlikely(!buffer_info->page)) {
    				adapter->alloc_rx_buff_failed++;
    				break;
    			}
    		}
    
    
    			buffer_info->dma = dma_map_page(&pdev->dev,
    
    							buffer_info->page, 0,
    							PAGE_SIZE,
    
    							DMA_FROM_DEVICE);
    
    			if (dma_mapping_error(&pdev->dev, buffer_info->dma)) {
    				adapter->alloc_rx_buff_failed++;
    				break;
    			}
    		}
    
    		rx_desc = E1000_RX_DESC_EXT(*rx_ring, i);
    		rx_desc->read.buffer_addr = cpu_to_le64(buffer_info->dma);
    
    
    		if (unlikely(++i == rx_ring->count))
    			i = 0;
    		buffer_info = &rx_ring->buffer_info[i];
    	}
    
    	if (likely(rx_ring->next_to_use != i)) {
    		rx_ring->next_to_use = i;
    		if (unlikely(i-- == 0))
    			i = (rx_ring->count - 1);
    
    		/* Force memory writes to complete before letting h/w
    		 * know there are new descriptors to fetch.  (Only
    		 * applicable for weak-ordered memory model archs,
    
    		 * such as IA-64).
    		 */
    
    		if (adapter->flags2 & FLAG2_PCIM2PCI_ARBITER_WA)
    
    			e1000e_update_rdt_wa(rx_ring, i);
    
    static inline void e1000_rx_hash(struct net_device *netdev, __le32 rss,
    				 struct sk_buff *skb)
    {
    	if (netdev->features & NETIF_F_RXHASH)
    		skb->rxhash = le32_to_cpu(rss);
    }
    
    
     * e1000_clean_rx_irq - Send received data up the network stack
     * @rx_ring: Rx descriptor ring
    
     *
     * the return value indicates whether actual cleaning was done, there
     * is no guarantee that everything was cleaned
     **/
    
    static bool e1000_clean_rx_irq(struct e1000_ring *rx_ring, int *work_done,
    			       int work_to_do)
    
    	struct e1000_adapter *adapter = rx_ring->adapter;
    
    	struct net_device *netdev = adapter->netdev;
    	struct pci_dev *pdev = adapter->pdev;
    
    	struct e1000_hw *hw = &adapter->hw;
    
    	union e1000_rx_desc_extended *rx_desc, *next_rxd;
    
    	struct e1000_buffer *buffer_info, *next_buffer;
    
    	u32 length, staterr;
    
    	unsigned int i;
    	int cleaned_count = 0;
    
    	bool cleaned = false;
    
    	unsigned int total_rx_bytes = 0, total_rx_packets = 0;
    
    	i = rx_ring->next_to_clean;
    
    	rx_desc = E1000_RX_DESC_EXT(*rx_ring, i);
    	staterr = le32_to_cpu(rx_desc->wb.upper.status_error);
    
    	buffer_info = &rx_ring->buffer_info[i];
    
    
    	while (staterr & E1000_RXD_STAT_DD) {
    
    		struct sk_buff *skb;
    
    		if (*work_done >= work_to_do)
    			break;
    		(*work_done)++;
    
    		rmb();	/* read descriptor and rx_buffer_info after status DD */
    
    
    		skb = buffer_info->skb;
    		buffer_info->skb = NULL;
    
    		prefetch(skb->data - NET_IP_ALIGN);
    
    		i++;
    		if (i == rx_ring->count)
    			i = 0;
    
    		next_rxd = E1000_RX_DESC_EXT(*rx_ring, i);
    
    		prefetch(next_rxd);
    
    		next_buffer = &rx_ring->buffer_info[i];
    
    
    		dma_unmap_single(&pdev->dev, buffer_info->dma,
    				 adapter->rx_buffer_len, DMA_FROM_DEVICE);
    
    		length = le16_to_cpu(rx_desc->wb.upper.length);
    
    		/* !EOP means multiple descriptors were used to store a single
    
    		 * packet, if that's the case we need to toss it.  In fact, we
    		 * need to toss every packet with the EOP bit clear and the
    		 * next frame that _does_ have the EOP bit set, as it is by
    		 * definition only a frame fragment
    		 */
    
    		if (unlikely(!(staterr & E1000_RXD_STAT_EOP)))
    
    			adapter->flags2 |= FLAG2_IS_DISCARDING;
    
    		if (adapter->flags2 & FLAG2_IS_DISCARDING) {
    
    			/* All receives must fit into a single buffer */
    
    			e_dbg("Receive packet consumed multiple buffers\n");
    
    			/* recycle */
    			buffer_info->skb = skb;
    
    			if (staterr & E1000_RXD_STAT_EOP)
    
    				adapter->flags2 &= ~FLAG2_IS_DISCARDING;
    
    		if (unlikely((staterr & E1000_RXDEXT_ERR_FRAME_ERR_MASK) &&
    			     !(netdev->features & NETIF_F_RXALL))) {
    
    			/* recycle */
    			buffer_info->skb = skb;
    			goto next_desc;
    		}
    
    
    Jeff Kirsher's avatar
    Jeff Kirsher committed
    		/* adjust length to remove Ethernet CRC */
    
    		if (!(adapter->flags2 & FLAG2_CRC_STRIPPING)) {
    			/* If configured to store CRC, don't subtract FCS,
    			 * but keep the FCS bytes out of the total_rx_bytes
    			 * counter
    			 */
    			if (netdev->features & NETIF_F_RXFCS)
    				total_rx_bytes -= 4;
    			else
    				length -= 4;
    		}
    
    		total_rx_bytes += length;
    		total_rx_packets++;
    
    
    		/* code added for copybreak, this should improve
    
    		 * performance for small packets with large amounts
    
    		 * of reassembly being done in the stack
    		 */
    
    		if (length < copybreak) {
    			struct sk_buff *new_skb =
    
    			    netdev_alloc_skb_ip_align(netdev, length);
    
    				skb_copy_to_linear_data_offset(new_skb,
    							       -NET_IP_ALIGN,
    							       (skb->data -
    								NET_IP_ALIGN),
    							       (length +
    								NET_IP_ALIGN));
    
    				/* save the skb in buffer_info as good */
    				buffer_info->skb = skb;
    				skb = new_skb;
    			}
    			/* else just continue with the old one */
    		}