|
@@ -522,6 +522,9 @@ void ixgbe_configure_fcoe(struct ixgbe_adapter *adapter)
|
|
|
/* Enable L2 eth type filter for FCoE */
|
|
|
IXGBE_WRITE_REG(hw, IXGBE_ETQF(IXGBE_ETQF_FILTER_FCOE),
|
|
|
(ETH_P_FCOE | IXGBE_ETQF_FCOE | IXGBE_ETQF_FILTER_EN));
|
|
|
+ /* Enable L2 eth type filter for FIP */
|
|
|
+ IXGBE_WRITE_REG(hw, IXGBE_ETQF(IXGBE_ETQF_FILTER_FIP),
|
|
|
+ (ETH_P_FIP | IXGBE_ETQF_FILTER_EN));
|
|
|
if (adapter->ring_feature[RING_F_FCOE].indices) {
|
|
|
/* Use multiple rx queues for FCoE by redirection table */
|
|
|
for (i = 0; i < IXGBE_FCRETA_SIZE; i++) {
|
|
@@ -532,6 +535,12 @@ void ixgbe_configure_fcoe(struct ixgbe_adapter *adapter)
|
|
|
}
|
|
|
IXGBE_WRITE_REG(hw, IXGBE_FCRECTL, IXGBE_FCRECTL_ENA);
|
|
|
IXGBE_WRITE_REG(hw, IXGBE_ETQS(IXGBE_ETQF_FILTER_FCOE), 0);
|
|
|
+ fcoe_i = f->mask;
|
|
|
+ fcoe_i &= IXGBE_FCRETA_ENTRY_MASK;
|
|
|
+ fcoe_q = adapter->rx_ring[fcoe_i]->reg_idx;
|
|
|
+ IXGBE_WRITE_REG(hw, IXGBE_ETQS(IXGBE_ETQF_FILTER_FIP),
|
|
|
+ IXGBE_ETQS_QUEUE_EN |
|
|
|
+ (fcoe_q << IXGBE_ETQS_RX_QUEUE_SHIFT));
|
|
|
} else {
|
|
|
/* Use single rx queue for FCoE */
|
|
|
fcoe_i = f->mask;
|
|
@@ -541,6 +550,12 @@ void ixgbe_configure_fcoe(struct ixgbe_adapter *adapter)
|
|
|
IXGBE_ETQS_QUEUE_EN |
|
|
|
(fcoe_q << IXGBE_ETQS_RX_QUEUE_SHIFT));
|
|
|
}
|
|
|
+ /* send FIP frames to the first FCoE queue */
|
|
|
+ fcoe_i = f->mask;
|
|
|
+ fcoe_q = adapter->rx_ring[fcoe_i]->reg_idx;
|
|
|
+ IXGBE_WRITE_REG(hw, IXGBE_ETQS(IXGBE_ETQF_FILTER_FIP),
|
|
|
+ IXGBE_ETQS_QUEUE_EN |
|
|
|
+ (fcoe_q << IXGBE_ETQS_RX_QUEUE_SHIFT));
|
|
|
|
|
|
IXGBE_WRITE_REG(hw, IXGBE_FCRXCTRL,
|
|
|
IXGBE_FCRXCTRL_FCOELLI |
|