5a6fa69f76
Signed-off-by: John Crispin <blogic@openwrt.org> SVN-Revision: 37007
393 lines
12 KiB
Diff
393 lines
12 KiB
Diff
--- a/Embedded/src/GbE/kcompat.h
|
|
+++ b/Embedded/src/GbE/kcompat.h
|
|
@@ -590,6 +590,10 @@ static inline void _kc_synchronize_irq()
|
|
#define ETHTOOL_OPS_COMPAT
|
|
#endif
|
|
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0))
|
|
+#define HAVE_NETIF_MSG 1
|
|
+#endif
|
|
+
|
|
#ifndef HAVE_NETIF_MSG
|
|
#define HAVE_NETIF_MSG 1
|
|
enum {
|
|
--- a/Embedded/src/GbE/iegbe_main.c
|
|
+++ b/Embedded/src/GbE/iegbe_main.c
|
|
@@ -159,9 +159,9 @@ static void iegbe_smartspeed(struct iegb
|
|
static inline int iegbe_82547_fifo_workaround(struct iegbe_adapter *adapter,
|
|
struct sk_buff *skb);
|
|
|
|
-static void iegbe_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp);
|
|
-static void iegbe_vlan_rx_add_vid(struct net_device *netdev, uint16_t vid);
|
|
-static void iegbe_vlan_rx_kill_vid(struct net_device *netdev, uint16_t vid);
|
|
+static bool iegbe_vlan_used(struct iegbe_adapter *adapter);
|
|
+static int iegbe_vlan_rx_add_vid(struct net_device *netdev, uint16_t vid);
|
|
+static int iegbe_vlan_rx_kill_vid(struct net_device *netdev, uint16_t vid);
|
|
static void iegbe_restore_vlan(struct iegbe_adapter *adapter);
|
|
|
|
static int iegbe_notify_reboot(struct notifier_block *,
|
|
@@ -324,8 +324,8 @@ static void iegbe_update_mng_vlan(struct
|
|
struct net_device *netdev = adapter->netdev;
|
|
u16 vid = hw->mng_cookie.vlan_id;
|
|
u16 old_vid = adapter->mng_vlan_id;
|
|
- if (adapter->vlgrp) {
|
|
- if (!vlan_group_get_device(adapter->vlgrp, vid)) {
|
|
+ if (iegbe_vlan_used(adapter)) {
|
|
+ if (!test_bit(old_vid, adapter->active_vlans)) {
|
|
if (hw->mng_cookie.status &
|
|
E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) {
|
|
iegbe_vlan_rx_add_vid(netdev, vid);
|
|
@@ -335,7 +335,7 @@ static void iegbe_update_mng_vlan(struct
|
|
|
|
if ((old_vid != (u16)E1000_MNG_VLAN_NONE) &&
|
|
(vid != old_vid) &&
|
|
- !vlan_group_get_device(adapter->vlgrp, old_vid))
|
|
+ !test_bit(old_vid, adapter->active_vlans))
|
|
iegbe_vlan_rx_kill_vid(netdev, old_vid);
|
|
} else
|
|
adapter->mng_vlan_id = vid;
|
|
@@ -736,7 +736,6 @@ static const struct net_device_ops iegbe
|
|
.ndo_do_ioctl = iegbe_ioctl,
|
|
.ndo_validate_addr = eth_validate_addr,
|
|
|
|
- .ndo_vlan_rx_register = iegbe_vlan_rx_register,
|
|
.ndo_vlan_rx_add_vid = iegbe_vlan_rx_add_vid,
|
|
.ndo_vlan_rx_kill_vid = iegbe_vlan_rx_kill_vid,
|
|
#ifdef CONFIG_NET_POLL_CONTROLLER
|
|
@@ -767,7 +766,6 @@ static int __devinit iegbe_probe(struct
|
|
u16 eeprom_data = 0;
|
|
u16 eeprom_apme_mask = E1000_EEPROM_APME;
|
|
int bars;
|
|
- DECLARE_MAC_BUF(mac);
|
|
|
|
bars = pci_select_bars(pdev, IORESOURCE_MEM);
|
|
err = pci_enable_device(pdev);
|
|
@@ -1247,8 +1245,7 @@ static int iegbe_close(struct net_device
|
|
|
|
if ((hw->mng_cookie.status &
|
|
E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) &&
|
|
- !(adapter->vlgrp &&
|
|
- vlan_group_get_device(adapter->vlgrp, adapter->mng_vlan_id))) {
|
|
+ !test_bit(adapter->mng_vlan_id, adapter->active_vlans)) {
|
|
iegbe_vlan_rx_kill_vid(netdev, adapter->mng_vlan_id);
|
|
}
|
|
return 0;
|
|
@@ -2163,11 +2160,13 @@ static void iegbe_set_rx_mode(struct net
|
|
struct iegbe_hw *hw = &adapter->hw;
|
|
struct netdev_hw_addr *ha;
|
|
bool use_uc = false;
|
|
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0))
|
|
struct dev_addr_list *mc_ptr;
|
|
- u32 rctl;
|
|
u32 hash_value;
|
|
- int i, rar_entries = E1000_RAR_ENTRIES;
|
|
int mta_reg_count = E1000_NUM_MTA_REGISTERS;
|
|
+#endif
|
|
+ u32 rctl;
|
|
+ int i, rar_entries = E1000_RAR_ENTRIES;
|
|
|
|
/* reserve RAR[14] for LAA over-write work-around */
|
|
if (hw->mac_type == iegbe_82571)
|
|
@@ -2220,6 +2219,7 @@ int mta_reg_count = E1000_NUM_MTA_REGIST
|
|
|
|
WARN_ON(i == rar_entries);
|
|
|
|
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0))
|
|
mc_ptr = netdev->mc_list;
|
|
|
|
for (; i < rar_entries; i++) {
|
|
@@ -2247,6 +2247,7 @@ int mta_reg_count = E1000_NUM_MTA_REGIST
|
|
hash_value = iegbe_hash_mc_addr(hw, mc_ptr->da_addr);
|
|
iegbe_mta_set(hw, hash_value);
|
|
}
|
|
+#endif
|
|
|
|
if (hw->mac_type == iegbe_82542_rev2_0)
|
|
iegbe_leave_82542_rst(adapter);
|
|
@@ -2821,14 +2822,14 @@ static int iegbe_tx_map(struct iegbe_ada
|
|
* Avoid terminating buffers within evenly-aligned
|
|
* dwords. */
|
|
if(unlikely(adapter->pcix_82544 &&
|
|
- !((unsigned long)(frag->page+offset+size-1) & 4) &&
|
|
+ !((unsigned long)(frag->page.p+offset+size-1) & 4) &&
|
|
size > 4))
|
|
size -= 4;
|
|
|
|
buffer_info->length = size;
|
|
buffer_info->dma =
|
|
pci_map_page(adapter->pdev,
|
|
- frag->page,
|
|
+ frag->page.p,
|
|
offset,
|
|
size,
|
|
PCI_DMA_TODEVICE);
|
|
@@ -3131,7 +3132,7 @@ static int iegbe_xmit_frame(struct sk_bu
|
|
}
|
|
}
|
|
|
|
- if (unlikely(adapter->vlgrp && vlan_tx_tag_present(skb))) {
|
|
+ if (unlikely(iegbe_vlan_used(adapter) && vlan_tx_tag_present(skb))) {
|
|
tx_flags |= E1000_TX_FLAGS_VLAN;
|
|
tx_flags |= (vlan_tx_tag_get(skb) << E1000_TX_FLAGS_VLAN_SHIFT);
|
|
}
|
|
@@ -3832,10 +3833,12 @@ static bool iegbe_clean_rx_irq(struct ie
|
|
|
|
skb->protocol = eth_type_trans(skb, netdev);
|
|
|
|
- if (unlikely(adapter->vlgrp &&
|
|
+ if (unlikely(iegbe_vlan_used(adapter) &&
|
|
(status & E1000_RXD_STAT_VP))) {
|
|
- vlan_hwaccel_receive_skb(skb, adapter->vlgrp,
|
|
- le16_to_cpu(rx_desc->special));
|
|
+ u16 vid;
|
|
+
|
|
+ vid = le16_to_cpu(rx_desc->special);
|
|
+ __vlan_hwaccel_put_tag(skb, vid);
|
|
} else {
|
|
netif_receive_skb(skb);
|
|
}
|
|
@@ -3986,9 +3989,10 @@ copydone:
|
|
cpu_to_le16(E1000_RXDPS_HDRSTAT_HDRSP)))
|
|
adapter->rx_hdr_split++;
|
|
|
|
- if(unlikely(adapter->vlgrp && (staterr & E1000_RXD_STAT_VP))) {
|
|
- vlan_hwaccel_receive_skb(skb, adapter->vlgrp,
|
|
- le16_to_cpu(rx_desc->wb.middle.vlan));
|
|
+ if(unlikely(iegbe_vlan_used(adapter) && (staterr & E1000_RXD_STAT_VP))) {
|
|
+ u16 vid;
|
|
+ vid = le16_to_cpu(rx_desc->wb.middle.vlan);
|
|
+ __vlan_hwaccel_put_tag(skb, vid);
|
|
} else {
|
|
netif_receive_skb(skb);
|
|
}
|
|
@@ -4496,17 +4500,25 @@ iegbe_io_write(struct iegbe_hw *hw, unsi
|
|
outl(value, port);
|
|
}
|
|
|
|
-static void iegbe_vlan_rx_register(struct net_device *netdev,
|
|
- struct vlan_group *grp)
|
|
+static bool iegbe_vlan_used(struct iegbe_adapter *adapter)
|
|
+{
|
|
+ u16 vid;
|
|
+
|
|
+ for_each_set_bit(vid, adapter->active_vlans, VLAN_N_VID)
|
|
+ return true;
|
|
+
|
|
+ return false;
|
|
+}
|
|
+
|
|
+static void iegbe_vlan_mode(struct net_device *netdev, bool vlan_on)
|
|
{
|
|
struct iegbe_adapter *adapter = netdev_priv(netdev);
|
|
uint32_t ctrl, rctl;
|
|
|
|
if (!test_bit(__E1000_DOWN, &adapter->flags))
|
|
iegbe_irq_disable(adapter);
|
|
- adapter->vlgrp = grp;
|
|
|
|
- if(grp) {
|
|
+ if(vlan_on) {
|
|
/* enable VLAN tag insert/strip */
|
|
ctrl = E1000_READ_REG(&adapter->hw, CTRL);
|
|
ctrl |= E1000_CTRL_VME;
|
|
@@ -4538,30 +4550,37 @@ static void iegbe_vlan_rx_register(struc
|
|
iegbe_irq_enable(adapter);
|
|
}
|
|
|
|
-static void iegbe_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
|
|
+static int iegbe_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
|
|
{
|
|
struct iegbe_adapter *adapter = netdev_priv(netdev);
|
|
uint32_t vfta, index;
|
|
if((adapter->hw.mng_cookie.status &
|
|
E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) &&
|
|
(vid == adapter->mng_vlan_id)) {
|
|
- return;
|
|
+ return 0;
|
|
}
|
|
+
|
|
+ if (!iegbe_vlan_used(adapter))
|
|
+ iegbe_vlan_mode(netdev, true);
|
|
+
|
|
/* add VID to filter table */
|
|
index = (vid >> 0x5) & 0x7F;
|
|
vfta = E1000_READ_REG_ARRAY(&adapter->hw, VFTA, index);
|
|
vfta |= (0x1 << (vid & 0x1F));
|
|
iegbe_write_vfta(&adapter->hw, index, vfta);
|
|
+
|
|
+ set_bit(vid, adapter->active_vlans);
|
|
+
|
|
+ return 0;
|
|
}
|
|
|
|
-static void iegbe_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
|
|
+static int iegbe_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
|
|
{
|
|
struct iegbe_adapter *adapter = netdev_priv(netdev);
|
|
u32 vfta, index;
|
|
|
|
if (!test_bit(__E1000_DOWN, &adapter->flags))
|
|
iegbe_irq_disable(adapter);
|
|
- vlan_group_set_device(adapter->vlgrp, vid, NULL);
|
|
if (!test_bit(__E1000_DOWN, &adapter->flags))
|
|
iegbe_irq_enable(adapter);
|
|
|
|
@@ -4570,21 +4589,26 @@ static void iegbe_vlan_rx_kill_vid(struc
|
|
vfta = E1000_READ_REG_ARRAY(&adapter->hw, VFTA, index);
|
|
vfta &= ~(0x1 << (vid & 0x1F));
|
|
iegbe_write_vfta(&adapter->hw, index, vfta);
|
|
+
|
|
+ clear_bit(vid, adapter->active_vlans);
|
|
+
|
|
+ if (!iegbe_vlan_used(adapter))
|
|
+ iegbe_vlan_mode(netdev, false);
|
|
+
|
|
+ return 0;
|
|
}
|
|
|
|
static void iegbe_restore_vlan(struct iegbe_adapter *adapter)
|
|
{
|
|
- iegbe_vlan_rx_register(adapter->netdev, adapter->vlgrp);
|
|
-
|
|
- if (adapter->vlgrp) {
|
|
u16 vid;
|
|
- for (vid = 0x0; vid < VLAN_GROUP_ARRAY_LEN; vid++) {
|
|
- if (!vlan_group_get_device(adapter->vlgrp, vid))
|
|
- continue;
|
|
+
|
|
+ if (!iegbe_vlan_used(adapter))
|
|
+ return;
|
|
+
|
|
+ iegbe_vlan_mode(adapter->netdev, true);
|
|
+ for_each_set_bit(vid, adapter->active_vlans, VLAN_N_VID)
|
|
iegbe_vlan_rx_add_vid(adapter->netdev, vid);
|
|
}
|
|
- }
|
|
-}
|
|
|
|
|
|
int iegbe_set_spd_dplx(struct iegbe_adapter *adapter, u16 spddplx)
|
|
@@ -4864,10 +4888,11 @@ iegbe_resume(struct pci_dev *pdev)
|
|
default:
|
|
break;
|
|
}
|
|
-#endif
|
|
|
|
return 0x0;
|
|
}
|
|
+#endif
|
|
+
|
|
|
|
#ifdef CONFIG_NET_POLL_CONTROLLER
|
|
/*
|
|
--- a/Embedded/src/GbE/iegbe_ethtool.c
|
|
+++ b/Embedded/src/GbE/iegbe_ethtool.c
|
|
@@ -327,6 +327,7 @@ iegbe_set_pauseparam(struct net_device *
|
|
return 0;
|
|
}
|
|
|
|
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0))
|
|
static uint32_t
|
|
iegbe_get_rx_csum(struct net_device *netdev)
|
|
{
|
|
@@ -392,6 +393,7 @@ iegbe_set_tso(struct net_device *netdev,
|
|
return 0;
|
|
}
|
|
#endif /* NETIF_F_TSO */
|
|
+#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0)) */
|
|
|
|
static uint32_t
|
|
iegbe_get_msglevel(struct net_device *netdev)
|
|
@@ -807,6 +809,7 @@ err_setup_rx:
|
|
E1000_82542_##R : E1000_##R; \
|
|
return 1; } }
|
|
|
|
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0))
|
|
static int
|
|
iegbe_reg_test(struct iegbe_adapter *adapter, uint64_t *data)
|
|
{
|
|
@@ -1710,6 +1713,7 @@ iegbe_diag_test(struct net_device *netde
|
|
}
|
|
msleep_interruptible(0xfa0);
|
|
}
|
|
+#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0)) */
|
|
|
|
static void
|
|
iegbe_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
|
|
@@ -1812,6 +1816,7 @@ iegbe_set_wol(struct net_device *netdev,
|
|
/* bit defines for adapter->led_status */
|
|
#define E1000_LED_ON 0
|
|
|
|
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0))
|
|
static void
|
|
iegbe_led_blink_callback(unsigned long data)
|
|
{
|
|
@@ -1864,6 +1869,7 @@ iegbe_phys_id(struct net_device *netdev,
|
|
|
|
return 0;
|
|
}
|
|
+#endif
|
|
|
|
static int
|
|
iegbe_nway_reset(struct net_device *netdev)
|
|
@@ -1876,11 +1882,13 @@ iegbe_nway_reset(struct net_device *netd
|
|
return 0;
|
|
}
|
|
|
|
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0))
|
|
static int
|
|
iegbe_get_stats_count(struct net_device *netdev)
|
|
{
|
|
return E1000_STATS_LEN;
|
|
}
|
|
+#endif
|
|
|
|
static void
|
|
iegbe_get_ethtool_stats(struct net_device *netdev,
|
|
@@ -1936,6 +1944,8 @@ struct ethtool_ops iegbe_ethtool_ops = {
|
|
.set_ringparam = iegbe_set_ringparam,
|
|
.get_pauseparam = iegbe_get_pauseparam,
|
|
.set_pauseparam = iegbe_set_pauseparam,
|
|
+
|
|
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0))
|
|
.get_rx_csum = iegbe_get_rx_csum,
|
|
.set_rx_csum = iegbe_set_rx_csum,
|
|
.get_tx_csum = iegbe_get_tx_csum,
|
|
@@ -1946,11 +1956,13 @@ struct ethtool_ops iegbe_ethtool_ops = {
|
|
.get_tso = ethtool_op_get_tso,
|
|
.set_tso = iegbe_set_tso,
|
|
#endif
|
|
+
|
|
.self_test_count = iegbe_diag_test_count,
|
|
.self_test = iegbe_diag_test,
|
|
- .get_strings = iegbe_get_strings,
|
|
.phys_id = iegbe_phys_id,
|
|
.get_stats_count = iegbe_get_stats_count,
|
|
+#endif
|
|
+ .get_strings = iegbe_get_strings,
|
|
.get_ethtool_stats = iegbe_get_ethtool_stats,
|
|
};
|
|
|
|
--- a/Embedded/src/GbE/gcu_main.c
|
|
+++ b/Embedded/src/GbE/gcu_main.c
|
|
@@ -93,7 +93,7 @@ static struct pci_driver gcu_driver = {
|
|
};
|
|
|
|
static struct gcu_adapter *global_adapter = 0;
|
|
-static spinlock_t global_adapter_spinlock = SPIN_LOCK_UNLOCKED;
|
|
+static DEFINE_SPINLOCK(global_adapter_spinlock);
|
|
static unsigned long g_intflags = 0;
|
|
|
|
MODULE_AUTHOR("Intel(R) Corporation");
|
|
--- a/Embedded/src/GbE/iegbe.h
|
|
+++ b/Embedded/src/GbE/iegbe.h
|
|
@@ -257,7 +257,7 @@ struct iegbe_adapter {
|
|
struct timer_list tx_fifo_stall_timer;
|
|
struct timer_list watchdog_timer;
|
|
struct timer_list phy_info_timer;
|
|
- struct vlan_group *vlgrp;
|
|
+ unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
|
|
uint16_t mng_vlan_id;
|
|
uint32_t bd_number;
|
|
uint32_t rx_buffer_len;
|