diff options
Diffstat (limited to 'package/ar7-atm/patches/170-add-hotplug-status.patch')
-rw-r--r-- | package/ar7-atm/patches/170-add-hotplug-status.patch | 128 |
1 files changed, 128 insertions, 0 deletions
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 index 0000000000..121a1e4c53 --- /dev/null +++ b/package/ar7-atm/patches/170-add-hotplug-status.patch @@ -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) |