1 /******************************************************************************/
3 /* Bypass Control utility, Copyright (c) 2005-20011 Silicom */
5 /* This program is free software; you can redistribute it and/or modify */
6 /* it under the terms of the GNU General Public License as published by */
7 /* the Free Software Foundation, located in the file LICENSE. */
8 /* Copyright(c) 2007 - 2009 Intel Corporation. All rights reserved. */
11 /******************************************************************************/
13 #include <linux/kernel.h> /* We're doing kernel work */
14 #include <linux/module.h> /* Specifically, a module */
16 #include <linux/pci.h>
17 #include <linux/delay.h>
18 #include <linux/netdevice.h>
19 #include <linux/rtnetlink.h>
20 #include <linux/rcupdate.h>
21 #include <linux/etherdevice.h>
23 #include <linux/uaccess.h> /* for get_user and put_user */
24 #include <linux/sched.h>
25 #include <linux/ethtool.h>
26 #include <linux/proc_fs.h>
34 #define BP_MOD_VER "9.0.4"
35 #define BP_MOD_DESCR "Silicom Bypass-SD Control driver"
36 #define BP_SYNC_FLAG 1
38 static int major_num
= 0;
40 MODULE_AUTHOR("Anna Lukin, annal@silicom.co.il");
41 MODULE_LICENSE("GPL");
42 MODULE_DESCRIPTION(BP_MOD_DESCR
);
43 MODULE_VERSION(BP_MOD_VER
);
46 #define lock_bpctl() \
47 if (down_interruptible(&bpctl_sema)) { \
48 return -ERESTARTSYS; \
51 #define unlock_bpctl() \
62 struct bypass_pfs_sd
{
64 struct proc_dir_entry
*bypass_entry
;
67 typedef struct _bpctl_dev
{
70 struct pci_dev
*pdev
; /* PCI device */
71 struct net_device
*ndev
; /* net device */
72 unsigned long mem_map
;
86 unsigned long bypass_wdt_on_time
;
87 uint32_t bypass_timer_interval
;
88 struct timer_list bp_timer
;
92 bp_media_type media_type
;
94 struct timer_list bp_tpl_timer
;
95 spinlock_t bypass_wr_lock
;
102 int (*hard_start_xmit_save
) (struct sk_buff
*skb
,
103 struct net_device
*dev
);
104 const struct net_device_ops
*old_ops
;
105 struct net_device_ops new_ops
;
106 int bp_self_test_flag
;
108 struct bypass_pfs_sd bypass_pfs_set
;
112 static bpctl_dev_t
*bpctl_dev_arr
;
114 static struct semaphore bpctl_sema
;
115 static int device_num
= 0;
117 static int get_dev_idx(int ifindex
);
118 static bpctl_dev_t
*get_master_port_fn(bpctl_dev_t
*pbpctl_dev
);
119 static int disc_status(bpctl_dev_t
*pbpctl_dev
);
120 static int bypass_status(bpctl_dev_t
*pbpctl_dev
);
121 static int wdt_timer(bpctl_dev_t
*pbpctl_dev
, int *time_left
);
122 static bpctl_dev_t
*get_status_port_fn(bpctl_dev_t
*pbpctl_dev
);
123 static void if_scan_init(void);
125 int bypass_proc_create_dev_sd(bpctl_dev_t
*pbp_device_block
);
126 int bypass_proc_remove_dev_sd(bpctl_dev_t
*pbp_device_block
);
127 int bp_proc_create(void);
129 int is_bypass_fn(bpctl_dev_t
*pbpctl_dev
);
130 int get_dev_idx_bsf(int bus
, int slot
, int func
);
132 static unsigned long str_to_hex(char *p
);
133 static int bp_device_event(struct notifier_block
*unused
,
134 unsigned long event
, void *ptr
)
136 struct net_device
*dev
= ptr
;
137 static bpctl_dev_t
*pbpctl_dev
= NULL
, *pbpctl_dev_m
= NULL
;
138 int dev_num
= 0, ret
= 0, ret_d
= 0, time_left
= 0;
139 /* printk("BP_PROC_SUPPORT event =%d %s %d\n", event,dev->name, dev->ifindex ); */
140 /* return NOTIFY_DONE; */
143 if (event
== NETDEV_REGISTER
) {
145 struct ethtool_drvinfo drvinfo
;
149 int i
= 0, ifindex
, idx_dev
= 0;
150 int bus
= 0, slot
= 0, func
= 0;
151 ifindex
= dev
->ifindex
;
154 memset(&drvinfo
, 0, sizeof(struct ethtool_drvinfo
));
156 if (dev
->ethtool_ops
&& dev
->ethtool_ops
->get_drvinfo
) {
157 memset(&drvinfo
, 0, sizeof(drvinfo
));
158 dev
->ethtool_ops
->get_drvinfo(dev
, &drvinfo
);
161 if (!drvinfo
.bus_info
)
163 if (!strcmp(drvinfo
.bus_info
, "N/A"))
165 memcpy(&cbuf
, drvinfo
.bus_info
, 32);
168 while (*buf
++ != ':') ;
169 for (i
= 0; i
< 10; i
++, buf
++) {
176 bus
= str_to_hex(res
);
179 for (i
= 0; i
< 10; i
++, buf
++) {
186 slot
= str_to_hex(res
);
187 func
= str_to_hex(buf
);
188 idx_dev
= get_dev_idx_bsf(bus
, slot
, func
);
192 bpctl_dev_arr
[idx_dev
].ifindex
= ifindex
;
193 bpctl_dev_arr
[idx_dev
].ndev
= dev
;
195 bypass_proc_remove_dev_sd(&bpctl_dev_arr
197 bypass_proc_create_dev_sd(&bpctl_dev_arr
206 if (event
== NETDEV_UNREGISTER
) {
209 ((bpctl_dev_arr
[idx_dev
].pdev
!= NULL
)
210 && (idx_dev
< device_num
)); idx_dev
++) {
211 if (bpctl_dev_arr
[idx_dev
].ndev
== dev
) {
212 bypass_proc_remove_dev_sd(&bpctl_dev_arr
214 bpctl_dev_arr
[idx_dev
].ndev
= NULL
;
223 if (event
== NETDEV_CHANGENAME
) {
226 ((bpctl_dev_arr
[idx_dev
].pdev
!= NULL
)
227 && (idx_dev
< device_num
)); idx_dev
++) {
228 if (bpctl_dev_arr
[idx_dev
].ndev
== dev
) {
229 bypass_proc_remove_dev_sd(&bpctl_dev_arr
231 bypass_proc_create_dev_sd(&bpctl_dev_arr
246 if (netif_carrier_ok(dev
))
249 if (((dev_num
= get_dev_idx(dev
->ifindex
)) == -1) ||
250 (!(pbpctl_dev
= &bpctl_dev_arr
[dev_num
])))
253 if ((is_bypass_fn(pbpctl_dev
)) == 1)
254 pbpctl_dev_m
= pbpctl_dev
;
256 pbpctl_dev_m
= get_master_port_fn(pbpctl_dev
);
259 ret
= bypass_status(pbpctl_dev_m
);
261 printk("bpmod: %s is in the Bypass mode now",
263 ret_d
= disc_status(pbpctl_dev_m
);
266 ("bpmod: %s is in the Disconnect mode now",
269 wdt_timer(pbpctl_dev_m
, &time_left
);
271 printk("; WDT has expired");
287 static struct notifier_block bp_notifier_block
= {
288 .notifier_call
= bp_device_event
,
291 int is_bypass_fn(bpctl_dev_t
*pbpctl_dev
);
292 int wdt_time_left(bpctl_dev_t
*pbpctl_dev
);
294 static void write_pulse(bpctl_dev_t
*pbpctl_dev
,
295 unsigned int ctrl_ext
,
296 unsigned char value
, unsigned char len
)
298 unsigned char ctrl_val
= 0;
299 unsigned int i
= len
;
300 unsigned int ctrl
= 0;
301 bpctl_dev_t
*pbpctl_dev_c
= NULL
;
303 if (pbpctl_dev
->bp_i80
)
304 ctrl
= BPCTL_READ_REG(pbpctl_dev
, CTRL_EXT
);
305 if (pbpctl_dev
->bp_540
)
306 ctrl
= BP10G_READ_REG(pbpctl_dev
, ESDP
);
308 if (pbpctl_dev
->bp_10g9
) {
309 if (!(pbpctl_dev_c
= get_status_port_fn(pbpctl_dev
)))
311 ctrl
= BP10G_READ_REG(pbpctl_dev_c
, ESDP
);
315 ctrl_val
= (value
>> i
) & 0x1;
317 if (pbpctl_dev
->bp_10g9
) {
319 /* To start management : MCLK 1, MDIO 1, output */
321 /*BP10G_WRITE_REG(pbpctl_dev, I2CCTL, (ctrl_ext|BP10G_MCLK_DATA_OUT9|BP10G_MDIO_DATA_OUT9)); */
322 BP10G_WRITE_REG(pbpctl_dev
, I2CCTL
,
324 BP10G_MDIO_DATA_OUT9
);
325 BP10G_WRITE_REG(pbpctl_dev_c
, ESDP
,
326 (ctrl
| BP10G_MCLK_DATA_OUT9
|
327 BP10G_MCLK_DIR_OUT9
));
329 } else if (pbpctl_dev
->bp_fiber5
) {
330 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
, (ctrl_ext
|
331 BPCTLI_CTRL_EXT_MCLK_DIR5
333 BPCTLI_CTRL_EXT_MDIO_DIR5
335 BPCTLI_CTRL_EXT_MDIO_DATA5
337 BPCTLI_CTRL_EXT_MCLK_DATA5
));
339 } else if (pbpctl_dev
->bp_i80
) {
340 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
, (ctrl_ext
|
341 BPCTLI_CTRL_EXT_MDIO_DIR80
343 BPCTLI_CTRL_EXT_MDIO_DATA80
));
345 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
, (ctrl
|
346 BPCTLI_CTRL_EXT_MCLK_DIR80
348 BPCTLI_CTRL_EXT_MCLK_DATA80
));
350 } else if (pbpctl_dev
->bp_540
) {
351 BP10G_WRITE_REG(pbpctl_dev
, ESDP
, (ctrl
|
360 } else if (pbpctl_dev
->bp_10gb
) {
361 BP10GB_WRITE_REG(pbpctl_dev
, MISC_REG_SPIO
,
362 (ctrl_ext
| BP10GB_MDIO_SET
|
369 } else if (!pbpctl_dev
->bp_10g
)
370 /* To start management : MCLK 1, MDIO 1, output */
371 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
,
373 BPCTLI_CTRL_EXT_MCLK_DIR
|
374 BPCTLI_CTRL_EXT_MDIO_DIR
|
375 BPCTLI_CTRL_EXT_MDIO_DATA
|
376 BPCTLI_CTRL_EXT_MCLK_DATA
));
379 /* To start management : MCLK 1, MDIO 1, output*/
380 BP10G_WRITE_REG(pbpctl_dev
, EODSDP
,
381 (ctrl_ext
| BP10G_MCLK_DATA_OUT
382 | BP10G_MDIO_DATA_OUT
));
386 usec_delay(PULSE_TIME
);
387 if (pbpctl_dev
->bp_10g9
) {
389 /*BP10G_WRITE_REG(pbpctl_dev, I2CCTL, ((ctrl_ext|BP10G_MDIO_DATA_OUT9)&~(BP10G_MCLK_DATA_OUT9))); */
391 BP10G_WRITE_REG(pbpctl_dev
, I2CCTL
,
393 BP10G_MDIO_DATA_OUT9
);
394 BP10G_WRITE_REG(pbpctl_dev_c
, ESDP
,
395 (ctrl
| BP10G_MCLK_DIR_OUT9
) &
396 ~BP10G_MCLK_DATA_OUT9
);
398 } else if (pbpctl_dev
->bp_fiber5
) {
399 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
,
401 BPCTLI_CTRL_EXT_MCLK_DIR5
|
402 BPCTLI_CTRL_EXT_MDIO_DIR5
|
403 BPCTLI_CTRL_EXT_MDIO_DATA5
)
406 (BPCTLI_CTRL_EXT_MCLK_DATA5
)));
408 } else if (pbpctl_dev
->bp_i80
) {
409 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
, (ctrl_ext
|
410 BPCTLI_CTRL_EXT_MDIO_DIR80
412 BPCTLI_CTRL_EXT_MDIO_DATA80
));
413 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
,
415 BPCTLI_CTRL_EXT_MCLK_DIR80
)
418 (BPCTLI_CTRL_EXT_MCLK_DATA80
)));
420 } else if (pbpctl_dev
->bp_540
) {
421 BP10G_WRITE_REG(pbpctl_dev
, ESDP
,
422 (ctrl
| BP540_MDIO_DIR
|
427 } else if (pbpctl_dev
->bp_10gb
) {
429 BP10GB_WRITE_REG(pbpctl_dev
, MISC_REG_SPIO
,
430 (ctrl_ext
| BP10GB_MDIO_SET
|
437 } else if (!pbpctl_dev
->bp_10g
)
439 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
,
441 BPCTLI_CTRL_EXT_MCLK_DIR
|
442 BPCTLI_CTRL_EXT_MDIO_DIR
|
443 BPCTLI_CTRL_EXT_MDIO_DATA
)
446 (BPCTLI_CTRL_EXT_MCLK_DATA
)));
449 BP10G_WRITE_REG(pbpctl_dev
, EODSDP
,
451 BP10G_MDIO_DATA_OUT
) &
452 ~(BP10G_MCLK_DATA_OUT
)));
455 usec_delay(PULSE_TIME
);
458 if (pbpctl_dev
->bp_10g9
) {
460 /*BP10G_WRITE_REG(pbpctl_dev, I2CCTL, ((ctrl_ext|BP10G_MCLK_DATA_OUT9)&~BP10G_MDIO_DATA_OUT9)); */
461 BP10G_WRITE_REG(pbpctl_dev
, I2CCTL
,
463 ~BP10G_MDIO_DATA_OUT9
));
464 BP10G_WRITE_REG(pbpctl_dev_c
, ESDP
,
465 (ctrl
| BP10G_MCLK_DATA_OUT9
|
466 BP10G_MCLK_DIR_OUT9
));
468 } else if (pbpctl_dev
->bp_fiber5
) {
469 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
,
471 BPCTLI_CTRL_EXT_MCLK_DIR5
|
472 BPCTLI_CTRL_EXT_MDIO_DIR5
|
473 BPCTLI_CTRL_EXT_MCLK_DATA5
)
476 (BPCTLI_CTRL_EXT_MDIO_DATA5
)));
478 } else if (pbpctl_dev
->bp_i80
) {
479 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
,
481 BPCTLI_CTRL_EXT_MDIO_DIR80
)
484 (BPCTLI_CTRL_EXT_MDIO_DATA80
)));
485 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
,
487 BPCTLI_CTRL_EXT_MCLK_DIR80
|
488 BPCTLI_CTRL_EXT_MCLK_DATA80
));
490 } else if (pbpctl_dev
->bp_540
) {
491 BP10G_WRITE_REG(pbpctl_dev
, ESDP
,
492 ((ctrl
| BP540_MCLK_DIR
|
495 ~(BP540_MDIO_DATA
)));
497 } else if (pbpctl_dev
->bp_10gb
) {
498 BP10GB_WRITE_REG(pbpctl_dev
, MISC_REG_SPIO
,
499 (ctrl_ext
| BP10GB_MDIO_CLR
|
506 } else if (!pbpctl_dev
->bp_10g
)
508 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
,
510 BPCTLI_CTRL_EXT_MCLK_DIR
|
511 BPCTLI_CTRL_EXT_MDIO_DIR
|
512 BPCTLI_CTRL_EXT_MCLK_DATA
)
515 (BPCTLI_CTRL_EXT_MDIO_DATA
)));
518 BP10G_WRITE_REG(pbpctl_dev
, EODSDP
,
520 BP10G_MCLK_DATA_OUT
) &
521 ~BP10G_MDIO_DATA_OUT
));
524 usec_delay(PULSE_TIME
);
525 if (pbpctl_dev
->bp_10g9
) {
527 /*BP10G_WRITE_REG(pbpctl_dev, I2CCTL, (ctrl_ext&~(BP10G_MCLK_DATA_OUT9|BP10G_MDIO_DATA_OUT9))); */
528 BP10G_WRITE_REG(pbpctl_dev
, I2CCTL
,
530 ~BP10G_MDIO_DATA_OUT9
));
531 BP10G_WRITE_REG(pbpctl_dev_c
, ESDP
,
532 ((ctrl
| BP10G_MCLK_DIR_OUT9
) &
533 ~(BP10G_MCLK_DATA_OUT9
)));
535 } else if (pbpctl_dev
->bp_fiber5
) {
536 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
,
538 BPCTLI_CTRL_EXT_MCLK_DIR5
|
539 BPCTLI_CTRL_EXT_MDIO_DIR5
)
541 ~(BPCTLI_CTRL_EXT_MCLK_DATA5
543 BPCTLI_CTRL_EXT_MDIO_DATA5
)));
545 } else if (pbpctl_dev
->bp_i80
) {
546 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
,
548 BPCTLI_CTRL_EXT_MDIO_DIR80
)
550 ~BPCTLI_CTRL_EXT_MDIO_DATA80
));
551 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
,
553 BPCTLI_CTRL_EXT_MCLK_DIR80
)
556 (BPCTLI_CTRL_EXT_MCLK_DATA80
)));
558 } else if (pbpctl_dev
->bp_540
) {
559 BP10G_WRITE_REG(pbpctl_dev
, ESDP
,
560 ((ctrl
| BP540_MCLK_DIR
|
564 } else if (pbpctl_dev
->bp_10gb
) {
566 BP10GB_WRITE_REG(pbpctl_dev
, MISC_REG_SPIO
,
567 (ctrl_ext
| BP10GB_MDIO_CLR
|
574 } else if (!pbpctl_dev
->bp_10g
)
575 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
,
577 BPCTLI_CTRL_EXT_MCLK_DIR
|
578 BPCTLI_CTRL_EXT_MDIO_DIR
) &
579 ~(BPCTLI_CTRL_EXT_MCLK_DATA
581 BPCTLI_CTRL_EXT_MDIO_DATA
)));
584 BP10G_WRITE_REG(pbpctl_dev
, EODSDP
,
586 ~(BP10G_MCLK_DATA_OUT
|
587 BP10G_MDIO_DATA_OUT
)));
590 usec_delay(PULSE_TIME
);
596 static int read_pulse(bpctl_dev_t
*pbpctl_dev
, unsigned int ctrl_ext
,
599 unsigned char ctrl_val
= 0;
600 unsigned int i
= len
;
601 unsigned int ctrl
= 0;
602 bpctl_dev_t
*pbpctl_dev_c
= NULL
;
604 if (pbpctl_dev
->bp_i80
)
605 ctrl
= BPCTL_READ_REG(pbpctl_dev
, CTRL_EXT
);
606 if (pbpctl_dev
->bp_540
)
607 ctrl
= BP10G_READ_REG(pbpctl_dev
, ESDP
);
608 if (pbpctl_dev
->bp_10g9
) {
609 if (!(pbpctl_dev_c
= get_status_port_fn(pbpctl_dev
)))
611 ctrl
= BP10G_READ_REG(pbpctl_dev_c
, ESDP
);
616 if (pbpctl_dev
->bp_10g9
) {
617 /*BP10G_WRITE_REG(pbpctl_dev, I2CCTL, ((ctrl_ext|BP10G_MDIO_DATA_OUT9)&~BP10G_MCLK_DATA_OUT9)); */
619 BP10G_WRITE_REG(pbpctl_dev_c
, ESDP
,
620 ((ctrl
| BP10G_MCLK_DIR_OUT9
) &
621 ~(BP10G_MCLK_DATA_OUT9
)));
623 } else if (pbpctl_dev
->bp_fiber5
) {
624 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
, ((ctrl_ext
|
625 BPCTLI_CTRL_EXT_MCLK_DIR5
)
628 (BPCTLI_CTRL_EXT_MDIO_DIR5
630 BPCTLI_CTRL_EXT_MCLK_DATA5
)));
632 } else if (pbpctl_dev
->bp_i80
) {
633 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
,
635 ~BPCTLI_CTRL_EXT_MDIO_DIR80
));
636 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
,
637 ((ctrl
| BPCTLI_CTRL_EXT_MCLK_DIR80
)
638 & ~(BPCTLI_CTRL_EXT_MCLK_DATA80
)));
640 } else if (pbpctl_dev
->bp_540
) {
641 BP10G_WRITE_REG(pbpctl_dev
, ESDP
,
642 ((ctrl
| BP540_MCLK_DIR
) &
643 ~(BP540_MDIO_DIR
| BP540_MCLK_DATA
)));
645 } else if (pbpctl_dev
->bp_10gb
) {
647 BP10GB_WRITE_REG(pbpctl_dev
, MISC_REG_SPIO
,
648 (ctrl_ext
| BP10GB_MDIO_DIR
|
649 BP10GB_MCLK_CLR
) & ~(BP10GB_MCLK_DIR
|
654 } else if (!pbpctl_dev
->bp_10g
)
655 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
, ((ctrl_ext
|
656 BPCTLI_CTRL_EXT_MCLK_DIR
)
659 (BPCTLI_CTRL_EXT_MDIO_DIR
661 BPCTLI_CTRL_EXT_MCLK_DATA
)));
664 BP10G_WRITE_REG(pbpctl_dev
, EODSDP
, ((ctrl_ext
| BP10G_MDIO_DATA_OUT
) & ~BP10G_MCLK_DATA_OUT
)); /* ? */
665 /* printk("0x28=0x%x\n",BP10G_READ_REG(pbpctl_dev,EODSDP);); */
669 usec_delay(PULSE_TIME
);
670 if (pbpctl_dev
->bp_10g9
) {
671 /*BP10G_WRITE_REG(pbpctl_dev, I2CCTL, (ctrl_ext|BP10G_MCLK_DATA_OUT9|BP10G_MDIO_DATA_OUT9)); */
673 BP10G_WRITE_REG(pbpctl_dev_c
, ESDP
,
674 (ctrl
| BP10G_MCLK_DATA_OUT9
|
675 BP10G_MCLK_DIR_OUT9
));
677 } else if (pbpctl_dev
->bp_fiber5
) {
678 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
, ((ctrl_ext
|
679 BPCTLI_CTRL_EXT_MCLK_DIR5
681 BPCTLI_CTRL_EXT_MCLK_DATA5
)
684 (BPCTLI_CTRL_EXT_MDIO_DIR5
)));
686 } else if (pbpctl_dev
->bp_i80
) {
687 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
,
689 ~(BPCTLI_CTRL_EXT_MDIO_DIR80
)));
690 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
,
691 (ctrl
| BPCTLI_CTRL_EXT_MCLK_DIR80
|
692 BPCTLI_CTRL_EXT_MCLK_DATA80
));
694 } else if (pbpctl_dev
->bp_540
) {
695 BP10G_WRITE_REG(pbpctl_dev
, ESDP
,
696 ((ctrl
| BP540_MCLK_DIR
|
700 } else if (pbpctl_dev
->bp_10gb
) {
701 BP10GB_WRITE_REG(pbpctl_dev
, MISC_REG_SPIO
,
702 (ctrl_ext
| BP10GB_MDIO_DIR
|
703 BP10GB_MCLK_SET
) & ~(BP10GB_MCLK_DIR
|
708 } else if (!pbpctl_dev
->bp_10g
)
709 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
, ((ctrl_ext
|
710 BPCTLI_CTRL_EXT_MCLK_DIR
712 BPCTLI_CTRL_EXT_MCLK_DATA
)
715 (BPCTLI_CTRL_EXT_MDIO_DIR
)));
718 BP10G_WRITE_REG(pbpctl_dev
, EODSDP
,
719 (ctrl_ext
| BP10G_MCLK_DATA_OUT
|
720 BP10G_MDIO_DATA_OUT
));
723 if (pbpctl_dev
->bp_10g9
) {
724 ctrl_ext
= BP10G_READ_REG(pbpctl_dev
, I2CCTL
);
726 } else if ((pbpctl_dev
->bp_fiber5
) || (pbpctl_dev
->bp_i80
)) {
727 ctrl_ext
= BPCTL_READ_REG(pbpctl_dev
, CTRL
);
728 } else if (pbpctl_dev
->bp_540
) {
729 ctrl_ext
= BP10G_READ_REG(pbpctl_dev
, ESDP
);
730 } else if (pbpctl_dev
->bp_10gb
)
731 ctrl_ext
= BP10GB_READ_REG(pbpctl_dev
, MISC_REG_SPIO
);
733 else if (!pbpctl_dev
->bp_10g
)
734 ctrl_ext
= BPCTL_READ_REG(pbpctl_dev
, CTRL_EXT
);
736 ctrl_ext
= BP10G_READ_REG(pbpctl_dev
, EODSDP
);
738 usec_delay(PULSE_TIME
);
739 if (pbpctl_dev
->bp_10g9
) {
740 if (ctrl_ext
& BP10G_MDIO_DATA_IN9
)
743 } else if (pbpctl_dev
->bp_fiber5
) {
744 if (ctrl_ext
& BPCTLI_CTRL_EXT_MDIO_DATA5
)
746 } else if (pbpctl_dev
->bp_i80
) {
747 if (ctrl_ext
& BPCTLI_CTRL_EXT_MDIO_DATA80
)
749 } else if (pbpctl_dev
->bp_540
) {
750 if (ctrl_ext
& BP540_MDIO_DATA
)
752 } else if (pbpctl_dev
->bp_10gb
) {
753 if (ctrl_ext
& BP10GB_MDIO_DATA
)
756 } else if (!pbpctl_dev
->bp_10g
) {
758 if (ctrl_ext
& BPCTLI_CTRL_EXT_MDIO_DATA
)
762 if (ctrl_ext
& BP10G_MDIO_DATA_IN
)
771 static void write_reg(bpctl_dev_t
*pbpctl_dev
, unsigned char value
,
774 uint32_t ctrl_ext
= 0, ctrl
= 0;
775 bpctl_dev_t
*pbpctl_dev_c
= NULL
;
777 if (pbpctl_dev
->bp_10g9
) {
778 if (!(pbpctl_dev_c
= get_status_port_fn(pbpctl_dev
)))
781 if ((pbpctl_dev
->wdt_status
== WDT_STATUS_EN
) &&
782 (pbpctl_dev
->bp_ext_ver
< PXG4BPFI_VER
))
783 wdt_time_left(pbpctl_dev
);
786 spin_lock_irqsave(&pbpctl_dev
->bypass_wr_lock
, flags
);
788 atomic_set(&pbpctl_dev
->wdt_busy
, 1);
790 if (pbpctl_dev
->bp_10g9
) {
792 ctrl_ext
= BP10G_READ_REG(pbpctl_dev
, I2CCTL
);
793 ctrl
= BP10G_READ_REG(pbpctl_dev_c
, ESDP
);
795 /* BP10G_WRITE_REG(pbpctl_dev, I2CCTL, (ctrl_ext&~(BP10G_MCLK_DATA_OUT9|BP10G_MDIO_DATA_OUT9))); */
796 BP10G_WRITE_REG(pbpctl_dev
, I2CCTL
,
797 (ctrl_ext
& ~BP10G_MDIO_DATA_OUT9
));
798 BP10G_WRITE_REG(pbpctl_dev_c
, ESDP
,
799 ((ctrl
| BP10G_MCLK_DIR_OUT9
) &
800 ~(BP10G_MCLK_DATA_OUT9
)));
802 } else if (pbpctl_dev
->bp_fiber5
) {
803 ctrl_ext
= BPCTL_READ_REG(pbpctl_dev
, CTRL
);
804 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
, ((ctrl_ext
|
805 BPCTLI_CTRL_EXT_MCLK_DIR5
807 BPCTLI_CTRL_EXT_MDIO_DIR5
)
810 (BPCTLI_CTRL_EXT_MDIO_DATA5
812 BPCTLI_CTRL_EXT_MCLK_DATA5
)));
813 } else if (pbpctl_dev
->bp_i80
) {
814 ctrl_ext
= BPCTL_READ_REG(pbpctl_dev
, CTRL
);
815 ctrl
= BPCTL_READ_REG(pbpctl_dev
, CTRL_EXT
);
816 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
, ((ctrl_ext
|
817 BPCTLI_CTRL_EXT_MDIO_DIR80
)
819 ~BPCTLI_CTRL_EXT_MDIO_DATA80
));
820 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
,
821 ((ctrl
| BPCTLI_CTRL_EXT_MCLK_DIR80
) &
822 ~BPCTLI_CTRL_EXT_MCLK_DATA80
));
824 } else if (pbpctl_dev
->bp_540
) {
825 ctrl
= ctrl_ext
= BP10G_READ_REG(pbpctl_dev
, ESDP
);
826 BP10G_WRITE_REG(pbpctl_dev
, ESDP
, ((ctrl
|
832 } else if (pbpctl_dev
->bp_10gb
) {
833 ctrl_ext
= BP10GB_READ_REG(pbpctl_dev
, MISC_REG_SPIO
);
835 BP10GB_WRITE_REG(pbpctl_dev
, MISC_REG_SPIO
,
836 (ctrl_ext
| BP10GB_MDIO_CLR
| BP10GB_MCLK_CLR
)
837 & ~(BP10GB_MCLK_DIR
| BP10GB_MDIO_DIR
|
838 BP10GB_MDIO_SET
| BP10GB_MCLK_SET
));
840 } else if (!pbpctl_dev
->bp_10g
) {
842 ctrl_ext
= BPCTL_READ_REG(pbpctl_dev
, CTRL_EXT
);
843 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
, ((ctrl_ext
|
844 BPCTLI_CTRL_EXT_MCLK_DIR
846 BPCTLI_CTRL_EXT_MDIO_DIR
)
849 (BPCTLI_CTRL_EXT_MDIO_DATA
851 BPCTLI_CTRL_EXT_MCLK_DATA
)));
853 ctrl
= BP10G_READ_REG(pbpctl_dev
, ESDP
);
854 ctrl_ext
= BP10G_READ_REG(pbpctl_dev
, EODSDP
);
855 BP10G_WRITE_REG(pbpctl_dev
, EODSDP
,
857 ~(BP10G_MCLK_DATA_OUT
| BP10G_MDIO_DATA_OUT
)));
859 usec_delay(CMND_INTERVAL
);
862 write_pulse(pbpctl_dev
, ctrl_ext
, SYNC_CMD_VAL
, SYNC_CMD_LEN
);
864 write_pulse(pbpctl_dev
, ctrl_ext
, WR_CMD_VAL
, WR_CMD_LEN
);
865 write_pulse(pbpctl_dev
, ctrl_ext
, addr
, ADDR_CMD_LEN
);
868 write_pulse(pbpctl_dev
, ctrl_ext
, value
, WR_DATA_LEN
);
869 if (pbpctl_dev
->bp_10g9
) {
870 /*BP10G_WRITE_REG(pbpctl_dev, I2CCTL, (ctrl_ext&~(BP10G_MCLK_DATA_OUT9|BP10G_MDIO_DATA_OUT9))); */
872 BP10G_WRITE_REG(pbpctl_dev
, I2CCTL
,
873 (ctrl_ext
& ~BP10G_MDIO_DATA_OUT9
));
874 BP10G_WRITE_REG(pbpctl_dev_c
, ESDP
,
875 ((ctrl
| BP10G_MCLK_DIR_OUT9
) &
876 ~(BP10G_MCLK_DATA_OUT9
)));
878 } else if (pbpctl_dev
->bp_fiber5
) {
879 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
, ((ctrl_ext
|
880 BPCTLI_CTRL_EXT_MCLK_DIR5
882 BPCTLI_CTRL_EXT_MDIO_DIR5
)
885 (BPCTLI_CTRL_EXT_MDIO_DATA5
887 BPCTLI_CTRL_EXT_MCLK_DATA5
)));
888 } else if (pbpctl_dev
->bp_i80
) {
889 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
, ((ctrl_ext
|
890 BPCTLI_CTRL_EXT_MDIO_DIR80
)
892 ~BPCTLI_CTRL_EXT_MDIO_DATA80
));
893 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
,
894 ((ctrl
| BPCTLI_CTRL_EXT_MCLK_DIR80
) &
895 ~BPCTLI_CTRL_EXT_MCLK_DATA80
));
896 } else if (pbpctl_dev
->bp_540
) {
897 BP10G_WRITE_REG(pbpctl_dev
, ESDP
, ((ctrl
|
902 } else if (pbpctl_dev
->bp_10gb
) {
903 BP10GB_WRITE_REG(pbpctl_dev
, MISC_REG_SPIO
,
904 (ctrl_ext
| BP10GB_MDIO_CLR
| BP10GB_MCLK_CLR
)
905 & ~(BP10GB_MCLK_DIR
| BP10GB_MDIO_DIR
|
906 BP10GB_MDIO_SET
| BP10GB_MCLK_SET
));
908 } else if (!pbpctl_dev
->bp_10g
)
910 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
, ((ctrl_ext
|
911 BPCTLI_CTRL_EXT_MCLK_DIR
913 BPCTLI_CTRL_EXT_MDIO_DIR
)
916 (BPCTLI_CTRL_EXT_MDIO_DATA
918 BPCTLI_CTRL_EXT_MCLK_DATA
)));
920 BP10G_WRITE_REG(pbpctl_dev
, EODSDP
,
922 ~(BP10G_MCLK_DATA_OUT
| BP10G_MDIO_DATA_OUT
)));
926 usec_delay(CMND_INTERVAL
* 4);
928 if ((pbpctl_dev
->wdt_status
== WDT_STATUS_EN
) &&
929 (pbpctl_dev
->bp_ext_ver
< PXG4BPFI_VER
) && (addr
== CMND_REG_ADDR
))
930 pbpctl_dev
->bypass_wdt_on_time
= jiffies
;
932 spin_unlock_irqrestore(&pbpctl_dev
->bypass_wr_lock
, flags
);
934 atomic_set(&pbpctl_dev
->wdt_busy
, 0);
939 static void write_data(bpctl_dev_t
*pbpctl_dev
, unsigned char value
)
941 write_reg(pbpctl_dev
, value
, CMND_REG_ADDR
);
944 static int read_reg(bpctl_dev_t
*pbpctl_dev
, unsigned char addr
)
946 uint32_t ctrl_ext
= 0, ctrl
= 0, ctrl_value
= 0;
947 bpctl_dev_t
*pbpctl_dev_c
= NULL
;
951 spin_lock_irqsave(&pbpctl_dev
->bypass_wr_lock
, flags
);
953 atomic_set(&pbpctl_dev
->wdt_busy
, 1);
955 if (pbpctl_dev
->bp_10g9
) {
956 if (!(pbpctl_dev_c
= get_status_port_fn(pbpctl_dev
)))
960 if (pbpctl_dev
->bp_10g9
) {
961 ctrl_ext
= BP10G_READ_REG(pbpctl_dev
, I2CCTL
);
962 ctrl
= BP10G_READ_REG(pbpctl_dev_c
, ESDP
);
964 /* BP10G_WRITE_REG(pbpctl_dev, I2CCTL, (ctrl_ext&~(BP10G_MCLK_DATA_OUT9|BP10G_MDIO_DATA_OUT9))); */
966 BP10G_WRITE_REG(pbpctl_dev
, I2CCTL
,
967 (ctrl_ext
& ~BP10G_MDIO_DATA_OUT9
));
968 BP10G_WRITE_REG(pbpctl_dev_c
, ESDP
,
969 ((ctrl
| BP10G_MCLK_DIR_OUT9
) &
970 ~(BP10G_MCLK_DATA_OUT9
)));
972 } else if (pbpctl_dev
->bp_fiber5
) {
973 ctrl_ext
= BPCTL_READ_REG(pbpctl_dev
, CTRL
);
975 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
, ((ctrl_ext
|
976 BPCTLI_CTRL_EXT_MCLK_DIR5
978 BPCTLI_CTRL_EXT_MDIO_DIR5
)
981 (BPCTLI_CTRL_EXT_MDIO_DATA5
983 BPCTLI_CTRL_EXT_MCLK_DATA5
)));
984 } else if (pbpctl_dev
->bp_i80
) {
985 ctrl_ext
= BPCTL_READ_REG(pbpctl_dev
, CTRL
);
986 ctrl
= BPCTL_READ_REG(pbpctl_dev
, CTRL_EXT
);
988 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
, ((ctrl_ext
|
989 BPCTLI_CTRL_EXT_MDIO_DIR80
)
991 ~BPCTLI_CTRL_EXT_MDIO_DATA80
));
992 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
,
993 ((ctrl
| BPCTLI_CTRL_EXT_MCLK_DIR80
) &
994 ~BPCTLI_CTRL_EXT_MCLK_DATA80
));
995 } else if (pbpctl_dev
->bp_540
) {
996 ctrl_ext
= BP10G_READ_REG(pbpctl_dev
, ESDP
);
997 ctrl
= BP10G_READ_REG(pbpctl_dev
, ESDP
);
999 BP10G_WRITE_REG(pbpctl_dev
, ESDP
, ((ctrl
| BP540_MCLK_DIR
|
1003 } else if (pbpctl_dev
->bp_10gb
) {
1004 ctrl_ext
= BP10GB_READ_REG(pbpctl_dev
, MISC_REG_SPIO
);
1006 BP10GB_WRITE_REG(pbpctl_dev
, MISC_REG_SPIO
,
1007 (ctrl_ext
| BP10GB_MDIO_CLR
| BP10GB_MCLK_CLR
)
1008 & ~(BP10GB_MCLK_DIR
| BP10GB_MDIO_DIR
|
1009 BP10GB_MDIO_SET
| BP10GB_MCLK_SET
));
1012 /*BP10GB_WRITE_REG(pbpctl_dev, MISC_REG_SPIO, (ctrl_ext | BP10GB_MCLK_DIR | BP10GB_MDIO_DIR|
1013 BP10GB_MCLK_CLR|BP10GB_MDIO_CLR));
1014 ctrl_ext = BP10GB_READ_REG(pbpctl_dev, MISC_REG_SPIO);
1015 printk("1reg=%x\n", ctrl_ext); */
1017 BP10GB_WRITE_REG(pbpctl_dev
, MISC_REG_SPIO
, ((ctrl_ext
|
1020 & ~(BP10GB_MCLK_CLR
| BP10GB_MDIO_SET
|
1021 BP10GB_MCLK_DIR
| BP10GB_MDIO_DIR
));
1023 /* bnx2x_set_spio(pbpctl_dev, 5, MISC_REGISTERS_SPIO_OUTPUT_LOW);
1024 bnx2x_set_spio(pbpctl_dev, 4, MISC_REGISTERS_SPIO_OUTPUT_LOW);
1025 bnx2x_set_spio(pbpctl_dev, 4, MISC_REGISTERS_SPIO_INPUT_HI_Z); */
1027 ctrl_ext
= BP10GB_READ_REG(pbpctl_dev
, MISC_REG_SPIO
);
1029 printk("2reg=%x\n", ctrl_ext
);
1032 spin_unlock_irqrestore(&pbpctl_dev
->bypass_wr_lock
, flags
);
1034 atomic_set(&pbpctl_dev
->wdt_busy
, 0);
1041 } else if (!pbpctl_dev
->bp_10g
) {
1043 ctrl_ext
= BPCTL_READ_REG(pbpctl_dev
, CTRL_EXT
);
1045 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
, ((ctrl_ext
|
1046 BPCTLI_CTRL_EXT_MCLK_DIR
1048 BPCTLI_CTRL_EXT_MDIO_DIR
)
1051 (BPCTLI_CTRL_EXT_MDIO_DATA
1053 BPCTLI_CTRL_EXT_MCLK_DATA
)));
1056 ctrl
= BP10G_READ_REG(pbpctl_dev
, ESDP
);
1057 ctrl_ext
= BP10G_READ_REG(pbpctl_dev
, EODSDP
);
1058 BP10G_WRITE_REG(pbpctl_dev
, EODSDP
,
1060 ~(BP10G_MCLK_DATA_OUT
| BP10G_MDIO_DATA_OUT
)));
1064 usec_delay(CMND_INTERVAL
);
1067 write_pulse(pbpctl_dev
, ctrl_ext
, SYNC_CMD_VAL
, SYNC_CMD_LEN
);
1069 write_pulse(pbpctl_dev
, ctrl_ext
, RD_CMD_VAL
, RD_CMD_LEN
);
1071 write_pulse(pbpctl_dev
, ctrl_ext
, addr
, ADDR_CMD_LEN
);
1074 if (pbpctl_dev
->bp_10g9
) {
1076 /*BP10G_WRITE_REG(pbpctl_dev, I2CCTL, (ctrl_ext|BP10G_MCLK_DATA_OUT9|BP10G_MDIO_DATA_OUT9)); */
1077 BP10G_WRITE_REG(pbpctl_dev
, I2CCTL
,
1078 (ctrl_ext
| BP10G_MDIO_DATA_OUT9
));
1079 BP10G_WRITE_REG(pbpctl_dev_c
, ESDP
,
1080 (ctrl
| BP10G_MCLK_DATA_OUT9
|
1081 BP10G_MCLK_DIR_OUT9
));
1083 } else if (pbpctl_dev
->bp_fiber5
) {
1084 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
, ((ctrl_ext
|
1085 BPCTLI_CTRL_EXT_MCLK_DIR5
1087 BPCTLI_CTRL_EXT_MCLK_DATA5
)
1090 (BPCTLI_CTRL_EXT_MDIO_DIR5
1092 BPCTLI_CTRL_EXT_MDIO_DATA5
)));
1094 } else if (pbpctl_dev
->bp_i80
) {
1095 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
,
1097 ~(BPCTLI_CTRL_EXT_MDIO_DATA80
|
1098 BPCTLI_CTRL_EXT_MDIO_DIR80
)));
1099 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
,
1100 (ctrl
| BPCTLI_CTRL_EXT_MCLK_DIR80
|
1101 BPCTLI_CTRL_EXT_MCLK_DATA80
));
1103 } else if (pbpctl_dev
->bp_540
) {
1104 BP10G_WRITE_REG(pbpctl_dev
, ESDP
,
1105 (((ctrl
| BP540_MDIO_DIR
| BP540_MCLK_DIR
|
1106 BP540_MCLK_DATA
) & ~BP540_MDIO_DATA
)));
1108 } else if (pbpctl_dev
->bp_10gb
) {
1110 BP10GB_WRITE_REG(pbpctl_dev
, MISC_REG_SPIO
,
1111 (ctrl_ext
| BP10GB_MDIO_DIR
| BP10GB_MCLK_SET
)
1112 & ~(BP10GB_MCLK_DIR
| BP10GB_MDIO_SET
|
1113 BP10GB_MDIO_CLR
| BP10GB_MCLK_CLR
));
1115 } else if (!pbpctl_dev
->bp_10g
)
1116 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
, ((ctrl_ext
|
1117 BPCTLI_CTRL_EXT_MCLK_DIR
1119 BPCTLI_CTRL_EXT_MCLK_DATA
)
1122 (BPCTLI_CTRL_EXT_MDIO_DIR
1124 BPCTLI_CTRL_EXT_MDIO_DATA
)));
1127 BP10G_WRITE_REG(pbpctl_dev
, EODSDP
,
1128 (ctrl_ext
| BP10G_MCLK_DATA_OUT
|
1129 BP10G_MDIO_DATA_OUT
));
1133 usec_delay(PULSE_TIME
);
1135 ctrl_value
= read_pulse(pbpctl_dev
, ctrl_ext
, RD_DATA_LEN
);
1137 if (pbpctl_dev
->bp_10g9
) {
1138 ctrl_ext
= BP10G_READ_REG(pbpctl_dev
, I2CCTL
);
1139 ctrl
= BP10G_READ_REG(pbpctl_dev_c
, ESDP
);
1141 /* BP10G_WRITE_REG(pbpctl_dev, I2CCTL, (ctrl_ext&~(BP10G_MCLK_DATA_OUT9|BP10G_MDIO_DATA_OUT9))); */
1143 BP10G_WRITE_REG(pbpctl_dev
, I2CCTL
,
1144 (ctrl_ext
& ~BP10G_MDIO_DATA_OUT9
));
1145 BP10G_WRITE_REG(pbpctl_dev_c
, ESDP
,
1146 ((ctrl
| BP10G_MCLK_DIR_OUT9
) &
1147 ~(BP10G_MCLK_DATA_OUT9
)));
1149 } else if (pbpctl_dev
->bp_fiber5
) {
1150 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
, ((ctrl_ext
|
1151 BPCTLI_CTRL_EXT_MCLK_DIR5
1153 BPCTLI_CTRL_EXT_MDIO_DIR5
)
1156 (BPCTLI_CTRL_EXT_MDIO_DATA5
1158 BPCTLI_CTRL_EXT_MCLK_DATA5
)));
1159 } else if (pbpctl_dev
->bp_i80
) {
1160 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
, ((ctrl_ext
|
1161 BPCTLI_CTRL_EXT_MDIO_DIR80
)
1163 ~BPCTLI_CTRL_EXT_MDIO_DATA80
));
1164 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
,
1165 ((ctrl
| BPCTLI_CTRL_EXT_MCLK_DIR80
) &
1166 ~BPCTLI_CTRL_EXT_MCLK_DATA80
));
1168 } else if (pbpctl_dev
->bp_540
) {
1169 ctrl
= BP10G_READ_REG(pbpctl_dev
, ESDP
);
1170 BP10G_WRITE_REG(pbpctl_dev
, ESDP
, ((ctrl
| BP540_MCLK_DIR
|
1175 } else if (pbpctl_dev
->bp_10gb
) {
1176 ctrl_ext
= BP10GB_READ_REG(pbpctl_dev
, MISC_REG_SPIO
);
1177 BP10GB_WRITE_REG(pbpctl_dev
, MISC_REG_SPIO
,
1178 (ctrl_ext
| BP10GB_MDIO_CLR
| BP10GB_MCLK_CLR
)
1179 & ~(BP10GB_MCLK_DIR
| BP10GB_MDIO_DIR
|
1180 BP10GB_MDIO_SET
| BP10GB_MCLK_SET
));
1182 } else if (!pbpctl_dev
->bp_10g
) {
1183 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
, ((ctrl_ext
|
1184 BPCTLI_CTRL_EXT_MCLK_DIR
1186 BPCTLI_CTRL_EXT_MDIO_DIR
)
1189 (BPCTLI_CTRL_EXT_MDIO_DATA
1191 BPCTLI_CTRL_EXT_MCLK_DATA
)));
1194 ctrl
= BP10G_READ_REG(pbpctl_dev
, ESDP
);
1195 ctrl_ext
= BP10G_READ_REG(pbpctl_dev
, EODSDP
);
1196 BP10G_WRITE_REG(pbpctl_dev
, EODSDP
,
1198 ~(BP10G_MCLK_DATA_OUT
| BP10G_MDIO_DATA_OUT
)));
1202 usec_delay(CMND_INTERVAL
* 4);
1204 spin_unlock_irqrestore(&pbpctl_dev
->bypass_wr_lock
, flags
);
1206 atomic_set(&pbpctl_dev
->wdt_busy
, 0);
1212 static int wdt_pulse(bpctl_dev_t
*pbpctl_dev
)
1214 uint32_t ctrl_ext
= 0, ctrl
= 0;
1215 bpctl_dev_t
*pbpctl_dev_c
= NULL
;
1218 unsigned long flags
;
1220 spin_lock_irqsave(&pbpctl_dev
->bypass_wr_lock
, flags
);
1223 if ((atomic_read(&pbpctl_dev
->wdt_busy
)) == 1)
1226 if (pbpctl_dev
->bp_10g9
) {
1227 if (!(pbpctl_dev_c
= get_status_port_fn(pbpctl_dev
)))
1231 if (pbpctl_dev
->bp_10g9
) {
1232 ctrl_ext
= BP10G_READ_REG(pbpctl_dev
, I2CCTL
);
1233 ctrl
= BP10G_READ_REG(pbpctl_dev_c
, ESDP
);
1235 /* BP10G_WRITE_REG(pbpctl_dev, I2CCTL, (ctrl_ext&~(BP10G_MCLK_DATA_OUT9|BP10G_MDIO_DATA_OUT9))); */
1237 BP10G_WRITE_REG(pbpctl_dev
, I2CCTL
,
1238 (ctrl_ext
& ~BP10G_MDIO_DATA_OUT9
));
1239 BP10G_WRITE_REG(pbpctl_dev_c
, ESDP
,
1240 ((ctrl
| BP10G_MCLK_DIR_OUT9
) &
1241 ~(BP10G_MCLK_DATA_OUT9
)));
1243 } else if (pbpctl_dev
->bp_fiber5
) {
1244 ctrl_ext
= BPCTL_READ_REG(pbpctl_dev
, CTRL
);
1245 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
, ((ctrl_ext
|
1246 BPCTLI_CTRL_EXT_MCLK_DIR5
1248 BPCTLI_CTRL_EXT_MDIO_DIR5
)
1251 (BPCTLI_CTRL_EXT_MDIO_DATA5
1253 BPCTLI_CTRL_EXT_MCLK_DATA5
)));
1254 } else if (pbpctl_dev
->bp_i80
) {
1255 ctrl_ext
= BPCTL_READ_REG(pbpctl_dev
, CTRL
);
1256 ctrl
= BPCTL_READ_REG(pbpctl_dev
, CTRL_EXT
);
1257 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
, ((ctrl_ext
|
1258 BPCTLI_CTRL_EXT_MDIO_DIR80
)
1260 ~BPCTLI_CTRL_EXT_MDIO_DATA80
));
1261 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
,
1262 ((ctrl
| BPCTLI_CTRL_EXT_MCLK_DIR80
) &
1263 ~BPCTLI_CTRL_EXT_MCLK_DATA80
));
1264 } else if (pbpctl_dev
->bp_540
) {
1265 ctrl_ext
= ctrl
= BP10G_READ_REG(pbpctl_dev
, ESDP
);
1266 BP10G_WRITE_REG(pbpctl_dev
, ESDP
, ((ctrl
| BP540_MCLK_DIR
|
1270 } else if (pbpctl_dev
->bp_10gb
) {
1271 ctrl_ext
= BP10GB_READ_REG(pbpctl_dev
, MISC_REG_SPIO
);
1272 BP10GB_WRITE_REG(pbpctl_dev
, MISC_REG_SPIO
,
1273 (ctrl_ext
| BP10GB_MDIO_CLR
| BP10GB_MCLK_CLR
)
1274 & ~(BP10GB_MCLK_DIR
| BP10GB_MDIO_DIR
|
1275 BP10GB_MDIO_SET
| BP10GB_MCLK_SET
));
1277 } else if (!pbpctl_dev
->bp_10g
) {
1279 ctrl_ext
= BPCTL_READ_REG(pbpctl_dev
, CTRL_EXT
);
1280 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
, ((ctrl_ext
|
1281 BPCTLI_CTRL_EXT_MCLK_DIR
1283 BPCTLI_CTRL_EXT_MDIO_DIR
)
1286 (BPCTLI_CTRL_EXT_MDIO_DATA
1288 BPCTLI_CTRL_EXT_MCLK_DATA
)));
1291 ctrl
= BP10G_READ_REG(pbpctl_dev
, ESDP
);
1292 ctrl_ext
= BP10G_READ_REG(pbpctl_dev
, EODSDP
);
1293 BP10G_WRITE_REG(pbpctl_dev
, EODSDP
,
1295 ~(BP10G_MCLK_DATA_OUT
| BP10G_MDIO_DATA_OUT
)));
1298 if (pbpctl_dev
->bp_10g9
) {
1299 /* BP10G_WRITE_REG(pbpctl_dev, I2CCTL, ((ctrl_ext|BP10G_MCLK_DATA_OUT9)&~BP10G_MDIO_DATA_OUT9)); */
1301 BP10G_WRITE_REG(pbpctl_dev
, I2CCTL
,
1302 (ctrl_ext
& ~BP10G_MDIO_DATA_OUT9
));
1303 BP10G_WRITE_REG(pbpctl_dev_c
, ESDP
,
1304 (ctrl
| BP10G_MCLK_DATA_OUT9
|
1305 BP10G_MCLK_DIR_OUT9
));
1307 } else if (pbpctl_dev
->bp_fiber5
) {
1308 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
, ((ctrl_ext
|
1309 BPCTLI_CTRL_EXT_MCLK_DIR5
1311 BPCTLI_CTRL_EXT_MDIO_DIR5
1313 BPCTLI_CTRL_EXT_MCLK_DATA5
)
1316 (BPCTLI_CTRL_EXT_MDIO_DATA5
)));
1317 } else if (pbpctl_dev
->bp_i80
) {
1318 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
, ((ctrl_ext
|
1319 BPCTLI_CTRL_EXT_MDIO_DIR80
)
1321 ~BPCTLI_CTRL_EXT_MDIO_DATA80
));
1322 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
,
1323 (ctrl
| BPCTLI_CTRL_EXT_MCLK_DIR80
|
1324 BPCTLI_CTRL_EXT_MCLK_DATA80
));
1326 } else if (pbpctl_dev
->bp_540
) {
1327 BP10G_WRITE_REG(pbpctl_dev
, ESDP
, ((ctrl
|
1333 } else if (pbpctl_dev
->bp_10gb
) {
1334 ctrl_ext
= BP10GB_READ_REG(pbpctl_dev
, MISC_REG_SPIO
);
1336 BP10GB_WRITE_REG(pbpctl_dev
, MISC_REG_SPIO
,
1337 (ctrl_ext
| BP10GB_MDIO_CLR
| BP10GB_MCLK_SET
)
1338 & ~(BP10GB_MCLK_DIR
| BP10GB_MDIO_DIR
|
1339 BP10GB_MDIO_SET
| BP10GB_MCLK_CLR
));
1341 } else if (!pbpctl_dev
->bp_10g
)
1342 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
, ((ctrl_ext
|
1343 BPCTLI_CTRL_EXT_MCLK_DIR
1345 BPCTLI_CTRL_EXT_MDIO_DIR
1347 BPCTLI_CTRL_EXT_MCLK_DATA
)
1350 (BPCTLI_CTRL_EXT_MDIO_DATA
)));
1353 BP10G_WRITE_REG(pbpctl_dev
, EODSDP
,
1354 ((ctrl_ext
| BP10G_MCLK_DATA_OUT
) &
1355 ~BP10G_MDIO_DATA_OUT
));
1359 usec_delay(WDT_INTERVAL
);
1360 if (pbpctl_dev
->bp_10g9
) {
1361 /* BP10G_WRITE_REG(pbpctl_dev, I2CCTL, (ctrl_ext&~(BP10G_MCLK_DATA_OUT9|BP10G_MDIO_DATA_OUT9))); */
1363 BP10G_WRITE_REG(pbpctl_dev
, I2CCTL
,
1364 (ctrl_ext
& ~BP10G_MDIO_DATA_OUT9
));
1365 BP10G_WRITE_REG(pbpctl_dev_c
, ESDP
,
1366 ((ctrl
| BP10G_MCLK_DIR_OUT9
) &
1367 ~(BP10G_MCLK_DATA_OUT9
)));
1369 } else if (pbpctl_dev
->bp_fiber5
) {
1370 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
, ((ctrl_ext
|
1371 BPCTLI_CTRL_EXT_MCLK_DIR5
1373 BPCTLI_CTRL_EXT_MDIO_DIR5
)
1376 (BPCTLI_CTRL_EXT_MCLK_DATA5
1378 BPCTLI_CTRL_EXT_MDIO_DATA5
)));
1379 } else if (pbpctl_dev
->bp_i80
) {
1380 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
, ((ctrl_ext
|
1381 BPCTLI_CTRL_EXT_MDIO_DIR80
)
1383 ~BPCTLI_CTRL_EXT_MDIO_DATA80
));
1384 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
,
1385 ((ctrl
| BPCTLI_CTRL_EXT_MCLK_DIR80
) &
1386 ~BPCTLI_CTRL_EXT_MCLK_DATA80
));
1388 } else if (pbpctl_dev
->bp_540
) {
1389 BP10G_WRITE_REG(pbpctl_dev
, ESDP
, ((ctrl
| BP540_MCLK_DIR
|
1394 } else if (pbpctl_dev
->bp_10gb
) {
1395 ctrl_ext
= BP10GB_READ_REG(pbpctl_dev
, MISC_REG_SPIO
);
1396 BP10GB_WRITE_REG(pbpctl_dev
, MISC_REG_SPIO
,
1397 (ctrl_ext
| BP10GB_MDIO_CLR
| BP10GB_MCLK_CLR
)
1398 & ~(BP10GB_MCLK_DIR
| BP10GB_MDIO_DIR
|
1399 BP10GB_MDIO_SET
| BP10GB_MCLK_SET
));
1401 } else if (!pbpctl_dev
->bp_10g
)
1402 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
, ((ctrl_ext
|
1403 BPCTLI_CTRL_EXT_MCLK_DIR
1405 BPCTLI_CTRL_EXT_MDIO_DIR
)
1408 (BPCTLI_CTRL_EXT_MCLK_DATA
1410 BPCTLI_CTRL_EXT_MDIO_DATA
)));
1413 BP10G_WRITE_REG(pbpctl_dev
, EODSDP
,
1415 ~(BP10G_MCLK_DATA_OUT
| BP10G_MDIO_DATA_OUT
)));
1417 if ((pbpctl_dev
->wdt_status
== WDT_STATUS_EN
) /*&&
1418 (pbpctl_dev->bp_ext_ver<PXG4BPFI_VER) */ )
1419 pbpctl_dev
->bypass_wdt_on_time
= jiffies
;
1421 spin_unlock_irqrestore(&pbpctl_dev
->bypass_wr_lock
, flags
);
1423 usec_delay(CMND_INTERVAL
* 4);
1427 static void data_pulse(bpctl_dev_t
*pbpctl_dev
, unsigned char value
)
1430 uint32_t ctrl_ext
= 0;
1432 unsigned long flags
;
1434 wdt_time_left(pbpctl_dev
);
1436 spin_lock_irqsave(&pbpctl_dev
->bypass_wr_lock
, flags
);
1438 atomic_set(&pbpctl_dev
->wdt_busy
, 1);
1441 ctrl_ext
= BPCTL_READ_REG(pbpctl_dev
, CTRL_EXT
);
1442 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
, ((ctrl_ext
|
1443 BPCTLI_CTRL_EXT_SDP6_DIR
|
1444 BPCTLI_CTRL_EXT_SDP7_DIR
) &
1445 ~(BPCTLI_CTRL_EXT_SDP6_DATA
|
1446 BPCTLI_CTRL_EXT_SDP7_DATA
)));
1448 usec_delay(INIT_CMND_INTERVAL
);
1449 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
, ((ctrl_ext
|
1450 BPCTLI_CTRL_EXT_SDP6_DIR
|
1451 BPCTLI_CTRL_EXT_SDP7_DIR
|
1452 BPCTLI_CTRL_EXT_SDP6_DATA
) &
1454 (BPCTLI_CTRL_EXT_SDP7_DATA
)));
1455 usec_delay(INIT_CMND_INTERVAL
);
1458 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
, ctrl_ext
|
1459 BPCTLI_CTRL_EXT_SDP6_DIR
|
1460 BPCTLI_CTRL_EXT_SDP7_DIR
|
1461 BPCTLI_CTRL_EXT_SDP6_DATA
|
1462 BPCTLI_CTRL_EXT_SDP7_DATA
);
1463 usec_delay(PULSE_INTERVAL
);
1464 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
, ((ctrl_ext
|
1465 BPCTLI_CTRL_EXT_SDP6_DIR
1467 BPCTLI_CTRL_EXT_SDP7_DIR
1469 BPCTLI_CTRL_EXT_SDP6_DATA
)
1471 ~BPCTLI_CTRL_EXT_SDP7_DATA
));
1472 usec_delay(PULSE_INTERVAL
);
1476 usec_delay(INIT_CMND_INTERVAL
- PULSE_INTERVAL
);
1477 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
, ((ctrl_ext
|
1478 BPCTLI_CTRL_EXT_SDP6_DIR
|
1479 BPCTLI_CTRL_EXT_SDP7_DIR
) &
1480 ~(BPCTLI_CTRL_EXT_SDP6_DATA
|
1481 BPCTLI_CTRL_EXT_SDP7_DATA
)));
1482 usec_delay(WDT_TIME_CNT
);
1483 if (pbpctl_dev
->wdt_status
== WDT_STATUS_EN
)
1484 pbpctl_dev
->bypass_wdt_on_time
= jiffies
;
1486 spin_unlock_irqrestore(&pbpctl_dev
->bypass_wr_lock
, flags
);
1488 atomic_set(&pbpctl_dev
->wdt_busy
, 0);
1493 static int send_wdt_pulse(bpctl_dev_t
*pbpctl_dev
)
1495 uint32_t ctrl_ext
= 0;
1498 unsigned long flags
;
1500 spin_lock_irqsave(&pbpctl_dev
->bypass_wr_lock
, flags
);
1503 if ((atomic_read(&pbpctl_dev
->wdt_busy
)) == 1)
1506 wdt_time_left(pbpctl_dev
);
1507 ctrl_ext
= BPCTL_READ_REG(pbpctl_dev
, CTRL_EXT
);
1509 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
, ctrl_ext
| /* 1 */
1510 BPCTLI_CTRL_EXT_SDP7_DIR
|
1511 BPCTLI_CTRL_EXT_SDP7_DATA
);
1512 usec_delay(PULSE_INTERVAL
);
1513 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
, ((ctrl_ext
| /* 0 */
1514 BPCTLI_CTRL_EXT_SDP7_DIR
) &
1515 ~BPCTLI_CTRL_EXT_SDP7_DATA
));
1517 usec_delay(PULSE_INTERVAL
);
1518 if (pbpctl_dev
->wdt_status
== WDT_STATUS_EN
)
1519 pbpctl_dev
->bypass_wdt_on_time
= jiffies
;
1521 spin_unlock_irqrestore(&pbpctl_dev
->bypass_wr_lock
, flags
);
1527 void send_bypass_clear_pulse(bpctl_dev_t
*pbpctl_dev
, unsigned int value
)
1529 uint32_t ctrl_ext
= 0;
1531 ctrl_ext
= BPCTL_READ_REG(pbpctl_dev
, CTRL_EXT
);
1532 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
, ((ctrl_ext
| /* 0 */
1533 BPCTLI_CTRL_EXT_SDP6_DIR
) &
1534 ~BPCTLI_CTRL_EXT_SDP6_DATA
));
1536 usec_delay(PULSE_INTERVAL
);
1538 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
, ctrl_ext
| /* 1 */
1539 BPCTLI_CTRL_EXT_SDP6_DIR
|
1540 BPCTLI_CTRL_EXT_SDP6_DATA
);
1541 usec_delay(PULSE_INTERVAL
);
1544 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
, ((ctrl_ext
| /* 0 */
1545 BPCTLI_CTRL_EXT_SDP6_DIR
) &
1546 ~BPCTLI_CTRL_EXT_SDP6_DATA
));
1547 usec_delay(PULSE_INTERVAL
);
1553 int pulse_set_fn(bpctl_dev_t
*pbpctl_dev
, unsigned int counter
)
1555 uint32_t ctrl_ext
= 0;
1560 ctrl_ext
= BPCTL_READ_REG(pbpctl_dev
, CTRL_EXT
);
1561 write_pulse_1(pbpctl_dev
, ctrl_ext
, counter
, counter
);
1563 pbpctl_dev
->bypass_wdt_status
= 0;
1564 if (pbpctl_dev
->bp_ext_ver
>= PXG2BPI_VER
) {
1565 write_pulse_1(pbpctl_dev
, ctrl_ext
, counter
, counter
);
1567 wdt_time_left(pbpctl_dev
);
1568 if (pbpctl_dev
->wdt_status
== WDT_STATUS_EN
) {
1569 pbpctl_dev
->wdt_status
= 0;
1570 data_pulse(pbpctl_dev
, counter
);
1571 pbpctl_dev
->wdt_status
= WDT_STATUS_EN
;
1572 pbpctl_dev
->bypass_wdt_on_time
= jiffies
;
1575 data_pulse(pbpctl_dev
, counter
);
1581 int zero_set_fn(bpctl_dev_t
*pbpctl_dev
)
1583 uint32_t ctrl_ext
= 0, ctrl_value
= 0;
1587 if (pbpctl_dev
->bp_ext_ver
>= PXG2BPI_VER
) {
1590 ctrl_ext
= BPCTL_READ_REG(pbpctl_dev
, CTRL_EXT
);
1592 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
, ((ctrl_ext
|
1593 BPCTLI_CTRL_EXT_MCLK_DIR
)
1596 (BPCTLI_CTRL_EXT_MCLK_DATA
1598 BPCTLI_CTRL_EXT_MDIO_DIR
1600 BPCTLI_CTRL_EXT_MDIO_DATA
)));
1606 int pulse_get2_fn(bpctl_dev_t
*pbpctl_dev
)
1608 uint32_t ctrl_ext
= 0, ctrl_value
= 0;
1612 if (pbpctl_dev
->bp_ext_ver
>= PXG2BPI_VER
) {
1613 printk("pulse_get_fn\n");
1614 ctrl_ext
= BPCTL_READ_REG(pbpctl_dev
, CTRL_EXT
);
1615 ctrl_value
= read_pulse_2(pbpctl_dev
, ctrl_ext
);
1616 printk("read:%d\n", ctrl_value
);
1621 int pulse_get1_fn(bpctl_dev_t
*pbpctl_dev
)
1623 uint32_t ctrl_ext
= 0, ctrl_value
= 0;
1627 if (pbpctl_dev
->bp_ext_ver
>= PXG2BPI_VER
) {
1629 printk("pulse_get_fn\n");
1631 ctrl_ext
= BPCTL_READ_REG(pbpctl_dev
, CTRL_EXT
);
1632 ctrl_value
= read_pulse_1(pbpctl_dev
, ctrl_ext
);
1633 printk("read:%d\n", ctrl_value
);
1638 int gpio6_set_fn(bpctl_dev_t
*pbpctl_dev
)
1640 uint32_t ctrl_ext
= 0;
1642 ctrl_ext
= BPCTL_READ_REG(pbpctl_dev
, CTRL_EXT
);
1643 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
, ctrl_ext
|
1644 BPCTLI_CTRL_EXT_SDP6_DIR
|
1645 BPCTLI_CTRL_EXT_SDP6_DATA
);
1649 int gpio7_set_fn(bpctl_dev_t
*pbpctl_dev
)
1651 uint32_t ctrl_ext
= 0;
1653 ctrl_ext
= BPCTL_READ_REG(pbpctl_dev
, CTRL_EXT
);
1654 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
, ctrl_ext
|
1655 BPCTLI_CTRL_EXT_SDP7_DIR
|
1656 BPCTLI_CTRL_EXT_SDP7_DATA
);
1660 int gpio7_clear_fn(bpctl_dev_t
*pbpctl_dev
)
1662 uint32_t ctrl_ext
= 0;
1664 ctrl_ext
= BPCTL_READ_REG(pbpctl_dev
, CTRL_EXT
);
1665 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
, ((ctrl_ext
|
1666 BPCTLI_CTRL_EXT_SDP7_DIR
) &
1667 ~BPCTLI_CTRL_EXT_SDP7_DATA
));
1671 int gpio6_clear_fn(bpctl_dev_t
*pbpctl_dev
)
1673 uint32_t ctrl_ext
= 0;
1675 ctrl_ext
= BPCTL_READ_REG(pbpctl_dev
, CTRL_EXT
);
1676 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
, ((ctrl_ext
|
1677 BPCTLI_CTRL_EXT_SDP6_DIR
) &
1678 ~BPCTLI_CTRL_EXT_SDP6_DATA
));
1681 #endif /*BYPASS_DEBUG */
1683 static bpctl_dev_t
*lookup_port(bpctl_dev_t
*dev
)
1687 for (n
= 0, p
= bpctl_dev_arr
; n
< device_num
&& p
->pdev
; n
++) {
1688 if (p
->bus
== dev
->bus
1689 && p
->slot
== dev
->slot
1690 && p
->func
== (dev
->func
^ 1))
1696 static bpctl_dev_t
*get_status_port_fn(bpctl_dev_t
*pbpctl_dev
)
1699 if (pbpctl_dev
->func
== 0 || pbpctl_dev
->func
== 2)
1700 return lookup_port(pbpctl_dev
);
1705 static bpctl_dev_t
*get_master_port_fn(bpctl_dev_t
*pbpctl_dev
)
1708 if (pbpctl_dev
->func
== 1 || pbpctl_dev
->func
== 3)
1709 return lookup_port(pbpctl_dev
);
1714 /**************************************/
1715 /**************INTEL API***************/
1716 /**************************************/
1718 static void write_data_port_int(bpctl_dev_t
*pbpctl_dev
,
1719 unsigned char ctrl_value
)
1723 value
= BPCTL_READ_REG(pbpctl_dev
, CTRL
);
1724 /* Make SDP0 Pin Directonality to Output */
1725 value
|= BPCTLI_CTRL_SDP0_DIR
;
1726 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
, value
);
1728 value
&= ~BPCTLI_CTRL_SDP0_DATA
;
1729 value
|= ((ctrl_value
& 0x1) << BPCTLI_CTRL_SDP0_SHIFT
);
1730 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
, value
);
1732 value
= (BPCTL_READ_REG(pbpctl_dev
, CTRL_EXT
));
1733 /* Make SDP2 Pin Directonality to Output */
1734 value
|= BPCTLI_CTRL_EXT_SDP6_DIR
;
1735 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
, value
);
1737 value
&= ~BPCTLI_CTRL_EXT_SDP6_DATA
;
1738 value
|= (((ctrl_value
& 0x2) >> 1) << BPCTLI_CTRL_EXT_SDP6_SHIFT
);
1739 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
, value
);
1743 static int write_data_int(bpctl_dev_t
*pbpctl_dev
, unsigned char value
)
1745 bpctl_dev_t
*pbpctl_dev_b
= NULL
;
1747 if (!(pbpctl_dev_b
= get_status_port_fn(pbpctl_dev
)))
1749 atomic_set(&pbpctl_dev
->wdt_busy
, 1);
1750 write_data_port_int(pbpctl_dev
, value
& 0x3);
1751 write_data_port_int(pbpctl_dev_b
, ((value
& 0xc) >> 2));
1752 atomic_set(&pbpctl_dev
->wdt_busy
, 0);
1757 static int wdt_pulse_int(bpctl_dev_t
*pbpctl_dev
)
1760 if ((atomic_read(&pbpctl_dev
->wdt_busy
)) == 1)
1763 if ((write_data_int(pbpctl_dev
, RESET_WDT_INT
)) < 0)
1765 msec_delay_bp(CMND_INTERVAL_INT
);
1766 if ((write_data_int(pbpctl_dev
, CMND_OFF_INT
)) < 0)
1768 msec_delay_bp(CMND_INTERVAL_INT
);
1770 if (pbpctl_dev
->wdt_status
== WDT_STATUS_EN
)
1771 pbpctl_dev
->bypass_wdt_on_time
= jiffies
;
1776 /*************************************/
1777 /************* COMMANDS **************/
1778 /*************************************/
1780 /* CMND_ON 0x4 (100)*/
1781 int cmnd_on(bpctl_dev_t
*pbpctl_dev
)
1783 int ret
= BP_NOT_CAP
;
1785 if (pbpctl_dev
->bp_caps
& SW_CTL_CAP
) {
1786 if (INTEL_IF_SERIES(pbpctl_dev
->subdevice
))
1788 if (pbpctl_dev
->bp_ext_ver
>= PXG2BPI_VER
)
1789 write_data(pbpctl_dev
, CMND_ON
);
1791 data_pulse(pbpctl_dev
, CMND_ON
);
1797 /* CMND_OFF 0x2 (10)*/
1798 int cmnd_off(bpctl_dev_t
*pbpctl_dev
)
1800 int ret
= BP_NOT_CAP
;
1802 if (pbpctl_dev
->bp_caps
& SW_CTL_CAP
) {
1803 if (INTEL_IF_SERIES(pbpctl_dev
->subdevice
)) {
1804 write_data_int(pbpctl_dev
, CMND_OFF_INT
);
1805 msec_delay_bp(CMND_INTERVAL_INT
);
1806 } else if (pbpctl_dev
->bp_ext_ver
>= PXG2BPI_VER
)
1807 write_data(pbpctl_dev
, CMND_OFF
);
1809 data_pulse(pbpctl_dev
, CMND_OFF
);
1815 /* BYPASS_ON (0xa)*/
1816 int bypass_on(bpctl_dev_t
*pbpctl_dev
)
1818 int ret
= BP_NOT_CAP
;
1820 if (pbpctl_dev
->bp_caps
& BP_CAP
) {
1821 if (INTEL_IF_SERIES(pbpctl_dev
->subdevice
)) {
1822 write_data_int(pbpctl_dev
, BYPASS_ON_INT
);
1823 msec_delay_bp(BYPASS_DELAY_INT
);
1824 pbpctl_dev
->bp_status_un
= 0;
1825 } else if (pbpctl_dev
->bp_ext_ver
>= PXG2BPI_VER
) {
1826 write_data(pbpctl_dev
, BYPASS_ON
);
1827 if (pbpctl_dev
->bp_ext_ver
>= PXG2TBPI_VER
)
1828 msec_delay_bp(LATCH_DELAY
);
1830 data_pulse(pbpctl_dev
, BYPASS_ON
);
1836 /* BYPASS_OFF (0x8 111)*/
1837 int bypass_off(bpctl_dev_t
*pbpctl_dev
)
1839 int ret
= BP_NOT_CAP
;
1841 if (pbpctl_dev
->bp_caps
& BP_CAP
) {
1842 if (INTEL_IF_SERIES(pbpctl_dev
->subdevice
)) {
1843 write_data_int(pbpctl_dev
, DIS_BYPASS_CAP_INT
);
1844 msec_delay_bp(BYPASS_DELAY_INT
);
1845 write_data_int(pbpctl_dev
, PWROFF_BYPASS_ON_INT
);
1846 msec_delay_bp(BYPASS_DELAY_INT
);
1847 pbpctl_dev
->bp_status_un
= 0;
1848 } else if (pbpctl_dev
->bp_ext_ver
>= PXG2BPI_VER
) {
1849 write_data(pbpctl_dev
, BYPASS_OFF
);
1850 if (pbpctl_dev
->bp_ext_ver
>= PXG2TBPI_VER
)
1851 msec_delay_bp(LATCH_DELAY
);
1853 data_pulse(pbpctl_dev
, BYPASS_OFF
);
1860 int tap_off(bpctl_dev_t
*pbpctl_dev
)
1862 int ret
= BP_NOT_CAP
;
1863 if ((pbpctl_dev
->bp_caps
& TAP_CAP
)
1864 && (pbpctl_dev
->bp_ext_ver
>= PXG2TBPI_VER
)) {
1865 write_data(pbpctl_dev
, TAP_OFF
);
1866 msec_delay_bp(LATCH_DELAY
);
1873 int tap_on(bpctl_dev_t
*pbpctl_dev
)
1875 int ret
= BP_NOT_CAP
;
1876 if ((pbpctl_dev
->bp_caps
& TAP_CAP
)
1877 && (pbpctl_dev
->bp_ext_ver
>= PXG2TBPI_VER
)) {
1878 write_data(pbpctl_dev
, TAP_ON
);
1879 msec_delay_bp(LATCH_DELAY
);
1886 int disc_off(bpctl_dev_t
*pbpctl_dev
)
1889 if ((pbpctl_dev
->bp_caps
& DISC_CAP
) && (pbpctl_dev
->bp_ext_ver
>= 0x8)) {
1890 write_data(pbpctl_dev
, DISC_OFF
);
1891 msec_delay_bp(LATCH_DELAY
);
1898 int disc_on(bpctl_dev_t
*pbpctl_dev
)
1901 if ((pbpctl_dev
->bp_caps
& DISC_CAP
) && (pbpctl_dev
->bp_ext_ver
>= 0x8)) {
1902 write_data(pbpctl_dev
, /*DISC_ON */ 0x85);
1903 msec_delay_bp(LATCH_DELAY
);
1910 int disc_port_on(bpctl_dev_t
*pbpctl_dev
)
1913 bpctl_dev_t
*pbpctl_dev_m
;
1915 if ((is_bypass_fn(pbpctl_dev
)) == 1)
1916 pbpctl_dev_m
= pbpctl_dev
;
1918 pbpctl_dev_m
= get_master_port_fn(pbpctl_dev
);
1919 if (pbpctl_dev_m
== NULL
)
1922 if (pbpctl_dev_m
->bp_caps_ex
& DISC_PORT_CAP_EX
) {
1923 if (is_bypass_fn(pbpctl_dev
) == 1) {
1925 write_data(pbpctl_dev_m
, TX_DISA
);
1928 write_data(pbpctl_dev_m
, TX_DISB
);
1931 msec_delay_bp(LATCH_DELAY
);
1938 int disc_port_off(bpctl_dev_t
*pbpctl_dev
)
1941 bpctl_dev_t
*pbpctl_dev_m
;
1943 if ((is_bypass_fn(pbpctl_dev
)) == 1)
1944 pbpctl_dev_m
= pbpctl_dev
;
1946 pbpctl_dev_m
= get_master_port_fn(pbpctl_dev
);
1947 if (pbpctl_dev_m
== NULL
)
1950 if (pbpctl_dev_m
->bp_caps_ex
& DISC_PORT_CAP_EX
) {
1951 if (is_bypass_fn(pbpctl_dev
) == 1)
1952 write_data(pbpctl_dev_m
, TX_ENA
);
1954 write_data(pbpctl_dev_m
, TX_ENB
);
1956 msec_delay_bp(LATCH_DELAY
);
1962 /*TWO_PORT_LINK_HW_EN (0xe)*/
1963 int tpl_hw_on(bpctl_dev_t
*pbpctl_dev
)
1965 int ret
= 0, ctrl
= 0;
1966 bpctl_dev_t
*pbpctl_dev_b
= NULL
;
1968 if (!(pbpctl_dev_b
= get_status_port_fn(pbpctl_dev
)))
1971 if (pbpctl_dev
->bp_caps_ex
& TPL2_CAP_EX
) {
1972 cmnd_on(pbpctl_dev
);
1973 write_data(pbpctl_dev
, TPL2_ON
);
1974 msec_delay_bp(LATCH_DELAY
+ EEPROM_WR_DELAY
);
1975 cmnd_off(pbpctl_dev
);
1979 if (TPL_IF_SERIES(pbpctl_dev
->subdevice
)) {
1980 ctrl
= BPCTL_READ_REG(pbpctl_dev_b
, CTRL
);
1981 BPCTL_BP_WRITE_REG(pbpctl_dev_b
, CTRL
,
1982 ((ctrl
| BPCTLI_CTRL_SWDPIO0
) &
1983 ~BPCTLI_CTRL_SWDPIN0
));
1989 /*TWO_PORT_LINK_HW_DIS (0xc)*/
1990 int tpl_hw_off(bpctl_dev_t
*pbpctl_dev
)
1992 int ret
= 0, ctrl
= 0;
1993 bpctl_dev_t
*pbpctl_dev_b
= NULL
;
1995 if (!(pbpctl_dev_b
= get_status_port_fn(pbpctl_dev
)))
1997 if (pbpctl_dev
->bp_caps_ex
& TPL2_CAP_EX
) {
1998 cmnd_on(pbpctl_dev
);
1999 write_data(pbpctl_dev
, TPL2_OFF
);
2000 msec_delay_bp(LATCH_DELAY
+ EEPROM_WR_DELAY
);
2001 cmnd_off(pbpctl_dev
);
2004 if (TPL_IF_SERIES(pbpctl_dev
->subdevice
)) {
2005 ctrl
= BPCTL_READ_REG(pbpctl_dev_b
, CTRL
);
2006 BPCTL_BP_WRITE_REG(pbpctl_dev_b
, CTRL
,
2007 (ctrl
| BPCTLI_CTRL_SWDPIO0
|
2008 BPCTLI_CTRL_SWDPIN0
));
2014 /* WDT_OFF (0x6 110)*/
2015 int wdt_off(bpctl_dev_t
*pbpctl_dev
)
2017 int ret
= BP_NOT_CAP
;
2019 if (pbpctl_dev
->bp_caps
& WD_CTL_CAP
) {
2020 if (INTEL_IF_SERIES(pbpctl_dev
->subdevice
)) {
2021 bypass_off(pbpctl_dev
);
2022 } else if (pbpctl_dev
->bp_ext_ver
>= PXG2BPI_VER
)
2023 write_data(pbpctl_dev
, WDT_OFF
);
2025 data_pulse(pbpctl_dev
, WDT_OFF
);
2026 pbpctl_dev
->wdt_status
= WDT_STATUS_DIS
;
2036 wdt_val_array
[] = { 1000, 1500, 2000, 3000, 4000, 8000, 16000, 32000, 0 };
2038 int wdt_on(bpctl_dev_t
*pbpctl_dev
, unsigned int timeout
)
2041 if (pbpctl_dev
->bp_caps
& WD_CTL_CAP
) {
2042 unsigned int pulse
= 0, temp_value
= 0, temp_cnt
= 0;
2043 pbpctl_dev
->wdt_status
= 0;
2045 if (INTEL_IF_SERIES(pbpctl_dev
->subdevice
)) {
2046 for (; wdt_val_array
[temp_cnt
]; temp_cnt
++)
2047 if (timeout
<= wdt_val_array
[temp_cnt
])
2050 if (!wdt_val_array
[temp_cnt
])
2053 timeout
= wdt_val_array
[temp_cnt
];
2056 write_data_int(pbpctl_dev
, DIS_BYPASS_CAP_INT
);
2057 msec_delay_bp(BYPASS_DELAY_INT
);
2058 pbpctl_dev
->bp_status_un
= 0;
2059 write_data_int(pbpctl_dev
, temp_cnt
);
2060 pbpctl_dev
->bypass_wdt_on_time
= jiffies
;
2061 msec_delay_bp(CMND_INTERVAL_INT
);
2062 pbpctl_dev
->bypass_timer_interval
= timeout
;
2066 TIMEOUT_UNIT
? TIMEOUT_UNIT
: (timeout
>
2070 temp_value
= timeout
/ 100;
2071 while ((temp_value
>>= 1))
2073 if (timeout
> ((1 << temp_cnt
) * 100))
2075 pbpctl_dev
->bypass_wdt_on_time
= jiffies
;
2076 pulse
= (WDT_ON
| temp_cnt
);
2077 if (pbpctl_dev
->bp_ext_ver
== OLD_IF_VER
)
2078 data_pulse(pbpctl_dev
, pulse
);
2080 write_data(pbpctl_dev
, pulse
);
2081 pbpctl_dev
->bypass_timer_interval
=
2082 (1 << temp_cnt
) * 100;
2084 pbpctl_dev
->wdt_status
= WDT_STATUS_EN
;
2090 void bp75_put_hw_semaphore_generic(bpctl_dev_t
*pbpctl_dev
)
2094 swsm
= BPCTL_READ_REG(pbpctl_dev
, SWSM
);
2096 swsm
&= ~(BPCTLI_SWSM_SMBI
| BPCTLI_SWSM_SWESMBI
);
2098 BPCTL_WRITE_REG(pbpctl_dev
, SWSM
, swsm
);
2101 s32
bp75_get_hw_semaphore_generic(bpctl_dev_t
*pbpctl_dev
)
2105 s32 timeout
= 8192 + 1;
2108 /* Get the SW semaphore */
2109 while (i
< timeout
) {
2110 swsm
= BPCTL_READ_REG(pbpctl_dev
, SWSM
);
2111 if (!(swsm
& BPCTLI_SWSM_SMBI
))
2120 ("bpctl_mod: Driver can't access device - SMBI bit is set.\n");
2125 /* Get the FW semaphore. */
2126 for (i
= 0; i
< timeout
; i
++) {
2127 swsm
= BPCTL_READ_REG(pbpctl_dev
, SWSM
);
2128 BPCTL_WRITE_REG(pbpctl_dev
, SWSM
, swsm
| BPCTLI_SWSM_SWESMBI
);
2130 /* Semaphore acquired if bit latched */
2131 if (BPCTL_READ_REG(pbpctl_dev
, SWSM
) & BPCTLI_SWSM_SWESMBI
)
2138 /* Release semaphores */
2139 bp75_put_hw_semaphore_generic(pbpctl_dev
);
2140 printk("bpctl_mod: Driver can't access the NVM\n");
2149 static void bp75_release_phy(bpctl_dev_t
*pbpctl_dev
)
2151 u16 mask
= BPCTLI_SWFW_PHY0_SM
;
2154 if ((pbpctl_dev
->func
== 1) || (pbpctl_dev
->func
== 3))
2155 mask
= BPCTLI_SWFW_PHY1_SM
;
2157 while (bp75_get_hw_semaphore_generic(pbpctl_dev
) != 0) ;
2160 swfw_sync
= BPCTL_READ_REG(pbpctl_dev
, SW_FW_SYNC
);
2162 BPCTL_WRITE_REG(pbpctl_dev
, SW_FW_SYNC
, swfw_sync
);
2164 bp75_put_hw_semaphore_generic(pbpctl_dev
);
2167 static s32
bp75_acquire_phy(bpctl_dev_t
*pbpctl_dev
)
2169 u16 mask
= BPCTLI_SWFW_PHY0_SM
;
2174 s32 i
= 0, timeout
= 200;
2176 if ((pbpctl_dev
->func
== 1) || (pbpctl_dev
->func
== 3))
2177 mask
= BPCTLI_SWFW_PHY1_SM
;
2180 fwmask
= mask
<< 16;
2182 while (i
< timeout
) {
2183 if (bp75_get_hw_semaphore_generic(pbpctl_dev
)) {
2188 swfw_sync
= BPCTL_READ_REG(pbpctl_dev
, SW_FW_SYNC
);
2189 if (!(swfw_sync
& (fwmask
| swmask
)))
2192 bp75_put_hw_semaphore_generic(pbpctl_dev
);
2199 ("bpctl_mod: Driver can't access resource, SW_FW_SYNC timeout.\n");
2204 swfw_sync
|= swmask
;
2205 BPCTL_WRITE_REG(pbpctl_dev
, SW_FW_SYNC
, swfw_sync
);
2207 bp75_put_hw_semaphore_generic(pbpctl_dev
);
2213 s32
bp75_read_phy_reg_mdic(bpctl_dev_t
*pbpctl_dev
, u32 offset
, u16
*data
)
2219 mdic
= ((offset
<< BPCTLI_MDIC_REG_SHIFT
) |
2220 (phy_addr
<< BPCTLI_MDIC_PHY_SHIFT
) | (BPCTLI_MDIC_OP_READ
));
2222 BPCTL_WRITE_REG(pbpctl_dev
, MDIC
, mdic
);
2224 for (i
= 0; i
< (BPCTLI_GEN_POLL_TIMEOUT
* 3); i
++) {
2226 mdic
= BPCTL_READ_REG(pbpctl_dev
, MDIC
);
2227 if (mdic
& BPCTLI_MDIC_READY
)
2230 if (!(mdic
& BPCTLI_MDIC_READY
)) {
2231 printk("bpctl_mod: MDI Read did not complete\n");
2235 if (mdic
& BPCTLI_MDIC_ERROR
) {
2236 printk("bpctl_mod: MDI Error\n");
2246 s32
bp75_write_phy_reg_mdic(bpctl_dev_t
*pbpctl_dev
, u32 offset
, u16 data
)
2252 mdic
= (((u32
) data
) |
2253 (offset
<< BPCTLI_MDIC_REG_SHIFT
) |
2254 (phy_addr
<< BPCTLI_MDIC_PHY_SHIFT
) | (BPCTLI_MDIC_OP_WRITE
));
2256 BPCTL_WRITE_REG(pbpctl_dev
, MDIC
, mdic
);
2258 for (i
= 0; i
< (BPCTLI_GEN_POLL_TIMEOUT
* 3); i
++) {
2260 mdic
= BPCTL_READ_REG(pbpctl_dev
, MDIC
);
2261 if (mdic
& BPCTLI_MDIC_READY
)
2264 if (!(mdic
& BPCTLI_MDIC_READY
)) {
2265 printk("bpctl_mod: MDI Write did not complete\n");
2269 if (mdic
& BPCTLI_MDIC_ERROR
) {
2270 printk("bpctl_mod: MDI Error\n");
2279 static s32
bp75_read_phy_reg(bpctl_dev_t
*pbpctl_dev
, u32 offset
, u16
*data
)
2283 ret_val
= bp75_acquire_phy(pbpctl_dev
);
2287 if (offset
> BPCTLI_MAX_PHY_MULTI_PAGE_REG
) {
2288 ret_val
= bp75_write_phy_reg_mdic(pbpctl_dev
,
2289 BPCTLI_IGP01E1000_PHY_PAGE_SELECT
,
2296 bp75_read_phy_reg_mdic(pbpctl_dev
,
2297 BPCTLI_MAX_PHY_REG_ADDRESS
& offset
, data
);
2300 bp75_release_phy(pbpctl_dev
);
2305 static s32
bp75_write_phy_reg(bpctl_dev_t
*pbpctl_dev
, u32 offset
, u16 data
)
2309 ret_val
= bp75_acquire_phy(pbpctl_dev
);
2313 if (offset
> BPCTLI_MAX_PHY_MULTI_PAGE_REG
) {
2314 ret_val
= bp75_write_phy_reg_mdic(pbpctl_dev
,
2315 BPCTLI_IGP01E1000_PHY_PAGE_SELECT
,
2322 bp75_write_phy_reg_mdic(pbpctl_dev
,
2323 BPCTLI_MAX_PHY_REG_ADDRESS
& offset
, data
);
2326 bp75_release_phy(pbpctl_dev
);
2332 /* SET_TX (non-Bypass command :)) */
2333 static int set_tx(bpctl_dev_t
*pbpctl_dev
, int tx_state
)
2335 int ret
= 0, ctrl
= 0;
2336 bpctl_dev_t
*pbpctl_dev_m
;
2337 if ((is_bypass_fn(pbpctl_dev
)) == 1)
2338 pbpctl_dev_m
= pbpctl_dev
;
2340 pbpctl_dev_m
= get_master_port_fn(pbpctl_dev
);
2341 if (pbpctl_dev_m
== NULL
)
2343 if (pbpctl_dev_m
->bp_caps_ex
& DISC_PORT_CAP_EX
) {
2344 ctrl
= BPCTL_READ_REG(pbpctl_dev
, CTRL
);
2346 if (pbpctl_dev
->bp_540
) {
2347 ctrl
= BP10G_READ_REG(pbpctl_dev
, ESDP
);
2348 BP10G_WRITE_REG(pbpctl_dev
, ESDP
,
2349 (ctrl
| BP10G_SDP1_DIR
|
2353 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
,
2354 (ctrl
| BPCTLI_CTRL_SDP1_DIR
2355 | BPCTLI_CTRL_SWDPIN1
));
2358 if (pbpctl_dev
->bp_540
) {
2359 ctrl
= BP10G_READ_REG(pbpctl_dev
, ESDP
);
2360 BP10G_WRITE_REG(pbpctl_dev
, ESDP
,
2361 ((ctrl
| BP10G_SDP1_DIR
) &
2364 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
,
2366 BPCTLI_CTRL_SDP1_DIR
) &
2367 ~BPCTLI_CTRL_SWDPIN1
));
2372 } else if (pbpctl_dev
->bp_caps
& TX_CTL_CAP
) {
2373 if (PEG5_IF_SERIES(pbpctl_dev
->subdevice
)) {
2378 bp75_read_phy_reg(pbpctl_dev
,
2381 if (mii_reg
& BPCTLI_MII_CR_POWER_DOWN
) {
2387 ~BPCTLI_MII_CR_POWER_DOWN
);
2394 bp75_read_phy_reg(pbpctl_dev
,
2398 mii_reg
|= BPCTLI_MII_CR_POWER_DOWN
;
2400 bp75_write_phy_reg(pbpctl_dev
,
2407 if (pbpctl_dev
->bp_fiber5
) {
2408 ctrl
= BPCTL_READ_REG(pbpctl_dev
, CTRL_EXT
);
2410 } else if (pbpctl_dev
->bp_10gb
)
2411 ctrl
= BP10GB_READ_REG(pbpctl_dev
, MISC_REG_GPIO
);
2413 else if (!pbpctl_dev
->bp_10g
)
2414 ctrl
= BPCTL_READ_REG(pbpctl_dev
, CTRL
);
2416 ctrl
= BP10G_READ_REG(pbpctl_dev
, ESDP
);
2419 if (pbpctl_dev
->bp_10g9
) {
2420 BP10G_WRITE_REG(pbpctl_dev
, ESDP
,
2421 (ctrl
| BP10G_SDP3_DATA
|
2424 } else if (pbpctl_dev
->bp_fiber5
) {
2425 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
,
2427 BPCTLI_CTRL_EXT_SDP6_DIR
|
2428 BPCTLI_CTRL_EXT_SDP6_DATA
));
2430 } else if (pbpctl_dev
->bp_10gb
) {
2431 if ((pbpctl_dev
->func
== 1)
2432 || (pbpctl_dev
->func
== 3))
2433 BP10GB_WRITE_REG(pbpctl_dev
,
2436 BP10GB_GPIO0_SET_P1
) &
2437 ~(BP10GB_GPIO0_CLR_P1
|
2438 BP10GB_GPIO0_OE_P1
));
2440 BP10GB_WRITE_REG(pbpctl_dev
,
2443 BP10GB_GPIO0_OE_P0
|
2444 BP10GB_GPIO0_SET_P0
));
2446 } else if (pbpctl_dev
->bp_i80
) {
2447 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
,
2448 (ctrl
| BPCTLI_CTRL_SDP1_DIR
2449 | BPCTLI_CTRL_SWDPIN1
));
2451 } else if (pbpctl_dev
->bp_540
) {
2452 ctrl
= BP10G_READ_REG(pbpctl_dev
, ESDP
);
2453 BP10G_WRITE_REG(pbpctl_dev
, ESDP
,
2454 (ctrl
| BP10G_SDP1_DIR
|
2459 else if (!pbpctl_dev
->bp_10g
)
2460 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
,
2461 (ctrl
| BPCTLI_CTRL_SWDPIO0
|
2462 BPCTLI_CTRL_SWDPIN0
));
2465 BP10G_WRITE_REG(pbpctl_dev
, ESDP
,
2466 (ctrl
| BP10G_SDP0_DATA
|
2470 if (pbpctl_dev
->bp_10g9
) {
2471 BP10G_WRITE_REG(pbpctl_dev
, ESDP
,
2472 ((ctrl
| BP10G_SDP3_DIR
) &
2475 } else if (pbpctl_dev
->bp_fiber5
) {
2476 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL_EXT
,
2478 BPCTLI_CTRL_EXT_SDP6_DIR
) &
2479 ~BPCTLI_CTRL_EXT_SDP6_DATA
));
2481 } else if (pbpctl_dev
->bp_10gb
) {
2482 if ((bpctl_dev_arr
->func
== 1)
2483 || (bpctl_dev_arr
->func
== 3))
2484 BP10GB_WRITE_REG(pbpctl_dev
,
2487 BP10GB_GPIO0_CLR_P1
) &
2488 ~(BP10GB_GPIO0_SET_P1
|
2489 BP10GB_GPIO0_OE_P1
));
2491 BP10GB_WRITE_REG(pbpctl_dev
,
2494 BP10GB_GPIO0_OE_P0
|
2495 BP10GB_GPIO0_CLR_P0
));
2497 } else if (pbpctl_dev
->bp_i80
) {
2498 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
,
2500 BPCTLI_CTRL_SDP1_DIR
) &
2501 ~BPCTLI_CTRL_SWDPIN1
));
2502 } else if (pbpctl_dev
->bp_540
) {
2503 ctrl
= BP10G_READ_REG(pbpctl_dev
, ESDP
);
2504 BP10G_WRITE_REG(pbpctl_dev
, ESDP
,
2505 ((ctrl
| BP10G_SDP1_DIR
) &
2509 else if (!pbpctl_dev
->bp_10g
) {
2510 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
,
2511 ((ctrl
| BPCTLI_CTRL_SWDPIO0
)
2512 & ~BPCTLI_CTRL_SWDPIN0
));
2513 if (!PEGF_IF_SERIES(pbpctl_dev
->subdevice
)) {
2514 BPCTL_BP_WRITE_REG(pbpctl_dev
, CTRL
,
2517 (BPCTLI_CTRL_SDP0_DATA
2519 BPCTLI_CTRL_SDP0_DIR
)));
2522 BP10G_WRITE_REG(pbpctl_dev
, ESDP
,
2523 ((ctrl
| BP10G_SDP0_DIR
) &
2534 /* SET_FORCE_LINK (non-Bypass command :)) */
2535 static int set_bp_force_link(bpctl_dev_t
*pbpctl_dev
, int tx_state
)
2537 int ret
= 0, ctrl
= 0;
2539 if (DBI_IF_SERIES(pbpctl_dev
->subdevice
)) {
2541 if ((pbpctl_dev
->bp_10g
) || (pbpctl_dev
->bp_10g9
)) {
2543 ctrl
= BPCTL_READ_REG(pbpctl_dev
, CTRL
);
2545 BP10G_WRITE_REG(pbpctl_dev
, ESDP
,
2546 ctrl
& ~BP10G_SDP1_DIR
);
2548 BP10G_WRITE_REG(pbpctl_dev
, ESDP
,
2549 ((ctrl
| BP10G_SDP1_DIR
) &
2558 /*RESET_CONT 0x20 */
2559 int reset_cont(bpctl_dev_t
*pbpctl_dev
)
2561 int ret
= BP_NOT_CAP
;
2563 if (pbpctl_dev
->bp_caps
& SW_CTL_CAP
) {
2564 if (INTEL_IF_SERIES(pbpctl_dev
->subdevice
))
2566 if (pbpctl_dev
->bp_ext_ver
>= PXG2BPI_VER
)
2567 write_data(pbpctl_dev
, RESET_CONT
);
2569 data_pulse(pbpctl_dev
, RESET_CONT
);
2575 /*DIS_BYPASS_CAP 0x22 */
2576 int dis_bypass_cap(bpctl_dev_t
*pbpctl_dev
)
2579 if (pbpctl_dev
->bp_caps
& BP_DIS_CAP
) {
2580 if (INTEL_IF_SERIES(pbpctl_dev
->subdevice
)) {
2581 write_data_int(pbpctl_dev
, DIS_BYPASS_CAP_INT
);
2582 msec_delay_bp(BYPASS_DELAY_INT
);
2584 write_data(pbpctl_dev
, BYPASS_OFF
);
2585 msec_delay_bp(LATCH_DELAY
);
2586 write_data(pbpctl_dev
, DIS_BYPASS_CAP
);
2587 msec_delay_bp(BYPASS_CAP_DELAY
);
2594 /*EN_BYPASS_CAP 0x24 */
2595 int en_bypass_cap(bpctl_dev_t
*pbpctl_dev
)
2597 if (pbpctl_dev
->bp_caps
& BP_DIS_CAP
) {
2598 if (INTEL_IF_SERIES(pbpctl_dev
->subdevice
)) {
2599 write_data_int(pbpctl_dev
, PWROFF_BYPASS_ON_INT
);
2600 msec_delay_bp(BYPASS_DELAY_INT
);
2602 write_data(pbpctl_dev
, EN_BYPASS_CAP
);
2603 msec_delay_bp(BYPASS_CAP_DELAY
);
2610 /* BYPASS_STATE_PWRON 0x26*/
2611 int bypass_state_pwron(bpctl_dev_t
*pbpctl_dev
)
2613 if (pbpctl_dev
->bp_caps
& BP_PWUP_CTL_CAP
) {
2614 write_data(pbpctl_dev
, BYPASS_STATE_PWRON
);
2615 if (pbpctl_dev
->bp_ext_ver
== PXG2BPI_VER
)
2616 msec_delay_bp(DFLT_PWRON_DELAY
);
2618 msec_delay_bp(LATCH_DELAY
+ EEPROM_WR_DELAY
);
2624 /* NORMAL_STATE_PWRON 0x28*/
2625 int normal_state_pwron(bpctl_dev_t
*pbpctl_dev
)
2627 if ((pbpctl_dev
->bp_caps
& BP_PWUP_CTL_CAP
)
2628 || (pbpctl_dev
->bp_caps
& TAP_PWUP_CTL_CAP
)) {
2629 write_data(pbpctl_dev
, NORMAL_STATE_PWRON
);
2630 if (pbpctl_dev
->bp_ext_ver
== PXG2BPI_VER
)
2631 msec_delay_bp(DFLT_PWRON_DELAY
);
2633 msec_delay_bp(LATCH_DELAY
+ EEPROM_WR_DELAY
);
2639 /* BYPASS_STATE_PWROFF 0x27*/
2640 int bypass_state_pwroff(bpctl_dev_t
*pbpctl_dev
)
2642 if (pbpctl_dev
->bp_caps
& BP_PWOFF_CTL_CAP
) {
2643 write_data(pbpctl_dev
, BYPASS_STATE_PWROFF
);
2644 msec_delay_bp(LATCH_DELAY
+ EEPROM_WR_DELAY
);
2650 /* NORMAL_STATE_PWROFF 0x29*/
2651 int normal_state_pwroff(bpctl_dev_t
*pbpctl_dev
)
2653 if ((pbpctl_dev
->bp_caps
& BP_PWOFF_CTL_CAP
)) {
2654 write_data(pbpctl_dev
, NORMAL_STATE_PWROFF
);
2655 msec_delay_bp(LATCH_DELAY
+ EEPROM_WR_DELAY
);
2661 /*TAP_STATE_PWRON 0x2a*/
2662 int tap_state_pwron(bpctl_dev_t
*pbpctl_dev
)
2664 if (pbpctl_dev
->bp_caps
& TAP_PWUP_CTL_CAP
) {
2665 write_data(pbpctl_dev
, TAP_STATE_PWRON
);
2666 msec_delay_bp(LATCH_DELAY
+ EEPROM_WR_DELAY
);
2672 /*DIS_TAP_CAP 0x2c*/
2673 int dis_tap_cap(bpctl_dev_t
*pbpctl_dev
)
2675 if (pbpctl_dev
->bp_caps
& TAP_DIS_CAP
) {
2676 write_data(pbpctl_dev
, DIS_TAP_CAP
);
2677 msec_delay_bp(BYPASS_CAP_DELAY
);
2684 int en_tap_cap(bpctl_dev_t
*pbpctl_dev
)
2686 if (pbpctl_dev
->bp_caps
& TAP_DIS_CAP
) {
2687 write_data(pbpctl_dev
, EN_TAP_CAP
);
2688 msec_delay_bp(BYPASS_CAP_DELAY
);
2694 /*DISC_STATE_PWRON 0x2a*/
2695 int disc_state_pwron(bpctl_dev_t
*pbpctl_dev
)
2697 if (pbpctl_dev
->bp_caps
& DISC_PWUP_CTL_CAP
) {
2698 if (pbpctl_dev
->bp_ext_ver
>= 0x8) {
2699 write_data(pbpctl_dev
, DISC_STATE_PWRON
);
2700 msec_delay_bp(LATCH_DELAY
+ EEPROM_WR_DELAY
);
2707 /*DIS_DISC_CAP 0x2c*/
2708 int dis_disc_cap(bpctl_dev_t
*pbpctl_dev
)
2710 if (pbpctl_dev
->bp_caps
& DISC_DIS_CAP
) {
2711 if (pbpctl_dev
->bp_ext_ver
>= 0x8) {
2712 write_data(pbpctl_dev
, DIS_DISC_CAP
);
2713 msec_delay_bp(BYPASS_CAP_DELAY
);
2720 /*DISC_STATE_PWRON 0x2a*/
2721 int disc_port_state_pwron(bpctl_dev_t
*pbpctl_dev
)
2724 bpctl_dev_t
*pbpctl_dev_m
;
2728 if ((is_bypass_fn(pbpctl_dev
)) == 1)
2729 pbpctl_dev_m
= pbpctl_dev
;
2731 pbpctl_dev_m
= get_master_port_fn(pbpctl_dev
);
2732 if (pbpctl_dev_m
== NULL
)
2735 if (pbpctl_dev_m
->bp_caps_ex
& DISC_PORT_CAP_EX
) {
2736 if (is_bypass_fn(pbpctl_dev
) == 1)
2737 write_data(pbpctl_dev_m
, TX_DISA_PWRUP
);
2739 write_data(pbpctl_dev_m
, TX_DISB_PWRUP
);
2741 msec_delay_bp(LATCH_DELAY
);
2747 int normal_port_state_pwron(bpctl_dev_t
*pbpctl_dev
)
2750 bpctl_dev_t
*pbpctl_dev_m
;
2753 if ((is_bypass_fn(pbpctl_dev
)) == 1)
2754 pbpctl_dev_m
= pbpctl_dev
;
2756 pbpctl_dev_m
= get_master_port_fn(pbpctl_dev
);
2757 if (pbpctl_dev_m
== NULL
)
2760 if (pbpctl_dev_m
->bp_caps_ex
& DISC_PORT_CAP_EX
) {
2761 if (is_bypass_fn(pbpctl_dev
) == 1)
2762 write_data(pbpctl_dev_m
, TX_ENA_PWRUP
);
2764 write_data(pbpctl_dev_m
, TX_ENB_PWRUP
);
2766 msec_delay_bp(LATCH_DELAY
);
2773 int en_disc_cap(bpctl_dev_t
*pbpctl_dev
)
2775 if (pbpctl_dev
->bp_caps
& DISC_DIS_CAP
) {
2776 if (pbpctl_dev
->bp_ext_ver
>= 0x8) {
2777 write_data(pbpctl_dev
, EN_DISC_CAP
);
2778 msec_delay_bp(BYPASS_CAP_DELAY
);
2785 int std_nic_on(bpctl_dev_t
*pbpctl_dev
)
2788 if (pbpctl_dev
->bp_caps
& STD_NIC_CAP
) {
2790 if (INTEL_IF_SERIES(pbpctl_dev
->subdevice
)) {
2791 write_data_int(pbpctl_dev
, DIS_BYPASS_CAP_INT
);
2792 msec_delay_bp(BYPASS_DELAY_INT
);
2793 pbpctl_dev
->bp_status_un
= 0;
2797 if (pbpctl_dev
->bp_ext_ver
>= 0x8) {
2798 write_data(pbpctl_dev
, STD_NIC_ON
);
2799 msec_delay_bp(BYPASS_CAP_DELAY
);
2804 if (pbpctl_dev
->bp_ext_ver
>= PXG2BPI_VER
) {
2805 wdt_off(pbpctl_dev
);
2807 if (pbpctl_dev
->bp_caps
& BP_CAP
) {
2808 write_data(pbpctl_dev
, BYPASS_OFF
);
2809 msec_delay_bp(LATCH_DELAY
);
2812 if (pbpctl_dev
->bp_caps
& TAP_CAP
) {
2813 write_data(pbpctl_dev
, TAP_OFF
);
2814 msec_delay_bp(LATCH_DELAY
);
2817 write_data(pbpctl_dev
, NORMAL_STATE_PWRON
);
2818 if (pbpctl_dev
->bp_ext_ver
== PXG2BPI_VER
)
2819 msec_delay_bp(DFLT_PWRON_DELAY
);
2821 msec_delay_bp(LATCH_DELAY
+ EEPROM_WR_DELAY
);
2823 if (pbpctl_dev
->bp_caps
& BP_DIS_CAP
) {
2824 write_data(pbpctl_dev
, DIS_BYPASS_CAP
);
2825 msec_delay_bp(BYPASS_CAP_DELAY
);
2828 if (pbpctl_dev
->bp_caps
& TAP_DIS_CAP
) {
2829 write_data(pbpctl_dev
, DIS_TAP_CAP
);
2830 msec_delay_bp(BYPASS_CAP_DELAY
);
2839 int std_nic_off(bpctl_dev_t
*pbpctl_dev
)
2842 if (pbpctl_dev
->bp_caps
& STD_NIC_CAP
) {
2843 if (INTEL_IF_SERIES(pbpctl_dev
->subdevice
)) {
2844 write_data_int(pbpctl_dev
, PWROFF_BYPASS_ON_INT
);
2845 msec_delay_bp(BYPASS_DELAY_INT
);
2848 if (pbpctl_dev
->bp_ext_ver
>= 0x8) {
2849 write_data(pbpctl_dev
, STD_NIC_OFF
);
2850 msec_delay_bp(BYPASS_CAP_DELAY
);
2855 if (pbpctl_dev
->bp_ext_ver
>= PXG2BPI_VER
) {
2857 if (pbpctl_dev
->bp_caps
& TAP_PWUP_CTL_CAP
) {
2858 write_data(pbpctl_dev
, TAP_STATE_PWRON
);
2859 msec_delay_bp(LATCH_DELAY
+ EEPROM_WR_DELAY
);
2862 if (pbpctl_dev
->bp_caps
& BP_PWUP_CTL_CAP
) {
2863 write_data(pbpctl_dev
, BYPASS_STATE_PWRON
);
2864 if (pbpctl_dev
->bp_ext_ver
> PXG2BPI_VER
)
2865 msec_delay_bp(LATCH_DELAY
+
2868 msec_delay_bp(DFLT_PWRON_DELAY
);
2871 if (pbpctl_dev
->bp_caps
& TAP_DIS_CAP
) {
2872 write_data(pbpctl_dev
, EN_TAP_CAP
);
2873 msec_delay_bp(BYPASS_CAP_DELAY
);
2875 if (pbpctl_dev
->bp_caps
& DISC_DIS_CAP
) {
2876 write_data(pbpctl_dev
, EN_DISC_CAP
);
2877 msec_delay_bp(BYPASS_CAP_DELAY
);
2880 if (pbpctl_dev
->bp_caps
& BP_DIS_CAP
) {
2881 write_data(pbpctl_dev
, EN_BYPASS_CAP
);
2882 msec_delay_bp(BYPASS_CAP_DELAY
);
2891 int wdt_time_left(bpctl_dev_t
*pbpctl_dev
)
2894 /* unsigned long curr_time=((long long)(jiffies*1000))/HZ, delta_time=0,wdt_on_time=((long long)(pbpctl_dev->bypass_wdt_on_time*1000))/HZ; */
2895 unsigned long curr_time
= jiffies
, delta_time
= 0, wdt_on_time
=
2896 pbpctl_dev
->bypass_wdt_on_time
, delta_time_msec
= 0;
2899 switch (pbpctl_dev
->wdt_status
) {
2900 case WDT_STATUS_DIS
:
2906 wdt_on_time
) ? (curr_time
- wdt_on_time
) : (~wdt_on_time
+
2908 delta_time_msec
= jiffies_to_msecs(delta_time
);
2909 time_left
= pbpctl_dev
->bypass_timer_interval
- delta_time_msec
;
2910 if (time_left
< 0) {
2912 pbpctl_dev
->wdt_status
= WDT_STATUS_EXP
;
2915 case WDT_STATUS_EXP
:
2923 static int wdt_timer(bpctl_dev_t
*pbpctl_dev
, int *time_left
)
2926 if (pbpctl_dev
->bp_caps
& WD_CTL_CAP
) {
2928 if (pbpctl_dev
->wdt_status
== WDT_STATUS_UNKNOWN
)
2931 *time_left
= wdt_time_left(pbpctl_dev
);
2939 static int wdt_timer_reload(bpctl_dev_t
*pbpctl_dev
)
2944 if ((pbpctl_dev
->bp_caps
& WD_CTL_CAP
) &&
2945 (pbpctl_dev
->wdt_status
!= WDT_STATUS_UNKNOWN
)) {
2946 if (pbpctl_dev
->wdt_status
== WDT_STATUS_DIS
)
2948 if (pbpctl_dev
->bp_ext_ver
>= PXG2BPI_VER
)
2949 ret
= wdt_pulse(pbpctl_dev
);
2950 else if (INTEL_IF_SERIES(pbpctl_dev
->subdevice
))
2951 ret
= wdt_pulse_int(pbpctl_dev
);
2953 ret
= send_wdt_pulse(pbpctl_dev
);
2955 mod_timer(&pbpctl_dev->bp_timer, jiffies+1);*/
2961 static void wd_reset_timer(unsigned long param
)
2963 bpctl_dev_t
*pbpctl_dev
= (bpctl_dev_t
*) param
;
2965 struct sk_buff
*skb_tmp
;
2968 if ((pbpctl_dev
->bp_ext_ver
>= PXG2BPI_VER
) &&
2969 ((atomic_read(&pbpctl_dev
->wdt_busy
)) == 1)) {
2970 mod_timer(&pbpctl_dev
->bp_timer
, jiffies
+ 1);
2975 if (pbpctl_dev
->bp_self_test_flag
== 1) {
2976 skb_tmp
= dev_alloc_skb(BPTEST_DATA_LEN
+ 2);
2977 if ((skb_tmp
) && (pbpctl_dev
->ndev
) && (pbpctl_dev
->bp_tx_data
)) {
2978 memcpy(skb_put(skb_tmp
, BPTEST_DATA_LEN
),
2979 pbpctl_dev
->bp_tx_data
, BPTEST_DATA_LEN
);
2980 skb_tmp
->dev
= pbpctl_dev
->ndev
;
2982 eth_type_trans(skb_tmp
, pbpctl_dev
->ndev
);
2983 skb_tmp
->ip_summed
= CHECKSUM_UNNECESSARY
;
2984 netif_receive_skb(skb_tmp
);
2985 goto bp_timer_reload
;
2991 wdt_timer_reload(pbpctl_dev
);
2995 if (pbpctl_dev
->reset_time
) {
2996 mod_timer(&pbpctl_dev
->bp_timer
,
2997 jiffies
+ (HZ
* pbpctl_dev
->reset_time
) / 1000);
3001 /*WAIT_AT_PWRUP 0x80 */
3002 int bp_wait_at_pwup_en(bpctl_dev_t
*pbpctl_dev
)
3005 if (pbpctl_dev
->bp_caps
& SW_CTL_CAP
) {
3006 if (pbpctl_dev
->bp_ext_ver
>= BP_FW_EXT_VER8
) {
3007 write_data(pbpctl_dev
, BP_WAIT_AT_PWUP_EN
);
3008 msec_delay_bp(LATCH_DELAY
+ EEPROM_WR_DELAY
);
3016 /*DIS_WAIT_AT_PWRUP 0x81 */
3017 int bp_wait_at_pwup_dis(bpctl_dev_t
*pbpctl_dev
)
3020 if (pbpctl_dev
->bp_caps
& SW_CTL_CAP
) {
3022 if (pbpctl_dev
->bp_ext_ver
>= BP_FW_EXT_VER8
) {
3023 write_data(pbpctl_dev
, BP_WAIT_AT_PWUP_DIS
);
3024 msec_delay_bp(LATCH_DELAY
+ EEPROM_WR_DELAY
);
3032 /*EN_HW_RESET 0x82 */
3034 int bp_hw_reset_en(bpctl_dev_t
*pbpctl_dev
)
3037 if (pbpctl_dev
->bp_caps
& SW_CTL_CAP
) {
3038 if (pbpctl_dev
->bp_ext_ver
>= BP_FW_EXT_VER8
) {
3039 write_data(pbpctl_dev
, BP_HW_RESET_EN
);
3040 msec_delay_bp(LATCH_DELAY
+ EEPROM_WR_DELAY
);
3048 /*DIS_HW_RESET 0x83 */
3050 int bp_hw_reset_dis(bpctl_dev_t
*pbpctl_dev
)
3053 if (pbpctl_dev
->bp_caps
& SW_CTL_CAP
) {
3054 if (pbpctl_dev
->bp_ext_ver
>= BP_FW_EXT_VER8
) {
3055 write_data(pbpctl_dev
, BP_HW_RESET_DIS
);
3056 msec_delay_bp(LATCH_DELAY
+ EEPROM_WR_DELAY
);
3065 int wdt_exp_mode(bpctl_dev_t
*pbpctl_dev
, int mode
)
3067 uint32_t status_reg
= 0, status_reg1
= 0;
3069 if ((pbpctl_dev
->bp_caps
& (TAP_STATUS_CAP
| DISC_CAP
)) &&
3070 (pbpctl_dev
->bp_caps
& BP_CAP
)) {
3071 if (pbpctl_dev
->bp_ext_ver
>= PXE2TBPI_VER
) {
3073 if ((pbpctl_dev
->bp_ext_ver
>= 0x8) &&
3074 (mode
== 2) && (pbpctl_dev
->bp_caps
& DISC_CAP
)) {
3076 read_reg(pbpctl_dev
, STATUS_DISC_REG_ADDR
);
3077 if (!(status_reg1
& WDTE_DISC_BPN_MASK
))
3078 write_reg(pbpctl_dev
,
3081 STATUS_DISC_REG_ADDR
);
3085 status_reg
= read_reg(pbpctl_dev
, STATUS_TAP_REG_ADDR
);
3087 if ((mode
== 0) && (pbpctl_dev
->bp_caps
& BP_CAP
)) {
3088 if (pbpctl_dev
->bp_ext_ver
>= 0x8) {
3090 read_reg(pbpctl_dev
, STATUS_DISC_REG_ADDR
);
3091 if (status_reg1
& WDTE_DISC_BPN_MASK
)
3092 write_reg(pbpctl_dev
,
3094 ~WDTE_DISC_BPN_MASK
,
3095 STATUS_DISC_REG_ADDR
);
3097 if (status_reg
& WDTE_TAP_BPN_MASK
)
3098 write_reg(pbpctl_dev
,
3099 status_reg
& ~WDTE_TAP_BPN_MASK
,
3100 STATUS_TAP_REG_ADDR
);
3103 } else if ((mode
== 1) && (pbpctl_dev
->bp_caps
& TAP_CAP
)) {
3104 if (!(status_reg
& WDTE_TAP_BPN_MASK
))
3105 write_reg(pbpctl_dev
,
3106 status_reg
| WDTE_TAP_BPN_MASK
,
3107 STATUS_TAP_REG_ADDR
);
3108 /*else return BP_NOT_CAP; */
3116 int bypass_fw_ver(bpctl_dev_t
*pbpctl_dev
)
3118 if (is_bypass_fn(pbpctl_dev
))
3119 return read_reg(pbpctl_dev
, VER_REG_ADDR
);
3124 int bypass_sign_check(bpctl_dev_t
*pbpctl_dev
)
3127 if (is_bypass_fn(pbpctl_dev
))
3128 return (((read_reg(pbpctl_dev
, PIC_SIGN_REG_ADDR
)) ==
3129 PIC_SIGN_VALUE
) ? 1 : 0);
3134 static int tx_status(bpctl_dev_t
*pbpctl_dev
)
3137 bpctl_dev_t
*pbpctl_dev_m
;
3138 if ((is_bypass_fn(pbpctl_dev
)) == 1)
3139 pbpctl_dev_m
= pbpctl_dev
;
3141 pbpctl_dev_m
= get_master_port_fn(pbpctl_dev
);
3142 if (pbpctl_dev_m
== NULL
)
3144 if (pbpctl_dev_m
->bp_caps_ex
& DISC_PORT_CAP_EX
) {
3146 ctrl
= BPCTL_READ_REG(pbpctl_dev
, CTRL
);
3147 if (pbpctl_dev
->bp_i80
)
3148 return ((ctrl
& BPCTLI_CTRL_SWDPIN1
) != 0 ? 0 : 1);
3149 if (pbpctl_dev
->bp_540
) {
3150 ctrl
= BP10G_READ_REG(pbpctl_dev
, ESDP
);
3152 return ((ctrl
& BP10G_SDP1_DATA
) != 0 ? 0 : 1);
3157 if (pbpctl_dev
->bp_caps
& TX_CTL_CAP
) {
3158 if (PEG5_IF_SERIES(pbpctl_dev
->subdevice
)) {
3162 (pbpctl_dev
, BPCTLI_PHY_CONTROL
, &mii_reg
))) {
3163 if (mii_reg
& BPCTLI_MII_CR_POWER_DOWN
)
3172 if (pbpctl_dev
->bp_10g9
) {
3173 return ((BP10G_READ_REG(pbpctl_dev
, ESDP
) &
3174 BP10G_SDP3_DATA
) != 0 ? 0 : 1);
3176 } else if (pbpctl_dev
->bp_fiber5
) {
3177 ctrl
= BPCTL_READ_REG(pbpctl_dev
, CTRL_EXT
);
3178 if (ctrl
& BPCTLI_CTRL_EXT_SDP6_DATA
)
3181 } else if (pbpctl_dev
->bp_10gb
) {
3182 ctrl
= BP10GB_READ_REG(pbpctl_dev
, MISC_REG_GPIO
);
3183 BP10GB_WRITE_REG(pbpctl_dev
, MISC_REG_GPIO
,
3184 (ctrl
| BP10GB_GPIO0_OE_P1
) &
3185 ~(BP10GB_GPIO0_SET_P1
|
3186 BP10GB_GPIO0_CLR_P1
));
3188 if ((pbpctl_dev
->func
== 1) || (pbpctl_dev
->func
== 3))
3189 return (((BP10GB_READ_REG
3191 MISC_REG_GPIO
)) & BP10GB_GPIO0_P1
) !=
3194 return (((BP10GB_READ_REG
3196 MISC_REG_GPIO
)) & BP10GB_GPIO0_P0
) !=
3200 if (!pbpctl_dev
->bp_10g
) {
3202 ctrl
= BPCTL_READ_REG(pbpctl_dev
, CTRL
);
3203 if (pbpctl_dev
->bp_i80
)
3204 return ((ctrl
& BPCTLI_CTRL_SWDPIN1
) !=
3206 if (pbpctl_dev
->bp_540
) {
3207 ctrl
= BP10G_READ_REG(pbpctl_dev
, ESDP
);
3209 return ((ctrl
& BP10G_SDP1_DATA
) != 0 ? 0 : 1);
3212 return ((ctrl
& BPCTLI_CTRL_SWDPIN0
) != 0 ? 0 : 1);
3214 return ((BP10G_READ_REG(pbpctl_dev
, ESDP
) &
3215 BP10G_SDP0_DATA
) != 0 ? 0 : 1);
3221 static int bp_force_link_status(bpctl_dev_t
*pbpctl_dev
)
3224 if (DBI_IF_SERIES(pbpctl_dev
->subdevice
)) {
3226 if ((pbpctl_dev
->bp_10g
) || (pbpctl_dev
->bp_10g9
)) {
3227 return ((BP10G_READ_REG(pbpctl_dev
, ESDP
) &
3228 BP10G_SDP1_DIR
) != 0 ? 1 : 0);
3235 int bypass_from_last_read(bpctl_dev_t
*pbpctl_dev
)
3237 uint32_t ctrl_ext
= 0;
3238 bpctl_dev_t
*pbpctl_dev_b
= NULL
;
3240 if ((pbpctl_dev
->bp_caps
& SW_CTL_CAP
)
3241 && (pbpctl_dev_b
= get_status_port_fn(pbpctl_dev
))) {
3242 ctrl_ext
= BPCTL_READ_REG(pbpctl_dev_b
, CTRL_EXT
);
3243 BPCTL_BP_WRITE_REG(pbpctl_dev_b
, CTRL_EXT
,
3244 (ctrl_ext
& ~BPCTLI_CTRL_EXT_SDP7_DIR
));
3245 ctrl_ext
= BPCTL_READ_REG(pbpctl_dev_b
, CTRL_EXT
);
3246 if (ctrl_ext
& BPCTLI_CTRL_EXT_SDP7_DATA
)
3253 int bypass_status_clear(bpctl_dev_t
*pbpctl_dev
)
3255 bpctl_dev_t
*pbpctl_dev_b
= NULL
;
3257 if ((pbpctl_dev
->bp_caps
& SW_CTL_CAP
)
3258 && (pbpctl_dev_b
= get_status_port_fn(pbpctl_dev
))) {
3260 send_bypass_clear_pulse(pbpctl_dev_b
, 1);
3266 int bypass_flag_status(bpctl_dev_t
*pbpctl_dev
)
3269 if ((pbpctl_dev
->bp_caps
& BP_CAP
)) {
3270 if (pbpctl_dev
->bp_ext_ver
>= PXG2BPI_VER
) {
3271 return ((((read_reg(pbpctl_dev
, STATUS_REG_ADDR
)) &
3272 BYPASS_FLAG_MASK
) ==
3273 BYPASS_FLAG_MASK
) ? 1 : 0);
3279 int bypass_flag_status_clear(bpctl_dev_t
*pbpctl_dev
)
3282 if (pbpctl_dev
->bp_caps
& BP_CAP
) {
3283 if (pbpctl_dev
->bp_ext_ver
>= PXG2BPI_VER
) {
3284 uint32_t status_reg
= 0;
3285 status_reg
= read_reg(pbpctl_dev
, STATUS_REG_ADDR
);
3286 write_reg(pbpctl_dev
, status_reg
& ~BYPASS_FLAG_MASK
,
3294 int bypass_change_status(bpctl_dev_t
*pbpctl_dev
)
3296 int ret
= BP_NOT_CAP
;
3298 if (pbpctl_dev
->bp_caps
& BP_STATUS_CHANGE_CAP
) {
3299 if (pbpctl_dev
->bp_ext_ver
>= 0x8) {
3300 ret
= bypass_flag_status(pbpctl_dev
);
3301 bypass_flag_status_clear(pbpctl_dev
);
3302 } else if (pbpctl_dev
->bp_ext_ver
>= PXG2BPI_VER
) {
3303 ret
= bypass_flag_status(pbpctl_dev
);
3304 bypass_flag_status_clear(pbpctl_dev
);
3306 ret
= bypass_from_last_read(pbpctl_dev
);
3307 bypass_status_clear(pbpctl_dev
);
3313 int bypass_off_status(bpctl_dev_t
*pbpctl_dev
)
3316 if (pbpctl_dev
->bp_caps
& BP_CAP
) {
3317 if (pbpctl_dev
->bp_ext_ver
>= PXG2BPI_VER
) {
3318 return ((((read_reg(pbpctl_dev
, STATUS_REG_ADDR
)) &
3319 BYPASS_OFF_MASK
) == BYPASS_OFF_MASK
) ? 1 : 0);
3325 static int bypass_status(bpctl_dev_t
*pbpctl_dev
)
3328 if (pbpctl_dev
->bp_caps
& BP_CAP
) {
3330 bpctl_dev_t
*pbpctl_dev_b
= NULL
;
3332 if (!(pbpctl_dev_b
= get_status_port_fn(pbpctl_dev
)))
3335 if (INTEL_IF_SERIES(pbpctl_dev
->subdevice
)) {
3337 if (!pbpctl_dev
->bp_status_un
)
3338 return (((BPCTL_READ_REG
3341 BPCTLI_CTRL_EXT_SDP7_DATA
) !=
3346 if (pbpctl_dev
->bp_ext_ver
>= 0x8) {
3348 if (pbpctl_dev
->bp_10g9
) {
3349 ctrl_ext
= BP10G_READ_REG(pbpctl_dev_b
, I2CCTL
);
3350 BP10G_WRITE_REG(pbpctl_dev_b
, I2CCTL
,
3351 (ctrl_ext
| BP10G_I2C_CLK_OUT
));
3352 return ((BP10G_READ_REG(pbpctl_dev_b
, I2CCTL
) &
3353 BP10G_I2C_CLK_IN
) != 0 ? 0 : 1);
3355 } else if (pbpctl_dev
->bp_540
) {
3356 return (((BP10G_READ_REG(pbpctl_dev_b
, ESDP
)) &
3357 BP10G_SDP0_DATA
) != 0 ? 0 : 1);
3360 else if ((pbpctl_dev
->bp_fiber5
)
3361 || (pbpctl_dev
->bp_i80
)) {
3362 return (((BPCTL_READ_REG(pbpctl_dev_b
, CTRL
)) &
3363 BPCTLI_CTRL_SWDPIN0
) != 0 ? 0 : 1);
3364 } else if (pbpctl_dev
->bp_10gb
) {
3366 BP10GB_READ_REG(pbpctl_dev
, MISC_REG_GPIO
);
3367 BP10GB_WRITE_REG(pbpctl_dev
, MISC_REG_GPIO
,
3368 (ctrl_ext
| BP10GB_GPIO3_OE_P0
)
3369 & ~(BP10GB_GPIO3_SET_P0
|
3370 BP10GB_GPIO3_CLR_P0
));
3372 return (((BP10GB_READ_REG
3374 MISC_REG_GPIO
)) & BP10GB_GPIO3_P0
) !=
3378 else if (!pbpctl_dev
->bp_10g
)
3379 return (((BPCTL_READ_REG
3382 BPCTLI_CTRL_EXT_SDP7_DATA
) !=
3386 ctrl_ext
= BP10G_READ_REG(pbpctl_dev_b
, EODSDP
);
3387 BP10G_WRITE_REG(pbpctl_dev_b
, EODSDP
,
3389 BP10G_SDP7_DATA_OUT
));
3390 return ((BP10G_READ_REG(pbpctl_dev_b
, EODSDP
) &
3391 BP10G_SDP7_DATA_IN
) != 0 ? 0 : 1);
3394 } else if (pbpctl_dev
->media_type
== bp_copper
) {
3396 return (((BPCTL_READ_REG(pbpctl_dev_b
, CTRL
)) &
3397 BPCTLI_CTRL_SWDPIN1
) != 0 ? 1 : 0);
3399 if ((bypass_status_clear(pbpctl_dev
)) >= 0)
3400 return bypass_from_last_read(pbpctl_dev
);
3407 int default_pwron_status(bpctl_dev_t
*pbpctl_dev
)
3410 if (pbpctl_dev
->bp_caps
& SW_CTL_CAP
) {
3411 if (pbpctl_dev
->bp_caps
& BP_PWUP_CTL_CAP
) {
3412 if (pbpctl_dev
->bp_ext_ver
>= PXG2BPI_VER
) {
3415 STATUS_REG_ADDR
)) & DFLT_PWRON_MASK
)
3416 == DFLT_PWRON_MASK
) ? 0 : 1);
3418 } /*else if ((!pbpctl_dev->bp_caps&BP_DIS_CAP)&&
3419 (pbpctl_dev->bp_caps&BP_PWUP_ON_CAP))
3425 static int default_pwroff_status(bpctl_dev_t
*pbpctl_dev
)
3428 /*if ((!pbpctl_dev->bp_caps&BP_DIS_CAP)&&
3429 (pbpctl_dev->bp_caps&BP_PWOFF_ON_CAP))
3431 if ((pbpctl_dev
->bp_caps
& SW_CTL_CAP
)
3432 && (pbpctl_dev
->bp_caps
& BP_PWOFF_CTL_CAP
)) {
3433 return ((((read_reg(pbpctl_dev
, STATUS_REG_ADDR
)) &
3434 DFLT_PWROFF_MASK
) == DFLT_PWROFF_MASK
) ? 0 : 1);
3439 int dis_bypass_cap_status(bpctl_dev_t
*pbpctl_dev
)
3442 if (pbpctl_dev
->bp_caps
& BP_DIS_CAP
) {
3443 if (pbpctl_dev
->bp_ext_ver
>= PXG2BPI_VER
) {
3444 return ((((read_reg(pbpctl_dev
, STATUS_REG_ADDR
)) &
3445 DIS_BYPASS_CAP_MASK
) ==
3446 DIS_BYPASS_CAP_MASK
) ? 1 : 0);
3452 int cmd_en_status(bpctl_dev_t
*pbpctl_dev
)
3455 if (pbpctl_dev
->bp_caps
& SW_CTL_CAP
) {
3456 if (pbpctl_dev
->bp_ext_ver
>= PXG2BPI_VER
) {
3457 return ((((read_reg(pbpctl_dev
, STATUS_REG_ADDR
)) &
3458 CMND_EN_MASK
) == CMND_EN_MASK
) ? 1 : 0);
3464 int wdt_en_status(bpctl_dev_t
*pbpctl_dev
)
3467 if (pbpctl_dev
->bp_caps
& WD_CTL_CAP
) {
3468 if (pbpctl_dev
->bp_ext_ver
>= PXG2BPI_VER
) {
3469 return ((((read_reg(pbpctl_dev
, STATUS_REG_ADDR
)) &
3470 WDT_EN_MASK
) == WDT_EN_MASK
) ? 1 : 0);
3476 int wdt_programmed(bpctl_dev_t
*pbpctl_dev
, int *timeout
)
3479 if (pbpctl_dev
->bp_caps
& WD_CTL_CAP
) {
3480 if (pbpctl_dev
->bp_ext_ver
>= PXG2BPI_VER
) {
3481 if ((read_reg(pbpctl_dev
, STATUS_REG_ADDR
)) &
3484 wdt_val
= read_reg(pbpctl_dev
, WDT_REG_ADDR
);
3485 *timeout
= (1 << wdt_val
) * 100;
3489 int curr_wdt_status
= pbpctl_dev
->wdt_status
;
3490 if (curr_wdt_status
== WDT_STATUS_UNKNOWN
)
3495 0 ? 0 : pbpctl_dev
->bypass_timer_interval
;
3502 int bypass_support(bpctl_dev_t
*pbpctl_dev
)
3506 if (pbpctl_dev
->bp_caps
& SW_CTL_CAP
) {
3507 if (pbpctl_dev
->bp_ext_ver
>= PXG2TBPI_VER
) {
3509 ((((read_reg(pbpctl_dev
, PRODUCT_CAP_REG_ADDR
)) &
3510 BYPASS_SUPPORT_MASK
) ==
3511 BYPASS_SUPPORT_MASK
) ? 1 : 0);
3512 } else if (pbpctl_dev
->bp_ext_ver
== PXG2BPI_VER
)
3519 int tap_support(bpctl_dev_t
*pbpctl_dev
)
3523 if (pbpctl_dev
->bp_caps
& SW_CTL_CAP
) {
3524 if (pbpctl_dev
->bp_ext_ver
>= PXG2TBPI_VER
) {
3526 ((((read_reg(pbpctl_dev
, PRODUCT_CAP_REG_ADDR
)) &
3527 TAP_SUPPORT_MASK
) == TAP_SUPPORT_MASK
) ? 1 : 0);
3528 } else if (pbpctl_dev
->bp_ext_ver
== PXG2BPI_VER
)
3535 int normal_support(bpctl_dev_t
*pbpctl_dev
)
3537 int ret
= BP_NOT_CAP
;
3539 if (pbpctl_dev
->bp_caps
& SW_CTL_CAP
) {
3540 if (pbpctl_dev
->bp_ext_ver
>= PXG2TBPI_VER
) {
3542 ((((read_reg(pbpctl_dev
, PRODUCT_CAP_REG_ADDR
)) &
3543 NORMAL_UNSUPPORT_MASK
) ==
3544 NORMAL_UNSUPPORT_MASK
) ? 0 : 1);
3551 int get_bp_prod_caps(bpctl_dev_t
*pbpctl_dev
)
3553 if ((pbpctl_dev
->bp_caps
& SW_CTL_CAP
) &&
3554 (pbpctl_dev
->bp_ext_ver
>= PXG2TBPI_VER
))
3555 return read_reg(pbpctl_dev
, PRODUCT_CAP_REG_ADDR
);
3560 int tap_flag_status(bpctl_dev_t
*pbpctl_dev
)
3563 if (pbpctl_dev
->bp_caps
& TAP_STATUS_CAP
) {
3564 if (pbpctl_dev
->bp_ext_ver
>= PXG2TBPI_VER
)
3565 return ((((read_reg(pbpctl_dev
, STATUS_TAP_REG_ADDR
)) &
3566 TAP_FLAG_MASK
) == TAP_FLAG_MASK
) ? 1 : 0);
3572 int tap_flag_status_clear(bpctl_dev_t
*pbpctl_dev
)
3574 uint32_t status_reg
= 0;
3575 if (pbpctl_dev
->bp_caps
& TAP_STATUS_CAP
) {
3576 if (pbpctl_dev
->bp_ext_ver
>= PXG2TBPI_VER
) {
3577 status_reg
= read_reg(pbpctl_dev
, STATUS_TAP_REG_ADDR
);
3578 write_reg(pbpctl_dev
, status_reg
& ~TAP_FLAG_MASK
,
3579 STATUS_TAP_REG_ADDR
);
3586 int tap_change_status(bpctl_dev_t
*pbpctl_dev
)
3588 int ret
= BP_NOT_CAP
;
3589 if (pbpctl_dev
->bp_ext_ver
>= PXG2TBPI_VER
) {
3590 if (pbpctl_dev
->bp_caps
& TAP_CAP
) {
3591 if (pbpctl_dev
->bp_caps
& BP_CAP
) {
3592 ret
= tap_flag_status(pbpctl_dev
);
3593 tap_flag_status_clear(pbpctl_dev
);
3595 ret
= bypass_from_last_read(pbpctl_dev
);
3596 bypass_status_clear(pbpctl_dev
);
3603 int tap_off_status(bpctl_dev_t
*pbpctl_dev
)
3605 if (pbpctl_dev
->bp_caps
& TAP_CAP
) {
3606 if (pbpctl_dev
->bp_ext_ver
>= PXG2TBPI_VER
)
3607 return ((((read_reg(pbpctl_dev
, STATUS_TAP_REG_ADDR
)) &
3608 TAP_OFF_MASK
) == TAP_OFF_MASK
) ? 1 : 0);
3613 int tap_status(bpctl_dev_t
*pbpctl_dev
)
3617 if (pbpctl_dev
->bp_caps
& TAP_CAP
) {
3618 bpctl_dev_t
*pbpctl_dev_b
= NULL
;
3620 if (!(pbpctl_dev_b
= get_status_port_fn(pbpctl_dev
)))
3623 if (pbpctl_dev
->bp_ext_ver
>= 0x8) {
3624 if (!pbpctl_dev
->bp_10g
)
3625 return (((BPCTL_READ_REG
3628 BPCTLI_CTRL_EXT_SDP6_DATA
) !=
3631 ctrl_ext
= BP10G_READ_REG(pbpctl_dev_b
, EODSDP
);
3632 BP10G_WRITE_REG(pbpctl_dev_b
, EODSDP
,
3634 BP10G_SDP6_DATA_OUT
));
3635 return ((BP10G_READ_REG(pbpctl_dev_b
, EODSDP
) &
3636 BP10G_SDP6_DATA_IN
) != 0 ? 0 : 1);
3639 } else if (pbpctl_dev
->media_type
== bp_copper
)
3640 return (((BPCTL_READ_REG(pbpctl_dev
, CTRL
)) &
3641 BPCTLI_CTRL_SWDPIN0
) != 0 ? 1 : 0);
3643 if ((bypass_status_clear(pbpctl_dev
)) >= 0)
3644 return bypass_from_last_read(pbpctl_dev
);
3651 int default_pwron_tap_status(bpctl_dev_t
*pbpctl_dev
)
3653 if (pbpctl_dev
->bp_caps
& TAP_PWUP_CTL_CAP
) {
3654 if (pbpctl_dev
->bp_ext_ver
>= PXG2TBPI_VER
)
3655 return ((((read_reg(pbpctl_dev
, STATUS_TAP_REG_ADDR
)) &
3656 DFLT_PWRON_TAP_MASK
) ==
3657 DFLT_PWRON_TAP_MASK
) ? 1 : 0);
3662 int dis_tap_cap_status(bpctl_dev_t
*pbpctl_dev
)
3664 if (pbpctl_dev
->bp_caps
& TAP_PWUP_CTL_CAP
) {
3665 if (pbpctl_dev
->bp_ext_ver
>= PXG2TBPI_VER
)
3666 return ((((read_reg(pbpctl_dev
, STATUS_TAP_REG_ADDR
)) &
3667 DIS_TAP_CAP_MASK
) ==
3668 DIS_TAP_CAP_MASK
) ? 1 : 0);
3673 int disc_flag_status(bpctl_dev_t
*pbpctl_dev
)
3676 if (pbpctl_dev
->bp_caps
& DISC_CAP
) {
3677 if (pbpctl_dev
->bp_ext_ver
>= 0x8)
3678 return ((((read_reg(pbpctl_dev
, STATUS_DISC_REG_ADDR
)) &
3679 DISC_FLAG_MASK
) == DISC_FLAG_MASK
) ? 1 : 0);
3685 int disc_flag_status_clear(bpctl_dev_t
*pbpctl_dev
)
3687 uint32_t status_reg
= 0;
3688 if (pbpctl_dev
->bp_caps
& DISC_CAP
) {
3689 if (pbpctl_dev
->bp_ext_ver
>= 0x8) {
3690 status_reg
= read_reg(pbpctl_dev
, STATUS_DISC_REG_ADDR
);
3691 write_reg(pbpctl_dev
, status_reg
& ~DISC_FLAG_MASK
,
3692 STATUS_DISC_REG_ADDR
);
3699 int disc_change_status(bpctl_dev_t
*pbpctl_dev
)
3701 int ret
= BP_NOT_CAP
;
3702 if (pbpctl_dev
->bp_caps
& DISC_CAP
) {
3703 ret
= disc_flag_status(pbpctl_dev
);
3704 disc_flag_status_clear(pbpctl_dev
);
3710 int disc_off_status(bpctl_dev_t
*pbpctl_dev
)
3712 bpctl_dev_t
*pbpctl_dev_b
= NULL
;
3715 if (pbpctl_dev
->bp_caps
& DISC_CAP
) {
3716 if (!(pbpctl_dev_b
= get_status_port_fn(pbpctl_dev
)))
3718 if (DISCF_IF_SERIES(pbpctl_dev
->subdevice
))
3719 return ((((read_reg(pbpctl_dev
, STATUS_DISC_REG_ADDR
)) &
3720 DISC_OFF_MASK
) == DISC_OFF_MASK
) ? 1 : 0);
3722 if (pbpctl_dev
->bp_i80
) {
3723 return (((BPCTL_READ_REG(pbpctl_dev_b
, CTRL_EXT
)) &
3724 BPCTLI_CTRL_EXT_SDP6_DATA
) != 0 ? 1 : 0);
3727 if (pbpctl_dev
->bp_540
) {
3728 ctrl_ext
= BP10G_READ_REG(pbpctl_dev_b
, ESDP
);
3729 return ((BP10G_READ_REG(pbpctl_dev_b
, ESDP
) &
3730 BP10G_SDP2_DATA
) != 0 ? 1 : 0);
3733 if (pbpctl_dev
->media_type
== bp_copper
) {
3736 return ((((read_reg(pbpctl_dev
, STATUS_DISC_REG_ADDR
)) &
3737 DISC_OFF_MASK
) == DISC_OFF_MASK
) ? 1 : 0);
3739 if (!pbpctl_dev
->bp_10g
)
3740 return (((BPCTL_READ_REG(pbpctl_dev_b
, CTRL
)) &
3741 BPCTLI_CTRL_SWDPIN1
) != 0 ? 1 : 0);
3743 return ((BP10G_READ_REG(pbpctl_dev_b
, ESDP
) &
3744 BP10G_SDP1_DATA
) != 0 ? 1 : 0);
3748 if (pbpctl_dev
->bp_10g9
) {
3749 ctrl_ext
= BP10G_READ_REG(pbpctl_dev_b
, I2CCTL
);
3750 BP10G_WRITE_REG(pbpctl_dev_b
, I2CCTL
,
3752 BP10G_I2C_DATA_OUT
));
3753 return ((BP10G_READ_REG(pbpctl_dev_b
, I2CCTL
) &
3754 BP10G_I2C_DATA_IN
) != 0 ? 1 : 0);
3756 } else if (pbpctl_dev
->bp_fiber5
) {
3757 return (((BPCTL_READ_REG(pbpctl_dev_b
, CTRL
)) &
3758 BPCTLI_CTRL_SWDPIN1
) != 0 ? 1 : 0);
3759 } else if (pbpctl_dev
->bp_10gb
) {
3761 BP10GB_READ_REG(pbpctl_dev
, MISC_REG_GPIO
);
3762 BP10GB_WRITE_REG(pbpctl_dev
, MISC_REG_GPIO
,
3763 (ctrl_ext
| BP10GB_GPIO3_OE_P1
)
3764 & ~(BP10GB_GPIO3_SET_P1
|
3765 BP10GB_GPIO3_CLR_P1
));
3767 return (((BP10GB_READ_REG
3769 MISC_REG_GPIO
)) & BP10GB_GPIO3_P1
) !=
3772 if (!pbpctl_dev
->bp_10g
) {
3774 return (((BPCTL_READ_REG
3777 BPCTLI_CTRL_EXT_SDP6_DATA
) !=
3780 ctrl_ext
= BP10G_READ_REG(pbpctl_dev_b
, EODSDP
);
3781 BP10G_WRITE_REG(pbpctl_dev_b
, EODSDP
,
3783 BP10G_SDP6_DATA_OUT
));
3784 return (((BP10G_READ_REG(pbpctl_dev_b
, EODSDP
))
3785 & BP10G_SDP6_DATA_IN
) != 0 ? 1 : 0);
3793 static int disc_status(bpctl_dev_t
*pbpctl_dev
)
3796 if (pbpctl_dev
->bp_caps
& DISC_CAP
) {
3798 if ((ctrl
= disc_off_status(pbpctl_dev
)) < 0)
3800 return ((ctrl
== 0) ? 1 : 0);
3806 int default_pwron_disc_status(bpctl_dev_t
*pbpctl_dev
)
3808 if (pbpctl_dev
->bp_caps
& DISC_PWUP_CTL_CAP
) {
3809 if (pbpctl_dev
->bp_ext_ver
>= 0x8)
3810 return ((((read_reg(pbpctl_dev
, STATUS_DISC_REG_ADDR
)) &
3811 DFLT_PWRON_DISC_MASK
) ==
3812 DFLT_PWRON_DISC_MASK
) ? 1 : 0);
3817 int dis_disc_cap_status(bpctl_dev_t
*pbpctl_dev
)
3819 if (pbpctl_dev
->bp_caps
& DIS_DISC_CAP
) {
3820 if (pbpctl_dev
->bp_ext_ver
>= 0x8)
3821 return ((((read_reg(pbpctl_dev
, STATUS_DISC_REG_ADDR
)) &
3822 DIS_DISC_CAP_MASK
) ==
3823 DIS_DISC_CAP_MASK
) ? 1 : 0);
3828 int disc_port_status(bpctl_dev_t
*pbpctl_dev
)
3830 int ret
= BP_NOT_CAP
;
3831 bpctl_dev_t
*pbpctl_dev_m
;
3833 if ((is_bypass_fn(pbpctl_dev
)) == 1)
3834 pbpctl_dev_m
= pbpctl_dev
;
3836 pbpctl_dev_m
= get_master_port_fn(pbpctl_dev
);
3837 if (pbpctl_dev_m
== NULL
)
3840 if (pbpctl_dev_m
->bp_caps_ex
& DISC_PORT_CAP_EX
) {
3841 if (is_bypass_fn(pbpctl_dev
) == 1) {
3842 return ((((read_reg(pbpctl_dev
, STATUS_TAP_REG_ADDR
)) &
3843 TX_DISA_MASK
) == TX_DISA_MASK
) ? 1 : 0);
3845 return ((((read_reg(pbpctl_dev
, STATUS_TAP_REG_ADDR
)) &
3846 TX_DISB_MASK
) == TX_DISB_MASK
) ? 1 : 0);
3852 int default_pwron_disc_port_status(bpctl_dev_t
*pbpctl_dev
)
3854 int ret
= BP_NOT_CAP
;
3855 bpctl_dev_t
*pbpctl_dev_m
;
3857 if ((is_bypass_fn(pbpctl_dev
)) == 1)
3858 pbpctl_dev_m
= pbpctl_dev
;
3860 pbpctl_dev_m
= get_master_port_fn(pbpctl_dev
);
3861 if (pbpctl_dev_m
== NULL
)
3864 if (pbpctl_dev_m
->bp_caps_ex
& DISC_PORT_CAP_EX
) {
3865 if (is_bypass_fn(pbpctl_dev
) == 1)
3867 /* return((((read_reg(pbpctl_dev,STATUS_TAP_REG_ADDR)) & TX_DISA_MASK)==TX_DISA_MASK)?1:0); */
3870 /* return((((read_reg(pbpctl_dev,STATUS_TAP_REG_ADDR)) & TX_DISA_MASK)==TX_DISA_MASK)?1:0); */
3876 int wdt_exp_mode_status(bpctl_dev_t
*pbpctl_dev
)
3878 if (pbpctl_dev
->bp_caps
& WD_CTL_CAP
) {
3879 if (pbpctl_dev
->bp_ext_ver
<= PXG2BPI_VER
)
3880 return 0; /* bypass mode */
3881 else if (pbpctl_dev
->bp_ext_ver
== PXG2TBPI_VER
)
3882 return 1; /* tap mode */
3883 else if (pbpctl_dev
->bp_ext_ver
>= PXE2TBPI_VER
) {
3884 if (pbpctl_dev
->bp_ext_ver
>= 0x8) {
3887 STATUS_DISC_REG_ADDR
)) &
3888 WDTE_DISC_BPN_MASK
) == WDTE_DISC_BPN_MASK
)
3891 return ((((read_reg(pbpctl_dev
, STATUS_TAP_REG_ADDR
)) &
3892 WDTE_TAP_BPN_MASK
) ==
3893 WDTE_TAP_BPN_MASK
) ? 1 : 0);
3899 int tpl2_flag_status(bpctl_dev_t
*pbpctl_dev
)
3902 if (pbpctl_dev
->bp_caps_ex
& TPL2_CAP_EX
) {
3903 return ((((read_reg(pbpctl_dev
, STATUS_DISC_REG_ADDR
)) &
3904 TPL2_FLAG_MASK
) == TPL2_FLAG_MASK
) ? 1 : 0);
3910 int tpl_hw_status(bpctl_dev_t
*pbpctl_dev
)
3912 bpctl_dev_t
*pbpctl_dev_b
= NULL
;
3914 if (!(pbpctl_dev_b
= get_status_port_fn(pbpctl_dev
)))
3917 if (TPL_IF_SERIES(pbpctl_dev
->subdevice
))
3918 return (((BPCTL_READ_REG(pbpctl_dev
, CTRL
)) &
3919 BPCTLI_CTRL_SWDPIN0
) != 0 ? 1 : 0);
3924 int bp_wait_at_pwup_status(bpctl_dev_t
*pbpctl_dev
)
3926 if (pbpctl_dev
->bp_caps
& SW_CTL_CAP
) {
3927 if (pbpctl_dev
->bp_ext_ver
>= 0x8)
3928 return ((((read_reg(pbpctl_dev
, CONT_CONFIG_REG_ADDR
)) &
3929 WAIT_AT_PWUP_MASK
) ==
3930 WAIT_AT_PWUP_MASK
) ? 1 : 0);
3935 int bp_hw_reset_status(bpctl_dev_t
*pbpctl_dev
)
3938 if (pbpctl_dev
->bp_caps
& SW_CTL_CAP
) {
3940 if (pbpctl_dev
->bp_ext_ver
>= 0x8)
3941 return ((((read_reg(pbpctl_dev
, CONT_CONFIG_REG_ADDR
)) &
3942 EN_HW_RESET_MASK
) ==
3943 EN_HW_RESET_MASK
) ? 1 : 0);
3949 int std_nic_status(bpctl_dev_t
*pbpctl_dev
)
3953 if (pbpctl_dev
->bp_caps
& STD_NIC_CAP
) {
3954 if (INTEL_IF_SERIES(pbpctl_dev
->subdevice
))
3956 if (pbpctl_dev
->bp_ext_ver
>= BP_FW_EXT_VER8
) {
3957 return ((((read_reg(pbpctl_dev
, STATUS_DISC_REG_ADDR
)) &
3958 STD_NIC_ON_MASK
) == STD_NIC_ON_MASK
) ? 1 : 0);
3961 if (pbpctl_dev
->bp_ext_ver
>= PXG2BPI_VER
) {
3962 if (pbpctl_dev
->bp_caps
& BP_CAP
) {
3964 read_reg(pbpctl_dev
, STATUS_REG_ADDR
);
3965 if (((!(status_val
& WDT_EN_MASK
))
3966 && ((status_val
& STD_NIC_MASK
) ==
3972 if (pbpctl_dev
->bp_caps
& TAP_CAP
) {
3974 read_reg(pbpctl_dev
, STATUS_TAP_REG_ADDR
);
3975 if ((status_val
& STD_NIC_TAP_MASK
) ==
3981 if (pbpctl_dev
->bp_caps
& TAP_CAP
) {
3982 if ((disc_off_status(pbpctl_dev
)))
3994 /******************************************************/
3995 /**************SW_INIT*********************************/
3996 /******************************************************/
3997 void bypass_caps_init(bpctl_dev_t
*pbpctl_dev
)
3999 u_int32_t ctrl_ext
= 0;
4000 bpctl_dev_t
*pbpctl_dev_m
= NULL
;
4004 if (!(INTEL_IF_SERIES(adapter
->bp_device_block
.subdevice
))) {
4005 ret
= read_reg(pbpctl_dev
, VER_REG_ADDR
);
4006 printk("VER_REG reg1=%x\n", ret
);
4007 ret
= read_reg(pbpctl_dev
, PRODUCT_CAP_REG_ADDR
);
4008 printk("PRODUCT_CAP reg=%x\n", ret
);
4009 ret
= read_reg(pbpctl_dev
, STATUS_TAP_REG_ADDR
);
4010 printk("STATUS_TAP reg1=%x\n", ret
);
4011 ret
= read_reg(pbpctl_dev
, 0x7);
4012 printk("SIG_REG reg1=%x\n", ret
);
4013 ret
= read_reg(pbpctl_dev
, STATUS_REG_ADDR
);
4014 printk("STATUS_REG_ADDR=%x\n", ret
);
4015 ret
= read_reg(pbpctl_dev
, WDT_REG_ADDR
);
4016 printk("WDT_REG_ADDR=%x\n", ret
);
4017 ret
= read_reg(pbpctl_dev
, TMRL_REG_ADDR
);
4018 printk("TMRL_REG_ADDR=%x\n", ret
);
4019 ret
= read_reg(pbpctl_dev
, TMRH_REG_ADDR
);
4020 printk("TMRH_REG_ADDR=%x\n", ret
);
4023 if ((pbpctl_dev
->bp_fiber5
) || (pbpctl_dev
->bp_10g9
)) {
4024 pbpctl_dev
->media_type
= bp_fiber
;
4025 } else if (pbpctl_dev
->bp_10gb
) {
4026 if (BP10GB_CX4_SERIES(pbpctl_dev
->subdevice
))
4027 pbpctl_dev
->media_type
= bp_cx4
;
4029 pbpctl_dev
->media_type
= bp_fiber
;
4033 else if (pbpctl_dev
->bp_540
)
4034 pbpctl_dev
->media_type
= bp_none
;
4035 else if (!pbpctl_dev
->bp_10g
) {
4037 ctrl_ext
= BPCTL_READ_REG(pbpctl_dev
, CTRL_EXT
);
4038 if ((ctrl_ext
& BPCTLI_CTRL_EXT_LINK_MODE_MASK
) == 0x0)
4039 pbpctl_dev
->media_type
= bp_copper
;
4041 pbpctl_dev
->media_type
= bp_fiber
;
4044 if (BP10G_CX4_SERIES(pbpctl_dev
->subdevice
))
4045 pbpctl_dev
->media_type
= bp_cx4
;
4047 pbpctl_dev
->media_type
= bp_fiber
;
4050 if (is_bypass_fn(pbpctl_dev
)) {
4052 pbpctl_dev
->bp_caps
|= BP_PWOFF_ON_CAP
;
4053 if (pbpctl_dev
->media_type
== bp_fiber
)
4054 pbpctl_dev
->bp_caps
|=
4055 (TX_CTL_CAP
| TX_STATUS_CAP
| TPL_CAP
);
4057 if (TPL_IF_SERIES(pbpctl_dev
->subdevice
)) {
4058 pbpctl_dev
->bp_caps
|= TPL_CAP
;
4061 if (INTEL_IF_SERIES(pbpctl_dev
->subdevice
)) {
4062 pbpctl_dev
->bp_caps
|=
4063 (BP_CAP
| BP_STATUS_CAP
| SW_CTL_CAP
|
4064 BP_PWUP_ON_CAP
| BP_PWUP_OFF_CAP
| BP_PWOFF_OFF_CAP
4065 | WD_CTL_CAP
| WD_STATUS_CAP
| STD_NIC_CAP
|
4068 pbpctl_dev
->bp_ext_ver
= OLD_IF_VER
;
4072 if ((pbpctl_dev
->bp_fw_ver
== 0xff) &&
4073 OLD_IF_SERIES(pbpctl_dev
->subdevice
)) {
4075 pbpctl_dev
->bp_caps
|=
4076 (BP_CAP
| BP_STATUS_CAP
| BP_STATUS_CHANGE_CAP
|
4077 SW_CTL_CAP
| BP_PWUP_ON_CAP
| WD_CTL_CAP
|
4078 WD_STATUS_CAP
| WD_TIMEOUT_CAP
);
4080 pbpctl_dev
->bp_ext_ver
= OLD_IF_VER
;
4085 switch (pbpctl_dev
->bp_fw_ver
) {
4088 pbpctl_dev
->bp_ext_ver
=
4090 bp_fw_ver
& EXT_VER_MASK
);
4094 if ((bypass_sign_check(pbpctl_dev
)) !=
4096 pbpctl_dev
->bp_caps
= 0;
4099 pbpctl_dev
->bp_ext_ver
=
4101 bp_fw_ver
& EXT_VER_MASK
);
4106 if (pbpctl_dev
->bp_ext_ver
== PXG2BPI_VER
)
4107 pbpctl_dev
->bp_caps
|=
4108 (BP_CAP
| BP_STATUS_CAP
| BP_STATUS_CHANGE_CAP
|
4109 SW_CTL_CAP
| BP_DIS_CAP
| BP_DIS_STATUS_CAP
|
4110 BP_PWUP_ON_CAP
| BP_PWUP_OFF_CAP
| BP_PWUP_CTL_CAP
4111 | WD_CTL_CAP
| STD_NIC_CAP
| WD_STATUS_CAP
|
4113 else if (pbpctl_dev
->bp_ext_ver
>= PXG2TBPI_VER
) {
4116 pbpctl_dev
->bp_caps
|=
4117 (SW_CTL_CAP
| WD_CTL_CAP
| WD_STATUS_CAP
|
4119 cap_reg
= get_bp_prod_caps(pbpctl_dev
);
4121 if ((cap_reg
& NORMAL_UNSUPPORT_MASK
) ==
4122 NORMAL_UNSUPPORT_MASK
)
4123 pbpctl_dev
->bp_caps
|= NIC_CAP_NEG
;
4125 pbpctl_dev
->bp_caps
|= STD_NIC_CAP
;
4127 if ((normal_support(pbpctl_dev
)) == 1)
4129 pbpctl_dev
->bp_caps
|= STD_NIC_CAP
;
4132 pbpctl_dev
->bp_caps
|= NIC_CAP_NEG
;
4133 if ((cap_reg
& BYPASS_SUPPORT_MASK
) ==
4134 BYPASS_SUPPORT_MASK
) {
4135 pbpctl_dev
->bp_caps
|=
4136 (BP_CAP
| BP_STATUS_CAP
|
4137 BP_STATUS_CHANGE_CAP
| BP_DIS_CAP
|
4138 BP_DIS_STATUS_CAP
| BP_PWUP_ON_CAP
|
4139 BP_PWUP_OFF_CAP
| BP_PWUP_CTL_CAP
);
4140 if (pbpctl_dev
->bp_ext_ver
>= BP_FW_EXT_VER7
)
4141 pbpctl_dev
->bp_caps
|=
4142 BP_PWOFF_ON_CAP
| BP_PWOFF_OFF_CAP
|
4145 if ((cap_reg
& TAP_SUPPORT_MASK
) == TAP_SUPPORT_MASK
) {
4146 pbpctl_dev
->bp_caps
|=
4147 (TAP_CAP
| TAP_STATUS_CAP
|
4148 TAP_STATUS_CHANGE_CAP
| TAP_DIS_CAP
|
4149 TAP_DIS_STATUS_CAP
| TAP_PWUP_ON_CAP
|
4150 TAP_PWUP_OFF_CAP
| TAP_PWUP_CTL_CAP
);
4152 if (pbpctl_dev
->bp_ext_ver
>= BP_FW_EXT_VER8
) {
4153 if ((cap_reg
& DISC_SUPPORT_MASK
) ==
4155 pbpctl_dev
->bp_caps
|=
4156 (DISC_CAP
| DISC_DIS_CAP
|
4158 if ((cap_reg
& TPL2_SUPPORT_MASK
) ==
4159 TPL2_SUPPORT_MASK
) {
4160 pbpctl_dev
->bp_caps_ex
|= TPL2_CAP_EX
;
4161 pbpctl_dev
->bp_caps
|= TPL_CAP
;
4162 pbpctl_dev
->bp_tpl_flag
=
4163 tpl2_flag_status(pbpctl_dev
);
4168 if (pbpctl_dev
->bp_ext_ver
>= BP_FW_EXT_VER9
) {
4169 if ((cap_reg
& DISC_PORT_SUPPORT_MASK
) ==
4170 DISC_PORT_SUPPORT_MASK
) {
4171 pbpctl_dev
->bp_caps_ex
|=
4173 pbpctl_dev
->bp_caps
|=
4174 (TX_CTL_CAP
| TX_STATUS_CAP
);
4180 if (pbpctl_dev
->bp_ext_ver
>= PXG2BPI_VER
) {
4181 if ((read_reg(pbpctl_dev
, STATUS_REG_ADDR
)) &
4183 pbpctl_dev
->wdt_status
= WDT_STATUS_EN
;
4185 pbpctl_dev
->wdt_status
= WDT_STATUS_DIS
;
4188 } else if ((P2BPFI_IF_SERIES(pbpctl_dev
->subdevice
)) ||
4189 (PEGF5_IF_SERIES(pbpctl_dev
->subdevice
)) ||
4190 (PEGF80_IF_SERIES(pbpctl_dev
->subdevice
)) ||
4191 (BP10G9_IF_SERIES(pbpctl_dev
->subdevice
))) {
4192 pbpctl_dev
->bp_caps
|= (TX_CTL_CAP
| TX_STATUS_CAP
);
4194 if ((pbpctl_dev
->subdevice
& 0xa00) == 0xa00)
4195 pbpctl_dev
->bp_caps
|= (TX_CTL_CAP
| TX_STATUS_CAP
);
4196 if (PEG5_IF_SERIES(pbpctl_dev
->subdevice
))
4197 pbpctl_dev
->bp_caps
|= (TX_CTL_CAP
| TX_STATUS_CAP
);
4199 if (BP10GB_IF_SERIES(pbpctl_dev
->subdevice
)) {
4200 pbpctl_dev
->bp_caps
&= ~(TX_CTL_CAP
| TX_STATUS_CAP
);
4202 pbpctl_dev_m
= get_master_port_fn(pbpctl_dev
);
4203 if (pbpctl_dev_m
!= NULL
) {
4205 if (pbpctl_dev_m
->bp_ext_ver
>= 0x9) {
4206 cap_reg
= get_bp_prod_caps(pbpctl_dev_m
);
4207 if ((cap_reg
& DISC_PORT_SUPPORT_MASK
) ==
4208 DISC_PORT_SUPPORT_MASK
)
4209 pbpctl_dev
->bp_caps
|=
4210 (TX_CTL_CAP
| TX_STATUS_CAP
);
4211 pbpctl_dev
->bp_caps_ex
|= DISC_PORT_CAP_EX
;
4216 int bypass_off_init(bpctl_dev_t
*pbpctl_dev
)
4220 if ((ret
= cmnd_on(pbpctl_dev
)) < 0)
4222 if (INTEL_IF_SERIES(pbpctl_dev
->subdevice
))
4223 return dis_bypass_cap(pbpctl_dev
);
4224 wdt_off(pbpctl_dev
);
4225 if (pbpctl_dev
->bp_caps
& BP_CAP
)
4226 bypass_off(pbpctl_dev
);
4227 if (pbpctl_dev
->bp_caps
& TAP_CAP
)
4228 tap_off(pbpctl_dev
);
4229 cmnd_off(pbpctl_dev
);
4233 void remove_bypass_wd_auto(bpctl_dev_t
*pbpctl_dev
)
4236 bpctl_dev_t
*pbpctl_dev_sl
= NULL
;
4239 if (pbpctl_dev
->bp_caps
& WD_CTL_CAP
) {
4241 del_timer_sync(&pbpctl_dev
->bp_timer
);
4243 pbpctl_dev_sl
= get_status_port_fn(pbpctl_dev
);
4244 if (pbpctl_dev_sl
&& (pbpctl_dev_sl
->ndev
)) {
4245 if ((pbpctl_dev_sl
->ndev
->netdev_ops
)
4246 && (pbpctl_dev_sl
->old_ops
)) {
4248 pbpctl_dev_sl
->ndev
->netdev_ops
=
4249 pbpctl_dev_sl
->old_ops
;
4250 pbpctl_dev_sl
->old_ops
= NULL
;
4262 int init_bypass_wd_auto(bpctl_dev_t
*pbpctl_dev
)
4264 if (pbpctl_dev
->bp_caps
& WD_CTL_CAP
) {
4265 init_timer(&pbpctl_dev
->bp_timer
);
4266 pbpctl_dev
->bp_timer
.function
= &wd_reset_timer
;
4267 pbpctl_dev
->bp_timer
.data
= (unsigned long)pbpctl_dev
;
4274 int bp_hard_start_xmit(struct sk_buff
*skb
, struct net_device
*dev
)
4276 bpctl_dev_t
*pbpctl_dev
= NULL
, *pbpctl_dev_m
= NULL
;
4278 struct ethhdr
*eth
= (struct ethhdr
*)skb
->data
;
4281 ((bpctl_dev_arr
[idx_dev
].ndev
!= NULL
) && (idx_dev
< device_num
));
4283 if (bpctl_dev_arr
[idx_dev
].ndev
== dev
) {
4284 pbpctl_dev
= &bpctl_dev_arr
[idx_dev
];
4290 if ((htons(ETH_P_BPTEST
) == eth
->h_proto
)) {
4292 pbpctl_dev_m
= get_master_port_fn(pbpctl_dev
);
4295 if (bypass_status(pbpctl_dev_m
)) {
4296 cmnd_on(pbpctl_dev_m
);
4297 bypass_off(pbpctl_dev_m
);
4298 cmnd_off(pbpctl_dev_m
);
4300 wdt_timer_reload(pbpctl_dev_m
);
4302 dev_kfree_skb_irq(skb
);
4305 return pbpctl_dev
->hard_start_xmit_save(skb
, dev
);
4309 int set_bypass_wd_auto(bpctl_dev_t
*pbpctl_dev
, unsigned int param
)
4311 if (pbpctl_dev
->bp_caps
& WD_CTL_CAP
) {
4312 if (pbpctl_dev
->reset_time
!= param
) {
4313 if (INTEL_IF_SERIES(pbpctl_dev
->subdevice
))
4314 pbpctl_dev
->reset_time
=
4316 WDT_AUTO_MIN_INT
) ? WDT_AUTO_MIN_INT
:
4319 pbpctl_dev
->reset_time
= param
;
4321 mod_timer(&pbpctl_dev
->bp_timer
, jiffies
);
4328 int get_bypass_wd_auto(bpctl_dev_t
*pbpctl_dev
)
4331 if (pbpctl_dev
->bp_caps
& WD_CTL_CAP
) {
4332 return pbpctl_dev
->reset_time
;
4339 int set_bp_self_test(bpctl_dev_t
*pbpctl_dev
, unsigned int param
)
4341 bpctl_dev_t
*pbpctl_dev_sl
= NULL
;
4343 if (pbpctl_dev
->bp_caps
& WD_CTL_CAP
) {
4344 pbpctl_dev
->bp_self_test_flag
= param
== 0 ? 0 : 1;
4345 pbpctl_dev_sl
= get_status_port_fn(pbpctl_dev
);
4347 if ((pbpctl_dev_sl
->ndev
) && (pbpctl_dev_sl
->ndev
->netdev_ops
)) {
4349 if (pbpctl_dev
->bp_self_test_flag
== 1) {
4351 pbpctl_dev_sl
->old_ops
=
4352 pbpctl_dev_sl
->ndev
->netdev_ops
;
4353 pbpctl_dev_sl
->new_ops
=
4354 *pbpctl_dev_sl
->old_ops
;
4355 pbpctl_dev_sl
->new_ops
.ndo_start_xmit
=
4357 pbpctl_dev_sl
->ndev
->netdev_ops
=
4358 &pbpctl_dev_sl
->new_ops
;
4360 } else if (pbpctl_dev_sl
->old_ops
) {
4361 pbpctl_dev_sl
->ndev
->netdev_ops
=
4362 pbpctl_dev_sl
->old_ops
;
4363 pbpctl_dev_sl
->old_ops
= NULL
;
4368 set_bypass_wd_auto(pbpctl_dev
, param
);
4374 int get_bp_self_test(bpctl_dev_t
*pbpctl_dev
)
4377 if (pbpctl_dev
->bp_caps
& WD_CTL_CAP
) {
4378 if (pbpctl_dev
->bp_self_test_flag
== 1)
4379 return pbpctl_dev
->reset_time
;
4388 /**************************************************************/
4389 /************************* API ********************************/
4390 /**************************************************************/
4392 int is_bypass_fn(bpctl_dev_t
*pbpctl_dev
)
4397 return (((pbpctl_dev
->func
== 0) || (pbpctl_dev
->func
== 2)) ? 1 : 0);
4400 int set_bypass_fn(bpctl_dev_t
*pbpctl_dev
, int bypass_mode
)
4404 if (!(pbpctl_dev
->bp_caps
& BP_CAP
))
4406 if ((ret
= cmnd_on(pbpctl_dev
)) < 0)
4409 ret
= bypass_off(pbpctl_dev
);
4411 ret
= bypass_on(pbpctl_dev
);
4412 cmnd_off(pbpctl_dev
);
4417 int get_bypass_fn(bpctl_dev_t
*pbpctl_dev
)
4419 return bypass_status(pbpctl_dev
);
4422 int get_bypass_change_fn(bpctl_dev_t
*pbpctl_dev
)
4427 return bypass_change_status(pbpctl_dev
);
4430 int set_dis_bypass_fn(bpctl_dev_t
*pbpctl_dev
, int dis_param
)
4436 if (!(pbpctl_dev
->bp_caps
& BP_DIS_CAP
))
4438 if ((ret
= cmnd_on(pbpctl_dev
)) < 0)
4441 ret
= dis_bypass_cap(pbpctl_dev
);
4443 ret
= en_bypass_cap(pbpctl_dev
);
4444 cmnd_off(pbpctl_dev
);
4448 int get_dis_bypass_fn(bpctl_dev_t
*pbpctl_dev
)
4453 return dis_bypass_cap_status(pbpctl_dev
);
4456 int set_bypass_pwoff_fn(bpctl_dev_t
*pbpctl_dev
, int bypass_mode
)
4462 if (!(pbpctl_dev
->bp_caps
& BP_PWOFF_CTL_CAP
))
4464 if ((ret
= cmnd_on(pbpctl_dev
)) < 0)
4467 ret
= bypass_state_pwroff(pbpctl_dev
);
4469 ret
= normal_state_pwroff(pbpctl_dev
);
4470 cmnd_off(pbpctl_dev
);
4474 int get_bypass_pwoff_fn(bpctl_dev_t
*pbpctl_dev
)
4479 return default_pwroff_status(pbpctl_dev
);
4482 int set_bypass_pwup_fn(bpctl_dev_t
*pbpctl_dev
, int bypass_mode
)
4488 if (!(pbpctl_dev
->bp_caps
& BP_PWUP_CTL_CAP
))
4490 if ((ret
= cmnd_on(pbpctl_dev
)) < 0)
4493 ret
= bypass_state_pwron(pbpctl_dev
);
4495 ret
= normal_state_pwron(pbpctl_dev
);
4496 cmnd_off(pbpctl_dev
);
4500 int get_bypass_pwup_fn(bpctl_dev_t
*pbpctl_dev
)
4505 return default_pwron_status(pbpctl_dev
);
4508 int set_bypass_wd_fn(bpctl_dev_t
*pbpctl_dev
, int timeout
)
4514 if (!(pbpctl_dev
->bp_caps
& WD_CTL_CAP
))
4517 if ((ret
= cmnd_on(pbpctl_dev
)) < 0)
4520 ret
= wdt_off(pbpctl_dev
);
4522 wdt_on(pbpctl_dev
, timeout
);
4523 ret
= pbpctl_dev
->bypass_timer_interval
;
4525 cmnd_off(pbpctl_dev
);
4529 int get_bypass_wd_fn(bpctl_dev_t
*pbpctl_dev
, int *timeout
)
4534 return wdt_programmed(pbpctl_dev
, timeout
);
4537 int get_wd_expire_time_fn(bpctl_dev_t
*pbpctl_dev
, int *time_left
)
4542 return wdt_timer(pbpctl_dev
, time_left
);
4545 int reset_bypass_wd_timer_fn(bpctl_dev_t
*pbpctl_dev
)
4550 return wdt_timer_reload(pbpctl_dev
);
4553 int get_wd_set_caps_fn(bpctl_dev_t
*pbpctl_dev
)
4557 unsigned int step_value
= TIMEOUT_MAX_STEP
+ 1, bit_cnt
= 0;
4561 if (INTEL_IF_SERIES(pbpctl_dev
->subdevice
))
4564 while ((step_value
>>= 1))
4567 if (is_bypass_fn(pbpctl_dev
)) {
4569 WD_STEP_COUNT_MASK(bit_cnt
) | WDT_STEP_TIME
|
4570 WD_MIN_TIME_MASK(TIMEOUT_UNIT
/ 100);
4577 int set_std_nic_fn(bpctl_dev_t
*pbpctl_dev
, int nic_mode
)
4583 if (!(pbpctl_dev
->bp_caps
& STD_NIC_CAP
))
4586 if ((ret
= cmnd_on(pbpctl_dev
)) < 0)
4589 ret
= std_nic_on(pbpctl_dev
);
4591 ret
= std_nic_off(pbpctl_dev
);
4592 cmnd_off(pbpctl_dev
);
4596 int get_std_nic_fn(bpctl_dev_t
*pbpctl_dev
)
4601 return std_nic_status(pbpctl_dev
);
4604 int set_tap_fn(bpctl_dev_t
*pbpctl_dev
, int tap_mode
)
4609 if ((pbpctl_dev
->bp_caps
& TAP_CAP
) && ((cmnd_on(pbpctl_dev
)) >= 0)) {
4611 tap_off(pbpctl_dev
);
4614 cmnd_off(pbpctl_dev
);
4620 int get_tap_fn(bpctl_dev_t
*pbpctl_dev
)
4625 return tap_status(pbpctl_dev
);
4628 int set_tap_pwup_fn(bpctl_dev_t
*pbpctl_dev
, int tap_mode
)
4634 if ((pbpctl_dev
->bp_caps
& TAP_PWUP_CTL_CAP
)
4635 && ((cmnd_on(pbpctl_dev
)) >= 0)) {
4637 ret
= tap_state_pwron(pbpctl_dev
);
4639 ret
= normal_state_pwron(pbpctl_dev
);
4640 cmnd_off(pbpctl_dev
);
4646 int get_tap_pwup_fn(bpctl_dev_t
*pbpctl_dev
)
4652 if ((ret
= default_pwron_tap_status(pbpctl_dev
)) < 0)
4654 return ((ret
== 0) ? 1 : 0);
4657 int get_tap_change_fn(bpctl_dev_t
*pbpctl_dev
)
4662 return tap_change_status(pbpctl_dev
);
4665 int set_dis_tap_fn(bpctl_dev_t
*pbpctl_dev
, int dis_param
)
4671 if ((pbpctl_dev
->bp_caps
& TAP_DIS_CAP
) && ((cmnd_on(pbpctl_dev
)) >= 0)) {
4673 ret
= dis_tap_cap(pbpctl_dev
);
4675 ret
= en_tap_cap(pbpctl_dev
);
4676 cmnd_off(pbpctl_dev
);
4682 int get_dis_tap_fn(bpctl_dev_t
*pbpctl_dev
)
4687 return dis_tap_cap_status(pbpctl_dev
);
4690 int set_disc_fn(bpctl_dev_t
*pbpctl_dev
, int disc_mode
)
4695 if ((pbpctl_dev
->bp_caps
& DISC_CAP
) && ((cmnd_on(pbpctl_dev
)) >= 0)) {
4697 disc_off(pbpctl_dev
);
4699 disc_on(pbpctl_dev
);
4700 cmnd_off(pbpctl_dev
);
4707 int get_disc_fn(bpctl_dev_t
*pbpctl_dev
)
4713 ret
= disc_status(pbpctl_dev
);
4718 int set_disc_pwup_fn(bpctl_dev_t
*pbpctl_dev
, int disc_mode
)
4724 if ((pbpctl_dev
->bp_caps
& DISC_PWUP_CTL_CAP
)
4725 && ((cmnd_on(pbpctl_dev
)) >= 0)) {
4727 ret
= disc_state_pwron(pbpctl_dev
);
4729 ret
= normal_state_pwron(pbpctl_dev
);
4730 cmnd_off(pbpctl_dev
);
4736 int get_disc_pwup_fn(bpctl_dev_t
*pbpctl_dev
)
4742 ret
= default_pwron_disc_status(pbpctl_dev
);
4743 return (ret
== 0 ? 1 : (ret
< 0 ? BP_NOT_CAP
: 0));
4746 int get_disc_change_fn(bpctl_dev_t
*pbpctl_dev
)
4752 ret
= disc_change_status(pbpctl_dev
);
4756 int set_dis_disc_fn(bpctl_dev_t
*pbpctl_dev
, int dis_param
)
4762 if ((pbpctl_dev
->bp_caps
& DISC_DIS_CAP
)
4763 && ((cmnd_on(pbpctl_dev
)) >= 0)) {
4765 ret
= dis_disc_cap(pbpctl_dev
);
4767 ret
= en_disc_cap(pbpctl_dev
);
4768 cmnd_off(pbpctl_dev
);
4774 int get_dis_disc_fn(bpctl_dev_t
*pbpctl_dev
)
4780 ret
= dis_disc_cap_status(pbpctl_dev
);
4785 int set_disc_port_fn(bpctl_dev_t
*pbpctl_dev
, int disc_mode
)
4787 int ret
= BP_NOT_CAP
;
4792 ret
= disc_port_off(pbpctl_dev
);
4794 ret
= disc_port_on(pbpctl_dev
);
4799 int get_disc_port_fn(bpctl_dev_t
*pbpctl_dev
)
4804 return disc_port_status(pbpctl_dev
);
4807 int set_disc_port_pwup_fn(bpctl_dev_t
*pbpctl_dev
, int disc_mode
)
4809 int ret
= BP_NOT_CAP
;
4814 ret
= normal_port_state_pwron(pbpctl_dev
);
4816 ret
= disc_port_state_pwron(pbpctl_dev
);
4821 int get_disc_port_pwup_fn(bpctl_dev_t
*pbpctl_dev
)
4827 if ((ret
= default_pwron_disc_port_status(pbpctl_dev
)) < 0)
4829 return ((ret
== 0) ? 1 : 0);
4832 int get_wd_exp_mode_fn(bpctl_dev_t
*pbpctl_dev
)
4837 return wdt_exp_mode_status(pbpctl_dev
);
4840 int set_wd_exp_mode_fn(bpctl_dev_t
*pbpctl_dev
, int param
)
4845 return wdt_exp_mode(pbpctl_dev
, param
);
4848 int reset_cont_fn(bpctl_dev_t
*pbpctl_dev
)
4854 if ((ret
= cmnd_on(pbpctl_dev
)) < 0)
4856 return reset_cont(pbpctl_dev
);
4859 int set_tx_fn(bpctl_dev_t
*pbpctl_dev
, int tx_state
)
4862 bpctl_dev_t
*pbpctl_dev_b
= NULL
;
4866 if ((pbpctl_dev
->bp_caps
& TPL_CAP
) &&
4867 (pbpctl_dev
->bp_caps
& SW_CTL_CAP
)) {
4868 if ((pbpctl_dev
->bp_tpl_flag
))
4870 } else if ((pbpctl_dev_b
= get_master_port_fn(pbpctl_dev
))) {
4871 if ((pbpctl_dev_b
->bp_caps
& TPL_CAP
) &&
4872 (pbpctl_dev_b
->bp_tpl_flag
))
4875 return set_tx(pbpctl_dev
, tx_state
);
4878 int set_bp_force_link_fn(int dev_num
, int tx_state
)
4880 static bpctl_dev_t
*bpctl_dev_curr
;
4882 if ((dev_num
< 0) || (dev_num
> device_num
)
4883 || (bpctl_dev_arr
[dev_num
].pdev
== NULL
))
4885 bpctl_dev_curr
= &bpctl_dev_arr
[dev_num
];
4887 return set_bp_force_link(bpctl_dev_curr
, tx_state
);
4890 int set_wd_autoreset_fn(bpctl_dev_t
*pbpctl_dev
, int param
)
4895 return set_bypass_wd_auto(pbpctl_dev
, param
);
4898 int get_wd_autoreset_fn(bpctl_dev_t
*pbpctl_dev
)
4903 return get_bypass_wd_auto(pbpctl_dev
);
4907 int set_bp_self_test_fn(bpctl_dev_t
*pbpctl_dev
, int param
)
4912 return set_bp_self_test(pbpctl_dev
, param
);
4915 int get_bp_self_test_fn(bpctl_dev_t
*pbpctl_dev
)
4920 return get_bp_self_test(pbpctl_dev
);
4925 int get_bypass_caps_fn(bpctl_dev_t
*pbpctl_dev
)
4930 return pbpctl_dev
->bp_caps
;
4934 int get_bypass_slave_fn(bpctl_dev_t
*pbpctl_dev
, bpctl_dev_t
**pbpctl_dev_out
)
4940 if ((pbpctl_dev
->func
== 0) || (pbpctl_dev
->func
== 2)) {
4942 ((bpctl_dev_arr
[idx_dev
].pdev
!= NULL
)
4943 && (idx_dev
< device_num
)); idx_dev
++) {
4944 if ((bpctl_dev_arr
[idx_dev
].bus
== pbpctl_dev
->bus
)
4945 && (bpctl_dev_arr
[idx_dev
].slot
==
4946 pbpctl_dev
->slot
)) {
4947 if ((pbpctl_dev
->func
== 0)
4948 && (bpctl_dev_arr
[idx_dev
].func
== 1)) {
4950 &bpctl_dev_arr
[idx_dev
];
4953 if ((pbpctl_dev
->func
== 2) &&
4954 (bpctl_dev_arr
[idx_dev
].func
== 3)) {
4956 &bpctl_dev_arr
[idx_dev
];
4966 int is_bypass(bpctl_dev_t
*pbpctl_dev
)
4971 if ((pbpctl_dev
->func
== 0) || (pbpctl_dev
->func
== 2))
4977 int get_tx_fn(bpctl_dev_t
*pbpctl_dev
)
4979 bpctl_dev_t
*pbpctl_dev_b
= NULL
;
4983 if ((pbpctl_dev
->bp_caps
& TPL_CAP
) &&
4984 (pbpctl_dev
->bp_caps
& SW_CTL_CAP
)) {
4985 if ((pbpctl_dev
->bp_tpl_flag
))
4987 } else if ((pbpctl_dev_b
= get_master_port_fn(pbpctl_dev
))) {
4988 if ((pbpctl_dev_b
->bp_caps
& TPL_CAP
) &&
4989 (pbpctl_dev_b
->bp_tpl_flag
))
4992 return tx_status(pbpctl_dev
);
4995 int get_bp_force_link_fn(int dev_num
)
4997 static bpctl_dev_t
*bpctl_dev_curr
;
4999 if ((dev_num
< 0) || (dev_num
> device_num
)
5000 || (bpctl_dev_arr
[dev_num
].pdev
== NULL
))
5002 bpctl_dev_curr
= &bpctl_dev_arr
[dev_num
];
5004 return bp_force_link_status(bpctl_dev_curr
);
5007 static int get_bypass_link_status(bpctl_dev_t
*pbpctl_dev
)
5012 if (pbpctl_dev
->media_type
== bp_fiber
)
5013 return ((BPCTL_READ_REG(pbpctl_dev
, CTRL
) &
5014 BPCTLI_CTRL_SWDPIN1
));
5016 return ((BPCTL_READ_REG(pbpctl_dev
, STATUS
) &
5021 static void bp_tpl_timer_fn(unsigned long param
)
5023 bpctl_dev_t
*pbpctl_dev
= (bpctl_dev_t
*) param
;
5024 uint32_t link1
, link2
;
5025 bpctl_dev_t
*pbpctl_dev_b
= NULL
;
5027 if (!(pbpctl_dev_b
= get_status_port_fn(pbpctl_dev
)))
5030 if (!pbpctl_dev
->bp_tpl_flag
) {
5031 set_tx(pbpctl_dev_b
, 1);
5032 set_tx(pbpctl_dev
, 1);
5035 link1
= get_bypass_link_status(pbpctl_dev
);
5037 link2
= get_bypass_link_status(pbpctl_dev_b
);
5038 if ((link1
) && (tx_status(pbpctl_dev
))) {
5039 if ((!link2
) && (tx_status(pbpctl_dev_b
))) {
5040 set_tx(pbpctl_dev
, 0);
5041 } else if (!tx_status(pbpctl_dev_b
)) {
5042 set_tx(pbpctl_dev_b
, 1);
5044 } else if ((!link1
) && (tx_status(pbpctl_dev
))) {
5045 if ((link2
) && (tx_status(pbpctl_dev_b
))) {
5046 set_tx(pbpctl_dev_b
, 0);
5048 } else if ((link1
) && (!tx_status(pbpctl_dev
))) {
5049 if ((link2
) && (tx_status(pbpctl_dev_b
))) {
5050 set_tx(pbpctl_dev
, 1);
5052 } else if ((!link1
) && (!tx_status(pbpctl_dev
))) {
5053 if ((link2
) && (tx_status(pbpctl_dev_b
))) {
5054 set_tx(pbpctl_dev
, 1);
5058 mod_timer(&pbpctl_dev
->bp_tpl_timer
, jiffies
+ BP_LINK_MON_DELAY
* HZ
);
5061 void remove_bypass_tpl_auto(bpctl_dev_t
*pbpctl_dev
)
5063 bpctl_dev_t
*pbpctl_dev_b
= NULL
;
5066 pbpctl_dev_b
= get_status_port_fn(pbpctl_dev
);
5068 if (pbpctl_dev
->bp_caps
& TPL_CAP
) {
5069 del_timer_sync(&pbpctl_dev
->bp_tpl_timer
);
5070 pbpctl_dev
->bp_tpl_flag
= 0;
5071 pbpctl_dev_b
= get_status_port_fn(pbpctl_dev
);
5073 set_tx(pbpctl_dev_b
, 1);
5074 set_tx(pbpctl_dev
, 1);
5079 int init_bypass_tpl_auto(bpctl_dev_t
*pbpctl_dev
)
5083 if (pbpctl_dev
->bp_caps
& TPL_CAP
) {
5084 init_timer(&pbpctl_dev
->bp_tpl_timer
);
5085 pbpctl_dev
->bp_tpl_timer
.function
= &bp_tpl_timer_fn
;
5086 pbpctl_dev
->bp_tpl_timer
.data
= (unsigned long)pbpctl_dev
;
5092 int set_bypass_tpl_auto(bpctl_dev_t
*pbpctl_dev
, unsigned int param
)
5096 if (pbpctl_dev
->bp_caps
& TPL_CAP
) {
5097 if ((param
) && (!pbpctl_dev
->bp_tpl_flag
)) {
5098 pbpctl_dev
->bp_tpl_flag
= param
;
5099 mod_timer(&pbpctl_dev
->bp_tpl_timer
, jiffies
+ 1);
5102 if ((!param
) && (pbpctl_dev
->bp_tpl_flag
))
5103 remove_bypass_tpl_auto(pbpctl_dev
);
5110 int get_bypass_tpl_auto(bpctl_dev_t
*pbpctl_dev
)
5114 if (pbpctl_dev
->bp_caps
& TPL_CAP
) {
5115 return pbpctl_dev
->bp_tpl_flag
;
5120 int set_tpl_fn(bpctl_dev_t
*pbpctl_dev
, int tpl_mode
)
5123 bpctl_dev_t
*pbpctl_dev_b
= NULL
;
5127 pbpctl_dev_b
= get_status_port_fn(pbpctl_dev
);
5129 if (pbpctl_dev
->bp_caps
& TPL_CAP
) {
5131 if ((pbpctl_dev_b
= get_status_port_fn(pbpctl_dev
)))
5132 set_tx(pbpctl_dev_b
, 1);
5133 set_tx(pbpctl_dev
, 1);
5135 if ((TPL_IF_SERIES(pbpctl_dev
->subdevice
)) ||
5136 (pbpctl_dev
->bp_caps_ex
& TPL2_CAP_EX
)) {
5137 pbpctl_dev
->bp_tpl_flag
= tpl_mode
;
5139 tpl_hw_off(pbpctl_dev
);
5141 tpl_hw_on(pbpctl_dev
);
5143 set_bypass_tpl_auto(pbpctl_dev
, tpl_mode
);
5149 int get_tpl_fn(bpctl_dev_t
*pbpctl_dev
)
5151 int ret
= BP_NOT_CAP
;
5155 if (pbpctl_dev
->bp_caps
& TPL_CAP
) {
5156 if (pbpctl_dev
->bp_caps_ex
& TPL2_CAP_EX
)
5157 return tpl2_flag_status(pbpctl_dev
);
5158 ret
= pbpctl_dev
->bp_tpl_flag
;
5163 int set_bp_wait_at_pwup_fn(bpctl_dev_t
*pbpctl_dev
, int tap_mode
)
5168 if (pbpctl_dev
->bp_caps
& SW_CTL_CAP
) {
5169 /* bp_lock(pbp_device_block); */
5170 cmnd_on(pbpctl_dev
);
5172 bp_wait_at_pwup_dis(pbpctl_dev
);
5174 bp_wait_at_pwup_en(pbpctl_dev
);
5175 cmnd_off(pbpctl_dev
);
5177 /* bp_unlock(pbp_device_block); */
5183 int get_bp_wait_at_pwup_fn(bpctl_dev_t
*pbpctl_dev
)
5189 /* bp_lock(pbp_device_block); */
5190 ret
= bp_wait_at_pwup_status(pbpctl_dev
);
5191 /* bp_unlock(pbp_device_block); */
5196 int set_bp_hw_reset_fn(bpctl_dev_t
*pbpctl_dev
, int tap_mode
)
5201 if (pbpctl_dev
->bp_caps
& SW_CTL_CAP
) {
5202 /* bp_lock(pbp_device_block); */
5203 cmnd_on(pbpctl_dev
);
5206 bp_hw_reset_dis(pbpctl_dev
);
5208 bp_hw_reset_en(pbpctl_dev
);
5209 cmnd_off(pbpctl_dev
);
5210 /* bp_unlock(pbp_device_block); */
5216 int get_bp_hw_reset_fn(bpctl_dev_t
*pbpctl_dev
)
5222 /* bp_lock(pbp_device_block); */
5223 ret
= bp_hw_reset_status(pbpctl_dev
);
5225 /* bp_unlock(pbp_device_block); */
5231 int get_bypass_info_fn(bpctl_dev_t
*pbpctl_dev
, char *dev_name
,
5236 if (!is_bypass_fn(pbpctl_dev
))
5238 strcpy(dev_name
, pbpctl_dev
->name
);
5239 *add_param
= pbpctl_dev
->bp_fw_ver
;
5243 int get_dev_idx_bsf(int bus
, int slot
, int func
)
5247 ((bpctl_dev_arr
[idx_dev
].pdev
!= NULL
) && (idx_dev
< device_num
));
5249 if ((bus
== bpctl_dev_arr
[idx_dev
].bus
)
5250 && (slot
== bpctl_dev_arr
[idx_dev
].slot
)
5251 && (func
== bpctl_dev_arr
[idx_dev
].func
))
5258 static void str_low(char *str
)
5262 for (i
= 0; i
< strlen(str
); i
++)
5263 if ((str
[i
] >= 65) && (str
[i
] <= 90))
5267 static unsigned long str_to_hex(char *p
)
5269 unsigned long hex
= 0;
5270 unsigned long length
= strlen(p
), shift
= 0;
5271 unsigned char dig
= 0;
5281 dig
= dig
< 'a' ? (dig
- '0') : (dig
- 'a' + 0xa);
5282 hex
|= (dig
<< shift
);
5288 static int get_dev_idx(int ifindex
)
5293 ((bpctl_dev_arr
[idx_dev
].pdev
!= NULL
) && (idx_dev
< device_num
));
5295 if (ifindex
== bpctl_dev_arr
[idx_dev
].ifindex
)
5302 static bpctl_dev_t
*get_dev_idx_p(int ifindex
)
5307 ((bpctl_dev_arr
[idx_dev
].pdev
!= NULL
) && (idx_dev
< device_num
));
5309 if (ifindex
== bpctl_dev_arr
[idx_dev
].ifindex
)
5310 return &bpctl_dev_arr
[idx_dev
];
5316 static void if_scan_init(void)
5319 struct net_device
*dev
;
5321 /* rcu_read_lock(); */
5323 /* rcu_read_lock(); */
5325 for_each_netdev(&init_net
, dev
) {
5327 struct ethtool_drvinfo drvinfo
;
5332 int bus
= 0, slot
= 0, func
= 0;
5333 ifindex
= dev
->ifindex
;
5336 memset(&drvinfo
, 0, sizeof(struct ethtool_drvinfo
));
5338 if (dev
->ethtool_ops
&& dev
->ethtool_ops
->get_drvinfo
) {
5339 memset(&drvinfo
, 0, sizeof(drvinfo
));
5340 dev
->ethtool_ops
->get_drvinfo(dev
, &drvinfo
);
5343 if (!strcmp(drvinfo
.bus_info
, "N/A"))
5345 memcpy(&cbuf
, drvinfo
.bus_info
, 32);
5348 while (*buf
++ != ':') ;
5349 for (i
= 0; i
< 10; i
++, buf
++) {
5356 bus
= str_to_hex(res
);
5359 for (i
= 0; i
< 10; i
++, buf
++) {
5366 slot
= str_to_hex(res
);
5367 func
= str_to_hex(buf
);
5368 idx_dev
= get_dev_idx_bsf(bus
, slot
, func
);
5370 if (idx_dev
!= -1) {
5372 bpctl_dev_arr
[idx_dev
].ifindex
= ifindex
;
5373 bpctl_dev_arr
[idx_dev
].ndev
= dev
;
5378 /* rtnl_unlock(); */
5379 /* rcu_read_unlock(); */
5383 static long device_ioctl(struct file
*file
, /* see include/linux/fs.h */
5384 unsigned int ioctl_num
, /* number and param for ioctl */
5385 unsigned long ioctl_param
)
5387 struct bpctl_cmd bpctl_cmd
;
5389 bpctl_dev_t
*pbpctl_dev_out
;
5390 void __user
*argp
= (void __user
*)ioctl_param
;
5392 unsigned long flags
;
5394 static bpctl_dev_t
*pbpctl_dev
;
5396 /* lock_kernel(); */
5398 /* local_irq_save(flags); */
5399 /* if(!spin_trylock_irqsave(&bpvm_lock)){
5400 local_irq_restore(flags);
5405 /* spin_lock_irqsave(&bpvm_lock, flags); */
5408 * Switch according to the ioctl called
5410 if (ioctl_num
== IOCTL_TX_MSG(IF_SCAN
)) {
5415 if (copy_from_user(&bpctl_cmd
, argp
, sizeof(struct bpctl_cmd
))) {
5421 if (ioctl_num
== IOCTL_TX_MSG(GET_DEV_NUM
)) {
5422 bpctl_cmd
.out_param
[0] = device_num
;
5424 (argp
, (void *)&bpctl_cmd
, sizeof(struct bpctl_cmd
))) {
5433 /* preempt_disable(); */
5434 local_irq_save(flags
);
5435 if (!spin_trylock(&bpvm_lock
)) {
5436 local_irq_restore(flags
);
5441 /* preempt_disable();
5443 spin_lock_irqsave(&bpvm_lock, flags);
5445 if ((bpctl_cmd
.in_param
[5]) ||
5446 (bpctl_cmd
.in_param
[6]) || (bpctl_cmd
.in_param
[7]))
5447 dev_idx
= get_dev_idx_bsf(bpctl_cmd
.in_param
[5],
5448 bpctl_cmd
.in_param
[6],
5449 bpctl_cmd
.in_param
[7]);
5450 else if (bpctl_cmd
.in_param
[1] == 0)
5451 dev_idx
= bpctl_cmd
.in_param
[0];
5453 dev_idx
= get_dev_idx(bpctl_cmd
.in_param
[1]);
5455 if (dev_idx
< 0 || dev_idx
> device_num
) {
5457 preempt_enable(); */
5459 /* preempt_enable();
5460 rcu_read_unlock(); */
5461 spin_unlock_irqrestore(&bpvm_lock
, flags
);
5465 bpctl_cmd
.out_param
[0] = bpctl_dev_arr
[dev_idx
].bus
;
5466 bpctl_cmd
.out_param
[1] = bpctl_dev_arr
[dev_idx
].slot
;
5467 bpctl_cmd
.out_param
[2] = bpctl_dev_arr
[dev_idx
].func
;
5468 bpctl_cmd
.out_param
[3] = bpctl_dev_arr
[dev_idx
].ifindex
;
5470 if ((bpctl_dev_arr
[dev_idx
].bp_10gb
)
5471 && (!(bpctl_dev_arr
[dev_idx
].ifindex
))) {
5472 printk("Please load network driver for %s adapter!\n",
5473 bpctl_dev_arr
[dev_idx
].name
);
5474 bpctl_cmd
.status
= -1;
5476 /* preempt_enable(); */
5477 /* rcu_read_unlock(); */
5478 spin_unlock_irqrestore(&bpvm_lock
, flags
);
5482 if ((bpctl_dev_arr
[dev_idx
].bp_10gb
) && (bpctl_dev_arr
[dev_idx
].ndev
)) {
5483 if (!(bpctl_dev_arr
[dev_idx
].ndev
->flags
& IFF_UP
)) {
5484 if (!(bpctl_dev_arr
[dev_idx
].ndev
->flags
& IFF_UP
)) {
5486 ("Please bring up network interfaces for %s adapter!\n",
5487 bpctl_dev_arr
[dev_idx
].name
);
5488 bpctl_cmd
.status
= -1;
5490 /* preempt_enable(); */
5491 /* rcu_read_unlock(); */
5492 spin_unlock_irqrestore(&bpvm_lock
, flags
);
5499 if ((dev_idx
< 0) || (dev_idx
> device_num
)
5500 || (bpctl_dev_arr
[dev_idx
].pdev
== NULL
)) {
5501 bpctl_cmd
.status
= -1;
5505 pbpctl_dev
= &bpctl_dev_arr
[dev_idx
];
5507 switch (ioctl_num
) {
5508 case IOCTL_TX_MSG(SET_BYPASS_PWOFF
):
5510 set_bypass_pwoff_fn(pbpctl_dev
, bpctl_cmd
.in_param
[2]);
5513 case IOCTL_TX_MSG(GET_BYPASS_PWOFF
):
5514 bpctl_cmd
.status
= get_bypass_pwoff_fn(pbpctl_dev
);
5517 case IOCTL_TX_MSG(SET_BYPASS_PWUP
):
5519 set_bypass_pwup_fn(pbpctl_dev
, bpctl_cmd
.in_param
[2]);
5522 case IOCTL_TX_MSG(GET_BYPASS_PWUP
):
5523 bpctl_cmd
.status
= get_bypass_pwup_fn(pbpctl_dev
);
5526 case IOCTL_TX_MSG(SET_BYPASS_WD
):
5528 set_bypass_wd_fn(pbpctl_dev
, bpctl_cmd
.in_param
[2]);
5531 case IOCTL_TX_MSG(GET_BYPASS_WD
):
5533 get_bypass_wd_fn(pbpctl_dev
, (int *)&(bpctl_cmd
.data
[0]));
5536 case IOCTL_TX_MSG(GET_WD_EXPIRE_TIME
):
5538 get_wd_expire_time_fn(pbpctl_dev
,
5539 (int *)&(bpctl_cmd
.data
[0]));
5542 case IOCTL_TX_MSG(RESET_BYPASS_WD_TIMER
):
5543 bpctl_cmd
.status
= reset_bypass_wd_timer_fn(pbpctl_dev
);
5546 case IOCTL_TX_MSG(GET_WD_SET_CAPS
):
5547 bpctl_cmd
.status
= get_wd_set_caps_fn(pbpctl_dev
);
5550 case IOCTL_TX_MSG(SET_STD_NIC
):
5552 set_std_nic_fn(pbpctl_dev
, bpctl_cmd
.in_param
[2]);
5555 case IOCTL_TX_MSG(GET_STD_NIC
):
5556 bpctl_cmd
.status
= get_std_nic_fn(pbpctl_dev
);
5559 case IOCTL_TX_MSG(SET_TAP
):
5561 set_tap_fn(pbpctl_dev
, bpctl_cmd
.in_param
[2]);
5564 case IOCTL_TX_MSG(GET_TAP
):
5565 bpctl_cmd
.status
= get_tap_fn(pbpctl_dev
);
5568 case IOCTL_TX_MSG(GET_TAP_CHANGE
):
5569 bpctl_cmd
.status
= get_tap_change_fn(pbpctl_dev
);
5572 case IOCTL_TX_MSG(SET_DIS_TAP
):
5574 set_dis_tap_fn(pbpctl_dev
, bpctl_cmd
.in_param
[2]);
5577 case IOCTL_TX_MSG(GET_DIS_TAP
):
5578 bpctl_cmd
.status
= get_dis_tap_fn(pbpctl_dev
);
5581 case IOCTL_TX_MSG(SET_TAP_PWUP
):
5583 set_tap_pwup_fn(pbpctl_dev
, bpctl_cmd
.in_param
[2]);
5586 case IOCTL_TX_MSG(GET_TAP_PWUP
):
5587 bpctl_cmd
.status
= get_tap_pwup_fn(pbpctl_dev
);
5590 case IOCTL_TX_MSG(SET_WD_EXP_MODE
):
5592 set_wd_exp_mode_fn(pbpctl_dev
, bpctl_cmd
.in_param
[2]);
5595 case IOCTL_TX_MSG(GET_WD_EXP_MODE
):
5596 bpctl_cmd
.status
= get_wd_exp_mode_fn(pbpctl_dev
);
5599 case IOCTL_TX_MSG(GET_DIS_BYPASS
):
5600 bpctl_cmd
.status
= get_dis_bypass_fn(pbpctl_dev
);
5603 case IOCTL_TX_MSG(SET_DIS_BYPASS
):
5605 set_dis_bypass_fn(pbpctl_dev
, bpctl_cmd
.in_param
[2]);
5608 case IOCTL_TX_MSG(GET_BYPASS_CHANGE
):
5609 bpctl_cmd
.status
= get_bypass_change_fn(pbpctl_dev
);
5612 case IOCTL_TX_MSG(GET_BYPASS
):
5613 bpctl_cmd
.status
= get_bypass_fn(pbpctl_dev
);
5616 case IOCTL_TX_MSG(SET_BYPASS
):
5618 set_bypass_fn(pbpctl_dev
, bpctl_cmd
.in_param
[2]);
5621 case IOCTL_TX_MSG(GET_BYPASS_CAPS
):
5622 bpctl_cmd
.status
= get_bypass_caps_fn(pbpctl_dev
);
5623 /*preempt_enable(); */
5624 /*rcu_read_unlock();*/
5625 spin_unlock_irqrestore(&bpvm_lock
, flags
);
5627 (argp
, (void *)&bpctl_cmd
, sizeof(struct bpctl_cmd
))) {
5628 /*unlock_bpctl(); */
5629 /*preempt_enable(); */
5635 case IOCTL_TX_MSG(GET_BYPASS_SLAVE
):
5637 get_bypass_slave_fn(pbpctl_dev
, &pbpctl_dev_out
);
5638 if (bpctl_cmd
.status
== 1) {
5639 bpctl_cmd
.out_param
[4] = pbpctl_dev_out
->bus
;
5640 bpctl_cmd
.out_param
[5] = pbpctl_dev_out
->slot
;
5641 bpctl_cmd
.out_param
[6] = pbpctl_dev_out
->func
;
5642 bpctl_cmd
.out_param
[7] = pbpctl_dev_out
->ifindex
;
5646 case IOCTL_TX_MSG(IS_BYPASS
):
5647 bpctl_cmd
.status
= is_bypass(pbpctl_dev
);
5649 case IOCTL_TX_MSG(SET_TX
):
5650 bpctl_cmd
.status
= set_tx_fn(pbpctl_dev
, bpctl_cmd
.in_param
[2]);
5652 case IOCTL_TX_MSG(GET_TX
):
5653 bpctl_cmd
.status
= get_tx_fn(pbpctl_dev
);
5655 case IOCTL_TX_MSG(SET_WD_AUTORESET
):
5657 set_wd_autoreset_fn(pbpctl_dev
, bpctl_cmd
.in_param
[2]);
5660 case IOCTL_TX_MSG(GET_WD_AUTORESET
):
5662 bpctl_cmd
.status
= get_wd_autoreset_fn(pbpctl_dev
);
5664 case IOCTL_TX_MSG(SET_DISC
):
5666 set_disc_fn(pbpctl_dev
, bpctl_cmd
.in_param
[2]);
5668 case IOCTL_TX_MSG(GET_DISC
):
5669 bpctl_cmd
.status
= get_disc_fn(pbpctl_dev
);
5671 case IOCTL_TX_MSG(GET_DISC_CHANGE
):
5672 bpctl_cmd
.status
= get_disc_change_fn(pbpctl_dev
);
5674 case IOCTL_TX_MSG(SET_DIS_DISC
):
5676 set_dis_disc_fn(pbpctl_dev
, bpctl_cmd
.in_param
[2]);
5678 case IOCTL_TX_MSG(GET_DIS_DISC
):
5679 bpctl_cmd
.status
= get_dis_disc_fn(pbpctl_dev
);
5681 case IOCTL_TX_MSG(SET_DISC_PWUP
):
5683 set_disc_pwup_fn(pbpctl_dev
, bpctl_cmd
.in_param
[2]);
5685 case IOCTL_TX_MSG(GET_DISC_PWUP
):
5686 bpctl_cmd
.status
= get_disc_pwup_fn(pbpctl_dev
);
5689 case IOCTL_TX_MSG(GET_BYPASS_INFO
):
5692 get_bypass_info_fn(pbpctl_dev
, (char *)&bpctl_cmd
.data
,
5693 (char *)&bpctl_cmd
.out_param
[4]);
5696 case IOCTL_TX_MSG(SET_TPL
):
5698 set_tpl_fn(pbpctl_dev
, bpctl_cmd
.in_param
[2]);
5701 case IOCTL_TX_MSG(GET_TPL
):
5702 bpctl_cmd
.status
= get_tpl_fn(pbpctl_dev
);
5704 case IOCTL_TX_MSG(SET_BP_WAIT_AT_PWUP
):
5706 set_bp_wait_at_pwup_fn(pbpctl_dev
, bpctl_cmd
.in_param
[2]);
5709 case IOCTL_TX_MSG(GET_BP_WAIT_AT_PWUP
):
5710 bpctl_cmd
.status
= get_bp_wait_at_pwup_fn(pbpctl_dev
);
5712 case IOCTL_TX_MSG(SET_BP_HW_RESET
):
5714 set_bp_hw_reset_fn(pbpctl_dev
, bpctl_cmd
.in_param
[2]);
5717 case IOCTL_TX_MSG(GET_BP_HW_RESET
):
5718 bpctl_cmd
.status
= get_bp_hw_reset_fn(pbpctl_dev
);
5721 case IOCTL_TX_MSG(SET_BP_SELF_TEST
):
5723 set_bp_self_test_fn(pbpctl_dev
, bpctl_cmd
.in_param
[2]);
5726 case IOCTL_TX_MSG(GET_BP_SELF_TEST
):
5727 bpctl_cmd
.status
= get_bp_self_test_fn(pbpctl_dev
);
5732 case IOCTL_TX_MSG(SET_DISC_PORT
):
5734 set_disc_port_fn(pbpctl_dev
, bpctl_cmd
.in_param
[2]);
5737 case IOCTL_TX_MSG(GET_DISC_PORT
):
5738 bpctl_cmd
.status
= get_disc_port_fn(pbpctl_dev
);
5741 case IOCTL_TX_MSG(SET_DISC_PORT_PWUP
):
5743 set_disc_port_pwup_fn(pbpctl_dev
, bpctl_cmd
.in_param
[2]);
5746 case IOCTL_TX_MSG(GET_DISC_PORT_PWUP
):
5747 bpctl_cmd
.status
= get_disc_port_pwup_fn(pbpctl_dev
);
5750 case IOCTL_TX_MSG(SET_BP_FORCE_LINK
):
5752 set_bp_force_link_fn(dev_idx
, bpctl_cmd
.in_param
[2]);
5755 case IOCTL_TX_MSG(GET_BP_FORCE_LINK
):
5756 bpctl_cmd
.status
= get_bp_force_link_fn(dev_idx
);
5760 /* unlock_bpctl(); */
5763 /* preempt_enable(); */
5764 /* rcu_read_unlock();*/
5765 spin_unlock_irqrestore(&bpvm_lock
, flags
);
5768 /* unlock_bpctl(); */
5769 /* preempt_enable(); */
5771 /* rcu_read_unlock(); */
5772 spin_unlock_irqrestore(&bpvm_lock
, flags
);
5773 if (copy_to_user(argp
, (void *)&bpctl_cmd
, sizeof(struct bpctl_cmd
)))
5777 /* unlock_kernel(); */
5778 /* spin_unlock_irqrestore(&bpvm_lock, flags); */
5780 /* unlock_kernel(); */
5784 static const struct file_operations Fops
= {
5785 .owner
= THIS_MODULE
,
5786 .unlocked_ioctl
= device_ioctl
,
5790 #define PCI_DEVICE(vend,dev) \
5791 .vendor = (vend), .device = (dev), \
5792 .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID
5795 #define SILICOM_E1000BP_ETHERNET_DEVICE(device_id) {\
5796 PCI_DEVICE(SILICOM_VID, device_id)}
5958 typedef struct _bpmod_info_t
{
5959 unsigned int vendor
;
5960 unsigned int device
;
5961 unsigned int subvendor
;
5962 unsigned int subdevice
;
5968 typedef struct _dev_desc
{
5972 dev_desc_t dev_desc
[] = {
5973 {"Silicom Bypass PXG2BPFI-SD series adapter"},
5974 {"Silicom Bypass PXG2BPFIL-SD series adapter"},
5975 {"Silicom Bypass PXG2BPFILX-SD series adapter"},
5976 {"Silicom Bypass PXG2BPFILLX-SD series adapter"},
5977 {"Silicom Bypass PXG2BPI-SD series adapter"},
5978 {"Silicom Bypass PXG2BPIG-SD series adapter"},
5979 {"Silicom Bypass PXG2TBFI-SD series adapter"},
5980 {"Silicom Bypass PXG4BPI-SD series adapter"},
5981 {"Silicom Bypass PXG4BPFI-SD series adapter"},
5982 {"Silicom Bypass PEG4BPI-SD series adapter"},
5983 {"Silicom Bypass PEG2BPI-SD series adapter"},
5984 {"Silicom Bypass PEG4BPIN-SD series adapter"},
5985 {"Silicom Bypass PEG2BPFI-SD series adapter"},
5986 {"Silicom Bypass PEG2BPFI-LX-SD series adapter"},
5987 {"Silicom Bypass PMCX2BPFI-SD series adapter"},
5988 {"Silicom Bypass PMCX2BPFI-N series adapter"},
5989 {"Intel Bypass PEG2BPII series adapter"},
5990 {"Intel Bypass PEG2BPFII series adapter"},
5991 {"Silicom Bypass PXG4BPFILX-SD series adapter"},
5992 {"Silicom Bypass PMCX2BPI-N series adapter"},
5993 {"Silicom Bypass PMCX4BPI-N series adapter"},
5994 {"Silicom Bypass PXG2BISC1-SD series adapter"},
5995 {"Silicom Bypass PEG2TBFI-SD series adapter"},
5996 {"Silicom Bypass PXG2TBI-SD series adapter"},
5997 {"Silicom Bypass PXG4BPFID-SD series adapter"},
5998 {"Silicom Bypass PEG4BPFI-SD series adapter"},
5999 {"Silicom Bypass PEG4BPIPT-SD series adapter"},
6000 {"Silicom Bypass PXG6BPI-SD series adapter"},
6001 {"Silicom Bypass PEG4BPIL-SD series adapter"},
6002 {"Silicom Bypass PMCX2BPI-N2 series adapter"},
6003 {"Silicom Bypass PMCX4BPI-N2 series adapter"},
6004 {"Silicom Bypass PMCX2BPI-SD series adapter"},
6005 {"Silicom Bypass PEG2BPFID-SD series adapter"},
6006 {"Silicom Bypass PEG2BPFIDLX-SD series adapter"},
6007 {"Silicom Bypass PMCX4BPI-SD series adapter"},
6008 {"Silicom Bypass MEG2BPFILN-SD series adapter"},
6009 {"Silicom Bypass MEG2BPFINX-SD series adapter"},
6010 {"Silicom Bypass PEG4BPFILX-SD series adapter"},
6011 {"Silicom Bypass PE10G2BPISR-SD series adapter"},
6012 {"Silicom Bypass PE10G2BPILR-SD series adapter"},
6013 {"Silicom Bypass MHIO8AD-SD series adapter"},
6014 {"Silicom Bypass PE10G2BPICX4-SD series adapter"},
6015 {"Silicom Bypass PEG2BPI5-SD series adapter"},
6016 {"Silicom Bypass PEG6BPI5-SD series adapter"},
6017 {"Silicom Bypass PEG4BPFI5-SD series adapter"},
6018 {"Silicom Bypass PEG4BPFI5LX-SD series adapter"},
6019 {"Silicom Bypass MEG2BPFILXLN-SD series adapter"},
6020 {"Silicom Bypass PEG2BPIX1-SD series adapter"},
6021 {"Silicom Bypass MEG2BPFILXNX-SD series adapter"},
6022 {"Silicom Bypass XE10G2BPIT-SD series adapter"},
6023 {"Silicom Bypass XE10G2BPICX4-SD series adapter"},
6024 {"Silicom Bypass XE10G2BPISR-SD series adapter"},
6025 {"Silicom Bypass XE10G2BPILR-SD series adapter"},
6026 {"Intel Bypass PEG2BPFII0 series adapter"},
6027 {"Silicom Bypass XE10G2BPIXR series adapter"},
6028 {"Silicom Bypass PE10G2DBISR series adapter"},
6029 {"Silicom Bypass PEG2BI5SC6 series adapter"},
6030 {"Silicom Bypass PEG6BPI5FC series adapter"},
6032 {"Silicom Bypass PE10G2BPTCX4 series adapter"},
6033 {"Silicom Bypass PE10G2BPTSR series adapter"},
6034 {"Silicom Bypass PE10G2BPTLR series adapter"},
6035 {"Silicom Bypass PE10G2BPTT series adapter"},
6036 {"Silicom Bypass PEG4BPI6 series adapter"},
6037 {"Silicom Bypass PEG4BPFI6 series adapter"},
6038 {"Silicom Bypass PEG4BPFI6LX series adapter"},
6039 {"Silicom Bypass PEG4BPFI6ZX series adapter"},
6040 {"Silicom Bypass PEG2BPI6 series adapter"},
6041 {"Silicom Bypass PEG2BPFI6 series adapter"},
6042 {"Silicom Bypass PEG2BPFI6LX series adapter"},
6043 {"Silicom Bypass PEG2BPFI6ZX series adapter"},
6044 {"Silicom Bypass PEG2BPFI6FLXM series adapter"},
6045 {"Silicom Bypass PEG4BPI6FC series adapter"},
6046 {"Silicom Bypass PEG4BPFI6FC series adapter"},
6047 {"Silicom Bypass PEG4BPFI6FCLX series adapter"},
6048 {"Silicom Bypass PEG4BPFI6FCZX series adapter"},
6049 {"Silicom Bypass PEG6BPI6 series adapter"},
6050 {"Silicom Bypass PEG2BPI6SC6 series adapter"},
6051 {"Silicom Bypass MEG2BPI6 series adapter"},
6052 {"Silicom Bypass XEG2BPI6 series adapter"},
6053 {"Silicom Bypass MEG4BPI6 series adapter"},
6054 {"Silicom Bypass PEG2BPFI5-SD series adapter"},
6055 {"Silicom Bypass PEG2BPFI5LX-SD series adapter"},
6056 {"Silicom Bypass PXEG4BPFI-SD series adapter"},
6057 {"Silicom Bypass MxEG2BPI6 series adapter"},
6058 {"Silicom Bypass MxEG2BPFI6 series adapter"},
6059 {"Silicom Bypass MxEG2BPFI6LX series adapter"},
6060 {"Silicom Bypass MxEG2BPFI6ZX series adapter"},
6061 {"Silicom Bypass MxEG4BPI6 series adapter"},
6062 {"Silicom Bypass MxEG4BPFI6 series adapter"},
6063 {"Silicom Bypass MxEG4BPFI6LX series adapter"},
6064 {"Silicom Bypass MxEG4BPFI6ZX series adapter"},
6065 {"Silicom Bypass MxEG6BPI6 series adapter"},
6066 {"Silicom Bypass MxE2G4BPi80 series adapter"},
6067 {"Silicom Bypass MxE2G4BPFi80 series adapter"},
6068 {"Silicom Bypass MxE2G4BPFi80LX series adapter"},
6069 {"Silicom Bypass MxE2G4BPFi80ZX series adapter"},
6071 {"Silicom Bypass PE210G2SPI9 series adapter"},
6073 {"Silicom Bypass MxE210G2BPI9CX4 series adapter"},
6074 {"Silicom Bypass MxE210G2BPI9SR series adapter"},
6075 {"Silicom Bypass MxE210G2BPI9LR series adapter"},
6076 {"Silicom Bypass MxE210G2BPI9T series adapter"},
6078 {"Silicom Bypass PE210G2BPI9CX4 series adapter"},
6079 {"Silicom Bypass PE210G2BPI9SR series adapter"},
6080 {"Silicom Bypass PE210G2BPI9LR series adapter"},
6081 {"Silicom Bypass PE210G2BPI9T series adapter"},
6083 {"Silicom Bypass M2EG2BPFI6 series adapter"},
6084 {"Silicom Bypass M2EG2BPFI6LX series adapter"},
6085 {"Silicom Bypass M2EG2BPFI6ZX series adapter"},
6086 {"Silicom Bypass M2EG4BPI6 series adapter"},
6087 {"Silicom Bypass M2EG4BPFI6 series adapter"},
6088 {"Silicom Bypass M2EG4BPFI6LX series adapter"},
6089 {"Silicom Bypass M2EG4BPFI6ZX series adapter"},
6090 {"Silicom Bypass M2EG6BPI6 series adapter"},
6092 {"Silicom Bypass PEG2DBI6 series adapter"},
6093 {"Silicom Bypass PEG2DBFI6 series adapter"},
6094 {"Silicom Bypass PEG2DBFI6LX series adapter"},
6095 {"Silicom Bypass PEG2DBFI6ZX series adapter"},
6097 {"Silicom Bypass PE2G4BPi80 series adapter"},
6098 {"Silicom Bypass PE2G4BPFi80 series adapter"},
6099 {"Silicom Bypass PE2G4BPFi80LX series adapter"},
6100 {"Silicom Bypass PE2G4BPFi80ZX series adapter"},
6102 {"Silicom Bypass PE2G4BPi80L series adapter"},
6103 {"Silicom Bypass MxE2G8BPi80A series adapter"},
6105 {"Silicom Bypass PE2G2BPi35 series adapter"},
6106 {"Silicom Bypass PAC1200BPi35 series adapter"},
6107 {"Silicom Bypass PE2G2BPFi35 series adapter"},
6108 {"Silicom Bypass PE2G2BPFi35LX series adapter"},
6109 {"Silicom Bypass PE2G2BPFi35ZX series adapter"},
6111 {"Silicom Bypass PE2G4BPi35 series adapter"},
6112 {"Silicom Bypass PE2G4BPi35L series adapter"},
6113 {"Silicom Bypass PE2G4BPFi35 series adapter"},
6114 {"Silicom Bypass PE2G4BPFi35LX series adapter"},
6115 {"Silicom Bypass PE2G4BPFi35ZX series adapter"},
6117 {"Silicom Bypass PE2G6BPi35 series adapter"},
6118 {"Silicom Bypass PE2G6BPi35CX series adapter"},
6120 {"Silicom Bypass PE2G2BPi80 series adapter"},
6121 {"Silicom Bypass PE2G2BPFi80 series adapter"},
6122 {"Silicom Bypass PE2G2BPFi80LX series adapter"},
6123 {"Silicom Bypass PE2G2BPFi80ZX series adapter"},
6125 {"Silicom Bypass M2E10G2BPI9CX4 series adapter"},
6126 {"Silicom Bypass M2E10G2BPI9SR series adapter"},
6127 {"Silicom Bypass M2E10G2BPI9LR series adapter"},
6128 {"Silicom Bypass M2E10G2BPI9T series adapter"},
6129 {"Silicom Bypass MxE2G8BPi80 series adapter"},
6130 {"Silicom Bypass PE210G2DBi9SR series adapter"},
6131 {"Silicom Bypass PE210G2DBi9SRRB series adapter"},
6132 {"Silicom Bypass PE210G2DBi9LR series adapter"},
6133 {"Silicom Bypass PE210G2DBi9LRRB series adapter"},
6134 {"Silicom Bypass PE310G4DBi9-SR series adapter"},
6135 {"Silicom Bypass PE310G4BPi9T series adapter"},
6136 {"Silicom Bypass PE310G4BPi9SR series adapter"},
6137 {"Silicom Bypass PE310G4BPi9LR series adapter"},
6138 {"Silicom Bypass PE210G2BPi40T series adapter"},
6142 static bpmod_info_t tx_ctl_pci_tbl
[] = {
6143 {0x8086, 0x107a, SILICOM_SVID
, SILICOM_PXG2BPFI_SSID
, PXG2BPFI
,
6145 {0x8086, 0x107a, SILICOM_SVID
, SILICOM_PXG2BPFIL_SSID
, PXG2BPFIL
,
6147 {0x8086, 0x107a, SILICOM_SVID
, SILICOM_PXG2BPFILX_SSID
, PXG2BPFILX
,
6149 {0x8086, 0x107a, SILICOM_SVID
, SILICOM_PXG2BPFILLX_SSID
, PXG2BPFILLX
,
6151 {0x8086, 0x1010, SILICOM_SVID
, SILICOM_PXGBPI_SSID
, PXGBPI
,
6153 {0x8086, 0x1079, SILICOM_SVID
, SILICOM_PXGBPIG_SSID
, PXGBPIG
,
6155 {0x8086, 0x107a, SILICOM_SVID
, SILICOM_PXG2TBFI_SSID
, PXG2TBFI
,
6157 {0x8086, 0x1079, SILICOM_SVID
, SILICOM_PXG4BPI_SSID
, PXG4BPI
,
6159 {0x8086, 0x107a, SILICOM_SVID
, SILICOM_PXG4BPFI_SSID
, PXG4BPFI
,
6161 {0x8086, 0x107a, SILICOM_SVID
, SILICOM_PXG4BPFILX_SSID
, PXG4BPFILX
,
6163 {0x8086, 0x1079, SILICOM_SVID
, SILICOM_PEG4BPI_SSID
, PEG4BPI
,
6165 {0x8086, 0x105e, SILICOM_SVID
, SILICOM_PEG2BPI_SSID
, PEG2BPI
,
6167 {0x8086, 0x105e, SILICOM_SVID
, SILICOM_PEG4BPIN_SSID
, PEG4BPIN
,
6169 {0x8086, 0x105f, SILICOM_SVID
, SILICOM_PEG2BPFI_SSID
, PEG2BPFI
,
6171 {0x8086, 0x105f, SILICOM_SVID
, SILICOM_PEG2BPFILX_SSID
, PEG2BPFILX
,
6173 {0x8086, 0x107a, SILICOM_SVID
, SILICOM_PMCXG2BPFI_SSID
, PMCXG2BPFI
,
6175 {0x8086, 0x107a, NOKIA_PMCXG2BPFIN_SVID
, NOKIA_PMCXG2BPFIN_SSID
,
6176 PMCXG2BPFIN
, "PMCX2BPFI-N"},
6177 {0x8086, INTEL_PEG4BPII_PID
, 0x8086, INTEL_PEG4BPII_SSID
, PEG4BPII
,
6179 {0x8086, INTEL_PEG4BPIIO_PID
, 0x8086, INTEL_PEG4BPIIO_SSID
, PEG4BPIIO
,
6181 {0x8086, INTEL_PEG4BPFII_PID
, 0x8086, INTEL_PEG4BPFII_SSID
, PEG4BPFII
,
6183 {0x8086, 0x1079, NOKIA_PMCXG2BPFIN_SVID
, NOKIA_PMCXG2BPIN_SSID
,
6184 PMCXG2BPIN
, "PMCX2BPI-N"},
6185 {0x8086, 0x1079, NOKIA_PMCXG2BPFIN_SVID
, NOKIA_PMCXG4BPIN_SSID
,
6186 PMCXG4BPIN
, "PMCX4BPI-N"},
6187 {0x8086, 0x1079, SILICOM_SVID
, SILICOM_PXG2BISC1_SSID
, PXG2BISC1
,
6189 {0x8086, 0x105f, SILICOM_SVID
, SILICOM_PEG2TBFI_SSID
, PEG2TBFI
,
6191 {0x8086, 0x1079, SILICOM_SVID
, SILICOM_PXG2TBI_SSID
, PXG2TBI
,
6193 {0x8086, 0x107a, SILICOM_SVID
, SILICOM_PXG4BPFID_SSID
, PXG4BPFID
,
6195 {0x8086, 0x105f, SILICOM_SVID
, SILICOM_PEG4BPFI_SSID
, PEG4BPFI
,
6197 {0x8086, 0x105e, SILICOM_SVID
, SILICOM_PEG4BPIPT_SSID
, PEG4BPIPT
,
6199 {0x8086, 0x1079, SILICOM_SVID
, SILICOM_PXG6BPI_SSID
, PXG6BPI
,
6201 {0x8086, 0x10a7, SILICOM_SVID
/*PCI_ANY_ID */ ,
6202 SILICOM_PEG4BPIL_SSID
/*PCI_ANY_ID */ , PEG4BPIL
, "PEG4BPIL-SD"},
6203 {0x8086, 0x1079, NOKIA_PMCXG2BPFIN_SVID
, NOKIA_PMCXG2BPIN2_SSID
,
6204 PMCXG2BPIN2
, "PMCX2BPI-N2"},
6205 {0x8086, 0x1079, NOKIA_PMCXG2BPFIN_SVID
, NOKIA_PMCXG4BPIN2_SSID
,
6206 PMCXG4BPIN2
, "PMCX4BPI-N2"},
6207 {0x8086, 0x1079, SILICOM_SVID
, SILICOM_PMCX2BPI_SSID
, PMCX2BPI
,
6209 {0x8086, 0x1079, SILICOM_SVID
, SILICOM_PMCX4BPI_SSID
, PMCX4BPI
,
6211 {0x8086, 0x105f, SILICOM_SVID
, SILICOM_PEG2BPFID_SSID
, PEG2BPFID
,
6213 {0x8086, 0x105f, SILICOM_SVID
, SILICOM_PEG2BPFIDLX_SSID
, PEG2BPFIDLX
,
6215 {0x8086, 0x105f, SILICOM_SVID
, SILICOM_MEG2BPFILN_SSID
, MEG2BPFILN
,
6217 {0x8086, 0x105f, SILICOM_SVID
, SILICOM_MEG2BPFINX_SSID
, MEG2BPFINX
,
6219 {0x8086, 0x105f, SILICOM_SVID
, SILICOM_PEG4BPFILX_SSID
, PEG4BPFILX
,
6221 {0x8086, PCI_ANY_ID
, SILICOM_SVID
, SILICOM_PE10G2BPISR_SSID
,
6222 PE10G2BPISR
, "PE10G2BPISR"},
6223 {0x8086, PCI_ANY_ID
, SILICOM_SVID
, SILICOM_PE10G2BPILR_SSID
,
6224 PE10G2BPILR
, "PE10G2BPILR"},
6225 {0x8086, 0x10a9, SILICOM_SVID
, SILICOM_MHIO8AD_SSID
, MHIO8AD
,
6227 {0x8086, PCI_ANY_ID
, SILICOM_SVID
, SILICOM_PE10G2BPICX4_SSID
,
6228 PE10G2BPISR
, "PE10G2BPICX4"},
6229 {0x8086, 0x10a7, SILICOM_SVID
/*PCI_ANY_ID */ ,
6230 SILICOM_PEG2BPI5_SSID
/*PCI_ANY_ID */ , PEG2BPI5
, "PEG2BPI5-SD"},
6231 {0x8086, 0x10a7, SILICOM_SVID
/*PCI_ANY_ID */ ,
6232 SILICOM_PEG6BPI_SSID
/*PCI_ANY_ID */ , PEG6BPI
, "PEG6BPI5"},
6233 {0x8086, 0x10a9, SILICOM_SVID
/*PCI_ANY_ID */ , SILICOM_PEG4BPFI5_SSID
,
6234 PEG4BPFI5
, "PEG4BPFI5"},
6235 {0x8086, 0x10a9, SILICOM_SVID
/*PCI_ANY_ID */ ,
6236 SILICOM_PEG4BPFI5LX_SSID
, PEG4BPFI5LX
, "PEG4BPFI5LX"},
6237 {0x8086, 0x105f, SILICOM_SVID
, SILICOM_MEG2BPFILXLN_SSID
, MEG2BPFILXLN
,
6239 {0x8086, 0x105e, SILICOM_SVID
, SILICOM_PEG2BPIX1_SSID
, PEG2BPIX1
,
6241 {0x8086, 0x105f, SILICOM_SVID
, SILICOM_MEG2BPFILXNX_SSID
, MEG2BPFILXNX
,
6243 {0x8086, PCI_ANY_ID
, SILICOM_SVID
, SILICOM_XE10G2BPIT_SSID
, XE10G2BPIT
,
6245 {0x8086, PCI_ANY_ID
, SILICOM_SVID
, SILICOM_XE10G2BPICX4_SSID
,
6246 XE10G2BPICX4
, "XE10G2BPICX4"},
6247 {0x8086, 0x10C6, SILICOM_SVID
, SILICOM_XE10G2BPISR_SSID
, XE10G2BPISR
,
6249 {0x8086, 0x10C6, SILICOM_SVID
, SILICOM_XE10G2BPILR_SSID
, XE10G2BPILR
,
6251 {0x8086, 0x10C6, NOKIA_XE10G2BPIXR_SVID
, NOKIA_XE10G2BPIXR_SSID
,
6252 XE10G2BPIXR
, "XE10G2BPIXR"},
6253 {0x8086, 0x10C6, SILICOM_SVID
, SILICOM_PE10GDBISR_SSID
, PE10GDBISR
,
6255 {0x8086, 0x10C6, SILICOM_SVID
, SILICOM_PE10GDBILR_SSID
, PE10GDBILR
,
6257 {0x8086, 0x10a7, SILICOM_SVID
/*PCI_ANY_ID */ ,
6258 SILICOM_PEG2BISC6_SSID
/*PCI_ANY_ID */ , PEG2BISC6
, "PEG2BI5SC6"},
6259 {0x8086, 0x10a7, SILICOM_SVID
/*PCI_ANY_ID */ ,
6260 SILICOM_PEG6BPIFC_SSID
/*PCI_ANY_ID */ , PEG6BPIFC
, "PEG6BPI5FC"},
6262 {BROADCOM_VID
, BROADCOM_PE10G2_PID
, SILICOM_SVID
,
6263 SILICOM_PE10G2BPTCX4_SSID
, PE10G2BPTCX4
, "PE10G2BPTCX4"},
6264 {BROADCOM_VID
, BROADCOM_PE10G2_PID
, SILICOM_SVID
,
6265 SILICOM_PE10G2BPTSR_SSID
, PE10G2BPTSR
, "PE10G2BPTSR"},
6266 {BROADCOM_VID
, BROADCOM_PE10G2_PID
, SILICOM_SVID
,
6267 SILICOM_PE10G2BPTLR_SSID
, PE10G2BPTLR
, "PE10G2BPTLR"},
6268 {BROADCOM_VID
, BROADCOM_PE10G2_PID
, SILICOM_SVID
,
6269 SILICOM_PE10G2BPTT_SSID
, PE10G2BPTT
, "PE10G2BPTT"},
6271 /* {BROADCOM_VID, BROADCOM_PE10G2_PID, PCI_ANY_ID, PCI_ANY_ID, PE10G2BPTCX4, "PE10G2BPTCX4"}, */
6273 {0x8086, 0x10c9, SILICOM_SVID
/*PCI_ANY_ID */ ,
6274 SILICOM_PEG4BPI6_SSID
/*PCI_ANY_ID */ , PEG4BPI6
, "PEG4BPI6"},
6275 {0x8086, 0x10e6, SILICOM_SVID
/*PCI_ANY_ID */ ,
6276 SILICOM_PEG4BPFI6_SSID
/*PCI_ANY_ID */ , PEG4BPFI6
, "PEG4BPFI6"},
6277 {0x8086, 0x10e6, SILICOM_SVID
/*PCI_ANY_ID */ ,
6278 SILICOM_PEG4BPFI6LX_SSID
/*PCI_ANY_ID */ , PEG4BPFI6LX
, "PEG4BPFI6LX"},
6279 {0x8086, 0x10e6, SILICOM_SVID
/*PCI_ANY_ID */ ,
6280 SILICOM_PEG4BPFI6ZX_SSID
/*PCI_ANY_ID */ , PEG4BPFI6ZX
, "PEG4BPFI6ZX"},
6281 {0x8086, 0x10c9, SILICOM_SVID
/*PCI_ANY_ID */ ,
6282 SILICOM_PEG2BPI6_SSID
/*PCI_ANY_ID */ , PEG2BPI6
, "PEG2BPI6"},
6283 {0x8086, 0x10e6, SILICOM_SVID
/*PCI_ANY_ID */ ,
6284 SILICOM_PEG2BPFI6_SSID
/*PCI_ANY_ID */ , PEG2BPFI6
, "PEG2BPFI6"},
6285 {0x8086, 0x10e6, SILICOM_SVID
/*PCI_ANY_ID */ ,
6286 SILICOM_PEG2BPFI6LX_SSID
/*PCI_ANY_ID */ , PEG2BPFI6LX
, "PEG2BPFI6LX"},
6287 {0x8086, 0x10e6, SILICOM_SVID
/*PCI_ANY_ID */ ,
6288 SILICOM_PEG2BPFI6ZX_SSID
/*PCI_ANY_ID */ , PEG2BPFI6ZX
, "PEG2BPFI6ZX"},
6289 {0x8086, 0x10e7, SILICOM_SVID
/*PCI_ANY_ID */ ,
6290 SILICOM_PEG2BPFI6FLXM_SSID
/*PCI_ANY_ID */ , PEG2BPFI6FLXM
,
6292 {0x8086, 0x10c9, SILICOM_SVID
/*PCI_ANY_ID */ ,
6293 SILICOM_PEG4BPI6FC_SSID
/*PCI_ANY_ID */ , PEG4BPI6FC
, "PEG4BPI6FC"},
6294 {0x8086, 0x10e6, SILICOM_SVID
/*PCI_ANY_ID */ ,
6295 SILICOM_PEG4BPFI6FC_SSID
/*PCI_ANY_ID */ , PEG4BPFI6FC
, "PEG4BPFI6FC"},
6296 {0x8086, 0x10e6, SILICOM_SVID
/*PCI_ANY_ID */ ,
6297 SILICOM_PEG4BPFI6FCLX_SSID
/*PCI_ANY_ID */ , PEG4BPFI6FCLX
,
6299 {0x8086, 0x10e6, SILICOM_SVID
/*PCI_ANY_ID */ ,
6300 SILICOM_PEG4BPFI6FCZX_SSID
/*PCI_ANY_ID */ , PEG4BPFI6FCZX
,
6302 {0x8086, 0x10c9, SILICOM_SVID
/*PCI_ANY_ID */ ,
6303 SILICOM_PEG6BPI6_SSID
/*PCI_ANY_ID */ , PEG6BPI6
, "PEG6BPI6"},
6304 {0x8086, 0x10c9, SILICOM_SVID
/*PCI_ANY_ID */ ,
6305 SILICOM_PEG2BPI6SC6_SSID
/*PCI_ANY_ID */ , PEG2BPI6SC6
,
6307 {0x8086, 0x10c9, SILICOM_SVID
/*PCI_ANY_ID */ ,
6308 SILICOM_MEG2BPI6_SSID
/*PCI_ANY_ID */ , MEG2BPI6
, "MEG2BPI6"},
6309 {0x8086, 0x10c9, SILICOM_SVID
/*PCI_ANY_ID */ ,
6310 SILICOM_XEG2BPI6_SSID
/*PCI_ANY_ID */ , XEG2BPI6
, "XEG2BPI6"},
6311 {0x8086, 0x10c9, SILICOM_SVID
/*PCI_ANY_ID */ ,
6312 SILICOM_MEG4BPI6_SSID
/*PCI_ANY_ID */ , MEG4BPI6
, "MEG4BPI6"},
6314 {0x8086, 0x10a9, SILICOM_SVID
/*PCI_ANY_ID */ , SILICOM_PEG2BPFI5_SSID
,
6315 PEG2BPFI5
, "PEG2BPFI5"},
6316 {0x8086, 0x10a9, SILICOM_SVID
/*PCI_ANY_ID */ ,
6317 SILICOM_PEG2BPFI5LX_SSID
, PEG2BPFI5LX
, "PEG2BPFI5LX"},
6319 {0x8086, 0x105f, SILICOM_SVID
, SILICOM_PXEG4BPFI_SSID
, PXEG4BPFI
,
6322 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6323 SILICOM_M1EG2BPI6_SSID
/*PCI_ANY_ID */ , M1EG2BPI6
, "MxEG2BPI6"},
6325 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6326 SILICOM_M1EG2BPFI6_SSID
/*PCI_ANY_ID */ , M1EG2BPFI6
, "MxEG2BPFI6"},
6327 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6328 SILICOM_M1EG2BPFI6LX_SSID
/*PCI_ANY_ID */ , M1EG2BPFI6LX
,
6330 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6331 SILICOM_M1EG2BPFI6ZX_SSID
/*PCI_ANY_ID */ , M1EG2BPFI6ZX
,
6334 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6335 SILICOM_M1EG4BPI6_SSID
/*PCI_ANY_ID */ , M1EG4BPI6
, "MxEG4BPI6"},
6337 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6338 SILICOM_M1EG4BPFI6_SSID
/*PCI_ANY_ID */ , M1EG4BPFI6
, "MxEG4BPFI6"},
6339 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6340 SILICOM_M1EG4BPFI6LX_SSID
/*PCI_ANY_ID */ , M1EG4BPFI6LX
,
6342 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6343 SILICOM_M1EG4BPFI6ZX_SSID
/*PCI_ANY_ID */ , M1EG4BPFI6ZX
,
6346 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6347 SILICOM_M1EG6BPI6_SSID
/*PCI_ANY_ID */ , M1EG6BPI6
, "MxEG6BPI6"},
6349 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6350 SILICOM_M1E2G4BPi80_SSID
/*PCI_ANY_ID */ , M1E2G4BPi80
, "MxE2G4BPi80"},
6351 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6352 SILICOM_M1E2G4BPFi80_SSID
/*PCI_ANY_ID */ , M1E2G4BPFi80
,
6354 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6355 SILICOM_M1E2G4BPFi80LX_SSID
/*PCI_ANY_ID */ , M1E2G4BPFi80LX
,
6357 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6358 SILICOM_M1E2G4BPFi80ZX_SSID
/*PCI_ANY_ID */ , M1E2G4BPFi80ZX
,
6361 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6362 SILICOM_M2EG2BPFI6_SSID
/*PCI_ANY_ID */ , M2EG2BPFI6
, "M2EG2BPFI6"},
6363 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6364 SILICOM_M2EG2BPFI6LX_SSID
/*PCI_ANY_ID */ , M2EG2BPFI6LX
,
6366 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6367 SILICOM_M2EG2BPFI6ZX_SSID
/*PCI_ANY_ID */ , M2EG2BPFI6ZX
,
6370 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6371 SILICOM_M2EG4BPI6_SSID
/*PCI_ANY_ID */ , M2EG4BPI6
, "M2EG4BPI6"},
6373 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6374 SILICOM_M2EG4BPFI6_SSID
/*PCI_ANY_ID */ , M2EG4BPFI6
, "M2EG4BPFI6"},
6375 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6376 SILICOM_M2EG4BPFI6LX_SSID
/*PCI_ANY_ID */ , M2EG4BPFI6LX
,
6378 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6379 SILICOM_M2EG4BPFI6ZX_SSID
/*PCI_ANY_ID */ , M2EG4BPFI6ZX
,
6382 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6383 SILICOM_M2EG6BPI6_SSID
/*PCI_ANY_ID */ , M2EG6BPI6
, "M2EG6BPI6"},
6385 {0x8086, 0x10c9, SILICOM_SVID
/*PCI_ANY_ID */ ,
6386 SILICOM_PEG2DBI6_SSID
/*PCI_ANY_ID */ , PEG2DBI6
, "PEG2DBI6"},
6387 {0x8086, 0x10e6, SILICOM_SVID
/*PCI_ANY_ID */ ,
6388 SILICOM_PEG2DBFI6_SSID
/*PCI_ANY_ID */ , PEG2DBFI6
, "PEG2DBFI6"},
6389 {0x8086, 0x10e6, SILICOM_SVID
/*PCI_ANY_ID */ ,
6390 SILICOM_PEG2DBFI6LX_SSID
/*PCI_ANY_ID */ , PEG2DBFI6LX
, "PEG2DBFI6LX"},
6391 {0x8086, 0x10e6, SILICOM_SVID
/*PCI_ANY_ID */ ,
6392 SILICOM_PEG2DBFI6ZX_SSID
/*PCI_ANY_ID */ , PEG2DBFI6ZX
, "PEG2DBFI6ZX"},
6394 {0x8086, 0x10F9, SILICOM_SVID
/*PCI_ANY_ID */ ,
6395 SILICOM_PE210G2DBi9SR_SSID
, PE210G2DBi9SR
, "PE210G2DBi9SR"},
6396 {0x8086, 0x10F9, SILICOM_SVID
/*PCI_ANY_ID */ ,
6397 SILICOM_PE210G2DBi9LR_SSID
, PE210G2DBi9LR
, "PE210G2DBi9LR"},
6398 {0x8086, 0x10F9, SILICOM_SVID
/*PCI_ANY_ID */ ,
6399 SILICOM_PE310G4DBi940SR_SSID
, PE310G4DBi940SR
, "PE310G4DBi9SR"},
6401 {0x8086, 0x10Fb, SILICOM_SVID
/*PCI_ANY_ID */ ,
6402 SILICOM_PE310G4BPi9T_SSID
, PE310G4BPi9T
, "PE310G4BPi9T"},
6403 {0x8086, 0x10Fb, SILICOM_SVID
/*PCI_ANY_ID */ ,
6404 SILICOM_PE310G4BPi9SR_SSID
, PE310G4BPi9SR
, "PE310G4BPi9SR"},
6405 {0x8086, 0x10Fb, SILICOM_SVID
/*PCI_ANY_ID */ ,
6406 SILICOM_PE310G4BPi9LR_SSID
, PE310G4BPi9LR
, "PE310G4BPi9LR"},
6408 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6409 SILICOM_PE2G4BPi80_SSID
/*PCI_ANY_ID */ , PE2G4BPi80
, "PE2G4BPi80"},
6410 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6411 SILICOM_PE2G4BPFi80_SSID
/*PCI_ANY_ID */ , PE2G4BPFi80
, "PE2G4BPFi80"},
6412 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6413 SILICOM_PE2G4BPFi80LX_SSID
/*PCI_ANY_ID */ , PE2G4BPFi80LX
,
6415 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6416 SILICOM_PE2G4BPFi80ZX_SSID
/*PCI_ANY_ID */ , PE2G4BPFi80ZX
,
6419 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6420 SILICOM_PE2G4BPi80L_SSID
/*PCI_ANY_ID */ , PE2G4BPi80L
, "PE2G4BPi80L"},
6422 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6423 SILICOM_M6E2G8BPi80A_SSID
/*PCI_ANY_ID */ , M6E2G8BPi80A
,
6426 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6427 SILICOM_PE2G2BPi35_SSID
/*PCI_ANY_ID */ , PE2G2BPi35
, "PE2G2BPi35"},
6428 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6429 SILICOM_PAC1200BPi35_SSID
/*PCI_ANY_ID */ , PAC1200BPi35
,
6432 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6433 SILICOM_PE2G2BPFi35_SSID
/*PCI_ANY_ID */ , PE2G2BPFi35
, "PE2G2BPFi35"},
6434 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6435 SILICOM_PE2G2BPFi35LX_SSID
/*PCI_ANY_ID */ , PE2G2BPFi35LX
,
6437 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6438 SILICOM_PE2G2BPFi35ZX_SSID
/*PCI_ANY_ID */ , PE2G2BPFi35ZX
,
6441 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6442 SILICOM_PE2G4BPi35_SSID
/*PCI_ANY_ID */ , PE2G4BPi35
, "PE2G4BPi35"},
6444 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6445 SILICOM_PE2G4BPi35L_SSID
/*PCI_ANY_ID */ , PE2G4BPi35L
, "PE2G4BPi35L"},
6447 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6448 SILICOM_PE2G4BPFi35_SSID
/*PCI_ANY_ID */ , PE2G4BPFi35
, "PE2G4BPFi35"},
6449 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6450 SILICOM_PE2G4BPFi35LX_SSID
/*PCI_ANY_ID */ , PE2G4BPFi35LX
,
6452 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6453 SILICOM_PE2G4BPFi35ZX_SSID
/*PCI_ANY_ID */ , PE2G4BPFi35ZX
,
6456 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6457 SILICOM_PE2G6BPi35_SSID
/*PCI_ANY_ID */ , PE2G6BPi35
, "PE2G6BPi35"},
6460 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xaa0, PE2G6BPi35CX
,
6462 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xaa1, PE2G6BPi35CX
,
6464 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xaa2, PE2G6BPi35CX
,
6466 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xaa3, PE2G6BPi35CX
,
6468 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xaa4, PE2G6BPi35CX
,
6470 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xaa5, PE2G6BPi35CX
,
6472 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xaa6, PE2G6BPi35CX
,
6474 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xaa7, PE2G6BPi35CX
,
6476 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xaa8, PE2G6BPi35CX
,
6478 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xaa9, PE2G6BPi35CX
,
6480 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xaaa, PE2G6BPi35CX
,
6482 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xaab, PE2G6BPi35CX
,
6484 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xaac, PE2G6BPi35CX
,
6486 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xaad, PE2G6BPi35CX
,
6488 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xaae, PE2G6BPi35CX
,
6490 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xaaf, PE2G6BPi35CX
,
6492 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xab0, PE2G6BPi35CX
,
6494 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xab1, PE2G6BPi35CX
,
6496 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xab2, PE2G6BPi35CX
,
6498 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xab3, PE2G6BPi35CX
,
6500 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xab4, PE2G6BPi35CX
,
6502 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xab5, PE2G6BPi35CX
,
6504 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xab6, PE2G6BPi35CX
,
6506 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xab7, PE2G6BPi35CX
,
6508 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xab8, PE2G6BPi35CX
,
6510 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xab9, PE2G6BPi35CX
,
6512 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xaba, PE2G6BPi35CX
,
6514 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xabb, PE2G6BPi35CX
,
6516 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xabc, PE2G6BPi35CX
,
6518 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xabd, PE2G6BPi35CX
,
6520 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xabe, PE2G6BPi35CX
,
6522 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ , 0xabf, PE2G6BPi35CX
,
6525 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6526 SILICOM_PE2G2BPi80_SSID
/*PCI_ANY_ID */ , PE2G2BPi80
, "PE2G2BPi80"},
6527 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6528 SILICOM_PE2G2BPFi80_SSID
/*PCI_ANY_ID */ , PE2G2BPFi80
, "PE2G2BPFi80"},
6529 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6530 SILICOM_PE2G2BPFi80LX_SSID
/*PCI_ANY_ID */ , PE2G2BPFi80LX
,
6532 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6533 SILICOM_PE2G2BPFi80ZX_SSID
/*PCI_ANY_ID */ , PE2G2BPFi80ZX
,
6536 {0x8086, 0x10c9, SILICOM_SVID
/*PCI_ANY_ID */ ,
6537 SILICOM_MEG2BPI6_SSID
/*PCI_ANY_ID */ , MEG2BPI6
, "MEG2BPI6"},
6538 {0x8086, 0x10c9, SILICOM_SVID
/*PCI_ANY_ID */ ,
6539 SILICOM_XEG2BPI6_SSID
/*PCI_ANY_ID */ , XEG2BPI6
, "XEG2BPI6"},
6542 {0x8086, 0x10fb, 0x8086, INTEL_PE210G2SPI9_SSID
, PE210G2SPI9
,
6545 {0x8086, 0x10fb, SILICOM_SVID
/*PCI_ANY_ID */ ,
6546 SILICOM_M1E10G2BPI9CX4_SSID
/*PCI_ANY_ID */ , M1E10G2BPI9CX4
,
6548 {0x8086, 0x10fb, SILICOM_SVID
/*PCI_ANY_ID */ ,
6549 SILICOM_M1E10G2BPI9SR_SSID
/*PCI_ANY_ID */ , M1E10G2BPI9SR
,
6551 {0x8086, 0x10fb, SILICOM_SVID
/*PCI_ANY_ID */ ,
6552 SILICOM_M1E10G2BPI9LR_SSID
/*PCI_ANY_ID */ , M1E10G2BPI9LR
,
6554 {0x8086, 0x10fb, SILICOM_SVID
/*PCI_ANY_ID */ ,
6555 SILICOM_M1E10G2BPI9T_SSID
/*PCI_ANY_ID */ , M1E10G2BPI9T
,
6558 {0x8086, 0x10fb, SILICOM_SVID
/*PCI_ANY_ID */ ,
6559 SILICOM_M2E10G2BPI9CX4_SSID
/*PCI_ANY_ID */ , M2E10G2BPI9CX4
,
6561 {0x8086, 0x10fb, SILICOM_SVID
/*PCI_ANY_ID */ ,
6562 SILICOM_M2E10G2BPI9SR_SSID
/*PCI_ANY_ID */ , M2E10G2BPI9SR
,
6564 {0x8086, 0x10fb, SILICOM_SVID
/*PCI_ANY_ID */ ,
6565 SILICOM_M2E10G2BPI9LR_SSID
/*PCI_ANY_ID */ , M2E10G2BPI9LR
,
6567 {0x8086, 0x10fb, SILICOM_SVID
/*PCI_ANY_ID */ ,
6568 SILICOM_M2E10G2BPI9T_SSID
/*PCI_ANY_ID */ , M2E10G2BPI9T
,
6571 {0x8086, 0x10fb, SILICOM_SVID
, SILICOM_PE210G2BPI9CX4_SSID
,
6572 PE210G2BPI9CX4
, "PE210G2BPI9CX4"},
6573 {0x8086, 0x10fb, SILICOM_SVID
, SILICOM_PE210G2BPI9SR_SSID
,
6574 PE210G2BPI9SR
, "PE210G2BPI9SR"},
6575 {0x8086, 0x10fb, SILICOM_SVID
, SILICOM_PE210G2BPI9LR_SSID
,
6576 PE210G2BPI9LR
, "PE210G2BPI9LR"},
6577 {0x8086, 0x10fb, SILICOM_SVID
, SILICOM_PE210G2BPI9T_SSID
, PE210G2BPI9T
,
6581 {0x1374, 0x2c, SILICOM_SVID
, SILICOM_PXG4BPI_SSID
, PXG4BPI
,
6584 {0x1374, 0x2d, SILICOM_SVID
, SILICOM_PXG4BPFI_SSID
, PXG4BPFI
,
6587 {0x1374, 0x3f, SILICOM_SVID
, SILICOM_PXG2TBI_SSID
, PXG2TBI
,
6590 {0x1374, 0x3d, SILICOM_SVID
, SILICOM_PXG2BISC1_SSID
, PXG2BISC1
,
6593 {0x1374, 0x40, SILICOM_SVID
, SILICOM_PEG4BPFI_SSID
, PEG4BPFI
,
6597 {0x1374, 0x28, SILICOM_SVID
, 0x28, PXGBPI
, "PXG2BPI-SD"},
6600 {0x8086, PCI_ANY_ID
, SILICOM_SVID
/*PCI_ANY_ID */ ,
6601 SILICOM_M6E2G8BPi80_SSID
/*PCI_ANY_ID */ , M6E2G8BPi80
, "MxE2G8BPi80"},
6602 {0x8086, 0x1528, SILICOM_SVID
/*PCI_ANY_ID */ ,
6603 SILICOM_PE210G2BPi40_SSID
/*PCI_ANY_ID */ , PE210G2BPi40
,
6606 /* required last entry */
6610 static void find_fw(bpctl_dev_t
*dev
)
6612 unsigned long mmio_start
, mmio_len
;
6613 struct pci_dev
*pdev1
= dev
->pdev
;
6615 if ((OLD_IF_SERIES(dev
->subdevice
)) ||
6616 (INTEL_IF_SERIES(dev
->subdevice
)))
6617 dev
->bp_fw_ver
= 0xff;
6619 dev
->bp_fw_ver
= bypass_fw_ver(dev
);
6621 if (dev
->bp_10gb
== 1 && dev
->bp_fw_ver
== 0xff) {
6624 iounmap((void *)dev
->mem_map
);
6625 mmio_start
= pci_resource_start(pdev1
, 0);
6626 mmio_len
= pci_resource_len(pdev1
, 0);
6628 dev
->mem_map
= (unsigned long)
6629 ioremap(mmio_start
, mmio_len
);
6631 dev
->bp_fw_ver
= bypass_fw_ver(dev
);
6632 if (dev
-> bp_fw_ver
== 0xa8)
6636 /* dev->bp_fw_ver=0xa8; */
6637 printk("firmware version: 0x%x\n", dev
->bp_fw_ver
);
6640 static int init_one(bpctl_dev_t
*dev
, bpmod_info_t
*info
, struct pci_dev
*pdev1
)
6642 unsigned long mmio_start
, mmio_len
;
6645 mmio_start
= pci_resource_start(pdev1
, 0);
6646 mmio_len
= pci_resource_len(pdev1
, 0);
6648 dev
->desc
= dev_desc
[info
->index
].name
;
6649 dev
->name
= info
->bp_name
;
6650 dev
->device
= info
->device
;
6651 dev
->vendor
= info
->vendor
;
6652 dev
->subdevice
= info
->subdevice
;
6653 dev
->subvendor
= info
->subvendor
;
6654 dev
->func
= PCI_FUNC(pdev1
->devfn
);
6655 dev
->slot
= PCI_SLOT(pdev1
->devfn
);
6656 dev
->bus
= pdev1
->bus
->number
;
6657 dev
->mem_map
= (unsigned long)ioremap(mmio_start
, mmio_len
);
6659 spin_lock_init(&dev
->bypass_wr_lock
);
6661 if (BP10G9_IF_SERIES(dev
->subdevice
))
6663 if (BP10G_IF_SERIES(dev
->subdevice
))
6665 if (PEG540_IF_SERIES(dev
->subdevice
))
6667 if (PEGF5_IF_SERIES(dev
->subdevice
))
6669 if (PEG80_IF_SERIES(dev
->subdevice
))
6671 if (PEGF80_IF_SERIES(dev
->subdevice
))
6673 if ((dev
->subdevice
& 0xa00) == 0xa00)
6675 if (BP10GB_IF_SERIES(dev
->subdevice
)) {
6676 if (dev
->ifindex
== 0) {
6677 unregister_chrdev(major_num
, DEVICE_NAME
);
6678 printk("Please load network driver for %s adapter!\n",
6683 if (dev
->ndev
&& !(dev
->ndev
->flags
& IFF_UP
)) {
6684 unregister_chrdev(major_num
, DEVICE_NAME
);
6685 printk("Please bring up network interfaces for %s adapter!\n",
6692 if (!dev
->bp_10g9
) {
6693 if (is_bypass_fn(dev
)) {
6694 printk(KERN_INFO
"%s found, ",
6698 dev
->wdt_status
= WDT_STATUS_UNKNOWN
;
6699 dev
->reset_time
= 0;
6700 atomic_set(&dev
->wdt_busy
, 0);
6701 dev
->bp_status_un
= 1;
6703 bypass_caps_init(dev
);
6705 init_bypass_wd_auto(dev
);
6706 init_bypass_tpl_auto(dev
);
6707 if (NOKIA_SERIES(dev
->subdevice
))
6711 if ((dev
->bp_tx_data
= kzalloc(BPTEST_DATA_LEN
, GFP_KERNEL
))) {
6712 memset(dev
->bp_tx_data
, 0xff, 6);
6713 memset(dev
->bp_tx_data
+ 6, 0x0, 1);
6714 memset(dev
->bp_tx_data
+ 7, 0xaa, 5);
6715 *(__be16
*)(dev
->bp_tx_data
+ 12) = htons(ETH_P_BPTEST
);
6717 printk("bp_ctl: Memory allocation error!\n");
6723 * Initialize the module - Register the character device
6726 static int __init
bypass_init_module(void)
6728 int ret_val
, idx
, idx_dev
= 0;
6729 struct pci_dev
*pdev1
= NULL
;
6732 printk(BP_MOD_DESCR
" v" BP_MOD_VER
"\n");
6733 ret_val
= register_chrdev(major_num
, DEVICE_NAME
, &Fops
);
6735 printk("%s failed with %d\n", DEVICE_NAME
, ret_val
);
6738 major_num
= ret_val
; /* dynamic */
6739 for (idx
= 0; tx_ctl_pci_tbl
[idx
].vendor
; idx
++) {
6740 while ((pdev1
= pci_get_subsys(tx_ctl_pci_tbl
[idx
].vendor
,
6741 tx_ctl_pci_tbl
[idx
].device
,
6742 tx_ctl_pci_tbl
[idx
].subvendor
,
6743 tx_ctl_pci_tbl
[idx
].subdevice
,
6750 printk("No such device\n");
6751 unregister_chrdev(major_num
, DEVICE_NAME
);
6755 bpctl_dev_arr
= kmalloc((device_num
) * sizeof(bpctl_dev_t
), GFP_KERNEL
);
6757 if (!bpctl_dev_arr
) {
6758 printk("Allocation error\n");
6759 unregister_chrdev(major_num
, DEVICE_NAME
);
6762 memset(bpctl_dev_arr
, 0, ((device_num
) * sizeof(bpctl_dev_t
)));
6765 dev
= bpctl_dev_arr
;
6766 for (idx
= 0; tx_ctl_pci_tbl
[idx
].vendor
; idx
++) {
6767 while ((pdev1
= pci_get_subsys(tx_ctl_pci_tbl
[idx
].vendor
,
6768 tx_ctl_pci_tbl
[idx
].device
,
6769 tx_ctl_pci_tbl
[idx
].subvendor
,
6770 tx_ctl_pci_tbl
[idx
].subdevice
,
6772 if (init_one(dev
, &tx_ctl_pci_tbl
[idx
], pdev1
) < 0)
6779 sema_init(&bpctl_sema
, 1);
6780 spin_lock_init(&bpvm_lock
);
6783 bpctl_dev_t
*pbpctl_dev_c
= NULL
;
6784 for (idx_dev
= 0, dev
= bpctl_dev_arr
;
6785 idx_dev
< device_num
&& dev
->pdev
;
6788 pbpctl_dev_c
= get_status_port_fn(dev
);
6789 if (is_bypass_fn(dev
)) {
6790 printk(KERN_INFO
"%s found, ",
6792 dev
->bp_fw_ver
= bypass_fw_ver(dev
);
6793 printk("firmware version: 0x%x\n",
6796 dev
->wdt_status
= WDT_STATUS_UNKNOWN
;
6797 dev
->reset_time
= 0;
6798 atomic_set(&dev
->wdt_busy
, 0);
6799 dev
->bp_status_un
= 1;
6801 bypass_caps_init(dev
);
6803 init_bypass_wd_auto(dev
);
6804 init_bypass_tpl_auto(dev
);
6811 register_netdevice_notifier(&bp_notifier_block
);
6812 #ifdef BP_PROC_SUPPORT
6815 /* unsigned long flags; */
6816 /* rcu_read_lock(); */
6818 for (i
= 0; i
< device_num
; i
++) {
6819 if (bpctl_dev_arr
[i
].ifindex
) {
6820 /* spin_lock_irqsave(&bpvm_lock, flags); */
6821 bypass_proc_remove_dev_sd(&bpctl_dev_arr
[i
]);
6822 bypass_proc_create_dev_sd(&bpctl_dev_arr
[i
]);
6823 /* spin_unlock_irqrestore(&bpvm_lock, flags); */
6827 /* rcu_read_unlock(); */
6835 * Cleanup - unregister the appropriate file from /proc
6837 static void __exit
bypass_cleanup_module(void)
6840 unregister_netdevice_notifier(&bp_notifier_block
);
6842 for (i
= 0; i
< device_num
; i
++) {
6843 /* unsigned long flags; */
6844 #ifdef BP_PROC_SUPPORT
6845 /* spin_lock_irqsave(&bpvm_lock, flags);
6847 bypass_proc_remove_dev_sd(&bpctl_dev_arr
[i
]);
6848 /* spin_unlock_irqrestore(&bpvm_lock, flags);
6849 rcu_read_unlock(); */
6851 remove_bypass_wd_auto(&bpctl_dev_arr
[i
]);
6852 bpctl_dev_arr
[i
].reset_time
= 0;
6854 remove_bypass_tpl_auto(&bpctl_dev_arr
[i
]);
6857 /* unmap all devices */
6858 for (i
= 0; i
< device_num
; i
++) {
6860 kfree(bpctl_dev_arr
[i
].bp_tx_data
);
6862 iounmap((void *)(bpctl_dev_arr
[i
].mem_map
));
6865 /* free all devices space */
6866 kfree(bpctl_dev_arr
);
6869 * Unregister the device
6871 unregister_chrdev(major_num
, DEVICE_NAME
);
6874 module_init(bypass_init_module
);
6875 module_exit(bypass_cleanup_module
);
6877 int is_bypass_sd(int ifindex
)
6879 return is_bypass(get_dev_idx_p(ifindex
));
6882 int set_bypass_sd(int ifindex
, int bypass_mode
)
6885 return set_bypass_fn(get_dev_idx_p(ifindex
), bypass_mode
);
6888 int get_bypass_sd(int ifindex
)
6891 return get_bypass_fn(get_dev_idx_p(ifindex
));
6894 int get_bypass_change_sd(int ifindex
)
6897 return get_bypass_change_fn(get_dev_idx_p(ifindex
));
6900 int set_dis_bypass_sd(int ifindex
, int dis_param
)
6902 return set_dis_bypass_fn(get_dev_idx_p(ifindex
), dis_param
);
6905 int get_dis_bypass_sd(int ifindex
)
6908 return get_dis_bypass_fn(get_dev_idx_p(ifindex
));
6911 int set_bypass_pwoff_sd(int ifindex
, int bypass_mode
)
6913 return set_bypass_pwoff_fn(get_dev_idx_p(ifindex
), bypass_mode
);
6917 int get_bypass_pwoff_sd(int ifindex
)
6919 return get_bypass_pwoff_fn(get_dev_idx_p(ifindex
));
6923 int set_bypass_pwup_sd(int ifindex
, int bypass_mode
)
6925 return set_bypass_pwup_fn(get_dev_idx_p(ifindex
), bypass_mode
);
6929 int get_bypass_pwup_sd(int ifindex
)
6931 return get_bypass_pwup_fn(get_dev_idx_p(ifindex
));
6935 int set_bypass_wd_sd(int if_index
, int ms_timeout
, int *ms_timeout_set
)
6937 if ((is_bypass(get_dev_idx_p(if_index
))) <= 0)
6939 *ms_timeout_set
= set_bypass_wd_fn(get_dev_idx_p(if_index
), ms_timeout
);
6943 int get_bypass_wd_sd(int ifindex
, int *timeout
)
6945 return get_bypass_wd_fn(get_dev_idx_p(ifindex
), timeout
);
6949 int get_wd_expire_time_sd(int ifindex
, int *time_left
)
6951 return get_wd_expire_time_fn(get_dev_idx_p(ifindex
), time_left
);
6954 int reset_bypass_wd_timer_sd(int ifindex
)
6956 return reset_bypass_wd_timer_fn(get_dev_idx_p(ifindex
));
6960 int get_wd_set_caps_sd(int ifindex
)
6962 return get_wd_set_caps_fn(get_dev_idx_p(ifindex
));
6966 int set_std_nic_sd(int ifindex
, int nic_mode
)
6968 return set_std_nic_fn(get_dev_idx_p(ifindex
), nic_mode
);
6972 int get_std_nic_sd(int ifindex
)
6974 return get_std_nic_fn(get_dev_idx_p(ifindex
));
6978 int set_tap_sd(int ifindex
, int tap_mode
)
6980 return set_tap_fn(get_dev_idx_p(ifindex
), tap_mode
);
6984 int get_tap_sd(int ifindex
)
6986 return get_tap_fn(get_dev_idx_p(ifindex
));
6990 int set_tap_pwup_sd(int ifindex
, int tap_mode
)
6992 return set_tap_pwup_fn(get_dev_idx_p(ifindex
), tap_mode
);
6996 int get_tap_pwup_sd(int ifindex
)
6998 return get_tap_pwup_fn(get_dev_idx_p(ifindex
));
7002 int get_tap_change_sd(int ifindex
)
7004 return get_tap_change_fn(get_dev_idx_p(ifindex
));
7008 int set_dis_tap_sd(int ifindex
, int dis_param
)
7010 return set_dis_tap_fn(get_dev_idx_p(ifindex
), dis_param
);
7014 int get_dis_tap_sd(int ifindex
)
7016 return get_dis_tap_fn(get_dev_idx_p(ifindex
));
7020 int set_bp_disc_sd(int ifindex
, int disc_mode
)
7022 return set_disc_fn(get_dev_idx_p(ifindex
), disc_mode
);
7026 int get_bp_disc_sd(int ifindex
)
7028 return get_disc_fn(get_dev_idx_p(ifindex
));
7032 int set_bp_disc_pwup_sd(int ifindex
, int disc_mode
)
7034 return set_disc_pwup_fn(get_dev_idx_p(ifindex
), disc_mode
);
7038 int get_bp_disc_pwup_sd(int ifindex
)
7040 return get_disc_pwup_fn(get_dev_idx_p(ifindex
));
7044 int get_bp_disc_change_sd(int ifindex
)
7046 return get_disc_change_fn(get_dev_idx_p(ifindex
));
7050 int set_bp_dis_disc_sd(int ifindex
, int dis_param
)
7052 return set_dis_disc_fn(get_dev_idx_p(ifindex
), dis_param
);
7056 int get_bp_dis_disc_sd(int ifindex
)
7058 return get_dis_disc_fn(get_dev_idx_p(ifindex
));
7062 int get_wd_exp_mode_sd(int ifindex
)
7064 return get_wd_exp_mode_fn(get_dev_idx_p(ifindex
));
7067 int set_wd_exp_mode_sd(int ifindex
, int param
)
7069 return set_wd_exp_mode_fn(get_dev_idx_p(ifindex
), param
);
7073 int reset_cont_sd(int ifindex
)
7075 return reset_cont_fn(get_dev_idx_p(ifindex
));
7079 int set_tx_sd(int ifindex
, int tx_state
)
7081 return set_tx_fn(get_dev_idx_p(ifindex
), tx_state
);
7085 int set_tpl_sd(int ifindex
, int tpl_state
)
7087 return set_tpl_fn(get_dev_idx_p(ifindex
), tpl_state
);
7091 int set_bp_hw_reset_sd(int ifindex
, int status
)
7093 return set_bp_hw_reset_fn(get_dev_idx_p(ifindex
), status
);
7097 int set_wd_autoreset_sd(int ifindex
, int param
)
7099 return set_wd_autoreset_fn(get_dev_idx_p(ifindex
), param
);
7103 int get_wd_autoreset_sd(int ifindex
)
7105 return get_wd_autoreset_fn(get_dev_idx_p(ifindex
));
7109 int get_bypass_caps_sd(int ifindex
)
7111 return get_bypass_caps_fn(get_dev_idx_p(ifindex
));
7114 int get_bypass_slave_sd(int ifindex
)
7116 bpctl_dev_t
*pbpctl_dev_out
;
7117 int ret
= get_bypass_slave_fn(get_dev_idx_p(ifindex
), &pbpctl_dev_out
);
7119 return pbpctl_dev_out
->ifindex
;
7124 int get_tx_sd(int ifindex
)
7126 return get_tx_fn(get_dev_idx_p(ifindex
));
7130 int get_tpl_sd(int ifindex
)
7132 return get_tpl_fn(get_dev_idx_p(ifindex
));
7136 int get_bp_hw_reset_sd(int ifindex
)
7138 return get_bp_hw_reset_fn(get_dev_idx_p(ifindex
));
7142 int get_bypass_info_sd(int ifindex
, struct bp_info
*bp_info
)
7144 return get_bypass_info_fn(get_dev_idx_p(ifindex
), bp_info
->prod_name
, &bp_info
->fw_ver
);
7147 int bp_if_scan_sd(void)
7153 EXPORT_SYMBOL_NOVERS(is_bypass_sd
);
7154 EXPORT_SYMBOL_NOVERS(get_bypass_slave_sd
);
7155 EXPORT_SYMBOL_NOVERS(get_bypass_caps_sd
);
7156 EXPORT_SYMBOL_NOVERS(get_wd_set_caps_sd
);
7157 EXPORT_SYMBOL_NOVERS(set_bypass_sd
);
7158 EXPORT_SYMBOL_NOVERS(get_bypass_sd
);
7159 EXPORT_SYMBOL_NOVERS(get_bypass_change_sd
);
7160 EXPORT_SYMBOL_NOVERS(set_dis_bypass_sd
);
7161 EXPORT_SYMBOL_NOVERS(get_dis_bypass_sd
);
7162 EXPORT_SYMBOL_NOVERS(set_bypass_pwoff_sd
);
7163 EXPORT_SYMBOL_NOVERS(get_bypass_pwoff_sd
);
7164 EXPORT_SYMBOL_NOVERS(set_bypass_pwup_sd
);
7165 EXPORT_SYMBOL_NOVERS(get_bypass_pwup_sd
);
7166 EXPORT_SYMBOL_NOVERS(set_bypass_wd_sd
);
7167 EXPORT_SYMBOL_NOVERS(get_bypass_wd_sd
);
7168 EXPORT_SYMBOL_NOVERS(get_wd_expire_time_sd
);
7169 EXPORT_SYMBOL_NOVERS(reset_bypass_wd_timer_sd
);
7170 EXPORT_SYMBOL_NOVERS(set_std_nic_sd
);
7171 EXPORT_SYMBOL_NOVERS(get_std_nic_sd
);
7172 EXPORT_SYMBOL_NOVERS(set_tx_sd
);
7173 EXPORT_SYMBOL_NOVERS(get_tx_sd
);
7174 EXPORT_SYMBOL_NOVERS(set_tpl_sd
);
7175 EXPORT_SYMBOL_NOVERS(get_tpl_sd
);
7176 EXPORT_SYMBOL_NOVERS(set_bp_hw_reset_sd
);
7177 EXPORT_SYMBOL_NOVERS(get_bp_hw_reset_sd
);
7178 EXPORT_SYMBOL_NOVERS(set_tap_sd
);
7179 EXPORT_SYMBOL_NOVERS(get_tap_sd
);
7180 EXPORT_SYMBOL_NOVERS(get_tap_change_sd
);
7181 EXPORT_SYMBOL_NOVERS(set_dis_tap_sd
);
7182 EXPORT_SYMBOL_NOVERS(get_dis_tap_sd
);
7183 EXPORT_SYMBOL_NOVERS(set_tap_pwup_sd
);
7184 EXPORT_SYMBOL_NOVERS(get_tap_pwup_sd
);
7185 EXPORT_SYMBOL_NOVERS(set_wd_exp_mode_sd
);
7186 EXPORT_SYMBOL_NOVERS(get_wd_exp_mode_sd
);
7187 EXPORT_SYMBOL_NOVERS(set_wd_autoreset_sd
);
7188 EXPORT_SYMBOL_NOVERS(get_wd_autoreset_sd
);
7189 EXPORT_SYMBOL_NOVERS(set_bp_disc_sd
);
7190 EXPORT_SYMBOL_NOVERS(get_bp_disc_sd
);
7191 EXPORT_SYMBOL_NOVERS(get_bp_disc_change_sd
);
7192 EXPORT_SYMBOL_NOVERS(set_bp_dis_disc_sd
);
7193 EXPORT_SYMBOL_NOVERS(get_bp_dis_disc_sd
);
7194 EXPORT_SYMBOL_NOVERS(set_bp_disc_pwup_sd
);
7195 EXPORT_SYMBOL_NOVERS(get_bp_disc_pwup_sd
);
7196 EXPORT_SYMBOL_NOVERS(get_bypass_info_sd
);
7197 EXPORT_SYMBOL_NOVERS(bp_if_scan_sd
);
7199 #define BP_PROC_DIR "bypass"
7201 static struct proc_dir_entry
*bp_procfs_dir
;
7203 int bp_proc_create(void)
7205 bp_procfs_dir
= proc_mkdir(BP_PROC_DIR
, init_net
.proc_net
);
7206 if (bp_procfs_dir
== (struct proc_dir_entry
*)0) {
7208 "Could not create procfs nicinfo directory %s\n",
7215 static int procfs_add(char *proc_name
, const struct file_operations
*fops
,
7218 struct bypass_pfs_sd
*pfs
= &dev
->bypass_pfs_set
;
7219 if (!proc_create_data(proc_name
, 0644, pfs
->bypass_entry
, fops
, dev
))
7224 #define RO_FOPS(name) \
7225 static int name##_open(struct inode *inode, struct file *file) \
7227 return single_open(file, show_##name, PDE_DATA(inode));\
7229 static const struct file_operations name##_ops = { \
7230 .open = name##_open, \
7232 .llseek = seq_lseek, \
7233 .release = single_release, \
7236 #define RW_FOPS(name) \
7237 static int name##_open(struct inode *inode, struct file *file) \
7239 return single_open(file, show_##name, PDE_DATA(inode));\
7241 static const struct file_operations name##_ops = { \
7242 .open = name##_open, \
7244 .write = name##_write, \
7245 .llseek = seq_lseek, \
7246 .release = single_release, \
7249 static int show_bypass_info(struct seq_file
*m
, void *v
)
7251 bpctl_dev_t
*dev
= m
->private;
7253 seq_printf(m
, "Name\t\t\t%s\n", dev
->name
);
7254 seq_printf(m
, "Firmware version\t0x%x\n", dev
->bp_fw_ver
);
7257 RO_FOPS(bypass_info
)
7259 static int show_bypass_slave(struct seq_file
*m
, void *v
)
7261 bpctl_dev_t
*dev
= m
->private;
7262 bpctl_dev_t
*slave
= get_status_port_fn(dev
);
7266 seq_printf(m
, "fail\n");
7267 else if (slave
->ndev
)
7268 seq_printf(m
, "%s\n", slave
->ndev
->name
);
7271 RO_FOPS(bypass_slave
)
7273 static int show_bypass_caps(struct seq_file
*m
, void *v
)
7275 bpctl_dev_t
*dev
= m
->private;
7276 int ret
= get_bypass_caps_fn(dev
);
7277 if (ret
== BP_NOT_CAP
)
7278 seq_printf(m
, "-1\n");
7280 seq_printf(m
, "0x%x\n", ret
);
7283 RO_FOPS(bypass_caps
)
7285 static int show_wd_set_caps(struct seq_file
*m
, void *v
)
7287 bpctl_dev_t
*dev
= m
->private;
7288 int ret
= get_wd_set_caps_fn(dev
);
7289 if (ret
== BP_NOT_CAP
)
7290 seq_printf(m
, "-1\n");
7292 seq_printf(m
, "0x%x\n", ret
);
7295 RO_FOPS(wd_set_caps
)
7297 static int user_on_off(const void __user
*buffer
, size_t count
)
7303 if (count
> (sizeof(kbuf
) - 1))
7306 if (copy_from_user(&kbuf
, buffer
, count
))
7310 length
= strlen(kbuf
);
7311 if (kbuf
[length
- 1] == '\n')
7312 kbuf
[--length
] = '\0';
7314 if (strcmp(kbuf
, "on") == 0)
7316 if (strcmp(kbuf
, "off") == 0)
7321 static ssize_t
bypass_write(struct file
*file
, const char __user
*buffer
,
7322 size_t count
, loff_t
*pos
)
7324 int bypass_param
= user_on_off(buffer
, count
);
7325 if (bypass_param
< 0)
7328 set_bypass_fn(PDE_DATA(file_inode(file
)), bypass_param
);
7331 static int show_bypass(struct seq_file
*m
, void *v
)
7333 bpctl_dev_t
*dev
= m
->private;
7334 int ret
= get_bypass_fn(dev
);
7335 if (ret
== BP_NOT_CAP
)
7336 seq_printf(m
, "fail\n");
7338 seq_printf(m
, "on\n");
7340 seq_printf(m
, "off\n");
7345 static ssize_t
tap_write(struct file
*file
, const char __user
*buffer
,
7346 size_t count
, loff_t
*pos
)
7348 int tap_param
= user_on_off(buffer
, count
);
7352 set_tap_fn(PDE_DATA(file_inode(file
)), tap_param
);
7355 static int show_tap(struct seq_file
*m
, void *v
)
7357 bpctl_dev_t
*dev
= m
->private;
7358 int ret
= get_tap_fn(dev
);
7359 if (ret
== BP_NOT_CAP
)
7360 seq_printf(m
, "fail\n");
7362 seq_printf(m
, "on\n");
7364 seq_printf(m
, "off\n");
7369 static ssize_t
disc_write(struct file
*file
, const char __user
*buffer
,
7370 size_t count
, loff_t
*pos
)
7372 int tap_param
= user_on_off(buffer
, count
);
7376 set_disc_fn(PDE_DATA(file_inode(file
)), tap_param
);
7379 static int show_disc(struct seq_file
*m
, void *v
)
7381 bpctl_dev_t
*dev
= m
->private;
7382 int ret
= get_disc_fn(dev
);
7383 if (ret
== BP_NOT_CAP
)
7384 seq_printf(m
, "fail\n");
7386 seq_printf(m
, "on\n");
7388 seq_printf(m
, "off\n");
7393 static int show_bypass_change(struct seq_file
*m
, void *v
)
7395 bpctl_dev_t
*dev
= m
->private;
7396 int ret
= get_bypass_change_fn(dev
);
7398 seq_printf(m
, "on\n");
7400 seq_printf(m
, "off\n");
7402 seq_printf(m
, "fail\n");
7405 RO_FOPS(bypass_change
)
7407 static int show_tap_change(struct seq_file
*m
, void *v
)
7409 bpctl_dev_t
*dev
= m
->private;
7410 int ret
= get_tap_change_fn(dev
);
7412 seq_printf(m
, "on\n");
7414 seq_printf(m
, "off\n");
7416 seq_printf(m
, "fail\n");
7421 static int show_disc_change(struct seq_file
*m
, void *v
)
7423 bpctl_dev_t
*dev
= m
->private;
7424 int ret
= get_disc_change_fn(dev
);
7426 seq_printf(m
, "on\n");
7428 seq_printf(m
, "off\n");
7430 seq_printf(m
, "fail\n");
7433 RO_FOPS(disc_change
)
7435 static ssize_t
bypass_wd_write(struct file
*file
, const char __user
*buffer
,
7436 size_t count
, loff_t
*pos
)
7438 bpctl_dev_t
*dev
= PDE_DATA(file_inode(file
));
7440 int ret
= kstrtoint_from_user(buffer
, count
, 10, &timeout
);
7443 set_bypass_wd_fn(dev
, timeout
);
7446 static int show_bypass_wd(struct seq_file
*m
, void *v
)
7448 bpctl_dev_t
*dev
= m
->private;
7449 int ret
= 0, timeout
= 0;
7451 ret
= get_bypass_wd_fn(dev
, &timeout
);
7452 if (ret
== BP_NOT_CAP
)
7453 seq_printf(m
, "fail\n");
7454 else if (timeout
== -1)
7455 seq_printf(m
, "unknown\n");
7456 else if (timeout
== 0)
7457 seq_printf(m
, "disable\n");
7459 seq_printf(m
, "%d\n", timeout
);
7464 static int show_wd_expire_time(struct seq_file
*m
, void *v
)
7466 bpctl_dev_t
*dev
= m
->private;
7467 int ret
= 0, timeout
= 0;
7468 ret
= get_wd_expire_time_fn(dev
, &timeout
);
7469 if (ret
== BP_NOT_CAP
)
7470 seq_printf(m
, "fail\n");
7471 else if (timeout
== -1)
7472 seq_printf(m
, "expire\n");
7473 else if (timeout
== 0)
7474 seq_printf(m
, "disable\n");
7476 seq_printf(m
, "%d\n", timeout
);
7479 RO_FOPS(wd_expire_time
)
7481 static ssize_t
tpl_write(struct file
*file
, const char __user
*buffer
,
7482 size_t count
, loff_t
*pos
)
7484 bpctl_dev_t
*dev
= PDE_DATA(file_inode(file
));
7485 int tpl_param
= user_on_off(buffer
, count
);
7489 set_tpl_fn(dev
, tpl_param
);
7492 static int show_tpl(struct seq_file
*m
, void *v
)
7494 bpctl_dev_t
*dev
= m
->private;
7495 int ret
= get_tpl_fn(dev
);
7496 if (ret
== BP_NOT_CAP
)
7497 seq_printf(m
, "fail\n");
7499 seq_printf(m
, "on\n");
7501 seq_printf(m
, "off\n");
7507 static ssize_t
wait_at_pwup_write(struct file
*file
, const char __user
*buffer
,
7508 size_t count
, loff_t
*pos
)
7510 bpctl_dev_t
*dev
= PDE_DATA(file_inode(file
));
7511 int tpl_param
= user_on_off(buffer
, count
);
7515 set_bp_wait_at_pwup_fn(dev
, tpl_param
);
7518 static int show_wait_at_pwup(struct seq_file
*m
, void *v
)
7520 bpctl_dev_t
*dev
= m
->private;
7521 int ret
= get_bp_wait_at_pwup_fn(dev
);
7522 if (ret
== BP_NOT_CAP
)
7523 seq_printf(m
, "fail\n");
7525 seq_printf(m
, "on\n");
7527 seq_printf(m
, "off\n");
7530 RW_FOPS(wait_at_pwup
)
7532 static ssize_t
hw_reset_write(struct file
*file
, const char __user
*buffer
,
7533 size_t count
, loff_t
*pos
)
7535 bpctl_dev_t
*dev
= PDE_DATA(file_inode(file
));
7536 int tpl_param
= user_on_off(buffer
, count
);
7540 set_bp_hw_reset_fn(dev
, tpl_param
);
7543 static int show_hw_reset(struct seq_file
*m
, void *v
)
7545 bpctl_dev_t
*dev
= m
->private;
7546 int ret
= get_bp_hw_reset_fn(dev
);
7547 if (ret
== BP_NOT_CAP
)
7548 seq_printf(m
, "fail\n");
7550 seq_printf(m
, "on\n");
7552 seq_printf(m
, "off\n");
7557 #endif /*PMC_WAIT_FLAG */
7559 static int show_reset_bypass_wd(struct seq_file
*m
, void *v
)
7561 bpctl_dev_t
*dev
= m
->private;
7562 int ret
= reset_bypass_wd_timer_fn(dev
);
7563 if (ret
== BP_NOT_CAP
)
7564 seq_printf(m
, "fail\n");
7566 seq_printf(m
, "disable\n");
7568 seq_printf(m
, "success\n");
7571 RO_FOPS(reset_bypass_wd
)
7573 static ssize_t
dis_bypass_write(struct file
*file
, const char __user
*buffer
,
7574 size_t count
, loff_t
*pos
)
7576 int bypass_param
= user_on_off(buffer
, count
);
7577 if (bypass_param
< 0)
7580 set_dis_bypass_fn(PDE_DATA(file_inode(file
)), bypass_param
);
7583 static int show_dis_bypass(struct seq_file
*m
, void *v
)
7585 bpctl_dev_t
*dev
= m
->private;
7586 int ret
= get_dis_bypass_fn(dev
);
7587 if (ret
== BP_NOT_CAP
)
7588 seq_printf(m
, "fail\n");
7590 seq_printf(m
, "off\n");
7592 seq_printf(m
, "on\n");
7597 static ssize_t
dis_tap_write(struct file
*file
, const char __user
*buffer
,
7598 size_t count
, loff_t
*pos
)
7600 int tap_param
= user_on_off(buffer
, count
);
7604 set_dis_tap_fn(PDE_DATA(file_inode(file
)), tap_param
);
7607 static int show_dis_tap(struct seq_file
*m
, void *v
)
7609 bpctl_dev_t
*dev
= m
->private;
7610 int ret
= get_dis_tap_fn(dev
);
7611 if (ret
== BP_NOT_CAP
)
7612 seq_printf(m
, "fail\n");
7614 seq_printf(m
, "off\n");
7616 seq_printf(m
, "on\n");
7621 static ssize_t
dis_disc_write(struct file
*file
, const char __user
*buffer
,
7622 size_t count
, loff_t
*pos
)
7624 int tap_param
= user_on_off(buffer
, count
);
7628 set_dis_disc_fn(PDE_DATA(file_inode(file
)), tap_param
);
7631 static int show_dis_disc(struct seq_file
*m
, void *v
)
7633 bpctl_dev_t
*dev
= m
->private;
7634 int ret
= get_dis_disc_fn(dev
);
7635 if (ret
== BP_NOT_CAP
)
7636 seq_printf(m
, "fail\n");
7638 seq_printf(m
, "off\n");
7640 seq_printf(m
, "on\n");
7645 static ssize_t
bypass_pwup_write(struct file
*file
, const char __user
*buffer
,
7646 size_t count
, loff_t
*pos
)
7648 int bypass_param
= user_on_off(buffer
, count
);
7649 if (bypass_param
< 0)
7652 set_bypass_pwup_fn(PDE_DATA(file_inode(file
)), bypass_param
);
7655 static int show_bypass_pwup(struct seq_file
*m
, void *v
)
7657 bpctl_dev_t
*dev
= m
->private;
7658 int ret
= get_bypass_pwup_fn(dev
);
7659 if (ret
== BP_NOT_CAP
)
7660 seq_printf(m
, "fail\n");
7662 seq_printf(m
, "off\n");
7664 seq_printf(m
, "on\n");
7667 RW_FOPS(bypass_pwup
)
7669 static ssize_t
bypass_pwoff_write(struct file
*file
, const char __user
*buffer
,
7670 size_t count
, loff_t
*pos
)
7672 int bypass_param
= user_on_off(buffer
, count
);
7673 if (bypass_param
< 0)
7676 set_bypass_pwoff_fn(PDE_DATA(file_inode(file
)), bypass_param
);
7679 static int show_bypass_pwoff(struct seq_file
*m
, void *v
)
7681 bpctl_dev_t
*dev
= m
->private;
7682 int ret
= get_bypass_pwoff_fn(dev
);
7683 if (ret
== BP_NOT_CAP
)
7684 seq_printf(m
, "fail\n");
7686 seq_printf(m
, "off\n");
7688 seq_printf(m
, "on\n");
7691 RW_FOPS(bypass_pwoff
)
7693 static ssize_t
tap_pwup_write(struct file
*file
, const char __user
*buffer
,
7694 size_t count
, loff_t
*pos
)
7696 int tap_param
= user_on_off(buffer
, count
);
7700 set_tap_pwup_fn(PDE_DATA(file_inode(file
)), tap_param
);
7703 static int show_tap_pwup(struct seq_file
*m
, void *v
)
7705 bpctl_dev_t
*dev
= m
->private;
7706 int ret
= get_tap_pwup_fn(dev
);
7707 if (ret
== BP_NOT_CAP
)
7708 seq_printf(m
, "fail\n");
7710 seq_printf(m
, "off\n");
7712 seq_printf(m
, "on\n");
7717 static ssize_t
disc_pwup_write(struct file
*file
, const char __user
*buffer
,
7718 size_t count
, loff_t
*pos
)
7720 int tap_param
= user_on_off(buffer
, count
);
7724 set_disc_pwup_fn(PDE_DATA(file_inode(file
)), tap_param
);
7727 static int show_disc_pwup(struct seq_file
*m
, void *v
)
7729 bpctl_dev_t
*dev
= m
->private;
7730 int ret
= get_disc_pwup_fn(dev
);
7731 if (ret
== BP_NOT_CAP
)
7732 seq_printf(m
, "fail\n");
7734 seq_printf(m
, "off\n");
7736 seq_printf(m
, "on\n");
7741 static ssize_t
std_nic_write(struct file
*file
, const char __user
*buffer
,
7742 size_t count
, loff_t
*pos
)
7744 int bypass_param
= user_on_off(buffer
, count
);
7745 if (bypass_param
< 0)
7748 set_std_nic_fn(PDE_DATA(file_inode(file
)), bypass_param
);
7751 static int show_std_nic(struct seq_file
*m
, void *v
)
7753 bpctl_dev_t
*dev
= m
->private;
7754 int ret
= get_std_nic_fn(dev
);
7755 if (ret
== BP_NOT_CAP
)
7756 seq_printf(m
, "fail\n");
7758 seq_printf(m
, "off\n");
7760 seq_printf(m
, "on\n");
7765 static ssize_t
wd_exp_mode_write(struct file
*file
, const char __user
*buffer
,
7766 size_t count
, loff_t
*pos
)
7769 int bypass_param
= 0, length
= 0;
7771 if (count
> (sizeof(kbuf
) - 1))
7774 if (copy_from_user(&kbuf
, buffer
, count
))
7778 length
= strlen(kbuf
);
7779 if (kbuf
[length
- 1] == '\n')
7780 kbuf
[--length
] = '\0';
7782 if (strcmp(kbuf
, "tap") == 0)
7784 else if (strcmp(kbuf
, "bypass") == 0)
7786 else if (strcmp(kbuf
, "disc") == 0)
7789 set_wd_exp_mode_fn(PDE_DATA(file_inode(file
)), bypass_param
);
7793 static int show_wd_exp_mode(struct seq_file
*m
, void *v
)
7795 bpctl_dev_t
*dev
= m
->private;
7796 int ret
= get_wd_exp_mode_fn(dev
);
7798 seq_printf(m
, "tap\n");
7800 seq_printf(m
, "bypass\n");
7802 seq_printf(m
, "disc\n");
7804 seq_printf(m
, "fail\n");
7807 RW_FOPS(wd_exp_mode
)
7809 static ssize_t
wd_autoreset_write(struct file
*file
, const char __user
*buffer
,
7810 size_t count
, loff_t
*pos
)
7813 int ret
= kstrtoint_from_user(buffer
, count
, 10, &timeout
);
7816 set_wd_autoreset_fn(PDE_DATA(file_inode(file
)), timeout
);
7819 static int show_wd_autoreset(struct seq_file
*m
, void *v
)
7821 bpctl_dev_t
*dev
= m
->private;
7822 int ret
= get_wd_autoreset_fn(dev
);
7824 seq_printf(m
, "%d\n", ret
);
7826 seq_printf(m
, "fail\n");
7829 RW_FOPS(wd_autoreset
)
7831 int bypass_proc_create_dev_sd(bpctl_dev_t
*pbp_device_block
)
7833 struct bypass_pfs_sd
*current_pfs
= &(pbp_device_block
->bypass_pfs_set
);
7834 static struct proc_dir_entry
*procfs_dir
= NULL
;
7837 if (!pbp_device_block
->ndev
)
7839 sprintf(current_pfs
->dir_name
, "bypass_%s",
7840 pbp_device_block
->ndev
->name
);
7845 /* create device proc dir */
7846 procfs_dir
= proc_mkdir(current_pfs
->dir_name
, bp_procfs_dir
);
7848 printk(KERN_DEBUG
"Could not create procfs directory %s\n",
7849 current_pfs
->dir_name
);
7852 current_pfs
->bypass_entry
= procfs_dir
;
7854 #define ENTRY(x) ret |= procfs_add(#x, &x##_ops, pbp_device_block)
7856 if (pbp_device_block
->bp_caps
& SW_CTL_CAP
) {
7857 /* Create set param proc's */
7858 ENTRY(bypass_slave
);
7862 ENTRY(wd_expire_time
);
7863 ENTRY(reset_bypass_wd
);
7865 if (pbp_device_block
->bp_caps
& BP_CAP
) {
7869 ENTRY(bypass_pwoff
);
7870 ENTRY(bypass_change
);
7872 if (pbp_device_block
->bp_caps
& TAP_CAP
) {
7878 if (pbp_device_block
->bp_caps
& DISC_CAP
) {
7886 ENTRY(wd_autoreset
);
7889 ENTRY(wait_at_pwup
);
7895 printk(KERN_DEBUG
"Create proc entry failed\n");
7900 int bypass_proc_remove_dev_sd(bpctl_dev_t
*pbp_device_block
)
7903 struct bypass_pfs_sd
*current_pfs
= &pbp_device_block
->bypass_pfs_set
;
7904 remove_proc_subtree(current_pfs
->dir_name
, bp_procfs_dir
);
7905 current_pfs
->bypass_entry
= NULL
;