Implement proper set_bssid_filter. If filters are not set, firmware receives management frames only (instead of everything), so this is necessary.
Signed-off-by: Pete Zaitcev <[EMAIL PROTECTED]> --- You know guys, it's very tough to be a moron. All this time I was trying to set filters in set_chan(), which happens before the bssid is recorded from *net into *mac. And there is even a convenient function to do it in the right time, ->set_bssid_filter(). diff -urp -X dontdiff linux-2.6-wireless/drivers/net/wireless/prism54usb/isl_sm.h linux-2.6.16-wlan/drivers/net/wireless/prism54usb/isl_sm.h --- linux-2.6-wireless/drivers/net/wireless/prism54usb/isl_sm.h 2006-03-27 14:26:47.000000000 -0800 +++ linux-2.6.16-wlan/drivers/net/wireless/prism54usb/isl_sm.h 2006-03-31 22:50:54.000000000 -0800 @@ -276,7 +276,7 @@ void islsm_make_freeq int islsm_set_filter(struct islsm *islsm, uint16_t filter_type, - uint8_t *bssid, uint16_t magic2, + const uint8_t *bssid, uint16_t magic2, uint32_t magic3, uint16_t magic8, uint16_t magic9); diff -urp -X dontdiff linux-2.6-wireless/drivers/net/wireless/prism54usb/islsm_netdev.c linux-2.6.16-wlan/drivers/net/wireless/prism54usb/islsm_netdev.c --- linux-2.6-wireless/drivers/net/wireless/prism54usb/islsm_netdev.c 2006-03-27 14:26:47.000000000 -0800 +++ linux-2.6.16-wlan/drivers/net/wireless/prism54usb/islsm_netdev.c 2006-03-31 22:56:46.000000000 -0800 @@ -900,8 +900,17 @@ int islsm_mode_set_filter(struct net_dev break; case IW_MODE_ADHOC: + /* Stolen from INFRA. Without this we only receive beacons. */ rc = islsm_set_filter(islsm, - ISLSM_TX_CONTROL_FILTER_ADHOC, netdev->broadcast, + ISLSM_TX_CONTROL_FILTER_NOTYPE, islsm->ieee->bssid, + ISLSM_TX_CONTROL_FILTER_MAGIC2_FORM3, 1, + 0, ISLSM_TX_CONTROL_FILTER_MAGIC9_FORM1); + if (rc != 0) + return rc; + + /* INFRA uses NOTYPE, so skip ADHOC. */ + rc = islsm_set_filter(islsm, + ISLSM_TX_CONTROL_FILTER_NOTYPE, islsm->ieee->bssid, ISLSM_TX_CONTROL_FILTER_MAGIC2_FORM2, ISLSM_TX_CONTROL_FILTER_MAGIC3_FORM1, 0, 0); @@ -1023,6 +1032,25 @@ static int islsm_reset(struct net_device return 0; } +/* + * This is called from an eventd, but under spinlock. So, no GFP_KERNEL. + */ +static void islsm_set_bssid_filter(struct net_device *netdev, const u8 *bssid) +{ + struct islsm *islsm = ISLSM_OF_NETDEV(netdev); + + islsm_set_filter(islsm, + ISLSM_TX_CONTROL_FILTER_NOTYPE, bssid, + ISLSM_TX_CONTROL_FILTER_MAGIC2_FORM3, 1, + 0, ISLSM_TX_CONTROL_FILTER_MAGIC9_FORM1); + + islsm_set_filter(islsm, + ISLSM_TX_CONTROL_FILTER_NOTYPE, bssid, + ISLSM_TX_CONTROL_FILTER_MAGIC2_FORM2, + ISLSM_TX_CONTROL_FILTER_MAGIC3_FORM1, + 0, 0); +} + /* This is called from an eventd on the current softmac... */ static void islsm_set_chan(struct net_device *netdev, u8 c) { @@ -1031,8 +1059,8 @@ static void islsm_set_chan(struct net_de /* XXX Semaphore here */ islsm_freq_change(islsm, c, islsm_chan_to_freq(c), - ISLSM_TX_CONTROL_CHANNEL_MAGIC1_SCAN, - ISLSM_TX_CONTROL_CHANNEL_MAGIC2_SCAN); + ISLSM_TX_CONTROL_CHANNEL_MAGIC1_TX, + ISLSM_TX_CONTROL_CHANNEL_MAGIC2_TX); islsm->last_chan = c; } @@ -1189,6 +1217,7 @@ alloc_islsm(int sizeof_priv) // ieee->set_security = bcm43xx_ieee80211_set_security; ieee->hard_start_xmit = islsm_iee80211_xmit; + islsm->softmac->set_bssid_filter = islsm_set_bssid_filter; islsm->softmac->set_channel = islsm_set_chan; #endif /* MADWIFI */ diff -urp -X dontdiff linux-2.6-wireless/drivers/net/wireless/prism54usb/islsm_output.c linux-2.6.16-wlan/drivers/net/wireless/prism54usb/islsm_output.c --- linux-2.6-wireless/drivers/net/wireless/prism54usb/islsm_output.c 2006-03-27 14:26:47.000000000 -0800 +++ linux-2.6.16-wlan/drivers/net/wireless/prism54usb/islsm_output.c 2006-03-31 22:51:44.000000000 -0800 @@ -96,7 +96,7 @@ islsm_make_prism_header_skb(struct sk_bu static int islsm_make_rx_filter_skb(struct sk_buff *skb, - uint16_t filter_type, uint8_t *bssid, + uint16_t filter_type, const uint8_t *bssid, uint16_t magic2, uint32_t magic3, uint16_t magic8, uint16_t magic9) { @@ -472,7 +473,7 @@ islsm_config_readback(struct islsm *isls int islsm_set_filter(struct islsm *islsm, - uint16_t filter_type, uint8_t *bssid, + uint16_t filter_type, const uint8_t *bssid, uint16_t magic2, uint32_t magic3, uint16_t magic8, uint16_t magic9) { - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html