|
@@ -554,15 +554,28 @@ static void rt2800_config_wcid_attr(struct rt2x00_dev *rt2x00dev,
|
|
|
|
|
|
offset = MAC_WCID_ATTR_ENTRY(key->hw_key_idx);
|
|
|
|
|
|
- rt2800_register_read(rt2x00dev, offset, ®);
|
|
|
- rt2x00_set_field32(®, MAC_WCID_ATTRIBUTE_KEYTAB,
|
|
|
- !!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE));
|
|
|
- rt2x00_set_field32(®, MAC_WCID_ATTRIBUTE_CIPHER,
|
|
|
- (crypto->cmd == SET_KEY) * crypto->cipher);
|
|
|
- rt2x00_set_field32(®, MAC_WCID_ATTRIBUTE_BSS_IDX,
|
|
|
- (crypto->cmd == SET_KEY) * crypto->bssidx);
|
|
|
- rt2x00_set_field32(®, MAC_WCID_ATTRIBUTE_RX_WIUDF, crypto->cipher);
|
|
|
- rt2800_register_write(rt2x00dev, offset, reg);
|
|
|
+ if (crypto->cmd == SET_KEY) {
|
|
|
+ rt2800_register_read(rt2x00dev, offset, ®);
|
|
|
+ rt2x00_set_field32(®, MAC_WCID_ATTRIBUTE_KEYTAB,
|
|
|
+ !!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE));
|
|
|
+ /*
|
|
|
+ * Both the cipher as the BSS Idx numbers are split in a main
|
|
|
+ * value of 3 bits, and a extended field for adding one additional
|
|
|
+ * bit to the value.
|
|
|
+ */
|
|
|
+ rt2x00_set_field32(®, MAC_WCID_ATTRIBUTE_CIPHER,
|
|
|
+ (crypto->cipher & 0x7));
|
|
|
+ rt2x00_set_field32(®, MAC_WCID_ATTRIBUTE_CIPHER_EXT,
|
|
|
+ (crypto->cipher & 0x8) >> 3);
|
|
|
+ rt2x00_set_field32(®, MAC_WCID_ATTRIBUTE_BSS_IDX,
|
|
|
+ (crypto->bssidx & 0x7));
|
|
|
+ rt2x00_set_field32(®, MAC_WCID_ATTRIBUTE_BSS_IDX_EXT,
|
|
|
+ (crypto->bssidx & 0x8) >> 3);
|
|
|
+ rt2x00_set_field32(®, MAC_WCID_ATTRIBUTE_RX_WIUDF, crypto->cipher);
|
|
|
+ rt2800_register_write(rt2x00dev, offset, reg);
|
|
|
+ } else {
|
|
|
+ rt2800_register_write(rt2x00dev, offset, 0);
|
|
|
+ }
|
|
|
|
|
|
offset = MAC_IVEIV_ENTRY(key->hw_key_idx);
|
|
|
|