783 lines
22 KiB
Diff
783 lines
22 KiB
Diff
Backport commit 22bedad3ce112d5ca1eaf043d4990fa2ed698c87:
|
|
net: convert multicast list to list_head
|
|
|
|
Converts the list and the core manipulating with it to be the same as uc_list.
|
|
|
|
+uses two functions for adding/removing mc address (normal and "global"
|
|
variant) instead of a function parameter.
|
|
+removes dev_mcast.c completely.
|
|
+exposes netdev_hw_addr_list_* macros along with __hw_addr_* functions for
|
|
manipulation with lists on a sandbox (used in bonding and 80211 drivers)
|
|
|
|
This also backport commit 2f787b0b76bf5de2eaa3ca3a29d89123ae03c856
|
|
|
|
--- a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c
|
|
+++ b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c
|
|
@@ -406,7 +406,11 @@ static void atl1c_set_multi(struct net_d
|
|
|
|
/* comoute mc addresses' hash value ,and put it into hash table */
|
|
netdev_for_each_mc_addr(ha, netdev) {
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
hash_value = atl1c_hash_mc_addr(hw, ha->addr);
|
|
+#else
|
|
+ hash_value = atl1c_hash_mc_addr(hw, ha->dmi_addr);
|
|
+#endif
|
|
atl1c_hash_set(hw, hash_value);
|
|
}
|
|
}
|
|
--- a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c
|
|
+++ b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c
|
|
@@ -308,7 +308,11 @@ static void atl1e_set_multi(struct net_d
|
|
|
|
/* comoute mc addresses' hash value ,and put it into hash table */
|
|
netdev_for_each_mc_addr(ha, netdev) {
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
hash_value = atl1e_hash_mc_addr(hw, ha->addr);
|
|
+#else
|
|
+ hash_value = atl1e_hash_mc_addr(hw, ha->dmi_addr);
|
|
+#endif
|
|
atl1e_hash_set(hw, hash_value);
|
|
}
|
|
}
|
|
--- a/drivers/net/ethernet/atheros/atlx/atl2.c
|
|
+++ b/drivers/net/ethernet/atheros/atlx/atl2.c
|
|
@@ -159,7 +159,11 @@ static void atl2_set_multi(struct net_de
|
|
|
|
/* comoute mc addresses' hash value ,and put it into hash table */
|
|
netdev_for_each_mc_addr(ha, netdev) {
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
hash_value = atl2_hash_mc_addr(hw, ha->addr);
|
|
+#else
|
|
+ hash_value = atl2_hash_mc_addr(hw, ha->dmi_addr);
|
|
+#endif
|
|
atl2_hash_set(hw, hash_value);
|
|
}
|
|
}
|
|
--- a/drivers/net/ethernet/atheros/atlx/atlx.c
|
|
+++ b/drivers/net/ethernet/atheros/atlx/atlx.c
|
|
@@ -149,7 +149,11 @@ static void atlx_set_multi(struct net_de
|
|
|
|
/* compute mc addresses' hash value ,and put it into hash table */
|
|
netdev_for_each_mc_addr(ha, netdev) {
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
hash_value = atlx_hash_mc_addr(hw, ha->addr);
|
|
+#else
|
|
+ hash_value = atlx_hash_mc_addr(hw, ha->dmi_addr);
|
|
+#endif
|
|
atlx_hash_set(hw, hash_value);
|
|
}
|
|
}
|
|
--- a/drivers/net/ethernet/broadcom/b44.c
|
|
+++ b/drivers/net/ethernet/broadcom/b44.c
|
|
@@ -1687,7 +1687,11 @@ static int __b44_load_mcast(struct b44 *
|
|
netdev_for_each_mc_addr(ha, dev) {
|
|
if (i == num_ents)
|
|
break;
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
__b44_cam_write(bp, ha->addr, i++ + 1);
|
|
+#else
|
|
+ __b44_cam_write(bp, ha->dmi_addr, i++ + 1);
|
|
+#endif
|
|
}
|
|
return i+1;
|
|
}
|
|
--- a/drivers/net/wireless/adm8211.c
|
|
+++ b/drivers/net/wireless/adm8211.c
|
|
@@ -1320,19 +1320,37 @@ static void adm8211_bss_info_changed(str
|
|
}
|
|
|
|
static u64 adm8211_prepare_multicast(struct ieee80211_hw *hw,
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
struct netdev_hw_addr_list *mc_list)
|
|
+#else
|
|
+ int mc_count, struct dev_addr_list *ha)
|
|
+#endif
|
|
{
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
unsigned int bit_nr;
|
|
- u32 mc_filter[2];
|
|
struct netdev_hw_addr *ha;
|
|
+#else
|
|
+ unsigned int bit_nr, i;
|
|
+#endif
|
|
+ u32 mc_filter[2];
|
|
|
|
mc_filter[1] = mc_filter[0] = 0;
|
|
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
netdev_hw_addr_list_for_each(ha, mc_list) {
|
|
bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
|
|
+#else
|
|
+ for (i = 0; i < mc_count; i++) {
|
|
+ if (!ha)
|
|
+ break;
|
|
+ bit_nr = ether_crc(ETH_ALEN, ha->dmi_addr) >> 26;
|
|
+#endif
|
|
|
|
bit_nr &= 0x3F;
|
|
mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31);
|
|
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35))
|
|
+ ha = ha->next;
|
|
+#endif
|
|
}
|
|
|
|
return mc_filter[0] | ((u64)(mc_filter[1]) << 32);
|
|
--- a/drivers/net/wireless/ath/ath5k/mac80211-ops.c
|
|
+++ b/drivers/net/wireless/ath/ath5k/mac80211-ops.c
|
|
@@ -312,20 +312,42 @@ ath5k_bss_info_changed(struct ieee80211_
|
|
|
|
static u64
|
|
ath5k_prepare_multicast(struct ieee80211_hw *hw,
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
struct netdev_hw_addr_list *mc_list)
|
|
+#else
|
|
+ int mc_count, struct dev_addr_list *ha)
|
|
+#endif
|
|
{
|
|
u32 mfilt[2], val;
|
|
u8 pos;
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
struct netdev_hw_addr *ha;
|
|
+#else
|
|
+ int i;
|
|
+#endif
|
|
|
|
mfilt[0] = 0;
|
|
mfilt[1] = 1;
|
|
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
netdev_hw_addr_list_for_each(ha, mc_list) {
|
|
+#else
|
|
+ for (i = 0; i < mc_count; i++) {
|
|
+ if (!ha)
|
|
+ break;
|
|
+#endif
|
|
/* calculate XOR of eight 6-bit values */
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
val = get_unaligned_le32(ha->addr + 0);
|
|
+#else
|
|
+ val = get_unaligned_le32(ha->dmi_addr + 0);
|
|
+#endif
|
|
pos = (val >> 18) ^ (val >> 12) ^ (val >> 6) ^ val;
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
val = get_unaligned_le32(ha->addr + 3);
|
|
+#else
|
|
+ val = get_unaligned_le32(ha->dmi_addr + 3);
|
|
+#endif
|
|
pos ^= (val >> 18) ^ (val >> 12) ^ (val >> 6) ^ val;
|
|
pos &= 0x3f;
|
|
mfilt[pos / 32] |= (1 << (pos % 32));
|
|
@@ -334,6 +356,9 @@ ath5k_prepare_multicast(struct ieee80211
|
|
* need to inform below not to reset the mcast */
|
|
/* ath5k_hw_set_mcast_filterindex(ah,
|
|
* ha->addr[5]); */
|
|
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35))
|
|
+ ha = ha->next;
|
|
+#endif
|
|
}
|
|
|
|
return ((u64)(mfilt[1]) << 32) | mfilt[0];
|
|
--- a/drivers/net/wireless/ath/carl9170/main.c
|
|
+++ b/drivers/net/wireless/ath/carl9170/main.c
|
|
@@ -896,17 +896,35 @@ out:
|
|
return err;
|
|
}
|
|
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
static u64 carl9170_op_prepare_multicast(struct ieee80211_hw *hw,
|
|
struct netdev_hw_addr_list *mc_list)
|
|
+#else
|
|
+static u64 carl9170_op_prepare_multicast(struct ieee80211_hw *hw, int mc_count,
|
|
+ struct dev_addr_list *ha)
|
|
+#endif
|
|
{
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
struct netdev_hw_addr *ha;
|
|
+#else
|
|
+ int i;
|
|
+#endif
|
|
u64 mchash;
|
|
|
|
/* always get broadcast frames */
|
|
mchash = 1ULL << (0xff >> 2);
|
|
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
netdev_hw_addr_list_for_each(ha, mc_list)
|
|
mchash |= 1ULL << (ha->addr[5] >> 2);
|
|
+#else
|
|
+ for (i = 0; i < mc_count; i++) {
|
|
+ if (WARN_ON(!ha))
|
|
+ break;
|
|
+ mchash |= 1ULL << (ha->dmi_addr[5] >> 2);
|
|
+ ha = ha->next;
|
|
+ }
|
|
+#endif
|
|
|
|
return mchash;
|
|
}
|
|
--- a/drivers/net/wireless/libertas/main.c
|
|
+++ b/drivers/net/wireless/libertas/main.c
|
|
@@ -343,18 +343,34 @@ static int lbs_add_mcast_addrs(struct cm
|
|
netif_addr_lock_bh(dev);
|
|
cnt = netdev_mc_count(dev);
|
|
netdev_for_each_mc_addr(ha, dev) {
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
if (mac_in_list(cmd->maclist, nr_addrs, ha->addr)) {
|
|
+#else
|
|
+ if (mac_in_list(cmd->maclist, nr_addrs, ha->dmi_addr)) {
|
|
+#endif
|
|
lbs_deb_net("mcast address %s:%pM skipped\n", dev->name,
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
ha->addr);
|
|
+#else
|
|
+ ha->dmi_addr);
|
|
+#endif
|
|
cnt--;
|
|
continue;
|
|
}
|
|
|
|
if (i == MRVDRV_MAX_MULTICAST_LIST_SIZE)
|
|
break;
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
memcpy(&cmd->maclist[6*i], ha->addr, ETH_ALEN);
|
|
+#else
|
|
+ memcpy(&cmd->maclist[6*i], ha->dmi_addr, ETH_ALEN);
|
|
+#endif
|
|
lbs_deb_net("mcast address %s:%pM added to filter\n", dev->name,
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
ha->addr);
|
|
+#else
|
|
+ ha->dmi_addr);
|
|
+#endif
|
|
i++;
|
|
cnt--;
|
|
}
|
|
--- a/drivers/net/wireless/libertas_tf/main.c
|
|
+++ b/drivers/net/wireless/libertas_tf/main.c
|
|
@@ -419,20 +419,36 @@ static int lbtf_op_config(struct ieee802
|
|
}
|
|
|
|
static u64 lbtf_op_prepare_multicast(struct ieee80211_hw *hw,
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
struct netdev_hw_addr_list *mc_list)
|
|
+#else
|
|
+ int mc_count, struct dev_addr_list *ha)
|
|
+#endif
|
|
{
|
|
struct lbtf_private *priv = hw->priv;
|
|
int i;
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
struct netdev_hw_addr *ha;
|
|
int mc_count = netdev_hw_addr_list_count(mc_list);
|
|
+#endif
|
|
|
|
if (!mc_count || mc_count > MRVDRV_MAX_MULTICAST_LIST_SIZE)
|
|
return mc_count;
|
|
|
|
priv->nr_of_multicastmacaddr = mc_count;
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
i = 0;
|
|
netdev_hw_addr_list_for_each(ha, mc_list)
|
|
memcpy(&priv->multicastlist[i++], ha->addr, ETH_ALEN);
|
|
+#else
|
|
+ for (i = 0; i < mc_count; i++) {
|
|
+ if (!ha)
|
|
+ break;
|
|
+ memcpy(&priv->multicastlist[i], ha->da_addr,
|
|
+ ETH_ALEN);
|
|
+ ha = ha->next;
|
|
+ }
|
|
+#endif
|
|
|
|
return mc_count;
|
|
}
|
|
--- a/drivers/net/wireless/mwifiex/sta_ioctl.c
|
|
+++ b/drivers/net/wireless/mwifiex/sta_ioctl.c
|
|
@@ -40,7 +40,11 @@ int mwifiex_copy_mcast_addr(struct mwifi
|
|
struct netdev_hw_addr *ha;
|
|
|
|
netdev_for_each_mc_addr(ha, dev)
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
memcpy(&mlist->mac_list[i++], ha->addr, ETH_ALEN);
|
|
+#else
|
|
+ memcpy(&mlist->mac_list[i++], ha->dmi_addr, ETH_ALEN);
|
|
+#endif
|
|
|
|
return i;
|
|
}
|
|
--- a/drivers/net/wireless/mwifiex/debugfs.c
|
|
+++ b/drivers/net/wireless/mwifiex/debugfs.c
|
|
@@ -228,7 +228,11 @@ mwifiex_info_read(struct file *file, cha
|
|
|
|
netdev_for_each_mc_addr(ha, netdev)
|
|
p += sprintf(p, "multicast_address[%d]=\"%pM\"\n",
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
i++, ha->addr);
|
|
+#else
|
|
+ i++, ha->dmi_addr);
|
|
+#endif
|
|
}
|
|
|
|
p += sprintf(p, "num_tx_bytes = %lu\n", priv->stats.tx_bytes);
|
|
--- a/drivers/net/wireless/mwl8k.c
|
|
+++ b/drivers/net/wireless/mwl8k.c
|
|
@@ -2540,15 +2540,21 @@ struct mwl8k_cmd_mac_multicast_adr {
|
|
|
|
static struct mwl8k_cmd_pkt *
|
|
__mwl8k_cmd_mac_multicast_adr(struct ieee80211_hw *hw, int allmulti,
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
struct netdev_hw_addr_list *mc_list)
|
|
+#else
|
|
+ int mc_count, struct dev_addr_list *ha)
|
|
+#endif
|
|
{
|
|
struct mwl8k_priv *priv = hw->priv;
|
|
struct mwl8k_cmd_mac_multicast_adr *cmd;
|
|
int size;
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
int mc_count = 0;
|
|
|
|
if (mc_list)
|
|
mc_count = netdev_hw_addr_list_count(mc_list);
|
|
+#endif
|
|
|
|
if (allmulti || mc_count > priv->num_mcaddrs) {
|
|
allmulti = 1;
|
|
@@ -2569,13 +2575,27 @@ __mwl8k_cmd_mac_multicast_adr(struct iee
|
|
if (allmulti) {
|
|
cmd->action |= cpu_to_le16(MWL8K_ENABLE_RX_ALL_MULTICAST);
|
|
} else if (mc_count) {
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
struct netdev_hw_addr *ha;
|
|
int i = 0;
|
|
+#else
|
|
+ int i;
|
|
+#endif
|
|
|
|
cmd->action |= cpu_to_le16(MWL8K_ENABLE_RX_MULTICAST);
|
|
cmd->numaddr = cpu_to_le16(mc_count);
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
netdev_hw_addr_list_for_each(ha, mc_list) {
|
|
memcpy(cmd->addr[i], ha->addr, ETH_ALEN);
|
|
+#else
|
|
+ for (i = 0; i < mc_count && ha; i++) {
|
|
+ if (ha->da_addrlen != ETH_ALEN) {
|
|
+ kfree(cmd);
|
|
+ return NULL;
|
|
+ }
|
|
+ memcpy(cmd->addr[i], ha->da_addr, ETH_ALEN);
|
|
+ ha = ha->next;
|
|
+#endif
|
|
}
|
|
}
|
|
|
|
@@ -4723,7 +4743,11 @@ mwl8k_bss_info_changed(struct ieee80211_
|
|
}
|
|
|
|
static u64 mwl8k_prepare_multicast(struct ieee80211_hw *hw,
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
struct netdev_hw_addr_list *mc_list)
|
|
+#else
|
|
+ int mc_count, struct dev_addr_list *ha)
|
|
+#endif
|
|
{
|
|
struct mwl8k_cmd_pkt *cmd;
|
|
|
|
@@ -4734,7 +4758,11 @@ static u64 mwl8k_prepare_multicast(struc
|
|
* we'll end up throwing this packet away and creating a new
|
|
* one in mwl8k_configure_filter().
|
|
*/
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
cmd = __mwl8k_cmd_mac_multicast_adr(hw, 0, mc_list);
|
|
+#else
|
|
+ cmd = __mwl8k_cmd_mac_multicast_adr(hw, 0, mc_count, ha);
|
|
+#endif
|
|
|
|
return (unsigned long)cmd;
|
|
}
|
|
@@ -4856,7 +4884,11 @@ static void mwl8k_configure_filter(struc
|
|
*/
|
|
if (*total_flags & FIF_ALLMULTI) {
|
|
kfree(cmd);
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
cmd = __mwl8k_cmd_mac_multicast_adr(hw, 1, NULL);
|
|
+#else
|
|
+ cmd = __mwl8k_cmd_mac_multicast_adr(hw, 1, 0, NULL);
|
|
+#endif
|
|
}
|
|
|
|
if (cmd != NULL) {
|
|
--- a/drivers/net/wireless/orinoco/hw.c
|
|
+++ b/drivers/net/wireless/orinoco/hw.c
|
|
@@ -1093,7 +1093,11 @@ int __orinoco_hw_set_multicast_list(stru
|
|
netdev_for_each_mc_addr(ha, dev) {
|
|
if (i == mc_count)
|
|
break;
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
memcpy(mclist.addr[i++], ha->addr, ETH_ALEN);
|
|
+#else
|
|
+ memcpy(mclist.addr[i++], ha->dmi_addr, ETH_ALEN);
|
|
+#endif
|
|
}
|
|
|
|
err = hw->ops->write_ltv(hw, USER_BAP,
|
|
--- a/drivers/net/wireless/orinoco/hw.h
|
|
+++ b/drivers/net/wireless/orinoco/hw.h
|
|
@@ -22,6 +22,9 @@
|
|
|
|
/* Forward declarations */
|
|
struct orinoco_private;
|
|
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35))
|
|
+struct dev_addr_list;
|
|
+#endif
|
|
|
|
int determine_fw_capabilities(struct orinoco_private *priv, char *fw_name,
|
|
size_t fw_name_len, u32 *hw_ver);
|
|
--- a/drivers/net/wireless/p54/main.c
|
|
+++ b/drivers/net/wireless/p54/main.c
|
|
@@ -360,11 +360,18 @@ out:
|
|
return ret;
|
|
}
|
|
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
static u64 p54_prepare_multicast(struct ieee80211_hw *dev,
|
|
struct netdev_hw_addr_list *mc_list)
|
|
+#else
|
|
+static u64 p54_prepare_multicast(struct ieee80211_hw *dev, int mc_count,
|
|
+ struct dev_addr_list *ha)
|
|
+#endif
|
|
{
|
|
struct p54_common *priv = dev->priv;
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
struct netdev_hw_addr *ha;
|
|
+#endif
|
|
int i;
|
|
|
|
BUILD_BUG_ON(ARRAY_SIZE(priv->mc_maclist) !=
|
|
@@ -374,12 +381,23 @@ static u64 p54_prepare_multicast(struct
|
|
* Otherwise the firmware will drop it and ARP will no longer work.
|
|
*/
|
|
i = 1;
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
priv->mc_maclist_num = netdev_hw_addr_list_count(mc_list) + i;
|
|
netdev_hw_addr_list_for_each(ha, mc_list) {
|
|
memcpy(&priv->mc_maclist[i], ha->addr, ETH_ALEN);
|
|
+#else
|
|
+ priv->mc_maclist_num = mc_count + i;
|
|
+ while (i <= mc_count) {
|
|
+ if (!ha)
|
|
+ break;
|
|
+ memcpy(&priv->mc_maclist[i], ha->dmi_addr, ETH_ALEN);
|
|
+#endif
|
|
i++;
|
|
if (i >= ARRAY_SIZE(priv->mc_maclist))
|
|
break;
|
|
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35))
|
|
+ ha = ha->next;
|
|
+#endif
|
|
}
|
|
|
|
return 1; /* update */
|
|
--- a/drivers/net/wireless/rndis_wlan.c
|
|
+++ b/drivers/net/wireless/rndis_wlan.c
|
|
@@ -1631,7 +1631,11 @@ static void set_multicast_list(struct us
|
|
|
|
netdev_for_each_mc_addr(ha, usbdev->net)
|
|
memcpy(mc_addrs + i++ * ETH_ALEN,
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
ha->addr, ETH_ALEN);
|
|
+#else
|
|
+ ha->dmi_addr, ETH_ALEN);
|
|
+#endif
|
|
}
|
|
netif_addr_unlock_bh(usbdev->net);
|
|
|
|
--- a/drivers/net/wireless/rtl818x/rtl8180/dev.c
|
|
+++ b/drivers/net/wireless/rtl818x/rtl8180/dev.c
|
|
@@ -814,10 +814,19 @@ static void rtl8180_bss_info_changed(str
|
|
}
|
|
}
|
|
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
static u64 rtl8180_prepare_multicast(struct ieee80211_hw *dev,
|
|
struct netdev_hw_addr_list *mc_list)
|
|
+#else
|
|
+static u64 rtl8180_prepare_multicast(struct ieee80211_hw *dev, int mc_count,
|
|
+ struct dev_addr_list *mc_list)
|
|
+#endif
|
|
{
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
return netdev_hw_addr_list_count(mc_list);
|
|
+#else
|
|
+ return mc_count;
|
|
+#endif
|
|
}
|
|
|
|
static void rtl8180_configure_filter(struct ieee80211_hw *dev,
|
|
--- a/drivers/net/wireless/rtl818x/rtl8187/dev.c
|
|
+++ b/drivers/net/wireless/rtl818x/rtl8187/dev.c
|
|
@@ -1205,9 +1205,17 @@ static void rtl8187_bss_info_changed(str
|
|
}
|
|
|
|
static u64 rtl8187_prepare_multicast(struct ieee80211_hw *dev,
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
struct netdev_hw_addr_list *mc_list)
|
|
+#else
|
|
+ int mc_count, struct dev_addr_list *mc_list)
|
|
+#endif
|
|
{
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
return netdev_hw_addr_list_count(mc_list);
|
|
+#else
|
|
+ return mc_count;
|
|
+#endif
|
|
}
|
|
|
|
static void rtl8187_configure_filter(struct ieee80211_hw *dev,
|
|
--- a/drivers/net/wireless/wl12xx/main.c
|
|
+++ b/drivers/net/wireless/wl12xx/main.c
|
|
@@ -2464,11 +2464,20 @@ struct wl1271_filter_params {
|
|
u8 mc_list[ACX_MC_ADDRESS_GROUP_MAX][ETH_ALEN];
|
|
};
|
|
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
static u64 wl1271_op_prepare_multicast(struct ieee80211_hw *hw,
|
|
struct netdev_hw_addr_list *mc_list)
|
|
+#else
|
|
+static u64 wl1271_op_prepare_multicast(struct ieee80211_hw *hw, int mc_count,
|
|
+ struct dev_addr_list *mc_list)
|
|
+#endif
|
|
{
|
|
struct wl1271_filter_params *fp;
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
struct netdev_hw_addr *ha;
|
|
+#else
|
|
+ int i;
|
|
+#endif
|
|
struct wl1271 *wl = hw->priv;
|
|
|
|
if (unlikely(wl->state == WL1271_STATE_OFF))
|
|
@@ -2481,16 +2490,40 @@ static u64 wl1271_op_prepare_multicast(s
|
|
}
|
|
|
|
/* update multicast filtering parameters */
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
fp->mc_list_length = 0;
|
|
if (netdev_hw_addr_list_count(mc_list) > ACX_MC_ADDRESS_GROUP_MAX) {
|
|
+#else
|
|
+ fp->enabled = true;
|
|
+ if (mc_count > ACX_MC_ADDRESS_GROUP_MAX) {
|
|
+ mc_count = 0;
|
|
+#endif
|
|
fp->enabled = false;
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
} else {
|
|
fp->enabled = true;
|
|
netdev_hw_addr_list_for_each(ha, mc_list) {
|
|
+#else
|
|
+ }
|
|
+
|
|
+ fp->mc_list_length = 0;
|
|
+ for (i = 0; i < mc_count; i++) {
|
|
+ if (mc_list->da_addrlen == ETH_ALEN) {
|
|
+#endif
|
|
memcpy(fp->mc_list[fp->mc_list_length],
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
ha->addr, ETH_ALEN);
|
|
+#else
|
|
+ mc_list->da_addr, ETH_ALEN);
|
|
+#endif
|
|
fp->mc_list_length++;
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
}
|
|
+#else
|
|
+ } else
|
|
+ wl1271_warning("Unknown mc address length.");
|
|
+ mc_list = mc_list->next;
|
|
+#endif
|
|
}
|
|
|
|
return (u64)(unsigned long)fp;
|
|
--- a/drivers/net/wireless/zd1211rw/zd_mac.c
|
|
+++ b/drivers/net/wireless/zd1211rw/zd_mac.c
|
|
@@ -1195,17 +1195,34 @@ static void zd_process_intr(struct work_
|
|
|
|
|
|
static u64 zd_op_prepare_multicast(struct ieee80211_hw *hw,
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
struct netdev_hw_addr_list *mc_list)
|
|
+#else
|
|
+ int mc_count, struct dev_addr_list *ha)
|
|
+#endif
|
|
{
|
|
struct zd_mac *mac = zd_hw_mac(hw);
|
|
struct zd_mc_hash hash;
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
struct netdev_hw_addr *ha;
|
|
+#else
|
|
+ int i;
|
|
+#endif
|
|
|
|
zd_mc_clear(&hash);
|
|
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
netdev_hw_addr_list_for_each(ha, mc_list) {
|
|
dev_dbg_f(zd_mac_dev(mac), "mc addr %pM\n", ha->addr);
|
|
zd_mc_add_addr(&hash, ha->addr);
|
|
+#else
|
|
+ for (i = 0; i < mc_count; i++) {
|
|
+ if (!ha)
|
|
+ break;
|
|
+ dev_dbg_f(zd_mac_dev(mac), "mc addr %pM\n", ha->dmi_addr);
|
|
+ zd_mc_add_addr(&hash, ha->dmi_addr);
|
|
+ ha = ha->next;
|
|
+#endif
|
|
}
|
|
|
|
return hash.low | ((u64)hash.high << 32);
|
|
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
|
|
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
|
|
@@ -157,7 +157,11 @@ static void _brcmf_set_multicast_list(st
|
|
netdev_for_each_mc_addr(ha, ndev) {
|
|
if (!cnt)
|
|
break;
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
memcpy(bufp, ha->addr, ETH_ALEN);
|
|
+#else
|
|
+ memcpy(bufp, ha->dmi_addr, ETH_ALEN);
|
|
+#endif
|
|
bufp += ETH_ALEN;
|
|
cnt--;
|
|
}
|
|
--- a/include/net/mac80211.h
|
|
+++ b/include/net/mac80211.h
|
|
@@ -2128,7 +2128,11 @@ struct ieee80211_ops {
|
|
enum ieee80211_tx_sync_type type);
|
|
|
|
u64 (*prepare_multicast)(struct ieee80211_hw *hw,
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
struct netdev_hw_addr_list *mc_list);
|
|
+#else
|
|
+ int mc_count, struct dev_addr_list *mc_list);
|
|
+#endif
|
|
void (*configure_filter)(struct ieee80211_hw *hw,
|
|
unsigned int changed_flags,
|
|
unsigned int *total_flags,
|
|
--- a/net/bluetooth/bnep/netdev.c
|
|
+++ b/net/bluetooth/bnep/netdev.c
|
|
@@ -102,8 +102,13 @@ static void bnep_net_set_mc_list(struct
|
|
netdev_for_each_mc_addr(ha, dev) {
|
|
if (i == BNEP_MAX_MULTICAST_FILTERS)
|
|
break;
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
memcpy(__skb_put(skb, ETH_ALEN), ha->addr, ETH_ALEN);
|
|
memcpy(__skb_put(skb, ETH_ALEN), ha->addr, ETH_ALEN);
|
|
+#else
|
|
+ memcpy(__skb_put(skb, ETH_ALEN), ha->dmi_addr, ETH_ALEN);
|
|
+ memcpy(__skb_put(skb, ETH_ALEN), ha->dmi_addr, ETH_ALEN);
|
|
+#endif
|
|
|
|
i++;
|
|
}
|
|
--- a/net/mac80211/driver-ops.h
|
|
+++ b/net/mac80211/driver-ops.h
|
|
@@ -186,14 +186,28 @@ static inline void drv_finish_tx_sync(st
|
|
}
|
|
|
|
static inline u64 drv_prepare_multicast(struct ieee80211_local *local,
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
struct netdev_hw_addr_list *mc_list)
|
|
+#else
|
|
+ int mc_count,
|
|
+ struct dev_addr_list *mc_list)
|
|
+#endif
|
|
{
|
|
u64 ret = 0;
|
|
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
trace_drv_prepare_multicast(local, mc_list->count);
|
|
+#else
|
|
+ trace_drv_prepare_multicast(local, mc_count);
|
|
+#endif
|
|
|
|
if (local->ops->prepare_multicast)
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
ret = local->ops->prepare_multicast(&local->hw, mc_list);
|
|
+#else
|
|
+ ret = local->ops->prepare_multicast(&local->hw, mc_count,
|
|
+ mc_list);
|
|
+#endif
|
|
|
|
trace_drv_return_u64(local, ret);
|
|
|
|
--- a/net/mac80211/ieee80211_i.h
|
|
+++ b/net/mac80211/ieee80211_i.h
|
|
@@ -787,7 +787,12 @@ struct ieee80211_local {
|
|
struct work_struct recalc_smps;
|
|
|
|
/* aggregated multicast list */
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
struct netdev_hw_addr_list mc_list;
|
|
+#else
|
|
+ struct dev_addr_list *mc_list;
|
|
+ int mc_count;
|
|
+#endif
|
|
|
|
bool tim_in_locked_section; /* see ieee80211_beacon_get() */
|
|
|
|
--- a/net/mac80211/iface.c
|
|
+++ b/net/mac80211/iface.c
|
|
@@ -447,8 +447,13 @@ static void ieee80211_do_stop(struct iee
|
|
|
|
netif_addr_lock_bh(sdata->dev);
|
|
spin_lock_bh(&local->filter_lock);
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
__hw_addr_unsync(&local->mc_list, &sdata->dev->mc,
|
|
sdata->dev->addr_len);
|
|
+#else
|
|
+ __dev_addr_unsync(&local->mc_list, &local->mc_count,
|
|
+ &sdata->dev->mc_list, &sdata->dev->mc_count);
|
|
+#endif
|
|
spin_unlock_bh(&local->filter_lock);
|
|
netif_addr_unlock_bh(sdata->dev);
|
|
|
|
@@ -616,7 +621,12 @@ static void ieee80211_set_multicast_list
|
|
sdata->flags ^= IEEE80211_SDATA_PROMISC;
|
|
}
|
|
spin_lock_bh(&local->filter_lock);
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
__hw_addr_sync(&local->mc_list, &dev->mc, dev->addr_len);
|
|
+#else
|
|
+ __dev_addr_sync(&local->mc_list, &local->mc_count,
|
|
+ &dev->mc_list, &dev->mc_count);
|
|
+#endif
|
|
spin_unlock_bh(&local->filter_lock);
|
|
ieee80211_queue_work(&local->hw, &local->reconfig_filter);
|
|
}
|
|
--- a/net/mac80211/main.c
|
|
+++ b/net/mac80211/main.c
|
|
@@ -71,7 +71,11 @@ void ieee80211_configure_filter(struct i
|
|
spin_lock_bh(&local->filter_lock);
|
|
changed_flags = local->filter_flags ^ new_flags;
|
|
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
mc = drv_prepare_multicast(local, &local->mc_list);
|
|
+#else
|
|
+ mc = drv_prepare_multicast(local, local->mc_count, local->mc_list);
|
|
+#endif
|
|
spin_unlock_bh(&local->filter_lock);
|
|
|
|
/* be a bit nasty */
|
|
@@ -631,9 +635,11 @@ struct ieee80211_hw *ieee80211_alloc_hw(
|
|
local->uapsd_max_sp_len = IEEE80211_DEFAULT_MAX_SP_LEN;
|
|
|
|
INIT_LIST_HEAD(&local->interfaces);
|
|
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
|
|
|
|
__hw_addr_init(&local->mc_list);
|
|
|
|
+#endif
|
|
mutex_init(&local->iflist_mtx);
|
|
mutex_init(&local->mtx);
|
|
|