updated led status on atm events (#2996)
authorFlorian Fainelli <florian@openwrt.org>
Tue, 26 May 2009 09:32:28 +0000 (09:32 +0000)
committerFlorian Fainelli <florian@openwrt.org>
Tue, 26 May 2009 09:32:28 +0000 (09:32 +0000)
SVN-Revision: 16074

package/ar7-atm/patches/170-add-hotplug-status.patch [new file with mode: 0644]

diff --git a/package/ar7-atm/patches/170-add-hotplug-status.patch b/package/ar7-atm/patches/170-add-hotplug-status.patch
new file mode 100644 (file)
index 0000000..121a1e4
--- /dev/null
@@ -0,0 +1,128 @@
+diff -urN sangam_atm-D7.03.01.00.orig/tn7dsl.c sangam_atm-D7.03.01.00/tn7dsl.c
+--- sangam_atm-D7.03.01.00.orig/tn7dsl.c       2008-01-05 03:11:03.000000000 +0100
++++ sangam_atm-D7.03.01.00/tn7dsl.c    2008-01-06 18:13:24.000000000 +0000
+@@ -109,6 +109,11 @@
+ #include <linux/vmalloc.h>
+ #include <linux/file.h>
+ #include <linux/firmware.h>
++#include <linux/skbuff.h>
++#include <linux/netlink.h>
++#include <net/sock.h>
++#include <linux/kobject.h>
++#include <asm/uaccess.h>
+ #include <asm/io.h>
+ #include <asm/ar7/ar7.h>
+@@ -296,6 +301,8 @@
+ /* externs */
+ extern struct atm_dev *mydev;
+ extern unsigned int oamFarLBCount[4];
++extern struct sock *uevent_sock;
++extern u64 uevent_next_seqnum(void);
+ /* module wide declars */
+ static PITIDSLHW_T    pIhw;
+@@ -333,6 +340,75 @@
+       return 0;
+ }
++static inline void add_msg(struct sk_buff *skb, char *msg) 
++{ 
++      char *scratch; 
++      scratch = skb_put(skb, strlen(msg) + 1); 
++      sprintf(scratch, msg); 
++} 
++
++static void hotplug_dsl_status(void)
++{
++      struct sk_buff *skb;
++      size_t len;
++      char *scratch, *dsl_status;
++      char buf[128];
++      u64 seq;
++      
++      if (!uevent_sock) {
++              printk("avsar: unable to create netlink socket!\n");
++              return;
++      }    
++
++      switch (pIhw->AppData.bState)
++      {
++      case RSTATE_TEST:
++                dsl_status="TEST";
++              break;
++      case RSTATE_IDLE:
++              dsl_status="IDLE";
++                break;
++      case RSTATE_INIT:
++              dsl_status="INIT";
++                break;
++      case RSTATE_HS:
++              dsl_status="HANDSHAKE";
++                break;
++      case RSTATE_RTDL:
++              dsl_status="RETRAIN";
++                break;
++      case RSTATE_SHOWTIME:
++              dsl_status="SHOWTIME";
++                break;
++      default:
++              dsl_status="UNKNOWN";
++      }
++
++      /* allocate message with the maximum possible size */
++      len = strlen(dsl_status) +2;
++      skb = alloc_skb(len + 2048, GFP_KERNEL);
++      if (!skb)
++              return;
++      
++      /* add header */
++      scratch = skb_put(skb, len);
++      sprintf(scratch, "%s@",dsl_status);
++
++      /* copy keys to our continuous event payload buffer */
++      add_msg(skb, "HOME=/");
++      add_msg(skb, "PATH=/sbin:/bin:/usr/sbin:/usr/bin");
++      add_msg(skb, "SUBSYSTEM=atm");
++      add_msg(skb, "DEVICENAME=avsar0");
++      snprintf(buf, 128, "ACTION=%s", dsl_status); 
++      add_msg(skb, buf);
++      seq = uevent_next_seqnum();
++      snprintf(buf, 128, "SEQNUM=%llu", (unsigned long long)seq);
++      add_msg(skb, buf);
++      
++      NETLINK_CB(skb).dst_group = 1;
++      netlink_broadcast(uevent_sock, skb, 0, 1, GFP_KERNEL);
++}
++
+ int os_atoi(const char *pStr)
+ {
+@@ -2558,7 +2634,7 @@
+ inline int tn7dsl_handle_interrupt(void)
+ {
+-  int intsrc;
++  int intsrc,curState;
+   unsigned char cMsgRa[6];
+   short margin;
+   extern unsigned int def_sar_inter_pace;   //Sorry
+@@ -2573,7 +2649,7 @@
+     if (nohost_flag) return 0;
+-
++    curState=pIhw->AppData.bState;
+     dslhal_api_handleTrainingInterrupt(pIhw, intsrc);
+     if(pIhw->lConnected == TC_SYNC)
+@@ -2704,8 +2780,8 @@
+       }
+ #endif
+-
+     }
++    if(pIhw->AppData.bState != curState) hotplug_dsl_status();
+     //UR8_MERGE_START CQ10442 Manjula K
+     if (pIhw->AppData.SRA)