|
|
|
@ -77,17 +77,17 @@ struct e1000_reg_info {
|
|
|
|
|
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_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 */
|
|
|
|
|
#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[] = {
|
|
|
|
|
|
|
|
|
@ -99,7 +99,7 @@ static const struct e1000_reg_info e1000_reg_info_tbl[] = {
|
|
|
|
|
/* Interrupt Registers */
|
|
|
|
|
{E1000_ICR, "ICR"},
|
|
|
|
|
|
|
|
|
|
/* RX Registers */
|
|
|
|
|
/* Rx Registers */
|
|
|
|
|
{E1000_RCTL, "RCTL"},
|
|
|
|
|
{E1000_RDLEN, "RDLEN"},
|
|
|
|
|
{E1000_RDH, "RDH"},
|
|
|
|
@ -115,7 +115,7 @@ static const struct e1000_reg_info e1000_reg_info_tbl[] = {
|
|
|
|
|
{E1000_RDFTS, "RDFTS"},
|
|
|
|
|
{E1000_RDFPC, "RDFPC"},
|
|
|
|
|
|
|
|
|
|
/* TX Registers */
|
|
|
|
|
/* Tx Registers */
|
|
|
|
|
{E1000_TCTL, "TCTL"},
|
|
|
|
|
{E1000_TDBAL, "TDBAL"},
|
|
|
|
|
{E1000_TDBAH, "TDBAH"},
|
|
|
|
@ -160,7 +160,7 @@ static void e1000_regdump(struct e1000_hw *hw, struct e1000_reg_info *reginfo)
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
printk(KERN_INFO "%-15s %08x\n",
|
|
|
|
|
reginfo->name, __er32(hw, reginfo->ofs));
|
|
|
|
|
reginfo->name, __er32(hw, reginfo->ofs));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -171,9 +171,8 @@ static void e1000_regdump(struct e1000_hw *hw, struct e1000_reg_info *reginfo)
|
|
|
|
|
printk(KERN_CONT "\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* e1000e_dump - Print registers, tx-ring and rx-ring
|
|
|
|
|
* e1000e_dump - Print registers, Tx-ring and Rx-ring
|
|
|
|
|
*/
|
|
|
|
|
static void e1000e_dump(struct e1000_adapter *adapter)
|
|
|
|
|
{
|
|
|
|
@ -182,12 +181,20 @@ static void e1000e_dump(struct e1000_adapter *adapter)
|
|
|
|
|
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 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;
|
|
|
|
|
struct my_u1 {
|
|
|
|
|
u64 a;
|
|
|
|
|
u64 b;
|
|
|
|
|
u64 c;
|
|
|
|
|
u64 d;
|
|
|
|
|
} *u1;
|
|
|
|
|
u32 staterr;
|
|
|
|
|
int i = 0;
|
|
|
|
|
|
|
|
|
@ -198,12 +205,10 @@ static void e1000e_dump(struct e1000_adapter *adapter)
|
|
|
|
|
if (netdev) {
|
|
|
|
|
dev_info(&adapter->pdev->dev, "Net device Info\n");
|
|
|
|
|
printk(KERN_INFO "Device Name state "
|
|
|
|
|
"trans_start last_rx\n");
|
|
|
|
|
"trans_start last_rx\n");
|
|
|
|
|
printk(KERN_INFO "%-15s %016lX %016lX %016lX\n",
|
|
|
|
|
netdev->name,
|
|
|
|
|
netdev->state,
|
|
|
|
|
netdev->trans_start,
|
|
|
|
|
netdev->last_rx);
|
|
|
|
|
netdev->name, netdev->state, netdev->trans_start,
|
|
|
|
|
netdev->last_rx);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Print Registers */
|
|
|
|
@ -214,26 +219,26 @@ static void e1000e_dump(struct e1000_adapter *adapter)
|
|
|
|
|
e1000_regdump(hw, reginfo);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Print TX Ring Summary */
|
|
|
|
|
/* Print Tx Ring Summary */
|
|
|
|
|
if (!netdev || !netif_running(netdev))
|
|
|
|
|
goto exit;
|
|
|
|
|
|
|
|
|
|
dev_info(&adapter->pdev->dev, "TX Rings Summary\n");
|
|
|
|
|
dev_info(&adapter->pdev->dev, "Tx Ring Summary\n");
|
|
|
|
|
printk(KERN_INFO "Queue [NTU] [NTC] [bi(ntc)->dma ]"
|
|
|
|
|
" leng ntw timestamp\n");
|
|
|
|
|
" 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);
|
|
|
|
|
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 Rings */
|
|
|
|
|
/* Print Tx Ring */
|
|
|
|
|
if (!netif_msg_tx_done(adapter))
|
|
|
|
|
goto rx_ring_summary;
|
|
|
|
|
|
|
|
|
|
dev_info(&adapter->pdev->dev, "TX Rings Dump\n");
|
|
|
|
|
dev_info(&adapter->pdev->dev, "Tx Ring Dump\n");
|
|
|
|
|
|
|
|
|
|
/* Transmit Descriptor Formats - DEXT[29] is 0 (Legacy) or 1 (Extended)
|
|
|
|
|
*
|
|
|
|
@ -263,22 +268,22 @@ static void e1000e_dump(struct e1000_adapter *adapter)
|
|
|
|
|
* 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");
|
|
|
|
|
" [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");
|
|
|
|
|
" [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");
|
|
|
|
|
" [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,
|
|
|
|
|
"%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,
|
|
|
|
@ -296,22 +301,22 @@ static void e1000e_dump(struct e1000_adapter *adapter)
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
16, 1, phys_to_virt(buffer_info->dma),
|
|
|
|
|
buffer_info->length, true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Print RX Rings Summary */
|
|
|
|
|
/* Print Rx Ring Summary */
|
|
|
|
|
rx_ring_summary:
|
|
|
|
|
dev_info(&adapter->pdev->dev, "RX Rings Summary\n");
|
|
|
|
|
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);
|
|
|
|
|
rx_ring->next_to_use, rx_ring->next_to_clean);
|
|
|
|
|
|
|
|
|
|
/* Print RX Rings */
|
|
|
|
|
/* Print Rx Ring */
|
|
|
|
|
if (!netif_msg_rx_status(adapter))
|
|
|
|
|
goto exit;
|
|
|
|
|
|
|
|
|
|
dev_info(&adapter->pdev->dev, "RX Rings Dump\n");
|
|
|
|
|
dev_info(&adapter->pdev->dev, "Rx Ring Dump\n");
|
|
|
|
|
switch (adapter->rx_ps_pages) {
|
|
|
|
|
case 1:
|
|
|
|
|
case 2:
|
|
|
|
@ -329,7 +334,7 @@ rx_ring_summary:
|
|
|
|
|
* +-----------------------------------------------------+
|
|
|
|
|
*/
|
|
|
|
|
printk(KERN_INFO "R [desc] [buffer 0 63:0 ] "
|
|
|
|
|
"[buffer 1 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
|
|
|
|
@ -344,7 +349,7 @@ rx_ring_summary:
|
|
|
|
|
* 63 48 47 32 31 20 19 0
|
|
|
|
|
*/
|
|
|
|
|
printk(KERN_INFO "RWB[desc] [ck ipid mrqhsh] "
|
|
|
|
|
"[vl l0 ee es] "
|
|
|
|
|
"[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++) {
|
|
|
|
@ -352,26 +357,26 @@ rx_ring_summary:
|
|
|
|
|
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);
|
|
|
|
|
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);
|
|
|
|
|
"%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);
|
|
|
|
|
"%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, "",
|
|
|
|
@ -400,18 +405,18 @@ rx_ring_summary:
|
|
|
|
|
* 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");
|
|
|
|
|
"[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);
|
|
|
|
|
"%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)
|
|
|
|
@ -421,9 +426,10 @@ rx_ring_summary:
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
DUMP_PREFIX_ADDRESS,
|
|
|
|
|
16, 1,
|
|
|
|
|
phys_to_virt(buffer_info->dma),
|
|
|
|
|
adapter->rx_buffer_len, true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -450,8 +456,7 @@ static int e1000_desc_unused(struct e1000_ring *ring)
|
|
|
|
|
* @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,
|
|
|
|
|
struct net_device *netdev, struct sk_buff *skb,
|
|
|
|
|
u8 status, __le16 vlan)
|
|
|
|
|
{
|
|
|
|
|
skb->protocol = eth_type_trans(skb, netdev);
|
|
|
|
@ -464,7 +469,7 @@ static void e1000_receive_skb(struct e1000_adapter *adapter,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* e1000_rx_checksum - Receive Checksum Offload for 82543
|
|
|
|
|
* e1000_rx_checksum - Receive Checksum Offload
|
|
|
|
|
* @adapter: board private structure
|
|
|
|
|
* @status_err: receive descriptor status and error fields
|
|
|
|
|
* @csum: receive descriptor csum field
|
|
|
|
@ -548,7 +553,7 @@ map_skb:
|
|
|
|
|
adapter->rx_buffer_len,
|
|
|
|
|
DMA_FROM_DEVICE);
|
|
|
|
|
if (dma_mapping_error(&pdev->dev, buffer_info->dma)) {
|
|
|
|
|
dev_err(&pdev->dev, "RX DMA map failed\n");
|
|
|
|
|
dev_err(&pdev->dev, "Rx DMA map failed\n");
|
|
|
|
|
adapter->rx_dma_failed++;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
@ -601,7 +606,8 @@ static void e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter,
|
|
|
|
|
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);
|
|
|
|
|
rx_desc->read.buffer_addr[j + 1] =
|
|
|
|
|
~cpu_to_le64(0);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if (!ps_page->page) {
|
|
|
|
@ -617,7 +623,7 @@ static void e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter,
|
|
|
|
|
if (dma_mapping_error(&pdev->dev,
|
|
|
|
|
ps_page->dma)) {
|
|
|
|
|
dev_err(&adapter->pdev->dev,
|
|
|
|
|
"RX DMA page map failed\n");
|
|
|
|
|
"Rx DMA page map failed\n");
|
|
|
|
|
adapter->rx_dma_failed++;
|
|
|
|
|
goto no_buffers;
|
|
|
|
|
}
|
|
|
|
@ -627,8 +633,8 @@ static void e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter,
|
|
|
|
|
* didn't change because each write-back
|
|
|
|
|
* erases this info.
|
|
|
|
|
*/
|
|
|
|
|
rx_desc->read.buffer_addr[j+1] =
|
|
|
|
|
cpu_to_le64(ps_page->dma);
|
|
|
|
|
rx_desc->read.buffer_addr[j + 1] =
|
|
|
|
|
cpu_to_le64(ps_page->dma);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
skb = netdev_alloc_skb_ip_align(netdev,
|
|
|
|
@ -644,7 +650,7 @@ static void e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter,
|
|
|
|
|
adapter->rx_ps_bsize0,
|
|
|
|
|
DMA_FROM_DEVICE);
|
|
|
|
|
if (dma_mapping_error(&pdev->dev, buffer_info->dma)) {
|
|
|
|
|
dev_err(&pdev->dev, "RX DMA map failed\n");
|
|
|
|
|
dev_err(&pdev->dev, "Rx DMA map failed\n");
|
|
|
|
|
adapter->rx_dma_failed++;
|
|
|
|
|
/* cleanup skb */
|
|
|
|
|
dev_kfree_skb_any(skb);
|
|
|
|
@ -662,7 +668,7 @@ static void e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter,
|
|
|
|
|
* such as IA-64).
|
|
|
|
|
*/
|
|
|
|
|
wmb();
|
|
|
|
|
writel(i<<1, adapter->hw.hw_addr + rx_ring->tail);
|
|
|
|
|
writel(i << 1, adapter->hw.hw_addr + rx_ring->tail);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
i++;
|
|
|
|
@ -1106,11 +1112,10 @@ static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
|
|
|
|
|
cleaned = 1;
|
|
|
|
|
cleaned_count++;
|
|
|
|
|
dma_unmap_single(&pdev->dev, buffer_info->dma,
|
|
|
|
|
adapter->rx_ps_bsize0,
|
|
|
|
|
DMA_FROM_DEVICE);
|
|
|
|
|
adapter->rx_ps_bsize0, DMA_FROM_DEVICE);
|
|
|
|
|
buffer_info->dma = 0;
|
|
|
|
|
|
|
|
|
|
/* see !EOP comment in other rx routine */
|
|
|
|
|
/* see !EOP comment in other Rx routine */
|
|
|
|
|
if (!(staterr & E1000_RXD_STAT_EOP))
|
|
|
|
|
adapter->flags2 |= FLAG2_IS_DISCARDING;
|
|
|
|
|
|
|
|
|
@ -2610,7 +2615,7 @@ static void e1000_init_manageability_pt(struct e1000_adapter *adapter)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* e1000_configure_tx - Configure 8254x Transmit Unit after Reset
|
|
|
|
|
* e1000_configure_tx - Configure Transmit Unit after Reset
|
|
|
|
|
* @adapter: board private structure
|
|
|
|
|
*
|
|
|
|
|
* Configure the Tx unit of the MAC after a reset.
|
|
|
|
@ -2663,7 +2668,7 @@ static void e1000_configure_tx(struct e1000_adapter *adapter)
|
|
|
|
|
* hthresh = 1 ==> prefetch when one or more available
|
|
|
|
|
* pthresh = 0x1f ==> prefetch if internal cache 31 or less
|
|
|
|
|
* BEWARE: this seems to work but should be considered first if
|
|
|
|
|
* there are tx hangs or other tx related bugs
|
|
|
|
|
* there are Tx hangs or other Tx related bugs
|
|
|
|
|
*/
|
|
|
|
|
txdctl |= E1000_TXDCTL_DMA_BURST_ENABLE;
|
|
|
|
|
ew32(TXDCTL(0), txdctl);
|
|
|
|
@ -2877,7 +2882,7 @@ static void e1000_configure_rx(struct e1000_adapter *adapter)
|
|
|
|
|
if (adapter->rx_ps_pages) {
|
|
|
|
|
/* this is a 32 byte descriptor */
|
|
|
|
|
rdlen = rx_ring->count *
|
|
|
|
|
sizeof(union e1000_rx_desc_packet_split);
|
|
|
|
|
sizeof(union e1000_rx_desc_packet_split);
|
|
|
|
|
adapter->clean_rx = e1000_clean_rx_irq_ps;
|
|
|
|
|
adapter->alloc_rx_buf = e1000_alloc_rx_buffers_ps;
|
|
|
|
|
} else if (adapter->netdev->mtu > ETH_FRAME_LEN + ETH_FCS_LEN) {
|
|
|
|
@ -2900,7 +2905,7 @@ static void e1000_configure_rx(struct e1000_adapter *adapter)
|
|
|
|
|
/*
|
|
|
|
|
* set the writeback threshold (only takes effect if the RDTR
|
|
|
|
|
* is set). set GRAN=1 and write back up to 0x4 worth, and
|
|
|
|
|
* enable prefetching of 0x20 rx descriptors
|
|
|
|
|
* enable prefetching of 0x20 Rx descriptors
|
|
|
|
|
* granularity = 01
|
|
|
|
|
* wthresh = 04,
|
|
|
|
|
* hthresh = 04,
|
|
|
|
@ -2981,12 +2986,10 @@ static void e1000_configure_rx(struct e1000_adapter *adapter)
|
|
|
|
|
* excessive C-state transition latencies result in
|
|
|
|
|
* dropped transactions.
|
|
|
|
|
*/
|
|
|
|
|
pm_qos_update_request(
|
|
|
|
|
&adapter->netdev->pm_qos_req, 55);
|
|
|
|
|
pm_qos_update_request(&adapter->netdev->pm_qos_req, 55);
|
|
|
|
|
} else {
|
|
|
|
|
pm_qos_update_request(
|
|
|
|
|
&adapter->netdev->pm_qos_req,
|
|
|
|
|
PM_QOS_DEFAULT_VALUE);
|
|
|
|
|
pm_qos_update_request(&adapter->netdev->pm_qos_req,
|
|
|
|
|
PM_QOS_DEFAULT_VALUE);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -3152,7 +3155,7 @@ void e1000e_reset(struct e1000_adapter *adapter)
|
|
|
|
|
/* lower 16 bits has Rx packet buffer allocation size in KB */
|
|
|
|
|
pba &= 0xffff;
|
|
|
|
|
/*
|
|
|
|
|
* the Tx fifo also stores 16 bytes of information about the tx
|
|
|
|
|
* the Tx fifo also stores 16 bytes of information about the Tx
|
|
|
|
|
* but don't include ethernet FCS because hardware appends it
|
|
|
|
|
*/
|
|
|
|
|
min_tx_space = (adapter->max_frame_size +
|
|
|
|
@ -3175,7 +3178,7 @@ void e1000e_reset(struct e1000_adapter *adapter)
|
|
|
|
|
pba -= min_tx_space - tx_space;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* if short on Rx space, Rx wins and must trump tx
|
|
|
|
|
* if short on Rx space, Rx wins and must trump Tx
|
|
|
|
|
* adjustment or use Early Receive if available
|
|
|
|
|
*/
|
|
|
|
|
if ((pba < min_rx_space) &&
|
|
|
|
@ -4039,11 +4042,11 @@ static void e1000_print_link_info(struct e1000_adapter *adapter)
|
|
|
|
|
adapter->netdev->name,
|
|
|
|
|
adapter->link_speed,
|
|
|
|
|
(adapter->link_duplex == FULL_DUPLEX) ?
|
|
|
|
|
"Full Duplex" : "Half Duplex",
|
|
|
|
|
"Full Duplex" : "Half Duplex",
|
|
|
|
|
((ctrl & E1000_CTRL_TFCE) && (ctrl & E1000_CTRL_RFCE)) ?
|
|
|
|
|
"RX/TX" :
|
|
|
|
|
((ctrl & E1000_CTRL_RFCE) ? "RX" :
|
|
|
|
|
((ctrl & E1000_CTRL_TFCE) ? "TX" : "None" )));
|
|
|
|
|
"Rx/Tx" :
|
|
|
|
|
((ctrl & E1000_CTRL_RFCE) ? "Rx" :
|
|
|
|
|
((ctrl & E1000_CTRL_TFCE) ? "Tx" : "None")));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bool e1000e_has_link(struct e1000_adapter *adapter)
|
|
|
|
@ -4338,7 +4341,7 @@ link_up:
|
|
|
|
|
/* Force detection of hung controller every watchdog period */
|
|
|
|
|
adapter->detect_tx_hung = 1;
|
|
|
|
|
|
|
|
|
|
/* flush partial descriptors to memory before detecting tx hang */
|
|
|
|
|
/* flush partial descriptors to memory before detecting Tx hang */
|
|
|
|
|
if (adapter->flags2 & FLAG2_DMA_BURST) {
|
|
|
|
|
ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD);
|
|
|
|
|
ew32(RDTR, adapter->rx_int_delay | E1000_RDTR_FPD);
|
|
|
|
@ -4529,7 +4532,7 @@ static int e1000_tx_map(struct e1000_adapter *adapter,
|
|
|
|
|
buffer_info->next_to_watch = i;
|
|
|
|
|
buffer_info->dma = dma_map_single(&pdev->dev,
|
|
|
|
|
skb->data + offset,
|
|
|
|
|
size, DMA_TO_DEVICE);
|
|
|
|
|
size, DMA_TO_DEVICE);
|
|
|
|
|
buffer_info->mapped_as_page = false;
|
|
|
|
|
if (dma_mapping_error(&pdev->dev, buffer_info->dma))
|
|
|
|
|
goto dma_error;
|
|
|
|
@ -4576,7 +4579,7 @@ static int e1000_tx_map(struct e1000_adapter *adapter,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
segs = skb_shinfo(skb)->gso_segs ?: 1;
|
|
|
|
|
segs = skb_shinfo(skb)->gso_segs ? : 1;
|
|
|
|
|
/* multiply data chunks by size of headers */
|
|
|
|
|
bytecount = ((segs - 1) * skb_headlen(skb)) + skb->len;
|
|
|
|
|
|
|
|
|
@ -4588,13 +4591,13 @@ static int e1000_tx_map(struct e1000_adapter *adapter,
|
|
|
|
|
return count;
|
|
|
|
|
|
|
|
|
|
dma_error:
|
|
|
|
|
dev_err(&pdev->dev, "TX DMA map failed\n");
|
|
|
|
|
dev_err(&pdev->dev, "Tx DMA map failed\n");
|
|
|
|
|
buffer_info->dma = 0;
|
|
|
|
|
if (count)
|
|
|
|
|
count--;
|
|
|
|
|
|
|
|
|
|
while (count--) {
|
|
|
|
|
if (i==0)
|
|
|
|
|
if (i == 0)
|
|
|
|
|
i += tx_ring->count;
|
|
|
|
|
i--;
|
|
|
|
|
buffer_info = &tx_ring->buffer_info[i];
|
|
|
|
|