aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ixgbe/ixgbe_dcb_nl.c
diff options
context:
space:
mode:
authorJohn Fastabend <john.r.fastabend@intel.com>2011-06-18 03:40:04 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2011-06-25 03:15:58 -0400
commit42532da64e9c4102decab8f37cf3959af55789a4 (patch)
treec6a8f23587bcc9b270ee8f275a2b3d8a4f626d6e /drivers/net/ixgbe/ixgbe_dcb_nl.c
parent3b3bf3b92b313db62a07869a649533f7f4f25c24 (diff)
ixgbe: implement DCB ops dcb_ieee_del()
Implement DCB ops dcb_ieee_del() and set FCoE to the default priority when no priority exists. Signed-off-by: John Fastabend <john.r.fastabend@intel.com> Tested-by: Ross Brattain <ross.b.brattain@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/ixgbe/ixgbe_dcb_nl.c')
-rw-r--r--drivers/net/ixgbe/ixgbe_dcb_nl.c48
1 files changed, 42 insertions, 6 deletions
diff --git a/drivers/net/ixgbe/ixgbe_dcb_nl.c b/drivers/net/ixgbe/ixgbe_dcb_nl.c
index 1a137650351..0ace6ce1d0b 100644
--- a/drivers/net/ixgbe/ixgbe_dcb_nl.c
+++ b/drivers/net/ixgbe/ixgbe_dcb_nl.c
@@ -670,6 +670,22 @@ static int ixgbe_dcbnl_ieee_setpfc(struct net_device *dev,
670 return err; 670 return err;
671} 671}
672 672
673#ifdef IXGBE_FCOE
674static void ixgbe_dcbnl_devreset(struct net_device *dev)
675{
676 struct ixgbe_adapter *adapter = netdev_priv(dev);
677
678 if (netif_running(dev))
679 dev->netdev_ops->ndo_stop(dev);
680
681 ixgbe_clear_interrupt_scheme(adapter);
682 ixgbe_init_interrupt_scheme(adapter);
683
684 if (netif_running(dev))
685 dev->netdev_ops->ndo_open(dev);
686}
687#endif
688
673static int ixgbe_dcbnl_ieee_setapp(struct net_device *dev, 689static int ixgbe_dcbnl_ieee_setapp(struct net_device *dev,
674 struct dcb_app *app) 690 struct dcb_app *app)
675{ 691{
@@ -690,15 +706,34 @@ static int ixgbe_dcbnl_ieee_setapp(struct net_device *dev,
690 return err; 706 return err;
691 707
692 adapter->fcoe.up = app->priority; 708 adapter->fcoe.up = app->priority;
709 ixgbe_dcbnl_devreset(dev);
710 }
711#endif
712 return 0;
713}
714
715static int ixgbe_dcbnl_ieee_delapp(struct net_device *dev,
716 struct dcb_app *app)
717{
718 struct ixgbe_adapter *adapter = netdev_priv(dev);
719 int err;
720
721 if (!(adapter->dcbx_cap & DCB_CAP_DCBX_VER_IEEE))
722 return -EINVAL;
693 723
694 if (netif_running(dev)) 724 err = dcb_ieee_delapp(dev, app);
695 dev->netdev_ops->ndo_stop(dev);
696 725
697 ixgbe_clear_interrupt_scheme(adapter); 726#ifdef IXGBE_FCOE
698 ixgbe_init_interrupt_scheme(adapter); 727 if (!err && app->selector == IEEE_8021QAZ_APP_SEL_ETHERTYPE &&
728 app->protocol == ETH_P_FCOE) {
729 u8 app_mask = dcb_ieee_getapp_mask(dev, app);
730
731 if (app_mask & (1 << adapter->fcoe.up))
732 return err;
699 733
700 if (netif_running(dev)) 734 adapter->fcoe.up = app_mask ?
701 dev->netdev_ops->ndo_open(dev); 735 ffs(app_mask) - 1 : IXGBE_FCOE_DEFTC;
736 ixgbe_dcbnl_devreset(dev);
702 } 737 }
703#endif 738#endif
704 return err; 739 return err;
@@ -755,6 +790,7 @@ const struct dcbnl_rtnl_ops dcbnl_ops = {
755 .ieee_getpfc = ixgbe_dcbnl_ieee_getpfc, 790 .ieee_getpfc = ixgbe_dcbnl_ieee_getpfc,
756 .ieee_setpfc = ixgbe_dcbnl_ieee_setpfc, 791 .ieee_setpfc = ixgbe_dcbnl_ieee_setpfc,
757 .ieee_setapp = ixgbe_dcbnl_ieee_setapp, 792 .ieee_setapp = ixgbe_dcbnl_ieee_setapp,
793 .ieee_delapp = ixgbe_dcbnl_ieee_delapp,
758 .getstate = ixgbe_dcbnl_get_state, 794 .getstate = ixgbe_dcbnl_get_state,
759 .setstate = ixgbe_dcbnl_set_state, 795 .setstate = ixgbe_dcbnl_set_state,
760 .getpermhwaddr = ixgbe_dcbnl_get_perm_hw_addr, 796 .getpermhwaddr = ixgbe_dcbnl_get_perm_hw_addr,