Skip to content

Commit 5b8821b

Browse files
Sathya Perladavem330
authored andcommitted
be2net: use RX_FILTER cmd to program multicast addresses
Use this cmd for both promiscous and multicast address programming. Get rid of the old MULTICAST_SET cmd. Signed-off-by: Sathya Perla <sathya.perla@emulex.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent c0e64ef commit 5b8821b

File tree

4 files changed

+41
-114
lines changed

4 files changed

+41
-114
lines changed

drivers/net/benet/be.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ struct be_adapter {
334334
u8 vlan_tag[VLAN_N_VID];
335335
u8 vlan_prio_bmap; /* Available Priority BitMap */
336336
u16 recommended_prio; /* Recommended Priority */
337-
struct be_dma_mem mc_cmd_mem;
337+
struct be_dma_mem rx_filter; /* Cmd DMA mem for rx-filter */
338338

339339
struct be_dma_mem stats_cmd;
340340
/* Work queue used to perform periodic tasks like getting statistics */
@@ -381,6 +381,8 @@ struct be_adapter {
381381
#define BE_GEN2 2
382382
#define BE_GEN3 3
383383

384+
#define ON 1
385+
#define OFF 0
384386
#define lancer_chip(adapter) ((adapter->pdev->device == OC_DEVICE_ID3) || \
385387
(adapter->pdev->device == OC_DEVICE_ID4))
386388

drivers/net/benet/be_cmds.c

Lines changed: 22 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1548,72 +1548,11 @@ int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, u16 *vtag_array,
15481548
return status;
15491549
}
15501550

1551-
/* Uses MCC for this command as it may be called in BH context
1552-
* Uses synchronous mcc
1553-
*/
1554-
int be_cmd_promiscuous_config(struct be_adapter *adapter, bool en)
1555-
{
1556-
struct be_mcc_wrb *wrb;
1557-
struct be_cmd_req_rx_filter *req;
1558-
struct be_dma_mem promiscous_cmd;
1559-
struct be_sge *sge;
1560-
int status;
1561-
1562-
memset(&promiscous_cmd, 0, sizeof(struct be_dma_mem));
1563-
promiscous_cmd.size = sizeof(struct be_cmd_req_rx_filter);
1564-
promiscous_cmd.va = pci_alloc_consistent(adapter->pdev,
1565-
promiscous_cmd.size, &promiscous_cmd.dma);
1566-
if (!promiscous_cmd.va) {
1567-
dev_err(&adapter->pdev->dev,
1568-
"Memory allocation failure\n");
1569-
return -ENOMEM;
1570-
}
1571-
1572-
spin_lock_bh(&adapter->mcc_lock);
1573-
1574-
wrb = wrb_from_mccq(adapter);
1575-
if (!wrb) {
1576-
status = -EBUSY;
1577-
goto err;
1578-
}
1579-
1580-
req = promiscous_cmd.va;
1581-
sge = nonembedded_sgl(wrb);
1582-
1583-
be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1,
1584-
OPCODE_COMMON_NTWK_RX_FILTER);
1585-
be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1586-
OPCODE_COMMON_NTWK_RX_FILTER, sizeof(*req));
1587-
1588-
req->if_id = cpu_to_le32(adapter->if_handle);
1589-
req->if_flags_mask = cpu_to_le32(BE_IF_FLAGS_PROMISCUOUS
1590-
| BE_IF_FLAGS_VLAN_PROMISCUOUS);
1591-
if (en)
1592-
req->if_flags = cpu_to_le32(BE_IF_FLAGS_PROMISCUOUS
1593-
| BE_IF_FLAGS_VLAN_PROMISCUOUS);
1594-
1595-
sge->pa_hi = cpu_to_le32(upper_32_bits(promiscous_cmd.dma));
1596-
sge->pa_lo = cpu_to_le32(promiscous_cmd.dma & 0xFFFFFFFF);
1597-
sge->len = cpu_to_le32(promiscous_cmd.size);
1598-
1599-
status = be_mcc_notify_wait(adapter);
1600-
1601-
err:
1602-
spin_unlock_bh(&adapter->mcc_lock);
1603-
pci_free_consistent(adapter->pdev, promiscous_cmd.size,
1604-
promiscous_cmd.va, promiscous_cmd.dma);
1605-
return status;
1606-
}
1607-
1608-
/*
1609-
* Uses MCC for this command as it may be called in BH context
1610-
* (mc == NULL) => multicast promiscuous
1611-
*/
1612-
int be_cmd_multicast_set(struct be_adapter *adapter, u32 if_id,
1613-
struct net_device *netdev, struct be_dma_mem *mem)
1551+
int be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value)
16141552
{
16151553
struct be_mcc_wrb *wrb;
1616-
struct be_cmd_req_mcast_mac_config *req = mem->va;
1554+
struct be_dma_mem *mem = &adapter->rx_filter;
1555+
struct be_cmd_req_rx_filter *req = mem->va;
16171556
struct be_sge *sge;
16181557
int status;
16191558

@@ -1625,33 +1564,35 @@ int be_cmd_multicast_set(struct be_adapter *adapter, u32 if_id,
16251564
goto err;
16261565
}
16271566
sge = nonembedded_sgl(wrb);
1628-
memset(req, 0, sizeof(*req));
1629-
1630-
be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1,
1631-
OPCODE_COMMON_NTWK_MULTICAST_SET);
16321567
sge->pa_hi = cpu_to_le32(upper_32_bits(mem->dma));
16331568
sge->pa_lo = cpu_to_le32(mem->dma & 0xFFFFFFFF);
16341569
sge->len = cpu_to_le32(mem->size);
1570+
be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1,
1571+
OPCODE_COMMON_NTWK_RX_FILTER);
16351572

