@@ -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-
16551596err :
16561597 spin_unlock_bh (& adapter -> mcc_lock );
16571598 return status ;
0 commit comments