Quantenna sdk-v37.4.1.89: Files from outside the Linux tree
mkdir drivers/qtn
cp -pr
/usr/local/hdd1/home/danielmentz/quantenna-sdk-v37.4.1.89.pristine/drivers/*
drivers/qtn
mkdir arch/arc/plat-qtn/sdk-qsr1000
cp -pr
/usr/local/hdd1/home/danielmentz/quantenna-sdk-v37.4.1.89.pristine/common/
arch/arc/plat-qtn/sdk-qsr1000
cp -pr
/usr/local/hdd1/home/danielmentz/quantenna-sdk-v37.4.1.89.pristine/include/
arch/arc/plat-qtn/sdk-qsr1000
rm arch/arc/include/asm/board-ruby
ln -s ../../../../drivers/qtn/ruby/ arch/arc/include/asm/board-ruby
rm -rf arch/arc/plat-qtn/sdk-qsr1000/common/doxygen
diff --git a/drivers/qtn/qdrv/qdrv_bridge.h b/drivers/qtn/qdrv/qdrv_bridge.h
new file mode 100644
index 0000000..d79ef0a
--- /dev/null
+++ b/drivers/qtn/qdrv/qdrv_bridge.h
@@ -0,0 +1,126 @@
+/**
+ Copyright (c) 2008 - 2013 Quantenna Communications Inc
+ All Rights Reserved
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that 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 Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ **/
+
+#ifndef _QDRV_BRIDGE_H_
+#define _QDRV_BRIDGE_H_
+
+#include <linux/inetdevice.h>
+#include <linux/if_arp.h>
+#include <linux/ip.h>
+#if defined(CONFIG_IPV6)
+#include <net/ipv6.h>
+#include <linux/in6.h>
+#endif
+#include <net80211/if_ethersubr.h>
+#include "qdrv_mac.h"
+#include "qdrv_soc.h"
+#include "qdrv_comm.h"
+
+#define QDRV_BR_ENT_MAX 128 /* unicast clients */
+#define QDRV_BR_MCAST_MAX 128 /* multicast addresses & clients */
+#define QDRV_BR_MAC_HASH_SIZE 256
+#define QDRV_BR_IP_HASH_SIZE 256
+
+struct ether_arp {
+ struct arphdr ea_hdr; /* fixed-size header */
+ u_int8_t arp_sha[ETH_ALEN]; /* sender hardware address */
+ u_int8_t arp_spa[4]; /* sender protocol address */
+ u_int8_t arp_tha[ETH_ALEN]; /* target hardware address */
+ u_int8_t arp_tpa[4]; /* target protocol address */
+};
+
+/*
+ * Each bridge table (one per vap) contains:
+ * - a list of downstream (unicast) clients, keyed by MAC address and IP address hash
+ * - a list of multicast addresses, keyed by IP address, containing a list of
+ * subscribed downstream client MAC addresses
+ * All keys are implemented as hash tables.
+ */
+struct qdrv_br_uc {
+ __be32 ip_addr;
+ unsigned char mac_addr[IEEE80211_ADDR_LEN];
+ struct hlist_node mac_hlist;
+ struct hlist_node ip_hlist;
+ struct rcu_head rcu;
+};
+
+struct qdrv_br_mc {
+ __be32 mc_ip_addr;
+ atomic_t mc_client_tot;
+ struct hlist_node mc_hlist;
+ struct hlist_head mc_client_hash[QDRV_BR_IP_HASH_SIZE];
+ struct rcu_head rcu;
+};
+
+struct qdrv_br_mc_client {
+ unsigned char mac_addr[IEEE80211_ADDR_LEN];
+ struct hlist_node mc_client_hlist;
+ struct rcu_head rcu;
+};
+
+#if defined(CONFIG_IPV6)
+struct qdrv_br_ipv6_uc {
+ struct in6_addr ipv6_addr;
+ unsigned char mac_addr[ETH_ALEN];
+ struct hlist_node mac_hlist;
+ struct hlist_node ipv6_hlist;
+ struct rcu_head rcu;
+};
+#endif
+
+struct qdrv_br {
+ spinlock_t uc_lock;
+ spinlock_t mc_lock;
+ unsigned long uc_lock_flags;
+ unsigned long mc_lock_flags;
+ atomic_t uc_tot;
+ atomic_t mc_tot; // Total multicast and client entries
+ struct hlist_head uc_mac_hash[QDRV_BR_MAC_HASH_SIZE];
+ struct hlist_head uc_ip_hash[QDRV_BR_IP_HASH_SIZE];
+ struct hlist_head mc_ip_hash[QDRV_BR_IP_HASH_SIZE];
+#if defined(CONFIG_IPV6)
+ struct hlist_head uc_ipv6_hash[QDRV_BR_IP_HASH_SIZE];
+ atomic_t uc_ipv6_tot;
+ spinlock_t uc_ipv6_lock;
+ unsigned long uc_ipv6_lock_flags;
+#endif
+};
+
+void qdrv_br_create(struct qdrv_br *br);
+void qdrv_br_exit(struct qdrv_br *br);
+void qdrv_br_delete(struct qdrv_br *br);
+void qdrv_br_show(struct qdrv_br *br);
+void qdrv_br_clear(struct qdrv_br *br);
+void qdrv_br_uc_update_from_dhcp(struct qdrv_br *br, struct sk_buff *skb,
+ struct iphdr *iphdr_p);
+void qdrv_br_uc_update_from_arp(struct qdrv_br *br, struct ether_arp *arp);
+int qdrv_br_mc_update_from_igmp(struct qdrv_br *br, struct sk_buff *skb,
+ struct ether_header *eh, struct iphdr *iphdr_p);
+
+#if defined(CONFIG_IPV6)
+void qdrv_br_ipv6uc_update_from_icmpv6(struct qdrv_br *br,
+ const struct ethhdr *eth,
+ const struct ipv6hdr *ipv6h,
+ const struct icmp6hdr *icmpv6h);
+#endif
+
+int qdrv_br_set_dest_mac(struct qdrv_br *br, struct ether_header *eh, const struct sk_buff *skb);
+
+#endif