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 Device_Open = 0;
39 static int major_num = 0;
41 MODULE_AUTHOR("Anna Lukin, annal@silicom.co.il");
42 MODULE_LICENSE("GPL");
43 MODULE_DESCRIPTION(BP_MOD_DESCR);
44 MODULE_VERSION(BP_MOD_VER);
47 #define lock_bpctl() \
48 if (down_interruptible(&bpctl_sema)) { \
49 return -ERESTARTSYS; \
52 #define unlock_bpctl() \
63 struct bypass_pfs_sd {
65 struct proc_dir_entry *bypass_entry;
68 typedef struct _bpctl_dev {
71 struct pci_dev *pdev; /* PCI device */
72 struct net_device *ndev; /* net device */
73 unsigned long mem_map;
87 unsigned long bypass_wdt_on_time;
88 uint32_t bypass_timer_interval;
89 struct timer_list bp_timer;
93 bp_media_type media_type;
95 struct timer_list bp_tpl_timer;
96 spinlock_t bypass_wr_lock;
103 int (*hard_start_xmit_save) (struct sk_buff *skb,
104 struct net_device *dev);
105 const struct net_device_ops *old_ops;
106 struct net_device_ops new_ops;
107 int bp_self_test_flag;
109 struct bypass_pfs_sd bypass_pfs_set;
113 static bpctl_dev_t *bpctl_dev_arr;
115 static struct semaphore bpctl_sema;
116 static int device_num = 0;
118 static int get_dev_idx(int ifindex);
119 static bpctl_dev_t *get_master_port_fn(bpctl_dev_t *pbpctl_dev);
120 static int disc_status(bpctl_dev_t *pbpctl_dev);
121 static int bypass_status(bpctl_dev_t *pbpctl_dev);
122 static int wdt_timer(bpctl_dev_t *pbpctl_dev, int *time_left);
123 static bpctl_dev_t *get_status_port_fn(bpctl_dev_t *pbpctl_dev);
124 static void if_scan_init(void);
126 int bypass_proc_create_dev_sd(bpctl_dev_t *pbp_device_block);
127 int bypass_proc_remove_dev_sd(bpctl_dev_t *pbp_device_block);
128 int bp_proc_create(void);
130 int is_bypass_fn(bpctl_dev_t *pbpctl_dev);
131 int get_dev_idx_bsf(int bus, int slot, int func);
133 static unsigned long str_to_hex(char *p);
134 static int bp_device_event(struct notifier_block *unused,
135 unsigned long event, void *ptr)
137 struct net_device *dev = ptr;
138 static bpctl_dev_t *pbpctl_dev = NULL, *pbpctl_dev_m = NULL;
139 int dev_num = 0, ret = 0, ret_d = 0, time_left = 0;
140 /* printk("BP_PROC_SUPPORT event =%d %s %d\n", event,dev->name, dev->ifindex ); */
141 /* return NOTIFY_DONE; */
144 if (event == NETDEV_REGISTER) {
146 struct ethtool_drvinfo drvinfo;
150 int i = 0, ifindex, idx_dev = 0;
151 int bus = 0, slot = 0, func = 0;
152 ifindex = dev->ifindex;
155 memset(&drvinfo, 0, sizeof(struct ethtool_drvinfo));
157 if (dev->ethtool_ops && dev->ethtool_ops->get_drvinfo) {
158 memset(&drvinfo, 0, sizeof(drvinfo));
159 dev->ethtool_ops->get_drvinfo(dev, &drvinfo);
162 if (!drvinfo.bus_info)
164 if (!strcmp(drvinfo.bus_info, "N/A"))
166 memcpy(&cbuf, drvinfo.bus_info, 32);
169 while (*buf++ != ':') ;
170 for (i = 0; i < 10; i++, buf++) {
177 bus = str_to_hex(res);
180 for (i = 0; i < 10; i++, buf++) {
187 slot = str_to_hex(res);
188 func = str_to_hex(buf);
189 idx_dev = get_dev_idx_bsf(bus, slot, func);
193 bpctl_dev_arr[idx_dev].ifindex = ifindex;
194 bpctl_dev_arr[idx_dev].ndev = dev;
196 bypass_proc_remove_dev_sd(&bpctl_dev_arr
198 bypass_proc_create_dev_sd(&bpctl_dev_arr
207 if (event == NETDEV_UNREGISTER) {
210 ((bpctl_dev_arr[idx_dev].pdev != NULL)
211 && (idx_dev < device_num)); idx_dev++) {
212 if (bpctl_dev_arr[idx_dev].ndev == dev) {
213 bypass_proc_remove_dev_sd(&bpctl_dev_arr
215 bpctl_dev_arr[idx_dev].ndev = NULL;
224 if (event == NETDEV_CHANGENAME) {
227 ((bpctl_dev_arr[idx_dev].pdev != NULL)
228 && (idx_dev < device_num)); idx_dev++) {
229 if (bpctl_dev_arr[idx_dev].ndev == dev) {
230 bypass_proc_remove_dev_sd(&bpctl_dev_arr
232 bypass_proc_create_dev_sd(&bpctl_dev_arr
247 if (netif_carrier_ok(dev))
250 if (((dev_num = get_dev_idx(dev->ifindex)) == -1) ||
251 (!(pbpctl_dev = &bpctl_dev_arr[dev_num])))
254 if ((is_bypass_fn(pbpctl_dev)) == 1)
255 pbpctl_dev_m = pbpctl_dev;
257 pbpctl_dev_m = get_master_port_fn(pbpctl_dev);
260 ret = bypass_status(pbpctl_dev_m);
262 printk("bpmod: %s is in the Bypass mode now",
264 ret_d = disc_status(pbpctl_dev_m);
267 ("bpmod: %s is in the Disconnect mode now",
270 wdt_timer(pbpctl_dev_m, &time_left);
272 printk("; WDT has expired");
288 static struct notifier_block bp_notifier_block = {
289 .notifier_call = bp_device_event,
292 static int device_open(struct inode *inode, struct file *file)
295 printk("device_open(%p)\n", file);
299 * Initialize the message
304 static int device_release(struct inode *inode, struct file *file)
307 printk("device_release(%p,%p)\n", inode, file);
313 int is_bypass_fn(bpctl_dev_t *pbpctl_dev);
314 int wdt_time_left(bpctl_dev_t *pbpctl_dev);
316 static void write_pulse(bpctl_dev_t *pbpctl_dev,
317 unsigned int ctrl_ext,
318 unsigned char value, unsigned char len)
320 unsigned char ctrl_val = 0;
321 unsigned int i = len;
322 unsigned int ctrl = 0;
323 bpctl_dev_t *pbpctl_dev_c = NULL;
325 if (pbpctl_dev->bp_i80)
326 ctrl = BPCTL_READ_REG(pbpctl_dev, CTRL_EXT);
327 if (pbpctl_dev->bp_540)
328 ctrl = BP10G_READ_REG(pbpctl_dev, ESDP);
330 if (pbpctl_dev->bp_10g9) {
331 if (!(pbpctl_dev_c = get_status_port_fn(pbpctl_dev)))
333 ctrl = BP10G_READ_REG(pbpctl_dev_c, ESDP);
337 ctrl_val = (value >> i) & 0x1;
339 if (pbpctl_dev->bp_10g9) {
341 /* To start management : MCLK 1, MDIO 1, output */
343 /*BP10G_WRITE_REG(pbpctl_dev, I2CCTL, (ctrl_ext|BP10G_MCLK_DATA_OUT9|BP10G_MDIO_DATA_OUT9)); */
344 BP10G_WRITE_REG(pbpctl_dev, I2CCTL,
346 BP10G_MDIO_DATA_OUT9);
347 BP10G_WRITE_REG(pbpctl_dev_c, ESDP,
348 (ctrl | BP10G_MCLK_DATA_OUT9 |
349 BP10G_MCLK_DIR_OUT9));
351 } else if (pbpctl_dev->bp_fiber5) {
352 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL, (ctrl_ext |
353 BPCTLI_CTRL_EXT_MCLK_DIR5
355 BPCTLI_CTRL_EXT_MDIO_DIR5
357 BPCTLI_CTRL_EXT_MDIO_DATA5
359 BPCTLI_CTRL_EXT_MCLK_DATA5));
361 } else if (pbpctl_dev->bp_i80) {
362 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL, (ctrl_ext |
363 BPCTLI_CTRL_EXT_MDIO_DIR80
365 BPCTLI_CTRL_EXT_MDIO_DATA80));
367 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT, (ctrl |
368 BPCTLI_CTRL_EXT_MCLK_DIR80
370 BPCTLI_CTRL_EXT_MCLK_DATA80));
372 } else if (pbpctl_dev->bp_540) {
373 BP10G_WRITE_REG(pbpctl_dev, ESDP, (ctrl |
382 } else if (pbpctl_dev->bp_10gb) {
383 BP10GB_WRITE_REG(pbpctl_dev, MISC_REG_SPIO,
384 (ctrl_ext | BP10GB_MDIO_SET |
391 } else if (!pbpctl_dev->bp_10g)
392 /* To start management : MCLK 1, MDIO 1, output */
393 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT,
395 BPCTLI_CTRL_EXT_MCLK_DIR |
396 BPCTLI_CTRL_EXT_MDIO_DIR |
397 BPCTLI_CTRL_EXT_MDIO_DATA |
398 BPCTLI_CTRL_EXT_MCLK_DATA));
401 /* To start management : MCLK 1, MDIO 1, output*/
402 BP10G_WRITE_REG(pbpctl_dev, EODSDP,
403 (ctrl_ext | BP10G_MCLK_DATA_OUT
404 | BP10G_MDIO_DATA_OUT));
408 usec_delay(PULSE_TIME);
409 if (pbpctl_dev->bp_10g9) {
411 /*BP10G_WRITE_REG(pbpctl_dev, I2CCTL, ((ctrl_ext|BP10G_MDIO_DATA_OUT9)&~(BP10G_MCLK_DATA_OUT9))); */
413 BP10G_WRITE_REG(pbpctl_dev, I2CCTL,
415 BP10G_MDIO_DATA_OUT9);
416 BP10G_WRITE_REG(pbpctl_dev_c, ESDP,
417 (ctrl | BP10G_MCLK_DIR_OUT9) &
418 ~BP10G_MCLK_DATA_OUT9);
420 } else if (pbpctl_dev->bp_fiber5) {
421 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL,
423 BPCTLI_CTRL_EXT_MCLK_DIR5 |
424 BPCTLI_CTRL_EXT_MDIO_DIR5 |
425 BPCTLI_CTRL_EXT_MDIO_DATA5)
428 (BPCTLI_CTRL_EXT_MCLK_DATA5)));
430 } else if (pbpctl_dev->bp_i80) {
431 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL, (ctrl_ext |
432 BPCTLI_CTRL_EXT_MDIO_DIR80
434 BPCTLI_CTRL_EXT_MDIO_DATA80));
435 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT,
437 BPCTLI_CTRL_EXT_MCLK_DIR80)
440 (BPCTLI_CTRL_EXT_MCLK_DATA80)));
442 } else if (pbpctl_dev->bp_540) {
443 BP10G_WRITE_REG(pbpctl_dev, ESDP,
444 (ctrl | BP540_MDIO_DIR |
449 } else if (pbpctl_dev->bp_10gb) {
451 BP10GB_WRITE_REG(pbpctl_dev, MISC_REG_SPIO,
452 (ctrl_ext | BP10GB_MDIO_SET |
459 } else if (!pbpctl_dev->bp_10g)
461 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT,
463 BPCTLI_CTRL_EXT_MCLK_DIR |
464 BPCTLI_CTRL_EXT_MDIO_DIR |
465 BPCTLI_CTRL_EXT_MDIO_DATA)
468 (BPCTLI_CTRL_EXT_MCLK_DATA)));
471 BP10G_WRITE_REG(pbpctl_dev, EODSDP,
473 BP10G_MDIO_DATA_OUT) &
474 ~(BP10G_MCLK_DATA_OUT)));
477 usec_delay(PULSE_TIME);
480 if (pbpctl_dev->bp_10g9) {
482 /*BP10G_WRITE_REG(pbpctl_dev, I2CCTL, ((ctrl_ext|BP10G_MCLK_DATA_OUT9)&~BP10G_MDIO_DATA_OUT9)); */
483 BP10G_WRITE_REG(pbpctl_dev, I2CCTL,
485 ~BP10G_MDIO_DATA_OUT9));
486 BP10G_WRITE_REG(pbpctl_dev_c, ESDP,
487 (ctrl | BP10G_MCLK_DATA_OUT9 |
488 BP10G_MCLK_DIR_OUT9));
490 } else if (pbpctl_dev->bp_fiber5) {
491 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL,
493 BPCTLI_CTRL_EXT_MCLK_DIR5 |
494 BPCTLI_CTRL_EXT_MDIO_DIR5 |
495 BPCTLI_CTRL_EXT_MCLK_DATA5)
498 (BPCTLI_CTRL_EXT_MDIO_DATA5)));
500 } else if (pbpctl_dev->bp_i80) {
501 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL,
503 BPCTLI_CTRL_EXT_MDIO_DIR80)
506 (BPCTLI_CTRL_EXT_MDIO_DATA80)));
507 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT,
509 BPCTLI_CTRL_EXT_MCLK_DIR80 |
510 BPCTLI_CTRL_EXT_MCLK_DATA80));
512 } else if (pbpctl_dev->bp_540) {
513 BP10G_WRITE_REG(pbpctl_dev, ESDP,
514 ((ctrl | BP540_MCLK_DIR |
517 ~(BP540_MDIO_DATA)));
519 } else if (pbpctl_dev->bp_10gb) {
520 BP10GB_WRITE_REG(pbpctl_dev, MISC_REG_SPIO,
521 (ctrl_ext | BP10GB_MDIO_CLR |
528 } else if (!pbpctl_dev->bp_10g)
530 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT,
532 BPCTLI_CTRL_EXT_MCLK_DIR |
533 BPCTLI_CTRL_EXT_MDIO_DIR |
534 BPCTLI_CTRL_EXT_MCLK_DATA)
537 (BPCTLI_CTRL_EXT_MDIO_DATA)));
540 BP10G_WRITE_REG(pbpctl_dev, EODSDP,
542 BP10G_MCLK_DATA_OUT) &
543 ~BP10G_MDIO_DATA_OUT));
546 usec_delay(PULSE_TIME);
547 if (pbpctl_dev->bp_10g9) {
549 /*BP10G_WRITE_REG(pbpctl_dev, I2CCTL, (ctrl_ext&~(BP10G_MCLK_DATA_OUT9|BP10G_MDIO_DATA_OUT9))); */
550 BP10G_WRITE_REG(pbpctl_dev, I2CCTL,
552 ~BP10G_MDIO_DATA_OUT9));
553 BP10G_WRITE_REG(pbpctl_dev_c, ESDP,
554 ((ctrl | BP10G_MCLK_DIR_OUT9) &
555 ~(BP10G_MCLK_DATA_OUT9)));
557 } else if (pbpctl_dev->bp_fiber5) {
558 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL,
560 BPCTLI_CTRL_EXT_MCLK_DIR5 |
561 BPCTLI_CTRL_EXT_MDIO_DIR5)
563 ~(BPCTLI_CTRL_EXT_MCLK_DATA5
565 BPCTLI_CTRL_EXT_MDIO_DATA5)));
567 } else if (pbpctl_dev->bp_i80) {
568 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL,
570 BPCTLI_CTRL_EXT_MDIO_DIR80)
572 ~BPCTLI_CTRL_EXT_MDIO_DATA80));
573 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT,
575 BPCTLI_CTRL_EXT_MCLK_DIR80)
578 (BPCTLI_CTRL_EXT_MCLK_DATA80)));
580 } else if (pbpctl_dev->bp_540) {
581 BP10G_WRITE_REG(pbpctl_dev, ESDP,
582 ((ctrl | BP540_MCLK_DIR |
586 } else if (pbpctl_dev->bp_10gb) {
588 BP10GB_WRITE_REG(pbpctl_dev, MISC_REG_SPIO,
589 (ctrl_ext | BP10GB_MDIO_CLR |
596 } else if (!pbpctl_dev->bp_10g)
597 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT,
599 BPCTLI_CTRL_EXT_MCLK_DIR |
600 BPCTLI_CTRL_EXT_MDIO_DIR) &
601 ~(BPCTLI_CTRL_EXT_MCLK_DATA
603 BPCTLI_CTRL_EXT_MDIO_DATA)));
606 BP10G_WRITE_REG(pbpctl_dev, EODSDP,
608 ~(BP10G_MCLK_DATA_OUT |
609 BP10G_MDIO_DATA_OUT)));
612 usec_delay(PULSE_TIME);
618 static int read_pulse(bpctl_dev_t *pbpctl_dev, unsigned int ctrl_ext,
621 unsigned char ctrl_val = 0;
622 unsigned int i = len;
623 unsigned int ctrl = 0;
624 bpctl_dev_t *pbpctl_dev_c = NULL;
626 if (pbpctl_dev->bp_i80)
627 ctrl = BPCTL_READ_REG(pbpctl_dev, CTRL_EXT);
628 if (pbpctl_dev->bp_540)
629 ctrl = BP10G_READ_REG(pbpctl_dev, ESDP);
630 if (pbpctl_dev->bp_10g9) {
631 if (!(pbpctl_dev_c = get_status_port_fn(pbpctl_dev)))
633 ctrl = BP10G_READ_REG(pbpctl_dev_c, ESDP);
638 if (pbpctl_dev->bp_10g9) {
639 /*BP10G_WRITE_REG(pbpctl_dev, I2CCTL, ((ctrl_ext|BP10G_MDIO_DATA_OUT9)&~BP10G_MCLK_DATA_OUT9)); */
641 BP10G_WRITE_REG(pbpctl_dev_c, ESDP,
642 ((ctrl | BP10G_MCLK_DIR_OUT9) &
643 ~(BP10G_MCLK_DATA_OUT9)));
645 } else if (pbpctl_dev->bp_fiber5) {
646 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL, ((ctrl_ext |
647 BPCTLI_CTRL_EXT_MCLK_DIR5)
650 (BPCTLI_CTRL_EXT_MDIO_DIR5
652 BPCTLI_CTRL_EXT_MCLK_DATA5)));
654 } else if (pbpctl_dev->bp_i80) {
655 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL,
657 ~BPCTLI_CTRL_EXT_MDIO_DIR80));
658 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT,
659 ((ctrl | BPCTLI_CTRL_EXT_MCLK_DIR80)
660 & ~(BPCTLI_CTRL_EXT_MCLK_DATA80)));
662 } else if (pbpctl_dev->bp_540) {
663 BP10G_WRITE_REG(pbpctl_dev, ESDP,
664 ((ctrl | BP540_MCLK_DIR) &
665 ~(BP540_MDIO_DIR | BP540_MCLK_DATA)));
667 } else if (pbpctl_dev->bp_10gb) {
669 BP10GB_WRITE_REG(pbpctl_dev, MISC_REG_SPIO,
670 (ctrl_ext | BP10GB_MDIO_DIR |
671 BP10GB_MCLK_CLR) & ~(BP10GB_MCLK_DIR |
676 } else if (!pbpctl_dev->bp_10g)
677 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT, ((ctrl_ext |
678 BPCTLI_CTRL_EXT_MCLK_DIR)
681 (BPCTLI_CTRL_EXT_MDIO_DIR
683 BPCTLI_CTRL_EXT_MCLK_DATA)));
686 BP10G_WRITE_REG(pbpctl_dev, EODSDP, ((ctrl_ext | BP10G_MDIO_DATA_OUT) & ~BP10G_MCLK_DATA_OUT)); /* ? */
687 /* printk("0x28=0x%x\n",BP10G_READ_REG(pbpctl_dev,EODSDP);); */
691 usec_delay(PULSE_TIME);
692 if (pbpctl_dev->bp_10g9) {
693 /*BP10G_WRITE_REG(pbpctl_dev, I2CCTL, (ctrl_ext|BP10G_MCLK_DATA_OUT9|BP10G_MDIO_DATA_OUT9)); */
695 BP10G_WRITE_REG(pbpctl_dev_c, ESDP,
696 (ctrl | BP10G_MCLK_DATA_OUT9 |
697 BP10G_MCLK_DIR_OUT9));
699 } else if (pbpctl_dev->bp_fiber5) {
700 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL, ((ctrl_ext |
701 BPCTLI_CTRL_EXT_MCLK_DIR5
703 BPCTLI_CTRL_EXT_MCLK_DATA5)
706 (BPCTLI_CTRL_EXT_MDIO_DIR5)));
708 } else if (pbpctl_dev->bp_i80) {
709 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL,
711 ~(BPCTLI_CTRL_EXT_MDIO_DIR80)));
712 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT,
713 (ctrl | BPCTLI_CTRL_EXT_MCLK_DIR80 |
714 BPCTLI_CTRL_EXT_MCLK_DATA80));
716 } else if (pbpctl_dev->bp_540) {
717 BP10G_WRITE_REG(pbpctl_dev, ESDP,
718 ((ctrl | BP540_MCLK_DIR |
722 } else if (pbpctl_dev->bp_10gb) {
723 BP10GB_WRITE_REG(pbpctl_dev, MISC_REG_SPIO,
724 (ctrl_ext | BP10GB_MDIO_DIR |
725 BP10GB_MCLK_SET) & ~(BP10GB_MCLK_DIR |
730 } else if (!pbpctl_dev->bp_10g)
731 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT, ((ctrl_ext |
732 BPCTLI_CTRL_EXT_MCLK_DIR
734 BPCTLI_CTRL_EXT_MCLK_DATA)
737 (BPCTLI_CTRL_EXT_MDIO_DIR)));
740 BP10G_WRITE_REG(pbpctl_dev, EODSDP,
741 (ctrl_ext | BP10G_MCLK_DATA_OUT |
742 BP10G_MDIO_DATA_OUT));
745 if (pbpctl_dev->bp_10g9) {
746 ctrl_ext = BP10G_READ_REG(pbpctl_dev, I2CCTL);
748 } else if ((pbpctl_dev->bp_fiber5) || (pbpctl_dev->bp_i80)) {
749 ctrl_ext = BPCTL_READ_REG(pbpctl_dev, CTRL);
750 } else if (pbpctl_dev->bp_540) {
751 ctrl_ext = BP10G_READ_REG(pbpctl_dev, ESDP);
752 } else if (pbpctl_dev->bp_10gb)
753 ctrl_ext = BP10GB_READ_REG(pbpctl_dev, MISC_REG_SPIO);
755 else if (!pbpctl_dev->bp_10g)
756 ctrl_ext = BPCTL_READ_REG(pbpctl_dev, CTRL_EXT);
758 ctrl_ext = BP10G_READ_REG(pbpctl_dev, EODSDP);
760 usec_delay(PULSE_TIME);
761 if (pbpctl_dev->bp_10g9) {
762 if (ctrl_ext & BP10G_MDIO_DATA_IN9)
765 } else if (pbpctl_dev->bp_fiber5) {
766 if (ctrl_ext & BPCTLI_CTRL_EXT_MDIO_DATA5)
768 } else if (pbpctl_dev->bp_i80) {
769 if (ctrl_ext & BPCTLI_CTRL_EXT_MDIO_DATA80)
771 } else if (pbpctl_dev->bp_540) {
772 if (ctrl_ext & BP540_MDIO_DATA)
774 } else if (pbpctl_dev->bp_10gb) {
775 if (ctrl_ext & BP10GB_MDIO_DATA)
778 } else if (!pbpctl_dev->bp_10g) {
780 if (ctrl_ext & BPCTLI_CTRL_EXT_MDIO_DATA)
784 if (ctrl_ext & BP10G_MDIO_DATA_IN)
793 static void write_reg(bpctl_dev_t *pbpctl_dev, unsigned char value,
796 uint32_t ctrl_ext = 0, ctrl = 0;
797 bpctl_dev_t *pbpctl_dev_c = NULL;
799 if (pbpctl_dev->bp_10g9) {
800 if (!(pbpctl_dev_c = get_status_port_fn(pbpctl_dev)))
803 if ((pbpctl_dev->wdt_status == WDT_STATUS_EN) &&
804 (pbpctl_dev->bp_ext_ver < PXG4BPFI_VER))
805 wdt_time_left(pbpctl_dev);
808 spin_lock_irqsave(&pbpctl_dev->bypass_wr_lock, flags);
810 atomic_set(&pbpctl_dev->wdt_busy, 1);
812 if (pbpctl_dev->bp_10g9) {
814 ctrl_ext = BP10G_READ_REG(pbpctl_dev, I2CCTL);
815 ctrl = BP10G_READ_REG(pbpctl_dev_c, ESDP);
817 /* BP10G_WRITE_REG(pbpctl_dev, I2CCTL, (ctrl_ext&~(BP10G_MCLK_DATA_OUT9|BP10G_MDIO_DATA_OUT9))); */
818 BP10G_WRITE_REG(pbpctl_dev, I2CCTL,
819 (ctrl_ext & ~BP10G_MDIO_DATA_OUT9));
820 BP10G_WRITE_REG(pbpctl_dev_c, ESDP,
821 ((ctrl | BP10G_MCLK_DIR_OUT9) &
822 ~(BP10G_MCLK_DATA_OUT9)));
824 } else if (pbpctl_dev->bp_fiber5) {
825 ctrl_ext = BPCTL_READ_REG(pbpctl_dev, CTRL);
826 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL, ((ctrl_ext |
827 BPCTLI_CTRL_EXT_MCLK_DIR5
829 BPCTLI_CTRL_EXT_MDIO_DIR5)
832 (BPCTLI_CTRL_EXT_MDIO_DATA5
834 BPCTLI_CTRL_EXT_MCLK_DATA5)));
835 } else if (pbpctl_dev->bp_i80) {
836 ctrl_ext = BPCTL_READ_REG(pbpctl_dev, CTRL);
837 ctrl = BPCTL_READ_REG(pbpctl_dev, CTRL_EXT);
838 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL, ((ctrl_ext |
839 BPCTLI_CTRL_EXT_MDIO_DIR80)
841 ~BPCTLI_CTRL_EXT_MDIO_DATA80));
842 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT,
843 ((ctrl | BPCTLI_CTRL_EXT_MCLK_DIR80) &
844 ~BPCTLI_CTRL_EXT_MCLK_DATA80));
846 } else if (pbpctl_dev->bp_540) {
847 ctrl = ctrl_ext = BP10G_READ_REG(pbpctl_dev, ESDP);
848 BP10G_WRITE_REG(pbpctl_dev, ESDP, ((ctrl |
854 } else if (pbpctl_dev->bp_10gb) {
855 ctrl_ext = BP10GB_READ_REG(pbpctl_dev, MISC_REG_SPIO);
857 BP10GB_WRITE_REG(pbpctl_dev, MISC_REG_SPIO,
858 (ctrl_ext | BP10GB_MDIO_CLR | BP10GB_MCLK_CLR)
859 & ~(BP10GB_MCLK_DIR | BP10GB_MDIO_DIR |
860 BP10GB_MDIO_SET | BP10GB_MCLK_SET));
862 } else if (!pbpctl_dev->bp_10g) {
864 ctrl_ext = BPCTL_READ_REG(pbpctl_dev, CTRL_EXT);
865 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT, ((ctrl_ext |
866 BPCTLI_CTRL_EXT_MCLK_DIR
868 BPCTLI_CTRL_EXT_MDIO_DIR)
871 (BPCTLI_CTRL_EXT_MDIO_DATA
873 BPCTLI_CTRL_EXT_MCLK_DATA)));
875 ctrl = BP10G_READ_REG(pbpctl_dev, ESDP);
876 ctrl_ext = BP10G_READ_REG(pbpctl_dev, EODSDP);
877 BP10G_WRITE_REG(pbpctl_dev, EODSDP,
879 ~(BP10G_MCLK_DATA_OUT | BP10G_MDIO_DATA_OUT)));
881 usec_delay(CMND_INTERVAL);
884 write_pulse(pbpctl_dev, ctrl_ext, SYNC_CMD_VAL, SYNC_CMD_LEN);
886 write_pulse(pbpctl_dev, ctrl_ext, WR_CMD_VAL, WR_CMD_LEN);
887 write_pulse(pbpctl_dev, ctrl_ext, addr, ADDR_CMD_LEN);
890 write_pulse(pbpctl_dev, ctrl_ext, value, WR_DATA_LEN);
891 if (pbpctl_dev->bp_10g9) {
892 /*BP10G_WRITE_REG(pbpctl_dev, I2CCTL, (ctrl_ext&~(BP10G_MCLK_DATA_OUT9|BP10G_MDIO_DATA_OUT9))); */
894 BP10G_WRITE_REG(pbpctl_dev, I2CCTL,
895 (ctrl_ext & ~BP10G_MDIO_DATA_OUT9));
896 BP10G_WRITE_REG(pbpctl_dev_c, ESDP,
897 ((ctrl | BP10G_MCLK_DIR_OUT9) &
898 ~(BP10G_MCLK_DATA_OUT9)));
900 } else if (pbpctl_dev->bp_fiber5) {
901 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL, ((ctrl_ext |
902 BPCTLI_CTRL_EXT_MCLK_DIR5
904 BPCTLI_CTRL_EXT_MDIO_DIR5)
907 (BPCTLI_CTRL_EXT_MDIO_DATA5
909 BPCTLI_CTRL_EXT_MCLK_DATA5)));
910 } else if (pbpctl_dev->bp_i80) {
911 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL, ((ctrl_ext |
912 BPCTLI_CTRL_EXT_MDIO_DIR80)
914 ~BPCTLI_CTRL_EXT_MDIO_DATA80));
915 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT,
916 ((ctrl | BPCTLI_CTRL_EXT_MCLK_DIR80) &
917 ~BPCTLI_CTRL_EXT_MCLK_DATA80));
918 } else if (pbpctl_dev->bp_540) {
919 BP10G_WRITE_REG(pbpctl_dev, ESDP, ((ctrl |
924 } else if (pbpctl_dev->bp_10gb) {
925 BP10GB_WRITE_REG(pbpctl_dev, MISC_REG_SPIO,
926 (ctrl_ext | BP10GB_MDIO_CLR | BP10GB_MCLK_CLR)
927 & ~(BP10GB_MCLK_DIR | BP10GB_MDIO_DIR |
928 BP10GB_MDIO_SET | BP10GB_MCLK_SET));
930 } else if (!pbpctl_dev->bp_10g)
932 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT, ((ctrl_ext |
933 BPCTLI_CTRL_EXT_MCLK_DIR
935 BPCTLI_CTRL_EXT_MDIO_DIR)
938 (BPCTLI_CTRL_EXT_MDIO_DATA
940 BPCTLI_CTRL_EXT_MCLK_DATA)));
942 BP10G_WRITE_REG(pbpctl_dev, EODSDP,
944 ~(BP10G_MCLK_DATA_OUT | BP10G_MDIO_DATA_OUT)));
948 usec_delay(CMND_INTERVAL * 4);
950 if ((pbpctl_dev->wdt_status == WDT_STATUS_EN) &&
951 (pbpctl_dev->bp_ext_ver < PXG4BPFI_VER) && (addr == CMND_REG_ADDR))
952 pbpctl_dev->bypass_wdt_on_time = jiffies;
954 spin_unlock_irqrestore(&pbpctl_dev->bypass_wr_lock, flags);
956 atomic_set(&pbpctl_dev->wdt_busy, 0);
961 static void write_data(bpctl_dev_t *pbpctl_dev, unsigned char value)
963 write_reg(pbpctl_dev, value, CMND_REG_ADDR);
966 static int read_reg(bpctl_dev_t *pbpctl_dev, unsigned char addr)
968 uint32_t ctrl_ext = 0, ctrl = 0, ctrl_value = 0;
969 bpctl_dev_t *pbpctl_dev_c = NULL;
973 spin_lock_irqsave(&pbpctl_dev->bypass_wr_lock, flags);
975 atomic_set(&pbpctl_dev->wdt_busy, 1);
977 if (pbpctl_dev->bp_10g9) {
978 if (!(pbpctl_dev_c = get_status_port_fn(pbpctl_dev)))
982 if (pbpctl_dev->bp_10g9) {
983 ctrl_ext = BP10G_READ_REG(pbpctl_dev, I2CCTL);
984 ctrl = BP10G_READ_REG(pbpctl_dev_c, ESDP);
986 /* BP10G_WRITE_REG(pbpctl_dev, I2CCTL, (ctrl_ext&~(BP10G_MCLK_DATA_OUT9|BP10G_MDIO_DATA_OUT9))); */
988 BP10G_WRITE_REG(pbpctl_dev, I2CCTL,
989 (ctrl_ext & ~BP10G_MDIO_DATA_OUT9));
990 BP10G_WRITE_REG(pbpctl_dev_c, ESDP,
991 ((ctrl | BP10G_MCLK_DIR_OUT9) &
992 ~(BP10G_MCLK_DATA_OUT9)));
994 } else if (pbpctl_dev->bp_fiber5) {
995 ctrl_ext = BPCTL_READ_REG(pbpctl_dev, CTRL);
997 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL, ((ctrl_ext |
998 BPCTLI_CTRL_EXT_MCLK_DIR5
1000 BPCTLI_CTRL_EXT_MDIO_DIR5)
1003 (BPCTLI_CTRL_EXT_MDIO_DATA5
1005 BPCTLI_CTRL_EXT_MCLK_DATA5)));
1006 } else if (pbpctl_dev->bp_i80) {
1007 ctrl_ext = BPCTL_READ_REG(pbpctl_dev, CTRL);
1008 ctrl = BPCTL_READ_REG(pbpctl_dev, CTRL_EXT);
1010 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL, ((ctrl_ext |
1011 BPCTLI_CTRL_EXT_MDIO_DIR80)
1013 ~BPCTLI_CTRL_EXT_MDIO_DATA80));
1014 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT,
1015 ((ctrl | BPCTLI_CTRL_EXT_MCLK_DIR80) &
1016 ~BPCTLI_CTRL_EXT_MCLK_DATA80));
1017 } else if (pbpctl_dev->bp_540) {
1018 ctrl_ext = BP10G_READ_REG(pbpctl_dev, ESDP);
1019 ctrl = BP10G_READ_REG(pbpctl_dev, ESDP);
1021 BP10G_WRITE_REG(pbpctl_dev, ESDP, ((ctrl | BP540_MCLK_DIR |
1025 } else if (pbpctl_dev->bp_10gb) {
1026 ctrl_ext = BP10GB_READ_REG(pbpctl_dev, MISC_REG_SPIO);
1028 BP10GB_WRITE_REG(pbpctl_dev, MISC_REG_SPIO,
1029 (ctrl_ext | BP10GB_MDIO_CLR | BP10GB_MCLK_CLR)
1030 & ~(BP10GB_MCLK_DIR | BP10GB_MDIO_DIR |
1031 BP10GB_MDIO_SET | BP10GB_MCLK_SET));
1034 /*BP10GB_WRITE_REG(pbpctl_dev, MISC_REG_SPIO, (ctrl_ext | BP10GB_MCLK_DIR | BP10GB_MDIO_DIR|
1035 BP10GB_MCLK_CLR|BP10GB_MDIO_CLR));
1036 ctrl_ext = BP10GB_READ_REG(pbpctl_dev, MISC_REG_SPIO);
1037 printk("1reg=%x\n", ctrl_ext); */
1039 BP10GB_WRITE_REG(pbpctl_dev, MISC_REG_SPIO, ((ctrl_ext |
1042 & ~(BP10GB_MCLK_CLR | BP10GB_MDIO_SET |
1043 BP10GB_MCLK_DIR | BP10GB_MDIO_DIR));
1045 /* bnx2x_set_spio(pbpctl_dev, 5, MISC_REGISTERS_SPIO_OUTPUT_LOW);
1046 bnx2x_set_spio(pbpctl_dev, 4, MISC_REGISTERS_SPIO_OUTPUT_LOW);
1047 bnx2x_set_spio(pbpctl_dev, 4, MISC_REGISTERS_SPIO_INPUT_HI_Z); */
1049 ctrl_ext = BP10GB_READ_REG(pbpctl_dev, MISC_REG_SPIO);
1051 printk("2reg=%x\n", ctrl_ext);
1054 spin_unlock_irqrestore(&pbpctl_dev->bypass_wr_lock, flags);
1056 atomic_set(&pbpctl_dev->wdt_busy, 0);
1063 } else if (!pbpctl_dev->bp_10g) {
1065 ctrl_ext = BPCTL_READ_REG(pbpctl_dev, CTRL_EXT);
1067 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT, ((ctrl_ext |
1068 BPCTLI_CTRL_EXT_MCLK_DIR
1070 BPCTLI_CTRL_EXT_MDIO_DIR)
1073 (BPCTLI_CTRL_EXT_MDIO_DATA
1075 BPCTLI_CTRL_EXT_MCLK_DATA)));
1078 ctrl = BP10G_READ_REG(pbpctl_dev, ESDP);
1079 ctrl_ext = BP10G_READ_REG(pbpctl_dev, EODSDP);
1080 BP10G_WRITE_REG(pbpctl_dev, EODSDP,
1082 ~(BP10G_MCLK_DATA_OUT | BP10G_MDIO_DATA_OUT)));
1086 usec_delay(CMND_INTERVAL);
1089 write_pulse(pbpctl_dev, ctrl_ext, SYNC_CMD_VAL, SYNC_CMD_LEN);
1091 write_pulse(pbpctl_dev, ctrl_ext, RD_CMD_VAL, RD_CMD_LEN);
1093 write_pulse(pbpctl_dev, ctrl_ext, addr, ADDR_CMD_LEN);
1096 if (pbpctl_dev->bp_10g9) {
1098 /*BP10G_WRITE_REG(pbpctl_dev, I2CCTL, (ctrl_ext|BP10G_MCLK_DATA_OUT9|BP10G_MDIO_DATA_OUT9)); */
1099 BP10G_WRITE_REG(pbpctl_dev, I2CCTL,
1100 (ctrl_ext | BP10G_MDIO_DATA_OUT9));
1101 BP10G_WRITE_REG(pbpctl_dev_c, ESDP,
1102 (ctrl | BP10G_MCLK_DATA_OUT9 |
1103 BP10G_MCLK_DIR_OUT9));
1105 } else if (pbpctl_dev->bp_fiber5) {
1106 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL, ((ctrl_ext |
1107 BPCTLI_CTRL_EXT_MCLK_DIR5
1109 BPCTLI_CTRL_EXT_MCLK_DATA5)
1112 (BPCTLI_CTRL_EXT_MDIO_DIR5
1114 BPCTLI_CTRL_EXT_MDIO_DATA5)));
1116 } else if (pbpctl_dev->bp_i80) {
1117 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL,
1119 ~(BPCTLI_CTRL_EXT_MDIO_DATA80 |
1120 BPCTLI_CTRL_EXT_MDIO_DIR80)));
1121 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT,
1122 (ctrl | BPCTLI_CTRL_EXT_MCLK_DIR80 |
1123 BPCTLI_CTRL_EXT_MCLK_DATA80));
1125 } else if (pbpctl_dev->bp_540) {
1126 BP10G_WRITE_REG(pbpctl_dev, ESDP,
1127 (((ctrl | BP540_MDIO_DIR | BP540_MCLK_DIR |
1128 BP540_MCLK_DATA) & ~BP540_MDIO_DATA)));
1130 } else if (pbpctl_dev->bp_10gb) {
1132 BP10GB_WRITE_REG(pbpctl_dev, MISC_REG_SPIO,
1133 (ctrl_ext | BP10GB_MDIO_DIR | BP10GB_MCLK_SET)
1134 & ~(BP10GB_MCLK_DIR | BP10GB_MDIO_SET |
1135 BP10GB_MDIO_CLR | BP10GB_MCLK_CLR));
1137 } else if (!pbpctl_dev->bp_10g)
1138 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT, ((ctrl_ext |
1139 BPCTLI_CTRL_EXT_MCLK_DIR
1141 BPCTLI_CTRL_EXT_MCLK_DATA)
1144 (BPCTLI_CTRL_EXT_MDIO_DIR
1146 BPCTLI_CTRL_EXT_MDIO_DATA)));
1149 BP10G_WRITE_REG(pbpctl_dev, EODSDP,
1150 (ctrl_ext | BP10G_MCLK_DATA_OUT |
1151 BP10G_MDIO_DATA_OUT));
1155 usec_delay(PULSE_TIME);
1157 ctrl_value = read_pulse(pbpctl_dev, ctrl_ext, RD_DATA_LEN);
1159 if (pbpctl_dev->bp_10g9) {
1160 ctrl_ext = BP10G_READ_REG(pbpctl_dev, I2CCTL);
1161 ctrl = BP10G_READ_REG(pbpctl_dev_c, ESDP);
1163 /* BP10G_WRITE_REG(pbpctl_dev, I2CCTL, (ctrl_ext&~(BP10G_MCLK_DATA_OUT9|BP10G_MDIO_DATA_OUT9))); */
1165 BP10G_WRITE_REG(pbpctl_dev, I2CCTL,
1166 (ctrl_ext & ~BP10G_MDIO_DATA_OUT9));
1167 BP10G_WRITE_REG(pbpctl_dev_c, ESDP,
1168 ((ctrl | BP10G_MCLK_DIR_OUT9) &
1169 ~(BP10G_MCLK_DATA_OUT9)));
1171 } else if (pbpctl_dev->bp_fiber5) {
1172 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL, ((ctrl_ext |
1173 BPCTLI_CTRL_EXT_MCLK_DIR5
1175 BPCTLI_CTRL_EXT_MDIO_DIR5)
1178 (BPCTLI_CTRL_EXT_MDIO_DATA5
1180 BPCTLI_CTRL_EXT_MCLK_DATA5)));
1181 } else if (pbpctl_dev->bp_i80) {
1182 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL, ((ctrl_ext |
1183 BPCTLI_CTRL_EXT_MDIO_DIR80)
1185 ~BPCTLI_CTRL_EXT_MDIO_DATA80));
1186 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT,
1187 ((ctrl | BPCTLI_CTRL_EXT_MCLK_DIR80) &
1188 ~BPCTLI_CTRL_EXT_MCLK_DATA80));
1190 } else if (pbpctl_dev->bp_540) {
1191 ctrl = BP10G_READ_REG(pbpctl_dev, ESDP);
1192 BP10G_WRITE_REG(pbpctl_dev, ESDP, ((ctrl | BP540_MCLK_DIR |
1197 } else if (pbpctl_dev->bp_10gb) {
1198 ctrl_ext = BP10GB_READ_REG(pbpctl_dev, MISC_REG_SPIO);
1199 BP10GB_WRITE_REG(pbpctl_dev, MISC_REG_SPIO,
1200 (ctrl_ext | BP10GB_MDIO_CLR | BP10GB_MCLK_CLR)
1201 & ~(BP10GB_MCLK_DIR | BP10GB_MDIO_DIR |
1202 BP10GB_MDIO_SET | BP10GB_MCLK_SET));
1204 } else if (!pbpctl_dev->bp_10g) {
1205 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT, ((ctrl_ext |
1206 BPCTLI_CTRL_EXT_MCLK_DIR
1208 BPCTLI_CTRL_EXT_MDIO_DIR)
1211 (BPCTLI_CTRL_EXT_MDIO_DATA
1213 BPCTLI_CTRL_EXT_MCLK_DATA)));
1216 ctrl = BP10G_READ_REG(pbpctl_dev, ESDP);
1217 ctrl_ext = BP10G_READ_REG(pbpctl_dev, EODSDP);
1218 BP10G_WRITE_REG(pbpctl_dev, EODSDP,
1220 ~(BP10G_MCLK_DATA_OUT | BP10G_MDIO_DATA_OUT)));
1224 usec_delay(CMND_INTERVAL * 4);
1226 spin_unlock_irqrestore(&pbpctl_dev->bypass_wr_lock, flags);
1228 atomic_set(&pbpctl_dev->wdt_busy, 0);
1234 static int wdt_pulse(bpctl_dev_t *pbpctl_dev)
1236 uint32_t ctrl_ext = 0, ctrl = 0;
1237 bpctl_dev_t *pbpctl_dev_c = NULL;
1240 unsigned long flags;
1242 spin_lock_irqsave(&pbpctl_dev->bypass_wr_lock, flags);
1245 if ((atomic_read(&pbpctl_dev->wdt_busy)) == 1)
1248 if (pbpctl_dev->bp_10g9) {
1249 if (!(pbpctl_dev_c = get_status_port_fn(pbpctl_dev)))
1253 if (pbpctl_dev->bp_10g9) {
1254 ctrl_ext = BP10G_READ_REG(pbpctl_dev, I2CCTL);
1255 ctrl = BP10G_READ_REG(pbpctl_dev_c, ESDP);
1257 /* BP10G_WRITE_REG(pbpctl_dev, I2CCTL, (ctrl_ext&~(BP10G_MCLK_DATA_OUT9|BP10G_MDIO_DATA_OUT9))); */
1259 BP10G_WRITE_REG(pbpctl_dev, I2CCTL,
1260 (ctrl_ext & ~BP10G_MDIO_DATA_OUT9));
1261 BP10G_WRITE_REG(pbpctl_dev_c, ESDP,
1262 ((ctrl | BP10G_MCLK_DIR_OUT9) &
1263 ~(BP10G_MCLK_DATA_OUT9)));
1265 } else if (pbpctl_dev->bp_fiber5) {
1266 ctrl_ext = BPCTL_READ_REG(pbpctl_dev, CTRL);
1267 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL, ((ctrl_ext |
1268 BPCTLI_CTRL_EXT_MCLK_DIR5
1270 BPCTLI_CTRL_EXT_MDIO_DIR5)
1273 (BPCTLI_CTRL_EXT_MDIO_DATA5
1275 BPCTLI_CTRL_EXT_MCLK_DATA5)));
1276 } else if (pbpctl_dev->bp_i80) {
1277 ctrl_ext = BPCTL_READ_REG(pbpctl_dev, CTRL);
1278 ctrl = BPCTL_READ_REG(pbpctl_dev, CTRL_EXT);
1279 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL, ((ctrl_ext |
1280 BPCTLI_CTRL_EXT_MDIO_DIR80)
1282 ~BPCTLI_CTRL_EXT_MDIO_DATA80));
1283 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT,
1284 ((ctrl | BPCTLI_CTRL_EXT_MCLK_DIR80) &
1285 ~BPCTLI_CTRL_EXT_MCLK_DATA80));
1286 } else if (pbpctl_dev->bp_540) {
1287 ctrl_ext = ctrl = BP10G_READ_REG(pbpctl_dev, ESDP);
1288 BP10G_WRITE_REG(pbpctl_dev, ESDP, ((ctrl | BP540_MCLK_DIR |
1292 } else if (pbpctl_dev->bp_10gb) {
1293 ctrl_ext = BP10GB_READ_REG(pbpctl_dev, MISC_REG_SPIO);
1294 BP10GB_WRITE_REG(pbpctl_dev, MISC_REG_SPIO,
1295 (ctrl_ext | BP10GB_MDIO_CLR | BP10GB_MCLK_CLR)
1296 & ~(BP10GB_MCLK_DIR | BP10GB_MDIO_DIR |
1297 BP10GB_MDIO_SET | BP10GB_MCLK_SET));
1299 } else if (!pbpctl_dev->bp_10g) {
1301 ctrl_ext = BPCTL_READ_REG(pbpctl_dev, CTRL_EXT);
1302 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT, ((ctrl_ext |
1303 BPCTLI_CTRL_EXT_MCLK_DIR
1305 BPCTLI_CTRL_EXT_MDIO_DIR)
1308 (BPCTLI_CTRL_EXT_MDIO_DATA
1310 BPCTLI_CTRL_EXT_MCLK_DATA)));
1313 ctrl = BP10G_READ_REG(pbpctl_dev, ESDP);
1314 ctrl_ext = BP10G_READ_REG(pbpctl_dev, EODSDP);
1315 BP10G_WRITE_REG(pbpctl_dev, EODSDP,
1317 ~(BP10G_MCLK_DATA_OUT | BP10G_MDIO_DATA_OUT)));
1320 if (pbpctl_dev->bp_10g9) {
1321 /* BP10G_WRITE_REG(pbpctl_dev, I2CCTL, ((ctrl_ext|BP10G_MCLK_DATA_OUT9)&~BP10G_MDIO_DATA_OUT9)); */
1323 BP10G_WRITE_REG(pbpctl_dev, I2CCTL,
1324 (ctrl_ext & ~BP10G_MDIO_DATA_OUT9));
1325 BP10G_WRITE_REG(pbpctl_dev_c, ESDP,
1326 (ctrl | BP10G_MCLK_DATA_OUT9 |
1327 BP10G_MCLK_DIR_OUT9));
1329 } else if (pbpctl_dev->bp_fiber5) {
1330 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL, ((ctrl_ext |
1331 BPCTLI_CTRL_EXT_MCLK_DIR5
1333 BPCTLI_CTRL_EXT_MDIO_DIR5
1335 BPCTLI_CTRL_EXT_MCLK_DATA5)
1338 (BPCTLI_CTRL_EXT_MDIO_DATA5)));
1339 } else if (pbpctl_dev->bp_i80) {
1340 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL, ((ctrl_ext |
1341 BPCTLI_CTRL_EXT_MDIO_DIR80)
1343 ~BPCTLI_CTRL_EXT_MDIO_DATA80));
1344 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT,
1345 (ctrl | BPCTLI_CTRL_EXT_MCLK_DIR80 |
1346 BPCTLI_CTRL_EXT_MCLK_DATA80));
1348 } else if (pbpctl_dev->bp_540) {
1349 BP10G_WRITE_REG(pbpctl_dev, ESDP, ((ctrl |
1355 } else if (pbpctl_dev->bp_10gb) {
1356 ctrl_ext = BP10GB_READ_REG(pbpctl_dev, MISC_REG_SPIO);
1358 BP10GB_WRITE_REG(pbpctl_dev, MISC_REG_SPIO,
1359 (ctrl_ext | BP10GB_MDIO_CLR | BP10GB_MCLK_SET)
1360 & ~(BP10GB_MCLK_DIR | BP10GB_MDIO_DIR |
1361 BP10GB_MDIO_SET | BP10GB_MCLK_CLR));
1363 } else if (!pbpctl_dev->bp_10g)
1364 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT, ((ctrl_ext |
1365 BPCTLI_CTRL_EXT_MCLK_DIR
1367 BPCTLI_CTRL_EXT_MDIO_DIR
1369 BPCTLI_CTRL_EXT_MCLK_DATA)
1372 (BPCTLI_CTRL_EXT_MDIO_DATA)));
1375 BP10G_WRITE_REG(pbpctl_dev, EODSDP,
1376 ((ctrl_ext | BP10G_MCLK_DATA_OUT) &
1377 ~BP10G_MDIO_DATA_OUT));
1381 usec_delay(WDT_INTERVAL);
1382 if (pbpctl_dev->bp_10g9) {
1383 /* BP10G_WRITE_REG(pbpctl_dev, I2CCTL, (ctrl_ext&~(BP10G_MCLK_DATA_OUT9|BP10G_MDIO_DATA_OUT9))); */
1385 BP10G_WRITE_REG(pbpctl_dev, I2CCTL,
1386 (ctrl_ext & ~BP10G_MDIO_DATA_OUT9));
1387 BP10G_WRITE_REG(pbpctl_dev_c, ESDP,
1388 ((ctrl | BP10G_MCLK_DIR_OUT9) &
1389 ~(BP10G_MCLK_DATA_OUT9)));
1391 } else if (pbpctl_dev->bp_fiber5) {
1392 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL, ((ctrl_ext |
1393 BPCTLI_CTRL_EXT_MCLK_DIR5
1395 BPCTLI_CTRL_EXT_MDIO_DIR5)
1398 (BPCTLI_CTRL_EXT_MCLK_DATA5
1400 BPCTLI_CTRL_EXT_MDIO_DATA5)));
1401 } else if (pbpctl_dev->bp_i80) {
1402 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL, ((ctrl_ext |
1403 BPCTLI_CTRL_EXT_MDIO_DIR80)
1405 ~BPCTLI_CTRL_EXT_MDIO_DATA80));
1406 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT,
1407 ((ctrl | BPCTLI_CTRL_EXT_MCLK_DIR80) &
1408 ~BPCTLI_CTRL_EXT_MCLK_DATA80));
1410 } else if (pbpctl_dev->bp_540) {
1411 BP10G_WRITE_REG(pbpctl_dev, ESDP, ((ctrl | BP540_MCLK_DIR |
1416 } else if (pbpctl_dev->bp_10gb) {
1417 ctrl_ext = BP10GB_READ_REG(pbpctl_dev, MISC_REG_SPIO);
1418 BP10GB_WRITE_REG(pbpctl_dev, MISC_REG_SPIO,
1419 (ctrl_ext | BP10GB_MDIO_CLR | BP10GB_MCLK_CLR)
1420 & ~(BP10GB_MCLK_DIR | BP10GB_MDIO_DIR |
1421 BP10GB_MDIO_SET | BP10GB_MCLK_SET));
1423 } else if (!pbpctl_dev->bp_10g)
1424 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT, ((ctrl_ext |
1425 BPCTLI_CTRL_EXT_MCLK_DIR
1427 BPCTLI_CTRL_EXT_MDIO_DIR)
1430 (BPCTLI_CTRL_EXT_MCLK_DATA
1432 BPCTLI_CTRL_EXT_MDIO_DATA)));
1435 BP10G_WRITE_REG(pbpctl_dev, EODSDP,
1437 ~(BP10G_MCLK_DATA_OUT | BP10G_MDIO_DATA_OUT)));
1439 if ((pbpctl_dev->wdt_status == WDT_STATUS_EN) /*&&
1440 (pbpctl_dev->bp_ext_ver<PXG4BPFI_VER) */ )
1441 pbpctl_dev->bypass_wdt_on_time = jiffies;
1443 spin_unlock_irqrestore(&pbpctl_dev->bypass_wr_lock, flags);
1445 usec_delay(CMND_INTERVAL * 4);
1449 static void data_pulse(bpctl_dev_t *pbpctl_dev, unsigned char value)
1452 uint32_t ctrl_ext = 0;
1454 unsigned long flags;
1456 wdt_time_left(pbpctl_dev);
1458 spin_lock_irqsave(&pbpctl_dev->bypass_wr_lock, flags);
1460 atomic_set(&pbpctl_dev->wdt_busy, 1);
1463 ctrl_ext = BPCTL_READ_REG(pbpctl_dev, CTRL_EXT);
1464 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT, ((ctrl_ext |
1465 BPCTLI_CTRL_EXT_SDP6_DIR |
1466 BPCTLI_CTRL_EXT_SDP7_DIR) &
1467 ~(BPCTLI_CTRL_EXT_SDP6_DATA |
1468 BPCTLI_CTRL_EXT_SDP7_DATA)));
1470 usec_delay(INIT_CMND_INTERVAL);
1471 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT, ((ctrl_ext |
1472 BPCTLI_CTRL_EXT_SDP6_DIR |
1473 BPCTLI_CTRL_EXT_SDP7_DIR |
1474 BPCTLI_CTRL_EXT_SDP6_DATA) &
1476 (BPCTLI_CTRL_EXT_SDP7_DATA)));
1477 usec_delay(INIT_CMND_INTERVAL);
1480 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT, ctrl_ext |
1481 BPCTLI_CTRL_EXT_SDP6_DIR |
1482 BPCTLI_CTRL_EXT_SDP7_DIR |
1483 BPCTLI_CTRL_EXT_SDP6_DATA |
1484 BPCTLI_CTRL_EXT_SDP7_DATA);
1485 usec_delay(PULSE_INTERVAL);
1486 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT, ((ctrl_ext |
1487 BPCTLI_CTRL_EXT_SDP6_DIR
1489 BPCTLI_CTRL_EXT_SDP7_DIR
1491 BPCTLI_CTRL_EXT_SDP6_DATA)
1493 ~BPCTLI_CTRL_EXT_SDP7_DATA));
1494 usec_delay(PULSE_INTERVAL);
1498 usec_delay(INIT_CMND_INTERVAL - PULSE_INTERVAL);
1499 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT, ((ctrl_ext |
1500 BPCTLI_CTRL_EXT_SDP6_DIR |
1501 BPCTLI_CTRL_EXT_SDP7_DIR) &
1502 ~(BPCTLI_CTRL_EXT_SDP6_DATA |
1503 BPCTLI_CTRL_EXT_SDP7_DATA)));
1504 usec_delay(WDT_TIME_CNT);
1505 if (pbpctl_dev->wdt_status == WDT_STATUS_EN)
1506 pbpctl_dev->bypass_wdt_on_time = jiffies;
1508 spin_unlock_irqrestore(&pbpctl_dev->bypass_wr_lock, flags);
1510 atomic_set(&pbpctl_dev->wdt_busy, 0);
1515 static int send_wdt_pulse(bpctl_dev_t *pbpctl_dev)
1517 uint32_t ctrl_ext = 0;
1520 unsigned long flags;
1522 spin_lock_irqsave(&pbpctl_dev->bypass_wr_lock, flags);
1525 if ((atomic_read(&pbpctl_dev->wdt_busy)) == 1)
1528 wdt_time_left(pbpctl_dev);
1529 ctrl_ext = BPCTL_READ_REG(pbpctl_dev, CTRL_EXT);
1531 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT, ctrl_ext | /* 1 */
1532 BPCTLI_CTRL_EXT_SDP7_DIR |
1533 BPCTLI_CTRL_EXT_SDP7_DATA);
1534 usec_delay(PULSE_INTERVAL);
1535 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT, ((ctrl_ext | /* 0 */
1536 BPCTLI_CTRL_EXT_SDP7_DIR) &
1537 ~BPCTLI_CTRL_EXT_SDP7_DATA));
1539 usec_delay(PULSE_INTERVAL);
1540 if (pbpctl_dev->wdt_status == WDT_STATUS_EN)
1541 pbpctl_dev->bypass_wdt_on_time = jiffies;
1543 spin_unlock_irqrestore(&pbpctl_dev->bypass_wr_lock, flags);
1549 void send_bypass_clear_pulse(bpctl_dev_t *pbpctl_dev, unsigned int value)
1551 uint32_t ctrl_ext = 0;
1553 ctrl_ext = BPCTL_READ_REG(pbpctl_dev, CTRL_EXT);
1554 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT, ((ctrl_ext | /* 0 */
1555 BPCTLI_CTRL_EXT_SDP6_DIR) &
1556 ~BPCTLI_CTRL_EXT_SDP6_DATA));
1558 usec_delay(PULSE_INTERVAL);
1560 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT, ctrl_ext | /* 1 */
1561 BPCTLI_CTRL_EXT_SDP6_DIR |
1562 BPCTLI_CTRL_EXT_SDP6_DATA);
1563 usec_delay(PULSE_INTERVAL);
1566 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT, ((ctrl_ext | /* 0 */
1567 BPCTLI_CTRL_EXT_SDP6_DIR) &
1568 ~BPCTLI_CTRL_EXT_SDP6_DATA));
1569 usec_delay(PULSE_INTERVAL);
1575 int pulse_set_fn(bpctl_dev_t *pbpctl_dev, unsigned int counter)
1577 uint32_t ctrl_ext = 0;
1582 ctrl_ext = BPCTL_READ_REG(pbpctl_dev, CTRL_EXT);
1583 write_pulse_1(pbpctl_dev, ctrl_ext, counter, counter);
1585 pbpctl_dev->bypass_wdt_status = 0;
1586 if (pbpctl_dev->bp_ext_ver >= PXG2BPI_VER) {
1587 write_pulse_1(pbpctl_dev, ctrl_ext, counter, counter);
1589 wdt_time_left(pbpctl_dev);
1590 if (pbpctl_dev->wdt_status == WDT_STATUS_EN) {
1591 pbpctl_dev->wdt_status = 0;
1592 data_pulse(pbpctl_dev, counter);
1593 pbpctl_dev->wdt_status = WDT_STATUS_EN;
1594 pbpctl_dev->bypass_wdt_on_time = jiffies;
1597 data_pulse(pbpctl_dev, counter);
1603 int zero_set_fn(bpctl_dev_t *pbpctl_dev)
1605 uint32_t ctrl_ext = 0, ctrl_value = 0;
1609 if (pbpctl_dev->bp_ext_ver >= PXG2BPI_VER) {
1612 ctrl_ext = BPCTL_READ_REG(pbpctl_dev, CTRL_EXT);
1614 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT, ((ctrl_ext |
1615 BPCTLI_CTRL_EXT_MCLK_DIR)
1618 (BPCTLI_CTRL_EXT_MCLK_DATA
1620 BPCTLI_CTRL_EXT_MDIO_DIR
1622 BPCTLI_CTRL_EXT_MDIO_DATA)));
1628 int pulse_get2_fn(bpctl_dev_t *pbpctl_dev)
1630 uint32_t ctrl_ext = 0, ctrl_value = 0;
1634 if (pbpctl_dev->bp_ext_ver >= PXG2BPI_VER) {
1635 printk("pulse_get_fn\n");
1636 ctrl_ext = BPCTL_READ_REG(pbpctl_dev, CTRL_EXT);
1637 ctrl_value = read_pulse_2(pbpctl_dev, ctrl_ext);
1638 printk("read:%d\n", ctrl_value);
1643 int pulse_get1_fn(bpctl_dev_t *pbpctl_dev)
1645 uint32_t ctrl_ext = 0, ctrl_value = 0;
1649 if (pbpctl_dev->bp_ext_ver >= PXG2BPI_VER) {
1651 printk("pulse_get_fn\n");
1653 ctrl_ext = BPCTL_READ_REG(pbpctl_dev, CTRL_EXT);
1654 ctrl_value = read_pulse_1(pbpctl_dev, ctrl_ext);
1655 printk("read:%d\n", ctrl_value);
1660 int gpio6_set_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_SDP6_DIR |
1667 BPCTLI_CTRL_EXT_SDP6_DATA);
1671 int gpio7_set_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_SDP7_DIR |
1678 BPCTLI_CTRL_EXT_SDP7_DATA);
1682 int gpio7_clear_fn(bpctl_dev_t *pbpctl_dev)
1684 uint32_t ctrl_ext = 0;
1686 ctrl_ext = BPCTL_READ_REG(pbpctl_dev, CTRL_EXT);
1687 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT, ((ctrl_ext |
1688 BPCTLI_CTRL_EXT_SDP7_DIR) &
1689 ~BPCTLI_CTRL_EXT_SDP7_DATA));
1693 int gpio6_clear_fn(bpctl_dev_t *pbpctl_dev)
1695 uint32_t ctrl_ext = 0;
1697 ctrl_ext = BPCTL_READ_REG(pbpctl_dev, CTRL_EXT);
1698 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT, ((ctrl_ext |
1699 BPCTLI_CTRL_EXT_SDP6_DIR) &
1700 ~BPCTLI_CTRL_EXT_SDP6_DATA));
1703 #endif /*BYPASS_DEBUG */
1705 static bpctl_dev_t *lookup_port(bpctl_dev_t *dev)
1709 for (n = 0, p = bpctl_dev_arr; n < device_num && p->pdev; n++) {
1710 if (p->bus == dev->bus
1711 && p->slot == dev->slot
1712 && p->func == (dev->func ^ 1))
1718 static bpctl_dev_t *get_status_port_fn(bpctl_dev_t *pbpctl_dev)
1721 if (pbpctl_dev->func == 0 || pbpctl_dev->func == 2)
1722 return lookup_port(pbpctl_dev);
1727 static bpctl_dev_t *get_master_port_fn(bpctl_dev_t *pbpctl_dev)
1730 if (pbpctl_dev->func == 1 || pbpctl_dev->func == 3)
1731 return lookup_port(pbpctl_dev);
1736 /**************************************/
1737 /**************INTEL API***************/
1738 /**************************************/
1740 static void write_data_port_int(bpctl_dev_t *pbpctl_dev,
1741 unsigned char ctrl_value)
1745 value = BPCTL_READ_REG(pbpctl_dev, CTRL);
1746 /* Make SDP0 Pin Directonality to Output */
1747 value |= BPCTLI_CTRL_SDP0_DIR;
1748 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL, value);
1750 value &= ~BPCTLI_CTRL_SDP0_DATA;
1751 value |= ((ctrl_value & 0x1) << BPCTLI_CTRL_SDP0_SHIFT);
1752 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL, value);
1754 value = (BPCTL_READ_REG(pbpctl_dev, CTRL_EXT));
1755 /* Make SDP2 Pin Directonality to Output */
1756 value |= BPCTLI_CTRL_EXT_SDP6_DIR;
1757 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT, value);
1759 value &= ~BPCTLI_CTRL_EXT_SDP6_DATA;
1760 value |= (((ctrl_value & 0x2) >> 1) << BPCTLI_CTRL_EXT_SDP6_SHIFT);
1761 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT, value);
1765 static int write_data_int(bpctl_dev_t *pbpctl_dev, unsigned char value)
1767 bpctl_dev_t *pbpctl_dev_b = NULL;
1769 if (!(pbpctl_dev_b = get_status_port_fn(pbpctl_dev)))
1771 atomic_set(&pbpctl_dev->wdt_busy, 1);
1772 write_data_port_int(pbpctl_dev, value & 0x3);
1773 write_data_port_int(pbpctl_dev_b, ((value & 0xc) >> 2));
1774 atomic_set(&pbpctl_dev->wdt_busy, 0);
1779 static int wdt_pulse_int(bpctl_dev_t *pbpctl_dev)
1782 if ((atomic_read(&pbpctl_dev->wdt_busy)) == 1)
1785 if ((write_data_int(pbpctl_dev, RESET_WDT_INT)) < 0)
1787 msec_delay_bp(CMND_INTERVAL_INT);
1788 if ((write_data_int(pbpctl_dev, CMND_OFF_INT)) < 0)
1790 msec_delay_bp(CMND_INTERVAL_INT);
1792 if (pbpctl_dev->wdt_status == WDT_STATUS_EN)
1793 pbpctl_dev->bypass_wdt_on_time = jiffies;
1798 /*************************************/
1799 /************* COMMANDS **************/
1800 /*************************************/
1802 /* CMND_ON 0x4 (100)*/
1803 int cmnd_on(bpctl_dev_t *pbpctl_dev)
1805 int ret = BP_NOT_CAP;
1807 if (pbpctl_dev->bp_caps & SW_CTL_CAP) {
1808 if (INTEL_IF_SERIES(pbpctl_dev->subdevice))
1810 if (pbpctl_dev->bp_ext_ver >= PXG2BPI_VER)
1811 write_data(pbpctl_dev, CMND_ON);
1813 data_pulse(pbpctl_dev, CMND_ON);
1819 /* CMND_OFF 0x2 (10)*/
1820 int cmnd_off(bpctl_dev_t *pbpctl_dev)
1822 int ret = BP_NOT_CAP;
1824 if (pbpctl_dev->bp_caps & SW_CTL_CAP) {
1825 if (INTEL_IF_SERIES(pbpctl_dev->subdevice)) {
1826 write_data_int(pbpctl_dev, CMND_OFF_INT);
1827 msec_delay_bp(CMND_INTERVAL_INT);
1828 } else if (pbpctl_dev->bp_ext_ver >= PXG2BPI_VER)
1829 write_data(pbpctl_dev, CMND_OFF);
1831 data_pulse(pbpctl_dev, CMND_OFF);
1837 /* BYPASS_ON (0xa)*/
1838 int bypass_on(bpctl_dev_t *pbpctl_dev)
1840 int ret = BP_NOT_CAP;
1842 if (pbpctl_dev->bp_caps & BP_CAP) {
1843 if (INTEL_IF_SERIES(pbpctl_dev->subdevice)) {
1844 write_data_int(pbpctl_dev, BYPASS_ON_INT);
1845 msec_delay_bp(BYPASS_DELAY_INT);
1846 pbpctl_dev->bp_status_un = 0;
1847 } else if (pbpctl_dev->bp_ext_ver >= PXG2BPI_VER) {
1848 write_data(pbpctl_dev, BYPASS_ON);
1849 if (pbpctl_dev->bp_ext_ver >= PXG2TBPI_VER)
1850 msec_delay_bp(LATCH_DELAY);
1852 data_pulse(pbpctl_dev, BYPASS_ON);
1858 /* BYPASS_OFF (0x8 111)*/
1859 int bypass_off(bpctl_dev_t *pbpctl_dev)
1861 int ret = BP_NOT_CAP;
1863 if (pbpctl_dev->bp_caps & BP_CAP) {
1864 if (INTEL_IF_SERIES(pbpctl_dev->subdevice)) {
1865 write_data_int(pbpctl_dev, DIS_BYPASS_CAP_INT);
1866 msec_delay_bp(BYPASS_DELAY_INT);
1867 write_data_int(pbpctl_dev, PWROFF_BYPASS_ON_INT);
1868 msec_delay_bp(BYPASS_DELAY_INT);
1869 pbpctl_dev->bp_status_un = 0;
1870 } else if (pbpctl_dev->bp_ext_ver >= PXG2BPI_VER) {
1871 write_data(pbpctl_dev, BYPASS_OFF);
1872 if (pbpctl_dev->bp_ext_ver >= PXG2TBPI_VER)
1873 msec_delay_bp(LATCH_DELAY);
1875 data_pulse(pbpctl_dev, BYPASS_OFF);
1882 int tap_off(bpctl_dev_t *pbpctl_dev)
1884 int ret = BP_NOT_CAP;
1885 if ((pbpctl_dev->bp_caps & TAP_CAP)
1886 && (pbpctl_dev->bp_ext_ver >= PXG2TBPI_VER)) {
1887 write_data(pbpctl_dev, TAP_OFF);
1888 msec_delay_bp(LATCH_DELAY);
1895 int tap_on(bpctl_dev_t *pbpctl_dev)
1897 int ret = BP_NOT_CAP;
1898 if ((pbpctl_dev->bp_caps & TAP_CAP)
1899 && (pbpctl_dev->bp_ext_ver >= PXG2TBPI_VER)) {
1900 write_data(pbpctl_dev, TAP_ON);
1901 msec_delay_bp(LATCH_DELAY);
1908 int disc_off(bpctl_dev_t *pbpctl_dev)
1911 if ((pbpctl_dev->bp_caps & DISC_CAP) && (pbpctl_dev->bp_ext_ver >= 0x8)) {
1912 write_data(pbpctl_dev, DISC_OFF);
1913 msec_delay_bp(LATCH_DELAY);
1920 int disc_on(bpctl_dev_t *pbpctl_dev)
1923 if ((pbpctl_dev->bp_caps & DISC_CAP) && (pbpctl_dev->bp_ext_ver >= 0x8)) {
1924 write_data(pbpctl_dev, /*DISC_ON */ 0x85);
1925 msec_delay_bp(LATCH_DELAY);
1932 int disc_port_on(bpctl_dev_t *pbpctl_dev)
1935 bpctl_dev_t *pbpctl_dev_m;
1937 if ((is_bypass_fn(pbpctl_dev)) == 1)
1938 pbpctl_dev_m = pbpctl_dev;
1940 pbpctl_dev_m = get_master_port_fn(pbpctl_dev);
1941 if (pbpctl_dev_m == NULL)
1944 if (pbpctl_dev_m->bp_caps_ex & DISC_PORT_CAP_EX) {
1945 if (is_bypass_fn(pbpctl_dev) == 1) {
1947 write_data(pbpctl_dev_m, TX_DISA);
1950 write_data(pbpctl_dev_m, TX_DISB);
1953 msec_delay_bp(LATCH_DELAY);
1960 int disc_port_off(bpctl_dev_t *pbpctl_dev)
1963 bpctl_dev_t *pbpctl_dev_m;
1965 if ((is_bypass_fn(pbpctl_dev)) == 1)
1966 pbpctl_dev_m = pbpctl_dev;
1968 pbpctl_dev_m = get_master_port_fn(pbpctl_dev);
1969 if (pbpctl_dev_m == NULL)
1972 if (pbpctl_dev_m->bp_caps_ex & DISC_PORT_CAP_EX) {
1973 if (is_bypass_fn(pbpctl_dev) == 1)
1974 write_data(pbpctl_dev_m, TX_ENA);
1976 write_data(pbpctl_dev_m, TX_ENB);
1978 msec_delay_bp(LATCH_DELAY);
1984 /*TWO_PORT_LINK_HW_EN (0xe)*/
1985 int tpl_hw_on(bpctl_dev_t *pbpctl_dev)
1987 int ret = 0, ctrl = 0;
1988 bpctl_dev_t *pbpctl_dev_b = NULL;
1990 if (!(pbpctl_dev_b = get_status_port_fn(pbpctl_dev)))
1993 if (pbpctl_dev->bp_caps_ex & TPL2_CAP_EX) {
1994 cmnd_on(pbpctl_dev);
1995 write_data(pbpctl_dev, TPL2_ON);
1996 msec_delay_bp(LATCH_DELAY + EEPROM_WR_DELAY);
1997 cmnd_off(pbpctl_dev);
2001 if (TPL_IF_SERIES(pbpctl_dev->subdevice)) {
2002 ctrl = BPCTL_READ_REG(pbpctl_dev_b, CTRL);
2003 BPCTL_BP_WRITE_REG(pbpctl_dev_b, CTRL,
2004 ((ctrl | BPCTLI_CTRL_SWDPIO0) &
2005 ~BPCTLI_CTRL_SWDPIN0));
2011 /*TWO_PORT_LINK_HW_DIS (0xc)*/
2012 int tpl_hw_off(bpctl_dev_t *pbpctl_dev)
2014 int ret = 0, ctrl = 0;
2015 bpctl_dev_t *pbpctl_dev_b = NULL;
2017 if (!(pbpctl_dev_b = get_status_port_fn(pbpctl_dev)))
2019 if (pbpctl_dev->bp_caps_ex & TPL2_CAP_EX) {
2020 cmnd_on(pbpctl_dev);
2021 write_data(pbpctl_dev, TPL2_OFF);
2022 msec_delay_bp(LATCH_DELAY + EEPROM_WR_DELAY);
2023 cmnd_off(pbpctl_dev);
2026 if (TPL_IF_SERIES(pbpctl_dev->subdevice)) {
2027 ctrl = BPCTL_READ_REG(pbpctl_dev_b, CTRL);
2028 BPCTL_BP_WRITE_REG(pbpctl_dev_b, CTRL,
2029 (ctrl | BPCTLI_CTRL_SWDPIO0 |
2030 BPCTLI_CTRL_SWDPIN0));
2036 /* WDT_OFF (0x6 110)*/
2037 int wdt_off(bpctl_dev_t *pbpctl_dev)
2039 int ret = BP_NOT_CAP;
2041 if (pbpctl_dev->bp_caps & WD_CTL_CAP) {
2042 if (INTEL_IF_SERIES(pbpctl_dev->subdevice)) {
2043 bypass_off(pbpctl_dev);
2044 } else if (pbpctl_dev->bp_ext_ver >= PXG2BPI_VER)
2045 write_data(pbpctl_dev, WDT_OFF);
2047 data_pulse(pbpctl_dev, WDT_OFF);
2048 pbpctl_dev->wdt_status = WDT_STATUS_DIS;
2058 wdt_val_array[] = { 1000, 1500, 2000, 3000, 4000, 8000, 16000, 32000, 0 };
2060 int wdt_on(bpctl_dev_t *pbpctl_dev, unsigned int timeout)
2063 if (pbpctl_dev->bp_caps & WD_CTL_CAP) {
2064 unsigned int pulse = 0, temp_value = 0, temp_cnt = 0;
2065 pbpctl_dev->wdt_status = 0;
2067 if (INTEL_IF_SERIES(pbpctl_dev->subdevice)) {
2068 for (; wdt_val_array[temp_cnt]; temp_cnt++)
2069 if (timeout <= wdt_val_array[temp_cnt])
2072 if (!wdt_val_array[temp_cnt])
2075 timeout = wdt_val_array[temp_cnt];
2078 write_data_int(pbpctl_dev, DIS_BYPASS_CAP_INT);
2079 msec_delay_bp(BYPASS_DELAY_INT);
2080 pbpctl_dev->bp_status_un = 0;
2081 write_data_int(pbpctl_dev, temp_cnt);
2082 pbpctl_dev->bypass_wdt_on_time = jiffies;
2083 msec_delay_bp(CMND_INTERVAL_INT);
2084 pbpctl_dev->bypass_timer_interval = timeout;
2088 TIMEOUT_UNIT ? TIMEOUT_UNIT : (timeout >
2092 temp_value = timeout / 100;
2093 while ((temp_value >>= 1))
2095 if (timeout > ((1 << temp_cnt) * 100))
2097 pbpctl_dev->bypass_wdt_on_time = jiffies;
2098 pulse = (WDT_ON | temp_cnt);
2099 if (pbpctl_dev->bp_ext_ver == OLD_IF_VER)
2100 data_pulse(pbpctl_dev, pulse);
2102 write_data(pbpctl_dev, pulse);
2103 pbpctl_dev->bypass_timer_interval =
2104 (1 << temp_cnt) * 100;
2106 pbpctl_dev->wdt_status = WDT_STATUS_EN;
2112 void bp75_put_hw_semaphore_generic(bpctl_dev_t *pbpctl_dev)
2116 swsm = BPCTL_READ_REG(pbpctl_dev, SWSM);
2118 swsm &= ~(BPCTLI_SWSM_SMBI | BPCTLI_SWSM_SWESMBI);
2120 BPCTL_WRITE_REG(pbpctl_dev, SWSM, swsm);
2123 s32 bp75_get_hw_semaphore_generic(bpctl_dev_t *pbpctl_dev)
2127 s32 timeout = 8192 + 1;
2130 /* Get the SW semaphore */
2131 while (i < timeout) {
2132 swsm = BPCTL_READ_REG(pbpctl_dev, SWSM);
2133 if (!(swsm & BPCTLI_SWSM_SMBI))
2142 ("bpctl_mod: Driver can't access device - SMBI bit is set.\n");
2147 /* Get the FW semaphore. */
2148 for (i = 0; i < timeout; i++) {
2149 swsm = BPCTL_READ_REG(pbpctl_dev, SWSM);
2150 BPCTL_WRITE_REG(pbpctl_dev, SWSM, swsm | BPCTLI_SWSM_SWESMBI);
2152 /* Semaphore acquired if bit latched */
2153 if (BPCTL_READ_REG(pbpctl_dev, SWSM) & BPCTLI_SWSM_SWESMBI)
2160 /* Release semaphores */
2161 bp75_put_hw_semaphore_generic(pbpctl_dev);
2162 printk("bpctl_mod: Driver can't access the NVM\n");
2171 static void bp75_release_phy(bpctl_dev_t *pbpctl_dev)
2173 u16 mask = BPCTLI_SWFW_PHY0_SM;
2176 if ((pbpctl_dev->func == 1) || (pbpctl_dev->func == 3))
2177 mask = BPCTLI_SWFW_PHY1_SM;
2179 while (bp75_get_hw_semaphore_generic(pbpctl_dev) != 0) ;
2182 swfw_sync = BPCTL_READ_REG(pbpctl_dev, SW_FW_SYNC);
2184 BPCTL_WRITE_REG(pbpctl_dev, SW_FW_SYNC, swfw_sync);
2186 bp75_put_hw_semaphore_generic(pbpctl_dev);
2189 static s32 bp75_acquire_phy(bpctl_dev_t *pbpctl_dev)
2191 u16 mask = BPCTLI_SWFW_PHY0_SM;
2196 s32 i = 0, timeout = 200;
2198 if ((pbpctl_dev->func == 1) || (pbpctl_dev->func == 3))
2199 mask = BPCTLI_SWFW_PHY1_SM;
2202 fwmask = mask << 16;
2204 while (i < timeout) {
2205 if (bp75_get_hw_semaphore_generic(pbpctl_dev)) {
2210 swfw_sync = BPCTL_READ_REG(pbpctl_dev, SW_FW_SYNC);
2211 if (!(swfw_sync & (fwmask | swmask)))
2214 bp75_put_hw_semaphore_generic(pbpctl_dev);
2221 ("bpctl_mod: Driver can't access resource, SW_FW_SYNC timeout.\n");
2226 swfw_sync |= swmask;
2227 BPCTL_WRITE_REG(pbpctl_dev, SW_FW_SYNC, swfw_sync);
2229 bp75_put_hw_semaphore_generic(pbpctl_dev);
2235 s32 bp75_read_phy_reg_mdic(bpctl_dev_t *pbpctl_dev, u32 offset, u16 *data)
2241 mdic = ((offset << BPCTLI_MDIC_REG_SHIFT) |
2242 (phy_addr << BPCTLI_MDIC_PHY_SHIFT) | (BPCTLI_MDIC_OP_READ));
2244 BPCTL_WRITE_REG(pbpctl_dev, MDIC, mdic);
2246 for (i = 0; i < (BPCTLI_GEN_POLL_TIMEOUT * 3); i++) {
2248 mdic = BPCTL_READ_REG(pbpctl_dev, MDIC);
2249 if (mdic & BPCTLI_MDIC_READY)
2252 if (!(mdic & BPCTLI_MDIC_READY)) {
2253 printk("bpctl_mod: MDI Read did not complete\n");
2257 if (mdic & BPCTLI_MDIC_ERROR) {
2258 printk("bpctl_mod: MDI Error\n");
2268 s32 bp75_write_phy_reg_mdic(bpctl_dev_t *pbpctl_dev, u32 offset, u16 data)
2274 mdic = (((u32) data) |
2275 (offset << BPCTLI_MDIC_REG_SHIFT) |
2276 (phy_addr << BPCTLI_MDIC_PHY_SHIFT) | (BPCTLI_MDIC_OP_WRITE));
2278 BPCTL_WRITE_REG(pbpctl_dev, MDIC, mdic);
2280 for (i = 0; i < (BPCTLI_GEN_POLL_TIMEOUT * 3); i++) {
2282 mdic = BPCTL_READ_REG(pbpctl_dev, MDIC);
2283 if (mdic & BPCTLI_MDIC_READY)
2286 if (!(mdic & BPCTLI_MDIC_READY)) {
2287 printk("bpctl_mod: MDI Write did not complete\n");
2291 if (mdic & BPCTLI_MDIC_ERROR) {
2292 printk("bpctl_mod: MDI Error\n");
2301 static s32 bp75_read_phy_reg(bpctl_dev_t *pbpctl_dev, u32 offset, u16 *data)
2305 ret_val = bp75_acquire_phy(pbpctl_dev);
2309 if (offset > BPCTLI_MAX_PHY_MULTI_PAGE_REG) {
2310 ret_val = bp75_write_phy_reg_mdic(pbpctl_dev,
2311 BPCTLI_IGP01E1000_PHY_PAGE_SELECT,
2318 bp75_read_phy_reg_mdic(pbpctl_dev,
2319 BPCTLI_MAX_PHY_REG_ADDRESS & offset, data);
2322 bp75_release_phy(pbpctl_dev);
2327 static s32 bp75_write_phy_reg(bpctl_dev_t *pbpctl_dev, u32 offset, u16 data)
2331 ret_val = bp75_acquire_phy(pbpctl_dev);
2335 if (offset > BPCTLI_MAX_PHY_MULTI_PAGE_REG) {
2336 ret_val = bp75_write_phy_reg_mdic(pbpctl_dev,
2337 BPCTLI_IGP01E1000_PHY_PAGE_SELECT,
2344 bp75_write_phy_reg_mdic(pbpctl_dev,
2345 BPCTLI_MAX_PHY_REG_ADDRESS & offset, data);
2348 bp75_release_phy(pbpctl_dev);
2354 /* SET_TX (non-Bypass command :)) */
2355 static int set_tx(bpctl_dev_t *pbpctl_dev, int tx_state)
2357 int ret = 0, ctrl = 0;
2358 bpctl_dev_t *pbpctl_dev_m;
2359 if ((is_bypass_fn(pbpctl_dev)) == 1)
2360 pbpctl_dev_m = pbpctl_dev;
2362 pbpctl_dev_m = get_master_port_fn(pbpctl_dev);
2363 if (pbpctl_dev_m == NULL)
2365 if (pbpctl_dev_m->bp_caps_ex & DISC_PORT_CAP_EX) {
2366 ctrl = BPCTL_READ_REG(pbpctl_dev, CTRL);
2368 if (pbpctl_dev->bp_540) {
2369 ctrl = BP10G_READ_REG(pbpctl_dev, ESDP);
2370 BP10G_WRITE_REG(pbpctl_dev, ESDP,
2371 (ctrl | BP10G_SDP1_DIR |
2375 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL,
2376 (ctrl | BPCTLI_CTRL_SDP1_DIR
2377 | BPCTLI_CTRL_SWDPIN1));
2380 if (pbpctl_dev->bp_540) {
2381 ctrl = BP10G_READ_REG(pbpctl_dev, ESDP);
2382 BP10G_WRITE_REG(pbpctl_dev, ESDP,
2383 ((ctrl | BP10G_SDP1_DIR) &
2386 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL,
2388 BPCTLI_CTRL_SDP1_DIR) &
2389 ~BPCTLI_CTRL_SWDPIN1));
2394 } else if (pbpctl_dev->bp_caps & TX_CTL_CAP) {
2395 if (PEG5_IF_SERIES(pbpctl_dev->subdevice)) {
2400 bp75_read_phy_reg(pbpctl_dev,
2403 if (mii_reg & BPCTLI_MII_CR_POWER_DOWN) {
2409 ~BPCTLI_MII_CR_POWER_DOWN);
2416 bp75_read_phy_reg(pbpctl_dev,
2420 mii_reg |= BPCTLI_MII_CR_POWER_DOWN;
2422 bp75_write_phy_reg(pbpctl_dev,
2429 if (pbpctl_dev->bp_fiber5) {
2430 ctrl = BPCTL_READ_REG(pbpctl_dev, CTRL_EXT);
2432 } else if (pbpctl_dev->bp_10gb)
2433 ctrl = BP10GB_READ_REG(pbpctl_dev, MISC_REG_GPIO);
2435 else if (!pbpctl_dev->bp_10g)
2436 ctrl = BPCTL_READ_REG(pbpctl_dev, CTRL);
2438 ctrl = BP10G_READ_REG(pbpctl_dev, ESDP);
2441 if (pbpctl_dev->bp_10g9) {
2442 BP10G_WRITE_REG(pbpctl_dev, ESDP,
2443 (ctrl | BP10G_SDP3_DATA |
2446 } else if (pbpctl_dev->bp_fiber5) {
2447 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT,
2449 BPCTLI_CTRL_EXT_SDP6_DIR |
2450 BPCTLI_CTRL_EXT_SDP6_DATA));
2452 } else if (pbpctl_dev->bp_10gb) {
2453 if ((pbpctl_dev->func == 1)
2454 || (pbpctl_dev->func == 3))
2455 BP10GB_WRITE_REG(pbpctl_dev,
2458 BP10GB_GPIO0_SET_P1) &
2459 ~(BP10GB_GPIO0_CLR_P1 |
2460 BP10GB_GPIO0_OE_P1));
2462 BP10GB_WRITE_REG(pbpctl_dev,
2465 BP10GB_GPIO0_OE_P0 |
2466 BP10GB_GPIO0_SET_P0));
2468 } else if (pbpctl_dev->bp_i80) {
2469 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL,
2470 (ctrl | BPCTLI_CTRL_SDP1_DIR
2471 | BPCTLI_CTRL_SWDPIN1));
2473 } else if (pbpctl_dev->bp_540) {
2474 ctrl = BP10G_READ_REG(pbpctl_dev, ESDP);
2475 BP10G_WRITE_REG(pbpctl_dev, ESDP,
2476 (ctrl | BP10G_SDP1_DIR |
2481 else if (!pbpctl_dev->bp_10g)
2482 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL,
2483 (ctrl | BPCTLI_CTRL_SWDPIO0 |
2484 BPCTLI_CTRL_SWDPIN0));
2487 BP10G_WRITE_REG(pbpctl_dev, ESDP,
2488 (ctrl | BP10G_SDP0_DATA |
2492 if (pbpctl_dev->bp_10g9) {
2493 BP10G_WRITE_REG(pbpctl_dev, ESDP,
2494 ((ctrl | BP10G_SDP3_DIR) &
2497 } else if (pbpctl_dev->bp_fiber5) {
2498 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL_EXT,
2500 BPCTLI_CTRL_EXT_SDP6_DIR) &
2501 ~BPCTLI_CTRL_EXT_SDP6_DATA));
2503 } else if (pbpctl_dev->bp_10gb) {
2504 if ((bpctl_dev_arr->func == 1)
2505 || (bpctl_dev_arr->func == 3))
2506 BP10GB_WRITE_REG(pbpctl_dev,
2509 BP10GB_GPIO0_CLR_P1) &
2510 ~(BP10GB_GPIO0_SET_P1 |
2511 BP10GB_GPIO0_OE_P1));
2513 BP10GB_WRITE_REG(pbpctl_dev,
2516 BP10GB_GPIO0_OE_P0 |
2517 BP10GB_GPIO0_CLR_P0));
2519 } else if (pbpctl_dev->bp_i80) {
2520 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL,
2522 BPCTLI_CTRL_SDP1_DIR) &
2523 ~BPCTLI_CTRL_SWDPIN1));
2524 } else if (pbpctl_dev->bp_540) {
2525 ctrl = BP10G_READ_REG(pbpctl_dev, ESDP);
2526 BP10G_WRITE_REG(pbpctl_dev, ESDP,
2527 ((ctrl | BP10G_SDP1_DIR) &
2531 else if (!pbpctl_dev->bp_10g) {
2532 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL,
2533 ((ctrl | BPCTLI_CTRL_SWDPIO0)
2534 & ~BPCTLI_CTRL_SWDPIN0));
2535 if (!PEGF_IF_SERIES(pbpctl_dev->subdevice)) {
2536 BPCTL_BP_WRITE_REG(pbpctl_dev, CTRL,
2539 (BPCTLI_CTRL_SDP0_DATA
2541 BPCTLI_CTRL_SDP0_DIR)));
2544 BP10G_WRITE_REG(pbpctl_dev, ESDP,
2545 ((ctrl | BP10G_SDP0_DIR) &
2556 /* SET_FORCE_LINK (non-Bypass command :)) */
2557 static int set_bp_force_link(bpctl_dev_t *pbpctl_dev, int tx_state)
2559 int ret = 0, ctrl = 0;
2561 if (DBI_IF_SERIES(pbpctl_dev->subdevice)) {
2563 if ((pbpctl_dev->bp_10g) || (pbpctl_dev->bp_10g9)) {
2565 ctrl = BPCTL_READ_REG(pbpctl_dev, CTRL);
2567 BP10G_WRITE_REG(pbpctl_dev, ESDP,
2568 ctrl & ~BP10G_SDP1_DIR);
2570 BP10G_WRITE_REG(pbpctl_dev, ESDP,
2571 ((ctrl | BP10G_SDP1_DIR) &
2580 /*RESET_CONT 0x20 */
2581 int reset_cont(bpctl_dev_t *pbpctl_dev)
2583 int ret = BP_NOT_CAP;
2585 if (pbpctl_dev->bp_caps & SW_CTL_CAP) {
2586 if (INTEL_IF_SERIES(pbpctl_dev->subdevice))
2588 if (pbpctl_dev->bp_ext_ver >= PXG2BPI_VER)
2589 write_data(pbpctl_dev, RESET_CONT);
2591 data_pulse(pbpctl_dev, RESET_CONT);
2597 /*DIS_BYPASS_CAP 0x22 */
2598 int dis_bypass_cap(bpctl_dev_t *pbpctl_dev)
2601 if (pbpctl_dev->bp_caps & BP_DIS_CAP) {
2602 if (INTEL_IF_SERIES(pbpctl_dev->subdevice)) {
2603 write_data_int(pbpctl_dev, DIS_BYPASS_CAP_INT);
2604 msec_delay_bp(BYPASS_DELAY_INT);
2606 write_data(pbpctl_dev, BYPASS_OFF);
2607 msec_delay_bp(LATCH_DELAY);
2608 write_data(pbpctl_dev, DIS_BYPASS_CAP);
2609 msec_delay_bp(BYPASS_CAP_DELAY);
2616 /*EN_BYPASS_CAP 0x24 */
2617 int en_bypass_cap(bpctl_dev_t *pbpctl_dev)
2619 if (pbpctl_dev->bp_caps & BP_DIS_CAP) {
2620 if (INTEL_IF_SERIES(pbpctl_dev->subdevice)) {
2621 write_data_int(pbpctl_dev, PWROFF_BYPASS_ON_INT);
2622 msec_delay_bp(BYPASS_DELAY_INT);
2624 write_data(pbpctl_dev, EN_BYPASS_CAP);
2625 msec_delay_bp(BYPASS_CAP_DELAY);
2632 /* BYPASS_STATE_PWRON 0x26*/
2633 int bypass_state_pwron(bpctl_dev_t *pbpctl_dev)
2635 if (pbpctl_dev->bp_caps & BP_PWUP_CTL_CAP) {
2636 write_data(pbpctl_dev, BYPASS_STATE_PWRON);
2637 if (pbpctl_dev->bp_ext_ver == PXG2BPI_VER)
2638 msec_delay_bp(DFLT_PWRON_DELAY);
2640 msec_delay_bp(LATCH_DELAY + EEPROM_WR_DELAY);
2646 /* NORMAL_STATE_PWRON 0x28*/
2647 int normal_state_pwron(bpctl_dev_t *pbpctl_dev)
2649 if ((pbpctl_dev->bp_caps & BP_PWUP_CTL_CAP)
2650 || (pbpctl_dev->bp_caps & TAP_PWUP_CTL_CAP)) {
2651 write_data(pbpctl_dev, NORMAL_STATE_PWRON);
2652 if (pbpctl_dev->bp_ext_ver == PXG2BPI_VER)
2653 msec_delay_bp(DFLT_PWRON_DELAY);
2655 msec_delay_bp(LATCH_DELAY + EEPROM_WR_DELAY);
2661 /* BYPASS_STATE_PWROFF 0x27*/
2662 int bypass_state_pwroff(bpctl_dev_t *pbpctl_dev)
2664 if (pbpctl_dev->bp_caps & BP_PWOFF_CTL_CAP) {
2665 write_data(pbpctl_dev, BYPASS_STATE_PWROFF);
2666 msec_delay_bp(LATCH_DELAY + EEPROM_WR_DELAY);
2672 /* NORMAL_STATE_PWROFF 0x29*/
2673 int normal_state_pwroff(bpctl_dev_t *pbpctl_dev)
2675 if ((pbpctl_dev->bp_caps & BP_PWOFF_CTL_CAP)) {
2676 write_data(pbpctl_dev, NORMAL_STATE_PWROFF);
2677 msec_delay_bp(LATCH_DELAY + EEPROM_WR_DELAY);
2683 /*TAP_STATE_PWRON 0x2a*/
2684 int tap_state_pwron(bpctl_dev_t *pbpctl_dev)
2686 if (pbpctl_dev->bp_caps & TAP_PWUP_CTL_CAP) {
2687 write_data(pbpctl_dev, TAP_STATE_PWRON);
2688 msec_delay_bp(LATCH_DELAY + EEPROM_WR_DELAY);
2694 /*DIS_TAP_CAP 0x2c*/
2695 int dis_tap_cap(bpctl_dev_t *pbpctl_dev)
2697 if (pbpctl_dev->bp_caps & TAP_DIS_CAP) {
2698 write_data(pbpctl_dev, DIS_TAP_CAP);
2699 msec_delay_bp(BYPASS_CAP_DELAY);
2706 int en_tap_cap(bpctl_dev_t *pbpctl_dev)
2708 if (pbpctl_dev->bp_caps & TAP_DIS_CAP) {
2709 write_data(pbpctl_dev, EN_TAP_CAP);
2710 msec_delay_bp(BYPASS_CAP_DELAY);
2716 /*DISC_STATE_PWRON 0x2a*/
2717 int disc_state_pwron(bpctl_dev_t *pbpctl_dev)
2719 if (pbpctl_dev->bp_caps & DISC_PWUP_CTL_CAP) {
2720 if (pbpctl_dev->bp_ext_ver >= 0x8) {
2721 write_data(pbpctl_dev, DISC_STATE_PWRON);
2722 msec_delay_bp(LATCH_DELAY + EEPROM_WR_DELAY);
2729 /*DIS_DISC_CAP 0x2c*/
2730 int dis_disc_cap(bpctl_dev_t *pbpctl_dev)
2732 if (pbpctl_dev->bp_caps & DISC_DIS_CAP) {
2733 if (pbpctl_dev->bp_ext_ver >= 0x8) {
2734 write_data(pbpctl_dev, DIS_DISC_CAP);
2735 msec_delay_bp(BYPASS_CAP_DELAY);
2742 /*DISC_STATE_PWRON 0x2a*/
2743 int disc_port_state_pwron(bpctl_dev_t *pbpctl_dev)
2746 bpctl_dev_t *pbpctl_dev_m;
2750 if ((is_bypass_fn(pbpctl_dev)) == 1)
2751 pbpctl_dev_m = pbpctl_dev;
2753 pbpctl_dev_m = get_master_port_fn(pbpctl_dev);
2754 if (pbpctl_dev_m == NULL)
2757 if (pbpctl_dev_m->bp_caps_ex & DISC_PORT_CAP_EX) {
2758 if (is_bypass_fn(pbpctl_dev) == 1)
2759 write_data(pbpctl_dev_m, TX_DISA_PWRUP);
2761 write_data(pbpctl_dev_m, TX_DISB_PWRUP);
2763 msec_delay_bp(LATCH_DELAY);
2769 int normal_port_state_pwron(bpctl_dev_t *pbpctl_dev)
2772 bpctl_dev_t *pbpctl_dev_m;
2775 if ((is_bypass_fn(pbpctl_dev)) == 1)
2776 pbpctl_dev_m = pbpctl_dev;
2778 pbpctl_dev_m = get_master_port_fn(pbpctl_dev);
2779 if (pbpctl_dev_m == NULL)
2782 if (pbpctl_dev_m->bp_caps_ex & DISC_PORT_CAP_EX) {
2783 if (is_bypass_fn(pbpctl_dev) == 1)
2784 write_data(pbpctl_dev_m, TX_ENA_PWRUP);
2786 write_data(pbpctl_dev_m, TX_ENB_PWRUP);
2788 msec_delay_bp(LATCH_DELAY);
2795 int en_disc_cap(bpctl_dev_t *pbpctl_dev)
2797 if (pbpctl_dev->bp_caps & DISC_DIS_CAP) {
2798 if (pbpctl_dev->bp_ext_ver >= 0x8) {
2799 write_data(pbpctl_dev, EN_DISC_CAP);
2800 msec_delay_bp(BYPASS_CAP_DELAY);
2807 int std_nic_on(bpctl_dev_t *pbpctl_dev)
2810 if (pbpctl_dev->bp_caps & STD_NIC_CAP) {
2812 if (INTEL_IF_SERIES(pbpctl_dev->subdevice)) {
2813 write_data_int(pbpctl_dev, DIS_BYPASS_CAP_INT);
2814 msec_delay_bp(BYPASS_DELAY_INT);
2815 pbpctl_dev->bp_status_un = 0;
2819 if (pbpctl_dev->bp_ext_ver >= 0x8) {
2820 write_data(pbpctl_dev, STD_NIC_ON);
2821 msec_delay_bp(BYPASS_CAP_DELAY);
2826 if (pbpctl_dev->bp_ext_ver >= PXG2BPI_VER) {
2827 wdt_off(pbpctl_dev);
2829 if (pbpctl_dev->bp_caps & BP_CAP) {
2830 write_data(pbpctl_dev, BYPASS_OFF);
2831 msec_delay_bp(LATCH_DELAY);
2834 if (pbpctl_dev->bp_caps & TAP_CAP) {
2835 write_data(pbpctl_dev, TAP_OFF);
2836 msec_delay_bp(LATCH_DELAY);
2839 write_data(pbpctl_dev, NORMAL_STATE_PWRON);
2840 if (pbpctl_dev->bp_ext_ver == PXG2BPI_VER)
2841 msec_delay_bp(DFLT_PWRON_DELAY);
2843 msec_delay_bp(LATCH_DELAY + EEPROM_WR_DELAY);
2845 if (pbpctl_dev->bp_caps & BP_DIS_CAP) {
2846 write_data(pbpctl_dev, DIS_BYPASS_CAP);
2847 msec_delay_bp(BYPASS_CAP_DELAY);
2850 if (pbpctl_dev->bp_caps & TAP_DIS_CAP) {
2851 write_data(pbpctl_dev, DIS_TAP_CAP);
2852 msec_delay_bp(BYPASS_CAP_DELAY);
2861 int std_nic_off(bpctl_dev_t *pbpctl_dev)
2864 if (pbpctl_dev->bp_caps & STD_NIC_CAP) {
2865 if (INTEL_IF_SERIES(pbpctl_dev->subdevice)) {
2866 write_data_int(pbpctl_dev, PWROFF_BYPASS_ON_INT);
2867 msec_delay_bp(BYPASS_DELAY_INT);
2870 if (pbpctl_dev->bp_ext_ver >= 0x8) {
2871 write_data(pbpctl_dev, STD_NIC_OFF);
2872 msec_delay_bp(BYPASS_CAP_DELAY);
2877 if (pbpctl_dev->bp_ext_ver >= PXG2BPI_VER) {
2879 if (pbpctl_dev->bp_caps & TAP_PWUP_CTL_CAP) {
2880 write_data(pbpctl_dev, TAP_STATE_PWRON);
2881 msec_delay_bp(LATCH_DELAY + EEPROM_WR_DELAY);
2884 if (pbpctl_dev->bp_caps & BP_PWUP_CTL_CAP) {
2885 write_data(pbpctl_dev, BYPASS_STATE_PWRON);
2886 if (pbpctl_dev->bp_ext_ver > PXG2BPI_VER)
2887 msec_delay_bp(LATCH_DELAY +
2890 msec_delay_bp(DFLT_PWRON_DELAY);
2893 if (pbpctl_dev->bp_caps & TAP_DIS_CAP) {
2894 write_data(pbpctl_dev, EN_TAP_CAP);
2895 msec_delay_bp(BYPASS_CAP_DELAY);
2897 if (pbpctl_dev->bp_caps & DISC_DIS_CAP) {
2898 write_data(pbpctl_dev, EN_DISC_CAP);
2899 msec_delay_bp(BYPASS_CAP_DELAY);
2902 if (pbpctl_dev->bp_caps & BP_DIS_CAP) {
2903 write_data(pbpctl_dev, EN_BYPASS_CAP);
2904 msec_delay_bp(BYPASS_CAP_DELAY);
2913 int wdt_time_left(bpctl_dev_t *pbpctl_dev)
2916 /* 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; */
2917 unsigned long curr_time = jiffies, delta_time = 0, wdt_on_time =
2918 pbpctl_dev->bypass_wdt_on_time, delta_time_msec = 0;
2921 switch (pbpctl_dev->wdt_status) {
2922 case WDT_STATUS_DIS:
2928 wdt_on_time) ? (curr_time - wdt_on_time) : (~wdt_on_time +
2930 delta_time_msec = jiffies_to_msecs(delta_time);
2931 time_left = pbpctl_dev->bypass_timer_interval - delta_time_msec;
2932 if (time_left < 0) {
2934 pbpctl_dev->wdt_status = WDT_STATUS_EXP;
2937 case WDT_STATUS_EXP:
2945 static int wdt_timer(bpctl_dev_t *pbpctl_dev, int *time_left)
2948 if (pbpctl_dev->bp_caps & WD_CTL_CAP) {
2950 if (pbpctl_dev->wdt_status == WDT_STATUS_UNKNOWN)
2953 *time_left = wdt_time_left(pbpctl_dev);
2961 static int wdt_timer_reload(bpctl_dev_t *pbpctl_dev)
2966 if ((pbpctl_dev->bp_caps & WD_CTL_CAP) &&
2967 (pbpctl_dev->wdt_status != WDT_STATUS_UNKNOWN)) {
2968 if (pbpctl_dev->wdt_status == WDT_STATUS_DIS)
2970 if (pbpctl_dev->bp_ext_ver >= PXG2BPI_VER)
2971 ret = wdt_pulse(pbpctl_dev);
2972 else if (INTEL_IF_SERIES(pbpctl_dev->subdevice))
2973 ret = wdt_pulse_int(pbpctl_dev);
2975 ret = send_wdt_pulse(pbpctl_dev);
2977 mod_timer(&pbpctl_dev->bp_timer, jiffies+1);*/
2983 static void wd_reset_timer(unsigned long param)
2985 bpctl_dev_t *pbpctl_dev = (bpctl_dev_t *) param;
2987 struct sk_buff *skb_tmp;
2990 if ((pbpctl_dev->bp_ext_ver >= PXG2BPI_VER) &&
2991 ((atomic_read(&pbpctl_dev->wdt_busy)) == 1)) {
2992 mod_timer(&pbpctl_dev->bp_timer, jiffies + 1);
2997 if (pbpctl_dev->bp_self_test_flag == 1) {
2998 skb_tmp = dev_alloc_skb(BPTEST_DATA_LEN + 2);
2999 if ((skb_tmp) && (pbpctl_dev->ndev) && (pbpctl_dev->bp_tx_data)) {
3000 memcpy(skb_put(skb_tmp, BPTEST_DATA_LEN),
3001 pbpctl_dev->bp_tx_data, BPTEST_DATA_LEN);
3002 skb_tmp->dev = pbpctl_dev->ndev;
3004 eth_type_trans(skb_tmp, pbpctl_dev->ndev);
3005 skb_tmp->ip_summed = CHECKSUM_UNNECESSARY;
3006 netif_receive_skb(skb_tmp);
3007 goto bp_timer_reload;
3013 wdt_timer_reload(pbpctl_dev);
3017 if (pbpctl_dev->reset_time) {
3018 mod_timer(&pbpctl_dev->bp_timer,
3019 jiffies + (HZ * pbpctl_dev->reset_time) / 1000);
3023 /*WAIT_AT_PWRUP 0x80 */
3024 int bp_wait_at_pwup_en(bpctl_dev_t *pbpctl_dev)
3027 if (pbpctl_dev->bp_caps & SW_CTL_CAP) {
3028 if (pbpctl_dev->bp_ext_ver >= BP_FW_EXT_VER8) {
3029 write_data(pbpctl_dev, BP_WAIT_AT_PWUP_EN);
3030 msec_delay_bp(LATCH_DELAY + EEPROM_WR_DELAY);
3038 /*DIS_WAIT_AT_PWRUP 0x81 */
3039 int bp_wait_at_pwup_dis(bpctl_dev_t *pbpctl_dev)
3042 if (pbpctl_dev->bp_caps & SW_CTL_CAP) {
3044 if (pbpctl_dev->bp_ext_ver >= BP_FW_EXT_VER8) {
3045 write_data(pbpctl_dev, BP_WAIT_AT_PWUP_DIS);
3046 msec_delay_bp(LATCH_DELAY + EEPROM_WR_DELAY);
3054 /*EN_HW_RESET 0x82 */
3056 int bp_hw_reset_en(bpctl_dev_t *pbpctl_dev)
3059 if (pbpctl_dev->bp_caps & SW_CTL_CAP) {
3060 if (pbpctl_dev->bp_ext_ver >= BP_FW_EXT_VER8) {
3061 write_data(pbpctl_dev, BP_HW_RESET_EN);
3062 msec_delay_bp(LATCH_DELAY + EEPROM_WR_DELAY);
3070 /*DIS_HW_RESET 0x83 */
3072 int bp_hw_reset_dis(bpctl_dev_t *pbpctl_dev)
3075 if (pbpctl_dev->bp_caps & SW_CTL_CAP) {
3076 if (pbpctl_dev->bp_ext_ver >= BP_FW_EXT_VER8) {
3077 write_data(pbpctl_dev, BP_HW_RESET_DIS);
3078 msec_delay_bp(LATCH_DELAY + EEPROM_WR_DELAY);
3087 int wdt_exp_mode(bpctl_dev_t *pbpctl_dev, int mode)
3089 uint32_t status_reg = 0, status_reg1 = 0;
3091 if ((pbpctl_dev->bp_caps & (TAP_STATUS_CAP | DISC_CAP)) &&
3092 (pbpctl_dev->bp_caps & BP_CAP)) {
3093 if (pbpctl_dev->bp_ext_ver >= PXE2TBPI_VER) {
3095 if ((pbpctl_dev->bp_ext_ver >= 0x8) &&
3096 (mode == 2) && (pbpctl_dev->bp_caps & DISC_CAP)) {
3098 read_reg(pbpctl_dev, STATUS_DISC_REG_ADDR);
3099 if (!(status_reg1 & WDTE_DISC_BPN_MASK))
3100 write_reg(pbpctl_dev,
3103 STATUS_DISC_REG_ADDR);
3107 status_reg = read_reg(pbpctl_dev, STATUS_TAP_REG_ADDR);
3109 if ((mode == 0) && (pbpctl_dev->bp_caps & BP_CAP)) {
3110 if (pbpctl_dev->bp_ext_ver >= 0x8) {
3112 read_reg(pbpctl_dev, STATUS_DISC_REG_ADDR);
3113 if (status_reg1 & WDTE_DISC_BPN_MASK)
3114 write_reg(pbpctl_dev,
3116 ~WDTE_DISC_BPN_MASK,
3117 STATUS_DISC_REG_ADDR);
3119 if (status_reg & WDTE_TAP_BPN_MASK)
3120 write_reg(pbpctl_dev,
3121 status_reg & ~WDTE_TAP_BPN_MASK,
3122 STATUS_TAP_REG_ADDR);
3125 } else if ((mode == 1) && (pbpctl_dev->bp_caps & TAP_CAP)) {
3126 if (!(status_reg & WDTE_TAP_BPN_MASK))
3127 write_reg(pbpctl_dev,
3128 status_reg | WDTE_TAP_BPN_MASK,
3129 STATUS_TAP_REG_ADDR);
3130 /*else return BP_NOT_CAP; */
3138 int bypass_fw_ver(bpctl_dev_t *pbpctl_dev)
3140 if (is_bypass_fn(pbpctl_dev))
3141 return read_reg(pbpctl_dev, VER_REG_ADDR);
3146 int bypass_sign_check(bpctl_dev_t *pbpctl_dev)
3149 if (is_bypass_fn(pbpctl_dev))
3150 return (((read_reg(pbpctl_dev, PIC_SIGN_REG_ADDR)) ==
3151 PIC_SIGN_VALUE) ? 1 : 0);
3156 static int tx_status(bpctl_dev_t *pbpctl_dev)
3159 bpctl_dev_t *pbpctl_dev_m;
3160 if ((is_bypass_fn(pbpctl_dev)) == 1)
3161 pbpctl_dev_m = pbpctl_dev;
3163 pbpctl_dev_m = get_master_port_fn(pbpctl_dev);
3164 if (pbpctl_dev_m == NULL)
3166 if (pbpctl_dev_m->bp_caps_ex & DISC_PORT_CAP_EX) {
3168 ctrl = BPCTL_READ_REG(pbpctl_dev, CTRL);
3169 if (pbpctl_dev->bp_i80)
3170 return ((ctrl & BPCTLI_CTRL_SWDPIN1) != 0 ? 0 : 1);
3171 if (pbpctl_dev->bp_540) {
3172 ctrl = BP10G_READ_REG(pbpctl_dev, ESDP);
3174 return ((ctrl & BP10G_SDP1_DATA) != 0 ? 0 : 1);
3179 if (pbpctl_dev->bp_caps & TX_CTL_CAP) {
3180 if (PEG5_IF_SERIES(pbpctl_dev->subdevice)) {
3184 (pbpctl_dev, BPCTLI_PHY_CONTROL, &mii_reg))) {
3185 if (mii_reg & BPCTLI_MII_CR_POWER_DOWN)
3194 if (pbpctl_dev->bp_10g9) {
3195 return ((BP10G_READ_REG(pbpctl_dev, ESDP) &
3196 BP10G_SDP3_DATA) != 0 ? 0 : 1);
3198 } else if (pbpctl_dev->bp_fiber5) {
3199 ctrl = BPCTL_READ_REG(pbpctl_dev, CTRL_EXT);
3200 if (ctrl & BPCTLI_CTRL_EXT_SDP6_DATA)
3203 } else if (pbpctl_dev->bp_10gb) {
3204 ctrl = BP10GB_READ_REG(pbpctl_dev, MISC_REG_GPIO);
3205 BP10GB_WRITE_REG(pbpctl_dev, MISC_REG_GPIO,
3206 (ctrl | BP10GB_GPIO0_OE_P1) &
3207 ~(BP10GB_GPIO0_SET_P1 |
3208 BP10GB_GPIO0_CLR_P1));
3210 if ((pbpctl_dev->func == 1) || (pbpctl_dev->func == 3))
3211 return (((BP10GB_READ_REG
3213 MISC_REG_GPIO)) & BP10GB_GPIO0_P1) !=
3216 return (((BP10GB_READ_REG
3218 MISC_REG_GPIO)) & BP10GB_GPIO0_P0) !=
3222 if (!pbpctl_dev->bp_10g) {
3224 ctrl = BPCTL_READ_REG(pbpctl_dev, CTRL);
3225 if (pbpctl_dev->bp_i80)
3226 return ((ctrl & BPCTLI_CTRL_SWDPIN1) !=
3228 if (pbpctl_dev->bp_540) {
3229 ctrl = BP10G_READ_REG(pbpctl_dev, ESDP);
3231 return ((ctrl & BP10G_SDP1_DATA) != 0 ? 0 : 1);
3234 return ((ctrl & BPCTLI_CTRL_SWDPIN0) != 0 ? 0 : 1);
3236 return ((BP10G_READ_REG(pbpctl_dev, ESDP) &
3237 BP10G_SDP0_DATA) != 0 ? 0 : 1);
3243 static int bp_force_link_status(bpctl_dev_t *pbpctl_dev)
3246 if (DBI_IF_SERIES(pbpctl_dev->subdevice)) {
3248 if ((pbpctl_dev->bp_10g) || (pbpctl_dev->bp_10g9)) {
3249 return ((BP10G_READ_REG(pbpctl_dev, ESDP) &
3250 BP10G_SDP1_DIR) != 0 ? 1 : 0);
3257 int bypass_from_last_read(bpctl_dev_t *pbpctl_dev)
3259 uint32_t ctrl_ext = 0;
3260 bpctl_dev_t *pbpctl_dev_b = NULL;
3262 if ((pbpctl_dev->bp_caps & SW_CTL_CAP)
3263 && (pbpctl_dev_b = get_status_port_fn(pbpctl_dev))) {
3264 ctrl_ext = BPCTL_READ_REG(pbpctl_dev_b, CTRL_EXT);
3265 BPCTL_BP_WRITE_REG(pbpctl_dev_b, CTRL_EXT,
3266 (ctrl_ext & ~BPCTLI_CTRL_EXT_SDP7_DIR));
3267 ctrl_ext = BPCTL_READ_REG(pbpctl_dev_b, CTRL_EXT);
3268 if (ctrl_ext & BPCTLI_CTRL_EXT_SDP7_DATA)
3275 int bypass_status_clear(bpctl_dev_t *pbpctl_dev)
3277 bpctl_dev_t *pbpctl_dev_b = NULL;
3279 if ((pbpctl_dev->bp_caps & SW_CTL_CAP)
3280 && (pbpctl_dev_b = get_status_port_fn(pbpctl_dev))) {
3282 send_bypass_clear_pulse(pbpctl_dev_b, 1);
3288 int bypass_flag_status(bpctl_dev_t *pbpctl_dev)
3291 if ((pbpctl_dev->bp_caps & BP_CAP)) {
3292 if (pbpctl_dev->bp_ext_ver >= PXG2BPI_VER) {
3293 return ((((read_reg(pbpctl_dev, STATUS_REG_ADDR)) &
3294 BYPASS_FLAG_MASK) ==
3295 BYPASS_FLAG_MASK) ? 1 : 0);
3301 int bypass_flag_status_clear(bpctl_dev_t *pbpctl_dev)
3304 if (pbpctl_dev->bp_caps & BP_CAP) {
3305 if (pbpctl_dev->bp_ext_ver >= PXG2BPI_VER) {
3306 uint32_t status_reg = 0;
3307 status_reg = read_reg(pbpctl_dev, STATUS_REG_ADDR);
3308 write_reg(pbpctl_dev, status_reg & ~BYPASS_FLAG_MASK,
3316 int bypass_change_status(bpctl_dev_t *pbpctl_dev)
3318 int ret = BP_NOT_CAP;
3320 if (pbpctl_dev->bp_caps & BP_STATUS_CHANGE_CAP) {
3321 if (pbpctl_dev->bp_ext_ver >= 0x8) {
3322 ret = bypass_flag_status(pbpctl_dev);
3323 bypass_flag_status_clear(pbpctl_dev);
3324 } else if (pbpctl_dev->bp_ext_ver >= PXG2BPI_VER) {
3325 ret = bypass_flag_status(pbpctl_dev);
3326 bypass_flag_status_clear(pbpctl_dev);
3328 ret = bypass_from_last_read(pbpctl_dev);
3329 bypass_status_clear(pbpctl_dev);
3335 int bypass_off_status(bpctl_dev_t *pbpctl_dev)
3338 if (pbpctl_dev->bp_caps & BP_CAP) {
3339 if (pbpctl_dev->bp_ext_ver >= PXG2BPI_VER) {
3340 return ((((read_reg(pbpctl_dev, STATUS_REG_ADDR)) &
3341 BYPASS_OFF_MASK) == BYPASS_OFF_MASK) ? 1 : 0);
3347 static int bypass_status(bpctl_dev_t *pbpctl_dev)
3350 if (pbpctl_dev->bp_caps & BP_CAP) {
3352 bpctl_dev_t *pbpctl_dev_b = NULL;
3354 if (!(pbpctl_dev_b = get_status_port_fn(pbpctl_dev)))
3357 if (INTEL_IF_SERIES(pbpctl_dev->subdevice)) {
3359 if (!pbpctl_dev->bp_status_un)
3360 return (((BPCTL_READ_REG
3363 BPCTLI_CTRL_EXT_SDP7_DATA) !=
3368 if (pbpctl_dev->bp_ext_ver >= 0x8) {
3370 if (pbpctl_dev->bp_10g9) {
3371 ctrl_ext = BP10G_READ_REG(pbpctl_dev_b, I2CCTL);
3372 BP10G_WRITE_REG(pbpctl_dev_b, I2CCTL,
3373 (ctrl_ext | BP10G_I2C_CLK_OUT));
3374 return ((BP10G_READ_REG(pbpctl_dev_b, I2CCTL) &
3375 BP10G_I2C_CLK_IN) != 0 ? 0 : 1);
3377 } else if (pbpctl_dev->bp_540) {
3378 return (((BP10G_READ_REG(pbpctl_dev_b, ESDP)) &
3379 BP10G_SDP0_DATA) != 0 ? 0 : 1);
3382 else if ((pbpctl_dev->bp_fiber5)
3383 || (pbpctl_dev->bp_i80)) {
3384 return (((BPCTL_READ_REG(pbpctl_dev_b, CTRL)) &
3385 BPCTLI_CTRL_SWDPIN0) != 0 ? 0 : 1);
3386 } else if (pbpctl_dev->bp_10gb) {
3388 BP10GB_READ_REG(pbpctl_dev, MISC_REG_GPIO);
3389 BP10GB_WRITE_REG(pbpctl_dev, MISC_REG_GPIO,
3390 (ctrl_ext | BP10GB_GPIO3_OE_P0)
3391 & ~(BP10GB_GPIO3_SET_P0 |
3392 BP10GB_GPIO3_CLR_P0));
3394 return (((BP10GB_READ_REG
3396 MISC_REG_GPIO)) & BP10GB_GPIO3_P0) !=
3400 else if (!pbpctl_dev->bp_10g)
3401 return (((BPCTL_READ_REG
3404 BPCTLI_CTRL_EXT_SDP7_DATA) !=
3408 ctrl_ext = BP10G_READ_REG(pbpctl_dev_b, EODSDP);
3409 BP10G_WRITE_REG(pbpctl_dev_b, EODSDP,
3411 BP10G_SDP7_DATA_OUT));
3412 return ((BP10G_READ_REG(pbpctl_dev_b, EODSDP) &
3413 BP10G_SDP7_DATA_IN) != 0 ? 0 : 1);
3416 } else if (pbpctl_dev->media_type == bp_copper) {
3418 return (((BPCTL_READ_REG(pbpctl_dev_b, CTRL)) &
3419 BPCTLI_CTRL_SWDPIN1) != 0 ? 1 : 0);
3421 if ((bypass_status_clear(pbpctl_dev)) >= 0)
3422 return bypass_from_last_read(pbpctl_dev);
3429 int default_pwron_status(bpctl_dev_t *pbpctl_dev)
3432 if (pbpctl_dev->bp_caps & SW_CTL_CAP) {
3433 if (pbpctl_dev->bp_caps & BP_PWUP_CTL_CAP) {
3434 if (pbpctl_dev->bp_ext_ver >= PXG2BPI_VER) {
3437 STATUS_REG_ADDR)) & DFLT_PWRON_MASK)
3438 == DFLT_PWRON_MASK) ? 0 : 1);
3440 } /*else if ((!pbpctl_dev->bp_caps&BP_DIS_CAP)&&
3441 (pbpctl_dev->bp_caps&BP_PWUP_ON_CAP))
3447 static int default_pwroff_status(bpctl_dev_t *pbpctl_dev)
3450 /*if ((!pbpctl_dev->bp_caps&BP_DIS_CAP)&&
3451 (pbpctl_dev->bp_caps&BP_PWOFF_ON_CAP))
3453 if ((pbpctl_dev->bp_caps & SW_CTL_CAP)
3454 && (pbpctl_dev->bp_caps & BP_PWOFF_CTL_CAP)) {
3455 return ((((read_reg(pbpctl_dev, STATUS_REG_ADDR)) &
3456 DFLT_PWROFF_MASK) == DFLT_PWROFF_MASK) ? 0 : 1);
3461 int dis_bypass_cap_status(bpctl_dev_t *pbpctl_dev)
3464 if (pbpctl_dev->bp_caps & BP_DIS_CAP) {
3465 if (pbpctl_dev->bp_ext_ver >= PXG2BPI_VER) {
3466 return ((((read_reg(pbpctl_dev, STATUS_REG_ADDR)) &
3467 DIS_BYPASS_CAP_MASK) ==
3468 DIS_BYPASS_CAP_MASK) ? 1 : 0);
3474 int cmd_en_status(bpctl_dev_t *pbpctl_dev)
3477 if (pbpctl_dev->bp_caps & SW_CTL_CAP) {
3478 if (pbpctl_dev->bp_ext_ver >= PXG2BPI_VER) {
3479 return ((((read_reg(pbpctl_dev, STATUS_REG_ADDR)) &
3480 CMND_EN_MASK) == CMND_EN_MASK) ? 1 : 0);
3486 int wdt_en_status(bpctl_dev_t *pbpctl_dev)
3489 if (pbpctl_dev->bp_caps & WD_CTL_CAP) {
3490 if (pbpctl_dev->bp_ext_ver >= PXG2BPI_VER) {
3491 return ((((read_reg(pbpctl_dev, STATUS_REG_ADDR)) &
3492 WDT_EN_MASK) == WDT_EN_MASK) ? 1 : 0);
3498 int wdt_programmed(bpctl_dev_t *pbpctl_dev, int *timeout)
3501 if (pbpctl_dev->bp_caps & WD_CTL_CAP) {
3502 if (pbpctl_dev->bp_ext_ver >= PXG2BPI_VER) {
3503 if ((read_reg(pbpctl_dev, STATUS_REG_ADDR)) &
3506 wdt_val = read_reg(pbpctl_dev, WDT_REG_ADDR);
3507 *timeout = (1 << wdt_val) * 100;
3511 int curr_wdt_status = pbpctl_dev->wdt_status;
3512 if (curr_wdt_status == WDT_STATUS_UNKNOWN)
3517 0 ? 0 : pbpctl_dev->bypass_timer_interval;
3524 int bypass_support(bpctl_dev_t *pbpctl_dev)
3528 if (pbpctl_dev->bp_caps & SW_CTL_CAP) {
3529 if (pbpctl_dev->bp_ext_ver >= PXG2TBPI_VER) {
3531 ((((read_reg(pbpctl_dev, PRODUCT_CAP_REG_ADDR)) &
3532 BYPASS_SUPPORT_MASK) ==
3533 BYPASS_SUPPORT_MASK) ? 1 : 0);
3534 } else if (pbpctl_dev->bp_ext_ver == PXG2BPI_VER)
3541 int tap_support(bpctl_dev_t *pbpctl_dev)
3545 if (pbpctl_dev->bp_caps & SW_CTL_CAP) {
3546 if (pbpctl_dev->bp_ext_ver >= PXG2TBPI_VER) {
3548 ((((read_reg(pbpctl_dev, PRODUCT_CAP_REG_ADDR)) &
3549 TAP_SUPPORT_MASK) == TAP_SUPPORT_MASK) ? 1 : 0);
3550 } else if (pbpctl_dev->bp_ext_ver == PXG2BPI_VER)
3557 int normal_support(bpctl_dev_t *pbpctl_dev)
3559 int ret = BP_NOT_CAP;
3561 if (pbpctl_dev->bp_caps & SW_CTL_CAP) {
3562 if (pbpctl_dev->bp_ext_ver >= PXG2TBPI_VER) {
3564 ((((read_reg(pbpctl_dev, PRODUCT_CAP_REG_ADDR)) &
3565 NORMAL_UNSUPPORT_MASK) ==
3566 NORMAL_UNSUPPORT_MASK) ? 0 : 1);
3573 int get_bp_prod_caps(bpctl_dev_t *pbpctl_dev)
3575 if ((pbpctl_dev->bp_caps & SW_CTL_CAP) &&
3576 (pbpctl_dev->bp_ext_ver >= PXG2TBPI_VER))
3577 return read_reg(pbpctl_dev, PRODUCT_CAP_REG_ADDR);
3582 int tap_flag_status(bpctl_dev_t *pbpctl_dev)
3585 if (pbpctl_dev->bp_caps & TAP_STATUS_CAP) {
3586 if (pbpctl_dev->bp_ext_ver >= PXG2TBPI_VER)
3587 return ((((read_reg(pbpctl_dev, STATUS_TAP_REG_ADDR)) &
3588 TAP_FLAG_MASK) == TAP_FLAG_MASK) ? 1 : 0);
3594 int tap_flag_status_clear(bpctl_dev_t *pbpctl_dev)
3596 uint32_t status_reg = 0;
3597 if (pbpctl_dev->bp_caps & TAP_STATUS_CAP) {
3598 if (pbpctl_dev->bp_ext_ver >= PXG2TBPI_VER) {
3599 status_reg = read_reg(pbpctl_dev, STATUS_TAP_REG_ADDR);
3600 write_reg(pbpctl_dev, status_reg & ~TAP_FLAG_MASK,
3601 STATUS_TAP_REG_ADDR);
3608 int tap_change_status(bpctl_dev_t *pbpctl_dev)
3610 int ret = BP_NOT_CAP;
3611 if (pbpctl_dev->bp_ext_ver >= PXG2TBPI_VER) {
3612 if (pbpctl_dev->bp_caps & TAP_CAP) {
3613 if (pbpctl_dev->bp_caps & BP_CAP) {
3614 ret = tap_flag_status(pbpctl_dev);
3615 tap_flag_status_clear(pbpctl_dev);
3617 ret = bypass_from_last_read(pbpctl_dev);
3618 bypass_status_clear(pbpctl_dev);
3625 int tap_off_status(bpctl_dev_t *pbpctl_dev)
3627 if (pbpctl_dev->bp_caps & TAP_CAP) {
3628 if (pbpctl_dev->bp_ext_ver >= PXG2TBPI_VER)
3629 return ((((read_reg(pbpctl_dev, STATUS_TAP_REG_ADDR)) &
3630 TAP_OFF_MASK) == TAP_OFF_MASK) ? 1 : 0);
3635 int tap_status(bpctl_dev_t *pbpctl_dev)
3639 if (pbpctl_dev->bp_caps & TAP_CAP) {
3640 bpctl_dev_t *pbpctl_dev_b = NULL;
3642 if (!(pbpctl_dev_b = get_status_port_fn(pbpctl_dev)))
3645 if (pbpctl_dev->bp_ext_ver >= 0x8) {
3646 if (!pbpctl_dev->bp_10g)
3647 return (((BPCTL_READ_REG
3650 BPCTLI_CTRL_EXT_SDP6_DATA) !=
3653 ctrl_ext = BP10G_READ_REG(pbpctl_dev_b, EODSDP);
3654 BP10G_WRITE_REG(pbpctl_dev_b, EODSDP,
3656 BP10G_SDP6_DATA_OUT));
3657 return ((BP10G_READ_REG(pbpctl_dev_b, EODSDP) &
3658 BP10G_SDP6_DATA_IN) != 0 ? 0 : 1);
3661 } else if (pbpctl_dev->media_type == bp_copper)
3662 return (((BPCTL_READ_REG(pbpctl_dev, CTRL)) &
3663 BPCTLI_CTRL_SWDPIN0) != 0 ? 1 : 0);
3665 if ((bypass_status_clear(pbpctl_dev)) >= 0)
3666 return bypass_from_last_read(pbpctl_dev);
3673 int default_pwron_tap_status(bpctl_dev_t *pbpctl_dev)
3675 if (pbpctl_dev->bp_caps & TAP_PWUP_CTL_CAP) {
3676 if (pbpctl_dev->bp_ext_ver >= PXG2TBPI_VER)
3677 return ((((read_reg(pbpctl_dev, STATUS_TAP_REG_ADDR)) &
3678 DFLT_PWRON_TAP_MASK) ==
3679 DFLT_PWRON_TAP_MASK) ? 1 : 0);
3684 int dis_tap_cap_status(bpctl_dev_t *pbpctl_dev)
3686 if (pbpctl_dev->bp_caps & TAP_PWUP_CTL_CAP) {
3687 if (pbpctl_dev->bp_ext_ver >= PXG2TBPI_VER)
3688 return ((((read_reg(pbpctl_dev, STATUS_TAP_REG_ADDR)) &
3689 DIS_TAP_CAP_MASK) ==
3690 DIS_TAP_CAP_MASK) ? 1 : 0);
3695 int disc_flag_status(bpctl_dev_t *pbpctl_dev)
3698 if (pbpctl_dev->bp_caps & DISC_CAP) {
3699 if (pbpctl_dev->bp_ext_ver >= 0x8)
3700 return ((((read_reg(pbpctl_dev, STATUS_DISC_REG_ADDR)) &
3701 DISC_FLAG_MASK) == DISC_FLAG_MASK) ? 1 : 0);
3707 int disc_flag_status_clear(bpctl_dev_t *pbpctl_dev)
3709 uint32_t status_reg = 0;
3710 if (pbpctl_dev->bp_caps & DISC_CAP) {
3711 if (pbpctl_dev->bp_ext_ver >= 0x8) {
3712 status_reg = read_reg(pbpctl_dev, STATUS_DISC_REG_ADDR);
3713 write_reg(pbpctl_dev, status_reg & ~DISC_FLAG_MASK,
3714 STATUS_DISC_REG_ADDR);
3721 int disc_change_status(bpctl_dev_t *pbpctl_dev)
3723 int ret = BP_NOT_CAP;
3724 if (pbpctl_dev->bp_caps & DISC_CAP) {
3725 ret = disc_flag_status(pbpctl_dev);
3726 disc_flag_status_clear(pbpctl_dev);
3732 int disc_off_status(bpctl_dev_t *pbpctl_dev)
3734 bpctl_dev_t *pbpctl_dev_b = NULL;
3737 if (pbpctl_dev->bp_caps & DISC_CAP) {
3738 if (!(pbpctl_dev_b = get_status_port_fn(pbpctl_dev)))
3740 if (DISCF_IF_SERIES(pbpctl_dev->subdevice))
3741 return ((((read_reg(pbpctl_dev, STATUS_DISC_REG_ADDR)) &
3742 DISC_OFF_MASK) == DISC_OFF_MASK) ? 1 : 0);
3744 if (pbpctl_dev->bp_i80) {
3745 return (((BPCTL_READ_REG(pbpctl_dev_b, CTRL_EXT)) &
3746 BPCTLI_CTRL_EXT_SDP6_DATA) != 0 ? 1 : 0);
3749 if (pbpctl_dev->bp_540) {
3750 ctrl_ext = BP10G_READ_REG(pbpctl_dev_b, ESDP);
3751 return ((BP10G_READ_REG(pbpctl_dev_b, ESDP) &
3752 BP10G_SDP2_DATA) != 0 ? 1 : 0);
3755 if (pbpctl_dev->media_type == bp_copper) {
3758 return ((((read_reg(pbpctl_dev, STATUS_DISC_REG_ADDR)) &
3759 DISC_OFF_MASK) == DISC_OFF_MASK) ? 1 : 0);
3761 if (!pbpctl_dev->bp_10g)
3762 return (((BPCTL_READ_REG(pbpctl_dev_b, CTRL)) &
3763 BPCTLI_CTRL_SWDPIN1) != 0 ? 1 : 0);
3765 return ((BP10G_READ_REG(pbpctl_dev_b, ESDP) &
3766 BP10G_SDP1_DATA) != 0 ? 1 : 0);
3770 if (pbpctl_dev->bp_10g9) {
3771 ctrl_ext = BP10G_READ_REG(pbpctl_dev_b, I2CCTL);
3772 BP10G_WRITE_REG(pbpctl_dev_b, I2CCTL,
3774 BP10G_I2C_DATA_OUT));
3775 return ((BP10G_READ_REG(pbpctl_dev_b, I2CCTL) &
3776 BP10G_I2C_DATA_IN) != 0 ? 1 : 0);
3778 } else if (pbpctl_dev->bp_fiber5) {
3779 return (((BPCTL_READ_REG(pbpctl_dev_b, CTRL)) &
3780 BPCTLI_CTRL_SWDPIN1) != 0 ? 1 : 0);
3781 } else if (pbpctl_dev->bp_10gb) {
3783 BP10GB_READ_REG(pbpctl_dev, MISC_REG_GPIO);
3784 BP10GB_WRITE_REG(pbpctl_dev, MISC_REG_GPIO,
3785 (ctrl_ext | BP10GB_GPIO3_OE_P1)
3786 & ~(BP10GB_GPIO3_SET_P1 |
3787 BP10GB_GPIO3_CLR_P1));
3789 return (((BP10GB_READ_REG
3791 MISC_REG_GPIO)) & BP10GB_GPIO3_P1) !=
3794 if (!pbpctl_dev->bp_10g) {
3796 return (((BPCTL_READ_REG
3799 BPCTLI_CTRL_EXT_SDP6_DATA) !=
3802 ctrl_ext = BP10G_READ_REG(pbpctl_dev_b, EODSDP);
3803 BP10G_WRITE_REG(pbpctl_dev_b, EODSDP,
3805 BP10G_SDP6_DATA_OUT));
3806 return (((BP10G_READ_REG(pbpctl_dev_b, EODSDP))
3807 & BP10G_SDP6_DATA_IN) != 0 ? 1 : 0);
3815 static int disc_status(bpctl_dev_t *pbpctl_dev)
3818 if (pbpctl_dev->bp_caps & DISC_CAP) {
3820 if ((ctrl = disc_off_status(pbpctl_dev)) < 0)
3822 return ((ctrl == 0) ? 1 : 0);
3828 int default_pwron_disc_status(bpctl_dev_t *pbpctl_dev)
3830 if (pbpctl_dev->bp_caps & DISC_PWUP_CTL_CAP) {
3831 if (pbpctl_dev->bp_ext_ver >= 0x8)
3832 return ((((read_reg(pbpctl_dev, STATUS_DISC_REG_ADDR)) &
3833 DFLT_PWRON_DISC_MASK) ==
3834 DFLT_PWRON_DISC_MASK) ? 1 : 0);
3839 int dis_disc_cap_status(bpctl_dev_t *pbpctl_dev)
3841 if (pbpctl_dev->bp_caps & DIS_DISC_CAP) {
3842 if (pbpctl_dev->bp_ext_ver >= 0x8)
3843 return ((((read_reg(pbpctl_dev, STATUS_DISC_REG_ADDR)) &
3844 DIS_DISC_CAP_MASK) ==
3845 DIS_DISC_CAP_MASK) ? 1 : 0);
3850 int disc_port_status(bpctl_dev_t *pbpctl_dev)
3852 int ret = BP_NOT_CAP;
3853 bpctl_dev_t *pbpctl_dev_m;
3855 if ((is_bypass_fn(pbpctl_dev)) == 1)
3856 pbpctl_dev_m = pbpctl_dev;
3858 pbpctl_dev_m = get_master_port_fn(pbpctl_dev);
3859 if (pbpctl_dev_m == NULL)
3862 if (pbpctl_dev_m->bp_caps_ex & DISC_PORT_CAP_EX) {
3863 if (is_bypass_fn(pbpctl_dev) == 1) {
3864 return ((((read_reg(pbpctl_dev, STATUS_TAP_REG_ADDR)) &
3865 TX_DISA_MASK) == TX_DISA_MASK) ? 1 : 0);
3867 return ((((read_reg(pbpctl_dev, STATUS_TAP_REG_ADDR)) &
3868 TX_DISB_MASK) == TX_DISB_MASK) ? 1 : 0);
3874 int default_pwron_disc_port_status(bpctl_dev_t *pbpctl_dev)
3876 int ret = BP_NOT_CAP;
3877 bpctl_dev_t *pbpctl_dev_m;
3879 if ((is_bypass_fn(pbpctl_dev)) == 1)
3880 pbpctl_dev_m = pbpctl_dev;
3882 pbpctl_dev_m = get_master_port_fn(pbpctl_dev);
3883 if (pbpctl_dev_m == NULL)
3886 if (pbpctl_dev_m->bp_caps_ex & DISC_PORT_CAP_EX) {
3887 if (is_bypass_fn(pbpctl_dev) == 1)
3889 /* return((((read_reg(pbpctl_dev,STATUS_TAP_REG_ADDR)) & TX_DISA_MASK)==TX_DISA_MASK)?1:0); */
3892 /* return((((read_reg(pbpctl_dev,STATUS_TAP_REG_ADDR)) & TX_DISA_MASK)==TX_DISA_MASK)?1:0); */
3898 int wdt_exp_mode_status(bpctl_dev_t *pbpctl_dev)
3900 if (pbpctl_dev->bp_caps & WD_CTL_CAP) {
3901 if (pbpctl_dev->bp_ext_ver <= PXG2BPI_VER)
3902 return 0; /* bypass mode */
3903 else if (pbpctl_dev->bp_ext_ver == PXG2TBPI_VER)
3904 return 1; /* tap mode */
3905 else if (pbpctl_dev->bp_ext_ver >= PXE2TBPI_VER) {
3906 if (pbpctl_dev->bp_ext_ver >= 0x8) {
3909 STATUS_DISC_REG_ADDR)) &
3910 WDTE_DISC_BPN_MASK) == WDTE_DISC_BPN_MASK)
3913 return ((((read_reg(pbpctl_dev, STATUS_TAP_REG_ADDR)) &
3914 WDTE_TAP_BPN_MASK) ==
3915 WDTE_TAP_BPN_MASK) ? 1 : 0);
3921 int tpl2_flag_status(bpctl_dev_t *pbpctl_dev)
3924 if (pbpctl_dev->bp_caps_ex & TPL2_CAP_EX) {
3925 return ((((read_reg(pbpctl_dev, STATUS_DISC_REG_ADDR)) &
3926 TPL2_FLAG_MASK) == TPL2_FLAG_MASK) ? 1 : 0);
3932 int tpl_hw_status(bpctl_dev_t *pbpctl_dev)
3934 bpctl_dev_t *pbpctl_dev_b = NULL;
3936 if (!(pbpctl_dev_b = get_status_port_fn(pbpctl_dev)))
3939 if (TPL_IF_SERIES(pbpctl_dev->subdevice))
3940 return (((BPCTL_READ_REG(pbpctl_dev, CTRL)) &
3941 BPCTLI_CTRL_SWDPIN0) != 0 ? 1 : 0);
3946 int bp_wait_at_pwup_status(bpctl_dev_t *pbpctl_dev)
3948 if (pbpctl_dev->bp_caps & SW_CTL_CAP) {
3949 if (pbpctl_dev->bp_ext_ver >= 0x8)
3950 return ((((read_reg(pbpctl_dev, CONT_CONFIG_REG_ADDR)) &
3951 WAIT_AT_PWUP_MASK) ==
3952 WAIT_AT_PWUP_MASK) ? 1 : 0);
3957 int bp_hw_reset_status(bpctl_dev_t *pbpctl_dev)
3960 if (pbpctl_dev->bp_caps & SW_CTL_CAP) {
3962 if (pbpctl_dev->bp_ext_ver >= 0x8)
3963 return ((((read_reg(pbpctl_dev, CONT_CONFIG_REG_ADDR)) &
3964 EN_HW_RESET_MASK) ==
3965 EN_HW_RESET_MASK) ? 1 : 0);
3971 int std_nic_status(bpctl_dev_t *pbpctl_dev)
3975 if (pbpctl_dev->bp_caps & STD_NIC_CAP) {
3976 if (INTEL_IF_SERIES(pbpctl_dev->subdevice))
3978 if (pbpctl_dev->bp_ext_ver >= BP_FW_EXT_VER8) {
3979 return ((((read_reg(pbpctl_dev, STATUS_DISC_REG_ADDR)) &
3980 STD_NIC_ON_MASK) == STD_NIC_ON_MASK) ? 1 : 0);
3983 if (pbpctl_dev->bp_ext_ver >= PXG2BPI_VER) {
3984 if (pbpctl_dev->bp_caps & BP_CAP) {
3986 read_reg(pbpctl_dev, STATUS_REG_ADDR);
3987 if (((!(status_val & WDT_EN_MASK))
3988 && ((status_val & STD_NIC_MASK) ==
3994 if (pbpctl_dev->bp_caps & TAP_CAP) {
3996 read_reg(pbpctl_dev, STATUS_TAP_REG_ADDR);
3997 if ((status_val & STD_NIC_TAP_MASK) ==
4003 if (pbpctl_dev->bp_caps & TAP_CAP) {
4004 if ((disc_off_status(pbpctl_dev)))
4016 /******************************************************/
4017 /**************SW_INIT*********************************/
4018 /******************************************************/
4019 void bypass_caps_init(bpctl_dev_t *pbpctl_dev)
4021 u_int32_t ctrl_ext = 0;
4022 bpctl_dev_t *pbpctl_dev_m = NULL;
4026 if (!(INTEL_IF_SERIES(adapter->bp_device_block.subdevice))) {
4027 ret = read_reg(pbpctl_dev, VER_REG_ADDR);
4028 printk("VER_REG reg1=%x\n", ret);
4029 ret = read_reg(pbpctl_dev, PRODUCT_CAP_REG_ADDR);
4030 printk("PRODUCT_CAP reg=%x\n", ret);
4031 ret = read_reg(pbpctl_dev, STATUS_TAP_REG_ADDR);
4032 printk("STATUS_TAP reg1=%x\n", ret);
4033 ret = read_reg(pbpctl_dev, 0x7);
4034 printk("SIG_REG reg1=%x\n", ret);
4035 ret = read_reg(pbpctl_dev, STATUS_REG_ADDR);
4036 printk("STATUS_REG_ADDR=%x\n", ret);
4037 ret = read_reg(pbpctl_dev, WDT_REG_ADDR);
4038 printk("WDT_REG_ADDR=%x\n", ret);
4039 ret = read_reg(pbpctl_dev, TMRL_REG_ADDR);
4040 printk("TMRL_REG_ADDR=%x\n", ret);
4041 ret = read_reg(pbpctl_dev, TMRH_REG_ADDR);
4042 printk("TMRH_REG_ADDR=%x\n", ret);
4045 if ((pbpctl_dev->bp_fiber5) || (pbpctl_dev->bp_10g9)) {
4046 pbpctl_dev->media_type = bp_fiber;
4047 } else if (pbpctl_dev->bp_10gb) {
4048 if (BP10GB_CX4_SERIES(pbpctl_dev->subdevice))
4049 pbpctl_dev->media_type = bp_cx4;
4051 pbpctl_dev->media_type = bp_fiber;
4055 else if (pbpctl_dev->bp_540)
4056 pbpctl_dev->media_type = bp_none;
4057 else if (!pbpctl_dev->bp_10g) {
4059 ctrl_ext = BPCTL_READ_REG(pbpctl_dev, CTRL_EXT);
4060 if ((ctrl_ext & BPCTLI_CTRL_EXT_LINK_MODE_MASK) == 0x0)
4061 pbpctl_dev->media_type = bp_copper;
4063 pbpctl_dev->media_type = bp_fiber;
4066 if (BP10G_CX4_SERIES(pbpctl_dev->subdevice))
4067 pbpctl_dev->media_type = bp_cx4;
4069 pbpctl_dev->media_type = bp_fiber;
4072 if (is_bypass_fn(pbpctl_dev)) {
4074 pbpctl_dev->bp_caps |= BP_PWOFF_ON_CAP;
4075 if (pbpctl_dev->media_type == bp_fiber)
4076 pbpctl_dev->bp_caps |=
4077 (TX_CTL_CAP | TX_STATUS_CAP | TPL_CAP);
4079 if (TPL_IF_SERIES(pbpctl_dev->subdevice)) {
4080 pbpctl_dev->bp_caps |= TPL_CAP;
4083 if (INTEL_IF_SERIES(pbpctl_dev->subdevice)) {
4084 pbpctl_dev->bp_caps |=
4085 (BP_CAP | BP_STATUS_CAP | SW_CTL_CAP |
4086 BP_PWUP_ON_CAP | BP_PWUP_OFF_CAP | BP_PWOFF_OFF_CAP
4087 | WD_CTL_CAP | WD_STATUS_CAP | STD_NIC_CAP |
4090 pbpctl_dev->bp_ext_ver = OLD_IF_VER;
4094 if ((pbpctl_dev->bp_fw_ver == 0xff) &&
4095 OLD_IF_SERIES(pbpctl_dev->subdevice)) {
4097 pbpctl_dev->bp_caps |=
4098 (BP_CAP | BP_STATUS_CAP | BP_STATUS_CHANGE_CAP |
4099 SW_CTL_CAP | BP_PWUP_ON_CAP | WD_CTL_CAP |
4100 WD_STATUS_CAP | WD_TIMEOUT_CAP);
4102 pbpctl_dev->bp_ext_ver = OLD_IF_VER;
4107 switch (pbpctl_dev->bp_fw_ver) {
4110 pbpctl_dev->bp_ext_ver =
4112 bp_fw_ver & EXT_VER_MASK);
4116 if ((bypass_sign_check(pbpctl_dev)) !=
4118 pbpctl_dev->bp_caps = 0;
4121 pbpctl_dev->bp_ext_ver =
4123 bp_fw_ver & EXT_VER_MASK);
4128 if (pbpctl_dev->bp_ext_ver == PXG2BPI_VER)
4129 pbpctl_dev->bp_caps |=
4130 (BP_CAP | BP_STATUS_CAP | BP_STATUS_CHANGE_CAP |
4131 SW_CTL_CAP | BP_DIS_CAP | BP_DIS_STATUS_CAP |
4132 BP_PWUP_ON_CAP | BP_PWUP_OFF_CAP | BP_PWUP_CTL_CAP
4133 | WD_CTL_CAP | STD_NIC_CAP | WD_STATUS_CAP |
4135 else if (pbpctl_dev->bp_ext_ver >= PXG2TBPI_VER) {
4138 pbpctl_dev->bp_caps |=
4139 (SW_CTL_CAP | WD_CTL_CAP | WD_STATUS_CAP |
4141 cap_reg = get_bp_prod_caps(pbpctl_dev);
4143 if ((cap_reg & NORMAL_UNSUPPORT_MASK) ==
4144 NORMAL_UNSUPPORT_MASK)
4145 pbpctl_dev->bp_caps |= NIC_CAP_NEG;
4147 pbpctl_dev->bp_caps |= STD_NIC_CAP;
4149 if ((normal_support(pbpctl_dev)) == 1)
4151 pbpctl_dev->bp_caps |= STD_NIC_CAP;
4154 pbpctl_dev->bp_caps |= NIC_CAP_NEG;
4155 if ((cap_reg & BYPASS_SUPPORT_MASK) ==
4156 BYPASS_SUPPORT_MASK) {
4157 pbpctl_dev->bp_caps |=
4158 (BP_CAP | BP_STATUS_CAP |
4159 BP_STATUS_CHANGE_CAP | BP_DIS_CAP |
4160 BP_DIS_STATUS_CAP | BP_PWUP_ON_CAP |
4161 BP_PWUP_OFF_CAP | BP_PWUP_CTL_CAP);
4162 if (pbpctl_dev->bp_ext_ver >= BP_FW_EXT_VER7)
4163 pbpctl_dev->bp_caps |=
4164 BP_PWOFF_ON_CAP | BP_PWOFF_OFF_CAP |
4167 if ((cap_reg & TAP_SUPPORT_MASK) == TAP_SUPPORT_MASK) {
4168 pbpctl_dev->bp_caps |=
4169 (TAP_CAP | TAP_STATUS_CAP |
4170 TAP_STATUS_CHANGE_CAP | TAP_DIS_CAP |
4171 TAP_DIS_STATUS_CAP | TAP_PWUP_ON_CAP |
4172 TAP_PWUP_OFF_CAP | TAP_PWUP_CTL_CAP);
4174 if (pbpctl_dev->bp_ext_ver >= BP_FW_EXT_VER8) {
4175 if ((cap_reg & DISC_SUPPORT_MASK) ==
4177 pbpctl_dev->bp_caps |=
4178 (DISC_CAP | DISC_DIS_CAP |
4180 if ((cap_reg & TPL2_SUPPORT_MASK) ==
4181 TPL2_SUPPORT_MASK) {
4182 pbpctl_dev->bp_caps_ex |= TPL2_CAP_EX;
4183 pbpctl_dev->bp_caps |= TPL_CAP;
4184 pbpctl_dev->bp_tpl_flag =
4185 tpl2_flag_status(pbpctl_dev);
4190 if (pbpctl_dev->bp_ext_ver >= BP_FW_EXT_VER9) {
4191 if ((cap_reg & DISC_PORT_SUPPORT_MASK) ==
4192 DISC_PORT_SUPPORT_MASK) {
4193 pbpctl_dev->bp_caps_ex |=
4195 pbpctl_dev->bp_caps |=
4196 (TX_CTL_CAP | TX_STATUS_CAP);
4202 if (pbpctl_dev->bp_ext_ver >= PXG2BPI_VER) {
4203 if ((read_reg(pbpctl_dev, STATUS_REG_ADDR)) &
4205 pbpctl_dev->wdt_status = WDT_STATUS_EN;
4207 pbpctl_dev->wdt_status = WDT_STATUS_DIS;
4210 } else if ((P2BPFI_IF_SERIES(pbpctl_dev->subdevice)) ||
4211 (PEGF5_IF_SERIES(pbpctl_dev->subdevice)) ||
4212 (PEGF80_IF_SERIES(pbpctl_dev->subdevice)) ||
4213 (BP10G9_IF_SERIES(pbpctl_dev->subdevice))) {
4214 pbpctl_dev->bp_caps |= (TX_CTL_CAP | TX_STATUS_CAP);
4216 if ((pbpctl_dev->subdevice & 0xa00) == 0xa00)
4217 pbpctl_dev->bp_caps |= (TX_CTL_CAP | TX_STATUS_CAP);
4218 if (PEG5_IF_SERIES(pbpctl_dev->subdevice))
4219 pbpctl_dev->bp_caps |= (TX_CTL_CAP | TX_STATUS_CAP);
4221 if (BP10GB_IF_SERIES(pbpctl_dev->subdevice)) {
4222 pbpctl_dev->bp_caps &= ~(TX_CTL_CAP | TX_STATUS_CAP);
4224 pbpctl_dev_m = get_master_port_fn(pbpctl_dev);
4225 if (pbpctl_dev_m != NULL) {
4227 if (pbpctl_dev_m->bp_ext_ver >= 0x9) {
4228 cap_reg = get_bp_prod_caps(pbpctl_dev_m);
4229 if ((cap_reg & DISC_PORT_SUPPORT_MASK) ==
4230 DISC_PORT_SUPPORT_MASK)
4231 pbpctl_dev->bp_caps |=
4232 (TX_CTL_CAP | TX_STATUS_CAP);
4233 pbpctl_dev->bp_caps_ex |= DISC_PORT_CAP_EX;
4238 int bypass_off_init(bpctl_dev_t *pbpctl_dev)
4242 if ((ret = cmnd_on(pbpctl_dev)) < 0)
4244 if (INTEL_IF_SERIES(pbpctl_dev->subdevice))
4245 return dis_bypass_cap(pbpctl_dev);
4246 wdt_off(pbpctl_dev);
4247 if (pbpctl_dev->bp_caps & BP_CAP)
4248 bypass_off(pbpctl_dev);
4249 if (pbpctl_dev->bp_caps & TAP_CAP)
4250 tap_off(pbpctl_dev);
4251 cmnd_off(pbpctl_dev);
4255 void remove_bypass_wd_auto(bpctl_dev_t *pbpctl_dev)
4258 bpctl_dev_t *pbpctl_dev_sl = NULL;
4261 if (pbpctl_dev->bp_caps & WD_CTL_CAP) {
4263 del_timer_sync(&pbpctl_dev->bp_timer);
4265 pbpctl_dev_sl = get_status_port_fn(pbpctl_dev);
4266 if (pbpctl_dev_sl && (pbpctl_dev_sl->ndev)) {
4267 if ((pbpctl_dev_sl->ndev->netdev_ops)
4268 && (pbpctl_dev_sl->old_ops)) {
4270 pbpctl_dev_sl->ndev->netdev_ops =
4271 pbpctl_dev_sl->old_ops;
4272 pbpctl_dev_sl->old_ops = NULL;
4284 int init_bypass_wd_auto(bpctl_dev_t *pbpctl_dev)
4286 if (pbpctl_dev->bp_caps & WD_CTL_CAP) {
4287 init_timer(&pbpctl_dev->bp_timer);
4288 pbpctl_dev->bp_timer.function = &wd_reset_timer;
4289 pbpctl_dev->bp_timer.data = (unsigned long)pbpctl_dev;
4296 int bp_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
4298 bpctl_dev_t *pbpctl_dev = NULL, *pbpctl_dev_m = NULL;
4300 struct ethhdr *eth = (struct ethhdr *)skb->data;
4303 ((bpctl_dev_arr[idx_dev].ndev != NULL) && (idx_dev < device_num));
4305 if (bpctl_dev_arr[idx_dev].ndev == dev) {
4306 pbpctl_dev = &bpctl_dev_arr[idx_dev];
4312 if ((htons(ETH_P_BPTEST) == eth->h_proto)) {
4314 pbpctl_dev_m = get_master_port_fn(pbpctl_dev);
4317 if (bypass_status(pbpctl_dev_m)) {
4318 cmnd_on(pbpctl_dev_m);
4319 bypass_off(pbpctl_dev_m);
4320 cmnd_off(pbpctl_dev_m);
4322 wdt_timer_reload(pbpctl_dev_m);
4324 dev_kfree_skb_irq(skb);
4327 return pbpctl_dev->hard_start_xmit_save(skb, dev);
4331 int set_bypass_wd_auto(bpctl_dev_t *pbpctl_dev, unsigned int param)
4333 if (pbpctl_dev->bp_caps & WD_CTL_CAP) {
4334 if (pbpctl_dev->reset_time != param) {
4335 if (INTEL_IF_SERIES(pbpctl_dev->subdevice))
4336 pbpctl_dev->reset_time =
4338 WDT_AUTO_MIN_INT) ? WDT_AUTO_MIN_INT :
4341 pbpctl_dev->reset_time = param;
4343 mod_timer(&pbpctl_dev->bp_timer, jiffies);
4350 int get_bypass_wd_auto(bpctl_dev_t *pbpctl_dev)
4353 if (pbpctl_dev->bp_caps & WD_CTL_CAP) {
4354 return pbpctl_dev->reset_time;
4361 int set_bp_self_test(bpctl_dev_t *pbpctl_dev, unsigned int param)
4363 bpctl_dev_t *pbpctl_dev_sl = NULL;
4365 if (pbpctl_dev->bp_caps & WD_CTL_CAP) {
4366 pbpctl_dev->bp_self_test_flag = param == 0 ? 0 : 1;
4367 pbpctl_dev_sl = get_status_port_fn(pbpctl_dev);
4369 if ((pbpctl_dev_sl->ndev) && (pbpctl_dev_sl->ndev->netdev_ops)) {
4371 if (pbpctl_dev->bp_self_test_flag == 1) {
4373 pbpctl_dev_sl->old_ops =
4374 pbpctl_dev_sl->ndev->netdev_ops;
4375 pbpctl_dev_sl->new_ops =
4376 *pbpctl_dev_sl->old_ops;
4377 pbpctl_dev_sl->new_ops.ndo_start_xmit =
4379 pbpctl_dev_sl->ndev->netdev_ops =
4380 &pbpctl_dev_sl->new_ops;
4382 } else if (pbpctl_dev_sl->old_ops) {
4383 pbpctl_dev_sl->ndev->netdev_ops =
4384 pbpctl_dev_sl->old_ops;
4385 pbpctl_dev_sl->old_ops = NULL;
4390 set_bypass_wd_auto(pbpctl_dev, param);
4396 int get_bp_self_test(bpctl_dev_t *pbpctl_dev)
4399 if (pbpctl_dev->bp_caps & WD_CTL_CAP) {
4400 if (pbpctl_dev->bp_self_test_flag == 1)
4401 return pbpctl_dev->reset_time;
4410 /**************************************************************/
4411 /************************* API ********************************/
4412 /**************************************************************/
4414 int is_bypass_fn(bpctl_dev_t *pbpctl_dev)
4419 return (((pbpctl_dev->func == 0) || (pbpctl_dev->func == 2)) ? 1 : 0);
4422 int set_bypass_fn(bpctl_dev_t *pbpctl_dev, int bypass_mode)
4426 if (!(pbpctl_dev->bp_caps & BP_CAP))
4428 if ((ret = cmnd_on(pbpctl_dev)) < 0)
4431 ret = bypass_off(pbpctl_dev);
4433 ret = bypass_on(pbpctl_dev);
4434 cmnd_off(pbpctl_dev);
4439 int get_bypass_fn(bpctl_dev_t *pbpctl_dev)
4441 return bypass_status(pbpctl_dev);
4444 int get_bypass_change_fn(bpctl_dev_t *pbpctl_dev)
4449 return bypass_change_status(pbpctl_dev);
4452 int set_dis_bypass_fn(bpctl_dev_t *pbpctl_dev, int dis_param)
4458 if (!(pbpctl_dev->bp_caps & BP_DIS_CAP))
4460 if ((ret = cmnd_on(pbpctl_dev)) < 0)
4463 ret = dis_bypass_cap(pbpctl_dev);
4465 ret = en_bypass_cap(pbpctl_dev);
4466 cmnd_off(pbpctl_dev);
4470 int get_dis_bypass_fn(bpctl_dev_t *pbpctl_dev)
4475 return dis_bypass_cap_status(pbpctl_dev);
4478 int set_bypass_pwoff_fn(bpctl_dev_t *pbpctl_dev, int bypass_mode)
4484 if (!(pbpctl_dev->bp_caps & BP_PWOFF_CTL_CAP))
4486 if ((ret = cmnd_on(pbpctl_dev)) < 0)
4489 ret = bypass_state_pwroff(pbpctl_dev);
4491 ret = normal_state_pwroff(pbpctl_dev);
4492 cmnd_off(pbpctl_dev);
4496 int get_bypass_pwoff_fn(bpctl_dev_t *pbpctl_dev)
4501 return default_pwroff_status(pbpctl_dev);
4504 int set_bypass_pwup_fn(bpctl_dev_t *pbpctl_dev, int bypass_mode)
4510 if (!(pbpctl_dev->bp_caps & BP_PWUP_CTL_CAP))
4512 if ((ret = cmnd_on(pbpctl_dev)) < 0)
4515 ret = bypass_state_pwron(pbpctl_dev);
4517 ret = normal_state_pwron(pbpctl_dev);
4518 cmnd_off(pbpctl_dev);
4522 int get_bypass_pwup_fn(bpctl_dev_t *pbpctl_dev)
4527 return default_pwron_status(pbpctl_dev);
4530 int set_bypass_wd_fn(bpctl_dev_t *pbpctl_dev, int timeout)
4536 if (!(pbpctl_dev->bp_caps & WD_CTL_CAP))
4539 if ((ret = cmnd_on(pbpctl_dev)) < 0)
4542 ret = wdt_off(pbpctl_dev);
4544 wdt_on(pbpctl_dev, timeout);
4545 ret = pbpctl_dev->bypass_timer_interval;
4547 cmnd_off(pbpctl_dev);
4551 int get_bypass_wd_fn(bpctl_dev_t *pbpctl_dev, int *timeout)
4556 return wdt_programmed(pbpctl_dev, timeout);
4559 int get_wd_expire_time_fn(bpctl_dev_t *pbpctl_dev, int *time_left)
4564 return wdt_timer(pbpctl_dev, time_left);
4567 int reset_bypass_wd_timer_fn(bpctl_dev_t *pbpctl_dev)
4572 return wdt_timer_reload(pbpctl_dev);
4575 int get_wd_set_caps_fn(bpctl_dev_t *pbpctl_dev)
4579 unsigned int step_value = TIMEOUT_MAX_STEP + 1, bit_cnt = 0;
4583 if (INTEL_IF_SERIES(pbpctl_dev->subdevice))
4586 while ((step_value >>= 1))
4589 if (is_bypass_fn(pbpctl_dev)) {
4591 WD_STEP_COUNT_MASK(bit_cnt) | WDT_STEP_TIME |
4592 WD_MIN_TIME_MASK(TIMEOUT_UNIT / 100);
4599 int set_std_nic_fn(bpctl_dev_t *pbpctl_dev, int nic_mode)
4605 if (!(pbpctl_dev->bp_caps & STD_NIC_CAP))
4608 if ((ret = cmnd_on(pbpctl_dev)) < 0)
4611 ret = std_nic_on(pbpctl_dev);
4613 ret = std_nic_off(pbpctl_dev);
4614 cmnd_off(pbpctl_dev);
4618 int get_std_nic_fn(bpctl_dev_t *pbpctl_dev)
4623 return std_nic_status(pbpctl_dev);
4626 int set_tap_fn(bpctl_dev_t *pbpctl_dev, int tap_mode)
4631 if ((pbpctl_dev->bp_caps & TAP_CAP) && ((cmnd_on(pbpctl_dev)) >= 0)) {
4633 tap_off(pbpctl_dev);
4636 cmnd_off(pbpctl_dev);
4642 int get_tap_fn(bpctl_dev_t *pbpctl_dev)
4647 return tap_status(pbpctl_dev);
4650 int set_tap_pwup_fn(bpctl_dev_t *pbpctl_dev, int tap_mode)
4656 if ((pbpctl_dev->bp_caps & TAP_PWUP_CTL_CAP)
4657 && ((cmnd_on(pbpctl_dev)) >= 0)) {
4659 ret = tap_state_pwron(pbpctl_dev);
4661 ret = normal_state_pwron(pbpctl_dev);
4662 cmnd_off(pbpctl_dev);
4668 int get_tap_pwup_fn(bpctl_dev_t *pbpctl_dev)
4674 if ((ret = default_pwron_tap_status(pbpctl_dev)) < 0)
4676 return ((ret == 0) ? 1 : 0);
4679 int get_tap_change_fn(bpctl_dev_t *pbpctl_dev)
4684 return tap_change_status(pbpctl_dev);
4687 int set_dis_tap_fn(bpctl_dev_t *pbpctl_dev, int dis_param)
4693 if ((pbpctl_dev->bp_caps & TAP_DIS_CAP) && ((cmnd_on(pbpctl_dev)) >= 0)) {
4695 ret = dis_tap_cap(pbpctl_dev);
4697 ret = en_tap_cap(pbpctl_dev);
4698 cmnd_off(pbpctl_dev);
4704 int get_dis_tap_fn(bpctl_dev_t *pbpctl_dev)
4709 return dis_tap_cap_status(pbpctl_dev);
4712 int set_disc_fn(bpctl_dev_t *pbpctl_dev, int disc_mode)
4717 if ((pbpctl_dev->bp_caps & DISC_CAP) && ((cmnd_on(pbpctl_dev)) >= 0)) {
4719 disc_off(pbpctl_dev);
4721 disc_on(pbpctl_dev);
4722 cmnd_off(pbpctl_dev);
4729 int get_disc_fn(bpctl_dev_t *pbpctl_dev)
4735 ret = disc_status(pbpctl_dev);
4740 int set_disc_pwup_fn(bpctl_dev_t *pbpctl_dev, int disc_mode)
4746 if ((pbpctl_dev->bp_caps & DISC_PWUP_CTL_CAP)
4747 && ((cmnd_on(pbpctl_dev)) >= 0)) {
4749 ret = disc_state_pwron(pbpctl_dev);
4751 ret = normal_state_pwron(pbpctl_dev);
4752 cmnd_off(pbpctl_dev);
4758 int get_disc_pwup_fn(bpctl_dev_t *pbpctl_dev)
4764 ret = default_pwron_disc_status(pbpctl_dev);
4765 return (ret == 0 ? 1 : (ret < 0 ? BP_NOT_CAP : 0));
4768 int get_disc_change_fn(bpctl_dev_t *pbpctl_dev)
4774 ret = disc_change_status(pbpctl_dev);
4778 int set_dis_disc_fn(bpctl_dev_t *pbpctl_dev, int dis_param)
4784 if ((pbpctl_dev->bp_caps & DISC_DIS_CAP)
4785 && ((cmnd_on(pbpctl_dev)) >= 0)) {
4787 ret = dis_disc_cap(pbpctl_dev);
4789 ret = en_disc_cap(pbpctl_dev);
4790 cmnd_off(pbpctl_dev);
4796 int get_dis_disc_fn(bpctl_dev_t *pbpctl_dev)
4802 ret = dis_disc_cap_status(pbpctl_dev);
4807 int set_disc_port_fn(bpctl_dev_t *pbpctl_dev, int disc_mode)
4809 int ret = BP_NOT_CAP;
4814 ret = disc_port_off(pbpctl_dev);
4816 ret = disc_port_on(pbpctl_dev);
4821 int get_disc_port_fn(bpctl_dev_t *pbpctl_dev)
4826 return disc_port_status(pbpctl_dev);
4829 int set_disc_port_pwup_fn(bpctl_dev_t *pbpctl_dev, int disc_mode)
4831 int ret = BP_NOT_CAP;
4836 ret = normal_port_state_pwron(pbpctl_dev);
4838 ret = disc_port_state_pwron(pbpctl_dev);
4843 int get_disc_port_pwup_fn(bpctl_dev_t *pbpctl_dev)
4849 if ((ret = default_pwron_disc_port_status(pbpctl_dev)) < 0)
4851 return ((ret == 0) ? 1 : 0);
4854 int get_wd_exp_mode_fn(bpctl_dev_t *pbpctl_dev)
4859 return wdt_exp_mode_status(pbpctl_dev);
4862 int set_wd_exp_mode_fn(bpctl_dev_t *pbpctl_dev, int param)
4867 return wdt_exp_mode(pbpctl_dev, param);
4870 int reset_cont_fn(bpctl_dev_t *pbpctl_dev)
4876 if ((ret = cmnd_on(pbpctl_dev)) < 0)
4878 return reset_cont(pbpctl_dev);
4881 int set_tx_fn(bpctl_dev_t *pbpctl_dev, int tx_state)
4884 bpctl_dev_t *pbpctl_dev_b = NULL;
4888 if ((pbpctl_dev->bp_caps & TPL_CAP) &&
4889 (pbpctl_dev->bp_caps & SW_CTL_CAP)) {
4890 if ((pbpctl_dev->bp_tpl_flag))
4892 } else if ((pbpctl_dev_b = get_master_port_fn(pbpctl_dev))) {
4893 if ((pbpctl_dev_b->bp_caps & TPL_CAP) &&
4894 (pbpctl_dev_b->bp_tpl_flag))
4897 return set_tx(pbpctl_dev, tx_state);
4900 int set_bp_force_link_fn(int dev_num, int tx_state)
4902 static bpctl_dev_t *bpctl_dev_curr;
4904 if ((dev_num < 0) || (dev_num > device_num)
4905 || (bpctl_dev_arr[dev_num].pdev == NULL))
4907 bpctl_dev_curr = &bpctl_dev_arr[dev_num];
4909 return set_bp_force_link(bpctl_dev_curr, tx_state);
4912 int set_wd_autoreset_fn(bpctl_dev_t *pbpctl_dev, int param)
4917 return set_bypass_wd_auto(pbpctl_dev, param);
4920 int get_wd_autoreset_fn(bpctl_dev_t *pbpctl_dev)
4925 return get_bypass_wd_auto(pbpctl_dev);
4929 int set_bp_self_test_fn(bpctl_dev_t *pbpctl_dev, int param)
4934 return set_bp_self_test(pbpctl_dev, param);
4937 int get_bp_self_test_fn(bpctl_dev_t *pbpctl_dev)
4942 return get_bp_self_test(pbpctl_dev);
4947 int get_bypass_caps_fn(bpctl_dev_t *pbpctl_dev)
4952 return pbpctl_dev->bp_caps;
4956 int get_bypass_slave_fn(bpctl_dev_t *pbpctl_dev, bpctl_dev_t **pbpctl_dev_out)
4962 if ((pbpctl_dev->func == 0) || (pbpctl_dev->func == 2)) {
4964 ((bpctl_dev_arr[idx_dev].pdev != NULL)
4965 && (idx_dev < device_num)); idx_dev++) {
4966 if ((bpctl_dev_arr[idx_dev].bus == pbpctl_dev->bus)
4967 && (bpctl_dev_arr[idx_dev].slot ==
4968 pbpctl_dev->slot)) {
4969 if ((pbpctl_dev->func == 0)
4970 && (bpctl_dev_arr[idx_dev].func == 1)) {
4972 &bpctl_dev_arr[idx_dev];
4975 if ((pbpctl_dev->func == 2) &&
4976 (bpctl_dev_arr[idx_dev].func == 3)) {
4978 &bpctl_dev_arr[idx_dev];
4988 int is_bypass(bpctl_dev_t *pbpctl_dev)
4993 if ((pbpctl_dev->func == 0) || (pbpctl_dev->func == 2))
4999 int get_tx_fn(bpctl_dev_t *pbpctl_dev)
5001 bpctl_dev_t *pbpctl_dev_b = NULL;
5005 if ((pbpctl_dev->bp_caps & TPL_CAP) &&
5006 (pbpctl_dev->bp_caps & SW_CTL_CAP)) {
5007 if ((pbpctl_dev->bp_tpl_flag))
5009 } else if ((pbpctl_dev_b = get_master_port_fn(pbpctl_dev))) {
5010 if ((pbpctl_dev_b->bp_caps & TPL_CAP) &&
5011 (pbpctl_dev_b->bp_tpl_flag))
5014 return tx_status(pbpctl_dev);
5017 int get_bp_force_link_fn(int dev_num)
5019 static bpctl_dev_t *bpctl_dev_curr;
5021 if ((dev_num < 0) || (dev_num > device_num)
5022 || (bpctl_dev_arr[dev_num].pdev == NULL))
5024 bpctl_dev_curr = &bpctl_dev_arr[dev_num];
5026 return bp_force_link_status(bpctl_dev_curr);
5029 static int get_bypass_link_status(bpctl_dev_t *pbpctl_dev)
5034 if (pbpctl_dev->media_type == bp_fiber)
5035 return ((BPCTL_READ_REG(pbpctl_dev, CTRL) &
5036 BPCTLI_CTRL_SWDPIN1));
5038 return ((BPCTL_READ_REG(pbpctl_dev, STATUS) &
5043 static void bp_tpl_timer_fn(unsigned long param)
5045 bpctl_dev_t *pbpctl_dev = (bpctl_dev_t *) param;
5046 uint32_t link1, link2;
5047 bpctl_dev_t *pbpctl_dev_b = NULL;
5049 if (!(pbpctl_dev_b = get_status_port_fn(pbpctl_dev)))
5052 if (!pbpctl_dev->bp_tpl_flag) {
5053 set_tx(pbpctl_dev_b, 1);
5054 set_tx(pbpctl_dev, 1);
5057 link1 = get_bypass_link_status(pbpctl_dev);
5059 link2 = get_bypass_link_status(pbpctl_dev_b);
5060 if ((link1) && (tx_status(pbpctl_dev))) {
5061 if ((!link2) && (tx_status(pbpctl_dev_b))) {
5062 set_tx(pbpctl_dev, 0);
5063 } else if (!tx_status(pbpctl_dev_b)) {
5064 set_tx(pbpctl_dev_b, 1);
5066 } else if ((!link1) && (tx_status(pbpctl_dev))) {
5067 if ((link2) && (tx_status(pbpctl_dev_b))) {
5068 set_tx(pbpctl_dev_b, 0);
5070 } else if ((link1) && (!tx_status(pbpctl_dev))) {
5071 if ((link2) && (tx_status(pbpctl_dev_b))) {
5072 set_tx(pbpctl_dev, 1);
5074 } else if ((!link1) && (!tx_status(pbpctl_dev))) {
5075 if ((link2) && (tx_status(pbpctl_dev_b))) {
5076 set_tx(pbpctl_dev, 1);
5080 mod_timer(&pbpctl_dev->bp_tpl_timer, jiffies + BP_LINK_MON_DELAY * HZ);
5083 void remove_bypass_tpl_auto(bpctl_dev_t *pbpctl_dev)
5085 bpctl_dev_t *pbpctl_dev_b = NULL;
5088 pbpctl_dev_b = get_status_port_fn(pbpctl_dev);
5090 if (pbpctl_dev->bp_caps & TPL_CAP) {
5091 del_timer_sync(&pbpctl_dev->bp_tpl_timer);
5092 pbpctl_dev->bp_tpl_flag = 0;
5093 pbpctl_dev_b = get_status_port_fn(pbpctl_dev);
5095 set_tx(pbpctl_dev_b, 1);
5096 set_tx(pbpctl_dev, 1);
5101 int init_bypass_tpl_auto(bpctl_dev_t *pbpctl_dev)
5105 if (pbpctl_dev->bp_caps & TPL_CAP) {
5106 init_timer(&pbpctl_dev->bp_tpl_timer);
5107 pbpctl_dev->bp_tpl_timer.function = &bp_tpl_timer_fn;
5108 pbpctl_dev->bp_tpl_timer.data = (unsigned long)pbpctl_dev;
5114 int set_bypass_tpl_auto(bpctl_dev_t *pbpctl_dev, unsigned int param)
5118 if (pbpctl_dev->bp_caps & TPL_CAP) {
5119 if ((param) && (!pbpctl_dev->bp_tpl_flag)) {
5120 pbpctl_dev->bp_tpl_flag = param;
5121 mod_timer(&pbpctl_dev->bp_tpl_timer, jiffies + 1);
5124 if ((!param) && (pbpctl_dev->bp_tpl_flag))
5125 remove_bypass_tpl_auto(pbpctl_dev);
5132 int get_bypass_tpl_auto(bpctl_dev_t *pbpctl_dev)
5136 if (pbpctl_dev->bp_caps & TPL_CAP) {
5137 return pbpctl_dev->bp_tpl_flag;
5142 int set_tpl_fn(bpctl_dev_t *pbpctl_dev, int tpl_mode)
5145 bpctl_dev_t *pbpctl_dev_b = NULL;
5149 pbpctl_dev_b = get_status_port_fn(pbpctl_dev);
5151 if (pbpctl_dev->bp_caps & TPL_CAP) {
5153 if ((pbpctl_dev_b = get_status_port_fn(pbpctl_dev)))
5154 set_tx(pbpctl_dev_b, 1);
5155 set_tx(pbpctl_dev, 1);
5157 if ((TPL_IF_SERIES(pbpctl_dev->subdevice)) ||
5158 (pbpctl_dev->bp_caps_ex & TPL2_CAP_EX)) {
5159 pbpctl_dev->bp_tpl_flag = tpl_mode;
5161 tpl_hw_off(pbpctl_dev);
5163 tpl_hw_on(pbpctl_dev);
5165 set_bypass_tpl_auto(pbpctl_dev, tpl_mode);
5171 int get_tpl_fn(bpctl_dev_t *pbpctl_dev)
5173 int ret = BP_NOT_CAP;
5177 if (pbpctl_dev->bp_caps & TPL_CAP) {
5178 if (pbpctl_dev->bp_caps_ex & TPL2_CAP_EX)
5179 return tpl2_flag_status(pbpctl_dev);
5180 ret = pbpctl_dev->bp_tpl_flag;
5185 int set_bp_wait_at_pwup_fn(bpctl_dev_t *pbpctl_dev, int tap_mode)
5190 if (pbpctl_dev->bp_caps & SW_CTL_CAP) {
5191 /* bp_lock(pbp_device_block); */
5192 cmnd_on(pbpctl_dev);
5194 bp_wait_at_pwup_dis(pbpctl_dev);
5196 bp_wait_at_pwup_en(pbpctl_dev);
5197 cmnd_off(pbpctl_dev);
5199 /* bp_unlock(pbp_device_block); */
5205 int get_bp_wait_at_pwup_fn(bpctl_dev_t *pbpctl_dev)
5211 /* bp_lock(pbp_device_block); */
5212 ret = bp_wait_at_pwup_status(pbpctl_dev);
5213 /* bp_unlock(pbp_device_block); */
5218 int set_bp_hw_reset_fn(bpctl_dev_t *pbpctl_dev, int tap_mode)
5223 if (pbpctl_dev->bp_caps & SW_CTL_CAP) {
5224 /* bp_lock(pbp_device_block); */
5225 cmnd_on(pbpctl_dev);
5228 bp_hw_reset_dis(pbpctl_dev);
5230 bp_hw_reset_en(pbpctl_dev);
5231 cmnd_off(pbpctl_dev);
5232 /* bp_unlock(pbp_device_block); */
5238 int get_bp_hw_reset_fn(bpctl_dev_t *pbpctl_dev)
5244 /* bp_lock(pbp_device_block); */
5245 ret = bp_hw_reset_status(pbpctl_dev);
5247 /* bp_unlock(pbp_device_block); */
5253 int get_bypass_info_fn(bpctl_dev_t *pbpctl_dev, char *dev_name,
5258 if (!is_bypass_fn(pbpctl_dev))
5260 strcpy(dev_name, pbpctl_dev->name);
5261 *add_param = pbpctl_dev->bp_fw_ver;
5265 int get_dev_idx_bsf(int bus, int slot, int func)
5269 ((bpctl_dev_arr[idx_dev].pdev != NULL) && (idx_dev < device_num));
5271 if ((bus == bpctl_dev_arr[idx_dev].bus)
5272 && (slot == bpctl_dev_arr[idx_dev].slot)
5273 && (func == bpctl_dev_arr[idx_dev].func))
5280 static void str_low(char *str)
5284 for (i = 0; i < strlen(str); i++)
5285 if ((str[i] >= 65) && (str[i] <= 90))
5289 static unsigned long str_to_hex(char *p)
5291 unsigned long hex = 0;
5292 unsigned long length = strlen(p), shift = 0;
5293 unsigned char dig = 0;
5303 dig = dig < 'a' ? (dig - '0') : (dig - 'a' + 0xa);
5304 hex |= (dig << shift);
5310 static int get_dev_idx(int ifindex)
5315 ((bpctl_dev_arr[idx_dev].pdev != NULL) && (idx_dev < device_num));
5317 if (ifindex == bpctl_dev_arr[idx_dev].ifindex)
5324 static bpctl_dev_t *get_dev_idx_p(int ifindex)
5329 ((bpctl_dev_arr[idx_dev].pdev != NULL) && (idx_dev < device_num));
5331 if (ifindex == bpctl_dev_arr[idx_dev].ifindex)
5332 return &bpctl_dev_arr[idx_dev];
5338 static void if_scan_init(void)
5341 struct net_device *dev;
5343 /* rcu_read_lock(); */
5345 /* rcu_read_lock(); */
5347 for_each_netdev(&init_net, dev) {
5349 struct ethtool_drvinfo drvinfo;
5354 int bus = 0, slot = 0, func = 0;
5355 ifindex = dev->ifindex;
5358 memset(&drvinfo, 0, sizeof(struct ethtool_drvinfo));
5360 if (dev->ethtool_ops && dev->ethtool_ops->get_drvinfo) {
5361 memset(&drvinfo, 0, sizeof(drvinfo));
5362 dev->ethtool_ops->get_drvinfo(dev, &drvinfo);
5365 if (!strcmp(drvinfo.bus_info, "N/A"))
5367 memcpy(&cbuf, drvinfo.bus_info, 32);
5370 while (*buf++ != ':') ;
5371 for (i = 0; i < 10; i++, buf++) {
5378 bus = str_to_hex(res);
5381 for (i = 0; i < 10; i++, buf++) {
5388 slot = str_to_hex(res);
5389 func = str_to_hex(buf);
5390 idx_dev = get_dev_idx_bsf(bus, slot, func);
5392 if (idx_dev != -1) {
5394 bpctl_dev_arr[idx_dev].ifindex = ifindex;
5395 bpctl_dev_arr[idx_dev].ndev = dev;
5400 /* rtnl_unlock(); */
5401 /* rcu_read_unlock(); */
5405 static long device_ioctl(struct file *file, /* see include/linux/fs.h */
5406 unsigned int ioctl_num, /* number and param for ioctl */
5407 unsigned long ioctl_param)
5409 struct bpctl_cmd bpctl_cmd;
5411 bpctl_dev_t *pbpctl_dev_out;
5412 void __user *argp = (void __user *)ioctl_param;
5414 unsigned long flags;
5416 static bpctl_dev_t *pbpctl_dev;
5418 /* lock_kernel(); */
5420 /* local_irq_save(flags); */
5421 /* if(!spin_trylock_irqsave(&bpvm_lock)){
5422 local_irq_restore(flags);
5427 /* spin_lock_irqsave(&bpvm_lock, flags); */
5430 * Switch according to the ioctl called
5432 if (ioctl_num == IOCTL_TX_MSG(IF_SCAN)) {
5437 if (copy_from_user(&bpctl_cmd, argp, sizeof(struct bpctl_cmd))) {
5443 if (ioctl_num == IOCTL_TX_MSG(GET_DEV_NUM)) {
5444 bpctl_cmd.out_param[0] = device_num;
5446 (argp, (void *)&bpctl_cmd, sizeof(struct bpctl_cmd))) {
5455 /* preempt_disable(); */
5456 local_irq_save(flags);
5457 if (!spin_trylock(&bpvm_lock)) {
5458 local_irq_restore(flags);
5463 /* preempt_disable();
5465 spin_lock_irqsave(&bpvm_lock, flags);
5467 if ((bpctl_cmd.in_param[5]) ||
5468 (bpctl_cmd.in_param[6]) || (bpctl_cmd.in_param[7]))
5469 dev_idx = get_dev_idx_bsf(bpctl_cmd.in_param[5],
5470 bpctl_cmd.in_param[6],
5471 bpctl_cmd.in_param[7]);
5472 else if (bpctl_cmd.in_param[1] == 0)
5473 dev_idx = bpctl_cmd.in_param[0];
5475 dev_idx = get_dev_idx(bpctl_cmd.in_param[1]);
5477 if (dev_idx < 0 || dev_idx > device_num) {
5479 preempt_enable(); */
5481 /* preempt_enable();
5482 rcu_read_unlock(); */
5483 spin_unlock_irqrestore(&bpvm_lock, flags);
5487 bpctl_cmd.out_param[0] = bpctl_dev_arr[dev_idx].bus;
5488 bpctl_cmd.out_param[1] = bpctl_dev_arr[dev_idx].slot;
5489 bpctl_cmd.out_param[2] = bpctl_dev_arr[dev_idx].func;
5490 bpctl_cmd.out_param[3] = bpctl_dev_arr[dev_idx].ifindex;
5492 if ((bpctl_dev_arr[dev_idx].bp_10gb)
5493 && (!(bpctl_dev_arr[dev_idx].ifindex))) {
5494 printk("Please load network driver for %s adapter!\n",
5495 bpctl_dev_arr[dev_idx].name);
5496 bpctl_cmd.status = -1;
5498 /* preempt_enable(); */
5499 /* rcu_read_unlock(); */
5500 spin_unlock_irqrestore(&bpvm_lock, flags);
5504 if ((bpctl_dev_arr[dev_idx].bp_10gb) && (bpctl_dev_arr[dev_idx].ndev)) {
5505 if (!(bpctl_dev_arr[dev_idx].ndev->flags & IFF_UP)) {
5506 if (!(bpctl_dev_arr[dev_idx].ndev->flags & IFF_UP)) {
5508 ("Please bring up network interfaces for %s adapter!\n",
5509 bpctl_dev_arr[dev_idx].name);
5510 bpctl_cmd.status = -1;
5512 /* preempt_enable(); */
5513 /* rcu_read_unlock(); */
5514 spin_unlock_irqrestore(&bpvm_lock, flags);
5521 if ((dev_idx < 0) || (dev_idx > device_num)
5522 || (bpctl_dev_arr[dev_idx].pdev == NULL)) {
5523 bpctl_cmd.status = -1;
5527 pbpctl_dev = &bpctl_dev_arr[dev_idx];
5529 switch (ioctl_num) {
5530 case IOCTL_TX_MSG(SET_BYPASS_PWOFF):
5532 set_bypass_pwoff_fn(pbpctl_dev, bpctl_cmd.in_param[2]);
5535 case IOCTL_TX_MSG(GET_BYPASS_PWOFF):
5536 bpctl_cmd.status = get_bypass_pwoff_fn(pbpctl_dev);
5539 case IOCTL_TX_MSG(SET_BYPASS_PWUP):
5541 set_bypass_pwup_fn(pbpctl_dev, bpctl_cmd.in_param[2]);
5544 case IOCTL_TX_MSG(GET_BYPASS_PWUP):
5545 bpctl_cmd.status = get_bypass_pwup_fn(pbpctl_dev);
5548 case IOCTL_TX_MSG(SET_BYPASS_WD):
5550 set_bypass_wd_fn(pbpctl_dev, bpctl_cmd.in_param[2]);
5553 case IOCTL_TX_MSG(GET_BYPASS_WD):
5555 get_bypass_wd_fn(pbpctl_dev, (int *)&(bpctl_cmd.data[0]));
5558 case IOCTL_TX_MSG(GET_WD_EXPIRE_TIME):
5560 get_wd_expire_time_fn(pbpctl_dev,
5561 (int *)&(bpctl_cmd.data[0]));
5564 case IOCTL_TX_MSG(RESET_BYPASS_WD_TIMER):
5565 bpctl_cmd.status = reset_bypass_wd_timer_fn(pbpctl_dev);
5568 case IOCTL_TX_MSG(GET_WD_SET_CAPS):
5569 bpctl_cmd.status = get_wd_set_caps_fn(pbpctl_dev);
5572 case IOCTL_TX_MSG(SET_STD_NIC):
5574 set_std_nic_fn(pbpctl_dev, bpctl_cmd.in_param[2]);
5577 case IOCTL_TX_MSG(GET_STD_NIC):
5578 bpctl_cmd.status = get_std_nic_fn(pbpctl_dev);
5581 case IOCTL_TX_MSG(SET_TAP):
5583 set_tap_fn(pbpctl_dev, bpctl_cmd.in_param[2]);
5586 case IOCTL_TX_MSG(GET_TAP):
5587 bpctl_cmd.status = get_tap_fn(pbpctl_dev);
5590 case IOCTL_TX_MSG(GET_TAP_CHANGE):
5591 bpctl_cmd.status = get_tap_change_fn(pbpctl_dev);
5594 case IOCTL_TX_MSG(SET_DIS_TAP):
5596 set_dis_tap_fn(pbpctl_dev, bpctl_cmd.in_param[2]);
5599 case IOCTL_TX_MSG(GET_DIS_TAP):
5600 bpctl_cmd.status = get_dis_tap_fn(pbpctl_dev);
5603 case IOCTL_TX_MSG(SET_TAP_PWUP):
5605 set_tap_pwup_fn(pbpctl_dev, bpctl_cmd.in_param[2]);
5608 case IOCTL_TX_MSG(GET_TAP_PWUP):
5609 bpctl_cmd.status = get_tap_pwup_fn(pbpctl_dev);
5612 case IOCTL_TX_MSG(SET_WD_EXP_MODE):
5614 set_wd_exp_mode_fn(pbpctl_dev, bpctl_cmd.in_param[2]);
5617 case IOCTL_TX_MSG(GET_WD_EXP_MODE):
5618 bpctl_cmd.status = get_wd_exp_mode_fn(pbpctl_dev);
5621 case IOCTL_TX_MSG(GET_DIS_BYPASS):
5622 bpctl_cmd.status = get_dis_bypass_fn(pbpctl_dev);
5625 case IOCTL_TX_MSG(SET_DIS_BYPASS):
5627 set_dis_bypass_fn(pbpctl_dev, bpctl_cmd.in_param[2]);
5630 case IOCTL_TX_MSG(GET_BYPASS_CHANGE):
5631 bpctl_cmd.status = get_bypass_change_fn(pbpctl_dev);
5634 case IOCTL_TX_MSG(GET_BYPASS):
5635 bpctl_cmd.status = get_bypass_fn(pbpctl_dev);
5638 case IOCTL_TX_MSG(SET_BYPASS):
5640 set_bypass_fn(pbpctl_dev, bpctl_cmd.in_param[2]);
5643 case IOCTL_TX_MSG(GET_BYPASS_CAPS):
5644 bpctl_cmd.status = get_bypass_caps_fn(pbpctl_dev);
5645 /*preempt_enable(); */
5646 /*rcu_read_unlock();*/
5647 spin_unlock_irqrestore(&bpvm_lock, flags);
5649 (argp, (void *)&bpctl_cmd, sizeof(struct bpctl_cmd))) {
5650 /*unlock_bpctl(); */
5651 /*preempt_enable(); */
5657 case IOCTL_TX_MSG(GET_BYPASS_SLAVE):
5659 get_bypass_slave_fn(pbpctl_dev, &pbpctl_dev_out);
5660 if (bpctl_cmd.status == 1) {
5661 bpctl_cmd.out_param[4] = pbpctl_dev_out->bus;
5662 bpctl_cmd.out_param[5] = pbpctl_dev_out->slot;
5663 bpctl_cmd.out_param[6] = pbpctl_dev_out->func;
5664 bpctl_cmd.out_param[7] = pbpctl_dev_out->ifindex;
5668 case IOCTL_TX_MSG(IS_BYPASS):
5669 bpctl_cmd.status = is_bypass(pbpctl_dev);
5671 case IOCTL_TX_MSG(SET_TX):
5672 bpctl_cmd.status = set_tx_fn(pbpctl_dev, bpctl_cmd.in_param[2]);
5674 case IOCTL_TX_MSG(GET_TX):
5675 bpctl_cmd.status = get_tx_fn(pbpctl_dev);
5677 case IOCTL_TX_MSG(SET_WD_AUTORESET):
5679 set_wd_autoreset_fn(pbpctl_dev, bpctl_cmd.in_param[2]);
5682 case IOCTL_TX_MSG(GET_WD_AUTORESET):
5684 bpctl_cmd.status = get_wd_autoreset_fn(pbpctl_dev);
5686 case IOCTL_TX_MSG(SET_DISC):
5688 set_disc_fn(pbpctl_dev, bpctl_cmd.in_param[2]);
5690 case IOCTL_TX_MSG(GET_DISC):
5691 bpctl_cmd.status = get_disc_fn(pbpctl_dev);
5693 case IOCTL_TX_MSG(GET_DISC_CHANGE):
5694 bpctl_cmd.status = get_disc_change_fn(pbpctl_dev);
5696 case IOCTL_TX_MSG(SET_DIS_DISC):
5698 set_dis_disc_fn(pbpctl_dev, bpctl_cmd.in_param[2]);
5700 case IOCTL_TX_MSG(GET_DIS_DISC):
5701 bpctl_cmd.status = get_dis_disc_fn(pbpctl_dev);
5703 case IOCTL_TX_MSG(SET_DISC_PWUP):
5705 set_disc_pwup_fn(pbpctl_dev, bpctl_cmd.in_param[2]);
5707 case IOCTL_TX_MSG(GET_DISC_PWUP):
5708 bpctl_cmd.status = get_disc_pwup_fn(pbpctl_dev);
5711 case IOCTL_TX_MSG(GET_BYPASS_INFO):
5714 get_bypass_info_fn(pbpctl_dev, (char *)&bpctl_cmd.data,
5715 (char *)&bpctl_cmd.out_param[4]);
5718 case IOCTL_TX_MSG(SET_TPL):
5720 set_tpl_fn(pbpctl_dev, bpctl_cmd.in_param[2]);
5723 case IOCTL_TX_MSG(GET_TPL):
5724 bpctl_cmd.status = get_tpl_fn(pbpctl_dev);
5726 case IOCTL_TX_MSG(SET_BP_WAIT_AT_PWUP):
5728 set_bp_wait_at_pwup_fn(pbpctl_dev, bpctl_cmd.in_param[2]);
5731 case IOCTL_TX_MSG(GET_BP_WAIT_AT_PWUP):
5732 bpctl_cmd.status = get_bp_wait_at_pwup_fn(pbpctl_dev);
5734 case IOCTL_TX_MSG(SET_BP_HW_RESET):
5736 set_bp_hw_reset_fn(pbpctl_dev, bpctl_cmd.in_param[2]);
5739 case IOCTL_TX_MSG(GET_BP_HW_RESET):
5740 bpctl_cmd.status = get_bp_hw_reset_fn(pbpctl_dev);
5743 case IOCTL_TX_MSG(SET_BP_SELF_TEST):
5745 set_bp_self_test_fn(pbpctl_dev, bpctl_cmd.in_param[2]);
5748 case IOCTL_TX_MSG(GET_BP_SELF_TEST):
5749 bpctl_cmd.status = get_bp_self_test_fn(pbpctl_dev);
5754 case IOCTL_TX_MSG(SET_DISC_PORT):
5756 set_disc_port_fn(pbpctl_dev, bpctl_cmd.in_param[2]);
5759 case IOCTL_TX_MSG(GET_DISC_PORT):
5760 bpctl_cmd.status = get_disc_port_fn(pbpctl_dev);
5763 case IOCTL_TX_MSG(SET_DISC_PORT_PWUP):
5765 set_disc_port_pwup_fn(pbpctl_dev, bpctl_cmd.in_param[2]);
5768 case IOCTL_TX_MSG(GET_DISC_PORT_PWUP):
5769 bpctl_cmd.status = get_disc_port_pwup_fn(pbpctl_dev);
5772 case IOCTL_TX_MSG(SET_BP_FORCE_LINK):
5774 set_bp_force_link_fn(dev_idx, bpctl_cmd.in_param[2]);
5777 case IOCTL_TX_MSG(GET_BP_FORCE_LINK):
5778 bpctl_cmd.status = get_bp_force_link_fn(dev_idx);
5782 /* unlock_bpctl(); */
5785 /* preempt_enable(); */
5786 /* rcu_read_unlock();*/
5787 spin_unlock_irqrestore(&bpvm_lock, flags);
5790 /* unlock_bpctl(); */
5791 /* preempt_enable(); */
5793 /* rcu_read_unlock(); */
5794 spin_unlock_irqrestore(&bpvm_lock, flags);
5795 if (copy_to_user(argp, (void *)&bpctl_cmd, sizeof(struct bpctl_cmd)))
5799 /* unlock_kernel(); */
5800 /* spin_unlock_irqrestore(&bpvm_lock, flags); */
5802 /* unlock_kernel(); */
5806 static const struct file_operations Fops = {
5807 .owner = THIS_MODULE,
5808 .unlocked_ioctl = device_ioctl,
5809 .open = device_open,
5810 .release = device_release, /* a.k.a. close */
5814 #define PCI_DEVICE(vend,dev) \
5815 .vendor = (vend), .device = (dev), \
5816 .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID
5819 #define SILICOM_E1000BP_ETHERNET_DEVICE(device_id) {\
5820 PCI_DEVICE(SILICOM_VID, device_id)}
5982 typedef struct _bpmod_info_t {
5983 unsigned int vendor;
5984 unsigned int device;
5985 unsigned int subvendor;
5986 unsigned int subdevice;
5992 typedef struct _dev_desc {
5996 dev_desc_t dev_desc[] = {
5997 {"Silicom Bypass PXG2BPFI-SD series adapter"},
5998 {"Silicom Bypass PXG2BPFIL-SD series adapter"},
5999 {"Silicom Bypass PXG2BPFILX-SD series adapter"},
6000 {"Silicom Bypass PXG2BPFILLX-SD series adapter"},
6001 {"Silicom Bypass PXG2BPI-SD series adapter"},
6002 {"Silicom Bypass PXG2BPIG-SD series adapter"},
6003 {"Silicom Bypass PXG2TBFI-SD series adapter"},
6004 {"Silicom Bypass PXG4BPI-SD series adapter"},
6005 {"Silicom Bypass PXG4BPFI-SD series adapter"},
6006 {"Silicom Bypass PEG4BPI-SD series adapter"},
6007 {"Silicom Bypass PEG2BPI-SD series adapter"},
6008 {"Silicom Bypass PEG4BPIN-SD series adapter"},
6009 {"Silicom Bypass PEG2BPFI-SD series adapter"},
6010 {"Silicom Bypass PEG2BPFI-LX-SD series adapter"},
6011 {"Silicom Bypass PMCX2BPFI-SD series adapter"},
6012 {"Silicom Bypass PMCX2BPFI-N series adapter"},
6013 {"Intel Bypass PEG2BPII series adapter"},
6014 {"Intel Bypass PEG2BPFII series adapter"},
6015 {"Silicom Bypass PXG4BPFILX-SD series adapter"},
6016 {"Silicom Bypass PMCX2BPI-N series adapter"},
6017 {"Silicom Bypass PMCX4BPI-N series adapter"},
6018 {"Silicom Bypass PXG2BISC1-SD series adapter"},
6019 {"Silicom Bypass PEG2TBFI-SD series adapter"},
6020 {"Silicom Bypass PXG2TBI-SD series adapter"},
6021 {"Silicom Bypass PXG4BPFID-SD series adapter"},
6022 {"Silicom Bypass PEG4BPFI-SD series adapter"},
6023 {"Silicom Bypass PEG4BPIPT-SD series adapter"},
6024 {"Silicom Bypass PXG6BPI-SD series adapter"},
6025 {"Silicom Bypass PEG4BPIL-SD series adapter"},
6026 {"Silicom Bypass PMCX2BPI-N2 series adapter"},
6027 {"Silicom Bypass PMCX4BPI-N2 series adapter"},
6028 {"Silicom Bypass PMCX2BPI-SD series adapter"},
6029 {"Silicom Bypass PEG2BPFID-SD series adapter"},
6030 {"Silicom Bypass PEG2BPFIDLX-SD series adapter"},
6031 {"Silicom Bypass PMCX4BPI-SD series adapter"},
6032 {"Silicom Bypass MEG2BPFILN-SD series adapter"},
6033 {"Silicom Bypass MEG2BPFINX-SD series adapter"},
6034 {"Silicom Bypass PEG4BPFILX-SD series adapter"},
6035 {"Silicom Bypass PE10G2BPISR-SD series adapter"},
6036 {"Silicom Bypass PE10G2BPILR-SD series adapter"},
6037 {"Silicom Bypass MHIO8AD-SD series adapter"},
6038 {"Silicom Bypass PE10G2BPICX4-SD series adapter"},
6039 {"Silicom Bypass PEG2BPI5-SD series adapter"},
6040 {"Silicom Bypass PEG6BPI5-SD series adapter"},
6041 {"Silicom Bypass PEG4BPFI5-SD series adapter"},
6042 {"Silicom Bypass PEG4BPFI5LX-SD series adapter"},
6043 {"Silicom Bypass MEG2BPFILXLN-SD series adapter"},
6044 {"Silicom Bypass PEG2BPIX1-SD series adapter"},
6045 {"Silicom Bypass MEG2BPFILXNX-SD series adapter"},
6046 {"Silicom Bypass XE10G2BPIT-SD series adapter"},
6047 {"Silicom Bypass XE10G2BPICX4-SD series adapter"},
6048 {"Silicom Bypass XE10G2BPISR-SD series adapter"},
6049 {"Silicom Bypass XE10G2BPILR-SD series adapter"},
6050 {"Intel Bypass PEG2BPFII0 series adapter"},
6051 {"Silicom Bypass XE10G2BPIXR series adapter"},
6052 {"Silicom Bypass PE10G2DBISR series adapter"},
6053 {"Silicom Bypass PEG2BI5SC6 series adapter"},
6054 {"Silicom Bypass PEG6BPI5FC series adapter"},
6056 {"Silicom Bypass PE10G2BPTCX4 series adapter"},
6057 {"Silicom Bypass PE10G2BPTSR series adapter"},
6058 {"Silicom Bypass PE10G2BPTLR series adapter"},
6059 {"Silicom Bypass PE10G2BPTT series adapter"},
6060 {"Silicom Bypass PEG4BPI6 series adapter"},
6061 {"Silicom Bypass PEG4BPFI6 series adapter"},
6062 {"Silicom Bypass PEG4BPFI6LX series adapter"},
6063 {"Silicom Bypass PEG4BPFI6ZX series adapter"},
6064 {"Silicom Bypass PEG2BPI6 series adapter"},
6065 {"Silicom Bypass PEG2BPFI6 series adapter"},
6066 {"Silicom Bypass PEG2BPFI6LX series adapter"},
6067 {"Silicom Bypass PEG2BPFI6ZX series adapter"},
6068 {"Silicom Bypass PEG2BPFI6FLXM series adapter"},
6069 {"Silicom Bypass PEG4BPI6FC series adapter"},
6070 {"Silicom Bypass PEG4BPFI6FC series adapter"},
6071 {"Silicom Bypass PEG4BPFI6FCLX series adapter"},
6072 {"Silicom Bypass PEG4BPFI6FCZX series adapter"},
6073 {"Silicom Bypass PEG6BPI6 series adapter"},
6074 {"Silicom Bypass PEG2BPI6SC6 series adapter"},
6075 {"Silicom Bypass MEG2BPI6 series adapter"},
6076 {"Silicom Bypass XEG2BPI6 series adapter"},
6077 {"Silicom Bypass MEG4BPI6 series adapter"},
6078 {"Silicom Bypass PEG2BPFI5-SD series adapter"},
6079 {"Silicom Bypass PEG2BPFI5LX-SD series adapter"},
6080 {"Silicom Bypass PXEG4BPFI-SD series adapter"},
6081 {"Silicom Bypass MxEG2BPI6 series adapter"},
6082 {"Silicom Bypass MxEG2BPFI6 series adapter"},
6083 {"Silicom Bypass MxEG2BPFI6LX series adapter"},
6084 {"Silicom Bypass MxEG2BPFI6ZX series adapter"},
6085 {"Silicom Bypass MxEG4BPI6 series adapter"},
6086 {"Silicom Bypass MxEG4BPFI6 series adapter"},
6087 {"Silicom Bypass MxEG4BPFI6LX series adapter"},
6088 {"Silicom Bypass MxEG4BPFI6ZX series adapter"},
6089 {"Silicom Bypass MxEG6BPI6 series adapter"},
6090 {"Silicom Bypass MxE2G4BPi80 series adapter"},
6091 {"Silicom Bypass MxE2G4BPFi80 series adapter"},
6092 {"Silicom Bypass MxE2G4BPFi80LX series adapter"},
6093 {"Silicom Bypass MxE2G4BPFi80ZX series adapter"},
6095 {"Silicom Bypass PE210G2SPI9 series adapter"},
6097 {"Silicom Bypass MxE210G2BPI9CX4 series adapter"},
6098 {"Silicom Bypass MxE210G2BPI9SR series adapter"},
6099 {"Silicom Bypass MxE210G2BPI9LR series adapter"},
6100 {"Silicom Bypass MxE210G2BPI9T series adapter"},
6102 {"Silicom Bypass PE210G2BPI9CX4 series adapter"},
6103 {"Silicom Bypass PE210G2BPI9SR series adapter"},
6104 {"Silicom Bypass PE210G2BPI9LR series adapter"},
6105 {"Silicom Bypass PE210G2BPI9T series adapter"},
6107 {"Silicom Bypass M2EG2BPFI6 series adapter"},
6108 {"Silicom Bypass M2EG2BPFI6LX series adapter"},
6109 {"Silicom Bypass M2EG2BPFI6ZX series adapter"},
6110 {"Silicom Bypass M2EG4BPI6 series adapter"},
6111 {"Silicom Bypass M2EG4BPFI6 series adapter"},
6112 {"Silicom Bypass M2EG4BPFI6LX series adapter"},
6113 {"Silicom Bypass M2EG4BPFI6ZX series adapter"},
6114 {"Silicom Bypass M2EG6BPI6 series adapter"},
6116 {"Silicom Bypass PEG2DBI6 series adapter"},
6117 {"Silicom Bypass PEG2DBFI6 series adapter"},
6118 {"Silicom Bypass PEG2DBFI6LX series adapter"},
6119 {"Silicom Bypass PEG2DBFI6ZX series adapter"},
6121 {"Silicom Bypass PE2G4BPi80 series adapter"},
6122 {"Silicom Bypass PE2G4BPFi80 series adapter"},
6123 {"Silicom Bypass PE2G4BPFi80LX series adapter"},
6124 {"Silicom Bypass PE2G4BPFi80ZX series adapter"},
6126 {"Silicom Bypass PE2G4BPi80L series adapter"},
6127 {"Silicom Bypass MxE2G8BPi80A series adapter"},
6129 {"Silicom Bypass PE2G2BPi35 series adapter"},
6130 {"Silicom Bypass PAC1200BPi35 series adapter"},
6131 {"Silicom Bypass PE2G2BPFi35 series adapter"},
6132 {"Silicom Bypass PE2G2BPFi35LX series adapter"},
6133 {"Silicom Bypass PE2G2BPFi35ZX series adapter"},
6135 {"Silicom Bypass PE2G4BPi35 series adapter"},
6136 {"Silicom Bypass PE2G4BPi35L series adapter"},
6137 {"Silicom Bypass PE2G4BPFi35 series adapter"},
6138 {"Silicom Bypass PE2G4BPFi35LX series adapter"},
6139 {"Silicom Bypass PE2G4BPFi35ZX series adapter"},
6141 {"Silicom Bypass PE2G6BPi35 series adapter"},
6142 {"Silicom Bypass PE2G6BPi35CX series adapter"},
6144 {"Silicom Bypass PE2G2BPi80 series adapter"},
6145 {"Silicom Bypass PE2G2BPFi80 series adapter"},
6146 {"Silicom Bypass PE2G2BPFi80LX series adapter"},
6147 {"Silicom Bypass PE2G2BPFi80ZX series adapter"},
6149 {"Silicom Bypass M2E10G2BPI9CX4 series adapter"},
6150 {"Silicom Bypass M2E10G2BPI9SR series adapter"},
6151 {"Silicom Bypass M2E10G2BPI9LR series adapter"},
6152 {"Silicom Bypass M2E10G2BPI9T series adapter"},
6153 {"Silicom Bypass MxE2G8BPi80 series adapter"},
6154 {"Silicom Bypass PE210G2DBi9SR series adapter"},
6155 {"Silicom Bypass PE210G2DBi9SRRB series adapter"},
6156 {"Silicom Bypass PE210G2DBi9LR series adapter"},
6157 {"Silicom Bypass PE210G2DBi9LRRB series adapter"},
6158 {"Silicom Bypass PE310G4DBi9-SR series adapter"},
6159 {"Silicom Bypass PE310G4BPi9T series adapter"},
6160 {"Silicom Bypass PE310G4BPi9SR series adapter"},
6161 {"Silicom Bypass PE310G4BPi9LR series adapter"},
6162 {"Silicom Bypass PE210G2BPi40T series adapter"},
6166 static bpmod_info_t tx_ctl_pci_tbl[] = {
6167 {0x8086, 0x107a, SILICOM_SVID, SILICOM_PXG2BPFI_SSID, PXG2BPFI,
6169 {0x8086, 0x107a, SILICOM_SVID, SILICOM_PXG2BPFIL_SSID, PXG2BPFIL,
6171 {0x8086, 0x107a, SILICOM_SVID, SILICOM_PXG2BPFILX_SSID, PXG2BPFILX,
6173 {0x8086, 0x107a, SILICOM_SVID, SILICOM_PXG2BPFILLX_SSID, PXG2BPFILLX,
6175 {0x8086, 0x1010, SILICOM_SVID, SILICOM_PXGBPI_SSID, PXGBPI,
6177 {0x8086, 0x1079, SILICOM_SVID, SILICOM_PXGBPIG_SSID, PXGBPIG,
6179 {0x8086, 0x107a, SILICOM_SVID, SILICOM_PXG2TBFI_SSID, PXG2TBFI,
6181 {0x8086, 0x1079, SILICOM_SVID, SILICOM_PXG4BPI_SSID, PXG4BPI,
6183 {0x8086, 0x107a, SILICOM_SVID, SILICOM_PXG4BPFI_SSID, PXG4BPFI,
6185 {0x8086, 0x107a, SILICOM_SVID, SILICOM_PXG4BPFILX_SSID, PXG4BPFILX,
6187 {0x8086, 0x1079, SILICOM_SVID, SILICOM_PEG4BPI_SSID, PEG4BPI,
6189 {0x8086, 0x105e, SILICOM_SVID, SILICOM_PEG2BPI_SSID, PEG2BPI,
6191 {0x8086, 0x105e, SILICOM_SVID, SILICOM_PEG4BPIN_SSID, PEG4BPIN,
6193 {0x8086, 0x105f, SILICOM_SVID, SILICOM_PEG2BPFI_SSID, PEG2BPFI,
6195 {0x8086, 0x105f, SILICOM_SVID, SILICOM_PEG2BPFILX_SSID, PEG2BPFILX,
6197 {0x8086, 0x107a, SILICOM_SVID, SILICOM_PMCXG2BPFI_SSID, PMCXG2BPFI,
6199 {0x8086, 0x107a, NOKIA_PMCXG2BPFIN_SVID, NOKIA_PMCXG2BPFIN_SSID,
6200 PMCXG2BPFIN, "PMCX2BPFI-N"},
6201 {0x8086, INTEL_PEG4BPII_PID, 0x8086, INTEL_PEG4BPII_SSID, PEG4BPII,
6203 {0x8086, INTEL_PEG4BPIIO_PID, 0x8086, INTEL_PEG4BPIIO_SSID, PEG4BPIIO,
6205 {0x8086, INTEL_PEG4BPFII_PID, 0x8086, INTEL_PEG4BPFII_SSID, PEG4BPFII,
6207 {0x8086, 0x1079, NOKIA_PMCXG2BPFIN_SVID, NOKIA_PMCXG2BPIN_SSID,
6208 PMCXG2BPIN, "PMCX2BPI-N"},
6209 {0x8086, 0x1079, NOKIA_PMCXG2BPFIN_SVID, NOKIA_PMCXG4BPIN_SSID,
6210 PMCXG4BPIN, "PMCX4BPI-N"},
6211 {0x8086, 0x1079, SILICOM_SVID, SILICOM_PXG2BISC1_SSID, PXG2BISC1,
6213 {0x8086, 0x105f, SILICOM_SVID, SILICOM_PEG2TBFI_SSID, PEG2TBFI,
6215 {0x8086, 0x1079, SILICOM_SVID, SILICOM_PXG2TBI_SSID, PXG2TBI,
6217 {0x8086, 0x107a, SILICOM_SVID, SILICOM_PXG4BPFID_SSID, PXG4BPFID,
6219 {0x8086, 0x105f, SILICOM_SVID, SILICOM_PEG4BPFI_SSID, PEG4BPFI,
6221 {0x8086, 0x105e, SILICOM_SVID, SILICOM_PEG4BPIPT_SSID, PEG4BPIPT,
6223 {0x8086, 0x1079, SILICOM_SVID, SILICOM_PXG6BPI_SSID, PXG6BPI,
6225 {0x8086, 0x10a7, SILICOM_SVID /*PCI_ANY_ID */ ,
6226 SILICOM_PEG4BPIL_SSID /*PCI_ANY_ID */ , PEG4BPIL, "PEG4BPIL-SD"},
6227 {0x8086, 0x1079, NOKIA_PMCXG2BPFIN_SVID, NOKIA_PMCXG2BPIN2_SSID,
6228 PMCXG2BPIN2, "PMCX2BPI-N2"},
6229 {0x8086, 0x1079, NOKIA_PMCXG2BPFIN_SVID, NOKIA_PMCXG4BPIN2_SSID,
6230 PMCXG4BPIN2, "PMCX4BPI-N2"},
6231 {0x8086, 0x1079, SILICOM_SVID, SILICOM_PMCX2BPI_SSID, PMCX2BPI,
6233 {0x8086, 0x1079, SILICOM_SVID, SILICOM_PMCX4BPI_SSID, PMCX4BPI,
6235 {0x8086, 0x105f, SILICOM_SVID, SILICOM_PEG2BPFID_SSID, PEG2BPFID,
6237 {0x8086, 0x105f, SILICOM_SVID, SILICOM_PEG2BPFIDLX_SSID, PEG2BPFIDLX,
6239 {0x8086, 0x105f, SILICOM_SVID, SILICOM_MEG2BPFILN_SSID, MEG2BPFILN,
6241 {0x8086, 0x105f, SILICOM_SVID, SILICOM_MEG2BPFINX_SSID, MEG2BPFINX,
6243 {0x8086, 0x105f, SILICOM_SVID, SILICOM_PEG4BPFILX_SSID, PEG4BPFILX,
6245 {0x8086, PCI_ANY_ID, SILICOM_SVID, SILICOM_PE10G2BPISR_SSID,
6246 PE10G2BPISR, "PE10G2BPISR"},
6247 {0x8086, PCI_ANY_ID, SILICOM_SVID, SILICOM_PE10G2BPILR_SSID,
6248 PE10G2BPILR, "PE10G2BPILR"},
6249 {0x8086, 0x10a9, SILICOM_SVID, SILICOM_MHIO8AD_SSID, MHIO8AD,
6251 {0x8086, PCI_ANY_ID, SILICOM_SVID, SILICOM_PE10G2BPICX4_SSID,
6252 PE10G2BPISR, "PE10G2BPICX4"},
6253 {0x8086, 0x10a7, SILICOM_SVID /*PCI_ANY_ID */ ,
6254 SILICOM_PEG2BPI5_SSID /*PCI_ANY_ID */ , PEG2BPI5, "PEG2BPI5-SD"},
6255 {0x8086, 0x10a7, SILICOM_SVID /*PCI_ANY_ID */ ,
6256 SILICOM_PEG6BPI_SSID /*PCI_ANY_ID */ , PEG6BPI, "PEG6BPI5"},
6257 {0x8086, 0x10a9, SILICOM_SVID /*PCI_ANY_ID */ , SILICOM_PEG4BPFI5_SSID,
6258 PEG4BPFI5, "PEG4BPFI5"},
6259 {0x8086, 0x10a9, SILICOM_SVID /*PCI_ANY_ID */ ,
6260 SILICOM_PEG4BPFI5LX_SSID, PEG4BPFI5LX, "PEG4BPFI5LX"},
6261 {0x8086, 0x105f, SILICOM_SVID, SILICOM_MEG2BPFILXLN_SSID, MEG2BPFILXLN,
6263 {0x8086, 0x105e, SILICOM_SVID, SILICOM_PEG2BPIX1_SSID, PEG2BPIX1,
6265 {0x8086, 0x105f, SILICOM_SVID, SILICOM_MEG2BPFILXNX_SSID, MEG2BPFILXNX,
6267 {0x8086, PCI_ANY_ID, SILICOM_SVID, SILICOM_XE10G2BPIT_SSID, XE10G2BPIT,
6269 {0x8086, PCI_ANY_ID, SILICOM_SVID, SILICOM_XE10G2BPICX4_SSID,
6270 XE10G2BPICX4, "XE10G2BPICX4"},
6271 {0x8086, 0x10C6, SILICOM_SVID, SILICOM_XE10G2BPISR_SSID, XE10G2BPISR,
6273 {0x8086, 0x10C6, SILICOM_SVID, SILICOM_XE10G2BPILR_SSID, XE10G2BPILR,
6275 {0x8086, 0x10C6, NOKIA_XE10G2BPIXR_SVID, NOKIA_XE10G2BPIXR_SSID,
6276 XE10G2BPIXR, "XE10G2BPIXR"},
6277 {0x8086, 0x10C6, SILICOM_SVID, SILICOM_PE10GDBISR_SSID, PE10GDBISR,
6279 {0x8086, 0x10C6, SILICOM_SVID, SILICOM_PE10GDBILR_SSID, PE10GDBILR,
6281 {0x8086, 0x10a7, SILICOM_SVID /*PCI_ANY_ID */ ,
6282 SILICOM_PEG2BISC6_SSID /*PCI_ANY_ID */ , PEG2BISC6, "PEG2BI5SC6"},
6283 {0x8086, 0x10a7, SILICOM_SVID /*PCI_ANY_ID */ ,
6284 SILICOM_PEG6BPIFC_SSID /*PCI_ANY_ID */ , PEG6BPIFC, "PEG6BPI5FC"},
6286 {BROADCOM_VID, BROADCOM_PE10G2_PID, SILICOM_SVID,
6287 SILICOM_PE10G2BPTCX4_SSID, PE10G2BPTCX4, "PE10G2BPTCX4"},
6288 {BROADCOM_VID, BROADCOM_PE10G2_PID, SILICOM_SVID,
6289 SILICOM_PE10G2BPTSR_SSID, PE10G2BPTSR, "PE10G2BPTSR"},
6290 {BROADCOM_VID, BROADCOM_PE10G2_PID, SILICOM_SVID,
6291 SILICOM_PE10G2BPTLR_SSID, PE10G2BPTLR, "PE10G2BPTLR"},
6292 {BROADCOM_VID, BROADCOM_PE10G2_PID, SILICOM_SVID,
6293 SILICOM_PE10G2BPTT_SSID, PE10G2BPTT, "PE10G2BPTT"},
6295 /* {BROADCOM_VID, BROADCOM_PE10G2_PID, PCI_ANY_ID, PCI_ANY_ID, PE10G2BPTCX4, "PE10G2BPTCX4"}, */
6297 {0x8086, 0x10c9, SILICOM_SVID /*PCI_ANY_ID */ ,
6298 SILICOM_PEG4BPI6_SSID /*PCI_ANY_ID */ , PEG4BPI6, "PEG4BPI6"},
6299 {0x8086, 0x10e6, SILICOM_SVID /*PCI_ANY_ID */ ,
6300 SILICOM_PEG4BPFI6_SSID /*PCI_ANY_ID */ , PEG4BPFI6, "PEG4BPFI6"},
6301 {0x8086, 0x10e6, SILICOM_SVID /*PCI_ANY_ID */ ,
6302 SILICOM_PEG4BPFI6LX_SSID /*PCI_ANY_ID */ , PEG4BPFI6LX, "PEG4BPFI6LX"},
6303 {0x8086, 0x10e6, SILICOM_SVID /*PCI_ANY_ID */ ,
6304 SILICOM_PEG4BPFI6ZX_SSID /*PCI_ANY_ID */ , PEG4BPFI6ZX, "PEG4BPFI6ZX"},
6305 {0x8086, 0x10c9, SILICOM_SVID /*PCI_ANY_ID */ ,
6306 SILICOM_PEG2BPI6_SSID /*PCI_ANY_ID */ , PEG2BPI6, "PEG2BPI6"},
6307 {0x8086, 0x10e6, SILICOM_SVID /*PCI_ANY_ID */ ,
6308 SILICOM_PEG2BPFI6_SSID /*PCI_ANY_ID */ , PEG2BPFI6, "PEG2BPFI6"},
6309 {0x8086, 0x10e6, SILICOM_SVID /*PCI_ANY_ID */ ,
6310 SILICOM_PEG2BPFI6LX_SSID /*PCI_ANY_ID */ , PEG2BPFI6LX, "PEG2BPFI6LX"},
6311 {0x8086, 0x10e6, SILICOM_SVID /*PCI_ANY_ID */ ,
6312 SILICOM_PEG2BPFI6ZX_SSID /*PCI_ANY_ID */ , PEG2BPFI6ZX, "PEG2BPFI6ZX"},
6313 {0x8086, 0x10e7, SILICOM_SVID /*PCI_ANY_ID */ ,
6314 SILICOM_PEG2BPFI6FLXM_SSID /*PCI_ANY_ID */ , PEG2BPFI6FLXM,
6316 {0x8086, 0x10c9, SILICOM_SVID /*PCI_ANY_ID */ ,
6317 SILICOM_PEG4BPI6FC_SSID /*PCI_ANY_ID */ , PEG4BPI6FC, "PEG4BPI6FC"},
6318 {0x8086, 0x10e6, SILICOM_SVID /*PCI_ANY_ID */ ,
6319 SILICOM_PEG4BPFI6FC_SSID /*PCI_ANY_ID */ , PEG4BPFI6FC, "PEG4BPFI6FC"},
6320 {0x8086, 0x10e6, SILICOM_SVID /*PCI_ANY_ID */ ,
6321 SILICOM_PEG4BPFI6FCLX_SSID /*PCI_ANY_ID */ , PEG4BPFI6FCLX,
6323 {0x8086, 0x10e6, SILICOM_SVID /*PCI_ANY_ID */ ,
6324 SILICOM_PEG4BPFI6FCZX_SSID /*PCI_ANY_ID */ , PEG4BPFI6FCZX,
6326 {0x8086, 0x10c9, SILICOM_SVID /*PCI_ANY_ID */ ,
6327 SILICOM_PEG6BPI6_SSID /*PCI_ANY_ID */ , PEG6BPI6, "PEG6BPI6"},
6328 {0x8086, 0x10c9, SILICOM_SVID /*PCI_ANY_ID */ ,
6329 SILICOM_PEG2BPI6SC6_SSID /*PCI_ANY_ID */ , PEG2BPI6SC6,
6331 {0x8086, 0x10c9, SILICOM_SVID /*PCI_ANY_ID */ ,
6332 SILICOM_MEG2BPI6_SSID /*PCI_ANY_ID */ , MEG2BPI6, "MEG2BPI6"},
6333 {0x8086, 0x10c9, SILICOM_SVID /*PCI_ANY_ID */ ,
6334 SILICOM_XEG2BPI6_SSID /*PCI_ANY_ID */ , XEG2BPI6, "XEG2BPI6"},
6335 {0x8086, 0x10c9, SILICOM_SVID /*PCI_ANY_ID */ ,
6336 SILICOM_MEG4BPI6_SSID /*PCI_ANY_ID */ , MEG4BPI6, "MEG4BPI6"},
6338 {0x8086, 0x10a9, SILICOM_SVID /*PCI_ANY_ID */ , SILICOM_PEG2BPFI5_SSID,
6339 PEG2BPFI5, "PEG2BPFI5"},
6340 {0x8086, 0x10a9, SILICOM_SVID /*PCI_ANY_ID */ ,
6341 SILICOM_PEG2BPFI5LX_SSID, PEG2BPFI5LX, "PEG2BPFI5LX"},
6343 {0x8086, 0x105f, SILICOM_SVID, SILICOM_PXEG4BPFI_SSID, PXEG4BPFI,
6346 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6347 SILICOM_M1EG2BPI6_SSID /*PCI_ANY_ID */ , M1EG2BPI6, "MxEG2BPI6"},
6349 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6350 SILICOM_M1EG2BPFI6_SSID /*PCI_ANY_ID */ , M1EG2BPFI6, "MxEG2BPFI6"},
6351 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6352 SILICOM_M1EG2BPFI6LX_SSID /*PCI_ANY_ID */ , M1EG2BPFI6LX,
6354 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6355 SILICOM_M1EG2BPFI6ZX_SSID /*PCI_ANY_ID */ , M1EG2BPFI6ZX,
6358 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6359 SILICOM_M1EG4BPI6_SSID /*PCI_ANY_ID */ , M1EG4BPI6, "MxEG4BPI6"},
6361 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6362 SILICOM_M1EG4BPFI6_SSID /*PCI_ANY_ID */ , M1EG4BPFI6, "MxEG4BPFI6"},
6363 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6364 SILICOM_M1EG4BPFI6LX_SSID /*PCI_ANY_ID */ , M1EG4BPFI6LX,
6366 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6367 SILICOM_M1EG4BPFI6ZX_SSID /*PCI_ANY_ID */ , M1EG4BPFI6ZX,
6370 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6371 SILICOM_M1EG6BPI6_SSID /*PCI_ANY_ID */ , M1EG6BPI6, "MxEG6BPI6"},
6373 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6374 SILICOM_M1E2G4BPi80_SSID /*PCI_ANY_ID */ , M1E2G4BPi80, "MxE2G4BPi80"},
6375 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6376 SILICOM_M1E2G4BPFi80_SSID /*PCI_ANY_ID */ , M1E2G4BPFi80,
6378 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6379 SILICOM_M1E2G4BPFi80LX_SSID /*PCI_ANY_ID */ , M1E2G4BPFi80LX,
6381 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6382 SILICOM_M1E2G4BPFi80ZX_SSID /*PCI_ANY_ID */ , M1E2G4BPFi80ZX,
6385 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6386 SILICOM_M2EG2BPFI6_SSID /*PCI_ANY_ID */ , M2EG2BPFI6, "M2EG2BPFI6"},
6387 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6388 SILICOM_M2EG2BPFI6LX_SSID /*PCI_ANY_ID */ , M2EG2BPFI6LX,
6390 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6391 SILICOM_M2EG2BPFI6ZX_SSID /*PCI_ANY_ID */ , M2EG2BPFI6ZX,
6394 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6395 SILICOM_M2EG4BPI6_SSID /*PCI_ANY_ID */ , M2EG4BPI6, "M2EG4BPI6"},
6397 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6398 SILICOM_M2EG4BPFI6_SSID /*PCI_ANY_ID */ , M2EG4BPFI6, "M2EG4BPFI6"},
6399 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6400 SILICOM_M2EG4BPFI6LX_SSID /*PCI_ANY_ID */ , M2EG4BPFI6LX,
6402 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6403 SILICOM_M2EG4BPFI6ZX_SSID /*PCI_ANY_ID */ , M2EG4BPFI6ZX,
6406 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6407 SILICOM_M2EG6BPI6_SSID /*PCI_ANY_ID */ , M2EG6BPI6, "M2EG6BPI6"},
6409 {0x8086, 0x10c9, SILICOM_SVID /*PCI_ANY_ID */ ,
6410 SILICOM_PEG2DBI6_SSID /*PCI_ANY_ID */ , PEG2DBI6, "PEG2DBI6"},
6411 {0x8086, 0x10e6, SILICOM_SVID /*PCI_ANY_ID */ ,
6412 SILICOM_PEG2DBFI6_SSID /*PCI_ANY_ID */ , PEG2DBFI6, "PEG2DBFI6"},
6413 {0x8086, 0x10e6, SILICOM_SVID /*PCI_ANY_ID */ ,
6414 SILICOM_PEG2DBFI6LX_SSID /*PCI_ANY_ID */ , PEG2DBFI6LX, "PEG2DBFI6LX"},
6415 {0x8086, 0x10e6, SILICOM_SVID /*PCI_ANY_ID */ ,
6416 SILICOM_PEG2DBFI6ZX_SSID /*PCI_ANY_ID */ , PEG2DBFI6ZX, "PEG2DBFI6ZX"},
6418 {0x8086, 0x10F9, SILICOM_SVID /*PCI_ANY_ID */ ,
6419 SILICOM_PE210G2DBi9SR_SSID, PE210G2DBi9SR, "PE210G2DBi9SR"},
6420 {0x8086, 0x10F9, SILICOM_SVID /*PCI_ANY_ID */ ,
6421 SILICOM_PE210G2DBi9LR_SSID, PE210G2DBi9LR, "PE210G2DBi9LR"},
6422 {0x8086, 0x10F9, SILICOM_SVID /*PCI_ANY_ID */ ,
6423 SILICOM_PE310G4DBi940SR_SSID, PE310G4DBi940SR, "PE310G4DBi9SR"},
6425 {0x8086, 0x10Fb, SILICOM_SVID /*PCI_ANY_ID */ ,
6426 SILICOM_PE310G4BPi9T_SSID, PE310G4BPi9T, "PE310G4BPi9T"},
6427 {0x8086, 0x10Fb, SILICOM_SVID /*PCI_ANY_ID */ ,
6428 SILICOM_PE310G4BPi9SR_SSID, PE310G4BPi9SR, "PE310G4BPi9SR"},
6429 {0x8086, 0x10Fb, SILICOM_SVID /*PCI_ANY_ID */ ,
6430 SILICOM_PE310G4BPi9LR_SSID, PE310G4BPi9LR, "PE310G4BPi9LR"},
6432 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6433 SILICOM_PE2G4BPi80_SSID /*PCI_ANY_ID */ , PE2G4BPi80, "PE2G4BPi80"},
6434 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6435 SILICOM_PE2G4BPFi80_SSID /*PCI_ANY_ID */ , PE2G4BPFi80, "PE2G4BPFi80"},
6436 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6437 SILICOM_PE2G4BPFi80LX_SSID /*PCI_ANY_ID */ , PE2G4BPFi80LX,
6439 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6440 SILICOM_PE2G4BPFi80ZX_SSID /*PCI_ANY_ID */ , PE2G4BPFi80ZX,
6443 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6444 SILICOM_PE2G4BPi80L_SSID /*PCI_ANY_ID */ , PE2G4BPi80L, "PE2G4BPi80L"},
6446 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6447 SILICOM_M6E2G8BPi80A_SSID /*PCI_ANY_ID */ , M6E2G8BPi80A,
6450 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6451 SILICOM_PE2G2BPi35_SSID /*PCI_ANY_ID */ , PE2G2BPi35, "PE2G2BPi35"},
6452 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6453 SILICOM_PAC1200BPi35_SSID /*PCI_ANY_ID */ , PAC1200BPi35,
6456 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6457 SILICOM_PE2G2BPFi35_SSID /*PCI_ANY_ID */ , PE2G2BPFi35, "PE2G2BPFi35"},
6458 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6459 SILICOM_PE2G2BPFi35LX_SSID /*PCI_ANY_ID */ , PE2G2BPFi35LX,
6461 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6462 SILICOM_PE2G2BPFi35ZX_SSID /*PCI_ANY_ID */ , PE2G2BPFi35ZX,
6465 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6466 SILICOM_PE2G4BPi35_SSID /*PCI_ANY_ID */ , PE2G4BPi35, "PE2G4BPi35"},
6468 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6469 SILICOM_PE2G4BPi35L_SSID /*PCI_ANY_ID */ , PE2G4BPi35L, "PE2G4BPi35L"},
6471 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6472 SILICOM_PE2G4BPFi35_SSID /*PCI_ANY_ID */ , PE2G4BPFi35, "PE2G4BPFi35"},
6473 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6474 SILICOM_PE2G4BPFi35LX_SSID /*PCI_ANY_ID */ , PE2G4BPFi35LX,
6476 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6477 SILICOM_PE2G4BPFi35ZX_SSID /*PCI_ANY_ID */ , PE2G4BPFi35ZX,
6480 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6481 SILICOM_PE2G6BPi35_SSID /*PCI_ANY_ID */ , PE2G6BPi35, "PE2G6BPi35"},
6484 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xaa0, PE2G6BPi35CX,
6486 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xaa1, PE2G6BPi35CX,
6488 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xaa2, PE2G6BPi35CX,
6490 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xaa3, PE2G6BPi35CX,
6492 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xaa4, PE2G6BPi35CX,
6494 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xaa5, PE2G6BPi35CX,
6496 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xaa6, PE2G6BPi35CX,
6498 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xaa7, PE2G6BPi35CX,
6500 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xaa8, PE2G6BPi35CX,
6502 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xaa9, PE2G6BPi35CX,
6504 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xaaa, PE2G6BPi35CX,
6506 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xaab, PE2G6BPi35CX,
6508 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xaac, PE2G6BPi35CX,
6510 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xaad, PE2G6BPi35CX,
6512 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xaae, PE2G6BPi35CX,
6514 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xaaf, PE2G6BPi35CX,
6516 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xab0, PE2G6BPi35CX,
6518 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xab1, PE2G6BPi35CX,
6520 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xab2, PE2G6BPi35CX,
6522 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xab3, PE2G6BPi35CX,
6524 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xab4, PE2G6BPi35CX,
6526 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xab5, PE2G6BPi35CX,
6528 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xab6, PE2G6BPi35CX,
6530 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xab7, PE2G6BPi35CX,
6532 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xab8, PE2G6BPi35CX,
6534 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xab9, PE2G6BPi35CX,
6536 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xaba, PE2G6BPi35CX,
6538 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xabb, PE2G6BPi35CX,
6540 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xabc, PE2G6BPi35CX,
6542 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xabd, PE2G6BPi35CX,
6544 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xabe, PE2G6BPi35CX,
6546 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ , 0xabf, PE2G6BPi35CX,
6549 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6550 SILICOM_PE2G2BPi80_SSID /*PCI_ANY_ID */ , PE2G2BPi80, "PE2G2BPi80"},
6551 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6552 SILICOM_PE2G2BPFi80_SSID /*PCI_ANY_ID */ , PE2G2BPFi80, "PE2G2BPFi80"},
6553 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6554 SILICOM_PE2G2BPFi80LX_SSID /*PCI_ANY_ID */ , PE2G2BPFi80LX,
6556 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6557 SILICOM_PE2G2BPFi80ZX_SSID /*PCI_ANY_ID */ , PE2G2BPFi80ZX,
6560 {0x8086, 0x10c9, SILICOM_SVID /*PCI_ANY_ID */ ,
6561 SILICOM_MEG2BPI6_SSID /*PCI_ANY_ID */ , MEG2BPI6, "MEG2BPI6"},
6562 {0x8086, 0x10c9, SILICOM_SVID /*PCI_ANY_ID */ ,
6563 SILICOM_XEG2BPI6_SSID /*PCI_ANY_ID */ , XEG2BPI6, "XEG2BPI6"},
6566 {0x8086, 0x10fb, 0x8086, INTEL_PE210G2SPI9_SSID, PE210G2SPI9,
6569 {0x8086, 0x10fb, SILICOM_SVID /*PCI_ANY_ID */ ,
6570 SILICOM_M1E10G2BPI9CX4_SSID /*PCI_ANY_ID */ , M1E10G2BPI9CX4,
6572 {0x8086, 0x10fb, SILICOM_SVID /*PCI_ANY_ID */ ,
6573 SILICOM_M1E10G2BPI9SR_SSID /*PCI_ANY_ID */ , M1E10G2BPI9SR,
6575 {0x8086, 0x10fb, SILICOM_SVID /*PCI_ANY_ID */ ,
6576 SILICOM_M1E10G2BPI9LR_SSID /*PCI_ANY_ID */ , M1E10G2BPI9LR,
6578 {0x8086, 0x10fb, SILICOM_SVID /*PCI_ANY_ID */ ,
6579 SILICOM_M1E10G2BPI9T_SSID /*PCI_ANY_ID */ , M1E10G2BPI9T,
6582 {0x8086, 0x10fb, SILICOM_SVID /*PCI_ANY_ID */ ,
6583 SILICOM_M2E10G2BPI9CX4_SSID /*PCI_ANY_ID */ , M2E10G2BPI9CX4,
6585 {0x8086, 0x10fb, SILICOM_SVID /*PCI_ANY_ID */ ,
6586 SILICOM_M2E10G2BPI9SR_SSID /*PCI_ANY_ID */ , M2E10G2BPI9SR,
6588 {0x8086, 0x10fb, SILICOM_SVID /*PCI_ANY_ID */ ,
6589 SILICOM_M2E10G2BPI9LR_SSID /*PCI_ANY_ID */ , M2E10G2BPI9LR,
6591 {0x8086, 0x10fb, SILICOM_SVID /*PCI_ANY_ID */ ,
6592 SILICOM_M2E10G2BPI9T_SSID /*PCI_ANY_ID */ , M2E10G2BPI9T,
6595 {0x8086, 0x10fb, SILICOM_SVID, SILICOM_PE210G2BPI9CX4_SSID,
6596 PE210G2BPI9CX4, "PE210G2BPI9CX4"},
6597 {0x8086, 0x10fb, SILICOM_SVID, SILICOM_PE210G2BPI9SR_SSID,
6598 PE210G2BPI9SR, "PE210G2BPI9SR"},
6599 {0x8086, 0x10fb, SILICOM_SVID, SILICOM_PE210G2BPI9LR_SSID,
6600 PE210G2BPI9LR, "PE210G2BPI9LR"},
6601 {0x8086, 0x10fb, SILICOM_SVID, SILICOM_PE210G2BPI9T_SSID, PE210G2BPI9T,
6605 {0x1374, 0x2c, SILICOM_SVID, SILICOM_PXG4BPI_SSID, PXG4BPI,
6608 {0x1374, 0x2d, SILICOM_SVID, SILICOM_PXG4BPFI_SSID, PXG4BPFI,
6611 {0x1374, 0x3f, SILICOM_SVID, SILICOM_PXG2TBI_SSID, PXG2TBI,
6614 {0x1374, 0x3d, SILICOM_SVID, SILICOM_PXG2BISC1_SSID, PXG2BISC1,
6617 {0x1374, 0x40, SILICOM_SVID, SILICOM_PEG4BPFI_SSID, PEG4BPFI,
6621 {0x1374, 0x28, SILICOM_SVID, 0x28, PXGBPI, "PXG2BPI-SD"},
6624 {0x8086, PCI_ANY_ID, SILICOM_SVID /*PCI_ANY_ID */ ,
6625 SILICOM_M6E2G8BPi80_SSID /*PCI_ANY_ID */ , M6E2G8BPi80, "MxE2G8BPi80"},
6626 {0x8086, 0x1528, SILICOM_SVID /*PCI_ANY_ID */ ,
6627 SILICOM_PE210G2BPi40_SSID /*PCI_ANY_ID */ , PE210G2BPi40,
6630 /* required last entry */
6634 static void find_fw(bpctl_dev_t *dev)
6636 unsigned long mmio_start, mmio_len;
6637 struct pci_dev *pdev1 = dev->pdev;
6639 if ((OLD_IF_SERIES(dev->subdevice)) ||
6640 (INTEL_IF_SERIES(dev->subdevice)))
6641 dev->bp_fw_ver = 0xff;
6643 dev->bp_fw_ver = bypass_fw_ver(dev);
6645 if (dev->bp_10gb == 1 && dev->bp_fw_ver == 0xff) {
6648 iounmap((void *)dev->mem_map);
6649 mmio_start = pci_resource_start(pdev1, 0);
6650 mmio_len = pci_resource_len(pdev1, 0);
6652 dev->mem_map = (unsigned long)
6653 ioremap(mmio_start, mmio_len);
6655 dev->bp_fw_ver = bypass_fw_ver(dev);
6656 if (dev-> bp_fw_ver == 0xa8)
6660 /* dev->bp_fw_ver=0xa8; */
6661 printk("firmware version: 0x%x\n", dev->bp_fw_ver);
6664 static int init_one(bpctl_dev_t *dev, bpmod_info_t *info, struct pci_dev *pdev1)
6666 unsigned long mmio_start, mmio_len;
6669 mmio_start = pci_resource_start(pdev1, 0);
6670 mmio_len = pci_resource_len(pdev1, 0);
6672 dev->desc = dev_desc[info->index].name;
6673 dev->name = info->bp_name;
6674 dev->device = info->device;
6675 dev->vendor = info->vendor;
6676 dev->subdevice = info->subdevice;
6677 dev->subvendor = info->subvendor;
6678 dev->func = PCI_FUNC(pdev1->devfn);
6679 dev->slot = PCI_SLOT(pdev1->devfn);
6680 dev->bus = pdev1->bus->number;
6681 dev->mem_map = (unsigned long)ioremap(mmio_start, mmio_len);
6683 spin_lock_init(&dev->bypass_wr_lock);
6685 if (BP10G9_IF_SERIES(dev->subdevice))
6687 if (BP10G_IF_SERIES(dev->subdevice))
6689 if (PEG540_IF_SERIES(dev->subdevice))
6691 if (PEGF5_IF_SERIES(dev->subdevice))
6693 if (PEG80_IF_SERIES(dev->subdevice))
6695 if (PEGF80_IF_SERIES(dev->subdevice))
6697 if ((dev->subdevice & 0xa00) == 0xa00)
6699 if (BP10GB_IF_SERIES(dev->subdevice)) {
6700 if (dev->ifindex == 0) {
6701 unregister_chrdev(major_num, DEVICE_NAME);
6702 printk("Please load network driver for %s adapter!\n",
6707 if (dev->ndev && !(dev->ndev->flags & IFF_UP)) {
6708 unregister_chrdev(major_num, DEVICE_NAME);
6709 printk("Please bring up network interfaces for %s adapter!\n",
6716 if (!dev->bp_10g9) {
6717 if (is_bypass_fn(dev)) {
6718 printk(KERN_INFO "%s found, ",
6722 dev->wdt_status = WDT_STATUS_UNKNOWN;
6723 dev->reset_time = 0;
6724 atomic_set(&dev->wdt_busy, 0);
6725 dev->bp_status_un = 1;
6727 bypass_caps_init(dev);
6729 init_bypass_wd_auto(dev);
6730 init_bypass_tpl_auto(dev);
6731 if (NOKIA_SERIES(dev->subdevice))
6735 if ((dev->bp_tx_data = kzalloc(BPTEST_DATA_LEN, GFP_KERNEL))) {
6736 memset(dev->bp_tx_data, 0xff, 6);
6737 memset(dev->bp_tx_data + 6, 0x0, 1);
6738 memset(dev->bp_tx_data + 7, 0xaa, 5);
6739 *(__be16 *)(dev->bp_tx_data + 12) = htons(ETH_P_BPTEST);
6741 printk("bp_ctl: Memory allocation error!\n");
6747 * Initialize the module - Register the character device
6750 static int __init bypass_init_module(void)
6752 int ret_val, idx, idx_dev = 0;
6753 struct pci_dev *pdev1 = NULL;
6756 printk(BP_MOD_DESCR " v" BP_MOD_VER "\n");
6757 ret_val = register_chrdev(major_num, DEVICE_NAME, &Fops);
6759 printk("%s failed with %d\n", DEVICE_NAME, ret_val);
6762 major_num = ret_val; /* dynamic */
6763 for (idx = 0; tx_ctl_pci_tbl[idx].vendor; idx++) {
6764 while ((pdev1 = pci_get_subsys(tx_ctl_pci_tbl[idx].vendor,
6765 tx_ctl_pci_tbl[idx].device,
6766 tx_ctl_pci_tbl[idx].subvendor,
6767 tx_ctl_pci_tbl[idx].subdevice,
6774 printk("No such device\n");
6775 unregister_chrdev(major_num, DEVICE_NAME);
6779 bpctl_dev_arr = kmalloc((device_num) * sizeof(bpctl_dev_t), GFP_KERNEL);
6781 if (!bpctl_dev_arr) {
6782 printk("Allocation error\n");
6783 unregister_chrdev(major_num, DEVICE_NAME);
6786 memset(bpctl_dev_arr, 0, ((device_num) * sizeof(bpctl_dev_t)));
6789 dev = bpctl_dev_arr;
6790 for (idx = 0; tx_ctl_pci_tbl[idx].vendor; idx++) {
6791 while ((pdev1 = pci_get_subsys(tx_ctl_pci_tbl[idx].vendor,
6792 tx_ctl_pci_tbl[idx].device,
6793 tx_ctl_pci_tbl[idx].subvendor,
6794 tx_ctl_pci_tbl[idx].subdevice,
6796 if (init_one(dev, &tx_ctl_pci_tbl[idx], pdev1) < 0)
6803 sema_init(&bpctl_sema, 1);
6804 spin_lock_init(&bpvm_lock);
6807 bpctl_dev_t *pbpctl_dev_c = NULL;
6808 for (idx_dev = 0, dev = bpctl_dev_arr;
6809 idx_dev < device_num && dev->pdev;
6812 pbpctl_dev_c = get_status_port_fn(dev);
6813 if (is_bypass_fn(dev)) {
6814 printk(KERN_INFO "%s found, ",
6816 dev->bp_fw_ver = bypass_fw_ver(dev);
6817 printk("firmware version: 0x%x\n",
6820 dev->wdt_status = WDT_STATUS_UNKNOWN;
6821 dev->reset_time = 0;
6822 atomic_set(&dev->wdt_busy, 0);
6823 dev->bp_status_un = 1;
6825 bypass_caps_init(dev);
6827 init_bypass_wd_auto(dev);
6828 init_bypass_tpl_auto(dev);
6835 register_netdevice_notifier(&bp_notifier_block);
6836 #ifdef BP_PROC_SUPPORT
6839 /* unsigned long flags; */
6840 /* rcu_read_lock(); */
6842 for (i = 0; i < device_num; i++) {
6843 if (bpctl_dev_arr[i].ifindex) {
6844 /* spin_lock_irqsave(&bpvm_lock, flags); */
6845 bypass_proc_remove_dev_sd(&bpctl_dev_arr[i]);
6846 bypass_proc_create_dev_sd(&bpctl_dev_arr[i]);
6847 /* spin_unlock_irqrestore(&bpvm_lock, flags); */
6851 /* rcu_read_unlock(); */
6859 * Cleanup - unregister the appropriate file from /proc
6861 static void __exit bypass_cleanup_module(void)
6864 unregister_netdevice_notifier(&bp_notifier_block);
6866 for (i = 0; i < device_num; i++) {
6867 /* unsigned long flags; */
6868 #ifdef BP_PROC_SUPPORT
6869 /* spin_lock_irqsave(&bpvm_lock, flags);
6871 bypass_proc_remove_dev_sd(&bpctl_dev_arr[i]);
6872 /* spin_unlock_irqrestore(&bpvm_lock, flags);
6873 rcu_read_unlock(); */
6875 remove_bypass_wd_auto(&bpctl_dev_arr[i]);
6876 bpctl_dev_arr[i].reset_time = 0;
6878 remove_bypass_tpl_auto(&bpctl_dev_arr[i]);
6881 /* unmap all devices */
6882 for (i = 0; i < device_num; i++) {
6884 if (bpctl_dev_arr[i].bp_tx_data)
6885 kfree(bpctl_dev_arr[i].bp_tx_data);
6887 iounmap((void *)(bpctl_dev_arr[i].mem_map));
6890 /* free all devices space */
6892 kfree(bpctl_dev_arr);
6895 * Unregister the device
6897 unregister_chrdev(major_num, DEVICE_NAME);
6900 module_init(bypass_init_module);
6901 module_exit(bypass_cleanup_module);
6903 int is_bypass_sd(int ifindex)
6905 return is_bypass(get_dev_idx_p(ifindex));
6908 int set_bypass_sd(int ifindex, int bypass_mode)
6911 return set_bypass_fn(get_dev_idx_p(ifindex), bypass_mode);
6914 int get_bypass_sd(int ifindex)
6917 return get_bypass_fn(get_dev_idx_p(ifindex));
6920 int get_bypass_change_sd(int ifindex)
6923 return get_bypass_change_fn(get_dev_idx_p(ifindex));
6926 int set_dis_bypass_sd(int ifindex, int dis_param)
6928 return set_dis_bypass_fn(get_dev_idx_p(ifindex), dis_param);
6931 int get_dis_bypass_sd(int ifindex)
6934 return get_dis_bypass_fn(get_dev_idx_p(ifindex));
6937 int set_bypass_pwoff_sd(int ifindex, int bypass_mode)
6939 return set_bypass_pwoff_fn(get_dev_idx_p(ifindex), bypass_mode);
6943 int get_bypass_pwoff_sd(int ifindex)
6945 return get_bypass_pwoff_fn(get_dev_idx_p(ifindex));
6949 int set_bypass_pwup_sd(int ifindex, int bypass_mode)
6951 return set_bypass_pwup_fn(get_dev_idx_p(ifindex), bypass_mode);
6955 int get_bypass_pwup_sd(int ifindex)
6957 return get_bypass_pwup_fn(get_dev_idx_p(ifindex));
6961 int set_bypass_wd_sd(int if_index, int ms_timeout, int *ms_timeout_set)
6963 if ((is_bypass(get_dev_idx_p(if_index))) <= 0)
6965 *ms_timeout_set = set_bypass_wd_fn(get_dev_idx_p(if_index), ms_timeout);
6969 int get_bypass_wd_sd(int ifindex, int *timeout)
6971 return get_bypass_wd_fn(get_dev_idx_p(ifindex), timeout);
6975 int get_wd_expire_time_sd(int ifindex, int *time_left)
6977 return get_wd_expire_time_fn(get_dev_idx_p(ifindex), time_left);
6980 int reset_bypass_wd_timer_sd(int ifindex)
6982 return reset_bypass_wd_timer_fn(get_dev_idx_p(ifindex));
6986 int get_wd_set_caps_sd(int ifindex)
6988 return get_wd_set_caps_fn(get_dev_idx_p(ifindex));
6992 int set_std_nic_sd(int ifindex, int nic_mode)
6994 return set_std_nic_fn(get_dev_idx_p(ifindex), nic_mode);
6998 int get_std_nic_sd(int ifindex)
7000 return get_std_nic_fn(get_dev_idx_p(ifindex));
7004 int set_tap_sd(int ifindex, int tap_mode)
7006 return set_tap_fn(get_dev_idx_p(ifindex), tap_mode);
7010 int get_tap_sd(int ifindex)
7012 return get_tap_fn(get_dev_idx_p(ifindex));
7016 int set_tap_pwup_sd(int ifindex, int tap_mode)
7018 return set_tap_pwup_fn(get_dev_idx_p(ifindex), tap_mode);
7022 int get_tap_pwup_sd(int ifindex)
7024 return get_tap_pwup_fn(get_dev_idx_p(ifindex));
7028 int get_tap_change_sd(int ifindex)
7030 return get_tap_change_fn(get_dev_idx_p(ifindex));
7034 int set_dis_tap_sd(int ifindex, int dis_param)
7036 return set_dis_tap_fn(get_dev_idx_p(ifindex), dis_param);
7040 int get_dis_tap_sd(int ifindex)
7042 return get_dis_tap_fn(get_dev_idx_p(ifindex));
7046 int set_bp_disc_sd(int ifindex, int disc_mode)
7048 return set_disc_fn(get_dev_idx_p(ifindex), disc_mode);
7052 int get_bp_disc_sd(int ifindex)
7054 return get_disc_fn(get_dev_idx_p(ifindex));
7058 int set_bp_disc_pwup_sd(int ifindex, int disc_mode)
7060 return set_disc_pwup_fn(get_dev_idx_p(ifindex), disc_mode);
7064 int get_bp_disc_pwup_sd(int ifindex)
7066 return get_disc_pwup_fn(get_dev_idx_p(ifindex));
7070 int get_bp_disc_change_sd(int ifindex)
7072 return get_disc_change_fn(get_dev_idx_p(ifindex));
7076 int set_bp_dis_disc_sd(int ifindex, int dis_param)
7078 return set_dis_disc_fn(get_dev_idx_p(ifindex), dis_param);
7082 int get_bp_dis_disc_sd(int ifindex)
7084 return get_dis_disc_fn(get_dev_idx_p(ifindex));
7088 int get_wd_exp_mode_sd(int ifindex)
7090 return get_wd_exp_mode_fn(get_dev_idx_p(ifindex));
7093 int set_wd_exp_mode_sd(int ifindex, int param)
7095 return set_wd_exp_mode_fn(get_dev_idx_p(ifindex), param);
7099 int reset_cont_sd(int ifindex)
7101 return reset_cont_fn(get_dev_idx_p(ifindex));
7105 int set_tx_sd(int ifindex, int tx_state)
7107 return set_tx_fn(get_dev_idx_p(ifindex), tx_state);
7111 int set_tpl_sd(int ifindex, int tpl_state)
7113 return set_tpl_fn(get_dev_idx_p(ifindex), tpl_state);
7117 int set_bp_hw_reset_sd(int ifindex, int status)
7119 return set_bp_hw_reset_fn(get_dev_idx_p(ifindex), status);
7123 int set_wd_autoreset_sd(int ifindex, int param)
7125 return set_wd_autoreset_fn(get_dev_idx_p(ifindex), param);
7129 int get_wd_autoreset_sd(int ifindex)
7131 return get_wd_autoreset_fn(get_dev_idx_p(ifindex));
7135 int get_bypass_caps_sd(int ifindex)
7137 return get_bypass_caps_fn(get_dev_idx_p(ifindex));
7140 int get_bypass_slave_sd(int ifindex)
7142 bpctl_dev_t *pbpctl_dev_out;
7143 int ret = get_bypass_slave_fn(get_dev_idx_p(ifindex), &pbpctl_dev_out);
7145 return pbpctl_dev_out->ifindex;
7150 int get_tx_sd(int ifindex)
7152 return get_tx_fn(get_dev_idx_p(ifindex));
7156 int get_tpl_sd(int ifindex)
7158 return get_tpl_fn(get_dev_idx_p(ifindex));
7162 int get_bp_hw_reset_sd(int ifindex)
7164 return get_bp_hw_reset_fn(get_dev_idx_p(ifindex));
7168 int get_bypass_info_sd(int ifindex, struct bp_info *bp_info)
7170 return get_bypass_info_fn(get_dev_idx_p(ifindex), bp_info->prod_name, &bp_info->fw_ver);
7173 int bp_if_scan_sd(void)
7179 EXPORT_SYMBOL_NOVERS(is_bypass_sd);
7180 EXPORT_SYMBOL_NOVERS(get_bypass_slave_sd);
7181 EXPORT_SYMBOL_NOVERS(get_bypass_caps_sd);
7182 EXPORT_SYMBOL_NOVERS(get_wd_set_caps_sd);
7183 EXPORT_SYMBOL_NOVERS(set_bypass_sd);
7184 EXPORT_SYMBOL_NOVERS(get_bypass_sd);
7185 EXPORT_SYMBOL_NOVERS(get_bypass_change_sd);
7186 EXPORT_SYMBOL_NOVERS(set_dis_bypass_sd);
7187 EXPORT_SYMBOL_NOVERS(get_dis_bypass_sd);
7188 EXPORT_SYMBOL_NOVERS(set_bypass_pwoff_sd);
7189 EXPORT_SYMBOL_NOVERS(get_bypass_pwoff_sd);
7190 EXPORT_SYMBOL_NOVERS(set_bypass_pwup_sd);
7191 EXPORT_SYMBOL_NOVERS(get_bypass_pwup_sd);
7192 EXPORT_SYMBOL_NOVERS(set_bypass_wd_sd);
7193 EXPORT_SYMBOL_NOVERS(get_bypass_wd_sd);
7194 EXPORT_SYMBOL_NOVERS(get_wd_expire_time_sd);
7195 EXPORT_SYMBOL_NOVERS(reset_bypass_wd_timer_sd);
7196 EXPORT_SYMBOL_NOVERS(set_std_nic_sd);
7197 EXPORT_SYMBOL_NOVERS(get_std_nic_sd);
7198 EXPORT_SYMBOL_NOVERS(set_tx_sd);
7199 EXPORT_SYMBOL_NOVERS(get_tx_sd);
7200 EXPORT_SYMBOL_NOVERS(set_tpl_sd);
7201 EXPORT_SYMBOL_NOVERS(get_tpl_sd);
7202 EXPORT_SYMBOL_NOVERS(set_bp_hw_reset_sd);
7203 EXPORT_SYMBOL_NOVERS(get_bp_hw_reset_sd);
7204 EXPORT_SYMBOL_NOVERS(set_tap_sd);
7205 EXPORT_SYMBOL_NOVERS(get_tap_sd);
7206 EXPORT_SYMBOL_NOVERS(get_tap_change_sd);
7207 EXPORT_SYMBOL_NOVERS(set_dis_tap_sd);
7208 EXPORT_SYMBOL_NOVERS(get_dis_tap_sd);
7209 EXPORT_SYMBOL_NOVERS(set_tap_pwup_sd);
7210 EXPORT_SYMBOL_NOVERS(get_tap_pwup_sd);
7211 EXPORT_SYMBOL_NOVERS(set_wd_exp_mode_sd);
7212 EXPORT_SYMBOL_NOVERS(get_wd_exp_mode_sd);
7213 EXPORT_SYMBOL_NOVERS(set_wd_autoreset_sd);
7214 EXPORT_SYMBOL_NOVERS(get_wd_autoreset_sd);
7215 EXPORT_SYMBOL_NOVERS(set_bp_disc_sd);
7216 EXPORT_SYMBOL_NOVERS(get_bp_disc_sd);
7217 EXPORT_SYMBOL_NOVERS(get_bp_disc_change_sd);
7218 EXPORT_SYMBOL_NOVERS(set_bp_dis_disc_sd);
7219 EXPORT_SYMBOL_NOVERS(get_bp_dis_disc_sd);
7220 EXPORT_SYMBOL_NOVERS(set_bp_disc_pwup_sd);
7221 EXPORT_SYMBOL_NOVERS(get_bp_disc_pwup_sd);
7222 EXPORT_SYMBOL_NOVERS(get_bypass_info_sd);
7223 EXPORT_SYMBOL_NOVERS(bp_if_scan_sd);
7225 #define BP_PROC_DIR "bypass"
7227 static struct proc_dir_entry *bp_procfs_dir;
7229 int bp_proc_create(void)
7231 bp_procfs_dir = proc_mkdir(BP_PROC_DIR, init_net.proc_net);
7232 if (bp_procfs_dir == (struct proc_dir_entry *)0) {
7234 "Could not create procfs nicinfo directory %s\n",
7241 static int procfs_add(char *proc_name, const struct file_operations *fops,
7244 struct bypass_pfs_sd *pfs = &dev->bypass_pfs_set;
7245 if (!proc_create_data(proc_name, 0644, pfs->bypass_entry, fops, dev))
7250 #define RO_FOPS(name) \
7251 static int name##_open(struct inode *inode, struct file *file) \
7253 return single_open(file, show_##name, PDE_DATA(inode));\
7255 static const struct file_operations name##_ops = { \
7256 .open = name##_open, \
7258 .llseek = seq_lseek, \
7259 .release = single_release, \
7262 #define RW_FOPS(name) \
7263 static int name##_open(struct inode *inode, struct file *file) \
7265 return single_open(file, show_##name, PDE_DATA(inode));\
7267 static const struct file_operations name##_ops = { \
7268 .open = name##_open, \
7270 .write = name##_write, \
7271 .llseek = seq_lseek, \
7272 .release = single_release, \
7275 static int show_bypass_info(struct seq_file *m, void *v)
7277 bpctl_dev_t *dev = m->private;
7279 seq_printf(m, "Name\t\t\t%s\n", dev->name);
7280 seq_printf(m, "Firmware version\t0x%x\n", dev->bp_fw_ver);
7283 RO_FOPS(bypass_info)
7285 static int show_bypass_slave(struct seq_file *m, void *v)
7287 bpctl_dev_t *dev = m->private;
7288 bpctl_dev_t *slave = get_status_port_fn(dev);
7292 seq_printf(m, "fail\n");
7293 else if (slave->ndev)
7294 seq_printf(m, "%s\n", slave->ndev->name);
7297 RO_FOPS(bypass_slave)
7299 static int show_bypass_caps(struct seq_file *m, void *v)
7301 bpctl_dev_t *dev = m->private;
7302 int ret = get_bypass_caps_fn(dev);
7303 if (ret == BP_NOT_CAP)
7304 seq_printf(m, "-1\n");
7306 seq_printf(m, "0x%x\n", ret);
7309 RO_FOPS(bypass_caps)
7311 static int show_wd_set_caps(struct seq_file *m, void *v)
7313 bpctl_dev_t *dev = m->private;
7314 int ret = get_wd_set_caps_fn(dev);
7315 if (ret == BP_NOT_CAP)
7316 seq_printf(m, "-1\n");
7318 seq_printf(m, "0x%x\n", ret);
7321 RO_FOPS(wd_set_caps)
7323 static int user_on_off(const void __user *buffer, size_t count)
7329 if (count > (sizeof(kbuf) - 1))
7332 if (copy_from_user(&kbuf, buffer, count))
7336 length = strlen(kbuf);
7337 if (kbuf[length - 1] == '\n')
7338 kbuf[--length] = '\0';
7340 if (strcmp(kbuf, "on") == 0)
7342 if (strcmp(kbuf, "off") == 0)
7347 static ssize_t bypass_write(struct file *file, const char __user *buffer,
7348 size_t count, loff_t *pos)
7350 int bypass_param = user_on_off(buffer, count);
7351 if (bypass_param < 0)
7354 set_bypass_fn(PDE_DATA(file_inode(file)), bypass_param);
7357 static int show_bypass(struct seq_file *m, void *v)
7359 bpctl_dev_t *dev = m->private;
7360 int ret = get_bypass_fn(dev);
7361 if (ret == BP_NOT_CAP)
7362 seq_printf(m, "fail\n");
7364 seq_printf(m, "on\n");
7366 seq_printf(m, "off\n");
7371 static ssize_t tap_write(struct file *file, const char __user *buffer,
7372 size_t count, loff_t *pos)
7374 int tap_param = user_on_off(buffer, count);
7378 set_tap_fn(PDE_DATA(file_inode(file)), tap_param);
7381 static int show_tap(struct seq_file *m, void *v)
7383 bpctl_dev_t *dev = m->private;
7384 int ret = get_tap_fn(dev);
7385 if (ret == BP_NOT_CAP)
7386 seq_printf(m, "fail\n");
7388 seq_printf(m, "on\n");
7390 seq_printf(m, "off\n");
7395 static ssize_t disc_write(struct file *file, const char __user *buffer,
7396 size_t count, loff_t *pos)
7398 int tap_param = user_on_off(buffer, count);
7402 set_disc_fn(PDE_DATA(file_inode(file)), tap_param);
7405 static int show_disc(struct seq_file *m, void *v)
7407 bpctl_dev_t *dev = m->private;
7408 int ret = get_disc_fn(dev);
7409 if (ret == BP_NOT_CAP)
7410 seq_printf(m, "fail\n");
7412 seq_printf(m, "on\n");
7414 seq_printf(m, "off\n");
7419 static int show_bypass_change(struct seq_file *m, void *v)
7421 bpctl_dev_t *dev = m->private;
7422 int ret = get_bypass_change_fn(dev);
7424 seq_printf(m, "on\n");
7426 seq_printf(m, "off\n");
7428 seq_printf(m, "fail\n");
7431 RO_FOPS(bypass_change)
7433 static int show_tap_change(struct seq_file *m, void *v)
7435 bpctl_dev_t *dev = m->private;
7436 int ret = get_tap_change_fn(dev);
7438 seq_printf(m, "on\n");
7440 seq_printf(m, "off\n");
7442 seq_printf(m, "fail\n");
7447 static int show_disc_change(struct seq_file *m, void *v)
7449 bpctl_dev_t *dev = m->private;
7450 int ret = get_disc_change_fn(dev);
7452 seq_printf(m, "on\n");
7454 seq_printf(m, "off\n");
7456 seq_printf(m, "fail\n");
7459 RO_FOPS(disc_change)
7461 static ssize_t bypass_wd_write(struct file *file, const char __user *buffer,
7462 size_t count, loff_t *pos)
7464 bpctl_dev_t *dev = PDE_DATA(file_inode(file));
7466 int ret = kstrtoint_from_user(buffer, count, 10, &timeout);
7469 set_bypass_wd_fn(dev, timeout);
7472 static int show_bypass_wd(struct seq_file *m, void *v)
7474 bpctl_dev_t *dev = m->private;
7475 int ret = 0, timeout = 0;
7477 ret = get_bypass_wd_fn(dev, &timeout);
7478 if (ret == BP_NOT_CAP)
7479 seq_printf(m, "fail\n");
7480 else if (timeout == -1)
7481 seq_printf(m, "unknown\n");
7482 else if (timeout == 0)
7483 seq_printf(m, "disable\n");
7485 seq_printf(m, "%d\n", timeout);
7490 static int show_wd_expire_time(struct seq_file *m, void *v)
7492 bpctl_dev_t *dev = m->private;
7493 int ret = 0, timeout = 0;
7494 ret = get_wd_expire_time_fn(dev, &timeout);
7495 if (ret == BP_NOT_CAP)
7496 seq_printf(m, "fail\n");
7497 else if (timeout == -1)
7498 seq_printf(m, "expire\n");
7499 else if (timeout == 0)
7500 seq_printf(m, "disable\n");
7502 seq_printf(m, "%d\n", timeout);
7505 RO_FOPS(wd_expire_time)
7507 static ssize_t tpl_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_tpl_fn(dev, tpl_param);
7518 static int show_tpl(struct seq_file *m, void *v)
7520 bpctl_dev_t *dev = m->private;
7521 int ret = get_tpl_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");
7533 static ssize_t wait_at_pwup_write(struct file *file, const char __user *buffer,
7534 size_t count, loff_t *pos)
7536 bpctl_dev_t *dev = PDE_DATA(file_inode(file));
7537 int tpl_param = user_on_off(buffer, count);
7541 set_bp_wait_at_pwup_fn(dev, tpl_param);
7544 static int show_wait_at_pwup(struct seq_file *m, void *v)
7546 bpctl_dev_t *dev = m->private;
7547 int ret = get_bp_wait_at_pwup_fn(dev);
7548 if (ret == BP_NOT_CAP)
7549 seq_printf(m, "fail\n");
7551 seq_printf(m, "on\n");
7553 seq_printf(m, "off\n");
7556 RW_FOPS(wait_at_pwup)
7558 static ssize_t hw_reset_write(struct file *file, const char __user *buffer,
7559 size_t count, loff_t *pos)
7561 bpctl_dev_t *dev = PDE_DATA(file_inode(file));
7562 int tpl_param = user_on_off(buffer, count);
7566 set_bp_hw_reset_fn(dev, tpl_param);
7569 static int show_hw_reset(struct seq_file *m, void *v)
7571 bpctl_dev_t *dev = m->private;
7572 int ret = get_bp_hw_reset_fn(dev);
7573 if (ret == BP_NOT_CAP)
7574 seq_printf(m, "fail\n");
7576 seq_printf(m, "on\n");
7578 seq_printf(m, "off\n");
7583 #endif /*PMC_WAIT_FLAG */
7585 static int show_reset_bypass_wd(struct seq_file *m, void *v)
7587 bpctl_dev_t *dev = m->private;
7588 int ret = reset_bypass_wd_timer_fn(dev);
7589 if (ret == BP_NOT_CAP)
7590 seq_printf(m, "fail\n");
7592 seq_printf(m, "disable\n");
7594 seq_printf(m, "success\n");
7597 RO_FOPS(reset_bypass_wd)
7599 static ssize_t dis_bypass_write(struct file *file, const char __user *buffer,
7600 size_t count, loff_t *pos)
7602 int bypass_param = user_on_off(buffer, count);
7603 if (bypass_param < 0)
7606 set_dis_bypass_fn(PDE_DATA(file_inode(file)), bypass_param);
7609 static int show_dis_bypass(struct seq_file *m, void *v)
7611 bpctl_dev_t *dev = m->private;
7612 int ret = get_dis_bypass_fn(dev);
7613 if (ret == BP_NOT_CAP)
7614 seq_printf(m, "fail\n");
7616 seq_printf(m, "off\n");
7618 seq_printf(m, "on\n");
7623 static ssize_t dis_tap_write(struct file *file, const char __user *buffer,
7624 size_t count, loff_t *pos)
7626 int tap_param = user_on_off(buffer, count);
7630 set_dis_tap_fn(PDE_DATA(file_inode(file)), tap_param);
7633 static int show_dis_tap(struct seq_file *m, void *v)
7635 bpctl_dev_t *dev = m->private;
7636 int ret = get_dis_tap_fn(dev);
7637 if (ret == BP_NOT_CAP)
7638 seq_printf(m, "fail\n");
7640 seq_printf(m, "off\n");
7642 seq_printf(m, "on\n");
7647 static ssize_t dis_disc_write(struct file *file, const char __user *buffer,
7648 size_t count, loff_t *pos)
7650 int tap_param = user_on_off(buffer, count);
7654 set_dis_disc_fn(PDE_DATA(file_inode(file)), tap_param);
7657 static int show_dis_disc(struct seq_file *m, void *v)
7659 bpctl_dev_t *dev = m->private;
7660 int ret = get_dis_disc_fn(dev);
7661 if (ret == BP_NOT_CAP)
7662 seq_printf(m, "fail\n");
7664 seq_printf(m, "off\n");
7666 seq_printf(m, "on\n");
7671 static ssize_t bypass_pwup_write(struct file *file, const char __user *buffer,
7672 size_t count, loff_t *pos)
7674 int bypass_param = user_on_off(buffer, count);
7675 if (bypass_param < 0)
7678 set_bypass_pwup_fn(PDE_DATA(file_inode(file)), bypass_param);
7681 static int show_bypass_pwup(struct seq_file *m, void *v)
7683 bpctl_dev_t *dev = m->private;
7684 int ret = get_bypass_pwup_fn(dev);
7685 if (ret == BP_NOT_CAP)
7686 seq_printf(m, "fail\n");
7688 seq_printf(m, "off\n");
7690 seq_printf(m, "on\n");
7693 RW_FOPS(bypass_pwup)
7695 static ssize_t bypass_pwoff_write(struct file *file, const char __user *buffer,
7696 size_t count, loff_t *pos)
7698 int bypass_param = user_on_off(buffer, count);
7699 if (bypass_param < 0)
7702 set_bypass_pwoff_fn(PDE_DATA(file_inode(file)), bypass_param);
7705 static int show_bypass_pwoff(struct seq_file *m, void *v)
7707 bpctl_dev_t *dev = m->private;
7708 int ret = get_bypass_pwoff_fn(dev);
7709 if (ret == BP_NOT_CAP)
7710 seq_printf(m, "fail\n");
7712 seq_printf(m, "off\n");
7714 seq_printf(m, "on\n");
7717 RW_FOPS(bypass_pwoff)
7719 static ssize_t tap_pwup_write(struct file *file, const char __user *buffer,
7720 size_t count, loff_t *pos)
7722 int tap_param = user_on_off(buffer, count);
7726 set_tap_pwup_fn(PDE_DATA(file_inode(file)), tap_param);
7729 static int show_tap_pwup(struct seq_file *m, void *v)
7731 bpctl_dev_t *dev = m->private;
7732 int ret = get_tap_pwup_fn(dev);
7733 if (ret == BP_NOT_CAP)
7734 seq_printf(m, "fail\n");
7736 seq_printf(m, "off\n");
7738 seq_printf(m, "on\n");
7743 static ssize_t disc_pwup_write(struct file *file, const char __user *buffer,
7744 size_t count, loff_t *pos)
7746 int tap_param = user_on_off(buffer, count);
7750 set_disc_pwup_fn(PDE_DATA(file_inode(file)), tap_param);
7753 static int show_disc_pwup(struct seq_file *m, void *v)
7755 bpctl_dev_t *dev = m->private;
7756 int ret = get_disc_pwup_fn(dev);
7757 if (ret == BP_NOT_CAP)
7758 seq_printf(m, "fail\n");
7760 seq_printf(m, "off\n");
7762 seq_printf(m, "on\n");
7767 static ssize_t std_nic_write(struct file *file, const char __user *buffer,
7768 size_t count, loff_t *pos)
7770 int bypass_param = user_on_off(buffer, count);
7771 if (bypass_param < 0)
7774 set_std_nic_fn(PDE_DATA(file_inode(file)), bypass_param);
7777 static int show_std_nic(struct seq_file *m, void *v)
7779 bpctl_dev_t *dev = m->private;
7780 int ret = get_std_nic_fn(dev);
7781 if (ret == BP_NOT_CAP)
7782 seq_printf(m, "fail\n");
7784 seq_printf(m, "off\n");
7786 seq_printf(m, "on\n");
7791 static ssize_t wd_exp_mode_write(struct file *file, const char __user *buffer,
7792 size_t count, loff_t *pos)
7795 int bypass_param = 0, length = 0;
7797 if (count > (sizeof(kbuf) - 1))
7800 if (copy_from_user(&kbuf, buffer, count))
7804 length = strlen(kbuf);
7805 if (kbuf[length - 1] == '\n')
7806 kbuf[--length] = '\0';
7808 if (strcmp(kbuf, "tap") == 0)
7810 else if (strcmp(kbuf, "bypass") == 0)
7812 else if (strcmp(kbuf, "disc") == 0)
7815 set_wd_exp_mode_fn(PDE_DATA(file_inode(file)), bypass_param);
7819 static int show_wd_exp_mode(struct seq_file *m, void *v)
7821 bpctl_dev_t *dev = m->private;
7822 int ret = get_wd_exp_mode_fn(dev);
7824 seq_printf(m, "tap\n");
7826 seq_printf(m, "bypass\n");
7828 seq_printf(m, "disc\n");
7830 seq_printf(m, "fail\n");
7833 RW_FOPS(wd_exp_mode)
7835 static ssize_t wd_autoreset_write(struct file *file, const char __user *buffer,
7836 size_t count, loff_t *pos)
7839 int ret = kstrtoint_from_user(buffer, count, 10, &timeout);
7842 set_wd_autoreset_fn(PDE_DATA(file_inode(file)), timeout);
7845 static int show_wd_autoreset(struct seq_file *m, void *v)
7847 bpctl_dev_t *dev = m->private;
7848 int ret = get_wd_autoreset_fn(dev);
7850 seq_printf(m, "%d\n", ret);
7852 seq_printf(m, "fail\n");
7855 RW_FOPS(wd_autoreset)
7857 int bypass_proc_create_dev_sd(bpctl_dev_t *pbp_device_block)
7859 struct bypass_pfs_sd *current_pfs = &(pbp_device_block->bypass_pfs_set);
7860 static struct proc_dir_entry *procfs_dir = NULL;
7863 if (!pbp_device_block->ndev)
7865 sprintf(current_pfs->dir_name, "bypass_%s",
7866 pbp_device_block->ndev->name);
7871 /* create device proc dir */
7872 procfs_dir = proc_mkdir(current_pfs->dir_name, bp_procfs_dir);
7874 printk(KERN_DEBUG "Could not create procfs directory %s\n",
7875 current_pfs->dir_name);
7878 current_pfs->bypass_entry = procfs_dir;
7880 #define ENTRY(x) ret |= procfs_add(#x, &x##_ops, pbp_device_block)
7882 if (pbp_device_block->bp_caps & SW_CTL_CAP) {
7883 /* Create set param proc's */
7884 ENTRY(bypass_slave);
7888 ENTRY(wd_expire_time);
7889 ENTRY(reset_bypass_wd);
7891 if (pbp_device_block->bp_caps & BP_CAP) {
7895 ENTRY(bypass_pwoff);
7896 ENTRY(bypass_change);
7898 if (pbp_device_block->bp_caps & TAP_CAP) {
7904 if (pbp_device_block->bp_caps & DISC_CAP) {
7912 ENTRY(wd_autoreset);
7915 ENTRY(wait_at_pwup);
7921 printk(KERN_DEBUG "Create proc entry failed\n");
7926 int bypass_proc_remove_dev_sd(bpctl_dev_t *pbp_device_block)
7929 struct bypass_pfs_sd *current_pfs = &pbp_device_block->bypass_pfs_set;
7930 remove_proc_subtree(current_pfs->dir_name, bp_procfs_dir);
7931 current_pfs->bypass_entry = NULL;