#define RTL8187_EEPROM_TXPWR_CHAN_1    0x16    /* 3 channels */
 #define RTL8187_EEPROM_TXPWR_CHAN_6    0x1B    /* 2 channels */
 #define RTL8187_EEPROM_TXPWR_CHAN_4    0x3D    /* 2 channels */
+#define RTL8187_EEPROM_SELECT_GPIO     0x3B
 
 #define RTL8187_REQT_READ      0xC0
 #define RTL8187_REQT_WRITE     0x40
 
 #define RTL8187_MAX_RX         0x9C4
 
+#define RFKILL_MASK_8187_89_97 0x2
+#define RFKILL_MASK_8198       0x4
+
 struct rtl8187_rx_info {
        struct urb *urb;
        struct ieee80211_hw *dev;
        u8 noise;
        u8 slot_time;
        u8 aifsn[4];
+       u8 rfkill_mask;
        struct {
                __le64 buf;
                struct sk_buff_head queue;
 
        struct ieee80211_channel *channel;
        const char *chip_name;
        u16 txpwr, reg;
+       u16 product_id = le16_to_cpu(udev->descriptor.idProduct);
        int err, i;
 
        dev = ieee80211_alloc_hw(sizeof(*priv), &rtl8187_ops);
                (*channel++).hw_value = txpwr & 0xFF;
                (*channel++).hw_value = txpwr >> 8;
        }
+       /* Handle the differing rfkill GPIO bit in different models */
+       priv->rfkill_mask = RFKILL_MASK_8187_89_97;
+       if (product_id == 0x8197 || product_id == 0x8198) {
+               eeprom_93cx6_read(&eeprom, RTL8187_EEPROM_SELECT_GPIO, ®);
+               if (reg & 0xFF00)
+                       priv->rfkill_mask = RFKILL_MASK_8198;
+       }
 
        /*
         * XXX: Once this driver supports anything that requires
        mutex_init(&priv->conf_mutex);
        skb_queue_head_init(&priv->b_tx_status.queue);
 
-       printk(KERN_INFO "%s: hwaddr %pM, %s V%d + %s\n",
+       printk(KERN_INFO "%s: hwaddr %pM, %s V%d + %s, rfkill mask %d\n",
               wiphy_name(dev->wiphy), dev->wiphy->perm_addr,
-              chip_name, priv->asic_rev, priv->rf->name);
+              chip_name, priv->asic_rev, priv->rf->name, priv->rfkill_mask);
 
 #ifdef CONFIG_RTL8187_LEDS
        eeprom_93cx6_read(&eeprom, 0x3F, ®);
 
        u8 gpio;
 
        gpio = rtl818x_ioread8(priv, &priv->map->GPIO0);
-       rtl818x_iowrite8(priv, &priv->map->GPIO0, gpio & ~0x02);
+       rtl818x_iowrite8(priv, &priv->map->GPIO0, gpio & ~priv->rfkill_mask);
        gpio = rtl818x_ioread8(priv, &priv->map->GPIO1);
 
-       return gpio & 0x02;
+       return gpio & priv->rfkill_mask;
 }
 
 void rtl8187_rfkill_init(struct ieee80211_hw *hw)