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 #include #include +#include +#include +#include +#include +#include #include #include @@ -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)