| From a396e10019eaf3809b0219c966865aaafec12630 Mon Sep 17 00:00:00 2001 |
| From: Gertjan van Wingerde <gwingerde@gmail.com> |
| Date: Fri, 31 Aug 2012 19:22:11 +0200 |
| Subject: rt2x00: Fix rfkill polling prior to interface start. |
| |
| From: Gertjan van Wingerde <gwingerde@gmail.com> |
| |
| commit a396e10019eaf3809b0219c966865aaafec12630 upstream. |
| |
| We need to program the rfkill switch GPIO pin direction to input at |
| device initialization time, not only when the interface is brought up. |
| Doing this only when the interface is brought up could lead to rfkill |
| detecting the switch is turned on erroneously and inability to create |
| the interface and bringing it up. |
| |
| Reported-and-tested-by: Andreas Messer <andi@bastelmap.de> |
| Signed-off-by: Gertjan van Wingerde <gwingerde@gmail.com> |
| Acked-by: Ivo Van Doorn <ivdoorn@gmail.com> |
| Signed-off-by: John W. Linville <linville@tuxdriver.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/net/wireless/rt2x00/rt2400pci.c | 9 +++++++++ |
| drivers/net/wireless/rt2x00/rt2400pci.h | 1 + |
| drivers/net/wireless/rt2x00/rt2500pci.c | 9 +++++++++ |
| drivers/net/wireless/rt2x00/rt2500usb.c | 9 +++++++++ |
| drivers/net/wireless/rt2x00/rt2500usb.h | 1 + |
| drivers/net/wireless/rt2x00/rt2800pci.c | 9 +++++++++ |
| drivers/net/wireless/rt2x00/rt2800usb.c | 9 +++++++++ |
| drivers/net/wireless/rt2x00/rt61pci.c | 9 +++++++++ |
| drivers/net/wireless/rt2x00/rt61pci.h | 1 + |
| drivers/net/wireless/rt2x00/rt73usb.c | 9 +++++++++ |
| drivers/net/wireless/rt2x00/rt73usb.h | 3 +++ |
| 11 files changed, 69 insertions(+) |
| |
| --- a/drivers/net/wireless/rt2x00/rt2400pci.c |
| +++ b/drivers/net/wireless/rt2x00/rt2400pci.c |
| @@ -1618,6 +1618,7 @@ static int rt2400pci_probe_hw_mode(struc |
| static int rt2400pci_probe_hw(struct rt2x00_dev *rt2x00dev) |
| { |
| int retval; |
| + u32 reg; |
| |
| /* |
| * Allocate eeprom data. |
| @@ -1631,6 +1632,14 @@ static int rt2400pci_probe_hw(struct rt2 |
| return retval; |
| |
| /* |
| + * Enable rfkill polling by setting GPIO direction of the |
| + * rfkill switch GPIO pin correctly. |
| + */ |
| + rt2x00pci_register_read(rt2x00dev, GPIOCSR, ®); |
| + rt2x00_set_field32(®, GPIOCSR_BIT8, 1); |
| + rt2x00pci_register_write(rt2x00dev, GPIOCSR, reg); |
| + |
| + /* |
| * Initialize hw specifications. |
| */ |
| retval = rt2400pci_probe_hw_mode(rt2x00dev); |
| --- a/drivers/net/wireless/rt2x00/rt2400pci.h |
| +++ b/drivers/net/wireless/rt2x00/rt2400pci.h |
| @@ -670,6 +670,7 @@ |
| #define GPIOCSR_BIT5 FIELD32(0x00000020) |
| #define GPIOCSR_BIT6 FIELD32(0x00000040) |
| #define GPIOCSR_BIT7 FIELD32(0x00000080) |
| +#define GPIOCSR_BIT8 FIELD32(0x00000100) |
| |
| /* |
| * BBPPCSR: BBP Pin control register. |
| --- a/drivers/net/wireless/rt2x00/rt2500pci.c |
| +++ b/drivers/net/wireless/rt2x00/rt2500pci.c |
| @@ -1936,6 +1936,7 @@ static int rt2500pci_probe_hw_mode(struc |
| static int rt2500pci_probe_hw(struct rt2x00_dev *rt2x00dev) |
| { |
| int retval; |
| + u32 reg; |
| |
| /* |
| * Allocate eeprom data. |
| @@ -1949,6 +1950,14 @@ static int rt2500pci_probe_hw(struct rt2 |
| return retval; |
| |
| /* |
| + * Enable rfkill polling by setting GPIO direction of the |
| + * rfkill switch GPIO pin correctly. |
| + */ |
| + rt2x00pci_register_read(rt2x00dev, GPIOCSR, ®); |
| + rt2x00_set_field32(®, GPIOCSR_DIR0, 1); |
| + rt2x00pci_register_write(rt2x00dev, GPIOCSR, reg); |
| + |
| + /* |
| * Initialize hw specifications. |
| */ |
| retval = rt2500pci_probe_hw_mode(rt2x00dev); |
| --- a/drivers/net/wireless/rt2x00/rt2500usb.c |
| +++ b/drivers/net/wireless/rt2x00/rt2500usb.c |
| @@ -1768,6 +1768,7 @@ static int rt2500usb_probe_hw_mode(struc |
| static int rt2500usb_probe_hw(struct rt2x00_dev *rt2x00dev) |
| { |
| int retval; |
| + u16 reg; |
| |
| /* |
| * Allocate eeprom data. |
| @@ -1781,6 +1782,14 @@ static int rt2500usb_probe_hw(struct rt2 |
| return retval; |
| |
| /* |
| + * Enable rfkill polling by setting GPIO direction of the |
| + * rfkill switch GPIO pin correctly. |
| + */ |
| + rt2500usb_register_read(rt2x00dev, MAC_CSR19, ®); |
| + rt2x00_set_field16(®, MAC_CSR19_BIT8, 0); |
| + rt2500usb_register_write(rt2x00dev, MAC_CSR19, reg); |
| + |
| + /* |
| * Initialize hw specifications. |
| */ |
| retval = rt2500usb_probe_hw_mode(rt2x00dev); |
| --- a/drivers/net/wireless/rt2x00/rt2500usb.h |
| +++ b/drivers/net/wireless/rt2x00/rt2500usb.h |
| @@ -197,6 +197,7 @@ |
| #define MAC_CSR19_BIT5 FIELD16(0x0020) |
| #define MAC_CSR19_BIT6 FIELD16(0x0040) |
| #define MAC_CSR19_BIT7 FIELD16(0x0080) |
| +#define MAC_CSR19_BIT8 FIELD16(0x0100) |
| |
| /* |
| * MAC_CSR20: LED control register. |
| --- a/drivers/net/wireless/rt2x00/rt2800pci.c |
| +++ b/drivers/net/wireless/rt2x00/rt2800pci.c |
| @@ -941,6 +941,7 @@ static int rt2800pci_validate_eeprom(str |
| static int rt2800pci_probe_hw(struct rt2x00_dev *rt2x00dev) |
| { |
| int retval; |
| + u32 reg; |
| |
| /* |
| * Allocate eeprom data. |
| @@ -954,6 +955,14 @@ static int rt2800pci_probe_hw(struct rt2 |
| return retval; |
| |
| /* |
| + * Enable rfkill polling by setting GPIO direction of the |
| + * rfkill switch GPIO pin correctly. |
| + */ |
| + rt2x00pci_register_read(rt2x00dev, GPIO_CTRL_CFG, ®); |
| + rt2x00_set_field32(®, GPIO_CTRL_CFG_GPIOD_BIT2, 1); |
| + rt2x00pci_register_write(rt2x00dev, GPIO_CTRL_CFG, reg); |
| + |
| + /* |
| * Initialize hw specifications. |
| */ |
| retval = rt2800_probe_hw_mode(rt2x00dev); |
| --- a/drivers/net/wireless/rt2x00/rt2800usb.c |
| +++ b/drivers/net/wireless/rt2x00/rt2800usb.c |
| @@ -600,6 +600,7 @@ static int rt2800usb_validate_eeprom(str |
| static int rt2800usb_probe_hw(struct rt2x00_dev *rt2x00dev) |
| { |
| int retval; |
| + u32 reg; |
| |
| /* |
| * Allocate eeprom data. |
| @@ -613,6 +614,14 @@ static int rt2800usb_probe_hw(struct rt2 |
| return retval; |
| |
| /* |
| + * Enable rfkill polling by setting GPIO direction of the |
| + * rfkill switch GPIO pin correctly. |
| + */ |
| + rt2x00usb_register_read(rt2x00dev, GPIO_CTRL_CFG, ®); |
| + rt2x00_set_field32(®, GPIO_CTRL_CFG_GPIOD_BIT2, 1); |
| + rt2x00usb_register_write(rt2x00dev, GPIO_CTRL_CFG, reg); |
| + |
| + /* |
| * Initialize hw specifications. |
| */ |
| retval = rt2800_probe_hw_mode(rt2x00dev); |
| --- a/drivers/net/wireless/rt2x00/rt61pci.c |
| +++ b/drivers/net/wireless/rt2x00/rt61pci.c |
| @@ -2840,6 +2840,7 @@ static int rt61pci_probe_hw_mode(struct |
| static int rt61pci_probe_hw(struct rt2x00_dev *rt2x00dev) |
| { |
| int retval; |
| + u32 reg; |
| |
| /* |
| * Disable power saving. |
| @@ -2858,6 +2859,14 @@ static int rt61pci_probe_hw(struct rt2x0 |
| return retval; |
| |
| /* |
| + * Enable rfkill polling by setting GPIO direction of the |
| + * rfkill switch GPIO pin correctly. |
| + */ |
| + rt2x00pci_register_read(rt2x00dev, MAC_CSR13, ®); |
| + rt2x00_set_field32(®, MAC_CSR13_BIT13, 1); |
| + rt2x00pci_register_write(rt2x00dev, MAC_CSR13, reg); |
| + |
| + /* |
| * Initialize hw specifications. |
| */ |
| retval = rt61pci_probe_hw_mode(rt2x00dev); |
| --- a/drivers/net/wireless/rt2x00/rt61pci.h |
| +++ b/drivers/net/wireless/rt2x00/rt61pci.h |
| @@ -372,6 +372,7 @@ struct hw_pairwise_ta_entry { |
| #define MAC_CSR13_BIT10 FIELD32(0x00000400) |
| #define MAC_CSR13_BIT11 FIELD32(0x00000800) |
| #define MAC_CSR13_BIT12 FIELD32(0x00001000) |
| +#define MAC_CSR13_BIT13 FIELD32(0x00002000) |
| |
| /* |
| * MAC_CSR14: LED control register. |
| --- a/drivers/net/wireless/rt2x00/rt73usb.c |
| +++ b/drivers/net/wireless/rt2x00/rt73usb.c |
| @@ -2177,6 +2177,7 @@ static int rt73usb_probe_hw_mode(struct |
| static int rt73usb_probe_hw(struct rt2x00_dev *rt2x00dev) |
| { |
| int retval; |
| + u32 reg; |
| |
| /* |
| * Allocate eeprom data. |
| @@ -2190,6 +2191,14 @@ static int rt73usb_probe_hw(struct rt2x0 |
| return retval; |
| |
| /* |
| + * Enable rfkill polling by setting GPIO direction of the |
| + * rfkill switch GPIO pin correctly. |
| + */ |
| + rt2x00usb_register_read(rt2x00dev, MAC_CSR13, ®); |
| + rt2x00_set_field32(®, MAC_CSR13_BIT15, 0); |
| + rt2x00usb_register_write(rt2x00dev, MAC_CSR13, reg); |
| + |
| + /* |
| * Initialize hw specifications. |
| */ |
| retval = rt73usb_probe_hw_mode(rt2x00dev); |
| --- a/drivers/net/wireless/rt2x00/rt73usb.h |
| +++ b/drivers/net/wireless/rt2x00/rt73usb.h |
| @@ -282,6 +282,9 @@ struct hw_pairwise_ta_entry { |
| #define MAC_CSR13_BIT10 FIELD32(0x00000400) |
| #define MAC_CSR13_BIT11 FIELD32(0x00000800) |
| #define MAC_CSR13_BIT12 FIELD32(0x00001000) |
| +#define MAC_CSR13_BIT13 FIELD32(0x00002000) |
| +#define MAC_CSR13_BIT14 FIELD32(0x00004000) |
| +#define MAC_CSR13_BIT15 FIELD32(0x00008000) |
| |
| /* |
| * MAC_CSR14: LED control register. |