diff options
author | Padmanabh Ratnakar <padmanabh.ratnakar@emulex.com> | 2011-11-25 00:47:26 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-11-26 14:52:28 -0500 |
commit | 590c391dd362479b27a67c8d797ce348c5798b93 (patch) | |
tree | 81e602a0dba586cf5286ae9d2fbf604a1b9aafba /drivers/net/ethernet | |
parent | 4f5762ec9135d24887844549de3c83e0290a3567 (diff) |
be2net: Move to new SR-IOV implementation in Lancer
SR-IOV implementation is Lancer has changed in following ways -
1)PF driver assigns one MAC addresses for VF using COMMON_SET_IFACE_MAC_LIST.
2)VF driver queries its MAC address using COMMON_GET_IFACE_MAC_LIST command
and assigns it to its interface.
Signed-off-by: Mammatha Edhala <mammatha.edhala@emulex.com>
Signed-off-by: Padmanabh Ratnakar <padmanabh.ratnakar@emulex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet')
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_cmds.c | 99 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_cmds.h | 37 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_main.c | 89 |
3 files changed, 200 insertions, 25 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c index 64f0c1aa1b09..7988798afb8a 100644 --- a/drivers/net/ethernet/emulex/benet/be_cmds.c +++ b/drivers/net/ethernet/emulex/benet/be_cmds.c | |||
@@ -609,7 +609,7 @@ int be_cmd_eq_create(struct be_adapter *adapter, | |||
609 | 609 | ||
610 | /* Use MCC */ | 610 | /* Use MCC */ |
611 | int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr, | 611 | int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr, |
612 | u8 type, bool permanent, u32 if_handle) | 612 | u8 type, bool permanent, u32 if_handle, u32 pmac_id) |
613 | { | 613 | { |
614 | struct be_mcc_wrb *wrb; | 614 | struct be_mcc_wrb *wrb; |
615 | struct be_cmd_req_mac_query *req; | 615 | struct be_cmd_req_mac_query *req; |
@@ -631,6 +631,7 @@ int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr, | |||
631 | req->permanent = 1; | 631 | req->permanent = 1; |
632 | } else { | 632 | } else { |
633 | req->if_id = cpu_to_le16((u16) if_handle); | 633 | req->if_id = cpu_to_le16((u16) if_handle); |
634 | req->pmac_id = cpu_to_le32(pmac_id); | ||
634 | req->permanent = 0; | 635 | req->permanent = 0; |
635 | } | 636 | } |
636 | 637 | ||
@@ -2280,3 +2281,99 @@ err: | |||
2280 | mutex_unlock(&adapter->mbox_lock); | 2281 | mutex_unlock(&adapter->mbox_lock); |
2281 | return status; | 2282 | return status; |
2282 | } | 2283 | } |
2284 | |||
2285 | /* Uses synchronous MCCQ */ | ||
2286 | int be_cmd_get_mac_from_list(struct be_adapter *adapter, u32 domain, | ||
2287 | u32 *pmac_id) | ||
2288 | { | ||
2289 | struct be_mcc_wrb *wrb; | ||
2290 | struct be_cmd_req_get_mac_list *req; | ||
2291 | int status; | ||
2292 | int mac_count; | ||
2293 | |||
2294 | spin_lock_bh(&adapter->mcc_lock); | ||
2295 | |||
2296 | wrb = wrb_from_mccq(adapter); | ||
2297 | if (!wrb) { | ||
2298 | status = -EBUSY; | ||
2299 | goto err; | ||
2300 | } | ||
2301 | req = embedded_payload(wrb); | ||
2302 | |||
2303 | be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, | ||
2304 | OPCODE_COMMON_GET_MAC_LIST, sizeof(*req), | ||
2305 | wrb, NULL); | ||
2306 | |||
2307 | req->hdr.domain = domain; | ||
2308 | |||
2309 | status = be_mcc_notify_wait(adapter); | ||
2310 | if (!status) { | ||
2311 | struct be_cmd_resp_get_mac_list *resp = | ||
2312 | embedded_payload(wrb); | ||
2313 | int i; | ||
2314 | u8 *ctxt = &resp->context[0][0]; | ||
2315 | status = -EIO; | ||
2316 | mac_count = resp->mac_count; | ||
2317 | be_dws_le_to_cpu(&resp->context, sizeof(resp->context)); | ||
2318 | for (i = 0; i < mac_count; i++) { | ||
2319 | if (!AMAP_GET_BITS(struct amap_get_mac_list_context, | ||
2320 | act, ctxt)) { | ||
2321 | *pmac_id = AMAP_GET_BITS | ||
2322 | (struct amap_get_mac_list_context, | ||
2323 | macid, ctxt); | ||
2324 | status = 0; | ||
2325 | break; | ||
2326 | } | ||
2327 | ctxt += sizeof(struct amap_get_mac_list_context) / 8; | ||
2328 | } | ||
2329 | } | ||
2330 | |||
2331 | err: | ||
2332 | spin_unlock_bh(&adapter->mcc_lock); | ||
2333 | return status; | ||
2334 | } | ||
2335 | |||
2336 | /* Uses synchronous MCCQ */ | ||
2337 | int be_cmd_set_mac_list(struct be_adapter *adapter, u8 *mac_array, | ||
2338 | u8 mac_count, u32 domain) | ||
2339 | { | ||
2340 | struct be_mcc_wrb *wrb; | ||
2341 | struct be_cmd_req_set_mac_list *req; | ||
2342 | int status; | ||
2343 | struct be_dma_mem cmd; | ||
2344 | |||
2345 | memset(&cmd, 0, sizeof(struct be_dma_mem)); | ||
2346 | cmd.size = sizeof(struct be_cmd_req_set_mac_list); | ||
2347 | cmd.va = dma_alloc_coherent(&adapter->pdev->dev, cmd.size, | ||
2348 | &cmd.dma, GFP_KERNEL); | ||
2349 | if (!cmd.va) { | ||
2350 | dev_err(&adapter->pdev->dev, "Memory alloc failure\n"); | ||
2351 | return -ENOMEM; | ||
2352 | } | ||
2353 | |||
2354 | spin_lock_bh(&adapter->mcc_lock); | ||
2355 | |||
2356 | wrb = wrb_from_mccq(adapter); | ||
2357 | if (!wrb) { | ||
2358 | status = -EBUSY; | ||
2359 | goto err; | ||
2360 | } | ||
2361 | |||
2362 | req = cmd.va; | ||
2363 | be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, | ||
2364 | OPCODE_COMMON_SET_MAC_LIST, sizeof(*req), | ||
2365 | wrb, &cmd); | ||
2366 | |||
2367 | req->hdr.domain = domain; | ||
2368 | req->mac_count = mac_count; | ||
2369 | if (mac_count) | ||
2370 | memcpy(req->mac, mac_array, ETH_ALEN*mac_count); | ||
2371 | |||
2372 | status = be_mcc_notify_wait(adapter); | ||
2373 | |||
2374 | err: | ||
2375 | dma_free_coherent(&adapter->pdev->dev, cmd.size, | ||
2376 | cmd.va, cmd.dma); | ||
2377 | spin_unlock_bh(&adapter->mcc_lock); | ||
2378 | return status; | ||
2379 | } | ||
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.h b/drivers/net/ethernet/emulex/benet/be_cmds.h index ac112465e719..0b694c640642 100644 --- a/drivers/net/ethernet/emulex/benet/be_cmds.h +++ b/drivers/net/ethernet/emulex/benet/be_cmds.h | |||
@@ -189,6 +189,8 @@ struct be_mcc_mailbox { | |||
189 | #define OPCODE_COMMON_GET_PHY_DETAILS 102 | 189 | #define OPCODE_COMMON_GET_PHY_DETAILS 102 |
190 | #define OPCODE_COMMON_SET_DRIVER_FUNCTION_CAP 103 | 190 | #define OPCODE_COMMON_SET_DRIVER_FUNCTION_CAP 103 |
191 | #define OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES 121 | 191 | #define OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES 121 |
192 | #define OPCODE_COMMON_GET_MAC_LIST 147 | ||
193 | #define OPCODE_COMMON_SET_MAC_LIST 148 | ||
192 | #define OPCODE_COMMON_READ_OBJECT 171 | 194 | #define OPCODE_COMMON_READ_OBJECT 171 |
193 | #define OPCODE_COMMON_WRITE_OBJECT 172 | 195 | #define OPCODE_COMMON_WRITE_OBJECT 172 |
194 | 196 | ||
@@ -295,6 +297,7 @@ struct be_cmd_req_mac_query { | |||
295 | u8 type; | 297 | u8 type; |
296 | u8 permanent; | 298 | u8 permanent; |
297 | u16 if_id; | 299 | u16 if_id; |
300 | u32 pmac_id; | ||
298 | } __packed; | 301 | } __packed; |
299 | 302 | ||
300 | struct be_cmd_resp_mac_query { | 303 | struct be_cmd_resp_mac_query { |
@@ -1340,6 +1343,34 @@ struct be_cmd_resp_set_func_cap { | |||
1340 | u8 rsvd[212]; | 1343 | u8 rsvd[212]; |
1341 | }; | 1344 | }; |
1342 | 1345 | ||
1346 | /******************** GET/SET_MACLIST **************************/ | ||
1347 | #define BE_MAX_MAC 64 | ||
1348 | struct amap_get_mac_list_context { | ||
1349 | u8 macid[31]; | ||
1350 | u8 act; | ||
1351 | } __packed; | ||
1352 | |||
1353 | struct be_cmd_req_get_mac_list { | ||
1354 | struct be_cmd_req_hdr hdr; | ||
1355 | u32 rsvd; | ||
1356 | } __packed; | ||
1357 | |||
1358 | struct be_cmd_resp_get_mac_list { | ||
1359 | struct be_cmd_resp_hdr hdr; | ||
1360 | u8 mac_count; | ||
1361 | u8 rsvd1; | ||
1362 | u16 rsvd2; | ||
1363 | u8 context[sizeof(struct amap_get_mac_list_context) / 8][BE_MAX_MAC]; | ||
1364 | } __packed; | ||
1365 | |||
1366 | struct be_cmd_req_set_mac_list { | ||
1367 | struct be_cmd_req_hdr hdr; | ||
1368 | u8 mac_count; | ||
1369 | u8 rsvd1; | ||
1370 | u16 rsvd2; | ||
1371 | struct macaddr mac[BE_MAX_MAC]; | ||
1372 | } __packed; | ||
1373 | |||
1343 | /*************** HW Stats Get v1 **********************************/ | 1374 | /*************** HW Stats Get v1 **********************************/ |
1344 | #define BE_TXP_SW_SZ 48 | 1375 | #define BE_TXP_SW_SZ 48 |
1345 | struct be_port_rxf_stats_v1 { | 1376 | struct be_port_rxf_stats_v1 { |
@@ -1446,7 +1477,7 @@ static inline void *be_erx_stats_from_cmd(struct be_adapter *adapter) | |||
1446 | extern int be_pci_fnum_get(struct be_adapter *adapter); | 1477 | extern int be_pci_fnum_get(struct be_adapter *adapter); |
1447 | extern int be_cmd_POST(struct be_adapter *adapter); | 1478 | extern int be_cmd_POST(struct be_adapter *adapter); |
1448 | extern int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr, | 1479 | extern int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr, |
1449 | u8 type, bool permanent, u32 if_handle); | 1480 | u8 type, bool permanent, u32 if_handle, u32 pmac_id); |
1450 | extern int be_cmd_pmac_add(struct be_adapter *adapter, u8 *mac_addr, | 1481 | extern int be_cmd_pmac_add(struct be_adapter *adapter, u8 *mac_addr, |
1451 | u32 if_id, u32 *pmac_id, u32 domain); | 1482 | u32 if_id, u32 *pmac_id, u32 domain); |
1452 | extern int be_cmd_pmac_del(struct be_adapter *adapter, u32 if_id, | 1483 | extern int be_cmd_pmac_del(struct be_adapter *adapter, u32 if_id, |
@@ -1542,4 +1573,8 @@ extern int be_cmd_get_cntl_attributes(struct be_adapter *adapter); | |||
1542 | extern int be_cmd_req_native_mode(struct be_adapter *adapter); | 1573 | extern int be_cmd_req_native_mode(struct be_adapter *adapter); |
1543 | extern int be_cmd_get_reg_len(struct be_adapter *adapter, u32 *log_size); | 1574 | extern int be_cmd_get_reg_len(struct be_adapter *adapter, u32 *log_size); |
1544 | extern void be_cmd_get_regs(struct be_adapter *adapter, u32 buf_len, void *buf); | 1575 | extern void be_cmd_get_regs(struct be_adapter *adapter, u32 buf_len, void *buf); |
1576 | extern int be_cmd_get_mac_from_list(struct be_adapter *adapter, u32 domain, | ||
1577 | u32 *pmac_id); | ||
1578 | extern int be_cmd_set_mac_list(struct be_adapter *adapter, u8 *mac_array, | ||
1579 | u8 mac_count, u32 domain); | ||
1545 | 1580 | ||
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index 93869d457b14..c6fb7c3f961a 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
@@ -237,7 +237,8 @@ static int be_mac_addr_set(struct net_device *netdev, void *p) | |||
237 | return -EADDRNOTAVAIL; | 237 | return -EADDRNOTAVAIL; |
238 | 238 | ||
239 | status = be_cmd_mac_addr_query(adapter, current_mac, | 239 | status = be_cmd_mac_addr_query(adapter, current_mac, |
240 | MAC_ADDRESS_TYPE_NETWORK, false, adapter->if_handle); | 240 | MAC_ADDRESS_TYPE_NETWORK, false, |
241 | adapter->if_handle, 0); | ||
241 | if (status) | 242 | if (status) |
242 | goto err; | 243 | goto err; |
243 | 244 | ||
@@ -848,11 +849,18 @@ static int be_set_vf_mac(struct net_device *netdev, int vf, u8 *mac) | |||
848 | if (!is_valid_ether_addr(mac) || (vf >= num_vfs)) | 849 | if (!is_valid_ether_addr(mac) || (vf >= num_vfs)) |
849 | return -EINVAL; | 850 | return -EINVAL; |
850 | 851 | ||
851 | status = be_cmd_pmac_del(adapter, adapter->vf_cfg[vf].vf_if_handle, | 852 | if (lancer_chip(adapter)) { |
853 | status = be_cmd_set_mac_list(adapter, mac, 1, vf + 1); | ||
854 | } else { | ||
855 | status = be_cmd_pmac_del(adapter, | ||
856 | adapter->vf_cfg[vf].vf_if_handle, | ||
852 | adapter->vf_cfg[vf].vf_pmac_id, vf + 1); | 857 | adapter->vf_cfg[vf].vf_pmac_id, vf + 1); |
853 | 858 | ||
854 | status = be_cmd_pmac_add(adapter, mac, adapter->vf_cfg[vf].vf_if_handle, | 859 | status = be_cmd_pmac_add(adapter, mac, |
860 | adapter->vf_cfg[vf].vf_if_handle, | ||
855 | &adapter->vf_cfg[vf].vf_pmac_id, vf + 1); | 861 | &adapter->vf_cfg[vf].vf_pmac_id, vf + 1); |
862 | } | ||
863 | |||
856 | if (status) | 864 | if (status) |
857 | dev_err(&adapter->pdev->dev, "MAC %pM set on VF %d Failed\n", | 865 | dev_err(&adapter->pdev->dev, "MAC %pM set on VF %d Failed\n", |
858 | mac, vf); | 866 | mac, vf); |
@@ -2465,13 +2473,18 @@ static inline int be_vf_eth_addr_config(struct be_adapter *adapter) | |||
2465 | be_vf_eth_addr_generate(adapter, mac); | 2473 | be_vf_eth_addr_generate(adapter, mac); |
2466 | 2474 | ||
2467 | for (vf = 0; vf < num_vfs; vf++) { | 2475 | for (vf = 0; vf < num_vfs; vf++) { |
2468 | status = be_cmd_pmac_add(adapter, mac, | 2476 | if (lancer_chip(adapter)) { |
2477 | status = be_cmd_set_mac_list(adapter, mac, 1, vf + 1); | ||
2478 | } else { | ||
2479 | status = be_cmd_pmac_add(adapter, mac, | ||
2469 | adapter->vf_cfg[vf].vf_if_handle, | 2480 | adapter->vf_cfg[vf].vf_if_handle, |
2470 | &adapter->vf_cfg[vf].vf_pmac_id, | 2481 | &adapter->vf_cfg[vf].vf_pmac_id, |
2471 | vf + 1); | 2482 | vf + 1); |
2483 | } | ||
2484 | |||
2472 | if (status) | 2485 | if (status) |
2473 | dev_err(&adapter->pdev->dev, | 2486 | dev_err(&adapter->pdev->dev, |
2474 | "Mac address add failed for VF %d\n", vf); | 2487 | "Mac address assignment failed for VF %d\n", vf); |
2475 | else | 2488 | else |
2476 | memcpy(adapter->vf_cfg[vf].vf_mac_addr, mac, ETH_ALEN); | 2489 | memcpy(adapter->vf_cfg[vf].vf_mac_addr, mac, ETH_ALEN); |
2477 | 2490 | ||
@@ -2484,9 +2497,14 @@ static void be_vf_clear(struct be_adapter *adapter) | |||
2484 | { | 2497 | { |
2485 | u32 vf; | 2498 | u32 vf; |
2486 | 2499 | ||
2487 | for (vf = 0; vf < num_vfs; vf++) | 2500 | for (vf = 0; vf < num_vfs; vf++) { |
2488 | be_cmd_pmac_del(adapter, adapter->vf_cfg[vf].vf_if_handle, | 2501 | if (lancer_chip(adapter)) |
2489 | adapter->vf_cfg[vf].vf_pmac_id, vf + 1); | 2502 | be_cmd_set_mac_list(adapter, NULL, 0, vf + 1); |
2503 | else | ||
2504 | be_cmd_pmac_del(adapter, | ||
2505 | adapter->vf_cfg[vf].vf_if_handle, | ||
2506 | adapter->vf_cfg[vf].vf_pmac_id, vf + 1); | ||
2507 | } | ||
2490 | 2508 | ||
2491 | for (vf = 0; vf < num_vfs; vf++) | 2509 | for (vf = 0; vf < num_vfs; vf++) |
2492 | be_cmd_if_destroy(adapter, adapter->vf_cfg[vf].vf_if_handle, | 2510 | be_cmd_if_destroy(adapter, adapter->vf_cfg[vf].vf_if_handle, |
@@ -2527,7 +2545,9 @@ static int be_vf_setup(struct be_adapter *adapter) | |||
2527 | 2545 | ||
2528 | be_vf_setup_init(adapter); | 2546 | be_vf_setup_init(adapter); |
2529 | 2547 | ||
2530 | cap_flags = en_flags = BE_IF_FLAGS_UNTAGGED | BE_IF_FLAGS_BROADCAST; | 2548 | cap_flags = en_flags = BE_IF_FLAGS_UNTAGGED | BE_IF_FLAGS_BROADCAST | |
2549 | BE_IF_FLAGS_MULTICAST; | ||
2550 | |||
2531 | for (vf = 0; vf < num_vfs; vf++) { | 2551 | for (vf = 0; vf < num_vfs; vf++) { |
2532 | status = be_cmd_if_create(adapter, cap_flags, en_flags, NULL, | 2552 | status = be_cmd_if_create(adapter, cap_flags, en_flags, NULL, |
2533 | &adapter->vf_cfg[vf].vf_if_handle, | 2553 | &adapter->vf_cfg[vf].vf_if_handle, |
@@ -2536,11 +2556,9 @@ static int be_vf_setup(struct be_adapter *adapter) | |||
2536 | goto err; | 2556 | goto err; |
2537 | } | 2557 | } |
2538 | 2558 | ||
2539 | if (!lancer_chip(adapter)) { | 2559 | status = be_vf_eth_addr_config(adapter); |
2540 | status = be_vf_eth_addr_config(adapter); | 2560 | if (status) |
2541 | if (status) | 2561 | goto err; |
2542 | goto err; | ||
2543 | } | ||
2544 | 2562 | ||
2545 | for (vf = 0; vf < num_vfs; vf++) { | 2563 | for (vf = 0; vf < num_vfs; vf++) { |
2546 | status = be_cmd_link_status_query(adapter, NULL, &lnk_speed, | 2564 | status = be_cmd_link_status_query(adapter, NULL, &lnk_speed, |
@@ -2564,6 +2582,23 @@ static void be_setup_init(struct be_adapter *adapter) | |||
2564 | adapter->eq_next_idx = 0; | 2582 | adapter->eq_next_idx = 0; |
2565 | } | 2583 | } |
2566 | 2584 | ||
2585 | static int be_configure_mac_from_list(struct be_adapter *adapter, u8 *mac) | ||
2586 | { | ||
2587 | u32 pmac_id; | ||
2588 | int status = be_cmd_get_mac_from_list(adapter, 0, &pmac_id); | ||
2589 | if (status != 0) | ||
2590 | goto do_none; | ||
2591 | status = be_cmd_mac_addr_query(adapter, mac, | ||
2592 | MAC_ADDRESS_TYPE_NETWORK, | ||
2593 | false, adapter->if_handle, pmac_id); | ||
2594 | if (status != 0) | ||
2595 | goto do_none; | ||
2596 | status = be_cmd_pmac_add(adapter, mac, adapter->if_handle, | ||
2597 | &adapter->pmac_id, 0); | ||
2598 | do_none: | ||
2599 | return status; | ||
2600 | } | ||
2601 | |||
2567 | static int be_setup(struct be_adapter *adapter) | 2602 | static int be_setup(struct be_adapter *adapter) |
2568 | { | 2603 | { |
2569 | struct net_device *netdev = adapter->netdev; | 2604 | struct net_device *netdev = adapter->netdev; |
@@ -2591,7 +2626,7 @@ static int be_setup(struct be_adapter *adapter) | |||
2591 | 2626 | ||
2592 | memset(mac, 0, ETH_ALEN); | 2627 | memset(mac, 0, ETH_ALEN); |
2593 | status = be_cmd_mac_addr_query(adapter, mac, MAC_ADDRESS_TYPE_NETWORK, | 2628 | status = be_cmd_mac_addr_query(adapter, mac, MAC_ADDRESS_TYPE_NETWORK, |
2594 | true /*permanent */, 0); | 2629 | true /*permanent */, 0, 0); |
2595 | if (status) | 2630 | if (status) |
2596 | return status; | 2631 | return status; |
2597 | memcpy(adapter->netdev->dev_addr, mac, ETH_ALEN); | 2632 | memcpy(adapter->netdev->dev_addr, mac, ETH_ALEN); |
@@ -2618,12 +2653,17 @@ static int be_setup(struct be_adapter *adapter) | |||
2618 | goto err; | 2653 | goto err; |
2619 | } | 2654 | } |
2620 | 2655 | ||
2621 | /* For BEx, the VF's permanent mac queried from card is incorrect. | 2656 | /* The VF's permanent mac queried from card is incorrect. |
2622 | * Query the mac configued by the PF using if_handle | 2657 | * For BEx: Query the mac configued by the PF using if_handle |
2623 | */ | 2658 | * For Lancer: Get and use mac_list to obtain mac address. |
2624 | if (!be_physfn(adapter) && !lancer_chip(adapter)) { | 2659 | */ |
2625 | status = be_cmd_mac_addr_query(adapter, mac, | 2660 | if (!be_physfn(adapter)) { |
2626 | MAC_ADDRESS_TYPE_NETWORK, false, adapter->if_handle); | 2661 | if (lancer_chip(adapter)) |
2662 | status = be_configure_mac_from_list(adapter, mac); | ||
2663 | else | ||
2664 | status = be_cmd_mac_addr_query(adapter, mac, | ||
2665 | MAC_ADDRESS_TYPE_NETWORK, false, | ||
2666 | adapter->if_handle, 0); | ||
2627 | if (!status) { | 2667 | if (!status) { |
2628 | memcpy(adapter->netdev->dev_addr, mac, ETH_ALEN); | 2668 | memcpy(adapter->netdev->dev_addr, mac, ETH_ALEN); |
2629 | memcpy(adapter->netdev->perm_addr, mac, ETH_ALEN); | 2669 | memcpy(adapter->netdev->perm_addr, mac, ETH_ALEN); |
@@ -2639,12 +2679,15 @@ static int be_setup(struct be_adapter *adapter) | |||
2639 | be_set_rx_mode(adapter->netdev); | 2679 | be_set_rx_mode(adapter->netdev); |
2640 | 2680 | ||
2641 | status = be_cmd_get_flow_control(adapter, &tx_fc, &rx_fc); | 2681 | status = be_cmd_get_flow_control(adapter, &tx_fc, &rx_fc); |
2642 | if (status) | 2682 | /* For Lancer: It is legal for this cmd to fail on VF */ |
2683 | if (status && (be_physfn(adapter) || !lancer_chip(adapter))) | ||
2643 | goto err; | 2684 | goto err; |
2685 | |||
2644 | if (rx_fc != adapter->rx_fc || tx_fc != adapter->tx_fc) { | 2686 | if (rx_fc != adapter->rx_fc || tx_fc != adapter->tx_fc) { |
2645 | status = be_cmd_set_flow_control(adapter, adapter->tx_fc, | 2687 | status = be_cmd_set_flow_control(adapter, adapter->tx_fc, |
2646 | adapter->rx_fc); | 2688 | adapter->rx_fc); |
2647 | if (status) | 2689 | /* For Lancer: It is legal for this cmd to fail on VF */ |
2690 | if (status && (be_physfn(adapter) || !lancer_chip(adapter))) | ||
2648 | goto err; | 2691 | goto err; |
2649 | } | 2692 | } |
2650 | 2693 | ||