aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/staging/silicom/bp_mod.c325
1 files changed, 133 insertions, 192 deletions
diff --git a/drivers/staging/silicom/bp_mod.c b/drivers/staging/silicom/bp_mod.c
index 2c7334162c46..e737939e4c46 100644
--- a/drivers/staging/silicom/bp_mod.c
+++ b/drivers/staging/silicom/bp_mod.c
@@ -6657,6 +6657,118 @@ static bpmod_info_t tx_ctl_pci_tbl[] = {
6657 {0,} 6657 {0,}
6658}; 6658};
6659 6659
6660static void find_fw(bpctl_dev_t *dev)
6661{
6662 unsigned long mmio_start, mmio_len;
6663 struct pci_dev *pdev1 = dev->pdev;
6664
6665 if ((OLD_IF_SERIES(dev->subdevice)) ||
6666 (INTEL_IF_SERIES(dev->subdevice)))
6667 dev->bp_fw_ver = 0xff;
6668 else
6669 dev->bp_fw_ver = bypass_fw_ver(dev);
6670
6671 if (dev->bp_10gb == 1 && dev->bp_fw_ver == 0xff) {
6672 int cnt = 100;
6673 while (cnt--) {
6674 iounmap((void *)dev->mem_map);
6675 mmio_start = pci_resource_start(pdev1, 0);
6676 mmio_len = pci_resource_len(pdev1, 0);
6677
6678 dev->mem_map = (unsigned long)
6679 ioremap(mmio_start, mmio_len);
6680
6681 dev->bp_fw_ver = bypass_fw_ver(dev);
6682 if (dev-> bp_fw_ver == 0xa8)
6683 break;
6684 }
6685 }
6686 /* dev->bp_fw_ver=0xa8; */
6687 printk("firmware version: 0x%x\n", dev->bp_fw_ver);
6688}
6689
6690static int init_one(bpctl_dev_t *dev, bpmod_info_t *info, struct pci_dev *pdev1)
6691{
6692 unsigned long mmio_start, mmio_len;
6693
6694 dev->pdev = pdev1;
6695 mmio_start = pci_resource_start(pdev1, 0);
6696 mmio_len = pci_resource_len(pdev1, 0);
6697
6698 dev->desc = dev_desc[info->index].name;
6699 dev->name = info->bp_name;
6700 dev->device = info->device;
6701 dev->vendor = info->vendor;
6702 dev->subdevice = info->subdevice;
6703 dev->subvendor = info->subvendor;
6704 dev->func = PCI_FUNC(pdev1->devfn);
6705 dev->slot = PCI_SLOT(pdev1->devfn);
6706 dev->bus = pdev1->bus->number;
6707 dev->mem_map = (unsigned long)ioremap(mmio_start, mmio_len);
6708#ifdef BP_SYNC_FLAG
6709 spin_lock_init(&dev->bypass_wr_lock);
6710#endif
6711 if (BP10G9_IF_SERIES(dev->subdevice))
6712 dev->bp_10g9 = 1;
6713 if (BP10G_IF_SERIES(dev->subdevice))
6714 dev->bp_10g = 1;
6715 if (PEG540_IF_SERIES(dev->subdevice))
6716 dev->bp_540 = 1;
6717 if (PEGF5_IF_SERIES(dev->subdevice))
6718 dev->bp_fiber5 = 1;
6719 if (PEG80_IF_SERIES(dev->subdevice))
6720 dev->bp_i80 = 1;
6721 if (PEGF80_IF_SERIES(dev->subdevice))
6722 dev->bp_i80 = 1;
6723 if ((dev->subdevice & 0xa00) == 0xa00)
6724 dev->bp_i80 = 1;
6725 if (BP10GB_IF_SERIES(dev->subdevice)) {
6726 if (dev->ifindex == 0) {
6727 unregister_chrdev(major_num, DEVICE_NAME);
6728 printk("Please load network driver for %s adapter!\n",
6729 dev->name);
6730 return -1;
6731 }
6732
6733 if (dev->ndev && !(dev->ndev->flags & IFF_UP)) {
6734 unregister_chrdev(major_num, DEVICE_NAME);
6735 printk("Please bring up network interfaces for %s adapter!\n",
6736 dev->name);
6737 return -1;
6738 }
6739 dev->bp_10gb = 1;
6740 }
6741
6742 if (!dev->bp_10g9) {
6743 if (is_bypass_fn(dev)) {
6744 printk(KERN_INFO "%s found, ",
6745 dev->name);
6746 find_fw(dev);
6747 }
6748 dev->wdt_status = WDT_STATUS_UNKNOWN;
6749 dev->reset_time = 0;
6750 atomic_set(&dev->wdt_busy, 0);
6751 dev->bp_status_un = 1;
6752
6753 bypass_caps_init(dev);
6754
6755 init_bypass_wd_auto(dev);
6756 init_bypass_tpl_auto(dev);
6757 if (NOKIA_SERIES(dev->subdevice))
6758 reset_cont(dev);
6759 }
6760#ifdef BP_SELF_TEST
6761 if ((dev->bp_tx_data = kzalloc(BPTEST_DATA_LEN, GFP_KERNEL))) {
6762 memset(dev->bp_tx_data, 0xff, 6);
6763 memset(dev->bp_tx_data + 6, 0x0, 1);
6764 memset(dev->bp_tx_data + 7, 0xaa, 5);
6765 *(__be16 *)(dev->bp_tx_data + 12) = htons(ETH_P_BPTEST);
6766 } else
6767 printk("bp_ctl: Memory allocation error!\n");
6768#endif
6769 return 0;
6770}
6771
6660/* 6772/*
6661* Initialize the module - Register the character device 6773* Initialize the module - Register the character device
6662*/ 6774*/
@@ -6665,7 +6777,7 @@ static int __init bypass_init_module(void)
6665{ 6777{
6666 int ret_val, idx, idx_dev = 0; 6778 int ret_val, idx, idx_dev = 0;
6667 struct pci_dev *pdev1 = NULL; 6779 struct pci_dev *pdev1 = NULL;
6668 unsigned long mmio_start, mmio_len; 6780 bpctl_dev_t *dev;
6669 6781
6670 printk(BP_MOD_DESCR " v" BP_MOD_VER "\n"); 6782 printk(BP_MOD_DESCR " v" BP_MOD_VER "\n");
6671 ret_val = register_chrdev(major_num, DEVICE_NAME, &Fops); 6783 ret_val = register_chrdev(major_num, DEVICE_NAME, &Fops);
@@ -6700,181 +6812,16 @@ static int __init bypass_init_module(void)
6700 memset(bpctl_dev_arr, 0, ((device_num) * sizeof(bpctl_dev_t))); 6812 memset(bpctl_dev_arr, 0, ((device_num) * sizeof(bpctl_dev_t)));
6701 6813
6702 pdev1 = NULL; 6814 pdev1 = NULL;
6815 dev = bpctl_dev_arr;
6703 for (idx = 0; tx_ctl_pci_tbl[idx].vendor; idx++) { 6816 for (idx = 0; tx_ctl_pci_tbl[idx].vendor; idx++) {
6704 while ((pdev1 = pci_get_subsys(tx_ctl_pci_tbl[idx].vendor, 6817 while ((pdev1 = pci_get_subsys(tx_ctl_pci_tbl[idx].vendor,
6705 tx_ctl_pci_tbl[idx].device, 6818 tx_ctl_pci_tbl[idx].device,
6706 tx_ctl_pci_tbl[idx].subvendor, 6819 tx_ctl_pci_tbl[idx].subvendor,
6707 tx_ctl_pci_tbl[idx].subdevice, 6820 tx_ctl_pci_tbl[idx].subdevice,
6708 pdev1))) { 6821 pdev1))) {
6709 bpctl_dev_arr[idx_dev].pdev = pdev1; 6822 if (init_one(dev, &tx_ctl_pci_tbl[idx], pdev1) < 0)
6710 6823 return -1;
6711 mmio_start = pci_resource_start(pdev1, 0); 6824 dev++;
6712 mmio_len = pci_resource_len(pdev1, 0);
6713
6714 bpctl_dev_arr[idx_dev].desc =
6715 dev_desc[tx_ctl_pci_tbl[idx].index].name;
6716 bpctl_dev_arr[idx_dev].name =
6717 tx_ctl_pci_tbl[idx].bp_name;
6718 bpctl_dev_arr[idx_dev].device =
6719 tx_ctl_pci_tbl[idx].device;
6720 bpctl_dev_arr[idx_dev].vendor =
6721 tx_ctl_pci_tbl[idx].vendor;
6722 bpctl_dev_arr[idx_dev].subdevice =
6723 tx_ctl_pci_tbl[idx].subdevice;
6724 bpctl_dev_arr[idx_dev].subvendor =
6725 tx_ctl_pci_tbl[idx].subvendor;
6726 /* bpctl_dev_arr[idx_dev].pdev=pdev1; */
6727 bpctl_dev_arr[idx_dev].func = PCI_FUNC(pdev1->devfn);
6728 bpctl_dev_arr[idx_dev].slot = PCI_SLOT(pdev1->devfn);
6729 bpctl_dev_arr[idx_dev].bus = pdev1->bus->number;
6730 bpctl_dev_arr[idx_dev].mem_map =
6731 (unsigned long)ioremap(mmio_start, mmio_len);
6732#ifdef BP_SYNC_FLAG
6733 spin_lock_init(&bpctl_dev_arr[idx_dev].bypass_wr_lock);
6734#endif
6735 if (BP10G9_IF_SERIES(bpctl_dev_arr[idx_dev].subdevice))
6736 bpctl_dev_arr[idx_dev].bp_10g9 = 1;
6737 if (BP10G_IF_SERIES(bpctl_dev_arr[idx_dev].subdevice))
6738 bpctl_dev_arr[idx_dev].bp_10g = 1;
6739 if (PEG540_IF_SERIES(bpctl_dev_arr[idx_dev].subdevice)) {
6740
6741 bpctl_dev_arr[idx_dev].bp_540 = 1;
6742 }
6743 if (PEGF5_IF_SERIES(bpctl_dev_arr[idx_dev].subdevice))
6744 bpctl_dev_arr[idx_dev].bp_fiber5 = 1;
6745 if (PEG80_IF_SERIES(bpctl_dev_arr[idx_dev].subdevice))
6746 bpctl_dev_arr[idx_dev].bp_i80 = 1;
6747 if (PEGF80_IF_SERIES(bpctl_dev_arr[idx_dev].subdevice))
6748 bpctl_dev_arr[idx_dev].bp_i80 = 1;
6749 if ((bpctl_dev_arr[idx_dev].subdevice & 0xa00) == 0xa00)
6750 bpctl_dev_arr[idx_dev].bp_i80 = 1;
6751 if (BP10GB_IF_SERIES(bpctl_dev_arr[idx_dev].subdevice)) {
6752 if (bpctl_dev_arr[idx_dev].ifindex == 0) {
6753 unregister_chrdev(major_num,
6754 DEVICE_NAME);
6755 printk
6756 ("Please load network driver for %s adapter!\n",
6757 bpctl_dev_arr[idx_dev].name);
6758 return -1;
6759 }
6760
6761 if (bpctl_dev_arr[idx_dev].ndev) {
6762 if (!
6763 (bpctl_dev_arr[idx_dev].ndev->
6764 flags & IFF_UP)) {
6765 if (!
6766 (bpctl_dev_arr[idx_dev].
6767 ndev->flags & IFF_UP)) {
6768 unregister_chrdev
6769 (major_num,
6770 DEVICE_NAME);
6771 printk
6772 ("Please bring up network interfaces for %s adapter!\n",
6773 bpctl_dev_arr
6774 [idx_dev].name);
6775 return -1;
6776 }
6777
6778 }
6779 }
6780 bpctl_dev_arr[idx_dev].bp_10gb = 1;
6781 }
6782
6783 if (!bpctl_dev_arr[idx_dev].bp_10g9) {
6784
6785 if (is_bypass_fn(&bpctl_dev_arr[idx_dev])) {
6786 printk(KERN_INFO "%s found, ",
6787 bpctl_dev_arr[idx_dev].name);
6788 if ((OLD_IF_SERIES
6789 (bpctl_dev_arr[idx_dev].subdevice))
6790 ||
6791 (INTEL_IF_SERIES
6792 (bpctl_dev_arr[idx_dev].
6793 subdevice)))
6794 bpctl_dev_arr[idx_dev].
6795 bp_fw_ver = 0xff;
6796 else
6797 bpctl_dev_arr[idx_dev].
6798 bp_fw_ver =
6799 bypass_fw_ver(&bpctl_dev_arr
6800 [idx_dev]);
6801 if ((bpctl_dev_arr[idx_dev].bp_10gb ==
6802 1)
6803 && (bpctl_dev_arr[idx_dev].
6804 bp_fw_ver == 0xff)) {
6805 int cnt = 100;
6806 while (cnt--) {
6807 iounmap((void
6808 *)
6809 (bpctl_dev_arr
6810 [idx_dev].
6811 mem_map));
6812 mmio_start =
6813 pci_resource_start
6814 (pdev1, 0);
6815 mmio_len =
6816 pci_resource_len
6817 (pdev1, 0);
6818
6819 bpctl_dev_arr[idx_dev].
6820 mem_map =
6821 (unsigned long)
6822 ioremap(mmio_start,
6823 mmio_len);
6824
6825 bpctl_dev_arr[idx_dev].
6826 bp_fw_ver =
6827 bypass_fw_ver
6828 (&bpctl_dev_arr
6829 [idx_dev]);
6830 if (bpctl_dev_arr
6831 [idx_dev].
6832 bp_fw_ver == 0xa8)
6833 break;
6834
6835 }
6836 }
6837 /* bpctl_dev_arr[idx_dev].bp_fw_ver=0xa8; */
6838 printk("firmware version: 0x%x\n",
6839 bpctl_dev_arr[idx_dev].
6840 bp_fw_ver);
6841 }
6842 bpctl_dev_arr[idx_dev].wdt_status =
6843 WDT_STATUS_UNKNOWN;
6844 bpctl_dev_arr[idx_dev].reset_time = 0;
6845 atomic_set(&bpctl_dev_arr[idx_dev].wdt_busy, 0);
6846 bpctl_dev_arr[idx_dev].bp_status_un = 1;
6847
6848 bypass_caps_init(&bpctl_dev_arr[idx_dev]);
6849
6850 init_bypass_wd_auto(&bpctl_dev_arr[idx_dev]);
6851 init_bypass_tpl_auto(&bpctl_dev_arr[idx_dev]);
6852 if (NOKIA_SERIES
6853 (bpctl_dev_arr[idx_dev].subdevice))
6854 reset_cont(&bpctl_dev_arr[idx_dev]);
6855 }
6856#ifdef BP_SELF_TEST
6857 if ((bpctl_dev_arr[idx_dev].bp_tx_data =
6858 kmalloc(BPTEST_DATA_LEN, GFP_KERNEL))) {
6859
6860 memset(bpctl_dev_arr[idx_dev].bp_tx_data, 0x0,
6861 BPTEST_DATA_LEN);
6862
6863 memset(bpctl_dev_arr[idx_dev].bp_tx_data, 0xff,
6864 6);
6865 memset(bpctl_dev_arr[idx_dev].bp_tx_data + 6,
6866 0x0, 1);
6867 memset(bpctl_dev_arr[idx_dev].bp_tx_data + 7,
6868 0xaa, 5);
6869
6870 *(__be16 *) (bpctl_dev_arr[idx_dev].bp_tx_data +
6871 12) = htons(ETH_P_BPTEST);
6872
6873 } else
6874 printk("bp_ctl: Memory allocation error!\n");
6875#endif
6876 idx_dev++;
6877
6878 } 6825 }
6879 } 6826 }
6880 if_scan_init(); 6827 if_scan_init();
@@ -6884,33 +6831,27 @@ static int __init bypass_init_module(void)
6884 { 6831 {
6885 6832
6886 bpctl_dev_t *pbpctl_dev_c = NULL; 6833 bpctl_dev_t *pbpctl_dev_c = NULL;
6887 for (idx_dev = 0; 6834 for (idx_dev = 0, dev = bpctl_dev_arr;
6888 ((bpctl_dev_arr[idx_dev].pdev != NULL) 6835 idx_dev < device_num && dev->pdev;
6889 && (idx_dev < device_num)); idx_dev++) { 6836 idx_dev++, dev++) {
6890 if (bpctl_dev_arr[idx_dev].bp_10g9) { 6837 if (dev->bp_10g9) {
6891 pbpctl_dev_c = 6838 pbpctl_dev_c = get_status_port_fn(dev);
6892 get_status_port_fn(&bpctl_dev_arr[idx_dev]); 6839 if (is_bypass_fn(dev)) {
6893 if (is_bypass_fn(&bpctl_dev_arr[idx_dev])) {
6894 printk(KERN_INFO "%s found, ", 6840 printk(KERN_INFO "%s found, ",
6895 bpctl_dev_arr[idx_dev].name); 6841 dev->name);
6896 bpctl_dev_arr[idx_dev].bp_fw_ver = 6842 dev->bp_fw_ver = bypass_fw_ver(dev);
6897 bypass_fw_ver(&bpctl_dev_arr
6898 [idx_dev]);
6899 printk("firmware version: 0x%x\n", 6843 printk("firmware version: 0x%x\n",
6900 bpctl_dev_arr[idx_dev]. 6844 dev->bp_fw_ver);
6901 bp_fw_ver);
6902
6903 } 6845 }
6904 bpctl_dev_arr[idx_dev].wdt_status = 6846 dev->wdt_status = WDT_STATUS_UNKNOWN;
6905 WDT_STATUS_UNKNOWN; 6847 dev->reset_time = 0;
6906 bpctl_dev_arr[idx_dev].reset_time = 0; 6848 atomic_set(&dev->wdt_busy, 0);
6907 atomic_set(&bpctl_dev_arr[idx_dev].wdt_busy, 0); 6849 dev->bp_status_un = 1;
6908 bpctl_dev_arr[idx_dev].bp_status_un = 1;
6909 6850
6910 bypass_caps_init(&bpctl_dev_arr[idx_dev]); 6851 bypass_caps_init(dev);
6911 6852
6912 init_bypass_wd_auto(&bpctl_dev_arr[idx_dev]); 6853 init_bypass_wd_auto(dev);
6913 init_bypass_tpl_auto(&bpctl_dev_arr[idx_dev]); 6854 init_bypass_tpl_auto(dev);
6914 6855
6915 } 6856 }
6916 6857