|
@@ -375,7 +375,7 @@ e1000_update_mng_vlan(struct e1000_adapter *adapter)
|
|
|
* e1000_release_hw_control resets {CTRL_EXT|FWSM}:DRV_LOAD bit.
|
|
|
* For ASF and Pass Through versions of f/w this means that the
|
|
|
* driver is no longer loaded. For AMT version (only with 82573) i
|
|
|
- * of the f/w this means that the netowrk i/f is closed.
|
|
|
+ * of the f/w this means that the network i/f is closed.
|
|
|
*
|
|
|
**/
|
|
|
|
|
@@ -416,7 +416,7 @@ e1000_release_hw_control(struct e1000_adapter *adapter)
|
|
|
* e1000_get_hw_control sets {CTRL_EXT|FWSM}:DRV_LOAD bit.
|
|
|
* For ASF and Pass Through versions of f/w this means that
|
|
|
* the driver is loaded. For AMT version (only with 82573)
|
|
|
- * of the f/w this means that the netowrk i/f is open.
|
|
|
+ * of the f/w this means that the network i/f is open.
|
|
|
*
|
|
|
**/
|
|
|
|
|
@@ -426,6 +426,7 @@ e1000_get_hw_control(struct e1000_adapter *adapter)
|
|
|
uint32_t ctrl_ext;
|
|
|
uint32_t swsm;
|
|
|
uint32_t extcnf;
|
|
|
+
|
|
|
/* Let firmware know the driver has taken over */
|
|
|
switch (adapter->hw.mac_type) {
|
|
|
case e1000_82571:
|
|
@@ -1279,12 +1280,10 @@ e1000_open(struct net_device *netdev)
|
|
|
return -EBUSY;
|
|
|
|
|
|
/* allocate transmit descriptors */
|
|
|
-
|
|
|
if ((err = e1000_setup_all_tx_resources(adapter)))
|
|
|
goto err_setup_tx;
|
|
|
|
|
|
/* allocate receive descriptors */
|
|
|
-
|
|
|
if ((err = e1000_setup_all_rx_resources(adapter)))
|
|
|
goto err_setup_rx;
|
|
|
|
|
@@ -1569,6 +1568,8 @@ e1000_configure_tx(struct e1000_adapter *adapter)
|
|
|
|
|
|
if (hw->mac_type == e1000_82571 || hw->mac_type == e1000_82572) {
|
|
|
tarc = E1000_READ_REG(hw, TARC0);
|
|
|
+ /* set the speed mode bit, we'll clear it if we're not at
|
|
|
+ * gigabit link later */
|
|
|
tarc |= (1 << 21);
|
|
|
E1000_WRITE_REG(hw, TARC0, tarc);
|
|
|
} else if (hw->mac_type == e1000_80003es2lan) {
|
|
@@ -2418,6 +2419,7 @@ e1000_watchdog(unsigned long data)
|
|
|
DPRINTK(LINK, INFO,
|
|
|
"Gigabit has been disabled, downgrading speed\n");
|
|
|
}
|
|
|
+
|
|
|
if (adapter->hw.mac_type == e1000_82573) {
|
|
|
e1000_enable_tx_pkt_filtering(&adapter->hw);
|
|
|
if (adapter->mng_vlan_id != adapter->hw.mng_cookie.vlan_id)
|
|
@@ -2462,13 +2464,12 @@ e1000_watchdog(unsigned long data)
|
|
|
if ((adapter->hw.mac_type == e1000_82571 ||
|
|
|
adapter->hw.mac_type == e1000_82572) &&
|
|
|
txb2b == 0) {
|
|
|
-#define SPEED_MODE_BIT (1 << 21)
|
|
|
uint32_t tarc0;
|
|
|
tarc0 = E1000_READ_REG(&adapter->hw, TARC0);
|
|
|
- tarc0 &= ~SPEED_MODE_BIT;
|
|
|
+ tarc0 &= ~(1 << 21);
|
|
|
E1000_WRITE_REG(&adapter->hw, TARC0, tarc0);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
#ifdef NETIF_F_TSO
|
|
|
/* disable TSO for pcie and 10/100 speeds, to avoid
|
|
|
* some hardware issues */
|
|
@@ -3010,9 +3011,9 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
|
|
|
max_per_txd = min(mss << 2, max_per_txd);
|
|
|
max_txd_pwr = fls(max_per_txd) - 1;
|
|
|
|
|
|
- /* TSO Workaround for 82571/2/3 Controllers -- if skb->data
|
|
|
- * points to just header, pull a few bytes of payload from
|
|
|
- * frags into skb->data */
|
|
|
+ /* TSO Workaround for 82571/2/3 Controllers -- if skb->data
|
|
|
+ * points to just header, pull a few bytes of payload from
|
|
|
+ * frags into skb->data */
|
|
|
hdr_len = ((skb->h.raw - skb->data) + (skb->h.th->doff << 2));
|
|
|
if (skb->data_len && (hdr_len == (skb->len - skb->data_len))) {
|
|
|
switch (adapter->hw.mac_type) {
|
|
@@ -3316,12 +3317,12 @@ e1000_update_stats(struct e1000_adapter *adapter)
|
|
|
adapter->stats.roc += E1000_READ_REG(hw, ROC);
|
|
|
|
|
|
if (adapter->hw.mac_type != e1000_ich8lan) {
|
|
|
- adapter->stats.prc64 += E1000_READ_REG(hw, PRC64);
|
|
|
- adapter->stats.prc127 += E1000_READ_REG(hw, PRC127);
|
|
|
- adapter->stats.prc255 += E1000_READ_REG(hw, PRC255);
|
|
|
- adapter->stats.prc511 += E1000_READ_REG(hw, PRC511);
|
|
|
- adapter->stats.prc1023 += E1000_READ_REG(hw, PRC1023);
|
|
|
- adapter->stats.prc1522 += E1000_READ_REG(hw, PRC1522);
|
|
|
+ adapter->stats.prc64 += E1000_READ_REG(hw, PRC64);
|
|
|
+ adapter->stats.prc127 += E1000_READ_REG(hw, PRC127);
|
|
|
+ adapter->stats.prc255 += E1000_READ_REG(hw, PRC255);
|
|
|
+ adapter->stats.prc511 += E1000_READ_REG(hw, PRC511);
|
|
|
+ adapter->stats.prc1023 += E1000_READ_REG(hw, PRC1023);
|
|
|
+ adapter->stats.prc1522 += E1000_READ_REG(hw, PRC1522);
|
|
|
}
|
|
|
|
|
|
adapter->stats.symerrs += E1000_READ_REG(hw, SYMERRS);
|
|
@@ -3352,12 +3353,12 @@ e1000_update_stats(struct e1000_adapter *adapter)
|
|
|
adapter->stats.tpr += E1000_READ_REG(hw, TPR);
|
|
|
|
|
|
if (adapter->hw.mac_type != e1000_ich8lan) {
|
|
|
- adapter->stats.ptc64 += E1000_READ_REG(hw, PTC64);
|
|
|
- adapter->stats.ptc127 += E1000_READ_REG(hw, PTC127);
|
|
|
- adapter->stats.ptc255 += E1000_READ_REG(hw, PTC255);
|
|
|
- adapter->stats.ptc511 += E1000_READ_REG(hw, PTC511);
|
|
|
- adapter->stats.ptc1023 += E1000_READ_REG(hw, PTC1023);
|
|
|
- adapter->stats.ptc1522 += E1000_READ_REG(hw, PTC1522);
|
|
|
+ adapter->stats.ptc64 += E1000_READ_REG(hw, PTC64);
|
|
|
+ adapter->stats.ptc127 += E1000_READ_REG(hw, PTC127);
|
|
|
+ adapter->stats.ptc255 += E1000_READ_REG(hw, PTC255);
|
|
|
+ adapter->stats.ptc511 += E1000_READ_REG(hw, PTC511);
|
|
|
+ adapter->stats.ptc1023 += E1000_READ_REG(hw, PTC1023);
|
|
|
+ adapter->stats.ptc1522 += E1000_READ_REG(hw, PTC1522);
|
|
|
}
|
|
|
|
|
|
adapter->stats.mptc += E1000_READ_REG(hw, MPTC);
|
|
@@ -3383,18 +3384,17 @@ e1000_update_stats(struct e1000_adapter *adapter)
|
|
|
adapter->stats.icrxoc += E1000_READ_REG(hw, ICRXOC);
|
|
|
|
|
|
if (adapter->hw.mac_type != e1000_ich8lan) {
|
|
|
- adapter->stats.icrxptc += E1000_READ_REG(hw, ICRXPTC);
|
|
|
- adapter->stats.icrxatc += E1000_READ_REG(hw, ICRXATC);
|
|
|
- adapter->stats.ictxptc += E1000_READ_REG(hw, ICTXPTC);
|
|
|
- adapter->stats.ictxatc += E1000_READ_REG(hw, ICTXATC);
|
|
|
- adapter->stats.ictxqec += E1000_READ_REG(hw, ICTXQEC);
|
|
|
- adapter->stats.ictxqmtc += E1000_READ_REG(hw, ICTXQMTC);
|
|
|
- adapter->stats.icrxdmtc += E1000_READ_REG(hw, ICRXDMTC);
|
|
|
+ adapter->stats.icrxptc += E1000_READ_REG(hw, ICRXPTC);
|
|
|
+ adapter->stats.icrxatc += E1000_READ_REG(hw, ICRXATC);
|
|
|
+ adapter->stats.ictxptc += E1000_READ_REG(hw, ICTXPTC);
|
|
|
+ adapter->stats.ictxatc += E1000_READ_REG(hw, ICTXATC);
|
|
|
+ adapter->stats.ictxqec += E1000_READ_REG(hw, ICTXQEC);
|
|
|
+ adapter->stats.ictxqmtc += E1000_READ_REG(hw, ICTXQMTC);
|
|
|
+ adapter->stats.icrxdmtc += E1000_READ_REG(hw, ICRXDMTC);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* Fill out the OS statistics structure */
|
|
|
-
|
|
|
adapter->net_stats.rx_packets = adapter->stats.gprc;
|
|
|
adapter->net_stats.tx_packets = adapter->stats.gptc;
|
|
|
adapter->net_stats.rx_bytes = adapter->stats.gorcl;
|
|
@@ -3426,7 +3426,6 @@ e1000_update_stats(struct e1000_adapter *adapter)
|
|
|
/* Tx Dropped needs to be maintained elsewhere */
|
|
|
|
|
|
/* Phy Stats */
|
|
|
-
|
|
|
if (hw->media_type == e1000_media_type_copper) {
|
|
|
if ((adapter->link_speed == SPEED_1000) &&
|
|
|
(!e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_tmp))) {
|
|
@@ -3502,6 +3501,8 @@ e1000_intr(int irq, void *data)
|
|
|
if (likely(netif_rx_schedule_prep(netdev)))
|
|
|
__netif_rx_schedule(netdev);
|
|
|
else
|
|
|
+ /* this really should not happen! if it does it is basically a
|
|
|
+ * bug, but not a hard error, so enable ints and continue */
|
|
|
e1000_irq_enable(adapter);
|
|
|
#else
|
|
|
/* Writing IMC and IMS is needed for 82547.
|
|
@@ -3528,7 +3529,6 @@ e1000_intr(int irq, void *data)
|
|
|
e1000_irq_enable(adapter);
|
|
|
|
|
|
#endif
|
|
|
-
|
|
|
return IRQ_HANDLED;
|
|
|
}
|
|
|
|
|
@@ -3615,7 +3615,6 @@ e1000_clean_tx_irq(struct e1000_adapter *adapter,
|
|
|
if (unlikely(++i == tx_ring->count)) i = 0;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
eop = tx_ring->buffer_info[i].next_to_watch;
|
|
|
eop_desc = E1000_TX_DESC(*tx_ring, eop);
|
|
|
#ifdef CONFIG_E1000_NAPI
|
|
@@ -3760,6 +3759,7 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter,
|
|
|
while (rx_desc->status & E1000_RXD_STAT_DD) {
|
|
|
struct sk_buff *skb;
|
|
|
u8 status;
|
|
|
+
|
|
|
#ifdef CONFIG_E1000_NAPI
|
|
|
if (*work_done >= work_to_do)
|
|
|
break;
|
|
@@ -3999,7 +3999,7 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
|
|
|
goto copydone;
|
|
|
} /* if */
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
for (j = 0; j < adapter->rx_ps_pages; j++) {
|
|
|
if (!(length= le16_to_cpu(rx_desc->wb.upper.length[j])))
|
|
|
break;
|
|
@@ -4234,7 +4234,7 @@ e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter,
|
|
|
}
|
|
|
|
|
|
skb = netdev_alloc_skb(netdev,
|
|
|
- adapter->rx_ps_bsize0 + NET_IP_ALIGN);
|
|
|
+ adapter->rx_ps_bsize0 + NET_IP_ALIGN);
|
|
|
|
|
|
if (unlikely(!skb)) {
|
|
|
adapter->alloc_rx_buff_failed++;
|
|
@@ -4511,7 +4511,6 @@ e1000_read_pcie_cap_reg(struct e1000_hw *hw, uint32_t reg, uint16_t *value)
|
|
|
return E1000_SUCCESS;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
void
|
|
|
e1000_io_write(struct e1000_hw *hw, unsigned long port, uint32_t value)
|
|
|
{
|
|
@@ -4534,12 +4533,12 @@ e1000_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp)
|
|
|
E1000_WRITE_REG(&adapter->hw, CTRL, ctrl);
|
|
|
|
|
|
if (adapter->hw.mac_type != e1000_ich8lan) {
|
|
|
- /* enable VLAN receive filtering */
|
|
|
- rctl = E1000_READ_REG(&adapter->hw, RCTL);
|
|
|
- rctl |= E1000_RCTL_VFE;
|
|
|
- rctl &= ~E1000_RCTL_CFIEN;
|
|
|
- E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
|
|
|
- e1000_update_mng_vlan(adapter);
|
|
|
+ /* enable VLAN receive filtering */
|
|
|
+ rctl = E1000_READ_REG(&adapter->hw, RCTL);
|
|
|
+ rctl |= E1000_RCTL_VFE;
|
|
|
+ rctl &= ~E1000_RCTL_CFIEN;
|
|
|
+ E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
|
|
|
+ e1000_update_mng_vlan(adapter);
|
|
|
}
|
|
|
} else {
|
|
|
/* disable VLAN tag insert/strip */
|
|
@@ -4548,14 +4547,16 @@ e1000_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp)
|
|
|
E1000_WRITE_REG(&adapter->hw, CTRL, ctrl);
|
|
|
|
|
|
if (adapter->hw.mac_type != e1000_ich8lan) {
|
|
|
- /* disable VLAN filtering */
|
|
|
- rctl = E1000_READ_REG(&adapter->hw, RCTL);
|
|
|
- rctl &= ~E1000_RCTL_VFE;
|
|
|
- E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
|
|
|
- if (adapter->mng_vlan_id != (uint16_t)E1000_MNG_VLAN_NONE) {
|
|
|
- e1000_vlan_rx_kill_vid(netdev, adapter->mng_vlan_id);
|
|
|
- adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
|
|
|
- }
|
|
|
+ /* disable VLAN filtering */
|
|
|
+ rctl = E1000_READ_REG(&adapter->hw, RCTL);
|
|
|
+ rctl &= ~E1000_RCTL_VFE;
|
|
|
+ E1000_WRITE_REG(&adapter->hw, RCTL, rctl);
|
|
|
+ if (adapter->mng_vlan_id !=
|
|
|
+ (uint16_t)E1000_MNG_VLAN_NONE) {
|
|
|
+ e1000_vlan_rx_kill_vid(netdev,
|
|
|
+ adapter->mng_vlan_id);
|
|
|
+ adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|