aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet
diff options
context:
space:
mode:
authorPadmanabh Ratnakar <padmanabh.ratnakar@emulex.com>2011-11-25 00:47:26 -0500
committerDavid S. Miller <davem@davemloft.net>2011-11-26 14:52:28 -0500
commit590c391dd362479b27a67c8d797ce348c5798b93 (patch)
tree81e602a0dba586cf5286ae9d2fbf604a1b9aafba /drivers/net/ethernet
parent4f5762ec9135d24887844549de3c83e0290a3567 (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.c99
-rw-r--r--drivers/net/ethernet/emulex/benet/be_cmds.h37
-rw-r--r--drivers/net/ethernet/emulex/benet/be_main.c89
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 */
611int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr, 611int 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 */
2286int 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
2331err:
2332 spin_unlock_bh(&adapter->mcc_lock);
2333 return status;
2334}
2335
2336/* Uses synchronous MCCQ */
2337int 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
2374err:
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
300struct be_cmd_resp_mac_query { 303struct 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
1348struct amap_get_mac_list_context {
1349 u8 macid[31];
1350 u8 act;
1351} __packed;
1352
1353struct be_cmd_req_get_mac_list {
1354 struct be_cmd_req_hdr hdr;
1355 u32 rsvd;
1356} __packed;
1357
1358struct 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
1366struct 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
1345struct be_port_rxf_stats_v1 { 1376struct be_port_rxf_stats_v1 {
@@ -1446,7 +1477,7 @@ static inline void *be_erx_stats_from_cmd(struct be_adapter *adapter)
1446extern int be_pci_fnum_get(struct be_adapter *adapter); 1477extern int be_pci_fnum_get(struct be_adapter *adapter);
1447extern int be_cmd_POST(struct be_adapter *adapter); 1478extern int be_cmd_POST(struct be_adapter *adapter);
1448extern int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr, 1479extern 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);
1450extern int be_cmd_pmac_add(struct be_adapter *adapter, u8 *mac_addr, 1481extern 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);
1452extern int be_cmd_pmac_del(struct be_adapter *adapter, u32 if_id, 1483extern 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);
1542extern int be_cmd_req_native_mode(struct be_adapter *adapter); 1573extern int be_cmd_req_native_mode(struct be_adapter *adapter);
1543extern int be_cmd_get_reg_len(struct be_adapter *adapter, u32 *log_size); 1574extern int be_cmd_get_reg_len(struct be_adapter *adapter, u32 *log_size);
1544extern void be_cmd_get_regs(struct be_adapter *adapter, u32 buf_len, void *buf); 1575extern void be_cmd_get_regs(struct be_adapter *adapter, u32 buf_len, void *buf);
1576extern int be_cmd_get_mac_from_list(struct be_adapter *adapter, u32 domain,
1577 u32 *pmac_id);
1578extern 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
2585static 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);
2598do_none:
2599 return status;
2600}
2601
2567static int be_setup(struct be_adapter *adapter) 2602static 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