diff options
author | John Fastabend <john.r.fastabend@intel.com> | 2011-06-18 03:40:04 -0400 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2011-06-25 03:15:58 -0400 |
commit | 42532da64e9c4102decab8f37cf3959af55789a4 (patch) | |
tree | c6a8f23587bcc9b270ee8f275a2b3d8a4f626d6e /drivers/net/ixgbe/ixgbe_dcb_nl.c | |
parent | 3b3bf3b92b313db62a07869a649533f7f4f25c24 (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.c | 48 |
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 | ||
674 | static 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 | |||
673 | static int ixgbe_dcbnl_ieee_setapp(struct net_device *dev, | 689 | static 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 | |||
715 | static 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, |