|
@@ -563,34 +563,41 @@ err_exit:
|
|
|
|
|
|
|
|
int aq_nic_set_multicast_list(struct aq_nic_s *self, struct net_device *ndev)
|
|
int aq_nic_set_multicast_list(struct aq_nic_s *self, struct net_device *ndev)
|
|
|
{
|
|
{
|
|
|
|
|
+ unsigned int packet_filter = self->packet_filter;
|
|
|
struct netdev_hw_addr *ha = NULL;
|
|
struct netdev_hw_addr *ha = NULL;
|
|
|
unsigned int i = 0U;
|
|
unsigned int i = 0U;
|
|
|
|
|
|
|
|
- self->mc_list.count = 0U;
|
|
|
|
|
-
|
|
|
|
|
- netdev_for_each_mc_addr(ha, ndev) {
|
|
|
|
|
- ether_addr_copy(self->mc_list.ar[i++], ha->addr);
|
|
|
|
|
- ++self->mc_list.count;
|
|
|
|
|
|
|
+ self->mc_list.count = 0;
|
|
|
|
|
+ if (netdev_uc_count(ndev) > AQ_HW_MULTICAST_ADDRESS_MAX) {
|
|
|
|
|
+ packet_filter |= IFF_PROMISC;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ netdev_for_each_uc_addr(ha, ndev) {
|
|
|
|
|
+ ether_addr_copy(self->mc_list.ar[i++], ha->addr);
|
|
|
|
|
|
|
|
- if (i >= AQ_CFG_MULTICAST_ADDRESS_MAX)
|
|
|
|
|
- break;
|
|
|
|
|
|
|
+ if (i >= AQ_HW_MULTICAST_ADDRESS_MAX)
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if (i >= AQ_CFG_MULTICAST_ADDRESS_MAX) {
|
|
|
|
|
- /* Number of filters is too big: atlantic does not support this.
|
|
|
|
|
- * Force all multi filter to support this.
|
|
|
|
|
- * With this we disable all UC filters and setup "all pass"
|
|
|
|
|
- * multicast mask
|
|
|
|
|
- */
|
|
|
|
|
- self->packet_filter |= IFF_ALLMULTI;
|
|
|
|
|
- self->aq_nic_cfg.mc_list_count = 0;
|
|
|
|
|
- return self->aq_hw_ops->hw_packet_filter_set(self->aq_hw,
|
|
|
|
|
- self->packet_filter);
|
|
|
|
|
|
|
+ if (i + netdev_mc_count(ndev) > AQ_HW_MULTICAST_ADDRESS_MAX) {
|
|
|
|
|
+ packet_filter |= IFF_ALLMULTI;
|
|
|
} else {
|
|
} else {
|
|
|
- return self->aq_hw_ops->hw_multicast_list_set(self->aq_hw,
|
|
|
|
|
- self->mc_list.ar,
|
|
|
|
|
- self->mc_list.count);
|
|
|
|
|
|
|
+ netdev_for_each_mc_addr(ha, ndev) {
|
|
|
|
|
+ ether_addr_copy(self->mc_list.ar[i++], ha->addr);
|
|
|
|
|
+
|
|
|
|
|
+ if (i >= AQ_HW_MULTICAST_ADDRESS_MAX)
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (i > 0 && i < AQ_HW_MULTICAST_ADDRESS_MAX) {
|
|
|
|
|
+ packet_filter |= IFF_MULTICAST;
|
|
|
|
|
+ self->mc_list.count = i;
|
|
|
|
|
+ self->aq_hw_ops->hw_multicast_list_set(self->aq_hw,
|
|
|
|
|
+ self->mc_list.ar,
|
|
|
|
|
+ self->mc_list.count);
|
|
|
}
|
|
}
|
|
|
|
|
+ return aq_nic_set_packet_filter(self, packet_filter);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
int aq_nic_set_mtu(struct aq_nic_s *self, int new_mtu)
|
|
int aq_nic_set_mtu(struct aq_nic_s *self, int new_mtu)
|