Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'qlcnic-next'

Rajesh Borundia says:

====================
qlcnic: SR-IOV and FW-dump enhancements

This patch series contain following enhancements.

* SR-IOV enhancements:
- Allow SR-IOV VF's to probe in hypervisor. SR-IOV VF can be
uplinked to bridge/macvtap device with this change.
- Commands from VF are processed in process context
as it may sleep during PF-VF communication. Earlier
we use to process qlcnic_sriov_vf_set_multi function in
process context but now we process individual commands.
- As SR-IOV VF's can be uplinked to bridge/macvtap device
support mac-learning to allow communication through
embedded switch.

* FW-dump enhancement:
- Support to collect RDMEM section of firmware dump using
PEX DMA method for 82xx series adapter.

* Changes in v2:
- Removed unnecessary cast from void pointer to something
else and verified this issue in entire patch series as
per David Miller's suggestion.

Please apply this series to net-next.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+244 -203
+15 -3
drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
··· 39 39 40 40 #define _QLCNIC_LINUX_MAJOR 5 41 41 #define _QLCNIC_LINUX_MINOR 3 42 - #define _QLCNIC_LINUX_SUBVERSION 58 43 - #define QLCNIC_LINUX_VERSIONID "5.3.58" 42 + #define _QLCNIC_LINUX_SUBVERSION 59 43 + #define QLCNIC_LINUX_VERSIONID "5.3.59" 44 44 #define QLCNIC_DRV_IDC_VER 0x01 45 45 #define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\ 46 46 (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION)) ··· 1019 1019 #define QLCNIC_DEL_VXLAN_PORT 0x200000 1020 1020 #endif 1021 1021 1022 + #define QLCNIC_VLAN_FILTERING 0x800000 1023 + 1022 1024 #define QLCNIC_IS_MSI_FAMILY(adapter) \ 1023 1025 ((adapter)->flags & (QLCNIC_MSI_ENABLED | QLCNIC_MSIX_ENABLED)) 1024 1026 #define QLCNIC_IS_TSO_CAPABLE(adapter) \ ··· 1695 1693 int qlcnic_setup_netdev(struct qlcnic_adapter *, struct net_device *, int); 1696 1694 void qlcnic_set_netdev_features(struct qlcnic_adapter *, 1697 1695 struct qlcnic_esw_func_cfg *); 1698 - void qlcnic_sriov_vf_schedule_multi(struct net_device *); 1696 + void qlcnic_sriov_vf_set_multi(struct net_device *); 1699 1697 int qlcnic_is_valid_nic_func(struct qlcnic_adapter *, u8); 1700 1698 int qlcnic_get_pci_func_type(struct qlcnic_adapter *, u16, u16 *, u16 *, 1701 1699 u16 *); ··· 2355 2353 unsigned short device = adapter->pdev->device; 2356 2354 2357 2355 return (device == PCI_DEVICE_ID_QLOGIC_VF_QLE834X) ? true : false; 2356 + } 2357 + 2358 + static inline bool qlcnic_sriov_check(struct qlcnic_adapter *adapter) 2359 + { 2360 + bool status; 2361 + 2362 + status = (qlcnic_sriov_pf_check(adapter) || 2363 + qlcnic_sriov_vf_check(adapter)) ? true : false; 2364 + 2365 + return status; 2358 2366 } 2359 2367 2360 2368 static inline u32 qlcnic_get_vnic_func_count(struct qlcnic_adapter *adapter)
+10 -21
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
··· 3037 3037 QLCRDX(adapter->ahw, QLC_83XX_DRV_UNLOCK); 3038 3038 } 3039 3039 3040 - int qlcnic_83xx_ms_mem_write128(struct qlcnic_adapter *adapter, u64 addr, 3040 + int qlcnic_ms_mem_write128(struct qlcnic_adapter *adapter, u64 addr, 3041 3041 u32 *data, u32 count) 3042 3042 { 3043 3043 int i, j, ret = 0; 3044 3044 u32 temp; 3045 - int err = 0; 3046 3045 3047 3046 /* Check alignment */ 3048 3047 if (addr & 0xF) 3049 3048 return -EIO; 3050 3049 3051 3050 mutex_lock(&adapter->ahw->mem_lock); 3052 - qlcnic_83xx_wrt_reg_indirect(adapter, QLCNIC_MS_ADDR_HI, 0); 3051 + qlcnic_ind_wr(adapter, QLCNIC_MS_ADDR_HI, 0); 3053 3052 3054 3053 for (i = 0; i < count; i++, addr += 16) { 3055 3054 if (!((ADDR_IN_RANGE(addr, QLCNIC_ADDR_QDR_NET, ··· 3059 3060 return -EIO; 3060 3061 } 3061 3062 3062 - qlcnic_83xx_wrt_reg_indirect(adapter, QLCNIC_MS_ADDR_LO, addr); 3063 - qlcnic_83xx_wrt_reg_indirect(adapter, QLCNIC_MS_WRTDATA_LO, 3064 - *data++); 3065 - qlcnic_83xx_wrt_reg_indirect(adapter, QLCNIC_MS_WRTDATA_HI, 3066 - *data++); 3067 - qlcnic_83xx_wrt_reg_indirect(adapter, QLCNIC_MS_WRTDATA_ULO, 3068 - *data++); 3069 - qlcnic_83xx_wrt_reg_indirect(adapter, QLCNIC_MS_WRTDATA_UHI, 3070 - *data++); 3071 - qlcnic_83xx_wrt_reg_indirect(adapter, QLCNIC_MS_CTRL, 3072 - QLCNIC_TA_WRITE_ENABLE); 3073 - qlcnic_83xx_wrt_reg_indirect(adapter, QLCNIC_MS_CTRL, 3074 - QLCNIC_TA_WRITE_START); 3063 + qlcnic_ind_wr(adapter, QLCNIC_MS_ADDR_LO, addr); 3064 + qlcnic_ind_wr(adapter, QLCNIC_MS_WRTDATA_LO, *data++); 3065 + qlcnic_ind_wr(adapter, QLCNIC_MS_WRTDATA_HI, *data++); 3066 + qlcnic_ind_wr(adapter, QLCNIC_MS_WRTDATA_ULO, *data++); 3067 + qlcnic_ind_wr(adapter, QLCNIC_MS_WRTDATA_UHI, *data++); 3068 + qlcnic_ind_wr(adapter, QLCNIC_MS_CTRL, QLCNIC_TA_WRITE_ENABLE); 3069 + qlcnic_ind_wr(adapter, QLCNIC_MS_CTRL, QLCNIC_TA_WRITE_START); 3075 3070 3076 3071 for (j = 0; j < MAX_CTL_CHECK; j++) { 3077 - temp = QLCRD32(adapter, QLCNIC_MS_CTRL, &err); 3078 - if (err == -EIO) { 3079 - mutex_unlock(&adapter->ahw->mem_lock); 3080 - return err; 3081 - } 3072 + temp = qlcnic_ind_rd(adapter, QLCNIC_MS_CTRL); 3082 3073 3083 3074 if ((temp & TA_CTL_BUSY) == 0) 3084 3075 break;
+2 -2
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
··· 560 560 void qlcnic_83xx_napi_enable(struct qlcnic_adapter *); 561 561 void qlcnic_83xx_napi_disable(struct qlcnic_adapter *); 562 562 int qlcnic_83xx_config_led(struct qlcnic_adapter *, u32, u32); 563 - void qlcnic_ind_wr(struct qlcnic_adapter *, u32, u32); 563 + int qlcnic_ind_wr(struct qlcnic_adapter *, u32, u32); 564 564 int qlcnic_ind_rd(struct qlcnic_adapter *, u32); 565 565 int qlcnic_83xx_create_rx_ctx(struct qlcnic_adapter *); 566 566 int qlcnic_83xx_create_tx_ctx(struct qlcnic_adapter *, ··· 617 617 int qlcnic_83xx_lock_driver(struct qlcnic_adapter *); 618 618 void qlcnic_83xx_unlock_driver(struct qlcnic_adapter *); 619 619 int qlcnic_83xx_set_default_offload_settings(struct qlcnic_adapter *); 620 - int qlcnic_83xx_ms_mem_write128(struct qlcnic_adapter *, u64, u32 *, u32); 621 620 int qlcnic_83xx_idc_vnic_pf_entry(struct qlcnic_adapter *); 622 621 int qlcnic_83xx_disable_vnic_mode(struct qlcnic_adapter *, int); 623 622 int qlcnic_83xx_config_vnic_opmode(struct qlcnic_adapter *); ··· 658 659 u32 qlcnic_83xx_get_cap_size(void *, int); 659 660 void qlcnic_83xx_set_sys_info(void *, int, u32); 660 661 void qlcnic_83xx_store_cap_mask(void *, u32); 662 + int qlcnic_ms_mem_write128(struct qlcnic_adapter *, u64, u32 *, u32); 661 663 #endif
+6 -6
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
··· 1363 1363 return ret; 1364 1364 } 1365 1365 /* 16 byte write to MS memory */ 1366 - ret = qlcnic_83xx_ms_mem_write128(adapter, dest, (u32 *)p_cache, 1367 - size / 16); 1366 + ret = qlcnic_ms_mem_write128(adapter, dest, (u32 *)p_cache, 1367 + size / 16); 1368 1368 if (ret) { 1369 1369 vfree(p_cache); 1370 1370 return ret; ··· 1389 1389 p_cache = (u32 *)fw->data; 1390 1390 addr = (u64)dest; 1391 1391 1392 - ret = qlcnic_83xx_ms_mem_write128(adapter, addr, 1393 - p_cache, size / 16); 1392 + ret = qlcnic_ms_mem_write128(adapter, addr, 1393 + p_cache, size / 16); 1394 1394 if (ret) { 1395 1395 dev_err(&adapter->pdev->dev, "MS memory write failed\n"); 1396 1396 release_firmware(fw); ··· 1405 1405 data[i] = fw->data[size + i]; 1406 1406 for (; i < 16; i++) 1407 1407 data[i] = 0; 1408 - ret = qlcnic_83xx_ms_mem_write128(adapter, addr, 1409 - (u32 *)data, 1); 1408 + ret = qlcnic_ms_mem_write128(adapter, addr, 1409 + (u32 *)data, 1); 1410 1410 if (ret) { 1411 1411 dev_err(&adapter->pdev->dev, 1412 1412 "MS memory write failed\n");
+11 -21
drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c
··· 373 373 return data; 374 374 } 375 375 376 - void qlcnic_ind_wr(struct qlcnic_adapter *adapter, u32 addr, u32 data) 376 + int qlcnic_ind_wr(struct qlcnic_adapter *adapter, u32 addr, u32 data) 377 377 { 378 + int ret = 0; 379 + 378 380 if (qlcnic_82xx_check(adapter)) 379 381 qlcnic_write_window_reg(addr, adapter->ahw->pci_base0, data); 380 382 else 381 - qlcnic_83xx_wrt_reg_indirect(adapter, addr, data); 383 + ret = qlcnic_83xx_wrt_reg_indirect(adapter, addr, data); 384 + 385 + return ret; 382 386 } 383 387 384 388 static int ··· 571 567 void qlcnic_set_multi(struct net_device *netdev) 572 568 { 573 569 struct qlcnic_adapter *adapter = netdev_priv(netdev); 574 - struct qlcnic_mac_vlan_list *cur; 575 - struct netdev_hw_addr *ha; 576 - size_t temp; 577 570 578 571 if (!test_bit(__QLCNIC_FW_ATTACHED, &adapter->state)) 579 572 return; 580 - if (qlcnic_sriov_vf_check(adapter)) { 581 - if (!netdev_mc_empty(netdev)) { 582 - netdev_for_each_mc_addr(ha, netdev) { 583 - temp = sizeof(struct qlcnic_mac_vlan_list); 584 - cur = kzalloc(temp, GFP_ATOMIC); 585 - if (cur == NULL) 586 - break; 587 - memcpy(cur->mac_addr, 588 - ha->addr, ETH_ALEN); 589 - list_add_tail(&cur->list, &adapter->vf_mc_list); 590 - } 591 - } 592 - qlcnic_sriov_vf_schedule_multi(adapter->netdev); 593 - return; 594 - } 595 - __qlcnic_set_multi(netdev, 0); 573 + 574 + if (qlcnic_sriov_vf_check(adapter)) 575 + qlcnic_sriov_vf_set_multi(netdev); 576 + else 577 + __qlcnic_set_multi(netdev, 0); 596 578 } 597 579 598 580 int qlcnic_82xx_nic_set_promisc(struct qlcnic_adapter *adapter, u32 mode)
+4 -8
drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
··· 313 313 u16 vlan_id = 0; 314 314 u8 hindex, hval; 315 315 316 - if (!qlcnic_sriov_pf_check(adapter)) { 317 - if (ether_addr_equal(phdr->h_source, adapter->mac_addr)) 318 - return; 319 - } else { 316 + if (ether_addr_equal(phdr->h_source, adapter->mac_addr)) 317 + return; 318 + 319 + if (adapter->flags & QLCNIC_VLAN_FILTERING) { 320 320 if (protocol == ETH_P_8021Q) { 321 321 vh = (struct vlan_ethhdr *)skb->data; 322 322 vlan_id = ntohs(vh->h_vlan_TCI); 323 323 } else if (vlan_tx_tag_present(skb)) { 324 324 vlan_id = vlan_tx_tag_get(skb); 325 325 } 326 - 327 - if (ether_addr_equal(phdr->h_source, adapter->mac_addr) && 328 - !vlan_id) 329 - return; 330 326 } 331 327 332 328 memcpy(&src_addr, phdr->h_source, ETH_ALEN);
+15 -10
drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
··· 378 378 if (!adapter->fdb_mac_learn) 379 379 return ndo_dflt_fdb_del(ndm, tb, netdev, addr); 380 380 381 - if (adapter->flags & QLCNIC_ESWITCH_ENABLED) { 381 + if ((adapter->flags & QLCNIC_ESWITCH_ENABLED) || 382 + qlcnic_sriov_check(adapter)) { 382 383 if (is_unicast_ether_addr(addr)) { 383 384 err = dev_uc_del(netdev, addr); 384 385 if (!err) ··· 403 402 if (!adapter->fdb_mac_learn) 404 403 return ndo_dflt_fdb_add(ndm, tb, netdev, addr, flags); 405 404 406 - if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED)) { 405 + if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED) && 406 + !qlcnic_sriov_check(adapter)) { 407 407 pr_info("%s: FDB e-switch is not enabled\n", __func__); 408 408 return -EOPNOTSUPP; 409 409 } ··· 434 432 if (!adapter->fdb_mac_learn) 435 433 return ndo_dflt_fdb_dump(skb, ncb, netdev, idx); 436 434 437 - if (adapter->flags & QLCNIC_ESWITCH_ENABLED) 435 + if ((adapter->flags & QLCNIC_ESWITCH_ENABLED) || 436 + qlcnic_sriov_check(adapter)) 438 437 idx = ndo_dflt_fdb_dump(skb, ncb, netdev, idx); 439 438 440 439 return idx; ··· 1920 1917 if (!test_and_clear_bit(__QLCNIC_DEV_UP, &adapter->state)) 1921 1918 return; 1922 1919 1923 - if (qlcnic_sriov_vf_check(adapter)) 1924 - qlcnic_sriov_cleanup_async_list(&adapter->ahw->sriov->bc); 1925 1920 smp_mb(); 1926 1921 netif_carrier_off(netdev); 1927 1922 adapter->ahw->linkup = 0; ··· 1931 1930 qlcnic_delete_lb_filters(adapter); 1932 1931 1933 1932 qlcnic_nic_set_promisc(adapter, QLCNIC_NIU_NON_PROMISC_MODE); 1933 + if (qlcnic_sriov_vf_check(adapter)) 1934 + qlcnic_sriov_cleanup_async_list(&adapter->ahw->sriov->bc); 1934 1935 1935 1936 qlcnic_napi_disable(adapter); 1936 1937 ··· 2401 2398 int err, pci_using_dac = -1; 2402 2399 char board_name[QLCNIC_MAX_BOARD_NAME_LEN + 19]; /* MAC + ": " + name */ 2403 2400 2404 - if (pdev->is_virtfn) 2405 - return -ENODEV; 2406 - 2407 2401 err = pci_enable_device(pdev); 2408 2402 if (err) 2409 2403 return err; ··· 2680 2680 return; 2681 2681 2682 2682 netdev = adapter->netdev; 2683 - qlcnic_sriov_pf_disable(adapter); 2684 2683 2685 2684 qlcnic_cancel_idc_work(adapter); 2685 + qlcnic_sriov_pf_disable(adapter); 2686 2686 ahw = adapter->ahw; 2687 2687 2688 2688 unregister_netdev(netdev); ··· 2812 2812 return 0; 2813 2813 } 2814 2814 2815 + #define QLCNIC_VF_LB_BUCKET_SIZE 1 2816 + 2815 2817 void qlcnic_alloc_lb_filters_mem(struct qlcnic_adapter *adapter) 2816 2818 { 2817 2819 void *head; ··· 2829 2827 spin_lock_init(&adapter->mac_learn_lock); 2830 2828 spin_lock_init(&adapter->rx_mac_learn_lock); 2831 2829 2832 - if (qlcnic_82xx_check(adapter)) { 2830 + if (qlcnic_sriov_vf_check(adapter)) { 2831 + filter_size = QLCNIC_83XX_SRIOV_VF_MAX_MAC - 1; 2832 + adapter->fhash.fbucket_size = QLCNIC_VF_LB_BUCKET_SIZE; 2833 + } else if (qlcnic_82xx_check(adapter)) { 2833 2834 filter_size = QLCNIC_LB_MAX_FILTERS; 2834 2835 adapter->fhash.fbucket_size = QLCNIC_LB_BUCKET_SIZE; 2835 2836 } else {
+18 -19
drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c
··· 238 238 239 239 hdr->drv_cap_mask = hdr->cap_mask; 240 240 fw_dump->cap_mask = hdr->cap_mask; 241 + 242 + fw_dump->use_pex_dma = (hdr->capabilities & BIT_0) ? true : false; 241 243 } 242 244 243 245 inline u32 qlcnic_82xx_get_cap_size(void *t_hdr, int index) ··· 278 276 hdr->saved_state[index] = value; 279 277 } 280 278 279 + #define QLCNIC_TEMPLATE_VERSION (0x20001) 280 + 281 281 void qlcnic_83xx_cache_tmpl_hdr_values(struct qlcnic_fw_dump *fw_dump) 282 282 { 283 283 struct qlcnic_83xx_dump_template_hdr *hdr; ··· 292 288 293 289 hdr->drv_cap_mask = hdr->cap_mask; 294 290 fw_dump->cap_mask = hdr->cap_mask; 291 + 292 + fw_dump->use_pex_dma = (fw_dump->version & 0xfffff) >= 293 + QLCNIC_TEMPLATE_VERSION; 295 294 } 296 295 297 296 inline u32 qlcnic_83xx_get_cap_size(void *t_hdr, int index) ··· 665 658 static int qlcnic_start_pex_dma(struct qlcnic_adapter *adapter, 666 659 struct __mem *mem) 667 660 { 668 - struct qlcnic_83xx_dump_template_hdr *tmpl_hdr; 669 661 struct device *dev = &adapter->pdev->dev; 670 662 u32 dma_no, dma_base_addr, temp_addr; 671 663 int i, ret, dma_sts; 664 + void *tmpl_hdr; 672 665 673 666 tmpl_hdr = adapter->ahw->fw_dump.tmpl_hdr; 674 - dma_no = tmpl_hdr->saved_state[QLC_83XX_DMA_ENGINE_INDEX]; 667 + dma_no = qlcnic_get_saved_state(adapter, tmpl_hdr, 668 + QLC_83XX_DMA_ENGINE_INDEX); 675 669 dma_base_addr = QLC_DMA_REG_BASE_ADDR(dma_no); 676 670 677 671 temp_addr = dma_base_addr + QLC_DMA_CMD_BUFF_ADDR_LOW; 678 - ret = qlcnic_83xx_wrt_reg_indirect(adapter, temp_addr, 679 - mem->desc_card_addr); 672 + ret = qlcnic_ind_wr(adapter, temp_addr, mem->desc_card_addr); 680 673 if (ret) 681 674 return ret; 682 675 683 676 temp_addr = dma_base_addr + QLC_DMA_CMD_BUFF_ADDR_HI; 684 - ret = qlcnic_83xx_wrt_reg_indirect(adapter, temp_addr, 0); 677 + ret = qlcnic_ind_wr(adapter, temp_addr, 0); 685 678 if (ret) 686 679 return ret; 687 680 688 681 temp_addr = dma_base_addr + QLC_DMA_CMD_STATUS_CTRL; 689 - ret = qlcnic_83xx_wrt_reg_indirect(adapter, temp_addr, 690 - mem->start_dma_cmd); 682 + ret = qlcnic_ind_wr(adapter, temp_addr, mem->start_dma_cmd); 691 683 if (ret) 692 684 return ret; 693 685 ··· 716 710 struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump; 717 711 u32 temp, dma_base_addr, size = 0, read_size = 0; 718 712 struct qlcnic_pex_dma_descriptor *dma_descr; 719 - struct qlcnic_83xx_dump_template_hdr *tmpl_hdr; 720 713 struct device *dev = &adapter->pdev->dev; 721 714 dma_addr_t dma_phys_addr; 722 715 void *dma_buffer; 716 + void *tmpl_hdr; 723 717 724 718 tmpl_hdr = fw_dump->tmpl_hdr; 725 719 726 720 /* Check if DMA engine is available */ 727 - temp = tmpl_hdr->saved_state[QLC_83XX_DMA_ENGINE_INDEX]; 721 + temp = qlcnic_get_saved_state(adapter, tmpl_hdr, 722 + QLC_83XX_DMA_ENGINE_INDEX); 728 723 dma_base_addr = QLC_DMA_REG_BASE_ADDR(temp); 729 724 temp = qlcnic_ind_rd(adapter, 730 725 dma_base_addr + QLC_DMA_CMD_STATUS_CTRL); ··· 771 764 772 765 /* Write DMA descriptor to MS memory*/ 773 766 temp = sizeof(struct qlcnic_pex_dma_descriptor) / 16; 774 - *ret = qlcnic_83xx_ms_mem_write128(adapter, mem->desc_card_addr, 775 - (u32 *)dma_descr, temp); 767 + *ret = qlcnic_ms_mem_write128(adapter, mem->desc_card_addr, 768 + (u32 *)dma_descr, temp); 776 769 if (*ret) { 777 770 dev_info(dev, "Failed to write DMA descriptor to MS memory at address 0x%x\n", 778 771 mem->desc_card_addr); ··· 1148 1141 return err; 1149 1142 } 1150 1143 1151 - #define QLCNIC_TEMPLATE_VERSION (0x20001) 1152 - 1153 1144 int qlcnic_fw_cmd_get_minidump_temp(struct qlcnic_adapter *adapter) 1154 1145 { 1155 1146 struct qlcnic_hardware_context *ahw; ··· 1207 1202 dev_info(&adapter->pdev->dev, 1208 1203 "Default minidump capture mask 0x%x\n", 1209 1204 fw_dump->cap_mask); 1210 - 1211 - if (qlcnic_83xx_check(adapter) && 1212 - (fw_dump->version & 0xfffff) >= QLCNIC_TEMPLATE_VERSION) 1213 - fw_dump->use_pex_dma = true; 1214 - else 1215 - fw_dump->use_pex_dma = false; 1216 1205 1217 1206 qlcnic_enable_fw_dump_state(adapter); 1218 1207
+3 -1
drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov.h
··· 52 52 QLCNIC_BC_CMD_CFG_GUEST_VLAN = 0x3, 53 53 }; 54 54 55 + #define QLCNIC_83XX_SRIOV_VF_MAX_MAC 2 55 56 #define QLC_BC_CMD 1 56 57 57 58 struct qlcnic_trans_list { ··· 152 151 struct qlcnic_trans_list rcv_pend; 153 152 struct qlcnic_adapter *adapter; 154 153 struct qlcnic_vport *vp; 155 - struct mutex vlan_list_lock; /* Lock for VLAN list */ 154 + spinlock_t vlan_list_lock; /* Lock for VLAN list */ 156 155 }; 157 156 158 157 struct qlcnic_async_work_list { 159 158 struct list_head list; 160 159 struct work_struct work; 161 160 void *ptr; 161 + struct qlcnic_cmd_args *cmd; 162 162 }; 163 163 164 164 struct qlcnic_back_channel {
+113 -75
drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c
··· 39 39 static void qlcnic_sriov_process_bc_cmd(struct work_struct *); 40 40 static int qlcnic_sriov_vf_shutdown(struct pci_dev *); 41 41 static int qlcnic_sriov_vf_resume(struct qlcnic_adapter *); 42 + static int qlcnic_sriov_async_issue_cmd(struct qlcnic_adapter *, 43 + struct qlcnic_cmd_args *); 42 44 43 45 static struct qlcnic_hardware_ops qlcnic_sriov_vf_hw_ops = { 44 46 .read_crb = qlcnic_83xx_read_crb, ··· 183 181 vf->adapter = adapter; 184 182 vf->pci_func = qlcnic_sriov_virtid_fn(adapter, i); 185 183 mutex_init(&vf->send_cmd_lock); 186 - mutex_init(&vf->vlan_list_lock); 184 + spin_lock_init(&vf->vlan_list_lock); 187 185 INIT_LIST_HEAD(&vf->rcv_act.wait_list); 188 186 INIT_LIST_HEAD(&vf->rcv_pend.wait_list); 189 187 spin_lock_init(&vf->rcv_act.lock); ··· 199 197 goto qlcnic_destroy_async_wq; 200 198 } 201 199 sriov->vf_info[i].vp = vp; 200 + vp->vlan_mode = QLC_GUEST_VLAN_MODE; 202 201 vp->max_tx_bw = MAX_BW; 203 - vp->spoofchk = true; 202 + vp->spoofchk = false; 204 203 random_ether_addr(vp->mac); 205 204 dev_info(&adapter->pdev->dev, 206 205 "MAC Address %pM is configured for VF %d\n", ··· 518 515 { 519 516 int err; 520 517 518 + adapter->flags |= QLCNIC_VLAN_FILTERING; 519 + adapter->ahw->total_nic_func = 1; 521 520 INIT_LIST_HEAD(&adapter->vf_mc_list); 522 521 if (!qlcnic_use_msi_x && !!qlcnic_use_msi) 523 522 dev_warn(&adapter->pdev->dev, ··· 775 770 cmd->req.arg = (u32 *)trans->req_pay; 776 771 cmd->rsp.arg = (u32 *)trans->rsp_pay; 777 772 cmd_op = cmd->req.arg[0] & 0xff; 773 + cmd->cmd_op = cmd_op; 778 774 remainder = (trans->rsp_pay_size) % (bc_pay_sz); 779 775 num_frags = (trans->rsp_pay_size) / (bc_pay_sz); 780 776 if (remainder) ··· 1362 1356 return -EIO; 1363 1357 } 1364 1358 1365 - static int qlcnic_sriov_issue_cmd(struct qlcnic_adapter *adapter, 1359 + static int __qlcnic_sriov_issue_cmd(struct qlcnic_adapter *adapter, 1366 1360 struct qlcnic_cmd_args *cmd) 1367 1361 { 1368 1362 struct qlcnic_hardware_context *ahw = adapter->ahw; ··· 1414 1408 (mbx_err_code == QLCNIC_MBX_PORT_RSP_OK)) { 1415 1409 rsp = QLCNIC_RCODE_SUCCESS; 1416 1410 } else { 1417 - rsp = mbx_err_code; 1418 - if (!rsp) 1419 - rsp = 1; 1420 - dev_err(dev, 1421 - "MBX command 0x%x failed with err:0x%x for VF %d\n", 1422 - opcode, mbx_err_code, func); 1411 + if (cmd->type == QLC_83XX_MBX_CMD_NO_WAIT) { 1412 + rsp = QLCNIC_RCODE_SUCCESS; 1413 + } else { 1414 + rsp = mbx_err_code; 1415 + if (!rsp) 1416 + rsp = 1; 1417 + 1418 + dev_err(dev, 1419 + "MBX command 0x%x failed with err:0x%x for VF %d\n", 1420 + opcode, mbx_err_code, func); 1421 + } 1423 1422 } 1424 1423 1425 1424 err_out: ··· 1437 1426 cleanup_transaction: 1438 1427 qlcnic_sriov_cleanup_transaction(trans); 1439 1428 return rsp; 1429 + } 1430 + 1431 + 1432 + static int qlcnic_sriov_issue_cmd(struct qlcnic_adapter *adapter, 1433 + struct qlcnic_cmd_args *cmd) 1434 + { 1435 + if (cmd->type == QLC_83XX_MBX_CMD_NO_WAIT) 1436 + return qlcnic_sriov_async_issue_cmd(adapter, cmd); 1437 + else 1438 + return __qlcnic_sriov_issue_cmd(adapter, cmd); 1440 1439 } 1441 1440 1442 1441 static int qlcnic_sriov_channel_cfg_cmd(struct qlcnic_adapter *adapter, u8 cmd_op) ··· 1479 1458 return ret; 1480 1459 } 1481 1460 1482 - static void qlcnic_vf_add_mc_list(struct net_device *netdev) 1461 + static void qlcnic_vf_add_mc_list(struct net_device *netdev, const u8 *mac) 1483 1462 { 1484 1463 struct qlcnic_adapter *adapter = netdev_priv(netdev); 1485 1464 struct qlcnic_sriov *sriov = adapter->ahw->sriov; 1486 - struct qlcnic_mac_vlan_list *cur; 1487 - struct list_head *head, tmp_list; 1488 1465 struct qlcnic_vf_info *vf; 1489 1466 u16 vlan_id; 1490 1467 int i; 1491 1468 1492 - static const u8 bcast_addr[ETH_ALEN] = { 1493 - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff 1494 - }; 1495 - 1496 1469 vf = &adapter->ahw->sriov->vf_info[0]; 1497 - INIT_LIST_HEAD(&tmp_list); 1498 - head = &adapter->vf_mc_list; 1499 - netif_addr_lock_bh(netdev); 1500 1470 1501 - while (!list_empty(head)) { 1502 - cur = list_entry(head->next, struct qlcnic_mac_vlan_list, list); 1503 - list_move(&cur->list, &tmp_list); 1504 - } 1505 - 1506 - netif_addr_unlock_bh(netdev); 1507 - 1508 - while (!list_empty(&tmp_list)) { 1509 - cur = list_entry((&tmp_list)->next, 1510 - struct qlcnic_mac_vlan_list, list); 1511 - if (!qlcnic_sriov_check_any_vlan(vf)) { 1512 - qlcnic_nic_add_mac(adapter, bcast_addr, 0); 1513 - qlcnic_nic_add_mac(adapter, cur->mac_addr, 0); 1514 - } else { 1515 - mutex_lock(&vf->vlan_list_lock); 1516 - for (i = 0; i < sriov->num_allowed_vlans; i++) { 1517 - vlan_id = vf->sriov_vlans[i]; 1518 - if (vlan_id) { 1519 - qlcnic_nic_add_mac(adapter, bcast_addr, 1520 - vlan_id); 1521 - qlcnic_nic_add_mac(adapter, 1522 - cur->mac_addr, 1523 - vlan_id); 1524 - } 1525 - } 1526 - mutex_unlock(&vf->vlan_list_lock); 1527 - if (qlcnic_84xx_check(adapter)) { 1528 - qlcnic_nic_add_mac(adapter, bcast_addr, 0); 1529 - qlcnic_nic_add_mac(adapter, cur->mac_addr, 0); 1530 - } 1471 + if (!qlcnic_sriov_check_any_vlan(vf)) { 1472 + qlcnic_nic_add_mac(adapter, mac, 0); 1473 + } else { 1474 + spin_lock(&vf->vlan_list_lock); 1475 + for (i = 0; i < sriov->num_allowed_vlans; i++) { 1476 + vlan_id = vf->sriov_vlans[i]; 1477 + if (vlan_id) 1478 + qlcnic_nic_add_mac(adapter, mac, vlan_id); 1531 1479 } 1532 - list_del(&cur->list); 1533 - kfree(cur); 1480 + spin_unlock(&vf->vlan_list_lock); 1481 + if (qlcnic_84xx_check(adapter)) 1482 + qlcnic_nic_add_mac(adapter, mac, 0); 1534 1483 } 1535 1484 } 1536 1485 ··· 1509 1518 struct list_head *head = &bc->async_list; 1510 1519 struct qlcnic_async_work_list *entry; 1511 1520 1521 + flush_workqueue(bc->bc_async_wq); 1512 1522 while (!list_empty(head)) { 1513 1523 entry = list_entry(head->next, struct qlcnic_async_work_list, 1514 1524 list); ··· 1519 1527 } 1520 1528 } 1521 1529 1522 - static void qlcnic_sriov_vf_set_multi(struct net_device *netdev) 1530 + void qlcnic_sriov_vf_set_multi(struct net_device *netdev) 1523 1531 { 1524 1532 struct qlcnic_adapter *adapter = netdev_priv(netdev); 1525 1533 struct qlcnic_hardware_context *ahw = adapter->ahw; 1534 + static const u8 bcast_addr[ETH_ALEN] = { 1535 + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff 1536 + }; 1537 + struct netdev_hw_addr *ha; 1526 1538 u32 mode = VPORT_MISS_MODE_DROP; 1527 1539 1528 1540 if (!test_bit(__QLCNIC_FW_ATTACHED, &adapter->state)) ··· 1538 1542 } else if ((netdev->flags & IFF_ALLMULTI) || 1539 1543 (netdev_mc_count(netdev) > ahw->max_mc_count)) { 1540 1544 mode = VPORT_MISS_MODE_ACCEPT_MULTI; 1545 + } else { 1546 + qlcnic_vf_add_mc_list(netdev, bcast_addr); 1547 + if (!netdev_mc_empty(netdev)) { 1548 + netdev_for_each_mc_addr(ha, netdev) 1549 + qlcnic_vf_add_mc_list(netdev, ha->addr); 1550 + } 1541 1551 } 1542 1552 1543 - if (qlcnic_sriov_vf_check(adapter)) 1544 - qlcnic_vf_add_mc_list(netdev); 1553 + /* configure unicast MAC address, if there is not sufficient space 1554 + * to store all the unicast addresses then enable promiscuous mode 1555 + */ 1556 + if (netdev_uc_count(netdev) > ahw->max_uc_count) { 1557 + mode = VPORT_MISS_MODE_ACCEPT_ALL; 1558 + } else if (!netdev_uc_empty(netdev)) { 1559 + netdev_for_each_uc_addr(ha, netdev) 1560 + qlcnic_vf_add_mc_list(netdev, ha->addr); 1561 + } 1562 + 1563 + if (adapter->pdev->is_virtfn) { 1564 + if (mode == VPORT_MISS_MODE_ACCEPT_ALL && 1565 + !adapter->fdb_mac_learn) { 1566 + qlcnic_alloc_lb_filters_mem(adapter); 1567 + adapter->drv_mac_learn = 1; 1568 + adapter->rx_mac_learn = true; 1569 + } else { 1570 + adapter->drv_mac_learn = 0; 1571 + adapter->rx_mac_learn = false; 1572 + } 1573 + } 1545 1574 1546 1575 qlcnic_nic_set_promisc(adapter, mode); 1547 1576 } 1548 1577 1549 - static void qlcnic_sriov_handle_async_multi(struct work_struct *work) 1578 + static void qlcnic_sriov_handle_async_issue_cmd(struct work_struct *work) 1550 1579 { 1551 1580 struct qlcnic_async_work_list *entry; 1552 - struct net_device *netdev; 1581 + struct qlcnic_adapter *adapter; 1582 + struct qlcnic_cmd_args *cmd; 1553 1583 1554 1584 entry = container_of(work, struct qlcnic_async_work_list, work); 1555 - netdev = (struct net_device *)entry->ptr; 1556 - 1557 - qlcnic_sriov_vf_set_multi(netdev); 1585 + adapter = entry->ptr; 1586 + cmd = entry->cmd; 1587 + __qlcnic_sriov_issue_cmd(adapter, cmd); 1558 1588 return; 1559 1589 } 1560 1590 ··· 1610 1588 return entry; 1611 1589 } 1612 1590 1613 - static void qlcnic_sriov_schedule_bc_async_work(struct qlcnic_back_channel *bc, 1614 - work_func_t func, void *data) 1591 + static void qlcnic_sriov_schedule_async_cmd(struct qlcnic_back_channel *bc, 1592 + work_func_t func, void *data, 1593 + struct qlcnic_cmd_args *cmd) 1615 1594 { 1616 1595 struct qlcnic_async_work_list *entry = NULL; 1617 1596 ··· 1621 1598 return; 1622 1599 1623 1600 entry->ptr = data; 1601 + entry->cmd = cmd; 1624 1602 INIT_WORK(&entry->work, func); 1625 1603 queue_work(bc->bc_async_wq, &entry->work); 1626 1604 } 1627 1605 1628 - void qlcnic_sriov_vf_schedule_multi(struct net_device *netdev) 1606 + static int qlcnic_sriov_async_issue_cmd(struct qlcnic_adapter *adapter, 1607 + struct qlcnic_cmd_args *cmd) 1629 1608 { 1630 1609 1631 - struct qlcnic_adapter *adapter = netdev_priv(netdev); 1632 1610 struct qlcnic_back_channel *bc = &adapter->ahw->sriov->bc; 1633 1611 1634 1612 if (adapter->need_fw_reset) 1635 - return; 1613 + return -EIO; 1636 1614 1637 - qlcnic_sriov_schedule_bc_async_work(bc, qlcnic_sriov_handle_async_multi, 1638 - netdev); 1615 + qlcnic_sriov_schedule_async_cmd(bc, qlcnic_sriov_handle_async_issue_cmd, 1616 + adapter, cmd); 1617 + return 0; 1639 1618 } 1640 1619 1641 1620 static int qlcnic_sriov_vf_reinit_driver(struct qlcnic_adapter *adapter) ··· 1861 1836 return 0; 1862 1837 } 1863 1838 1839 + static void qlcnic_sriov_vf_periodic_tasks(struct qlcnic_adapter *adapter) 1840 + { 1841 + if (adapter->fhash.fnum) 1842 + qlcnic_prune_lb_filters(adapter); 1843 + } 1844 + 1864 1845 static void qlcnic_sriov_vf_poll_dev_state(struct work_struct *work) 1865 1846 { 1866 1847 struct qlcnic_adapter *adapter; ··· 1898 1867 } 1899 1868 1900 1869 idc->prev_state = idc->curr_state; 1870 + qlcnic_sriov_vf_periodic_tasks(adapter); 1871 + 1901 1872 if (!ret && test_bit(QLC_83XX_MODULE_LOADED, &idc->status)) 1902 1873 qlcnic_schedule_work(adapter, qlcnic_sriov_vf_poll_dev_state, 1903 1874 idc->delay); ··· 1923 1890 if (!vf->sriov_vlans) 1924 1891 return err; 1925 1892 1926 - mutex_lock(&vf->vlan_list_lock); 1893 + spin_lock_bh(&vf->vlan_list_lock); 1927 1894 1928 1895 for (i = 0; i < sriov->num_allowed_vlans; i++) { 1929 1896 if (vf->sriov_vlans[i] == vlan_id) { ··· 1932 1899 } 1933 1900 } 1934 1901 1935 - mutex_unlock(&vf->vlan_list_lock); 1902 + spin_unlock_bh(&vf->vlan_list_lock); 1936 1903 return err; 1937 1904 } 1938 1905 ··· 1941 1908 { 1942 1909 int err = 0; 1943 1910 1944 - mutex_lock(&vf->vlan_list_lock); 1911 + spin_lock_bh(&vf->vlan_list_lock); 1945 1912 1946 1913 if (vf->num_vlan >= sriov->num_allowed_vlans) 1947 1914 err = -EINVAL; 1948 1915 1949 - mutex_unlock(&vf->vlan_list_lock); 1916 + spin_unlock_bh(&vf->vlan_list_lock); 1950 1917 return err; 1951 1918 } 1952 1919 ··· 1999 1966 if (!vf->sriov_vlans) 2000 1967 return; 2001 1968 2002 - mutex_lock(&vf->vlan_list_lock); 1969 + spin_lock_bh(&vf->vlan_list_lock); 2003 1970 2004 1971 switch (opcode) { 2005 1972 case QLC_VLAN_ADD: ··· 2012 1979 netdev_err(adapter->netdev, "Invalid VLAN operation\n"); 2013 1980 } 2014 1981 2015 - mutex_unlock(&vf->vlan_list_lock); 1982 + spin_unlock_bh(&vf->vlan_list_lock); 2016 1983 return; 2017 1984 } 2018 1985 ··· 2020 1987 u16 vid, u8 enable) 2021 1988 { 2022 1989 struct qlcnic_sriov *sriov = adapter->ahw->sriov; 1990 + struct net_device *netdev = adapter->netdev; 2023 1991 struct qlcnic_vf_info *vf; 2024 1992 struct qlcnic_cmd_args cmd; 2025 1993 int ret; ··· 2046 2012 dev_err(&adapter->pdev->dev, 2047 2013 "Failed to configure guest VLAN, err=%d\n", ret); 2048 2014 } else { 2015 + netif_addr_lock_bh(netdev); 2049 2016 qlcnic_free_mac_list(adapter); 2017 + netif_addr_unlock_bh(netdev); 2050 2018 2051 2019 if (enable) 2052 2020 qlcnic_sriov_vlan_operation(vf, vid, QLC_VLAN_ADD); 2053 2021 else 2054 2022 qlcnic_sriov_vlan_operation(vf, vid, QLC_VLAN_DELETE); 2055 2023 2056 - qlcnic_set_multi(adapter->netdev); 2024 + netif_addr_lock_bh(netdev); 2025 + qlcnic_set_multi(netdev); 2026 + netif_addr_unlock_bh(netdev); 2057 2027 } 2058 2028 2059 2029 qlcnic_free_mbx_args(&cmd); ··· 2188 2150 { 2189 2151 bool err = false; 2190 2152 2191 - mutex_lock(&vf->vlan_list_lock); 2153 + spin_lock_bh(&vf->vlan_list_lock); 2192 2154 2193 2155 if (vf->num_vlan) 2194 2156 err = true; 2195 2157 2196 - mutex_unlock(&vf->vlan_list_lock); 2158 + spin_unlock_bh(&vf->vlan_list_lock); 2197 2159 return err; 2198 2160 }
+47 -37
drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c
··· 84 84 info->max_tx_ques = res->num_tx_queues / max; 85 85 86 86 if (qlcnic_83xx_pf_check(adapter)) 87 - num_macs = 1; 87 + num_macs = QLCNIC_83XX_SRIOV_VF_MAX_MAC; 88 88 89 89 info->max_rx_mcast_mac_filters = res->num_rx_mcast_mac_filters; 90 90 ··· 338 338 339 339 cmd.req.arg[1] = 0x4; 340 340 if (enable) { 341 + adapter->flags |= QLCNIC_VLAN_FILTERING; 341 342 cmd.req.arg[1] |= BIT_16; 342 343 if (qlcnic_84xx_check(adapter)) 343 344 cmd.req.arg[1] |= QLC_SRIOV_ALLOW_VLAN0; 345 + } else { 346 + adapter->flags &= ~QLCNIC_VLAN_FILTERING; 344 347 } 345 348 346 349 err = qlcnic_issue_cmd(adapter, &cmd); ··· 475 472 return -EPERM; 476 473 } 477 474 475 + qlcnic_sriov_pf_disable(adapter); 476 + 478 477 rtnl_lock(); 479 478 if (netif_running(netdev)) 480 479 __qlcnic_down(adapter, netdev); 481 - 482 - qlcnic_sriov_pf_disable(adapter); 483 480 484 481 qlcnic_sriov_free_vlans(adapter); 485 482 ··· 599 596 600 597 qlcnic_sriov_alloc_vlans(adapter); 601 598 602 - err = qlcnic_sriov_pf_enable(adapter, num_vfs); 603 599 return err; 604 600 605 601 del_flr_queue: ··· 629 627 __qlcnic_down(adapter, netdev); 630 628 631 629 err = __qlcnic_pci_sriov_enable(adapter, num_vfs); 632 - if (err) { 633 - netdev_info(netdev, "Failed to enable SR-IOV on port %d\n", 634 - adapter->portnum); 630 + if (err) 631 + goto error; 635 632 636 - err = -EIO; 637 - if (qlcnic_83xx_configure_opmode(adapter)) 638 - goto error; 639 - } else { 633 + if (netif_running(netdev)) 634 + __qlcnic_up(adapter, netdev); 635 + 636 + rtnl_unlock(); 637 + err = qlcnic_sriov_pf_enable(adapter, num_vfs); 638 + if (!err) { 640 639 netdev_info(netdev, 641 640 "SR-IOV is enabled successfully on port %d\n", 642 641 adapter->portnum); 643 642 /* Return number of vfs enabled */ 644 - err = num_vfs; 643 + return num_vfs; 645 644 } 645 + 646 + rtnl_lock(); 646 647 if (netif_running(netdev)) 647 - __qlcnic_up(adapter, netdev); 648 + __qlcnic_down(adapter, netdev); 648 649 649 650 error: 651 + if (!qlcnic_83xx_configure_opmode(adapter)) { 652 + if (netif_running(netdev)) 653 + __qlcnic_up(adapter, netdev); 654 + } 655 + 650 656 rtnl_unlock(); 657 + netdev_info(netdev, "Failed to enable SR-IOV on port %d\n", 658 + adapter->portnum); 659 + 651 660 return err; 652 661 } 653 662 ··· 787 774 struct qlcnic_vf_info *vf, 788 775 u16 vlan, u8 op) 789 776 { 790 - struct qlcnic_cmd_args cmd; 777 + struct qlcnic_cmd_args *cmd; 791 778 struct qlcnic_macvlan_mbx mv; 792 779 struct qlcnic_vport *vp; 793 780 u8 *addr; ··· 797 784 798 785 vp = vf->vp; 799 786 800 - if (qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIG_MAC_VLAN)) 787 + cmd = kzalloc(sizeof(*cmd), GFP_ATOMIC); 788 + if (!cmd) 801 789 return -ENOMEM; 802 790 791 + err = qlcnic_alloc_mbx_args(cmd, adapter, QLCNIC_CMD_CONFIG_MAC_VLAN); 792 + if (err) 793 + goto free_cmd; 794 + 795 + cmd->type = QLC_83XX_MBX_CMD_NO_WAIT; 803 796 vpid = qlcnic_sriov_pf_get_vport_handle(adapter, vf->pci_func); 804 797 if (vpid < 0) { 805 798 err = -EINVAL; 806 - goto out; 799 + goto free_args; 807 800 } 808 801 809 802 if (vlan) 810 803 op = ((op == QLCNIC_MAC_ADD || op == QLCNIC_MAC_VLAN_ADD) ? 811 804 QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_VLAN_DEL); 812 805 813 - cmd.req.arg[1] = op | (1 << 8) | (3 << 6); 814 - cmd.req.arg[1] |= ((vpid & 0xffff) << 16) | BIT_31; 806 + cmd->req.arg[1] = op | (1 << 8) | (3 << 6); 807 + cmd->req.arg[1] |= ((vpid & 0xffff) << 16) | BIT_31; 815 808 816 809 addr = vp->mac; 817 810 mv.vlan = vlan; ··· 827 808 mv.mac_addr3 = addr[3]; 828 809 mv.mac_addr4 = addr[4]; 829 810 mv.mac_addr5 = addr[5]; 830 - buf = &cmd.req.arg[2]; 811 + buf = &cmd->req.arg[2]; 831 812 memcpy(buf, &mv, sizeof(struct qlcnic_macvlan_mbx)); 832 813 833 - err = qlcnic_issue_cmd(adapter, &cmd); 814 + err = qlcnic_issue_cmd(adapter, cmd); 834 815 835 - if (err) 836 - dev_err(&adapter->pdev->dev, 837 - "MAC-VLAN %s to CAM failed, err=%d.\n", 838 - ((op == 1) ? "add " : "delete "), err); 816 + if (!err) 817 + return err; 839 818 840 - out: 841 - qlcnic_free_mbx_args(&cmd); 819 + free_args: 820 + qlcnic_free_mbx_args(cmd); 821 + free_cmd: 822 + kfree(cmd); 842 823 return err; 843 824 } 844 825 ··· 860 841 861 842 sriov = adapter->ahw->sriov; 862 843 863 - mutex_lock(&vf->vlan_list_lock); 844 + spin_lock_bh(&vf->vlan_list_lock); 864 845 if (vf->num_vlan) { 865 846 for (i = 0; i < sriov->num_allowed_vlans; i++) { 866 847 vlan = vf->sriov_vlans[i]; ··· 869 850 opcode); 870 851 } 871 852 } 872 - mutex_unlock(&vf->vlan_list_lock); 853 + spin_unlock_bh(&vf->vlan_list_lock); 873 854 874 855 if (vf->vp->vlan_mode != QLC_PVID_MODE) { 875 856 if (qlcnic_83xx_pf_check(adapter) && ··· 1256 1237 struct qlcnic_vf_info *vf, 1257 1238 struct qlcnic_cmd_args *cmd) 1258 1239 { 1259 - struct qlcnic_macvlan_mbx *macvlan; 1260 1240 struct qlcnic_vport *vp = vf->vp; 1261 1241 u8 op, new_op; 1262 1242 ··· 1264 1246 1265 1247 cmd->req.arg[1] |= (vf->vp->handle << 16); 1266 1248 cmd->req.arg[1] |= BIT_31; 1267 - 1268 - macvlan = (struct qlcnic_macvlan_mbx *)&cmd->req.arg[2]; 1269 - if (!(macvlan->mac_addr0 & BIT_0)) { 1270 - dev_err(&adapter->pdev->dev, 1271 - "MAC address change is not allowed from VF %d", 1272 - vf->pci_func); 1273 - return -EINVAL; 1274 - } 1275 1249 1276 1250 if (vp->vlan_mode == QLC_PVID_MODE) { 1277 1251 op = cmd->req.arg[1] & 0x7;