]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - src/patches/suse-2.6.27.25/patches.drivers/ixgbe-dcb-setstate.patch
Reenabled linux-xen and xen-image build
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.25 / patches.drivers / ixgbe-dcb-setstate.patch
1 From: John Ronciak <john.ronciak@intel.com>
2 Subject: Bugfix for ixgbe and kernel DCB netlink code
3 Acked-by: Karsten Keil <kkeil@novell.com>
4 Reference: bnc#458194
5
6 The patch file ixgbe-dcb-setstate.patch, created against the SLES11 Beta6
7 kernel source, contains the following fixes:
8
9 Change to ixgbe:
10 - Fix the DCB setstate operation function to check and not attempt to
11 enable DCB if MSI-X is not enabled. Return a success/failure status to the DCB
12 netlink layer.
13
14 Change to DCB netlink in kernel:
15 - Accept a success/failure status from the DCB setstate operation
16 function.
17
18 - Fix the dcbnl_setnumtcs routine to check for the presence of the
19 setnumtcs operation function (instead of setstate)
20
21 We are in the process of pushing these changes to the upstream kernel as well.
22
23 diff -Naurp linux-2.6.27.7-4/drivers/net/ixgbe/ixgbe_dcb_nl.c linux-2.6.27.7-4-new/drivers/net/ixgbe/ixgbe_dcb_nl.c
24 --- linux-2.6.27.7-4/drivers/net/ixgbe/ixgbe_dcb_nl.c 2008-12-10 14:12:15.000000000 -0800
25 +++ linux-2.6.27.7-4-new/drivers/net/ixgbe/ixgbe_dcb_nl.c 2008-12-09 15:50:21.000000000 -0800
26 @@ -126,7 +126,7 @@ static u16 ixgbe_dcb_select_queue(struct
27 return 0;
28 }
29
30 -static void ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)
31 +static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)
32 {
33 struct ixgbe_adapter *adapter = netdev_priv(netdev);
34
35 @@ -135,25 +135,30 @@ static void ixgbe_dcbnl_set_state(struct
36 if (state > 0) {
37 /* Turn on DCB */
38 if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) {
39 - return;
40 - } else {
41 - if (netif_running(netdev))
42 - netdev->stop(netdev);
43 - ixgbe_reset_interrupt_capability(adapter);
44 - ixgbe_napi_del_all(adapter);
45 - kfree(adapter->tx_ring);
46 - kfree(adapter->rx_ring);
47 - adapter->tx_ring = NULL;
48 - adapter->rx_ring = NULL;
49 - netdev->select_queue = &ixgbe_dcb_select_queue;
50 + return 0;
51 + }
52
53 - adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED;
54 - adapter->flags |= IXGBE_FLAG_DCB_ENABLED;
55 - ixgbe_init_interrupt_scheme(adapter);
56 - ixgbe_napi_add_all(adapter);
57 - if (netif_running(netdev))
58 - netdev->open(netdev);
59 - }
60 + if (!(adapter->flags & IXGBE_FLAG_MSIX_ENABLED)) {
61 + DPRINTK(DRV, ERR, "Enable Failed, needs MSI-X\n");
62 + return 1;
63 + }
64 +
65 + if (netif_running(netdev))
66 + netdev->stop(netdev);
67 + ixgbe_reset_interrupt_capability(adapter);
68 + ixgbe_napi_del_all(adapter);
69 + kfree(adapter->tx_ring);
70 + kfree(adapter->rx_ring);
71 + adapter->tx_ring = NULL;
72 + adapter->rx_ring = NULL;
73 + netdev->select_queue = &ixgbe_dcb_select_queue;
74 +
75 + adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED;
76 + adapter->flags |= IXGBE_FLAG_DCB_ENABLED;
77 + ixgbe_init_interrupt_scheme(adapter);
78 + ixgbe_napi_add_all(adapter);
79 + if (netif_running(netdev))
80 + netdev->open(netdev);
81 } else {
82 /* Turn off DCB */
83 if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) {
84 @@ -173,10 +178,9 @@ static void ixgbe_dcbnl_set_state(struct
85 ixgbe_napi_add_all(adapter);
86 if (netif_running(netdev))
87 netdev->open(netdev);
88 - } else {
89 - return;
90 }
91 }
92 + return 0;
93 }
94
95 static void ixgbe_dcbnl_get_perm_hw_addr(struct net_device *netdev,
96 diff -Naurp linux-2.6.27.7-4/include/net/dcbnl.h linux-2.6.27.7-4-new/include/net/dcbnl.h
97 --- linux-2.6.27.7-4/include/net/dcbnl.h 2008-12-10 14:00:13.000000000 -0800
98 +++ linux-2.6.27.7-4-new/include/net/dcbnl.h 2008-12-10 14:22:03.000000000 -0800
99 @@ -13,7 +13,7 @@
100 */
101 struct dcbnl_rtnl_ops {
102 u8 (*getstate)(struct net_device *);
103 - void (*setstate)(struct net_device *, u8);
104 + u8 (*setstate)(struct net_device *, u8);
105 void (*getpermhwaddr)(struct net_device *, u8 *);
106 void (*setpgtccfgtx)(struct net_device *, int, u8, u8, u8, u8);
107 void (*setpgbwgcfgtx)(struct net_device *, int, u8);
108 diff -Naurp linux-2.6.27.7-4/net/dcb/dcbnl.c linux-2.6.27.7-4-new/net/dcb/dcbnl.c
109 --- linux-2.6.27.7-4/net/dcb/dcbnl.c 2008-12-10 13:59:34.000000000 -0800
110 +++ linux-2.6.27.7-4-new/net/dcb/dcbnl.c 2008-12-10 14:26:41.000000000 -0800
111 @@ -437,7 +437,7 @@ static int dcbnl_setnumtcs(struct net_de
112 u8 value;
113 int i;
114
115 - if (!tb[DCB_ATTR_NUMTCS] || !netdev->dcbnl_ops->setstate)
116 + if (!tb[DCB_ATTR_NUMTCS] || !netdev->dcbnl_ops->setnumtcs)
117 return ret;
118
119 ret = nla_parse_nested(data, DCB_NUMTCS_ATTR_MAX, tb[DCB_ATTR_NUMTCS],
120 @@ -682,10 +682,8 @@ static int dcbnl_setstate(struct net_dev
121
122 value = nla_get_u8(tb[DCB_ATTR_STATE]);
123
124 - netdev->dcbnl_ops->setstate(netdev, value);
125 -
126 - ret = dcbnl_reply(0, RTM_SETDCB, DCB_CMD_SSTATE, DCB_ATTR_STATE,
127 - pid, seq, flags);
128 + ret = dcbnl_reply(netdev->dcbnl_ops->setstate(netdev, value),
129 + RTM_SETDCB, DCB_CMD_SSTATE, DCB_ATTR_STATE, pid, seq, flags);
130
131 return ret;
132 }