diff options
-rw-r--r-- | drivers/staging/silicom/bp_mod.c | 325 |
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 | ||
6660 | static 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 | |||
6690 | static 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 | ||