diff options
-rw-r--r-- | drivers/net/ethernet/atheros/atl1e/atl1e_main.c | 46 |
1 files changed, 42 insertions, 4 deletions
diff --git a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c index 1966444590f6..7a73f3a9fcb5 100644 --- a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c +++ b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c | |||
@@ -313,6 +313,34 @@ static void atl1e_set_multi(struct net_device *netdev) | |||
313 | } | 313 | } |
314 | } | 314 | } |
315 | 315 | ||
316 | static void __atl1e_rx_mode(netdev_features_t features, u32 *mac_ctrl_data) | ||
317 | { | ||
318 | |||
319 | if (features & NETIF_F_RXALL) { | ||
320 | /* enable RX of ALL frames */ | ||
321 | *mac_ctrl_data |= MAC_CTRL_DBG; | ||
322 | } else { | ||
323 | /* disable RX of ALL frames */ | ||
324 | *mac_ctrl_data &= ~MAC_CTRL_DBG; | ||
325 | } | ||
326 | } | ||
327 | |||
328 | static void atl1e_rx_mode(struct net_device *netdev, | ||
329 | netdev_features_t features) | ||
330 | { | ||
331 | struct atl1e_adapter *adapter = netdev_priv(netdev); | ||
332 | u32 mac_ctrl_data = 0; | ||
333 | |||
334 | netdev_dbg(adapter->netdev, "%s\n", __func__); | ||
335 | |||
336 | atl1e_irq_disable(adapter); | ||
337 | mac_ctrl_data = AT_READ_REG(&adapter->hw, REG_MAC_CTRL); | ||
338 | __atl1e_rx_mode(features, &mac_ctrl_data); | ||
339 | AT_WRITE_REG(&adapter->hw, REG_MAC_CTRL, mac_ctrl_data); | ||
340 | atl1e_irq_enable(adapter); | ||
341 | } | ||
342 | |||
343 | |||
316 | static void __atl1e_vlan_mode(netdev_features_t features, u32 *mac_ctrl_data) | 344 | static void __atl1e_vlan_mode(netdev_features_t features, u32 *mac_ctrl_data) |
317 | { | 345 | { |
318 | if (features & NETIF_F_HW_VLAN_CTAG_RX) { | 346 | if (features & NETIF_F_HW_VLAN_CTAG_RX) { |
@@ -394,6 +422,10 @@ static int atl1e_set_features(struct net_device *netdev, | |||
394 | if (changed & NETIF_F_HW_VLAN_CTAG_RX) | 422 | if (changed & NETIF_F_HW_VLAN_CTAG_RX) |
395 | atl1e_vlan_mode(netdev, features); | 423 | atl1e_vlan_mode(netdev, features); |
396 | 424 | ||
425 | if (changed & NETIF_F_RXALL) | ||
426 | atl1e_rx_mode(netdev, features); | ||
427 | |||
428 | |||
397 | return 0; | 429 | return 0; |
398 | } | 430 | } |
399 | 431 | ||
@@ -1057,7 +1089,8 @@ static void atl1e_setup_mac_ctrl(struct atl1e_adapter *adapter) | |||
1057 | value |= MAC_CTRL_PROMIS_EN; | 1089 | value |= MAC_CTRL_PROMIS_EN; |
1058 | if (netdev->flags & IFF_ALLMULTI) | 1090 | if (netdev->flags & IFF_ALLMULTI) |
1059 | value |= MAC_CTRL_MC_ALL_EN; | 1091 | value |= MAC_CTRL_MC_ALL_EN; |
1060 | 1092 | if (netdev->features & NETIF_F_RXALL) | |
1093 | value |= MAC_CTRL_DBG; | ||
1061 | AT_WRITE_REG(hw, REG_MAC_CTRL, value); | 1094 | AT_WRITE_REG(hw, REG_MAC_CTRL, value); |
1062 | } | 1095 | } |
1063 | 1096 | ||
@@ -1405,7 +1438,8 @@ static void atl1e_clean_rx_irq(struct atl1e_adapter *adapter, u8 que, | |||
1405 | rx_page_desc[que].rx_nxseq++; | 1438 | rx_page_desc[que].rx_nxseq++; |
1406 | 1439 | ||
1407 | /* error packet */ | 1440 | /* error packet */ |
1408 | if (prrs->pkt_flag & RRS_IS_ERR_FRAME) { | 1441 | if ((prrs->pkt_flag & RRS_IS_ERR_FRAME) && |
1442 | !(netdev->features & NETIF_F_RXALL)) { | ||
1409 | if (prrs->err_flag & (RRS_ERR_BAD_CRC | | 1443 | if (prrs->err_flag & (RRS_ERR_BAD_CRC | |
1410 | RRS_ERR_DRIBBLE | RRS_ERR_CODE | | 1444 | RRS_ERR_DRIBBLE | RRS_ERR_CODE | |
1411 | RRS_ERR_TRUNC)) { | 1445 | RRS_ERR_TRUNC)) { |
@@ -1418,7 +1452,10 @@ static void atl1e_clean_rx_irq(struct atl1e_adapter *adapter, u8 que, | |||
1418 | } | 1452 | } |
1419 | 1453 | ||
1420 | packet_size = ((prrs->word1 >> RRS_PKT_SIZE_SHIFT) & | 1454 | packet_size = ((prrs->word1 >> RRS_PKT_SIZE_SHIFT) & |
1421 | RRS_PKT_SIZE_MASK) - 4; /* CRC */ | 1455 | RRS_PKT_SIZE_MASK); |
1456 | if (likely(!(netdev->features & NETIF_F_RXFCS))) | ||
1457 | packet_size -= 4; /* CRC */ | ||
1458 | |||
1422 | skb = netdev_alloc_skb_ip_align(netdev, packet_size); | 1459 | skb = netdev_alloc_skb_ip_align(netdev, packet_size); |
1423 | if (skb == NULL) | 1460 | if (skb == NULL) |
1424 | goto skip_pkt; | 1461 | goto skip_pkt; |
@@ -2245,7 +2282,8 @@ static int atl1e_init_netdev(struct net_device *netdev, struct pci_dev *pdev) | |||
2245 | NETIF_F_HW_VLAN_CTAG_RX; | 2282 | NETIF_F_HW_VLAN_CTAG_RX; |
2246 | netdev->features = netdev->hw_features | NETIF_F_LLTX | | 2283 | netdev->features = netdev->hw_features | NETIF_F_LLTX | |
2247 | NETIF_F_HW_VLAN_CTAG_TX; | 2284 | NETIF_F_HW_VLAN_CTAG_TX; |
2248 | 2285 | /* not enabled by default */ | |
2286 | netdev->hw_features |= NETIF_F_RXALL | NETIF_F_RXFCS; | ||
2249 | return 0; | 2287 | return 0; |
2250 | } | 2288 | } |
2251 | 2289 | ||