add new wl integration patches, fixes tc issues
authorWaldemar Brodkorb <mail@waldemar-brodkorb.de>
Thu, 28 Apr 2005 09:01:53 +0000 (09:01 +0000)
committerWaldemar Brodkorb <mail@waldemar-brodkorb.de>
Thu, 28 Apr 2005 09:01:53 +0000 (09:01 +0000)
SVN-Revision: 743

openwrt/package/linux/kernel-patches/200-include_linux_netdevice_h.patch [new file with mode: 0644]
openwrt/package/linux/kernel-patches/201-include_linux_skbuff_h.patch [new file with mode: 0644]
openwrt/package/linux/kernel-patches/202-net_core_Makefile.patch [new file with mode: 0644]
openwrt/package/linux/kernel-patches/203-net_core_dev_c.patch [new file with mode: 0644]
openwrt/package/linux/kernel-patches/204-net_sched_sched_api_c.patch [new file with mode: 0644]
openwrt/package/linux/kernel-patches/205-net_sched_sched_generic_c.patch [new file with mode: 0644]
openwrt/package/linux/kernel-patches/206-include_net_pkt_sched_h.patch [new file with mode: 0644]

diff --git a/openwrt/package/linux/kernel-patches/200-include_linux_netdevice_h.patch b/openwrt/package/linux/kernel-patches/200-include_linux_netdevice_h.patch
new file mode 100644 (file)
index 0000000..5e758f0
--- /dev/null
@@ -0,0 +1,28 @@
+--- linux-mips-cvs-21012005/include/linux/netdevice.h  2004-11-19 01:28:51.000000000 +0100
++++ linux-broadcom/include/linux/netdevice.h   2005-01-26 19:51:37.000000000 +0100
+@@ -297,7 +297,10 @@
+        * See <net/iw_handler.h> for details. Jean II */
+       struct iw_handler_def * wireless_handlers;
++#ifndef CONFIG_BCM4710
+       struct ethtool_ops *ethtool_ops;
++#endif
++
+       /*
+        * This marks the end of the "visible" part of the structure. All
+@@ -353,7 +356,14 @@
+       struct Qdisc            *qdisc;
+       struct Qdisc            *qdisc_sleeping;
+       struct Qdisc            *qdisc_ingress;
++      /*
++       * this is needed for the wlan driver binary blob from linksys
++       */
++#ifdef CONFIG_BCM4710
++      struct Qdisc            *qdisc_list;
++#else
+       struct list_head        qdisc_list;
++#endif
+       unsigned long           tx_queue_len;   /* Max frames per queue allowed */
+       /* hard_start_xmit synchronizer */
diff --git a/openwrt/package/linux/kernel-patches/201-include_linux_skbuff_h.patch b/openwrt/package/linux/kernel-patches/201-include_linux_skbuff_h.patch
new file mode 100644 (file)
index 0000000..628eaea
--- /dev/null
@@ -0,0 +1,24 @@
+--- linux-mips-cvs-21012005/include/linux/skbuff.h     2005-01-31 12:56:47.000000000 +0100
++++ linux-broadcom/include/linux/skbuff.h      2005-01-31 12:55:24.000000000 +0100
+@@ -135,10 +135,6 @@
+       struct sock     *sk;                    /* Socket we are owned by                       */
+       struct timeval  stamp;                  /* Time we arrived                              */
+       struct net_device       *dev;           /* Device we arrived on/are leaving by          */
+-      struct net_device       *real_dev;      /* For support of point to point protocols 
+-                                                 (e.g. 802.3ad) over bonding, we must save the
+-                                                 physical device that got the packet before
+-                                                 replacing skb->dev with the virtual device.  */
+       /* Transport layer header */
+       union
+@@ -219,6 +215,10 @@
+ #ifdef CONFIG_NET_SCHED
+        __u32           tc_index;               /* traffic control index */
+ #endif
++      struct net_device       *real_dev;      /* For support of point to point protocols 
++                                                 (e.g. 802.3ad) over bonding, we must save the
++                                                 physical device that got the packet before
++                                                 replacing skb->dev with the virtual device.  */
+ };
+ #ifdef __KERNEL__
diff --git a/openwrt/package/linux/kernel-patches/202-net_core_Makefile.patch b/openwrt/package/linux/kernel-patches/202-net_core_Makefile.patch
new file mode 100644 (file)
index 0000000..8abeccc
--- /dev/null
@@ -0,0 +1,28 @@
+--- linux-mips-cvs-21012005/net/core/Makefile  2004-11-19 01:28:53.000000000 +0100
++++ linux-broadcom/net/core/Makefile   2005-01-26 15:56:36.000000000 +0100
+@@ -9,7 +9,11 @@
+ O_TARGET := core.o
++ifeq ($(CONFIG_BCM4710),y)
++export-objs := netfilter.o profile.o neighbour.o
++else
+ export-objs := netfilter.o profile.o ethtool.o neighbour.o
++endif
+ obj-y := sock.o skbuff.o iovec.o datagram.o scm.o
+@@ -21,8 +25,13 @@
+ obj-$(CONFIG_FILTER) += filter.o
++ifeq ($(CONFIG_BCM4710),y)
++obj-$(CONFIG_NET) +=  dev.o dev_mcast.o dst.o neighbour.o \
++                      rtnetlink.o utils.o
++else
+ obj-$(CONFIG_NET) +=  dev.o ethtool.o dev_mcast.o dst.o neighbour.o \
+                       rtnetlink.o utils.o
++endif
+ obj-$(CONFIG_NETFILTER) += netfilter.o
+ obj-$(CONFIG_NET_DIVERT) += dv.o
diff --git a/openwrt/package/linux/kernel-patches/203-net_core_dev_c.patch b/openwrt/package/linux/kernel-patches/203-net_core_dev_c.patch
new file mode 100644 (file)
index 0000000..b2ebccc
--- /dev/null
@@ -0,0 +1,18 @@
+--- linux-mips-cvs-21012005/net/core/dev.c     2004-04-16 05:14:21.000000000 +0200
++++ linux-broadcom/net/core/dev.c      2005-01-26 20:06:32.000000000 +0100
+@@ -2295,6 +2295,7 @@
+                       }
+                       return ret;
++#ifndef CONFIG_BCM4710
+               case SIOCETHTOOL:
+                       dev_load(ifr.ifr_name);
+                       rtnl_lock();
+@@ -2308,6 +2309,7 @@
+                                       ret = -EFAULT;
+                       }
+                       return ret;
++#endif
+               /*
+                *      These ioctl calls:
diff --git a/openwrt/package/linux/kernel-patches/204-net_sched_sched_api_c.patch b/openwrt/package/linux/kernel-patches/204-net_sched_sched_api_c.patch
new file mode 100644 (file)
index 0000000..1f2371e
--- /dev/null
@@ -0,0 +1,119 @@
+--- linux-2.4.30/net/sched/sch_api.c   2004-11-17 12:54:22.000000000 +0100
++++ linux-2.4.30-wl/net/sched/sch_api.c        2005-04-24 18:56:03.000000000 +0200
+@@ -194,11 +194,12 @@
+ {
+       struct Qdisc *q;
+-      list_for_each_entry(q, &dev->qdisc_list, list) {
++        for (q = dev->qdisc_list; q; q = q->next) {
+               if (q->handle == handle)
+                       return q;
+       }
+       return NULL;
++
+ }
+ struct Qdisc *qdisc_leaf(struct Qdisc *p, u32 classid)
+@@ -371,8 +372,6 @@
+                       unsigned long cl = cops->get(parent, classid);
+                       if (cl) {
+                               err = cops->graft(parent, cl, new, old);
+-                              if (new)
+-                                      new->parent = classid;
+                               cops->put(parent, cl);
+                       }
+               }
+@@ -427,7 +426,6 @@
+       memset(sch, 0, size);
+-      INIT_LIST_HEAD(&sch->list);
+       skb_queue_head_init(&sch->q);
+       if (handle == TC_H_INGRESS)
+@@ -453,7 +451,8 @@
+       if (!ops->init || (err = ops->init(sch, tca[TCA_OPTIONS-1])) == 0) {
+               write_lock(&qdisc_tree_lock);
+-              list_add_tail(&sch->list, &dev->qdisc_list);
++              sch->next = dev->qdisc_list;
++              dev->qdisc_list = sch;
+               write_unlock(&qdisc_tree_lock);
+ #ifdef CONFIG_NET_ESTIMATOR
+               if (tca[TCA_RATE-1])
+@@ -808,19 +807,16 @@
+               if (idx > s_idx)
+                       s_q_idx = 0;
+               read_lock(&qdisc_tree_lock);
+-              q_idx = 0;
+-              list_for_each_entry(q, &dev->qdisc_list, list) {
+-                      if (q_idx < s_q_idx) {
+-                              q_idx++;
+-                              continue;
+-                      }
+-                      if (tc_fill_qdisc(skb, q, q->parent, NETLINK_CB(cb->skb).pid,
+-                                        cb->nlh->nlmsg_seq, NLM_F_MULTI, RTM_NEWQDISC) <= 0) {
+-                              read_unlock(&qdisc_tree_lock);
+-                              goto done;
+-                      }
+-                      q_idx++;
+-              }
++                for (q = dev->qdisc_list, q_idx = 0; q;
++                     q = q->next, q_idx++) {
++                        if (q_idx < s_q_idx)
++                                continue;
++                        if (tc_fill_qdisc(skb, q, 0, NETLINK_CB(cb->skb).pid,
++                                          cb->nlh->nlmsg_seq, NLM_F_MULTI, RTM_NEWQDISC) <= 0) {
++                                read_unlock(&qdisc_tree_lock);
++                                goto done;
++                        }
++                }
+               read_unlock(&qdisc_tree_lock);
+       }
+@@ -1033,27 +1029,24 @@
+       t = 0;
+       read_lock(&qdisc_tree_lock);
+-      list_for_each_entry(q, &dev->qdisc_list, list) {
+-              if (t < s_t || !q->ops->cl_ops ||
+-                  (tcm->tcm_parent &&
+-                   TC_H_MAJ(tcm->tcm_parent) != q->handle)) {
+-                      t++;
+-                      continue;
+-              }
+-              if (t > s_t)
+-                      memset(&cb->args[1], 0, sizeof(cb->args)-sizeof(cb->args[0]));
+-              arg.w.fn = qdisc_class_dump;
+-              arg.skb = skb;
+-              arg.cb = cb;
+-              arg.w.stop  = 0;
+-              arg.w.skip = cb->args[1];
+-              arg.w.count = 0;
+-              q->ops->cl_ops->walk(q, &arg.w);
+-              cb->args[1] = arg.w.count;
+-              if (arg.w.stop)
+-                      break;
+-              t++;
+-      }
++        for (q=dev->qdisc_list, t=0; q; q = q->next, t++) {
++                if (t < s_t) continue;
++                if (!q->ops->cl_ops) continue;
++                if (tcm->tcm_parent && TC_H_MAJ(tcm->tcm_parent) != q->handle)
++                        continue;
++                if (t > s_t)
++                        memset(&cb->args[1], 0, sizeof(cb->args)-sizeof(cb->args[0]));
++                arg.w.fn = qdisc_class_dump;
++                arg.skb = skb;
++                arg.cb = cb;
++                arg.w.stop  = 0;
++                arg.w.skip = cb->args[1];
++                arg.w.count = 0;
++                q->ops->cl_ops->walk(q, &arg.w);
++                cb->args[1] = arg.w.count;
++                if (arg.w.stop)
++                        break;
++        }
+       read_unlock(&qdisc_tree_lock);
+       cb->args[0] = t;
diff --git a/openwrt/package/linux/kernel-patches/205-net_sched_sched_generic_c.patch b/openwrt/package/linux/kernel-patches/205-net_sched_sched_generic_c.patch
new file mode 100644 (file)
index 0000000..9de11d3
--- /dev/null
@@ -0,0 +1,64 @@
+--- linux-2.4.30/net/sched/sch_generic.c       2004-11-17 12:54:22.000000000 +0100
++++ linux-2.4.30-wl/net/sched/sch_generic.c    2005-04-24 18:09:38.000000000 +0200
+@@ -392,7 +392,6 @@
+               return NULL;
+       memset(sch, 0, size);
+-      INIT_LIST_HEAD(&sch->list);
+       skb_queue_head_init(&sch->q);
+       sch->ops = ops;
+       sch->enqueue = ops->enqueue;
+@@ -422,11 +421,22 @@
+ void qdisc_destroy(struct Qdisc *qdisc)
+ {
+       struct Qdisc_ops *ops = qdisc->ops;
++      struct net_device *dev;
+       if (qdisc->flags&TCQ_F_BUILTIN ||
+           !atomic_dec_and_test(&qdisc->refcnt))
+               return;
+-      list_del(&qdisc->list);
++
++      dev = qdisc->dev;
++      if (dev) {
++              struct Qdisc *q, **qp;
++              for (qp = &qdisc->dev->qdisc_list; (q=*qp) != NULL; qp = &q->next) {
++                      if (q == qdisc) {
++                              *qp = q->next;
++                              break;
++                      }
++              }
++      }
+ #ifdef CONFIG_NET_ESTIMATOR
+       qdisc_kill_estimator(&qdisc->stats);
+ #endif
+@@ -455,9 +465,9 @@
+                               return;
+                       }
+                       write_lock(&qdisc_tree_lock);
+-                      list_add_tail(&qdisc->list, &dev->qdisc_list);
++                      qdisc->next = dev->qdisc_list;
++                      dev->qdisc_list = qdisc;
+                       write_unlock(&qdisc_tree_lock);
+-
+               } else {
+                       qdisc =  &noqueue_qdisc;
+               }
+@@ -501,7 +511,7 @@
+       dev->qdisc = &noop_qdisc;
+       spin_unlock_bh(&dev->queue_lock);
+       dev->qdisc_sleeping = &noop_qdisc;
+-      INIT_LIST_HEAD(&dev->qdisc_list);
++      dev->qdisc_list = NULL;
+       write_unlock(&qdisc_tree_lock);
+       dev_watchdog_init(dev);
+@@ -523,7 +533,7 @@
+               qdisc_destroy(qdisc);
+         }
+ #endif
+-      BUG_TRAP(list_empty(&dev->qdisc_list));
++      BUG_TRAP(dev->qdisc_list == NULL);
+       BUG_TRAP(!timer_pending(&dev->watchdog_timer));
+       spin_unlock_bh(&dev->queue_lock);
+       write_unlock(&qdisc_tree_lock);
diff --git a/openwrt/package/linux/kernel-patches/206-include_net_pkt_sched_h.patch b/openwrt/package/linux/kernel-patches/206-include_net_pkt_sched_h.patch
new file mode 100644 (file)
index 0000000..f6bd014
--- /dev/null
@@ -0,0 +1,25 @@
+--- linux-2.4.30/include/net/pkt_sched.h       2004-11-17 12:54:22.000000000 +0100
++++ linux-2.4.30-wl/include/net/pkt_sched.h    2005-04-24 18:32:48.000000000 +0200
+@@ -59,7 +59,7 @@
+       int                     (*enqueue)(struct sk_buff *, struct Qdisc *);
+       struct sk_buff *        (*dequeue)(struct Qdisc *);
+       int                     (*requeue)(struct sk_buff *, struct Qdisc *);
+-      unsigned int            (*drop)(struct Qdisc *);
++      int                     (*drop)(struct Qdisc *);
+       int                     (*init)(struct Qdisc *, struct rtattr *arg);
+       void                    (*reset)(struct Qdisc *);
+@@ -80,12 +80,11 @@
+ #define TCQ_F_THROTTLED       2
+ #define TCQ_F_INGRESS 4
+       struct Qdisc_ops        *ops;
++      struct Qdisc            *next;
+       u32                     handle;
+-      u32                     parent;
+       atomic_t                refcnt;
+       struct sk_buff_head     q;
+       struct net_device       *dev;
+-      struct list_head        list;
+       struct tc_stats         stats;
+       int                     (*reshape_fail)(struct sk_buff *skb, struct Qdisc *q);