1573+
memset(req, 0, sizeof(*req));
16361574
be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1637-
OPCODE_COMMON_NTWK_MULTICAST_SET, sizeof(*req));
1575+
OPCODE_COMMON_NTWK_RX_FILTER, sizeof(*req));
16381576

1639-
req->interface_id = if_id;
1640-
if (netdev) {
1641-
int i;
1577+
req->if_id = cpu_to_le32(adapter->if_handle);
1578+
if (flags & IFF_PROMISC) {
1579+
req->if_flags_mask = cpu_to_le32(BE_IF_FLAGS_PROMISCUOUS |
1580+
BE_IF_FLAGS_VLAN_PROMISCUOUS);
1581+
if (value == ON)
1582+
req->if_flags = cpu_to_le32(BE_IF_FLAGS_PROMISCUOUS |
1583+
BE_IF_FLAGS_VLAN_PROMISCUOUS);
1584+
} else if (flags & IFF_ALLMULTI) {
1585+
req->if_flags_mask = req->if_flags =
1586+
cpu_to_le32(BE_IF_FLAGS_MCAST_PROMISCUOUS);
1587+
} else {
16421588
struct netdev_hw_addr *ha;
1589+
int i = 0;
16431590

1644-
req->num_mac = cpu_to_le16(netdev_mc_count(netdev));
1645-
1646-
i = 0;
1647-
netdev_for_each_mc_addr(ha, netdev)
1648-
memcpy(req->mac[i++].byte, ha->addr, ETH_ALEN);
1649-
} else {
1650-
req->promiscuous = 1;
1591+
req->mcast_num = cpu_to_le16(netdev_mc_count(adapter->netdev));
1592+
netdev_for_each_mc_addr(ha, adapter->netdev)
1593+
memcpy(req->mcast_mac[i++].byte, ha->addr, ETH_ALEN);
16511594
}
16521595

1653-
status = be_mcc_notify_wait(adapter);
1654-
16551596
err:
16561597
spin_unlock_bh(&adapter->mcc_lock);
16571598
return status;

drivers/net/benet/be_cmds.h

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -910,33 +910,23 @@ struct be_cmd_req_vlan_config {
910910
u16 normal_vlan[64];
911911
} __packed;
912912

913-
/******************** Multicast MAC Config *******************/
913+
/******************* RX FILTER ******************************/
914914
#define BE_MAX_MC 64 /* set mcast promisc if > 64 */
915915
struct macaddr {
916916
u8 byte[ETH_ALEN];
917917
};
918918

919-
struct be_cmd_req_mcast_mac_config {
920-
struct be_cmd_req_hdr hdr;
921-
u16 num_mac;
922-
u8 promiscuous;
923-
u8 interface_id;
924-
struct macaddr mac[BE_MAX_MC];
925-
} __packed;
926-
927-
/******************* RX FILTER ******************************/
928919
struct be_cmd_req_rx_filter {
929920
struct be_cmd_req_hdr hdr;
930921
u32 global_flags_mask;
931922
u32 global_flags;
932923
u32 if_flags_mask;
933924
u32 if_flags;
934925
u32 if_id;
935-
u32 multicast_num;
936-
struct macaddr mac[BE_MAX_MC];
926+
u32 mcast_num;
927+
struct macaddr mcast_mac[BE_MAX_MC];
937928
};
938929

939-
940930
/******************** Link Status Query *******************/
941931
struct be_cmd_req_link_status {
942932
struct be_cmd_req_hdr hdr;
@@ -1455,9 +1445,7 @@ extern int be_cmd_modify_eqd(struct be_adapter *adapter, u32 eq_id, u32 eqd);
14551445
extern int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id,
14561446
u16 *vtag_array, u32 num, bool untagged,
14571447
bool promiscuous);
1458-
extern int be_cmd_promiscuous_config(struct be_adapter *adapter, bool en);
1459-
extern int be_cmd_multicast_set(struct be_adapter *adapter, u32 if_id,
1460-
struct net_device *netdev, struct be_dma_mem *mem);
1448+
extern int be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 status);
14611449
extern int be_cmd_set_flow_control(struct be_adapter *adapter,
14621450
u32 tx_fc, u32 rx_fc);
14631451
extern int be_cmd_get_flow_control(struct be_adapter *adapter,

drivers/net/benet/be_main.c

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -782,30 +782,28 @@ static void be_set_multicast_list(struct net_device *netdev)
782782
struct be_adapter *adapter = netdev_priv(netdev);
783783

784784
if (netdev->flags & IFF_PROMISC) {
785-
be_cmd_promiscuous_config(adapter, true);
785+
be_cmd_rx_filter(adapter, IFF_PROMISC, ON);
786786
adapter->promiscuous = true;
787787
goto done;
788788
}
789789

790790
/* BE was previously in promiscuous mode; disable it */
791791
if (adapter->promiscuous) {
792792
adapter->promiscuous = false;
793-
be_cmd_promiscuous_config(adapter, false);
793+
be_cmd_rx_filter(adapter, IFF_PROMISC, OFF);
794794

795795
if (adapter->vlans_added)
796796
be_vid_config(adapter, false, 0);
797797
}
798798

799799
/* Enable multicast promisc if num configured exceeds what we support */
800800
if (netdev->flags & IFF_ALLMULTI ||
801-
netdev_mc_count(netdev) > BE_MAX_MC) {
802-
be_cmd_multicast_set(adapter, adapter->if_handle, NULL,
803-
&adapter->mc_cmd_mem);
801+
netdev_mc_count(netdev) > BE_MAX_MC) {
802+
be_cmd_rx_filter(adapter, IFF_ALLMULTI, ON);
804803
goto done;
805804
}
806805

807-
be_cmd_multicast_set(adapter, adapter->if_handle, netdev,
808-
&adapter->mc_cmd_mem);
806+
be_cmd_rx_filter(adapter, IFF_MULTICAST, ON);
809807
done:
810808
return;
811809
}
@@ -2976,7 +2974,7 @@ static void be_ctrl_cleanup(struct be_adapter *adapter)
29762974
dma_free_coherent(&adapter->pdev->dev, mem->size, mem->va,
29772975
mem->dma);
29782976

