patch-tn7dsl_c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602
  1. --- sangam-atm-1.0.orig/tn7dsl.c 2007-01-04 09:04:14.000000000 +0100
  2. +++ sangam-atm-1.0/tn7dsl.c 2009-12-17 19:22:19.372420289 +0100
  3. @@ -94,7 +94,6 @@
  4. * 1/02/07 JZ CQ11054: Data Precision and Range Changes for TR-069 Conformance
  5. * UR8_MERGE_END CQ11054*
  6. *********************************************************************************************/
  7. -#include <linux/config.h>
  8. #include <linux/kernel.h>
  9. #include <linux/module.h>
  10. #include <linux/init.h>
  11. @@ -102,8 +101,6 @@
  12. #include <linux/delay.h>
  13. #include <linux/spinlock.h>
  14. #include <linux/smp_lock.h>
  15. -#include <asm/io.h>
  16. -#include <asm/mips-boards/prom.h>
  17. #include <linux/proc_fs.h>
  18. #include <linux/string.h>
  19. #include <linux/ctype.h>
  20. @@ -111,6 +108,18 @@
  21. #include <linux/timer.h>
  22. #include <linux/vmalloc.h>
  23. #include <linux/file.h>
  24. +#include <linux/firmware.h>
  25. +#include <linux/version.h>
  26. +
  27. +#include <asm/io.h>
  28. +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31)
  29. +#include <asm/ar7/ar7.h>
  30. +#include <asm/ar7/prom.h>
  31. +#else
  32. +#include <asm/mach-ar7/ar7.h>
  33. +#include <asm/mach-ar7/prom.h>
  34. +#endif
  35. +
  36. /* Modules specific header files */
  37. #include "tn7atm.h"
  38. #include "tn7api.h"
  39. @@ -133,6 +142,27 @@
  40. #define NEW_TRAINING_VAL_T1413 128
  41. #define NEW_TRAINING_VAL_MMODE 255
  42. +extern char *mp_modulation;
  43. +extern int mp_fine_gain_control;
  44. +extern int mp_fine_gain_value;
  45. +extern int mp_enable_margin_retrain;
  46. +extern int mp_margin_threshold;
  47. +extern int mp_enable_rate_adapt;
  48. +extern int mp_powercutback;
  49. +extern int mp_trellis;
  50. +extern int mp_bitswap;
  51. +extern int mp_maximum_bits_per_carrier;
  52. +extern int mp_maximum_interleave_depth;
  53. +extern int mp_pair_selection;
  54. +extern int mp_dgas_polarity;
  55. +extern int mp_los_alarm;
  56. +extern char *mp_eoc_vendor_id;
  57. +extern int mp_eoc_vendor_revision;
  58. +extern char *mp_eoc_vendor_serialnum;
  59. +extern char *mp_invntry_vernum;
  60. +extern int mp_dsl_bit_tmode;
  61. +extern int mp_high_precision;
  62. +
  63. int testflag1 = 0;
  64. extern int __guDbgLevel;
  65. extern sar_stat_t sarStat;
  66. @@ -173,7 +203,7 @@ led_reg_t ledreg[2];
  67. static struct led_funcs ledreg[2];
  68. #endif
  69. -#define DEV_DSLMOD 1
  70. +#define DEV_DSLMOD CTL_UNNUMBERED
  71. #define MAX_STR_SIZE 256
  72. #define DSL_MOD_SIZE 256
  73. @@ -299,7 +329,7 @@ static PITIDSLHW_T pIhw;
  74. static volatile int bshutdown;
  75. static char info[MAX_STR_SIZE];
  76. /* Used for DSL Polling enable */
  77. -static DECLARE_MUTEX_LOCKED (adsl_sem_overlay);
  78. +static struct semaphore adsl_sem_overlay;
  79. //kthread_t overlay_thread;
  80. /* end of module wide declars */
  81. @@ -323,6 +353,14 @@ static int tn7dsl_proc_snr_print (char *
  82. #define gDot1(a) ((a>0)?(a%10):((-a)%10))
  83. // UR8_MERGE_END CQ11054*
  84. +int avalanche_request_intr_pacing(int irq_nr, unsigned int blk_num,
  85. + unsigned int pace_value)
  86. +{
  87. + printk("avalanche_request_pacing(%d, %u, %u); // not implemented\n", irq_nr, blk_num, pace_value);
  88. + return 0;
  89. +}
  90. +
  91. +
  92. int os_atoi(const char *pStr)
  93. {
  94. int MulNeg = (*pStr == '-' ? -1 : 1);
  95. @@ -359,39 +397,6 @@ void dprintf (int uDbgLevel, char *szFmt
  96. #endif
  97. }
  98. -int strcmp(const char *s1, const char *s2)
  99. -{
  100. -
  101. - int size = strlen(s1);
  102. -
  103. - return(strncmp(s1, s2, size));
  104. -}
  105. -
  106. -int strncmp(const char *s1, const char *s2, size_t size)
  107. -{
  108. - int i = 0;
  109. - int max_size = (int)size;
  110. -
  111. - while((s1[i] != 0) && i < max_size)
  112. - {
  113. - if(s2[i] == 0)
  114. - {
  115. - return -1;
  116. - }
  117. - if(s1[i] != s2[i])
  118. - {
  119. - return 1;
  120. - }
  121. - i++;
  122. - }
  123. - if(s2[i] != 0)
  124. - {
  125. - return 1;
  126. - }
  127. -
  128. - return 0;
  129. -}
  130. -
  131. // * UR8_MERGE_START CQ10640 Jack Zhang
  132. int tn7dsl_dump_dsp_memory(char *input_str) //cph99
  133. {
  134. @@ -441,101 +446,79 @@ unsigned int shim_osGetCpuFrequency(void
  135. return CpuFrequency;
  136. }
  137. -int shim_osLoadFWImage(unsigned char *ptr)
  138. +static void avsar_release(struct device *dev)
  139. {
  140. - unsigned int bytesRead;
  141. - mm_segment_t oldfs;
  142. - static struct file *filp;
  143. - unsigned int imageLength=0x5ffff;
  144. -
  145. -
  146. - dgprintf(4, "tn7dsl_read_dsp()\n");
  147. -
  148. - dgprintf(4,"open file %s\n", DSP_FIRMWARE_PATH);
  149. -
  150. - filp=filp_open(DSP_FIRMWARE_PATH,00,O_RDONLY);
  151. - if(filp ==NULL)
  152. - {
  153. - printk("Failed: Could not open DSP binary file\n");
  154. - return -1;
  155. - }
  156. -
  157. - if (filp->f_dentry != NULL)
  158. - {
  159. - if (filp->f_dentry->d_inode != NULL)
  160. - {
  161. - printk ("DSP binary filesize = %d bytes\n",
  162. - (int) filp->f_dentry->d_inode->i_size);
  163. - imageLength = (unsigned int)filp->f_dentry->d_inode->i_size + 0x200;
  164. - }
  165. - }
  166. -
  167. - if (filp->f_op->read==NULL)
  168. - return -1; /* File(system) doesn't allow reads */
  169. -
  170. - /*
  171. - * Disable parameter checking
  172. - */
  173. - oldfs = get_fs();
  174. - set_fs(KERNEL_DS);
  175. -
  176. - /*
  177. - * Now read bytes from postion "StartPos"
  178. - */
  179. - filp->f_pos = 0;
  180. -
  181. - bytesRead = filp->f_op->read(filp,ptr,imageLength,&filp->f_pos);
  182. -
  183. - dgprintf(4,"file length = %d\n", bytesRead);
  184. -
  185. - set_fs(oldfs);
  186. -
  187. - /*
  188. - * Close the file
  189. - */
  190. - fput(filp);
  191. -
  192. - return bytesRead;
  193. + printk(KERN_DEBUG "avsar firmware released\n");
  194. }
  195. +static struct device avsar = {
  196. +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)
  197. + .bus_id = "vlynq",
  198. +#endif
  199. + .release = avsar_release,
  200. +};
  201. -unsigned int shim_read_overlay_page (void *ptr, unsigned int secOffset,
  202. - unsigned int secLength)
  203. +int shim_osLoadFWImage(unsigned char *ptr)
  204. {
  205. - unsigned int bytesRead;
  206. - mm_segment_t oldfs;
  207. - struct file *filp;
  208. -
  209. - dgprintf(4,"shim_read_overlay_page\n");
  210. - //dgprintf(4,"sec offset=%d, sec length =%d\n", secOffset, secLength);
  211. + const struct firmware *fw_entry;
  212. + size_t size;
  213. - filp=filp_open(DSP_FIRMWARE_PATH,00,O_RDONLY);
  214. - if(filp ==NULL)
  215. - {
  216. - printk("Failed: Could not open DSP binary file\n");
  217. - return -1;
  218. - }
  219. +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30)
  220. + dev_set_name(&avsar, "avsar");
  221. +#endif
  222. + printk("requesting firmware image \"ar0700xx.bin\"\n");
  223. + if(device_register(&avsar) < 0) {
  224. + printk(KERN_ERR
  225. + "avsar: device_register fails\n");
  226. + return -1;
  227. + }
  228. - if (filp->f_op->read==NULL)
  229. - return -1; /* File(system) doesn't allow reads */
  230. + if(request_firmware(&fw_entry, "ar0700xx.bin", &avsar)) {
  231. + printk(KERN_ERR
  232. + "avsar: Firmware not available\n");
  233. + device_unregister(&avsar);
  234. + return -1;
  235. + }
  236. + size = fw_entry->size;
  237. + device_unregister(&avsar);
  238. + if(size > 0x5ffff) {
  239. + printk(KERN_ERR
  240. + "avsar: Firmware too big (%d bytes)\n", size);
  241. + release_firmware(fw_entry);
  242. + return -1;
  243. + }
  244. + memcpy(ptr, fw_entry->data, size);
  245. + release_firmware(fw_entry);
  246. + return size;
  247. +}
  248. - /*
  249. - * Now read bytes from postion "StartPos"
  250. - */
  251. +unsigned int shim_read_overlay_page(void *ptr, unsigned int secOffset, unsigned int secLength)
  252. +{
  253. + const struct firmware *fw_entry;
  254. - if(filp->f_op->llseek)
  255. - filp->f_op->llseek(filp,secOffset, 0);
  256. - oldfs = get_fs();
  257. - set_fs(KERNEL_DS);
  258. - filp->f_pos = secOffset;
  259. - bytesRead = filp->f_op->read(filp,ptr,secLength,&filp->f_pos);
  260. + printk("requesting firmware image \"ar0700xx.bin\"\n");
  261. + if(device_register(&avsar) < 0) {
  262. + printk(KERN_ERR
  263. + "avsar: device_register fails\n");
  264. + return -1;
  265. + }
  266. - set_fs(oldfs);
  267. - /*
  268. - * Close the file
  269. - */
  270. - fput(filp);
  271. - return bytesRead;
  272. + if(request_firmware(&fw_entry, "ar0700xx.bin", &avsar)) {
  273. + printk(KERN_ERR
  274. + "avsar: Firmware not available\n");
  275. + device_unregister(&avsar);
  276. + return -1;
  277. + }
  278. + device_unregister(&avsar);
  279. + if(fw_entry->size > secLength) {
  280. + printk(KERN_ERR
  281. + "avsar: Firmware too big (%d bytes)\n", fw_entry->size);
  282. + release_firmware(fw_entry);
  283. + return -1;
  284. + }
  285. + memcpy(ptr + secOffset, fw_entry->data, secLength);
  286. + release_firmware(fw_entry);
  287. + return secLength;
  288. }
  289. int shim_osLoadDebugFWImage(unsigned char *ptr)
  290. @@ -2845,98 +2828,82 @@ static int tn7dsl_set_dsl(void)
  291. (unsigned int *) &offset,
  292. (unsigned char *) &oamFeature, 4);
  293. - /* Do only if we are in the new Base PSP 7.4.*/
  294. - #if ((PSP_VERSION_MAJOR == 7) && (PSP_VERSION_MINOR == 4))
  295. - /* Check to see if we are operating in the new bit mode. */
  296. - ptr = prom_getenv("DSL_BIT_TMODE");
  297. - if (ptr)
  298. - {
  299. - /* If we are see if this is the first time the user has upgraded. */
  300. - ptr = prom_getenv("DSL_UPG_DONE");
  301. - if(!ptr)
  302. - {
  303. - /* If it is the first time the user is upgrading, then make sure that
  304. - we clear the modulation environment variable, as this could potentially
  305. - not have the same meaning in the new mode.
  306. - */
  307. - prom_unsetenv("modulation");
  308. - prom_setenv("DSL_UPG_DONE", "1");
  309. - }
  310. - }
  311. - #endif
  312. -
  313. // modulation
  314. ptr = prom_getenv("modulation");
  315. - if (ptr)
  316. + if (ptr || mp_modulation != NULL)
  317. {
  318. - tn7dsl_set_modulation(ptr, FALSE);
  319. + tn7dsl_set_modulation(mp_modulation == NULL ? ptr : mp_modulation, FALSE);
  320. }
  321. // Fine Gains
  322. ptr = prom_getenv("fine_gain_control");
  323. - if (ptr)
  324. + if (ptr || mp_fine_gain_control != -1)
  325. {
  326. - value = os_atoi(ptr);
  327. + value = mp_fine_gain_control == -1 ? os_atoi(ptr) : mp_fine_gain_control;
  328. tn7dsl_ctrl_fineGain(value);
  329. }
  330. ptr = NULL;
  331. ptr = prom_getenv("fine_gain_value");
  332. - if(ptr)
  333. - tn7dsl_set_fineGainValue(os_atoh(ptr));
  334. + if(ptr || mp_fine_gain_value != -1)
  335. + tn7dsl_set_fineGainValue(mp_fine_gain_value == -1 ? os_atoh(ptr) : mp_fine_gain_value);
  336. // margin retrain
  337. ptr = NULL;
  338. ptr = prom_getenv("enable_margin_retrain");
  339. - if(ptr)
  340. + value = mp_enable_margin_retrain == -1 ? (ptr ? os_atoi(ptr) : 0) : mp_enable_margin_retrain;
  341. +
  342. + if (value == 1)
  343. {
  344. - value = os_atoi(ptr);
  345. - if(value == 1)
  346. + dslhal_api_setMarginMonitorFlags(pIhw, 0, 1);
  347. + bMarginRetrainEnable = 1;
  348. + //printk("enable showtime margin monitor.\n");
  349. +
  350. + ptr = NULL;
  351. + ptr = prom_getenv("margin_threshold");
  352. + value = mp_margin_threshold == -1 ? (ptr ? os_atoi(ptr) : 0) : mp_margin_threshold;
  353. +
  354. + if(value >= 0)
  355. {
  356. - dslhal_api_setMarginMonitorFlags(pIhw, 0, 1);
  357. - bMarginRetrainEnable = 1;
  358. - //printk("enable showtime margin monitor.\n");
  359. - ptr = NULL;
  360. - ptr = prom_getenv("margin_threshold");
  361. - if(ptr)
  362. - {
  363. - value = os_atoi(ptr);
  364. - //printk("Set margin threshold to %d x 0.5 db\n",value);
  365. - if(value >= 0)
  366. - {
  367. - dslhal_api_setMarginThreshold(pIhw, value);
  368. - bMarginThConfig=1;
  369. - }
  370. - }
  371. + dslhal_api_setMarginThreshold(pIhw, value);
  372. + bMarginThConfig=1;
  373. }
  374. }
  375. // rate adapt
  376. ptr = NULL;
  377. ptr = prom_getenv("enable_rate_adapt");
  378. - if(ptr)
  379. + if(ptr || mp_enable_rate_adapt != -1)
  380. {
  381. - dslhal_api_setRateAdaptFlag(pIhw, os_atoi(ptr));
  382. + dslhal_api_setRateAdaptFlag(pIhw, mp_enable_rate_adapt == -1 ? os_atoi(ptr) : mp_enable_rate_adapt);
  383. + }
  384. +
  385. + // set powercutback
  386. + ptr = NULL;
  387. + ptr = prom_getenv("powercutback");
  388. + if(ptr || mp_powercutback != -1)
  389. + {
  390. + dslhal_advcfg_onOffPcb(pIhw, mp_powercutback == -1 ? os_atoi(ptr) : mp_powercutback);
  391. }
  392. // trellis
  393. ptr = NULL;
  394. ptr = prom_getenv("trellis");
  395. - if(ptr)
  396. + if(ptr || mp_trellis != -1)
  397. {
  398. - dslhal_api_setTrellisFlag(pIhw, os_atoi(ptr));
  399. - trellis = os_atoi(ptr);
  400. + trellis = mp_trellis == -1 ? os_atoi(ptr) : mp_trellis;
  401. + dslhal_api_setTrellisFlag(pIhw, trellis);
  402. //printk("trellis=%d\n");
  403. }
  404. // bitswap
  405. ptr = NULL;
  406. ptr = prom_getenv("bitswap");
  407. - if(ptr)
  408. + if(ptr || mp_bitswap != -1)
  409. {
  410. int offset[2] = {33, 0};
  411. unsigned int bitswap;
  412. - bitswap = os_atoi(ptr);
  413. + bitswap = mp_bitswap == -1 ? os_atoi(ptr) : mp_bitswap;
  414. tn7dsl_generic_read(2, offset);
  415. dslReg &= dslhal_support_byteSwap32(0xFFFFFF00);
  416. @@ -2954,46 +2921,47 @@ static int tn7dsl_set_dsl(void)
  417. // maximum bits per carrier
  418. ptr = NULL;
  419. ptr = prom_getenv("maximum_bits_per_carrier");
  420. - if(ptr)
  421. + if(ptr || mp_maximum_bits_per_carrier != -1)
  422. {
  423. - dslhal_api_setMaxBitsPerCarrierUpstream(pIhw, os_atoi(ptr));
  424. + dslhal_api_setMaxBitsPerCarrierUpstream(pIhw, mp_maximum_bits_per_carrier == -1 ? os_atoi(ptr) : mp_maximum_bits_per_carrier);
  425. }
  426. // maximum interleave depth
  427. ptr = NULL;
  428. ptr = prom_getenv("maximum_interleave_depth");
  429. - if(ptr)
  430. + if(ptr || mp_maximum_interleave_depth != -1)
  431. {
  432. - dslhal_api_setMaxInterleaverDepth(pIhw, os_atoi(ptr));
  433. + dslhal_api_setMaxInterleaverDepth(pIhw, mp_maximum_interleave_depth == -1 ? os_atoi(ptr) : mp_maximum_interleave_depth);
  434. }
  435. // inner and outer pairs
  436. ptr = NULL;
  437. ptr = prom_getenv("pair_selection");
  438. - if(ptr)
  439. + if(ptr || mp_pair_selection != -1)
  440. {
  441. - dslhal_api_selectInnerOuterPair(pIhw, os_atoi(ptr));
  442. + dslhal_api_selectInnerOuterPair(pIhw, mp_pair_selection == -1 ? os_atoi(ptr) : mp_pair_selection);
  443. }
  444. ptr = NULL;
  445. ptr = prom_getenv("dgas_polarity");
  446. - if(ptr)
  447. + if(ptr || mp_dgas_polarity != -1)
  448. {
  449. dslhal_api_configureDgaspLpr(pIhw, 1, 1);
  450. - dslhal_api_configureDgaspLpr(pIhw, 0, os_atoi(ptr));
  451. + dslhal_api_configureDgaspLpr(pIhw, 0, mp_dgas_polarity == -1 ? os_atoi(ptr) : mp_dgas_polarity);
  452. }
  453. ptr = NULL;
  454. ptr = prom_getenv("los_alarm");
  455. - if(ptr)
  456. + if(ptr || mp_los_alarm != -1)
  457. {
  458. - dslhal_api_disableLosAlarm(pIhw, os_atoi(ptr));
  459. + dslhal_api_disableLosAlarm(pIhw, mp_los_alarm == -1 ? os_atoi(ptr) : mp_los_alarm);
  460. }
  461. ptr = NULL;
  462. ptr = prom_getenv("eoc_vendor_id");
  463. - if(ptr)
  464. + if(ptr || mp_eoc_vendor_id != NULL)
  465. {
  466. + ptr = mp_eoc_vendor_id == NULL ? ptr : mp_eoc_vendor_id;
  467. for(i=0;i<8;i++)
  468. {
  469. tmp[0]=ptr[i*2];
  470. @@ -3018,26 +2986,26 @@ static int tn7dsl_set_dsl(void)
  471. }
  472. ptr = NULL;
  473. ptr = prom_getenv("eoc_vendor_revision");
  474. - if(ptr)
  475. + if(ptr || mp_eoc_vendor_revision != -1)
  476. {
  477. - value = os_atoi(ptr);
  478. + value = mp_eoc_vendor_revision == -1 ? os_atoi(ptr) : mp_eoc_vendor_revision;
  479. //printk("eoc rev=%d\n", os_atoi(ptr));
  480. dslhal_api_setEocRevisionNumber(pIhw, (char *)&value);
  481. }
  482. ptr = NULL;
  483. ptr = prom_getenv("eoc_vendor_serialnum");
  484. - if(ptr)
  485. + if(ptr || mp_eoc_vendor_serialnum != NULL)
  486. {
  487. - dslhal_api_setEocSerialNumber(pIhw, ptr);
  488. + dslhal_api_setEocSerialNumber(pIhw, mp_eoc_vendor_serialnum == NULL ? ptr : mp_eoc_vendor_serialnum);
  489. }
  490. // CQ10037 Added invntry_vernum environment variable to be able to set version number in ADSL2, ADSL2+ modes.
  491. ptr = NULL;
  492. ptr = prom_getenv("invntry_vernum");
  493. - if(ptr)
  494. + if(ptr || mp_invntry_vernum != NULL)
  495. {
  496. - dslhal_api_setEocRevisionNumber(pIhw, ptr);
  497. + dslhal_api_setEocRevisionNumber(pIhw, mp_invntry_vernum == NULL ? ptr : mp_invntry_vernum);
  498. }
  499. return 0;
  500. @@ -3064,6 +3032,7 @@ int tn7dsl_init(void *priv)
  501. int high_precision_selected = 0;
  502. // UR8_MERGE_END CQ11054*
  503. + sema_init(&adsl_sem_overlay, 0);
  504. /*
  505. * start dsl
  506. */
  507. @@ -3081,7 +3050,7 @@ int tn7dsl_init(void *priv)
  508. * backward compatibility.
  509. */
  510. cp = prom_getenv("DSL_BIT_TMODE");
  511. - if (cp)
  512. + if (cp || mp_dsl_bit_tmode != -1)
  513. {
  514. printk("%s : env var DSL_BIT_TMODE is set\n", __FUNCTION__);
  515. /*
  516. @@ -3110,9 +3079,9 @@ int tn7dsl_init(void *priv)
  517. // UR8_MERGE_START CQ11054 Jack Zhang
  518. cp = prom_getenv("high_precision");
  519. - if (cp)
  520. + if (cp || mp_high_precision != -1)
  521. {
  522. - high_precision_selected = os_atoi(cp);
  523. + high_precision_selected = mp_high_precision == -1 ? os_atoi(cp) : mp_high_precision;
  524. }
  525. if ( high_precision_selected)
  526. {
  527. @@ -3442,7 +3411,7 @@ static int dslmod_sysctl(ctl_table *ctl,
  528. */
  529. if(write)
  530. {
  531. - ret = proc_dostring(ctl, write, filp, buffer, lenp);
  532. + ret = proc_dostring(ctl, write, buffer, lenp, filp);
  533. switch (ctl->ctl_name)
  534. {
  535. @@ -3528,14 +3497,14 @@ static int dslmod_sysctl(ctl_table *ctl,
  536. else
  537. {
  538. len += sprintf(info+len, mod_req);
  539. - ret = proc_dostring(ctl, write, filp, buffer, lenp);
  540. + ret = proc_dostring(ctl, write, buffer, lenp, filp);
  541. }
  542. return ret;
  543. }
  544. ctl_table dslmod_table[] = {
  545. - {DEV_DSLMOD, "dslmod", info, DSL_MOD_SIZE, 0644, NULL, &dslmod_sysctl}
  546. + {DEV_DSLMOD, "dslmod", info, DSL_MOD_SIZE, 0644, NULL, NULL, &dslmod_sysctl, &sysctl_string}
  547. ,
  548. {0}
  549. };
  550. @@ -3558,8 +3527,7 @@ void tn7dsl_dslmod_sysctl_register(void)
  551. if (initialized == 1)
  552. return;
  553. - dslmod_sysctl_header = register_sysctl_table(dslmod_root_table, 1);
  554. - dslmod_root_table->child->de->owner = THIS_MODULE;
  555. + dslmod_sysctl_header = register_sysctl_table(dslmod_root_table);
  556. /*
  557. * set the defaults
  558. @@ -4821,4 +4789,4 @@ int tn7dsl_proc_PMDus(char* buf, char **
  559. }
  560. #endif //NO_ADV_STATS
  561. #endif //TR69_PMD_IN
  562. -// * UR8_MERGE_END CQ11057 *
  563. \ No newline at end of file
  564. +// * UR8_MERGE_END CQ11057 *