|
@@ -642,8 +642,9 @@ static int ixgbe_dcbnl_ieee_setets(struct net_device *dev,
|
|
{
|
|
{
|
|
struct ixgbe_adapter *adapter = netdev_priv(dev);
|
|
struct ixgbe_adapter *adapter = netdev_priv(dev);
|
|
__u16 refill[IEEE_8021QAZ_MAX_TCS], max[IEEE_8021QAZ_MAX_TCS];
|
|
__u16 refill[IEEE_8021QAZ_MAX_TCS], max[IEEE_8021QAZ_MAX_TCS];
|
|
|
|
+ __u8 prio_type[IEEE_8021QAZ_MAX_TCS];
|
|
int max_frame = dev->mtu + ETH_HLEN + ETH_FCS_LEN;
|
|
int max_frame = dev->mtu + ETH_HLEN + ETH_FCS_LEN;
|
|
- int err;
|
|
|
|
|
|
+ int i, err;
|
|
/* naively give each TC a bwg to map onto CEE hardware */
|
|
/* naively give each TC a bwg to map onto CEE hardware */
|
|
__u8 bwg_id[IEEE_8021QAZ_MAX_TCS] = {0, 1, 2, 3, 4, 5, 6, 7};
|
|
__u8 bwg_id[IEEE_8021QAZ_MAX_TCS] = {0, 1, 2, 3, 4, 5, 6, 7};
|
|
|
|
|
|
@@ -659,9 +660,28 @@ static int ixgbe_dcbnl_ieee_setets(struct net_device *dev,
|
|
|
|
|
|
memcpy(adapter->ixgbe_ieee_ets, ets, sizeof(*adapter->ixgbe_ieee_ets));
|
|
memcpy(adapter->ixgbe_ieee_ets, ets, sizeof(*adapter->ixgbe_ieee_ets));
|
|
|
|
|
|
|
|
+ /* Map TSA onto CEE prio type */
|
|
|
|
+ for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) {
|
|
|
|
+ switch (ets->tc_tsa[i]) {
|
|
|
|
+ case IEEE_8021QAZ_TSA_STRICT:
|
|
|
|
+ prio_type[i] = 2;
|
|
|
|
+ break;
|
|
|
|
+ case IEEE_8021QAZ_TSA_ETS:
|
|
|
|
+ prio_type[i] = 0;
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ /* Hardware only supports priority strict or
|
|
|
|
+ * ETS transmission selection algorithms if
|
|
|
|
+ * we receive some other value from dcbnl
|
|
|
|
+ * throw an error
|
|
|
|
+ */
|
|
|
|
+ return -EINVAL;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
ixgbe_ieee_credits(ets->tc_tx_bw, refill, max, max_frame);
|
|
ixgbe_ieee_credits(ets->tc_tx_bw, refill, max, max_frame);
|
|
err = ixgbe_dcb_hw_ets_config(&adapter->hw, refill, max,
|
|
err = ixgbe_dcb_hw_ets_config(&adapter->hw, refill, max,
|
|
- bwg_id, ets->tc_tsa);
|
|
|
|
|
|
+ bwg_id, prio_type);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|