2
0

200-compat.patch 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. --- a/src/vectoring/ifxmips_vectoring.c
  2. +++ b/src/vectoring/ifxmips_vectoring.c
  3. @@ -35,6 +35,8 @@
  4. #include <linux/module.h>
  5. #include <linux/etherdevice.h>
  6. #include <linux/proc_fs.h>
  7. +#include <linux/pkt_sched.h>
  8. +#include <linux/workqueue.h>
  9. /*
  10. * Chip Specific Head File
  11. @@ -88,6 +90,7 @@ static void dump_skb(struct sk_buff *skb
  12. static void ltq_vectoring_priority(uint32_t priority);
  13. +static void xmit_work_handler(struct work_struct *);
  14. /*
  15. * ####################################
  16. @@ -118,9 +121,11 @@ struct erb_head {
  17. static struct notifier_block g_netdev_event_handler_nb = {0};
  18. static struct net_device *g_ptm_net_dev = NULL;
  19. -static uint32_t vector_prio = 0;
  20. +static uint32_t vector_prio = TC_PRIO_CONTROL;
  21. static int g_dbg_enable = 0;
  22. +DECLARE_WORK(xmit_work, xmit_work_handler);
  23. +struct sk_buff_head xmit_queue;
  24. /*
  25. @@ -129,9 +134,16 @@ static int g_dbg_enable = 0;
  26. * ####################################
  27. */
  28. +static void xmit_work_handler(__attribute__((unused)) struct work_struct *work) {
  29. + struct sk_buff *skb;
  30. +
  31. + while ((skb = skb_dequeue(&xmit_queue)) != NULL) {
  32. + dev_queue_xmit(skb);
  33. + }
  34. +}
  35. +
  36. static int mei_dsm_cb_func(unsigned int *p_error_vector)
  37. {
  38. - int rc, ret;
  39. struct sk_buff *skb_list = NULL;
  40. struct sk_buff *skb;
  41. struct erb_head *erb;
  42. @@ -179,7 +191,6 @@ static int mei_dsm_cb_func(unsigned int
  43. }
  44. }
  45. - rc = 0;
  46. sent_size = 0;
  47. segment_code = 0;
  48. while ( (skb = skb_list) != NULL ) {
  49. @@ -197,24 +208,23 @@ static int mei_dsm_cb_func(unsigned int
  50. segment_code |= 0xC0;
  51. ((struct erb_head *)skb->data)->segment_code = segment_code;
  52. - skb->cb[13] = 0x5A; /* magic number indicating forcing QId */
  53. - skb->cb[15] = 0x00; /* highest priority queue */
  54. - skb->priority = vector_prio;
  55. + skb_reset_mac_header(skb);
  56. + skb_set_network_header(skb, offsetof(struct erb_head, llc_header));
  57. + skb->protocol = htons(ETH_P_802_2);
  58. + skb->priority = vector_prio;
  59. skb->dev = g_ptm_net_dev;
  60. dump_skb(skb, ~0, "vectoring TX", 0, 0, 1, 0);
  61. - ret = g_ptm_net_dev->netdev_ops->ndo_start_xmit(skb, g_ptm_net_dev);
  62. - if ( rc == 0 )
  63. - rc = ret;
  64. + skb_queue_tail(&xmit_queue, skb);
  65. + schedule_work(&xmit_work);
  66. segment_code++;
  67. }
  68. *p_error_vector = 0; /* notify DSL firmware that ERB is sent */
  69. - ASSERT(rc == 0, "dev_queue_xmit fail - %d", rc);
  70. - return rc;
  71. + return 0;
  72. }
  73. static void ltq_vectoring_priority(uint32_t priority)
  74. {
  75. @@ -242,7 +252,7 @@ static int netdev_event_handler(struct n
  76. return NOTIFY_DONE;
  77. netif = netdev_notifier_info_to_dev(netdev);
  78. - if ( strcmp(netif->name, "ptm0") != 0 )
  79. + if ( strcmp(netif->name, "dsl0") != 0 )
  80. return NOTIFY_DONE;
  81. g_ptm_net_dev = event == NETDEV_REGISTER ? netif : NULL;
  82. @@ -438,8 +448,10 @@ static int __init vectoring_init(void)
  83. 0,
  84. &g_proc_file_vectoring_dbg_seq_fops);
  85. + skb_queue_head_init(&xmit_queue);
  86. +
  87. register_netdev_event_handler();
  88. - g_ptm_net_dev = dev_get_by_name(&init_net, "ptm0");
  89. + g_ptm_net_dev = dev_get_by_name(&init_net, "dsl0");
  90. if ( g_ptm_net_dev != NULL )
  91. dev_put(g_ptm_net_dev);
  92. @@ -459,6 +471,8 @@ static void __exit vectoring_exit(void)
  93. unregister_netdev_event_handler();
  94. + flush_scheduled_work();
  95. +
  96. remove_proc_entry("driver/vectoring", NULL);
  97. }