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

Reply via email to