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