aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/emulex
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/emulex')
-rw-r--r--drivers/net/ethernet/emulex/benet/be.h20
-rw-r--r--drivers/net/ethernet/emulex/benet/be_main.c137
2 files changed, 80 insertions, 77 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h
index 34f162db9f2e..a3588fb8d6a9 100644
--- a/drivers/net/ethernet/emulex/benet/be.h
+++ b/drivers/net/ethernet/emulex/benet/be.h
@@ -288,11 +288,11 @@ struct be_drv_stats {
288}; 288};
289 289
290struct be_vf_cfg { 290struct be_vf_cfg {
291 unsigned char vf_mac_addr[ETH_ALEN]; 291 unsigned char mac_addr[ETH_ALEN];
292 int vf_if_handle; 292 int if_handle;
293 int vf_pmac_id; 293 int pmac_id;
294 u16 vf_vlan_tag; 294 u16 vlan_tag;
295 u32 vf_tx_rate; 295 u32 tx_rate;
296}; 296};
297 297
298struct be_adapter { 298struct be_adapter {
@@ -368,16 +368,20 @@ struct be_adapter {
368 u32 flash_status; 368 u32 flash_status;
369 struct completion flash_compl; 369 struct completion flash_compl;
370 370
371 bool be3_native; 371 u32 num_vfs;
372 bool sriov_enabled;
373 struct be_vf_cfg *vf_cfg;
374 u8 is_virtfn; 372 u8 is_virtfn;
373 struct be_vf_cfg *vf_cfg;
374 bool be3_native;
375 u32 sli_family; 375 u32 sli_family;
376 u8 hba_port_num; 376 u8 hba_port_num;
377 u16 pvid; 377 u16 pvid;
378}; 378};
379 379
380#define be_physfn(adapter) (!adapter->is_virtfn) 380#define be_physfn(adapter) (!adapter->is_virtfn)
381#define sriov_enabled(adapter) (adapter->num_vfs > 0)
382#define for_all_vfs(adapter, vf_cfg, i) \
383 for (i = 0, vf_cfg = &adapter->vf_cfg[i]; i < adapter->num_vfs; \
384 i++, vf_cfg++)
381 385
382/* BladeEngine Generation numbers */ 386/* BladeEngine Generation numbers */
383#define BE_GEN2 2 387#define BE_GEN2 2
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index 62f55145fa44..9b5304a653f3 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -27,13 +27,14 @@ MODULE_DESCRIPTION(DRV_DESC " " DRV_VER);
27MODULE_AUTHOR("ServerEngines Corporation"); 27MODULE_AUTHOR("ServerEngines Corporation");
28MODULE_LICENSE("GPL"); 28MODULE_LICENSE("GPL");
29 29
30static ushort rx_frag_size = 2048;
31static unsigned int num_vfs; 30static unsigned int num_vfs;
32module_param(rx_frag_size, ushort, S_IRUGO);
33module_param(num_vfs, uint, S_IRUGO); 31module_param(num_vfs, uint, S_IRUGO);
34MODULE_PARM_DESC(rx_frag_size, "Size of a fragment that holds rcvd data.");
35MODULE_PARM_DESC(num_vfs, "Number of PCI VFs to initialize"); 32MODULE_PARM_DESC(num_vfs, "Number of PCI VFs to initialize");
36 33
34static ushort rx_frag_size = 2048;
35module_param(rx_frag_size, ushort, S_IRUGO);
36MODULE_PARM_DESC(rx_frag_size, "Size of a fragment that holds rcvd data.");
37
37static DEFINE_PCI_DEVICE_TABLE(be_dev_ids) = { 38static DEFINE_PCI_DEVICE_TABLE(be_dev_ids) = {
38 { PCI_DEVICE(BE_VENDOR_ID, BE_DEVICE_ID1) }, 39 { PCI_DEVICE(BE_VENDOR_ID, BE_DEVICE_ID1) },
39 { PCI_DEVICE(BE_VENDOR_ID, BE_DEVICE_ID2) }, 40 { PCI_DEVICE(BE_VENDOR_ID, BE_DEVICE_ID2) },
@@ -779,15 +780,15 @@ static int be_change_mtu(struct net_device *netdev, int new_mtu)
779 */ 780 */
780static int be_vid_config(struct be_adapter *adapter, bool vf, u32 vf_num) 781static int be_vid_config(struct be_adapter *adapter, bool vf, u32 vf_num)
781{ 782{
783 struct be_vf_cfg *vf_cfg = &adapter->vf_cfg[vf_num];
782 u16 vtag[BE_NUM_VLANS_SUPPORTED]; 784 u16 vtag[BE_NUM_VLANS_SUPPORTED];
783 u16 ntags = 0, i; 785 u16 ntags = 0, i;
784 int status = 0; 786 int status = 0;
785 u32 if_handle;
786 787
787 if (vf) { 788 if (vf) {
788 if_handle = adapter->vf_cfg[vf_num].vf_if_handle; 789 vtag[0] = cpu_to_le16(vf_cfg->vlan_tag);
789 vtag[0] = cpu_to_le16(adapter->vf_cfg[vf_num].vf_vlan_tag); 790 status = be_cmd_vlan_config(adapter, vf_cfg->if_handle, vtag,
790 status = be_cmd_vlan_config(adapter, if_handle, vtag, 1, 1, 0); 791 1, 1, 0);
791 } 792 }
792 793
793 /* No need to further configure vids if in promiscuous mode */ 794 /* No need to further configure vids if in promiscuous mode */
@@ -877,31 +878,30 @@ done:
877static int be_set_vf_mac(struct net_device *netdev, int vf, u8 *mac) 878static int be_set_vf_mac(struct net_device *netdev, int vf, u8 *mac)
878{ 879{
879 struct be_adapter *adapter = netdev_priv(netdev); 880 struct be_adapter *adapter = netdev_priv(netdev);
881 struct be_vf_cfg *vf_cfg = &adapter->vf_cfg[vf];
880 int status; 882 int status;
881 883
882 if (!adapter->sriov_enabled) 884 if (!sriov_enabled(adapter))
883 return -EPERM; 885 return -EPERM;
884 886
885 if (!is_valid_ether_addr(mac) || (vf >= num_vfs)) 887 if (!is_valid_ether_addr(mac) || vf >= adapter->num_vfs)
886 return -EINVAL; 888 return -EINVAL;
887 889
888 if (lancer_chip(adapter)) { 890 if (lancer_chip(adapter)) {
889 status = be_cmd_set_mac_list(adapter, mac, 1, vf + 1); 891 status = be_cmd_set_mac_list(adapter, mac, 1, vf + 1);
890 } else { 892 } else {
891 status = be_cmd_pmac_del(adapter, 893 status = be_cmd_pmac_del(adapter, vf_cfg->if_handle,
892 adapter->vf_cfg[vf].vf_if_handle, 894 vf_cfg->pmac_id, vf + 1);
893 adapter->vf_cfg[vf].vf_pmac_id, vf + 1);
894 895
895 status = be_cmd_pmac_add(adapter, mac, 896 status = be_cmd_pmac_add(adapter, mac, vf_cfg->if_handle,
896 adapter->vf_cfg[vf].vf_if_handle, 897 &vf_cfg->pmac_id, vf + 1);
897 &adapter->vf_cfg[vf].vf_pmac_id, vf + 1);
898 } 898 }
899 899
900 if (status) 900 if (status)
901 dev_err(&adapter->pdev->dev, "MAC %pM set on VF %d Failed\n", 901 dev_err(&adapter->pdev->dev, "MAC %pM set on VF %d Failed\n",
902 mac, vf); 902 mac, vf);
903 else 903 else
904 memcpy(adapter->vf_cfg[vf].vf_mac_addr, mac, ETH_ALEN); 904 memcpy(vf_cfg->mac_addr, mac, ETH_ALEN);
905 905
906 return status; 906 return status;
907} 907}
@@ -910,18 +910,19 @@ static int be_get_vf_config(struct net_device *netdev, int vf,
910 struct ifla_vf_info *vi) 910 struct ifla_vf_info *vi)
911{ 911{
912 struct be_adapter *adapter = netdev_priv(netdev); 912 struct be_adapter *adapter = netdev_priv(netdev);
913 struct be_vf_cfg *vf_cfg = &adapter->vf_cfg[vf];
913 914
914 if (!adapter->sriov_enabled) 915 if (!sriov_enabled(adapter))
915 return -EPERM; 916 return -EPERM;
916 917
917 if (vf >= num_vfs) 918 if (vf >= adapter->num_vfs)
918 return -EINVAL; 919 return -EINVAL;
919 920
920 vi->vf = vf; 921 vi->vf = vf;
921 vi->tx_rate = adapter->vf_cfg[vf].vf_tx_rate; 922 vi->tx_rate = vf_cfg->tx_rate;
922 vi->vlan = adapter->vf_cfg[vf].vf_vlan_tag; 923 vi->vlan = vf_cfg->vlan_tag;
923 vi->qos = 0; 924 vi->qos = 0;
924 memcpy(&vi->mac, adapter->vf_cfg[vf].vf_mac_addr, ETH_ALEN); 925 memcpy(&vi->mac, vf_cfg->mac_addr, ETH_ALEN);
925 926
926 return 0; 927 return 0;
927} 928}
@@ -932,17 +933,17 @@ static int be_set_vf_vlan(struct net_device *netdev,
932 struct be_adapter *adapter = netdev_priv(netdev); 933 struct be_adapter *adapter = netdev_priv(netdev);
933 int status = 0; 934 int status = 0;
934 935
935 if (!adapter->sriov_enabled) 936 if (!sriov_enabled(adapter))
936 return -EPERM; 937 return -EPERM;
937 938
938 if ((vf >= num_vfs) || (vlan > 4095)) 939 if (vf >= adapter->num_vfs || vlan > 4095)
939 return -EINVAL; 940 return -EINVAL;
940 941
941 if (vlan) { 942 if (vlan) {
942 adapter->vf_cfg[vf].vf_vlan_tag = vlan; 943 adapter->vf_cfg[vf].vlan_tag = vlan;
943 adapter->vlans_added++; 944 adapter->vlans_added++;
944 } else { 945 } else {
945 adapter->vf_cfg[vf].vf_vlan_tag = 0; 946 adapter->vf_cfg[vf].vlan_tag = 0;
946 adapter->vlans_added--; 947 adapter->vlans_added--;
947 } 948 }
948 949
@@ -960,16 +961,16 @@ static int be_set_vf_tx_rate(struct net_device *netdev,
960 struct be_adapter *adapter = netdev_priv(netdev); 961 struct be_adapter *adapter = netdev_priv(netdev);
961 int status = 0; 962 int status = 0;
962 963
963 if (!adapter->sriov_enabled) 964 if (!sriov_enabled(adapter))
964 return -EPERM; 965 return -EPERM;
965 966
966 if ((vf >= num_vfs) || (rate < 0)) 967 if (vf >= adapter->num_vfs || rate < 0)
967 return -EINVAL; 968 return -EINVAL;
968 969
969 if (rate > 10000) 970 if (rate > 10000)
970 rate = 10000; 971 rate = 10000;
971 972
972 adapter->vf_cfg[vf].vf_tx_rate = rate; 973 adapter->vf_cfg[vf].tx_rate = rate;
973 status = be_cmd_set_qos(adapter, rate / 10, vf + 1); 974 status = be_cmd_set_qos(adapter, rate / 10, vf + 1);
974 975
975 if (status) 976 if (status)
@@ -1685,8 +1686,7 @@ static void be_tx_queues_destroy(struct be_adapter *adapter)
1685 1686
1686static int be_num_txqs_want(struct be_adapter *adapter) 1687static int be_num_txqs_want(struct be_adapter *adapter)
1687{ 1688{
1688 if ((num_vfs && adapter->sriov_enabled) || 1689 if (sriov_enabled(adapter) || be_is_mc(adapter) ||
1689 be_is_mc(adapter) ||
1690 lancer_chip(adapter) || !be_physfn(adapter) || 1690 lancer_chip(adapter) || !be_physfn(adapter) ||
1691 adapter->generation == BE_GEN2) 1691 adapter->generation == BE_GEN2)
1692 return 1; 1692 return 1;
@@ -1768,8 +1768,8 @@ static void be_rx_queues_destroy(struct be_adapter *adapter)
1768static u32 be_num_rxqs_want(struct be_adapter *adapter) 1768static u32 be_num_rxqs_want(struct be_adapter *adapter)
1769{ 1769{
1770 if ((adapter->function_caps & BE_FUNCTION_CAPS_RSS) && 1770 if ((adapter->function_caps & BE_FUNCTION_CAPS_RSS) &&
1771 !adapter->sriov_enabled && be_physfn(adapter) && 1771 !sriov_enabled(adapter) && be_physfn(adapter) &&
1772 !be_is_mc(adapter)) { 1772 !be_is_mc(adapter)) {
1773 return 1 + MAX_RSS_QS; /* one default non-RSS queue */ 1773 return 1 + MAX_RSS_QS; /* one default non-RSS queue */
1774 } else { 1774 } else {
1775 dev_warn(&adapter->pdev->dev, 1775 dev_warn(&adapter->pdev->dev,
@@ -2116,27 +2116,28 @@ done:
2116static int be_sriov_enable(struct be_adapter *adapter) 2116static int be_sriov_enable(struct be_adapter *adapter)
2117{ 2117{
2118 be_check_sriov_fn_type(adapter); 2118 be_check_sriov_fn_type(adapter);
2119
2119#ifdef CONFIG_PCI_IOV 2120#ifdef CONFIG_PCI_IOV
2120 if (be_physfn(adapter) && num_vfs) { 2121 if (be_physfn(adapter) && num_vfs) {
2121 int status, pos; 2122 int status, pos;
2122 u16 nvfs; 2123 u16 dev_vfs;
2123 2124
2124 pos = pci_find_ext_capability(adapter->pdev, 2125 pos = pci_find_ext_capability(adapter->pdev,
2125 PCI_EXT_CAP_ID_SRIOV); 2126 PCI_EXT_CAP_ID_SRIOV);
2126 pci_read_config_word(adapter->pdev, 2127 pci_read_config_word(adapter->pdev,
2127 pos + PCI_SRIOV_TOTAL_VF, &nvfs); 2128 pos + PCI_SRIOV_TOTAL_VF, &dev_vfs);
2128 2129
2129 if (num_vfs > nvfs) { 2130 adapter->num_vfs = min_t(u16, num_vfs, dev_vfs);
2131 if (adapter->num_vfs != num_vfs)
2130 dev_info(&adapter->pdev->dev, 2132 dev_info(&adapter->pdev->dev,
2131 "Device supports %d VFs and not %d\n", 2133 "Device supports %d VFs and not %d\n",
2132 nvfs, num_vfs); 2134 adapter->num_vfs, num_vfs);
2133 num_vfs = nvfs;
2134 }
2135 2135
2136 status = pci_enable_sriov(adapter->pdev, num_vfs); 2136 status = pci_enable_sriov(adapter->pdev, adapter->num_vfs);
2137 adapter->sriov_enabled = status ? false : true; 2137 if (status)
2138 adapter->num_vfs = 0;
2138 2139
2139 if (adapter->sriov_enabled) { 2140 if (adapter->num_vfs) {
2140 adapter->vf_cfg = kcalloc(num_vfs, 2141 adapter->vf_cfg = kcalloc(num_vfs,
2141 sizeof(struct be_vf_cfg), 2142 sizeof(struct be_vf_cfg),
2142 GFP_KERNEL); 2143 GFP_KERNEL);
@@ -2151,10 +2152,10 @@ static int be_sriov_enable(struct be_adapter *adapter)
2151static void be_sriov_disable(struct be_adapter *adapter) 2152static void be_sriov_disable(struct be_adapter *adapter)
2152{ 2153{
2153#ifdef CONFIG_PCI_IOV 2154#ifdef CONFIG_PCI_IOV
2154 if (adapter->sriov_enabled) { 2155 if (sriov_enabled(adapter)) {
2155 pci_disable_sriov(adapter->pdev); 2156 pci_disable_sriov(adapter->pdev);
2156 kfree(adapter->vf_cfg); 2157 kfree(adapter->vf_cfg);
2157 adapter->sriov_enabled = false; 2158 adapter->num_vfs = 0;
2158 } 2159 }
2159#endif 2160#endif
2160} 2161}
@@ -2466,24 +2467,24 @@ static inline int be_vf_eth_addr_config(struct be_adapter *adapter)
2466 u32 vf; 2467 u32 vf;
2467 int status = 0; 2468 int status = 0;
2468 u8 mac[ETH_ALEN]; 2469 u8 mac[ETH_ALEN];
2470 struct be_vf_cfg *vf_cfg;
2469 2471
2470 be_vf_eth_addr_generate(adapter, mac); 2472 be_vf_eth_addr_generate(adapter, mac);
2471 2473
2472 for (vf = 0; vf < num_vfs; vf++) { 2474 for_all_vfs(adapter, vf_cfg, vf) {
2473 if (lancer_chip(adapter)) { 2475 if (lancer_chip(adapter)) {
2474 status = be_cmd_set_mac_list(adapter, mac, 1, vf + 1); 2476 status = be_cmd_set_mac_list(adapter, mac, 1, vf + 1);
2475 } else { 2477 } else {
2476 status = be_cmd_pmac_add(adapter, mac, 2478 status = be_cmd_pmac_add(adapter, mac,
2477 adapter->vf_cfg[vf].vf_if_handle, 2479 vf_cfg->if_handle,
2478 &adapter->vf_cfg[vf].vf_pmac_id, 2480 &vf_cfg->pmac_id, vf + 1);
2479 vf + 1);
2480 } 2481 }
2481 2482
2482 if (status) 2483 if (status)
2483 dev_err(&adapter->pdev->dev, 2484 dev_err(&adapter->pdev->dev,
2484 "Mac address assignment failed for VF %d\n", vf); 2485 "Mac address assignment failed for VF %d\n", vf);
2485 else 2486 else
2486 memcpy(adapter->vf_cfg[vf].vf_mac_addr, mac, ETH_ALEN); 2487 memcpy(vf_cfg->mac_addr, mac, ETH_ALEN);
2487 2488
2488 mac[5] += 1; 2489 mac[5] += 1;
2489 } 2490 }
@@ -2492,25 +2493,23 @@ static inline int be_vf_eth_addr_config(struct be_adapter *adapter)
2492 2493
2493static void be_vf_clear(struct be_adapter *adapter) 2494static void be_vf_clear(struct be_adapter *adapter)
2494{ 2495{
2496 struct be_vf_cfg *vf_cfg;
2495 u32 vf; 2497 u32 vf;
2496 2498
2497 for (vf = 0; vf < num_vfs; vf++) { 2499 for_all_vfs(adapter, vf_cfg, vf) {
2498 if (lancer_chip(adapter)) 2500 if (lancer_chip(adapter))
2499 be_cmd_set_mac_list(adapter, NULL, 0, vf + 1); 2501 be_cmd_set_mac_list(adapter, NULL, 0, vf + 1);
2500 else 2502 else
2501 be_cmd_pmac_del(adapter, 2503 be_cmd_pmac_del(adapter, vf_cfg->if_handle,
2502 adapter->vf_cfg[vf].vf_if_handle, 2504 vf_cfg->pmac_id, vf + 1);
2503 adapter->vf_cfg[vf].vf_pmac_id, vf + 1);
2504 }
2505 2505
2506 for (vf = 0; vf < num_vfs; vf++) 2506 be_cmd_if_destroy(adapter, vf_cfg->if_handle, vf + 1);
2507 be_cmd_if_destroy(adapter, adapter->vf_cfg[vf].vf_if_handle, 2507 }
2508 vf + 1);
2509} 2508}
2510 2509
2511static int be_clear(struct be_adapter *adapter) 2510static int be_clear(struct be_adapter *adapter)
2512{ 2511{
2513 if (be_physfn(adapter) && adapter->sriov_enabled) 2512 if (sriov_enabled(adapter))
2514 be_vf_clear(adapter); 2513 be_vf_clear(adapter);
2515 2514
2516 be_cmd_if_destroy(adapter, adapter->if_handle, 0); 2515 be_cmd_if_destroy(adapter, adapter->if_handle, 0);
@@ -2526,16 +2525,18 @@ static int be_clear(struct be_adapter *adapter)
2526 2525
2527static void be_vf_setup_init(struct be_adapter *adapter) 2526static void be_vf_setup_init(struct be_adapter *adapter)
2528{ 2527{
2528 struct be_vf_cfg *vf_cfg;
2529 int vf; 2529 int vf;
2530 2530
2531 for (vf = 0; vf < num_vfs; vf++) { 2531 for_all_vfs(adapter, vf_cfg, vf) {
2532 adapter->vf_cfg[vf].vf_if_handle = -1; 2532 vf_cfg->if_handle = -1;
2533 adapter->vf_cfg[vf].vf_pmac_id = -1; 2533 vf_cfg->pmac_id = -1;
2534 } 2534 }
2535} 2535}
2536 2536
2537static int be_vf_setup(struct be_adapter *adapter) 2537static int be_vf_setup(struct be_adapter *adapter)
2538{ 2538{
2539 struct be_vf_cfg *vf_cfg;
2539 u32 cap_flags, en_flags, vf; 2540 u32 cap_flags, en_flags, vf;
2540 u16 lnk_speed; 2541 u16 lnk_speed;
2541 int status; 2542 int status;
@@ -2544,11 +2545,9 @@ static int be_vf_setup(struct be_adapter *adapter)
2544 2545
2545 cap_flags = en_flags = BE_IF_FLAGS_UNTAGGED | BE_IF_FLAGS_BROADCAST | 2546 cap_flags = en_flags = BE_IF_FLAGS_UNTAGGED | BE_IF_FLAGS_BROADCAST |
2546 BE_IF_FLAGS_MULTICAST; 2547 BE_IF_FLAGS_MULTICAST;
2547 2548 for_all_vfs(adapter, vf_cfg, vf) {
2548 for (vf = 0; vf < num_vfs; vf++) {
2549 status = be_cmd_if_create(adapter, cap_flags, en_flags, NULL, 2549 status = be_cmd_if_create(adapter, cap_flags, en_flags, NULL,
2550 &adapter->vf_cfg[vf].vf_if_handle, 2550 &vf_cfg->if_handle, NULL, vf + 1);
2551 NULL, vf+1);
2552 if (status) 2551 if (status)
2553 goto err; 2552 goto err;
2554 } 2553 }
@@ -2557,12 +2556,12 @@ static int be_vf_setup(struct be_adapter *adapter)
2557 if (status) 2556 if (status)
2558 goto err; 2557 goto err;
2559 2558
2560 for (vf = 0; vf < num_vfs; vf++) { 2559 for_all_vfs(adapter, vf_cfg, vf) {
2561 status = be_cmd_link_status_query(adapter, NULL, &lnk_speed, 2560 status = be_cmd_link_status_query(adapter, NULL, &lnk_speed,
2562 vf + 1); 2561 vf + 1);
2563 if (status) 2562 if (status)
2564 goto err; 2563 goto err;
2565 adapter->vf_cfg[vf].vf_tx_rate = lnk_speed * 10; 2564 vf_cfg->tx_rate = lnk_speed * 10;
2566 } 2565 }
2567 return 0; 2566 return 0;
2568err: 2567err:
@@ -2690,7 +2689,7 @@ static int be_setup(struct be_adapter *adapter)
2690 2689
2691 pcie_set_readrq(adapter->pdev, 4096); 2690 pcie_set_readrq(adapter->pdev, 4096);
2692 2691
2693 if (be_physfn(adapter) && adapter->sriov_enabled) { 2692 if (sriov_enabled(adapter)) {
2694 status = be_vf_setup(adapter); 2693 status = be_vf_setup(adapter);
2695 if (status) 2694 if (status)
2696 goto err; 2695 goto err;