octeontx2-nicvf: add ndo_set_rx_mode support for multicast & promisc
Add ndo_set_rx_mode callback handler to configure promisc, multicast and allmulti options for VF driver. Also, modified PF driver ndo_set_rx_mode handler to support multicast and promisc mode independently. Signed-off-by: Naveen Mamindlapalli <naveenm@marvell.com> Signed-off-by: Sunil Kovvuri Goutham <Sunil.Goutham@marvell.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
967db3529e
commit
cbc100aa22
@ -395,6 +395,42 @@ static netdev_tx_t otx2vf_xmit(struct sk_buff *skb, struct net_device *netdev)
|
|||||||
return NETDEV_TX_OK;
|
return NETDEV_TX_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void otx2vf_set_rx_mode(struct net_device *netdev)
|
||||||
|
{
|
||||||
|
struct otx2_nic *vf = netdev_priv(netdev);
|
||||||
|
|
||||||
|
queue_work(vf->otx2_wq, &vf->rx_mode_work);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void otx2vf_do_set_rx_mode(struct work_struct *work)
|
||||||
|
{
|
||||||
|
struct otx2_nic *vf = container_of(work, struct otx2_nic, rx_mode_work);
|
||||||
|
struct net_device *netdev = vf->netdev;
|
||||||
|
unsigned int flags = netdev->flags;
|
||||||
|
struct nix_rx_mode *req;
|
||||||
|
|
||||||
|
mutex_lock(&vf->mbox.lock);
|
||||||
|
|
||||||
|
req = otx2_mbox_alloc_msg_nix_set_rx_mode(&vf->mbox);
|
||||||
|
if (!req) {
|
||||||
|
mutex_unlock(&vf->mbox.lock);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
req->mode = NIX_RX_MODE_UCAST;
|
||||||
|
|
||||||
|
if (flags & IFF_PROMISC)
|
||||||
|
req->mode |= NIX_RX_MODE_PROMISC;
|
||||||
|
if (flags & (IFF_ALLMULTI | IFF_MULTICAST))
|
||||||
|
req->mode |= NIX_RX_MODE_ALLMULTI;
|
||||||
|
|
||||||
|
req->mode |= NIX_RX_MODE_USE_MCE;
|
||||||
|
|
||||||
|
otx2_sync_mbox_msg(&vf->mbox);
|
||||||
|
|
||||||
|
mutex_unlock(&vf->mbox.lock);
|
||||||
|
}
|
||||||
|
|
||||||
static int otx2vf_change_mtu(struct net_device *netdev, int new_mtu)
|
static int otx2vf_change_mtu(struct net_device *netdev, int new_mtu)
|
||||||
{
|
{
|
||||||
bool if_up = netif_running(netdev);
|
bool if_up = netif_running(netdev);
|
||||||
@ -432,12 +468,24 @@ static const struct net_device_ops otx2vf_netdev_ops = {
|
|||||||
.ndo_open = otx2vf_open,
|
.ndo_open = otx2vf_open,
|
||||||
.ndo_stop = otx2vf_stop,
|
.ndo_stop = otx2vf_stop,
|
||||||
.ndo_start_xmit = otx2vf_xmit,
|
.ndo_start_xmit = otx2vf_xmit,
|
||||||
|
.ndo_set_rx_mode = otx2vf_set_rx_mode,
|
||||||
.ndo_set_mac_address = otx2_set_mac_address,
|
.ndo_set_mac_address = otx2_set_mac_address,
|
||||||
.ndo_change_mtu = otx2vf_change_mtu,
|
.ndo_change_mtu = otx2vf_change_mtu,
|
||||||
.ndo_get_stats64 = otx2_get_stats64,
|
.ndo_get_stats64 = otx2_get_stats64,
|
||||||
.ndo_tx_timeout = otx2_tx_timeout,
|
.ndo_tx_timeout = otx2_tx_timeout,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int otx2_wq_init(struct otx2_nic *vf)
|
||||||
|
{
|
||||||
|
vf->otx2_wq = create_singlethread_workqueue("otx2vf_wq");
|
||||||
|
if (!vf->otx2_wq)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
INIT_WORK(&vf->rx_mode_work, otx2vf_do_set_rx_mode);
|
||||||
|
INIT_WORK(&vf->reset_task, otx2vf_reset_task);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int otx2vf_realloc_msix_vectors(struct otx2_nic *vf)
|
static int otx2vf_realloc_msix_vectors(struct otx2_nic *vf)
|
||||||
{
|
{
|
||||||
struct otx2_hw *hw = &vf->hw;
|
struct otx2_hw *hw = &vf->hw;
|
||||||
@ -588,8 +636,6 @@ static int otx2vf_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||||||
netdev->min_mtu = OTX2_MIN_MTU;
|
netdev->min_mtu = OTX2_MIN_MTU;
|
||||||
netdev->max_mtu = otx2_get_max_mtu(vf);
|
netdev->max_mtu = otx2_get_max_mtu(vf);
|
||||||
|
|
||||||
INIT_WORK(&vf->reset_task, otx2vf_reset_task);
|
|
||||||
|
|
||||||
/* To distinguish, for LBK VFs set netdev name explicitly */
|
/* To distinguish, for LBK VFs set netdev name explicitly */
|
||||||
if (is_otx2_lbkvf(vf->pdev)) {
|
if (is_otx2_lbkvf(vf->pdev)) {
|
||||||
int n;
|
int n;
|
||||||
@ -606,6 +652,10 @@ static int otx2vf_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||||||
goto err_detach_rsrc;
|
goto err_detach_rsrc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = otx2_wq_init(vf);
|
||||||
|
if (err)
|
||||||
|
goto err_unreg_netdev;
|
||||||
|
|
||||||
otx2vf_set_ethtool_ops(netdev);
|
otx2vf_set_ethtool_ops(netdev);
|
||||||
|
|
||||||
/* Enable pause frames by default */
|
/* Enable pause frames by default */
|
||||||
@ -614,6 +664,8 @@ static int otx2vf_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
err_unreg_netdev:
|
||||||
|
unregister_netdev(netdev);
|
||||||
err_detach_rsrc:
|
err_detach_rsrc:
|
||||||
if (hw->lmt_base)
|
if (hw->lmt_base)
|
||||||
iounmap(hw->lmt_base);
|
iounmap(hw->lmt_base);
|
||||||
@ -644,6 +696,8 @@ static void otx2vf_remove(struct pci_dev *pdev)
|
|||||||
|
|
||||||
cancel_work_sync(&vf->reset_task);
|
cancel_work_sync(&vf->reset_task);
|
||||||
unregister_netdev(netdev);
|
unregister_netdev(netdev);
|
||||||
|
if (vf->otx2_wq)
|
||||||
|
destroy_workqueue(vf->otx2_wq);
|
||||||
otx2vf_disable_mbox_intr(vf);
|
otx2vf_disable_mbox_intr(vf);
|
||||||
otx2_detach_resources(&vf->mbox);
|
otx2_detach_resources(&vf->mbox);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user