1 /******************************************************************************/
3 /* Copyright (c) 2004-2006 Silicom, Ltd */
4 /* All rights reserved. */
6 /* This program is free software; you can redistribute it and/or modify */
7 /* it under the terms of the GNU General Public License as published by */
8 /* the Free Software Foundation, located in the file LICENSE. */
11 /******************************************************************************/
13 #include <linux/version.h>
14 #if defined(CONFIG_SMP) && !defined(__SMP__)
18 #include <linux/proc_fs.h>
19 #include <linux/netdevice.h>
20 #include <asm/uaccess.h>
21 /* #include <linux/smp_lock.h> */
24 #define BP_PROC_DIR "bypass"
25 /* #define BYPASS_SUPPORT "bypass" */
29 #define GPIO6_SET_ENTRY_SD "gpio6_set"
30 #define GPIO6_CLEAR_ENTRY_SD "gpio6_clear"
32 #define GPIO7_SET_ENTRY_SD "gpio7_set"
33 #define GPIO7_CLEAR_ENTRY_SD "gpio7_clear"
35 #define PULSE_SET_ENTRY_SD "pulse_set"
36 #define ZERO_SET_ENTRY_SD "zero_set"
37 #define PULSE_GET1_ENTRY_SD "pulse_get1"
38 #define PULSE_GET2_ENTRY_SD "pulse_get2"
40 #define CMND_ON_ENTRY_SD "cmnd_on"
41 #define CMND_OFF_ENTRY_SD "cmnd_off"
42 #define RESET_CONT_ENTRY_SD "reset_cont"
45 #define BYPASS_INFO_ENTRY_SD "bypass_info"
46 #define BYPASS_SLAVE_ENTRY_SD "bypass_slave"
47 #define BYPASS_CAPS_ENTRY_SD "bypass_caps"
48 #define WD_SET_CAPS_ENTRY_SD "wd_set_caps"
49 #define BYPASS_ENTRY_SD "bypass"
50 #define BYPASS_CHANGE_ENTRY_SD "bypass_change"
51 #define BYPASS_WD_ENTRY_SD "bypass_wd"
52 #define WD_EXPIRE_TIME_ENTRY_SD "wd_expire_time"
53 #define RESET_BYPASS_WD_ENTRY_SD "reset_bypass_wd"
54 #define DIS_BYPASS_ENTRY_SD "dis_bypass"
55 #define BYPASS_PWUP_ENTRY_SD "bypass_pwup"
56 #define BYPASS_PWOFF_ENTRY_SD "bypass_pwoff"
57 #define STD_NIC_ENTRY_SD "std_nic"
58 #define STD_NIC_ENTRY_SD "std_nic"
59 #define TAP_ENTRY_SD "tap"
60 #define TAP_CHANGE_ENTRY_SD "tap_change"
61 #define DIS_TAP_ENTRY_SD "dis_tap"
62 #define TAP_PWUP_ENTRY_SD "tap_pwup"
63 #define TWO_PORT_LINK_ENTRY_SD "two_port_link"
64 #define WD_EXP_MODE_ENTRY_SD "wd_exp_mode"
65 #define WD_AUTORESET_ENTRY_SD "wd_autoreset"
66 #define TPL_ENTRY_SD "tpl"
67 #define WAIT_AT_PWUP_ENTRY_SD "wait_at_pwup"
68 #define HW_RESET_ENTRY_SD "hw_reset"
69 #define DISC_ENTRY_SD "disc"
70 #define DISC_CHANGE_ENTRY_SD "disc_change"
71 #define DIS_DISC_ENTRY_SD "dis_disc"
72 #define DISC_PWUP_ENTRY_SD "disc_pwup"
73 #endif /* bypass_support */
74 static struct proc_dir_entry *bp_procfs_dir;
76 static struct proc_dir_entry *proc_getdir(char *name,
77 struct proc_dir_entry *proc_dir)
79 struct proc_dir_entry *pde = proc_dir;
80 for (pde = pde->subdir; pde; pde = pde->next) {
81 if (pde->namelen && (strcmp(name, pde->name) == 0)) {
82 /* directory exists */
86 if (pde == (struct proc_dir_entry *)0) {
87 /* create the directory */
88 pde = create_proc_entry(name, S_IFDIR, proc_dir);
89 if (pde == (struct proc_dir_entry *)0)
98 bypass_proc_create_entry_sd(struct pfs_unit *pfs_unit_curr,
100 write_proc_t *write_proc,
101 read_proc_t *read_proc,
102 struct proc_dir_entry *parent_pfs, void *data)
104 strcpy(pfs_unit_curr->proc_name, proc_name);
105 pfs_unit_curr->proc_entry = create_proc_entry(pfs_unit_curr->proc_name,
108 S_IROTH, parent_pfs);
109 if (pfs_unit_curr->proc_entry == 0)
112 pfs_unit_curr->proc_entry->read_proc = read_proc;
113 pfs_unit_curr->proc_entry->write_proc = write_proc;
114 pfs_unit_curr->proc_entry->data = data;
121 get_bypass_info_pfs(char *page, char **start, off_t off, int count,
122 int *eof, void *data)
124 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
127 len += sprintf(page, "Name\t\t\t%s\n", pbp_device_block->bp_name);
129 sprintf(page + len, "Firmware version\t0x%x\n",
130 pbp_device_block->bp_fw_ver);
137 get_bypass_slave_pfs(char *page, char **start, off_t off, int count,
138 int *eof, void *data)
140 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
142 struct pci_dev *pci_slave_dev = pbp_device_block->bp_slave;
143 struct net_device *net_slave_dev;
146 if (is_bypass_fn(pbp_device_block)) {
147 net_slave_dev = pci_get_drvdata(pci_slave_dev);
149 len = sprintf(page, "%s\n", net_slave_dev->name);
151 len = sprintf(page, "fail\n");
153 len = sprintf(page, "fail\n");
160 get_bypass_caps_pfs(char *page, char **start, off_t off, int count,
161 int *eof, void *data)
163 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
165 int len = 0, ret = 0;
167 ret = get_bypass_caps_fn(pbp_device_block);
168 if (ret == BP_NOT_CAP)
169 len = sprintf(page, "-1\n");
171 len = sprintf(page, "0x%x\n", ret);
178 get_wd_set_caps_pfs(char *page, char **start, off_t off, int count,
179 int *eof, void *data)
181 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
183 int len = 0, ret = 0;
185 ret = get_wd_set_caps_fn(pbp_device_block);
186 if (ret == BP_NOT_CAP)
187 len = sprintf(page, "-1\n");
189 len = sprintf(page, "0x%x\n", ret);
195 set_bypass_pfs(struct file *file, const char *buffer,
196 unsigned long count, void *data)
200 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
202 int bypass_param = 0, length = 0;
204 if (count > (sizeof(kbuf) - 1))
207 if (copy_from_user(&kbuf, buffer, count))
211 length = strlen(kbuf);
212 if (kbuf[length - 1] == '\n')
213 kbuf[--length] = '\0';
215 if (strcmp(kbuf, "on") == 0)
217 else if (strcmp(kbuf, "off") == 0)
220 set_bypass_fn(pbp_device_block, bypass_param);
226 set_tap_pfs(struct file *file, const char *buffer,
227 unsigned long count, void *data)
231 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
233 int tap_param = 0, length = 0;
235 if (count > (sizeof(kbuf) - 1))
238 if (copy_from_user(&kbuf, buffer, count))
242 length = strlen(kbuf);
243 if (kbuf[length - 1] == '\n')
244 kbuf[--length] = '\0';
246 if (strcmp(kbuf, "on") == 0)
248 else if (strcmp(kbuf, "off") == 0)
251 set_tap_fn(pbp_device_block, tap_param);
257 set_disc_pfs(struct file *file, const char *buffer,
258 unsigned long count, void *data)
262 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
264 int tap_param = 0, length = 0;
266 if (count > (sizeof(kbuf) - 1))
269 if (copy_from_user(&kbuf, buffer, count))
273 length = strlen(kbuf);
274 if (kbuf[length - 1] == '\n')
275 kbuf[--length] = '\0';
277 if (strcmp(kbuf, "on") == 0)
279 else if (strcmp(kbuf, "off") == 0)
282 set_disc_fn(pbp_device_block, tap_param);
288 get_bypass_pfs(char *page, char **start, off_t off, int count,
289 int *eof, void *data)
291 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
293 int len = 0, ret = 0;
295 ret = get_bypass_fn(pbp_device_block);
296 if (ret == BP_NOT_CAP)
297 len = sprintf(page, "fail\n");
299 len = sprintf(page, "on\n");
301 len = sprintf(page, "off\n");
308 get_tap_pfs(char *page, char **start, off_t off, int count,
309 int *eof, void *data)
311 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
313 int len = 0, ret = 0;
315 ret = get_tap_fn(pbp_device_block);
316 if (ret == BP_NOT_CAP)
317 len = sprintf(page, "fail\n");
319 len = sprintf(page, "on\n");
321 len = sprintf(page, "off\n");
328 get_disc_pfs(char *page, char **start, off_t off, int count,
329 int *eof, void *data)
331 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
333 int len = 0, ret = 0;
335 ret = get_disc_fn(pbp_device_block);
336 if (ret == BP_NOT_CAP)
337 len = sprintf(page, "fail\n");
339 len = sprintf(page, "on\n");
341 len = sprintf(page, "off\n");
348 get_bypass_change_pfs(char *page, char **start, off_t off, int count,
349 int *eof, void *data)
351 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
353 int len = 0, ret = 0;
355 ret = get_bypass_change_fn(pbp_device_block);
357 len = sprintf(page, "on\n");
359 len = sprintf(page, "off\n");
361 len = sprintf(page, "fail\n");
368 get_tap_change_pfs(char *page, char **start, off_t off, int count,
369 int *eof, void *data)
371 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
373 int len = 0, ret = 0;
375 ret = get_tap_change_fn(pbp_device_block);
377 len = sprintf(page, "on\n");
379 len = sprintf(page, "off\n");
381 len = sprintf(page, "fail\n");
388 get_disc_change_pfs(char *page, char **start, off_t off, int count,
389 int *eof, void *data)
391 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
393 int len = 0, ret = 0;
395 ret = get_disc_change_fn(pbp_device_block);
397 len = sprintf(page, "on\n");
399 len = sprintf(page, "off\n");
401 len = sprintf(page, "fail\n");
408 set_bypass_wd_pfs(struct file *file, const char *buffer,
409 unsigned long count, void *data)
413 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
415 unsigned int timeout = 0;
416 char *timeout_ptr = kbuf;
418 if (copy_from_user(&kbuf, buffer, count))
422 timeout = atoi(&timeout_ptr);
424 set_bypass_wd_fn(pbp_device_block, timeout);
430 get_bypass_wd_pfs(char *page, char **start, off_t off, int count,
431 int *eof, void *data)
433 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
435 int len = 0, ret = 0, timeout = 0;
437 ret = get_bypass_wd_fn(pbp_device_block, &timeout);
438 if (ret == BP_NOT_CAP)
439 len = sprintf(page, "fail\n");
440 else if (timeout == -1)
441 len = sprintf(page, "unknown\n");
442 else if (timeout == 0)
443 len = sprintf(page, "disable\n");
445 len = sprintf(page, "%d\n", timeout);
452 get_wd_expire_time_pfs(char *page, char **start, off_t off, int count,
453 int *eof, void *data)
455 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
457 int len = 0, ret = 0, timeout = 0;
459 ret = get_wd_expire_time_fn(pbp_device_block, &timeout);
460 if (ret == BP_NOT_CAP)
461 len = sprintf(page, "fail\n");
462 else if (timeout == -1)
463 len = sprintf(page, "expire\n");
464 else if (timeout == 0)
465 len = sprintf(page, "disable\n");
468 len = sprintf(page, "%d\n", timeout);
474 get_tpl_pfs(char *page, char **start, off_t off, int count,
475 int *eof, void *data)
477 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
479 int len = 0, ret = 0;
481 ret = get_tpl_fn(pbp_device_block);
482 if (ret == BP_NOT_CAP)
483 len = sprintf(page, "fail\n");
485 len = sprintf(page, "on\n");
487 len = sprintf(page, "off\n");
495 get_wait_at_pwup_pfs(char *page, char **start, off_t off, int count,
496 int *eof, void *data)
498 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
500 int len = 0, ret = 0;
502 ret = get_bp_wait_at_pwup_fn(pbp_device_block);
503 if (ret == BP_NOT_CAP)
504 len = sprintf(page, "fail\n");
506 len = sprintf(page, "on\n");
508 len = sprintf(page, "off\n");
515 get_hw_reset_pfs(char *page, char **start, off_t off, int count,
516 int *eof, void *data)
518 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
520 int len = 0, ret = 0;
522 ret = get_bp_hw_reset_fn(pbp_device_block);
523 if (ret == BP_NOT_CAP)
524 len = sprintf(page, "fail\n");
526 len = sprintf(page, "on\n");
528 len = sprintf(page, "off\n");
534 #endif /*PMC_WAIT_FLAG */
537 reset_bypass_wd_pfs(char *page, char **start, off_t off, int count,
538 int *eof, void *data)
540 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
542 int len = 0, ret = 0;
544 ret = reset_bypass_wd_timer_fn(pbp_device_block);
545 if (ret == BP_NOT_CAP)
546 len = sprintf(page, "fail\n");
548 len = sprintf(page, "disable\n");
550 len = sprintf(page, "success\n");
557 set_dis_bypass_pfs(struct file *file, const char *buffer,
558 unsigned long count, void *data)
562 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
564 int bypass_param = 0, length = 0;
566 if (copy_from_user(&kbuf, buffer, count))
570 length = strlen(kbuf);
571 if (kbuf[length - 1] == '\n')
572 kbuf[--length] = '\0';
574 if (strcmp(kbuf, "on") == 0)
576 else if (strcmp(kbuf, "off") == 0)
579 set_dis_bypass_fn(pbp_device_block, bypass_param);
585 set_dis_tap_pfs(struct file *file, const char *buffer,
586 unsigned long count, void *data)
590 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
592 int tap_param = 0, length = 0;
594 if (copy_from_user(&kbuf, buffer, count))
598 length = strlen(kbuf);
599 if (kbuf[length - 1] == '\n')
600 kbuf[--length] = '\0';
602 if (strcmp(kbuf, "on") == 0)
604 else if (strcmp(kbuf, "off") == 0)
607 set_dis_tap_fn(pbp_device_block, tap_param);
613 set_dis_disc_pfs(struct file *file, const char *buffer,
614 unsigned long count, void *data)
618 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
620 int tap_param = 0, length = 0;
622 if (copy_from_user(&kbuf, buffer, count))
626 length = strlen(kbuf);
627 if (kbuf[length - 1] == '\n')
628 kbuf[--length] = '\0';
630 if (strcmp(kbuf, "on") == 0)
632 else if (strcmp(kbuf, "off") == 0)
635 set_dis_disc_fn(pbp_device_block, tap_param);
641 get_dis_bypass_pfs(char *page, char **start, off_t off, int count,
642 int *eof, void *data)
644 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
646 int len = 0, ret = 0;
648 ret = get_dis_bypass_fn(pbp_device_block);
649 if (ret == BP_NOT_CAP)
650 len = sprintf(page, "fail\n");
652 len = sprintf(page, "off\n");
654 len = sprintf(page, "on\n");
661 get_dis_tap_pfs(char *page, char **start, off_t off, int count,
662 int *eof, void *data)
664 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
666 int len = 0, ret = 0;
668 ret = get_dis_tap_fn(pbp_device_block);
669 if (ret == BP_NOT_CAP)
670 len = sprintf(page, "fail\n");
672 len = sprintf(page, "off\n");
674 len = sprintf(page, "on\n");
681 get_dis_disc_pfs(char *page, char **start, off_t off, int count,
682 int *eof, void *data)
684 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
686 int len = 0, ret = 0;
688 ret = get_dis_disc_fn(pbp_device_block);
689 if (ret == BP_NOT_CAP)
690 len = sprintf(page, "fail\n");
692 len = sprintf(page, "off\n");
694 len = sprintf(page, "on\n");
701 set_bypass_pwup_pfs(struct file *file, const char *buffer,
702 unsigned long count, void *data)
706 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
708 int bypass_param = 0, length = 0;
710 if (copy_from_user(&kbuf, buffer, count))
714 length = strlen(kbuf);
715 if (kbuf[length - 1] == '\n')
716 kbuf[--length] = '\0';
718 if (strcmp(kbuf, "on") == 0)
720 else if (strcmp(kbuf, "off") == 0)
723 set_bypass_pwup_fn(pbp_device_block, bypass_param);
729 set_bypass_pwoff_pfs(struct file *file, const char *buffer,
730 unsigned long count, void *data)
734 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
736 int bypass_param = 0, length = 0;
738 if (copy_from_user(&kbuf, buffer, count))
742 length = strlen(kbuf);
743 if (kbuf[length - 1] == '\n')
744 kbuf[--length] = '\0';
746 if (strcmp(kbuf, "on") == 0)
748 else if (strcmp(kbuf, "off") == 0)
751 set_bypass_pwoff_fn(pbp_device_block, bypass_param);
757 set_tap_pwup_pfs(struct file *file, const char *buffer,
758 unsigned long count, void *data)
762 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
764 int tap_param = 0, length = 0;
766 if (copy_from_user(&kbuf, buffer, count))
770 length = strlen(kbuf);
771 if (kbuf[length - 1] == '\n')
772 kbuf[--length] = '\0';
774 if (strcmp(kbuf, "on") == 0)
776 else if (strcmp(kbuf, "off") == 0)
779 set_tap_pwup_fn(pbp_device_block, tap_param);
785 set_disc_pwup_pfs(struct file *file, const char *buffer,
786 unsigned long count, void *data)
790 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
792 int tap_param = 0, length = 0;
794 if (copy_from_user(&kbuf, buffer, count))
798 length = strlen(kbuf);
799 if (kbuf[length - 1] == '\n')
800 kbuf[--length] = '\0';
802 if (strcmp(kbuf, "on") == 0)
804 else if (strcmp(kbuf, "off") == 0)
807 set_disc_pwup_fn(pbp_device_block, tap_param);
813 get_bypass_pwup_pfs(char *page, char **start, off_t off, int count,
814 int *eof, void *data)
816 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
818 int len = 0, ret = 0;
820 ret = get_bypass_pwup_fn(pbp_device_block);
821 if (ret == BP_NOT_CAP)
822 len = sprintf(page, "fail\n");
824 len = sprintf(page, "off\n");
826 len = sprintf(page, "on\n");
833 get_bypass_pwoff_pfs(char *page, char **start, off_t off, int count,
834 int *eof, void *data)
836 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
838 int len = 0, ret = 0;
840 ret = get_bypass_pwoff_fn(pbp_device_block);
841 if (ret == BP_NOT_CAP)
842 len = sprintf(page, "fail\n");
844 len = sprintf(page, "off\n");
846 len = sprintf(page, "on\n");
853 get_tap_pwup_pfs(char *page, char **start, off_t off, int count,
854 int *eof, void *data)
856 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
858 int len = 0, ret = 0;
860 ret = get_tap_pwup_fn(pbp_device_block);
861 if (ret == BP_NOT_CAP)
862 len = sprintf(page, "fail\n");
864 len = sprintf(page, "off\n");
866 len = sprintf(page, "on\n");
873 get_disc_pwup_pfs(char *page, char **start, off_t off, int count,
874 int *eof, void *data)
876 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
878 int len = 0, ret = 0;
880 ret = get_disc_pwup_fn(pbp_device_block);
881 if (ret == BP_NOT_CAP)
882 len = sprintf(page, "fail\n");
884 len = sprintf(page, "off\n");
886 len = sprintf(page, "on\n");
893 set_std_nic_pfs(struct file *file, const char *buffer,
894 unsigned long count, void *data)
898 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
900 int bypass_param = 0, length = 0;
902 if (copy_from_user(&kbuf, buffer, count))
906 length = strlen(kbuf);
907 if (kbuf[length - 1] == '\n')
908 kbuf[--length] = '\0';
910 if (strcmp(kbuf, "on") == 0)
912 else if (strcmp(kbuf, "off") == 0)
915 set_std_nic_fn(pbp_device_block, bypass_param);
921 get_std_nic_pfs(char *page, char **start, off_t off, int count,
922 int *eof, void *data)
924 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
926 int len = 0, ret = 0;
928 ret = get_std_nic_fn(pbp_device_block);
929 if (ret == BP_NOT_CAP)
930 len = sprintf(page, "fail\n");
932 len = sprintf(page, "off\n");
934 len = sprintf(page, "on\n");
941 get_wd_exp_mode_pfs(char *page, char **start, off_t off, int count,
942 int *eof, void *data)
944 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
946 int len = 0, ret = 0;
948 ret = get_wd_exp_mode_fn(pbp_device_block);
950 len = sprintf(page, "tap\n");
952 len = sprintf(page, "bypass\n");
954 len = sprintf(page, "disc\n");
957 len = sprintf(page, "fail\n");
964 set_wd_exp_mode_pfs(struct file *file, const char *buffer,
965 unsigned long count, void *data)
969 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
971 int bypass_param = 0, length = 0;
973 if (count > (sizeof(kbuf) - 1))
976 if (copy_from_user(&kbuf, buffer, count))
980 length = strlen(kbuf);
981 if (kbuf[length - 1] == '\n')
982 kbuf[--length] = '\0';
984 if (strcmp(kbuf, "tap") == 0)
986 else if (strcmp(kbuf, "bypass") == 0)
988 else if (strcmp(kbuf, "disc") == 0)
991 set_wd_exp_mode_fn(pbp_device_block, bypass_param);
997 get_wd_autoreset_pfs(char *page, char **start, off_t off, int count,
998 int *eof, void *data)
1000 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
1002 int len = 0, ret = 0;
1004 ret = get_wd_autoreset_fn(pbp_device_block);
1006 len = sprintf(page, "%d\n", ret);
1008 len = sprintf(page, "fail\n");
1015 set_wd_autoreset_pfs(struct file *file, const char *buffer,
1016 unsigned long count, void *data)
1019 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
1021 char *timeout_ptr = kbuf;
1023 if (copy_from_user(&kbuf, buffer, count))
1027 timeout = atoi(&timeout_ptr);
1029 set_wd_autoreset_fn(pbp_device_block, timeout);
1035 set_tpl_pfs(struct file *file, const char *buffer,
1036 unsigned long count, void *data)
1040 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
1042 int tpl_param = 0, length = 0;
1044 if (count > (sizeof(kbuf) - 1))
1047 if (copy_from_user(&kbuf, buffer, count))
1051 length = strlen(kbuf);
1052 if (kbuf[length - 1] == '\n')
1053 kbuf[--length] = '\0';
1055 if (strcmp(kbuf, "on") == 0)
1057 else if (strcmp(kbuf, "off") == 0)
1060 set_tpl_fn(pbp_device_block, tpl_param);
1067 set_wait_at_pwup_pfs(struct file *file, const char *buffer,
1068 unsigned long count, void *data)
1072 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
1074 int tpl_param = 0, length = 0;
1076 if (count > (sizeof(kbuf) - 1))
1079 if (copy_from_user(&kbuf, buffer, count))
1083 length = strlen(kbuf);
1084 if (kbuf[length - 1] == '\n')
1085 kbuf[--length] = '\0';
1087 if (strcmp(kbuf, "on") == 0)
1089 else if (strcmp(kbuf, "off") == 0)
1092 set_bp_wait_at_pwup_fn(pbp_device_block, tpl_param);
1098 set_hw_reset_pfs(struct file *file, const char *buffer,
1099 unsigned long count, void *data)
1103 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
1105 int tpl_param = 0, length = 0;
1107 if (count > (sizeof(kbuf) - 1))
1110 if (copy_from_user(&kbuf, buffer, count))
1114 length = strlen(kbuf);
1115 if (kbuf[length - 1] == '\n')
1116 kbuf[--length] = '\0';
1118 if (strcmp(kbuf, "on") == 0)
1120 else if (strcmp(kbuf, "off") == 0)
1123 set_bp_hw_reset_fn(pbp_device_block, tpl_param);
1128 #endif /*PMC_FIX_FLAG */
1130 int bypass_proc_create_dev_sd(bpctl_dev_t *pbp_device_block)
1132 struct bypass_pfs_sd *current_pfs = &(pbp_device_block->bypass_pfs_set);
1133 static struct proc_dir_entry *procfs_dir;
1136 sprintf(current_pfs->dir_name, "bypass_%s", dev->name);
1141 /* create device proc dir */
1142 procfs_dir = proc_getdir(current_pfs->dir_name, bp_procfs_dir);
1143 if (procfs_dir == 0) {
1144 printk(KERN_DEBUG "Could not create procfs directory %s\n",
1145 current_pfs->dir_name);
1148 current_pfs->bypass_entry = procfs_dir;
1150 if (bypass_proc_create_entry(&(current_pfs->bypass_info), BYPASS_INFO_ENTRY_SD, NULL, /* write */
1151 get_bypass_info_pfs, /* read */
1152 procfs_dir, pbp_device_block))
1155 if (pbp_device_block->bp_caps & SW_CTL_CAP) {
1157 /* Create set param proc's */
1158 if (bypass_proc_create_entry_sd(&(current_pfs->bypass_slave), BYPASS_SLAVE_ENTRY_SD, NULL, /* write */
1159 get_bypass_slave_pfs, /* read */
1160 procfs_dir, pbp_device_block))
1163 if (bypass_proc_create_entry_sd(&(current_pfs->bypass_caps), BYPASS_CAPS_ENTRY_SD, NULL, /* write */
1164 get_bypass_caps_pfs, /* read */
1165 procfs_dir, pbp_device_block))
1168 if (bypass_proc_create_entry_sd(&(current_pfs->wd_set_caps), WD_SET_CAPS_ENTRY_SD, NULL, /* write */
1169 get_wd_set_caps_pfs, /* read */
1170 procfs_dir, pbp_device_block))
1172 if (bypass_proc_create_entry_sd(&(current_pfs->bypass_wd), BYPASS_WD_ENTRY_SD, set_bypass_wd_pfs, /* write */
1173 get_bypass_wd_pfs, /* read */
1174 procfs_dir, pbp_device_block))
1177 if (bypass_proc_create_entry_sd(&(current_pfs->wd_expire_time), WD_EXPIRE_TIME_ENTRY_SD, NULL, /* write */
1178 get_wd_expire_time_pfs, /* read */
1179 procfs_dir, pbp_device_block))
1182 if (bypass_proc_create_entry_sd(&(current_pfs->reset_bypass_wd), RESET_BYPASS_WD_ENTRY_SD, NULL, /* write */
1183 reset_bypass_wd_pfs, /* read */
1184 procfs_dir, pbp_device_block))
1187 if (bypass_proc_create_entry_sd(&(current_pfs->std_nic), STD_NIC_ENTRY_SD, set_std_nic_pfs, /* write */
1188 get_std_nic_pfs, /* read */
1189 procfs_dir, pbp_device_block))
1192 if (pbp_device_block->bp_caps & BP_CAP) {
1193 if (bypass_proc_create_entry_sd(&(current_pfs->bypass), BYPASS_ENTRY_SD, set_bypass_pfs, /* write */
1194 get_bypass_pfs, /* read */
1199 if (bypass_proc_create_entry_sd(&(current_pfs->dis_bypass), DIS_BYPASS_ENTRY_SD, set_dis_bypass_pfs, /* write */
1200 get_dis_bypass_pfs, /* read */
1205 if (bypass_proc_create_entry_sd(&(current_pfs->bypass_pwup), BYPASS_PWUP_ENTRY_SD, set_bypass_pwup_pfs, /* write */
1206 get_bypass_pwup_pfs, /* read */
1210 if (bypass_proc_create_entry_sd(&(current_pfs->bypass_pwoff), BYPASS_PWOFF_ENTRY_SD, set_bypass_pwoff_pfs, /* write */
1211 get_bypass_pwoff_pfs, /* read */
1216 if (bypass_proc_create_entry_sd(&(current_pfs->bypass_change), BYPASS_CHANGE_ENTRY_SD, NULL, /* write */
1217 get_bypass_change_pfs, /* read */
1223 if (pbp_device_block->bp_caps & TAP_CAP) {
1225 if (bypass_proc_create_entry_sd(&(current_pfs->tap), TAP_ENTRY_SD, set_tap_pfs, /* write */
1226 get_tap_pfs, /* read */
1231 if (bypass_proc_create_entry_sd(&(current_pfs->dis_tap), DIS_TAP_ENTRY_SD, set_dis_tap_pfs, /* write */
1232 get_dis_tap_pfs, /* read */
1237 if (bypass_proc_create_entry_sd(&(current_pfs->tap_pwup), TAP_PWUP_ENTRY_SD, set_tap_pwup_pfs, /* write */
1238 get_tap_pwup_pfs, /* read */
1243 if (bypass_proc_create_entry_sd(&(current_pfs->tap_change), TAP_CHANGE_ENTRY_SD, NULL, /* write */
1244 get_tap_change_pfs, /* read */
1249 if (pbp_device_block->bp_caps & DISC_CAP) {
1251 if (bypass_proc_create_entry_sd(&(current_pfs->tap), DISC_ENTRY_SD, set_disc_pfs, /* write */
1252 get_disc_pfs, /* read */
1258 if (bypass_proc_create_entry_sd(&(current_pfs->dis_tap), DIS_DISC_ENTRY_SD, set_dis_disc_pfs, /* write */
1259 get_dis_disc_pfs, /* read */
1265 if (bypass_proc_create_entry_sd(&(current_pfs->tap_pwup), DISC_PWUP_ENTRY_SD, set_disc_pwup_pfs, /* write */
1266 get_disc_pwup_pfs, /* read */
1271 if (bypass_proc_create_entry_sd(&(current_pfs->tap_change), DISC_CHANGE_ENTRY_SD, NULL, /* write */
1272 get_disc_change_pfs, /* read */
1278 if (bypass_proc_create_entry_sd(&(current_pfs->wd_exp_mode), WD_EXP_MODE_ENTRY_SD, set_wd_exp_mode_pfs, /* write */
1279 get_wd_exp_mode_pfs, /* read */
1280 procfs_dir, pbp_device_block))
1283 if (bypass_proc_create_entry_sd(&(current_pfs->wd_autoreset), WD_AUTORESET_ENTRY_SD, set_wd_autoreset_pfs, /* write */
1284 get_wd_autoreset_pfs, /* read */
1285 procfs_dir, pbp_device_block))
1287 if (bypass_proc_create_entry_sd(&(current_pfs->tpl), TPL_ENTRY_SD, set_tpl_pfs, /* write */
1288 get_tpl_pfs, /* read */
1289 procfs_dir, pbp_device_block))
1292 if (bypass_proc_create_entry_sd(&(current_pfs->tpl), WAIT_AT_PWUP_ENTRY_SD, set_wait_at_pwup_pfs, /* write */
1293 get_wait_at_pwup_pfs, /* read */
1294 procfs_dir, pbp_device_block))
1296 if (bypass_proc_create_entry_sd(&(current_pfs->tpl), HW_RESET_ENTRY_SD, set_hw_reset_pfs, /* write */
1297 get_hw_reset_pfs, /* read */
1298 procfs_dir, pbp_device_block))
1305 printk(KERN_DEBUG "Create proc entry failed\n");
1310 int bypass_proc_remove_dev_sd(bpctl_dev_t *pbp_device_block)
1313 struct bypass_pfs_sd *current_pfs = &pbp_device_block->bypass_pfs_set;
1314 struct proc_dir_entry *pde = current_pfs->bypass_entry, *pde_curr =
1318 for (pde = pde->subdir; pde;) {
1319 strcpy(name, pde->name);
1322 remove_proc_entry(name, current_pfs->bypass_entry);
1325 remove_proc_entry(current_pfs->dir_name, bp_procfs_dir);
1330 #endif /* BYPASS_SUPPORT */