Bug 250482 - Missing function in multiple wifi device drivers causing error "need multicast status callback"
Summary: Missing function in multiple wifi device drivers causing error "need multicas...
Status: New
Alias: None
Product: Base System
Classification: Unclassified
Component: wireless (show other bugs)
Version: 12.1-RELEASE
Hardware: amd64 Any
: --- Affects Many People
Assignee: freebsd-wireless (Nobody)
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2020-10-20 09:11 UTC by dr2867.business
Modified: 2020-10-20 16:05 UTC (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description dr2867.business 2020-10-20 09:11:30 UTC
Also affects i386 as well.

I found the cause of the problem with various wireless NICs printing an error that says "Need multicast update callback."  The problem is driver specific and multiple drivers have this issue.  The cause is that the affected device drivers are not updating the function pointer in the ieee80211com struct in the file /usr/src/sys/net80211/ieee80211.c.  The wlan driver initializes the structure with default values in ieee80211_ifattach.  Then the device driver updates the function pointers to point to routines within itself.  As it turns out, the drivers that have this problem is missing the callback function.  The drivers that seem have this issue are as follows:

an
bwi
bwn
ipw
iwi
malo
mwl
ral  <---  Confirmed (I'm using this one.)
wi
wpi

Interestingly enough, the same issue exists with the same drives with the promiscuous mode callback as well.  There is a third callback only known as chw that affects even more drivers.  Here's the grep that I did on my system:

wildfire:/usr/src/sys 114 ### ->grep -Rn ic_update_mcast *
dev/iwm/if_iwm.c:6077:  ic->ic_update_mcast = iwm_update_mcast;
dev/wi/if_wi.c:435:     ic->ic_update_mcast = wi_update_mcast;
dev/wpi/if_wpi.c:514:   ic->ic_update_mcast = wpi_update_mcast;
dev/usb/wlan/if_rsu.c:596:      ic->ic_update_mcast = rsu_update_mcast;
dev/usb/wlan/if_upgt.c:354:     ic->ic_update_mcast = upgt_update_mcast;
dev/usb/wlan/if_zyd.c:401:      ic->ic_update_mcast = zyd_update_mcast;
dev/usb/wlan/if_urtw.c:902:     ic->ic_update_mcast = urtw_update_mcast;
dev/usb/wlan/if_run.c:832:      ic->ic_update_mcast = run_update_mcast;
dev/usb/wlan/if_uath.c:451:     ic->ic_update_mcast = uath_update_mcast;
dev/usb/wlan/if_rum.c:573:      ic->ic_update_mcast = rum_update_mcast;
dev/mwl/if_mwl.c:473:   ic->ic_update_mcast = mwl_update_mcast;
dev/if_ndis/if_ndis.c:929:      ic->ic_update_mcast = ndis_update_mcast;
dev/iwn/if_iwn.c:672:   ic->ic_update_mcast = iwn_update_mcast;
dev/ath/if_ath.c:1304:  ic->ic_update_mcast = ath_update_mcast;
dev/rtwn/if_rtwn.c:296: ic->ic_update_mcast = rtwn_update_mcast;
dev/wtap/if_wtap.c:662: ic->ic_update_mcast = wtap_update_mcast;
dev/otus/if_otus.c:759: ic->ic_update_mcast = otus_update_mcast;
net80211/ieee80211_ddb.c:636:           DB_PRINTSYM("\t", "ic_update_mcast", ic->ic_update_mcast);
net80211/ieee80211_var.h:303:   void                    (*ic_update_mcast)(struct ieee80211com *);
net80211/ieee80211_proto.c:1373:        ic->ic_update_mcast(ic);
net80211/ieee80211.c:349:       ic->ic_update_mcast = null_update_mcast;
wildfire:/usr/src/sys 115 ### ->grep -Rn ic_update_promisc *
dev/ral/rt2560.c:293:   ic->ic_update_promisc = rt2560_update_promisc;
dev/ral/rt2860.c:339:   ic->ic_update_promisc = rt2860_update_promisc;
dev/ral/rt2661.c:300:   ic->ic_update_promisc = rt2661_update_promisc;
dev/bwn/if_bwn.c:817:   ic->ic_update_promisc = bwn_update_promisc;
dev/wi/if_wi.c:436:     ic->ic_update_promisc = wi_update_promisc;
dev/wpi/if_wpi.c:513:   ic->ic_update_promisc = wpi_update_promisc;
dev/usb/wlan/if_rsu.c:595:      ic->ic_update_promisc = rsu_update_promisc;
dev/usb/wlan/if_ural.c:485:     ic->ic_update_promisc = ural_update_promisc;
dev/usb/wlan/if_zyd.c:402:      ic->ic_update_promisc = zyd_update_mcast;
dev/usb/wlan/if_urtw.c:901:     ic->ic_update_promisc = urtw_update_promisc;
dev/usb/wlan/if_run.c:835:      ic->ic_update_promisc = run_update_promisc;
dev/usb/wlan/if_uath.c:452:     ic->ic_update_promisc = uath_update_promisc;
dev/usb/wlan/if_rum.c:561:      ic->ic_update_promisc = rum_update_promisc;
dev/mwl/if_mwl.c:474:   ic->ic_update_promisc = mwl_update_promisc;
dev/if_ndis/if_ndis.c:930:      ic->ic_update_promisc = ndis_update_promisc;
dev/iwn/if_iwn.c:671:   ic->ic_update_promisc = iwn_update_promisc;
dev/ath/if_ath.c:1305:  ic->ic_update_promisc = ath_update_promisc;
dev/rtwn/if_rtwn.c:295: ic->ic_update_promisc = rtwn_update_promisc;
dev/wtap/if_wtap.c:663: ic->ic_update_promisc = wtap_update_promisc;
dev/otus/if_otus.c:760: ic->ic_update_promisc = otus_update_mcast;
net80211/ieee80211_ddb.c:637:           DB_PRINTSYM("\t", "ic_update_promisc", ic->ic_update_promisc);
net80211/ieee80211_var.h:305:   void                    (*ic_update_promisc)(struct ieee80211com *);
net80211/ieee80211_proto.c:1381:        ic->ic_update_promisc(ic);
net80211/ieee80211.c:350:       ic->ic_update_promisc = null_update_promisc;
wildfire:/usr/src/sys 116 ### ->grep -Rn ic_update_chw *
dev/usb/wlan/if_rsu.c:601:      ic->ic_update_chw = rsu_update_chw;
dev/ath/if_ath.c:1329:  ic->ic_update_chw = ath_update_chw;
dev/rtwn/if_rtwn.c:287: ic->ic_update_chw = rtwn_update_chw;
dev/otus/if_otus.c:763: ic->ic_update_chw = otus_update_chw;
net80211/ieee80211_var.h:371:   void                    (*ic_update_chw)(struct ieee80211com *);
net80211/ieee80211_proto.c:1401:        ic->ic_update_chw(ic);
net80211/ieee80211.c:351:       ic->ic_update_chw = null_update_chw;
wildfire:/usr/src/sys 117 ### ->

I don't know what the affect of not having the various callback functions are, or even if they are required for certain drivers.  What I do know is that this is annoying and it messes up the console display (I just use a syscons console, no X.) when I'm using vi or something.

This bug is similar to bug #170573