2979-
mem = &adapter->mc_cmd_mem;
2977+
mem = &adapter->rx_filter;
29802978
if (mem->va)
29812979
dma_free_coherent(&adapter->pdev->dev, mem->size, mem->va,
29822980
mem->dma);
@@ -2986,7 +2984,7 @@ static int be_ctrl_init(struct be_adapter *adapter)
29862984
{
29872985
struct be_dma_mem *mbox_mem_alloc = &adapter->mbox_mem_alloced;
29882986
struct be_dma_mem *mbox_mem_align = &adapter->mbox_mem;
2989-
struct be_dma_mem *mc_cmd_mem = &adapter->mc_cmd_mem;
2987+
struct be_dma_mem *rx_filter = &adapter->rx_filter;
29902988
int status;
29912989

29922990
status = be_map_pci_bars(adapter);
@@ -3002,21 +3000,19 @@ static int be_ctrl_init(struct be_adapter *adapter)
30023000
status = -ENOMEM;
30033001
goto unmap_pci_bars;
30043002
}
3005-
30063003
mbox_mem_align->size = sizeof(struct be_mcc_mailbox);
30073004
mbox_mem_align->va = PTR_ALIGN(mbox_mem_alloc->va, 16);
30083005
mbox_mem_align->dma = PTR_ALIGN(mbox_mem_alloc->dma, 16);
30093006
memset(mbox_mem_align->va, 0, sizeof(struct be_mcc_mailbox));
30103007

3011-
mc_cmd_mem->size = sizeof(struct be_cmd_req_mcast_mac_config);
3012-
mc_cmd_mem->va = dma_alloc_coherent(&adapter->pdev->dev,
3013-
mc_cmd_mem->size, &mc_cmd_mem->dma,
3014-
GFP_KERNEL);
3015-
if (mc_cmd_mem->va == NULL) {
3008+
rx_filter->size = sizeof(struct be_cmd_req_rx_filter);
3009+
rx_filter->va = dma_alloc_coherent(&adapter->pdev->dev, rx_filter->size,
3010+
&rx_filter->dma, GFP_KERNEL);
3011+
if (rx_filter->va == NULL) {
30163012
status = -ENOMEM;
30173013
goto free_mbox;
30183014
}
3019-
memset(mc_cmd_mem->va, 0, mc_cmd_mem->size);
3015+
memset(rx_filter->va, 0, rx_filter->size);
30203016

30213017
mutex_init(&adapter->mbox_lock);
30223018
spin_lock_init(&adapter->mcc_lock);

0 commit comments

Comments
 (0)