6329 lines · 173.6 KB · C
RawDownload
/*******************************************************************************   Intel PRO/1000 Linux driver  Copyright(c) 1999 - 2011 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.   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.,  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.   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/tcp.h>#include <linux/ipv6.h>#include <linux/slab.h>#include <net/checksum.h>#include <net/ip6_checksum.h>#include <linux/mii.h>#include <linux/ethtool.h>#include <linux/if_vlan.h>#include <linux/cpu.h>#include <linux/smp.h>#include <linux/pm_qos_params.h>#include <linux/pm_runtime.h>#include <linux/aer.h>#include <linux/prefetch.h> #include "e1000.h" #define DRV_EXTRAVERSION "-k2" #define DRV_VERSION "1.3.10" DRV_EXTRAVERSIONchar e1000e_driver_name[] = "e1000e";const char e1000e_driver_version[] = DRV_VERSION; static void e1000e_disable_aspm(struct pci_dev *pdev, u16 state); 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,}; struct e1000_reg_info {	u32 ofs;	char *name;}; #define E1000_RDFH	0x02410	/* Rx Data FIFO Head - RW */#define E1000_RDFT	0x02418	/* Rx Data FIFO Tail - RW */#define E1000_RDFHS	0x02420	/* Rx Data FIFO Head Saved - RW */#define E1000_RDFTS	0x02428	/* Rx Data FIFO Tail Saved - RW */#define E1000_RDFPC	0x02430	/* Rx Data FIFO Packet Count - RW */ #define E1000_TDFH	0x03410	/* Tx Data FIFO Head - RW */#define E1000_TDFT	0x03418	/* Tx Data FIFO Tail - RW */#define E1000_TDFHS	0x03420	/* Tx Data FIFO Head Saved - RW */#define E1000_TDFTS	0x03428	/* Tx Data FIFO Tail Saved - RW */#define E1000_TDFPC	0x03430	/* Tx Data FIFO Packet Count - RW */ 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"}, 	/* Rx Registers */	{E1000_RCTL, "RCTL"},	{E1000_RDLEN, "RDLEN"},	{E1000_RDH, "RDH"},	{E1000_RDT, "RDT"},	{E1000_RDTR, "RDTR"},	{E1000_RXDCTL(0), "RXDCTL"},	{E1000_ERT, "ERT"},	{E1000_RDBAL, "RDBAL"},	{E1000_RDBAH, "RDBAH"},	{E1000_RDFH, "RDFH"},	{E1000_RDFT, "RDFT"},	{E1000_RDFHS, "RDFHS"},	{E1000_RDFTS, "RDFTS"},	{E1000_RDFPC, "RDFPC"}, 	/* Tx Registers */	{E1000_TCTL, "TCTL"},	{E1000_TDBAL, "TDBAL"},	{E1000_TDBAH, "TDBAH"},	{E1000_TDLEN, "TDLEN"},	{E1000_TDH, "TDH"},	{E1000_TDT, "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 */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:		printk(KERN_INFO "%-15s %08x\n",		       reginfo->name, __er32(hw, reginfo->ofs));		return;	} 	snprintf(rname, 16, "%s%s", reginfo->name, "[0-1]");	printk(KERN_INFO "%-15s ", rname);	for (n = 0; n < 2; n++)		printk(KERN_CONT "%08x ", regs[n]);	printk(KERN_CONT "\n");} /* * e1000e_dump - Print registers, Tx-ring and Rx-ring */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 my_u0 {		u64 a;		u64 b;	} *u0;	struct e1000_buffer *buffer_info;	struct e1000_ring *rx_ring = adapter->rx_ring;	union e1000_rx_desc_packet_split *rx_desc_ps;	struct e1000_rx_desc *rx_desc;	struct my_u1 {		u64 a;		u64 b;		u64 c;		u64 d;	} *u1;	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");		printk(KERN_INFO "Device Name     state            "		       "trans_start      last_rx\n");		printk(KERN_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");	printk(KERN_INFO " Register Name   Value\n");	for (reginfo = (struct e1000_reg_info *)e1000_reg_info_tbl;	     reginfo->name; reginfo++) {		e1000_regdump(hw, reginfo);	} 	/* Print Tx Ring Summary */	if (!netdev || !netif_running(netdev))		goto exit; 	dev_info(&adapter->pdev->dev, "Tx Ring Summary\n");	printk(KERN_INFO "Queue [NTU] [NTC] [bi(ntc)->dma  ]"	       " leng ntw timestamp\n");	buffer_info = &tx_ring->buffer_info[tx_ring->next_to_clean];	printk(KERN_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); 	/* Print Tx Ring */	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	 */	printk(KERN_INFO "Tl[desc]     [address 63:0  ] [SpeCssSCmCsLen]"	       " [bi->dma       ] leng  ntw timestamp        bi->skb "	       "<-- Legacy format\n");	printk(KERN_INFO "Tc[desc]     [Ce CoCsIpceCoS] [MssHlRSCm0Plen]"	       " [bi->dma       ] leng  ntw timestamp        bi->skb "	       "<-- Ext Context format\n");	printk(KERN_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++) {		tx_desc = E1000_TX_DESC(*tx_ring, i);		buffer_info = &tx_ring->buffer_info[i];		u0 = (struct my_u0 *)tx_desc;		printk(KERN_INFO "T%c[0x%03X]    %016llX %016llX %016llX "		       "%04X  %3X %016llX %p",		       (!(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);		if (i == tx_ring->next_to_use && i == tx_ring->next_to_clean)			printk(KERN_CONT " NTC/U\n");		else if (i == tx_ring->next_to_use)			printk(KERN_CONT " NTU\n");		else if (i == tx_ring->next_to_clean)			printk(KERN_CONT " NTC\n");		else			printk(KERN_CONT "\n"); 		if (netif_msg_pktdata(adapter) && buffer_info->dma != 0)			print_hex_dump(KERN_INFO, "", DUMP_PREFIX_ADDRESS,				       16, 1, phys_to_virt(buffer_info->dma),				       buffer_info->length, true);	} 	/* Print Rx Ring Summary */rx_ring_summary:	dev_info(&adapter->pdev->dev, "Rx Ring Summary\n");	printk(KERN_INFO "Queue [NTU] [NTC]\n");	printk(KERN_INFO " %5d %5X %5X\n", 0,	       rx_ring->next_to_use, rx_ring->next_to_clean); 	/* Print Rx Ring */	if (!netif_msg_rx_status(adapter))		goto exit; 	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]              |		 *    +-----------------------------------------------------+		 */		printk(KERN_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		 */		printk(KERN_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++) {			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 (staterr & E1000_RXD_STAT_DD) {				/* Descriptor Done */				printk(KERN_INFO "RWB[0x%03X]     %016llX "				       "%016llX %016llX %016llX "				       "---------------- %p", 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);			} else {				printk(KERN_INFO "R  [0x%03X]     %016llX "				       "%016llX %016llX %016llX %016llX %p", 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); 				if (netif_msg_pktdata(adapter))					print_hex_dump(KERN_INFO, "",						DUMP_PREFIX_ADDRESS, 16, 1,						phys_to_virt(buffer_info->dma),						adapter->rx_ps_bsize0, true);			} 			if (i == rx_ring->next_to_use)				printk(KERN_CONT " NTU\n");			else if (i == rx_ring->next_to_clean)				printk(KERN_CONT " NTC\n");			else				printk(KERN_CONT "\n");		}		break;	default:	case 0:		/* Legacy Receive Descriptor Format		 *		 * +-----------------------------------------------------+		 * |                Buffer Address [63:0]                |		 * +-----------------------------------------------------+		 * | VLAN Tag | Errors | Status 0 | Packet csum | Length |		 * +-----------------------------------------------------+		 * 63       48 47    40 39      32 31         16 15      0		 */		printk(KERN_INFO "Rl[desc]     [address 63:0  ] "		       "[vl er S cks ln] [bi->dma       ] [bi->skb] "		       "<-- Legacy format\n");		for (i = 0; rx_ring->desc && (i < rx_ring->count); i++) {			rx_desc = E1000_RX_DESC(*rx_ring, i);			buffer_info = &rx_ring->buffer_info[i];			u0 = (struct my_u0 *)rx_desc;			printk(KERN_INFO "Rl[0x%03X]    %016llX %016llX "			       "%016llX %p", 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->skb);			if (i == rx_ring->next_to_use)				printk(KERN_CONT " NTU\n");			else if (i == rx_ring->next_to_clean)				printk(KERN_CONT " NTC\n");			else				printk(KERN_CONT "\n"); 			if (netif_msg_pktdata(adapter))				print_hex_dump(KERN_INFO, "",					       DUMP_PREFIX_ADDRESS,					       16, 1,					       phys_to_virt(buffer_info->dma),					       adapter->rx_buffer_len, true);		}	} exit:	return;} /** * 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;} /** * e1000_receive_skb - helper function to handle Rx indications * @adapter: board private structure * @status: descriptor 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,			      u8 status, __le16 vlan){	u16 tag = le16_to_cpu(vlan);	skb->protocol = eth_type_trans(skb, netdev); 	if (status & E1000_RXD_STAT_VP)		__vlan_hwaccel_put_tag(skb, 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,			      u32 csum, struct sk_buff *skb){	u16 status = (u16)status_err;	u8 errors = (u8)(status_err >> 24); 	skb_checksum_none_assert(skb); 	/* Ignore Checksum bit is set */	if (status & E1000_RXD_STAT_IXSM)		return;	/* TCP/UDP checksum error bit is set */	if (errors & E1000_RXD_ERR_TCPE) {		/* 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)))

Lines 1–500 of 6329.