Commit 6e30dd4e authored by Vladislav Zolotarov's avatar Vladislav Zolotarov Committed by David S. Miller

bnx2x: Proper netdev->ndo_set_rx_mode() implementation.

Completed the bnx2x_set_rx_mode() to a proper netdev->ndo_set_rx_mode 
implementation: 
 - Added a missing configuration of a unicast MAC addresses list.
 - Changed bp->dma_lock from being a mutex to a spinlock as long as it's taken
under netdev->addr_list_lock now.
Signed-off-by: default avatarVladislav Zolotarov <vladz@broadcom.com>
Signed-off-by: default avatarEilon Greenstein <eilong@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a8c94b91
...@@ -129,6 +129,7 @@ void bnx2x_panic_dump(struct bnx2x *bp); ...@@ -129,6 +129,7 @@ void bnx2x_panic_dump(struct bnx2x *bp);
#endif #endif
#define bnx2x_mc_addr(ha) ((ha)->addr) #define bnx2x_mc_addr(ha) ((ha)->addr)
#define bnx2x_uc_addr(ha) ((ha)->addr)
#define U64_LO(x) (u32)(((u64)(x)) & 0xffffffff) #define U64_LO(x) (u32)(((u64)(x)) & 0xffffffff)
#define U64_HI(x) (u32)(((u64)(x)) >> 32) #define U64_HI(x) (u32)(((u64)(x)) >> 32)
...@@ -816,6 +817,7 @@ struct bnx2x_slowpath { ...@@ -816,6 +817,7 @@ struct bnx2x_slowpath {
struct eth_stats_query fw_stats; struct eth_stats_query fw_stats;
struct mac_configuration_cmd mac_config; struct mac_configuration_cmd mac_config;
struct mac_configuration_cmd mcast_config; struct mac_configuration_cmd mcast_config;
struct mac_configuration_cmd uc_mac_config;
struct client_init_ramrod_data client_init_data; struct client_init_ramrod_data client_init_data;
/* used by dmae command executer */ /* used by dmae command executer */
...@@ -944,7 +946,7 @@ struct bnx2x { ...@@ -944,7 +946,7 @@ struct bnx2x {
struct eth_spe *spq_prod_bd; struct eth_spe *spq_prod_bd;
struct eth_spe *spq_last_bd; struct eth_spe *spq_last_bd;
__le16 *dsb_sp_prod; __le16 *dsb_sp_prod;
atomic_t spq_left; /* serialize spq */ atomic_t cq_spq_left; /* ETH_XXX ramrods credit */
/* used to synchronize spq accesses */ /* used to synchronize spq accesses */
spinlock_t spq_lock; spinlock_t spq_lock;
...@@ -954,6 +956,7 @@ struct bnx2x { ...@@ -954,6 +956,7 @@ struct bnx2x {
u16 eq_prod; u16 eq_prod;
u16 eq_cons; u16 eq_cons;
__le16 *eq_cons_sb; __le16 *eq_cons_sb;
atomic_t eq_spq_left; /* COMMON_XXX ramrods credit */
/* Flags for marking that there is a STAT_QUERY or /* Flags for marking that there is a STAT_QUERY or
SET_MAC ramrod pending */ SET_MAC ramrod pending */
...@@ -1139,7 +1142,7 @@ struct bnx2x { ...@@ -1139,7 +1142,7 @@ struct bnx2x {
int dmae_ready; int dmae_ready;
/* used to synchronize dmae accesses */ /* used to synchronize dmae accesses */
struct mutex dmae_mutex; spinlock_t dmae_lock;
/* used to protect the FW mail box */ /* used to protect the FW mail box */
struct mutex fw_mb_mutex; struct mutex fw_mb_mutex;
...@@ -1455,6 +1458,12 @@ u32 bnx2x_fw_command(struct bnx2x *bp, u32 command, u32 param); ...@@ -1455,6 +1458,12 @@ u32 bnx2x_fw_command(struct bnx2x *bp, u32 command, u32 param);
void bnx2x_calc_fc_adv(struct bnx2x *bp); void bnx2x_calc_fc_adv(struct bnx2x *bp);
int bnx2x_sp_post(struct bnx2x *bp, int command, int cid, int bnx2x_sp_post(struct bnx2x *bp, int command, int cid,
u32 data_hi, u32 data_lo, int common); u32 data_hi, u32 data_lo, int common);
/* Clears multicast and unicast list configuration in the chip. */
void bnx2x_invalidate_e1_mc_list(struct bnx2x *bp);
void bnx2x_invalidate_e1h_mc_list(struct bnx2x *bp);
void bnx2x_invalidate_uc_list(struct bnx2x *bp);
void bnx2x_update_coalesce(struct bnx2x *bp); void bnx2x_update_coalesce(struct bnx2x *bp);
int bnx2x_get_link_cfg_idx(struct bnx2x *bp); int bnx2x_get_link_cfg_idx(struct bnx2x *bp);
......
...@@ -1452,28 +1452,35 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) ...@@ -1452,28 +1452,35 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
bnx2x_set_eth_mac(bp, 1); bnx2x_set_eth_mac(bp, 1);
/* Clear MC configuration */
if (CHIP_IS_E1(bp))
bnx2x_invalidate_e1_mc_list(bp);
else
bnx2x_invalidate_e1h_mc_list(bp);
/* Clear UC lists configuration */
bnx2x_invalidate_uc_list(bp);
if (bp->port.pmf) if (bp->port.pmf)
bnx2x_initial_phy_init(bp, load_mode); bnx2x_initial_phy_init(bp, load_mode);
/* Initialize Rx filtering */
bnx2x_set_rx_mode(bp->dev);
/* Start fast path */ /* Start fast path */
switch (load_mode) { switch (load_mode) {
case LOAD_NORMAL: case LOAD_NORMAL:
/* Tx queue should be only reenabled */ /* Tx queue should be only reenabled */
netif_tx_wake_all_queues(bp->dev); netif_tx_wake_all_queues(bp->dev);
/* Initialize the receive filter. */ /* Initialize the receive filter. */
bnx2x_set_rx_mode(bp->dev);
break; break;
case LOAD_OPEN: case LOAD_OPEN:
netif_tx_start_all_queues(bp->dev); netif_tx_start_all_queues(bp->dev);
smp_mb__after_clear_bit(); smp_mb__after_clear_bit();
/* Initialize the receive filter. */
bnx2x_set_rx_mode(bp->dev);
break; break;
case LOAD_DIAG: case LOAD_DIAG:
/* Initialize the receive filter. */
bnx2x_set_rx_mode(bp->dev);
bp->state = BNX2X_STATE_DIAG; bp->state = BNX2X_STATE_DIAG;
break; break;
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment