Skip to content

Commit

Permalink
qlcnic: enable mac-learning in promiscous mode.
Browse files Browse the repository at this point in the history
MAC learning is required in bridge mode.
During bridge mode device will be put in promiscous mode.

Signed-off-by: Sucheta Chakraborty <sucheta.chakraborty@qlogic.com>
Signed-off-by: Amit Kumar Salecha <amit.salecha@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Sucheta Chakraborty authored and David S. Miller committed Jul 14, 2011
1 parent a941fef commit e5dcf6d
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 6 deletions.
2 changes: 2 additions & 0 deletions drivers/net/qlcnic/qlcnic.h
Original file line number Diff line number Diff line change
Expand Up @@ -1015,6 +1015,7 @@ struct qlcnic_adapter {
u8 mac_addr[ETH_ALEN];

u64 dev_rst_time;
u8 mac_learn;
unsigned long vlans[BITS_TO_LONGS(VLAN_N_VID)];

struct qlcnic_npar_info *npars;
Expand Down Expand Up @@ -1460,6 +1461,7 @@ netdev_tx_t qlcnic_xmit_frame(struct sk_buff *skb, struct net_device *netdev);
int qlcnic_validate_max_rss(struct net_device *netdev, u8 max_hw, u8 val);
int qlcnic_set_max_rss(struct qlcnic_adapter *adapter, u8 data);
void qlcnic_dev_request_reset(struct qlcnic_adapter *);
void qlcnic_alloc_lb_filters_mem(struct qlcnic_adapter *adapter);

/* Management functions */
int qlcnic_get_mac_address(struct qlcnic_adapter *, u8*);
Expand Down
7 changes: 7 additions & 0 deletions drivers/net/qlcnic/qlcnic_hw.c
Original file line number Diff line number Diff line change
Expand Up @@ -446,6 +446,13 @@ void qlcnic_set_multi(struct net_device *netdev)
}

send_fw_cmd:
if (mode == VPORT_MISS_MODE_ACCEPT_ALL) {
qlcnic_alloc_lb_filters_mem(adapter);
adapter->mac_learn = 1;
} else {
adapter->mac_learn = 0;
}

qlcnic_nic_set_promisc(adapter, mode);
}

Expand Down
13 changes: 7 additions & 6 deletions drivers/net/qlcnic/qlcnic_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,6 @@ static struct net_device_stats *qlcnic_get_stats(struct net_device *netdev);
static void qlcnic_restore_indev_addr(struct net_device *dev, unsigned long);
static int qlcnic_start_firmware(struct qlcnic_adapter *);

static void qlcnic_alloc_lb_filters_mem(struct qlcnic_adapter *adapter);
static void qlcnic_free_lb_filters_mem(struct qlcnic_adapter *adapter);
static void qlcnic_dev_set_npar_ready(struct qlcnic_adapter *);
static int qlcnicvf_config_led(struct qlcnic_adapter *, u32, u32);
Expand Down Expand Up @@ -1578,6 +1577,7 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
adapter->dev_rst_time = jiffies;
revision_id = pdev->revision;
adapter->ahw->revision_id = revision_id;
adapter->mac_learn = qlcnic_mac_learn;

rwlock_init(&adapter->ahw->crb_lock);
mutex_init(&adapter->ahw->mem_lock);
Expand Down Expand Up @@ -1654,7 +1654,9 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
break;
}

qlcnic_alloc_lb_filters_mem(adapter);
if (adapter->mac_learn)
qlcnic_alloc_lb_filters_mem(adapter);

qlcnic_create_diag_entries(adapter);

return 0;
Expand Down Expand Up @@ -1850,13 +1852,12 @@ static int qlcnic_close(struct net_device *netdev)
return 0;
}

static void
qlcnic_alloc_lb_filters_mem(struct qlcnic_adapter *adapter)
void qlcnic_alloc_lb_filters_mem(struct qlcnic_adapter *adapter)
{
void *head;
int i;

if (!qlcnic_mac_learn)
if (adapter->fhash.fmax && adapter->fhash.fhead)
return;

spin_lock_init(&adapter->mac_learn_lock);
Expand Down Expand Up @@ -2286,7 +2287,7 @@ qlcnic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
if (unlikely(qlcnic_tx_pkt(adapter, first_desc, skb)))
goto unwind_buff;

if (qlcnic_mac_learn)
if (adapter->mac_learn)
qlcnic_send_filter(adapter, tx_ring, first_desc, skb);

qlcnic_update_cmd_producer(adapter, tx_ring);
Expand Down

0 comments on commit e5dcf6d

Please sign in to comment.