All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] rt2x00:Add RT5372 chipset support
@ 2012-02-08  6:02 John Li
  0 siblings, 0 replies; 10+ messages in thread
From: John Li @ 2012-02-08  6:02 UTC (permalink / raw)
  To: users; +Cc: linux-wireless, John Linville, John Li

From: John Li <chen-yang.li@mediatek.com>

---
 drivers/net/wireless/rt2x00/rt2800.h    |    1 +
 drivers/net/wireless/rt2x00/rt2800lib.c |  157 ++++++++++++++++++++++++++-----
 drivers/net/wireless/rt2x00/rt2800pci.c |    3 +-
 drivers/net/wireless/rt2x00/rt2800usb.c |   14 +++
 drivers/net/wireless/rt2x00/rt2x00.h    |    2 +
 5 files changed, 152 insertions(+), 25 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2800.h b/drivers/net/wireless/rt2x00/rt2800.h
index 2571a2f..56b78c8 100644
--- a/drivers/net/wireless/rt2x00/rt2800.h
+++ b/drivers/net/wireless/rt2x00/rt2800.h
@@ -68,6 +68,7 @@
 #define RF3322				0x000c
 #define RF3053				0x000d
 #define RF5370				0x5370
+#define RF5372				0x5372
 #define RF5390				0x5390
 
 /*
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index 22a1a8f..852b57e 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -402,7 +402,8 @@ int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
 
 	if (rt2x00_is_pci(rt2x00dev)) {
 		if (rt2x00_rt(rt2x00dev, RT3572) ||
-		    rt2x00_rt(rt2x00dev, RT5390)) {
+		    rt2x00_rt(rt2x00dev, RT5390) ||
+		    rt2x00_rt(rt2x00dev, RT5392)) {
 			rt2800_register_read(rt2x00dev, AUX_CTRL, &reg);
 			rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1);
 			rt2x00_set_field32(&reg, AUX_CTRL_WAKE_PCIE_EN, 1);
@@ -1906,7 +1907,8 @@ static void rt2800_config_channel_rf53xx(struct rt2x00_dev *rt2x00dev,
 						   r55_nonbt_rev[idx]);
 				rt2800_rfcsr_write(rt2x00dev, 59,
 						   r59_nonbt_rev[idx]);
-			} else if (rt2x00_rt(rt2x00dev, RT5390)) {
+			} else if (rt2x00_rt(rt2x00dev, RT5390) || 
+					   rt2x00_rt(rt2x00dev, RT5392)) {
 				static const char r59_non_bt[] = {0x8f, 0x8f,
 					0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8d,
 					0x8a, 0x88, 0x88, 0x87, 0x87, 0x86};
@@ -1956,6 +1958,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
 		rt2800_config_channel_rf3052(rt2x00dev, conf, rf, info);
 		break;
 	case RF5370:
+	case RF5372:
 	case RF5390:
 		rt2800_config_channel_rf53xx(rt2x00dev, conf, rf, info);
 		break;
@@ -1972,7 +1975,8 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
 	rt2800_bbp_write(rt2x00dev, 86, 0);
 
 	if (rf->channel <= 14) {
-		if (!rt2x00_rt(rt2x00dev, RT5390)) {
+		if (!rt2x00_rt(rt2x00dev, RT5390) || 
+			!rt2x00_rt(rt2x00dev, RT5392)) {
 			if (test_bit(CAPABILITY_EXTERNAL_LNA_BG,
 				     &rt2x00dev->cap_flags)) {
 				rt2800_bbp_write(rt2x00dev, 82, 0x62);
@@ -2502,7 +2506,8 @@ static u8 rt2800_get_default_vgc(struct rt2x00_dev *rt2x00dev)
 		    rt2x00_rt(rt2x00dev, RT3071) ||
 		    rt2x00_rt(rt2x00dev, RT3090) ||
 		    rt2x00_rt(rt2x00dev, RT3390) ||
-		    rt2x00_rt(rt2x00dev, RT5390))
+		    rt2x00_rt(rt2x00dev, RT5390) ||
+		    rt2x00_rt(rt2x00dev, RT5392))
 			return 0x1c + (2 * rt2x00dev->lna_gain);
 		else
 			return 0x2e + rt2x00dev->lna_gain;
@@ -2637,7 +2642,8 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
 	} else if (rt2x00_rt(rt2x00dev, RT3572)) {
 		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400);
 		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
-	} else if (rt2x00_rt(rt2x00dev, RT5390)) {
+	} else if (rt2x00_rt(rt2x00dev, RT5390) || 
+			   rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
 		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
 		rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
@@ -3013,7 +3019,8 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
 		     rt2800_wait_bbp_ready(rt2x00dev)))
 		return -EACCES;
 
-	if (rt2x00_rt(rt2x00dev, RT5390)) {
+	if (rt2x00_rt(rt2x00dev, RT5390) || 
+		rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_bbp_read(rt2x00dev, 4, &value);
 		rt2x00_set_field8(&value, BBP4_MAC_IF_CTRL, 1);
 		rt2800_bbp_write(rt2x00dev, 4, value);
@@ -3021,19 +3028,22 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
 
 	if (rt2800_is_305x_soc(rt2x00dev) ||
 	    rt2x00_rt(rt2x00dev, RT3572) ||
-	    rt2x00_rt(rt2x00dev, RT5390))
+	    rt2x00_rt(rt2x00dev, RT5390) || 
+	    rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 31, 0x08);
 
 	rt2800_bbp_write(rt2x00dev, 65, 0x2c);
 	rt2800_bbp_write(rt2x00dev, 66, 0x38);
 
-	if (rt2x00_rt(rt2x00dev, RT5390))
+	if (rt2x00_rt(rt2x00dev, RT5390) || 
+		rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 68, 0x0b);
 
 	if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860C)) {
 		rt2800_bbp_write(rt2x00dev, 69, 0x16);
 		rt2800_bbp_write(rt2x00dev, 73, 0x12);
-	} else if (rt2x00_rt(rt2x00dev, RT5390)) {
+	} else if (rt2x00_rt(rt2x00dev, RT5390) || 
+			   rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_bbp_write(rt2x00dev, 69, 0x12);
 		rt2800_bbp_write(rt2x00dev, 73, 0x13);
 		rt2800_bbp_write(rt2x00dev, 75, 0x46);
@@ -3051,7 +3061,8 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
 	    rt2x00_rt(rt2x00dev, RT3090) ||
 	    rt2x00_rt(rt2x00dev, RT3390) ||
 	    rt2x00_rt(rt2x00dev, RT3572) ||
-	    rt2x00_rt(rt2x00dev, RT5390)) {
+	    rt2x00_rt(rt2x00dev, RT5390) ||
+	    rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_bbp_write(rt2x00dev, 79, 0x13);
 		rt2800_bbp_write(rt2x00dev, 80, 0x05);
 		rt2800_bbp_write(rt2x00dev, 81, 0x33);
@@ -3063,64 +3074,90 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
 	}
 
 	rt2800_bbp_write(rt2x00dev, 82, 0x62);
-	if (rt2x00_rt(rt2x00dev, RT5390))
+	if (rt2x00_rt(rt2x00dev, RT5390) || 
+		rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 83, 0x7a);
 	else
 		rt2800_bbp_write(rt2x00dev, 83, 0x6a);
 
 	if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860D))
 		rt2800_bbp_write(rt2x00dev, 84, 0x19);
-	else if (rt2x00_rt(rt2x00dev, RT5390))
+	else if (rt2x00_rt(rt2x00dev, RT5390) || 
+			 rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 84, 0x9a);
 	else
 		rt2800_bbp_write(rt2x00dev, 84, 0x99);
 
-	if (rt2x00_rt(rt2x00dev, RT5390))
+	if (rt2x00_rt(rt2x00dev, RT5390) || 
+		rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 86, 0x38);
 	else
 		rt2800_bbp_write(rt2x00dev, 86, 0x00);
 
+	if (rt2x00_rt(rt2x00dev, RT5392))
+		rt2800_bbp_write(rt2x00dev, 88, 0x90);
+
 	rt2800_bbp_write(rt2x00dev, 91, 0x04);
 
-	if (rt2x00_rt(rt2x00dev, RT5390))
+	if (rt2x00_rt(rt2x00dev, RT5390) || 
+		rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 92, 0x02);
 	else
 		rt2800_bbp_write(rt2x00dev, 92, 0x00);
 
+	if (rt2x00_rt(rt2x00dev, RT5392))
+	{
+		rt2800_bbp_write(rt2x00dev, 95, 0x9a);
+		rt2800_bbp_write(rt2x00dev, 98, 0x12);
+	}
+
 	if (rt2x00_rt_rev_gte(rt2x00dev, RT3070, REV_RT3070F) ||
 	    rt2x00_rt_rev_gte(rt2x00dev, RT3071, REV_RT3071E) ||
 	    rt2x00_rt_rev_gte(rt2x00dev, RT3090, REV_RT3090E) ||
 	    rt2x00_rt_rev_gte(rt2x00dev, RT3390, REV_RT3390E) ||
 	    rt2x00_rt(rt2x00dev, RT3572) ||
 	    rt2x00_rt(rt2x00dev, RT5390) ||
+	    rt2x00_rt(rt2x00dev, RT5392) ||
 	    rt2800_is_305x_soc(rt2x00dev))
 		rt2800_bbp_write(rt2x00dev, 103, 0xc0);
 	else
 		rt2800_bbp_write(rt2x00dev, 103, 0x00);
 
-	if (rt2x00_rt(rt2x00dev, RT5390))
+	if (rt2x00_rt(rt2x00dev, RT5390) || 
+		rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 104, 0x92);
 
 	if (rt2800_is_305x_soc(rt2x00dev))
 		rt2800_bbp_write(rt2x00dev, 105, 0x01);
-	else if (rt2x00_rt(rt2x00dev, RT5390))
+	else if (rt2x00_rt(rt2x00dev, RT5390) || 
+			 rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 105, 0x3c);
 	else
 		rt2800_bbp_write(rt2x00dev, 105, 0x05);
 
 	if (rt2x00_rt(rt2x00dev, RT5390))
 		rt2800_bbp_write(rt2x00dev, 106, 0x03);
+	else if (rt2x00_rt(rt2x00dev, RT5392))
+		rt2800_bbp_write(rt2x00dev, 106, 0x12);
 	else
 		rt2800_bbp_write(rt2x00dev, 106, 0x35);
 
-	if (rt2x00_rt(rt2x00dev, RT5390))
+	if (rt2x00_rt(rt2x00dev, RT5390) || 
+		rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 128, 0x12);
 
+	if (rt2x00_rt(rt2x00dev, RT5392))
+	{
+		rt2800_bbp_write(rt2x00dev, 134, 0xd0);
+		rt2800_bbp_write(rt2x00dev, 135, 0xf6);
+	}
+
 	if (rt2x00_rt(rt2x00dev, RT3071) ||
 	    rt2x00_rt(rt2x00dev, RT3090) ||
 	    rt2x00_rt(rt2x00dev, RT3390) ||
 	    rt2x00_rt(rt2x00dev, RT3572) ||
-	    rt2x00_rt(rt2x00dev, RT5390)) {
+	    rt2x00_rt(rt2x00dev, RT5390) || 
+	    rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_bbp_read(rt2x00dev, 138, &value);
 
 		rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &eeprom);
@@ -3132,7 +3169,8 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
 		rt2800_bbp_write(rt2x00dev, 138, value);
 	}
 
-	if (rt2x00_rt(rt2x00dev, RT5390)) {
+	if (rt2x00_rt(rt2x00dev, RT5390) || 
+		rt2x00_rt(rt2x00dev, RT5392)) {
 		int ant, div_mode;
 
 		rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom);
@@ -3258,13 +3296,15 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
 	    !rt2x00_rt(rt2x00dev, RT3390) &&
 	    !rt2x00_rt(rt2x00dev, RT3572) &&
 	    !rt2x00_rt(rt2x00dev, RT5390) &&
+	    !rt2x00_rt(rt2x00dev, RT5392) &&
 	    !rt2800_is_305x_soc(rt2x00dev))
 		return 0;
 
 	/*
 	 * Init RF calibration.
 	 */
-	if (rt2x00_rt(rt2x00dev, RT5390)) {
+	if (rt2x00_rt(rt2x00dev, RT5390) || 
+		rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_rfcsr_read(rt2x00dev, 2, &rfcsr);
 		rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 1);
 		rt2800_rfcsr_write(rt2x00dev, 2, rfcsr);
@@ -3482,6 +3522,67 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
 			rt2800_rfcsr_write(rt2x00dev, 61, 0xdd);
 		rt2800_rfcsr_write(rt2x00dev, 62, 0x00);
 		rt2800_rfcsr_write(rt2x00dev, 63, 0x00);
+	}	else if (rt2x00_rt(rt2x00dev, RT5392) || 
+			rt2x00_rt(rt2x00dev, RT5372)) {
+			rt2800_rfcsr_write(rt2x00dev, 1, 0x17);
+			rt2800_rfcsr_write(rt2x00dev, 2, 0x80);
+			rt2800_rfcsr_write(rt2x00dev, 3, 0x88);
+			rt2800_rfcsr_write(rt2x00dev, 5, 0x10);
+			rt2800_rfcsr_write(rt2x00dev, 6, 0xe0);
+			rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 10, 0x53);
+			rt2800_rfcsr_write(rt2x00dev, 11, 0x4a);
+			rt2800_rfcsr_write(rt2x00dev, 12, 0x46);
+			rt2800_rfcsr_write(rt2x00dev, 13, 0x9f);
+			rt2800_rfcsr_write(rt2x00dev, 14, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 15, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 16, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 18, 0x03);
+			rt2800_rfcsr_write(rt2x00dev, 19, 0x4d);
+			rt2800_rfcsr_write(rt2x00dev, 20, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 21, 0x8d);
+			rt2800_rfcsr_write(rt2x00dev, 22, 0x20);
+			rt2800_rfcsr_write(rt2x00dev, 23, 0x0b);
+			rt2800_rfcsr_write(rt2x00dev, 24, 0x44);
+			rt2800_rfcsr_write(rt2x00dev, 25, 0x80);
+			rt2800_rfcsr_write(rt2x00dev, 26, 0x82);
+			rt2800_rfcsr_write(rt2x00dev, 27, 0x09);
+			rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 29, 0x10);
+			rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
+			rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
+			rt2800_rfcsr_write(rt2x00dev, 32, 0x20);
+			rt2800_rfcsr_write(rt2x00dev, 33, 0xC0);
+			rt2800_rfcsr_write(rt2x00dev, 34, 0x07);
+			rt2800_rfcsr_write(rt2x00dev, 35, 0x12);
+			rt2800_rfcsr_write(rt2x00dev, 36, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 37, 0x08);
+			rt2800_rfcsr_write(rt2x00dev, 38, 0x89);
+			rt2800_rfcsr_write(rt2x00dev, 39, 0x1b);
+			rt2800_rfcsr_write(rt2x00dev, 40, 0x0f);
+			rt2800_rfcsr_write(rt2x00dev, 41, 0xbb);
+			rt2800_rfcsr_write(rt2x00dev, 42, 0xd5);
+			rt2800_rfcsr_write(rt2x00dev, 43, 0x9b);
+			rt2800_rfcsr_write(rt2x00dev, 44, 0x0e);
+			rt2800_rfcsr_write(rt2x00dev, 45, 0xa2);
+			rt2800_rfcsr_write(rt2x00dev, 46, 0x73);
+			rt2800_rfcsr_write(rt2x00dev, 47, 0x0c);
+			rt2800_rfcsr_write(rt2x00dev, 48, 0x10);
+			rt2800_rfcsr_write(rt2x00dev, 49, 0x94);
+			rt2800_rfcsr_write(rt2x00dev, 50, 0x94);
+			rt2800_rfcsr_write(rt2x00dev, 51, 0x3a);
+			rt2800_rfcsr_write(rt2x00dev, 52, 0x48);
+			rt2800_rfcsr_write(rt2x00dev, 53, 0x44);
+			rt2800_rfcsr_write(rt2x00dev, 54, 0x38);
+			rt2800_rfcsr_write(rt2x00dev, 55, 0x43);
+			rt2800_rfcsr_write(rt2x00dev, 56, 0xa1);
+			rt2800_rfcsr_write(rt2x00dev, 57, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 58, 0x39);
+			rt2800_rfcsr_write(rt2x00dev, 59, 0x07);
+			rt2800_rfcsr_write(rt2x00dev, 60, 0x45);
+			rt2800_rfcsr_write(rt2x00dev, 61, 0x91);
+			rt2800_rfcsr_write(rt2x00dev, 62, 0x39);
+			rt2800_rfcsr_write(rt2x00dev, 63, 0x07);
 	}
 
 	if (rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070F)) {
@@ -3549,7 +3650,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
 			rt2800_init_rx_filter(rt2x00dev, true, 0x27, 0x15);
 	}
 
-	if (!rt2x00_rt(rt2x00dev, RT5390)) {
+	if (!rt2x00_rt(rt2x00dev, RT5390) || 
+		!rt2x00_rt(rt2x00dev, RT5392)) {
 		/*
 		 * Set back to initial state
 		 */
@@ -3577,7 +3679,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
 	rt2x00_set_field32(&reg, OPT_14_CSR_BIT0, 1);
 	rt2800_register_write(rt2x00dev, OPT_14_CSR, reg);
 
-	if (!rt2x00_rt(rt2x00dev, RT5390)) {
+	if (!rt2x00_rt(rt2x00dev, RT5390) || 
+		!rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_rfcsr_read(rt2x00dev, 17, &rfcsr);
 		rt2x00_set_field8(&rfcsr, RFCSR17_TX_LO1_EN, 0);
 		if (rt2x00_rt(rt2x00dev, RT3070) ||
@@ -3645,7 +3748,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
 		rt2800_rfcsr_write(rt2x00dev, 27, rfcsr);
 	}
 
-	if (rt2x00_rt(rt2x00dev, RT5390)) {
+	if (rt2x00_rt(rt2x00dev, RT5390) || 
+		rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_rfcsr_read(rt2x00dev, 38, &rfcsr);
 		rt2x00_set_field8(&rfcsr, RFCSR38_RX_LO1_EN, 0);
 		rt2800_rfcsr_write(rt2x00dev, 38, rfcsr);
@@ -3929,7 +4033,8 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
 	 * RT53xx: defined in "EEPROM_CHIP_ID" field
 	 */
 	rt2800_register_read(rt2x00dev, MAC_CSR0, &reg);
-	if (rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5390)
+	if (rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5390 || 
+		rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5392)
 		rt2x00_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &value);
 	else
 		value = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);
@@ -3947,6 +4052,8 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
 	case RT3390:
 	case RT3572:
 	case RT5390:
+	case RT5392:
+	case RT5372:
 		break;
 	default:
 		ERROR(rt2x00dev, "Invalid RT chipset detected.\n");
@@ -3966,6 +4073,7 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
 	case RF3320:
 	case RF5370:
 	case RF5390:
+	case RF5372:
 		break;
 	default:
 		ERROR(rt2x00dev, "Invalid RF chipset 0x%x detected.\n",
@@ -4271,6 +4379,7 @@ int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
 		   rt2x00_rf(rt2x00dev, RF3022) ||
 		   rt2x00_rf(rt2x00dev, RF3320) ||
 		   rt2x00_rf(rt2x00dev, RF5370) ||
+		   rt2x00_rf(rt2x00dev, RF5372) ||
 		   rt2x00_rf(rt2x00dev, RF5390)) {
 		spec->num_channels = 14;
 		spec->channels = rf_vals_3x;
diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c
index 837b460..a3aa2b0 100644
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
@@ -480,7 +480,8 @@ static int rt2800pci_init_registers(struct rt2x00_dev *rt2x00dev)
 
 	if (rt2x00_is_pcie(rt2x00dev) &&
 	    (rt2x00_rt(rt2x00dev, RT3572) ||
-	     rt2x00_rt(rt2x00dev, RT5390))) {
+	     rt2x00_rt(rt2x00dev, RT5390) || 
+	     rt2x00_rt(rt2x00dev, RT5392))) {
 		rt2x00pci_register_read(rt2x00dev, AUX_CTRL, &reg);
 		rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1);
 		rt2x00_set_field32(&reg, AUX_CTRL_WAKE_PCIE_EN, 1);
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c
index 7f21005..c8619eb 100644
--- a/drivers/net/wireless/rt2x00/rt2800usb.c
+++ b/drivers/net/wireless/rt2x00/rt2800usb.c
@@ -1107,6 +1107,20 @@ static struct usb_device_id rt2800usb_device_table[] = {
 	/* Ralink */
 	{ USB_DEVICE(0x148f, 0x5370) },
 	{ USB_DEVICE(0x148f, 0x5372) },
+	/* Alpha */
+	{ USB_DEVICE(0x2001, 0x3c15) },
+	{ USB_DEVICE(0x2001, 0x3c19) },
+	/* Arcadyan */
+	{ USB_DEVICE(0x043e, 0x7a12) },
+	/* LG innotek */
+	{ USB_DEVICE(0x043e, 0x7a22) },
+	/* Panasonic */
+	{ USB_DEVICE(0x04da, 0x1801) },
+	{ USB_DEVICE(0x04da, 0x1800) },
+	/* Unknown */
+	{ USB_DEVICE(0x04da, 0x23f6) },
+	/* Philips */
+	{ USB_DEVICE(0x0471, 0x2104) },
 #endif
 #ifdef CONFIG_RT2800USB_UNKNOWN
 	/*
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
index b03b22c..7bc5cee 100644
--- a/drivers/net/wireless/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
@@ -192,6 +192,8 @@ struct rt2x00_chip {
 #define RT3593		0x3593
 #define RT3883		0x3883	/* WSOC */
 #define RT5390		0x5390  /* 2.4GHz */
+#define RT5392		0x5392  /* 2.4GHz */
+#define RT5372		0x5372  /* 2.4GHz */
 
 	u16 rf;
 	u16 rev;
-- 
1.7.6.5


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* RE: [PATCH] rt2x00:Add RT5372 chipset support
  2012-02-18 12:24 ` Ivo Van Doorn
@ 2012-02-20  6:13   ` Chen-Yang Li (黎振陽)
  0 siblings, 0 replies; 10+ messages in thread
From: Chen-Yang Li (黎振陽) @ 2012-02-20  6:13 UTC (permalink / raw)
  To: Ivo Van Doorn, John Li; +Cc: users, linux-wireless, John Linville

RGVhciBBbGwsDQoNCkkgc2luY2VyZWx5IGFwcHJlY2lhdGUgYWxsIG9mIHlvdSB0byByZXZpZXcg
bXkgcGF0Y2hlcy4NClRoaXMgZXhwZXJpZW5jZSBoYXMgYmVuZWZpdGVkIG1lIGEgZ3JlYXQgZGVh
bC4NCg0KVGhhbmsgeW91IHNvIG11Y2ghDQoNCkpvaG4gTGkNCg0KLS0tLS1PcmlnaW5hbCBNZXNz
YWdlLS0tLS0NCkZyb206IEl2byBWYW4gRG9vcm4gW21haWx0bzppdmRvb3JuQGdtYWlsLmNvbV0N
ClNlbnQ6IFNhdHVyZGF5LCBGZWJydWFyeSAxOCwgMjAxMiA4OjI1IFBNDQpUbzogSm9obiBMaQ0K
Q2M6IHVzZXJzQHJ0MngwMC5zZXJpYWxtb25rZXkuY29tOyBsaW51eC13aXJlbGVzc0B2Z2VyLmtl
cm5lbC5vcmc7IEpvaG4gTGludmlsbGU7IENoZW4tWWFuZyBMaSAo6buO5oyv6Zm9KQ0KU3ViamVj
dDogUmU6IFtQQVRDSF0gcnQyeDAwOkFkZCBSVDUzNzIgY2hpcHNldCBzdXBwb3J0DQoNCjIwMTIv
Mi8xNyBKb2huIExpIDxqb2huLmxpLm1lZGlhdGVrQGdtYWlsLmNvbT46DQo+IEZyb206IEpvaG4g
TGkgPGNoZW4teWFuZy5saUBtZWRpYXRlay5jb20+DQo+DQo+IFNpZ25lZC1vZmYtYnk6IEpvaG4g
TGkgPGNoZW4teWFuZy5saUBtZWRpYXRlay5jb20+DQoNCkFja2VkLWJ5OiBJdm8gdmFuIERvb3Ju
IDxJdkRvb3JuQGdtYWlsLmNvbT4NCg0KPiAtLS0NCj4gIGRyaXZlcnMvbmV0L3dpcmVsZXNzL3J0
MngwMC9ydDI4MDAuaCAgICB8ICAgIDEgKw0KPiAgZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAw
L3J0MjgwMGxpYi5jIHwgIDE1Mw0KPiArKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0tDQo+
ICBkcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwcGNpLmMgfCAgICAzICstDQo+ICBk
cml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwdXNiLmMgfCAgIDE0ICsrKw0KPiAgZHJp
dmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMC5oICAgIHwgICAgMSArDQo+ICA1IGZpbGVz
IGNoYW5nZWQsIDE0NyBpbnNlcnRpb25zKCspLCAyNSBkZWxldGlvbnMoLSkNCj4NCj4gZGlmZiAt
LWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDAuaA0KPiBiL2RyaXZlcnMv
bmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDAuaA0KPiBpbmRleCAyNTcxYTJmLi41NmI3OGM4IDEw
MDY0NA0KPiAtLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwLmgNCj4gKysr
IGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMC5oDQo+IEBAIC02OCw2ICs2OCw3
IEBADQo+ICAjZGVmaW5lIFJGMzMyMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMGMNCj4g
ICNkZWZpbmUgUkYzMDUzICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwZA0KPiAgI2RlZmlu
ZSBSRjUzNzAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MzcwDQo+ICsjZGVmaW5lIFJGNTM3
MiAgICAgICAgICAgICAgICAgICAgICAgICAweDUzNzINCj4gICNkZWZpbmUgUkY1MzkwICAgICAg
ICAgICAgICAgICAgICAgICAgIDB4NTM5MA0KPg0KPiAgLyoNCj4gZGlmZiAtLWdpdCBhL2RyaXZl
cnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDBsaWIuYw0KPiBiL2RyaXZlcnMvbmV0L3dpcmVs
ZXNzL3J0MngwMC9ydDI4MDBsaWIuYw0KPiBpbmRleCAyMmExYThmLi45MGQ3YTM2IDEwMDY0NA0K
PiAtLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwbGliLmMNCj4gKysrIGIv
ZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMGxpYi5jDQo+IEBAIC00MDIsNyArNDAy
LDggQEAgaW50IHJ0MjgwMF9sb2FkX2Zpcm13YXJlKHN0cnVjdCBydDJ4MDBfZGV2DQo+ICpydDJ4
MDBkZXYsDQo+DQo+ICAgICAgICBpZiAocnQyeDAwX2lzX3BjaShydDJ4MDBkZXYpKSB7DQo+ICAg
ICAgICAgICAgICAgIGlmIChydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDM1NzIpIHx8DQo+IC0gICAg
ICAgICAgICAgICAgICAgcnQyeDAwX3J0KHJ0MngwMGRldiwgUlQ1MzkwKSkgew0KPiArICAgICAg
ICAgICAgICAgICAgIHJ0MngwMF9ydChydDJ4MDBkZXYsIFJUNTM5MCkgfHwNCj4gKyAgICAgICAg
ICAgICAgICAgICBydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTIpKSB7DQo+ICAgICAgICAgICAg
ICAgICAgICAgICAgcnQyODAwX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBBVVhfQ1RSTCwNCj4g
JnJlZyk7DQo+ICAgICAgICAgICAgICAgICAgICAgICAgcnQyeDAwX3NldF9maWVsZDMyKCZyZWcs
DQo+IEFVWF9DVFJMX0ZPUkNFX1BDSUVfQ0xLLCAxKTsNCj4gICAgICAgICAgICAgICAgICAgICAg
ICBydDJ4MDBfc2V0X2ZpZWxkMzIoJnJlZywgQVVYX0NUUkxfV0FLRV9QQ0lFX0VOLA0KPiAxKTsg
QEAgLTE5MDYsNyArMTkwNyw4IEBAIHN0YXRpYyB2b2lkDQo+IHJ0MjgwMF9jb25maWdfY2hhbm5l
bF9yZjUzeHgoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwNCj4gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByNTVfbm9uYnRfcmV2W2lkeF0pOw0K
PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnQyODAwX3JmY3NyX3dyaXRlKHJ0Mngw
MGRldiwgNTksDQo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcjU5X25vbmJ0X3JldltpZHhdKTsNCj4gLSAgICAgICAgICAgICAgICAgICAgICAgfSBl
bHNlIGlmIChydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTApKSB7DQo+ICsgICAgICAgICAgICAg
ICAgICAgICAgIH0gZWxzZSBpZiAocnQyeDAwX3J0KHJ0MngwMGRldiwgUlQ1MzkwKSB8fA0KPiAr
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnQyeDAwX3J0KHJ0Mngw
MGRldiwNCj4gKyBSVDUzOTIpKSB7DQo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz
dGF0aWMgY29uc3QgY2hhciByNTlfbm9uX2J0W10gPSB7MHg4ZiwNCj4gMHg4ZiwNCj4gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ZiwgMHg4ZiwgMHg4ZiwgMHg4Ziwg
MHg4ZiwNCj4gMHg4ZCwNCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
MHg4YSwgMHg4OCwgMHg4OCwgMHg4NywgMHg4NywNCj4gMHg4Nn07IEBAIC0xOTU2LDYgKzE5NTgs
NyBAQCBzdGF0aWMgdm9pZCBydDI4MDBfY29uZmlnX2NoYW5uZWwoc3RydWN0DQo+IHJ0MngwMF9k
ZXYgKnJ0MngwMGRldiwNCj4gICAgICAgICAgICAgICAgcnQyODAwX2NvbmZpZ19jaGFubmVsX3Jm
MzA1MihydDJ4MDBkZXYsIGNvbmYsIHJmLA0KPiBpbmZvKTsNCj4gICAgICAgICAgICAgICAgYnJl
YWs7DQo+ICAgICAgICBjYXNlIFJGNTM3MDoNCj4gKyAgICAgICBjYXNlIFJGNTM3MjoNCj4gICAg
ICAgIGNhc2UgUkY1MzkwOg0KPiAgICAgICAgICAgICAgICBydDI4MDBfY29uZmlnX2NoYW5uZWxf
cmY1M3h4KHJ0MngwMGRldiwgY29uZiwgcmYsDQo+IGluZm8pOw0KPiAgICAgICAgICAgICAgICBi
cmVhazsNCj4gQEAgLTE5NzIsNyArMTk3NSw4IEBAIHN0YXRpYyB2b2lkIHJ0MjgwMF9jb25maWdf
Y2hhbm5lbChzdHJ1Y3QNCj4gcnQyeDAwX2RldiAqcnQyeDAwZGV2LA0KPiAgICAgICAgcnQyODAw
X2JicF93cml0ZShydDJ4MDBkZXYsIDg2LCAwKTsNCj4NCj4gICAgICAgIGlmIChyZi0+Y2hhbm5l
bCA8PSAxNCkgew0KPiAtICAgICAgICAgICAgICAgaWYgKCFydDJ4MDBfcnQocnQyeDAwZGV2LCBS
VDUzOTApKSB7DQo+ICsgICAgICAgICAgICAgICBpZiAoIXJ0MngwMF9ydChydDJ4MDBkZXYsIFJU
NTM5MCkgJiYNCj4gKyAgICAgICAgICAgICAgICAgICAgICAgIXJ0MngwMF9ydChydDJ4MDBkZXYs
IFJUNTM5MikpIHsNCj4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVzdF9iaXQoQ0FQQUJJ
TElUWV9FWFRFUk5BTF9MTkFfQkcsDQo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICZydDJ4MDBkZXYtPmNhcF9mbGFncykpIHsNCj4gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHJ0MjgwMF9iYnBfd3JpdGUocnQyeDAwZGV2LCA4MiwgMHg2Mik7DQo+IEBAIC0yNTAy
LDcgKzI1MDYsOCBAQCBzdGF0aWMgdTggcnQyODAwX2dldF9kZWZhdWx0X3ZnYyhzdHJ1Y3QNCj4g
cnQyeDAwX2RldiAqcnQyeDAwZGV2KQ0KPiAgICAgICAgICAgICAgICAgICAgcnQyeDAwX3J0KHJ0
MngwMGRldiwgUlQzMDcxKSB8fA0KPiAgICAgICAgICAgICAgICAgICAgcnQyeDAwX3J0KHJ0Mngw
MGRldiwgUlQzMDkwKSB8fA0KPiAgICAgICAgICAgICAgICAgICAgcnQyeDAwX3J0KHJ0MngwMGRl
diwgUlQzMzkwKSB8fA0KPiAtICAgICAgICAgICAgICAgICAgIHJ0MngwMF9ydChydDJ4MDBkZXYs
IFJUNTM5MCkpDQo+ICsgICAgICAgICAgICAgICAgICAgcnQyeDAwX3J0KHJ0MngwMGRldiwgUlQ1
MzkwKSB8fA0KPiArICAgICAgICAgICAgICAgICAgIHJ0MngwMF9ydChydDJ4MDBkZXYsIFJUNTM5
MikpDQo+ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDB4MWMgKyAoMiAqIHJ0MngwMGRl
di0+bG5hX2dhaW4pOw0KPiAgICAgICAgICAgICAgICBlbHNlDQo+ICAgICAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIDB4MmUgKyBydDJ4MDBkZXYtPmxuYV9nYWluOyBAQCAtMjYzNyw3DQo+ICsy
NjQyLDggQEAgc3RhdGljIGludCBydDI4MDBfaW5pdF9yZWdpc3RlcnMoc3RydWN0IHJ0MngwMF9k
ZXYNCj4gKnJ0MngwMGRldikNCj4gICAgICAgIH0gZWxzZSBpZiAocnQyeDAwX3J0KHJ0MngwMGRl
diwgUlQzNTcyKSkgew0KPiAgICAgICAgICAgICAgICBydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQy
eDAwZGV2LCBUWF9TV19DRkcwLA0KPiAweDAwMDAwNDAwKTsNCj4gICAgICAgICAgICAgICAgcnQy
ODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgVFhfU1dfQ0ZHMSwNCj4gMHgwMDA4MDYwNik7
DQo+IC0gICAgICAgfSBlbHNlIGlmIChydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTApKSB7DQo+
ICsgICAgICAgfSBlbHNlIGlmIChydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTApIHx8DQo+ICsg
ICAgICAgICAgICAgICAgICAgICAgICAgIHJ0MngwMF9ydChydDJ4MDBkZXYsIFJUNTM5MikpIHsN
Cj4gICAgICAgICAgICAgICAgcnQyODAwX3JlZ2lzdGVyX3dyaXRlKHJ0MngwMGRldiwgVFhfU1df
Q0ZHMCwNCj4gMHgwMDAwMDQwNCk7DQo+ICAgICAgICAgICAgICAgIHJ0MjgwMF9yZWdpc3Rlcl93
cml0ZShydDJ4MDBkZXYsIFRYX1NXX0NGRzEsDQo+IDB4MDAwODA2MDYpOw0KPiAgICAgICAgICAg
ICAgICBydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBUWF9TV19DRkcyLA0KPiAweDAw
MDAwMDAwKTsgQEAgLTMwMTMsNyArMzAxOSw4IEBAIHN0YXRpYyBpbnQgcnQyODAwX2luaXRfYmJw
KHN0cnVjdA0KPiBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpDQo+ICAgICAgICAgICAgICAgICAgICAg
cnQyODAwX3dhaXRfYmJwX3JlYWR5KHJ0MngwMGRldikpKQ0KPiAgICAgICAgICAgICAgICByZXR1
cm4gLUVBQ0NFUzsNCj4NCj4gLSAgICAgICBpZiAocnQyeDAwX3J0KHJ0MngwMGRldiwgUlQ1Mzkw
KSkgew0KPiArICAgICAgIGlmIChydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTApIHx8DQo+ICsg
ICAgICAgICAgICAgICBydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTIpKSB7DQo+ICAgICAgICAg
ICAgICAgIHJ0MjgwMF9iYnBfcmVhZChydDJ4MDBkZXYsIDQsICZ2YWx1ZSk7DQo+ICAgICAgICAg
ICAgICAgIHJ0MngwMF9zZXRfZmllbGQ4KCZ2YWx1ZSwgQkJQNF9NQUNfSUZfQ1RSTCwgMSk7DQo+
ICAgICAgICAgICAgICAgIHJ0MjgwMF9iYnBfd3JpdGUocnQyeDAwZGV2LCA0LCB2YWx1ZSk7IEBA
IC0zMDIxLDE5DQo+ICszMDI4LDIyIEBAIHN0YXRpYyBpbnQgcnQyODAwX2luaXRfYmJwKHN0cnVj
dCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYpDQo+DQo+ICAgICAgICBpZiAocnQyODAwX2lzXzMwNXhf
c29jKHJ0MngwMGRldikgfHwNCj4gICAgICAgICAgICBydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDM1
NzIpIHx8DQo+IC0gICAgICAgICAgIHJ0MngwMF9ydChydDJ4MDBkZXYsIFJUNTM5MCkpDQo+ICsg
ICAgICAgICAgIHJ0MngwMF9ydChydDJ4MDBkZXYsIFJUNTM5MCkgfHwNCj4gKyAgICAgICAgICAg
cnQyeDAwX3J0KHJ0MngwMGRldiwgUlQ1MzkyKSkNCj4gICAgICAgICAgICAgICAgcnQyODAwX2Ji
cF93cml0ZShydDJ4MDBkZXYsIDMxLCAweDA4KTsNCj4NCj4gICAgICAgIHJ0MjgwMF9iYnBfd3Jp
dGUocnQyeDAwZGV2LCA2NSwgMHgyYyk7DQo+ICAgICAgICBydDI4MDBfYmJwX3dyaXRlKHJ0Mngw
MGRldiwgNjYsIDB4MzgpOw0KPg0KPiAtICAgICAgIGlmIChydDJ4MDBfcnQocnQyeDAwZGV2LCBS
VDUzOTApKQ0KPiArICAgICAgIGlmIChydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTApIHx8DQo+
ICsgICAgICAgICAgICAgICBydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTIpKQ0KPiAgICAgICAg
ICAgICAgICBydDI4MDBfYmJwX3dyaXRlKHJ0MngwMGRldiwgNjgsIDB4MGIpOw0KPg0KPiAgICAg
ICAgaWYgKHJ0MngwMF9ydF9yZXYocnQyeDAwZGV2LCBSVDI4NjAsIFJFVl9SVDI4NjBDKSkgew0K
PiAgICAgICAgICAgICAgICBydDI4MDBfYmJwX3dyaXRlKHJ0MngwMGRldiwgNjksIDB4MTYpOw0K
PiAgICAgICAgICAgICAgICBydDI4MDBfYmJwX3dyaXRlKHJ0MngwMGRldiwgNzMsIDB4MTIpOw0K
PiAtICAgICAgIH0gZWxzZSBpZiAocnQyeDAwX3J0KHJ0MngwMGRldiwgUlQ1MzkwKSkgew0KPiAr
ICAgICAgIH0gZWxzZSBpZiAocnQyeDAwX3J0KHJ0MngwMGRldiwgUlQ1MzkwKSB8fA0KPiArICAg
ICAgICAgICAgICAgICAgICAgICAgICBydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTIpKSB7DQo+
ICAgICAgICAgICAgICAgIHJ0MjgwMF9iYnBfd3JpdGUocnQyeDAwZGV2LCA2OSwgMHgxMik7DQo+
ICAgICAgICAgICAgICAgIHJ0MjgwMF9iYnBfd3JpdGUocnQyeDAwZGV2LCA3MywgMHgxMyk7DQo+
ICAgICAgICAgICAgICAgIHJ0MjgwMF9iYnBfd3JpdGUocnQyeDAwZGV2LCA3NSwgMHg0Nik7IEBA
IC0zMDUxLDcNCj4gKzMwNjEsOCBAQCBzdGF0aWMgaW50IHJ0MjgwMF9pbml0X2JicChzdHJ1Y3Qg
cnQyeDAwX2RldiAqcnQyeDAwZGV2KQ0KPiAgICAgICAgICAgIHJ0MngwMF9ydChydDJ4MDBkZXYs
IFJUMzA5MCkgfHwNCj4gICAgICAgICAgICBydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDMzOTApIHx8
DQo+ICAgICAgICAgICAgcnQyeDAwX3J0KHJ0MngwMGRldiwgUlQzNTcyKSB8fA0KPiAtICAgICAg
ICAgICBydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTApKSB7DQo+ICsgICAgICAgICAgIHJ0Mngw
MF9ydChydDJ4MDBkZXYsIFJUNTM5MCkgfHwNCj4gKyAgICAgICAgICAgcnQyeDAwX3J0KHJ0Mngw
MGRldiwgUlQ1MzkyKSkgew0KPiAgICAgICAgICAgICAgICBydDI4MDBfYmJwX3dyaXRlKHJ0Mngw
MGRldiwgNzksIDB4MTMpOw0KPiAgICAgICAgICAgICAgICBydDI4MDBfYmJwX3dyaXRlKHJ0Mngw
MGRldiwgODAsIDB4MDUpOw0KPiAgICAgICAgICAgICAgICBydDI4MDBfYmJwX3dyaXRlKHJ0Mngw
MGRldiwgODEsIDB4MzMpOyBAQCAtMzA2Myw2NA0KPiArMzA3NCw4OCBAQCBzdGF0aWMgaW50IHJ0
MjgwMF9pbml0X2JicChzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2KQ0KPiAgICAgICAgfQ0K
Pg0KPiAgICAgICAgcnQyODAwX2JicF93cml0ZShydDJ4MDBkZXYsIDgyLCAweDYyKTsNCj4gLSAg
ICAgICBpZiAocnQyeDAwX3J0KHJ0MngwMGRldiwgUlQ1MzkwKSkNCj4gKyAgICAgICBpZiAocnQy
eDAwX3J0KHJ0MngwMGRldiwgUlQ1MzkwKSB8fA0KPiArICAgICAgICAgICAgICAgcnQyeDAwX3J0
KHJ0MngwMGRldiwgUlQ1MzkyKSkNCj4gICAgICAgICAgICAgICAgcnQyODAwX2JicF93cml0ZShy
dDJ4MDBkZXYsIDgzLCAweDdhKTsNCj4gICAgICAgIGVsc2UNCj4gICAgICAgICAgICAgICAgcnQy
ODAwX2JicF93cml0ZShydDJ4MDBkZXYsIDgzLCAweDZhKTsNCj4NCj4gICAgICAgIGlmIChydDJ4
MDBfcnRfcmV2KHJ0MngwMGRldiwgUlQyODYwLCBSRVZfUlQyODYwRCkpDQo+ICAgICAgICAgICAg
ICAgIHJ0MjgwMF9iYnBfd3JpdGUocnQyeDAwZGV2LCA4NCwgMHgxOSk7DQo+IC0gICAgICAgZWxz
ZSBpZiAocnQyeDAwX3J0KHJ0MngwMGRldiwgUlQ1MzkwKSkNCj4gKyAgICAgICBlbHNlIGlmIChy
dDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTApIHx8DQo+ICsgICAgICAgICAgICAgICAgICAgICAg
ICBydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTIpKQ0KPiAgICAgICAgICAgICAgICBydDI4MDBf
YmJwX3dyaXRlKHJ0MngwMGRldiwgODQsIDB4OWEpOw0KPiAgICAgICAgZWxzZQ0KPiAgICAgICAg
ICAgICAgICBydDI4MDBfYmJwX3dyaXRlKHJ0MngwMGRldiwgODQsIDB4OTkpOw0KPg0KPiAtICAg
ICAgIGlmIChydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTApKQ0KPiArICAgICAgIGlmIChydDJ4
MDBfcnQocnQyeDAwZGV2LCBSVDUzOTApIHx8DQo+ICsgICAgICAgICAgICAgICBydDJ4MDBfcnQo
cnQyeDAwZGV2LCBSVDUzOTIpKQ0KPiAgICAgICAgICAgICAgICBydDI4MDBfYmJwX3dyaXRlKHJ0
MngwMGRldiwgODYsIDB4MzgpOw0KPiAgICAgICAgZWxzZQ0KPiAgICAgICAgICAgICAgICBydDI4
MDBfYmJwX3dyaXRlKHJ0MngwMGRldiwgODYsIDB4MDApOw0KPg0KPiArICAgICAgIGlmIChydDJ4
MDBfcnQocnQyeDAwZGV2LCBSVDUzOTIpKQ0KPiArICAgICAgICAgICAgICAgcnQyODAwX2JicF93
cml0ZShydDJ4MDBkZXYsIDg4LCAweDkwKTsNCj4gKw0KPiAgICAgICAgcnQyODAwX2JicF93cml0
ZShydDJ4MDBkZXYsIDkxLCAweDA0KTsNCj4NCj4gLSAgICAgICBpZiAocnQyeDAwX3J0KHJ0Mngw
MGRldiwgUlQ1MzkwKSkNCj4gKyAgICAgICBpZiAocnQyeDAwX3J0KHJ0MngwMGRldiwgUlQ1Mzkw
KSB8fA0KPiArICAgICAgICAgICAgICAgcnQyeDAwX3J0KHJ0MngwMGRldiwgUlQ1MzkyKSkNCj4g
ICAgICAgICAgICAgICAgcnQyODAwX2JicF93cml0ZShydDJ4MDBkZXYsIDkyLCAweDAyKTsNCj4g
ICAgICAgIGVsc2UNCj4gICAgICAgICAgICAgICAgcnQyODAwX2JicF93cml0ZShydDJ4MDBkZXYs
IDkyLCAweDAwKTsNCj4NCj4gKyAgICAgICBpZiAocnQyeDAwX3J0KHJ0MngwMGRldiwgUlQ1Mzky
KSkgew0KPiArICAgICAgICAgICAgICAgcnQyODAwX2JicF93cml0ZShydDJ4MDBkZXYsIDk1LCAw
eDlhKTsNCj4gKyAgICAgICAgICAgICAgIHJ0MjgwMF9iYnBfd3JpdGUocnQyeDAwZGV2LCA5OCwg
MHgxMik7DQo+ICsgICAgICAgfQ0KPiArDQo+ICAgICAgICBpZiAocnQyeDAwX3J0X3Jldl9ndGUo
cnQyeDAwZGV2LCBSVDMwNzAsIFJFVl9SVDMwNzBGKSB8fA0KPiAgICAgICAgICAgIHJ0MngwMF9y
dF9yZXZfZ3RlKHJ0MngwMGRldiwgUlQzMDcxLCBSRVZfUlQzMDcxRSkgfHwNCj4gICAgICAgICAg
ICBydDJ4MDBfcnRfcmV2X2d0ZShydDJ4MDBkZXYsIFJUMzA5MCwgUkVWX1JUMzA5MEUpIHx8DQo+
ICAgICAgICAgICAgcnQyeDAwX3J0X3Jldl9ndGUocnQyeDAwZGV2LCBSVDMzOTAsIFJFVl9SVDMz
OTBFKSB8fA0KPiAgICAgICAgICAgIHJ0MngwMF9ydChydDJ4MDBkZXYsIFJUMzU3MikgfHwNCj4g
ICAgICAgICAgICBydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTApIHx8DQo+ICsgICAgICAgICAg
IHJ0MngwMF9ydChydDJ4MDBkZXYsIFJUNTM5MikgfHwNCj4gICAgICAgICAgICBydDI4MDBfaXNf
MzA1eF9zb2MocnQyeDAwZGV2KSkNCj4gICAgICAgICAgICAgICAgcnQyODAwX2JicF93cml0ZShy
dDJ4MDBkZXYsIDEwMywgMHhjMCk7DQo+ICAgICAgICBlbHNlDQo+ICAgICAgICAgICAgICAgIHJ0
MjgwMF9iYnBfd3JpdGUocnQyeDAwZGV2LCAxMDMsIDB4MDApOw0KPg0KPiAtICAgICAgIGlmIChy
dDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTApKQ0KPiArICAgICAgIGlmIChydDJ4MDBfcnQocnQy
eDAwZGV2LCBSVDUzOTApIHx8DQo+ICsgICAgICAgICAgICAgICBydDJ4MDBfcnQocnQyeDAwZGV2
LCBSVDUzOTIpKQ0KPiAgICAgICAgICAgICAgICBydDI4MDBfYmJwX3dyaXRlKHJ0MngwMGRldiwg
MTA0LCAweDkyKTsNCj4NCj4gICAgICAgIGlmIChydDI4MDBfaXNfMzA1eF9zb2MocnQyeDAwZGV2
KSkNCj4gICAgICAgICAgICAgICAgcnQyODAwX2JicF93cml0ZShydDJ4MDBkZXYsIDEwNSwgMHgw
MSk7DQo+IC0gICAgICAgZWxzZSBpZiAocnQyeDAwX3J0KHJ0MngwMGRldiwgUlQ1MzkwKSkNCj4g
KyAgICAgICBlbHNlIGlmIChydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTApIHx8DQo+ICsgICAg
ICAgICAgICAgICAgICAgICAgICBydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTIpKQ0KPiAgICAg
ICAgICAgICAgICBydDI4MDBfYmJwX3dyaXRlKHJ0MngwMGRldiwgMTA1LCAweDNjKTsNCj4gICAg
ICAgIGVsc2UNCj4gICAgICAgICAgICAgICAgcnQyODAwX2JicF93cml0ZShydDJ4MDBkZXYsIDEw
NSwgMHgwNSk7DQo+DQo+ICAgICAgICBpZiAocnQyeDAwX3J0KHJ0MngwMGRldiwgUlQ1MzkwKSkN
Cj4gICAgICAgICAgICAgICAgcnQyODAwX2JicF93cml0ZShydDJ4MDBkZXYsIDEwNiwgMHgwMyk7
DQo+ICsgICAgICAgZWxzZSBpZiAocnQyeDAwX3J0KHJ0MngwMGRldiwgUlQ1MzkyKSkNCj4gKyAg
ICAgICAgICAgICAgIHJ0MjgwMF9iYnBfd3JpdGUocnQyeDAwZGV2LCAxMDYsIDB4MTIpOw0KPiAg
ICAgICAgZWxzZQ0KPiAgICAgICAgICAgICAgICBydDI4MDBfYmJwX3dyaXRlKHJ0MngwMGRldiwg
MTA2LCAweDM1KTsNCj4NCj4gLSAgICAgICBpZiAocnQyeDAwX3J0KHJ0MngwMGRldiwgUlQ1Mzkw
KSkNCj4gKyAgICAgICBpZiAocnQyeDAwX3J0KHJ0MngwMGRldiwgUlQ1MzkwKSB8fA0KPiArICAg
ICAgICAgICAgICAgcnQyeDAwX3J0KHJ0MngwMGRldiwgUlQ1MzkyKSkNCj4gICAgICAgICAgICAg
ICAgcnQyODAwX2JicF93cml0ZShydDJ4MDBkZXYsIDEyOCwgMHgxMik7DQo+DQo+ICsgICAgICAg
aWYgKHJ0MngwMF9ydChydDJ4MDBkZXYsIFJUNTM5MikpIHsNCj4gKyAgICAgICAgICAgICAgIHJ0
MjgwMF9iYnBfd3JpdGUocnQyeDAwZGV2LCAxMzQsIDB4ZDApOw0KPiArICAgICAgICAgICAgICAg
cnQyODAwX2JicF93cml0ZShydDJ4MDBkZXYsIDEzNSwgMHhmNik7DQo+ICsgICAgICAgfQ0KPiAr
DQo+ICAgICAgICBpZiAocnQyeDAwX3J0KHJ0MngwMGRldiwgUlQzMDcxKSB8fA0KPiAgICAgICAg
ICAgIHJ0MngwMF9ydChydDJ4MDBkZXYsIFJUMzA5MCkgfHwNCj4gICAgICAgICAgICBydDJ4MDBf
cnQocnQyeDAwZGV2LCBSVDMzOTApIHx8DQo+ICAgICAgICAgICAgcnQyeDAwX3J0KHJ0MngwMGRl
diwgUlQzNTcyKSB8fA0KPiAtICAgICAgICAgICBydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTAp
KSB7DQo+ICsgICAgICAgICAgIHJ0MngwMF9ydChydDJ4MDBkZXYsIFJUNTM5MCkgfHwNCj4gKyAg
ICAgICAgICAgcnQyeDAwX3J0KHJ0MngwMGRldiwgUlQ1MzkyKSkgew0KPiAgICAgICAgICAgICAg
ICBydDI4MDBfYmJwX3JlYWQocnQyeDAwZGV2LCAxMzgsICZ2YWx1ZSk7DQo+DQo+ICAgICAgICAg
ICAgICAgIHJ0MngwMF9lZXByb21fcmVhZChydDJ4MDBkZXYsIEVFUFJPTV9OSUNfQ09ORjAsDQo+
ICZlZXByb20pOyBAQCAtMzEzMiw3ICszMTY3LDggQEAgc3RhdGljIGludCBydDI4MDBfaW5pdF9i
YnAoc3RydWN0DQo+IHJ0MngwMF9kZXYgKnJ0MngwMGRldikNCj4gICAgICAgICAgICAgICAgcnQy
ODAwX2JicF93cml0ZShydDJ4MDBkZXYsIDEzOCwgdmFsdWUpOw0KPiAgICAgICAgfQ0KPg0KPiAt
ICAgICAgIGlmIChydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTApKSB7DQo+ICsgICAgICAgaWYg
KHJ0MngwMF9ydChydDJ4MDBkZXYsIFJUNTM5MCkgfHwNCj4gKyAgICAgICAgICAgICAgIHJ0Mngw
MF9ydChydDJ4MDBkZXYsIFJUNTM5MikpIHsNCj4gICAgICAgICAgICAgICAgaW50IGFudCwgZGl2
X21vZGU7DQo+DQo+ICAgICAgICAgICAgICAgIHJ0MngwMF9lZXByb21fcmVhZChydDJ4MDBkZXYs
IEVFUFJPTV9OSUNfQ09ORjEsDQo+ICZlZXByb20pOyBAQCAtMzI1OCwxMyArMzI5NCwxNSBAQCBz
dGF0aWMgaW50IHJ0MjgwMF9pbml0X3JmY3NyKHN0cnVjdA0KPiBydDJ4MDBfZGV2ICpydDJ4MDBk
ZXYpDQo+ICAgICAgICAgICAgIXJ0MngwMF9ydChydDJ4MDBkZXYsIFJUMzM5MCkgJiYNCj4gICAg
ICAgICAgICAhcnQyeDAwX3J0KHJ0MngwMGRldiwgUlQzNTcyKSAmJg0KPiAgICAgICAgICAgICFy
dDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTApICYmDQo+ICsgICAgICAgICAgICFydDJ4MDBfcnQo
cnQyeDAwZGV2LCBSVDUzOTIpICYmDQo+ICAgICAgICAgICAgIXJ0MjgwMF9pc18zMDV4X3NvYyhy
dDJ4MDBkZXYpKQ0KPiAgICAgICAgICAgICAgICByZXR1cm4gMDsNCj4NCj4gICAgICAgIC8qDQo+
ICAgICAgICAgKiBJbml0IFJGIGNhbGlicmF0aW9uLg0KPiAgICAgICAgICovDQo+IC0gICAgICAg
aWYgKHJ0MngwMF9ydChydDJ4MDBkZXYsIFJUNTM5MCkpIHsNCj4gKyAgICAgICBpZiAocnQyeDAw
X3J0KHJ0MngwMGRldiwgUlQ1MzkwKSB8fA0KPiArICAgICAgICAgICAgICAgcnQyeDAwX3J0KHJ0
MngwMGRldiwgUlQ1MzkyKSkgew0KPiAgICAgICAgICAgICAgICBydDI4MDBfcmZjc3JfcmVhZChy
dDJ4MDBkZXYsIDIsICZyZmNzcik7DQo+ICAgICAgICAgICAgICAgIHJ0MngwMF9zZXRfZmllbGQ4
KCZyZmNzciwgUkZDU1IyX1JFU0NBTF9FTiwgMSk7DQo+ICAgICAgICAgICAgICAgIHJ0MjgwMF9y
ZmNzcl93cml0ZShydDJ4MDBkZXYsIDIsIHJmY3NyKTsgQEAgLTM0ODIsNg0KPiArMzUyMCw2NiBA
QCBzdGF0aWMgaW50IHJ0MjgwMF9pbml0X3JmY3NyKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBk
ZXYpDQo+ICAgICAgICAgICAgICAgICAgICAgICAgcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRl
diwgNjEsIDB4ZGQpOw0KPiAgICAgICAgICAgICAgICBydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAw
ZGV2LCA2MiwgMHgwMCk7DQo+ICAgICAgICAgICAgICAgIHJ0MjgwMF9yZmNzcl93cml0ZShydDJ4
MDBkZXYsIDYzLCAweDAwKTsNCj4gKyAgICAgICB9ICAgICAgIGVsc2UgaWYgKHJ0MngwMF9ydChy
dDJ4MDBkZXYsIFJUNTM5MikpIHsNCj4gKyAgICAgICAgICAgICAgICAgICAgICAgcnQyODAwX3Jm
Y3NyX3dyaXRlKHJ0MngwMGRldiwgMSwgMHgxNyk7DQo+ICsgICAgICAgICAgICAgICAgICAgICAg
IHJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDIsIDB4ODApOw0KPiArICAgICAgICAgICAg
ICAgICAgICAgICBydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAzLCAweDg4KTsNCj4gKyAg
ICAgICAgICAgICAgICAgICAgICAgcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgNSwgMHgx
MCk7DQo+ICsgICAgICAgICAgICAgICAgICAgICAgIHJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBk
ZXYsIDYsIDB4ZTApOw0KPiArICAgICAgICAgICAgICAgICAgICAgICBydDI4MDBfcmZjc3Jfd3Jp
dGUocnQyeDAwZGV2LCA3LCAweDAwKTsNCj4gKyAgICAgICAgICAgICAgICAgICAgICAgcnQyODAw
X3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgMTAsIDB4NTMpOw0KPiArICAgICAgICAgICAgICAgICAg
ICAgICBydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAxMSwgMHg0YSk7DQo+ICsgICAgICAg
ICAgICAgICAgICAgICAgIHJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDEyLCAweDQ2KTsN
Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwg
MTMsIDB4OWYpOw0KPiArICAgICAgICAgICAgICAgICAgICAgICBydDI4MDBfcmZjc3Jfd3JpdGUo
cnQyeDAwZGV2LCAxNCwgMHgwMCk7DQo+ICsgICAgICAgICAgICAgICAgICAgICAgIHJ0MjgwMF9y
ZmNzcl93cml0ZShydDJ4MDBkZXYsIDE1LCAweDAwKTsNCj4gKyAgICAgICAgICAgICAgICAgICAg
ICAgcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgMTYsIDB4MDApOw0KPiArICAgICAgICAg
ICAgICAgICAgICAgICBydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAxOCwgMHgwMyk7DQo+
ICsgICAgICAgICAgICAgICAgICAgICAgIHJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDE5
LCAweDRkKTsNCj4gKyAgICAgICAgICAgICAgICAgICAgICAgcnQyODAwX3JmY3NyX3dyaXRlKHJ0
MngwMGRldiwgMjAsIDB4MDApOw0KPiArICAgICAgICAgICAgICAgICAgICAgICBydDI4MDBfcmZj
c3Jfd3JpdGUocnQyeDAwZGV2LCAyMSwgMHg4ZCk7DQo+ICsgICAgICAgICAgICAgICAgICAgICAg
IHJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDIyLCAweDIwKTsNCj4gKyAgICAgICAgICAg
ICAgICAgICAgICAgcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgMjMsIDB4MGIpOw0KPiAr
ICAgICAgICAgICAgICAgICAgICAgICBydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAyNCwg
MHg0NCk7DQo+ICsgICAgICAgICAgICAgICAgICAgICAgIHJ0MjgwMF9yZmNzcl93cml0ZShydDJ4
MDBkZXYsIDI1LCAweDgwKTsNCj4gKyAgICAgICAgICAgICAgICAgICAgICAgcnQyODAwX3JmY3Ny
X3dyaXRlKHJ0MngwMGRldiwgMjYsIDB4ODIpOw0KPiArICAgICAgICAgICAgICAgICAgICAgICBy
dDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAyNywgMHgwOSk7DQo+ICsgICAgICAgICAgICAg
ICAgICAgICAgIHJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDI4LCAweDAwKTsNCj4gKyAg
ICAgICAgICAgICAgICAgICAgICAgcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgMjksIDB4
MTApOw0KPiArICAgICAgICAgICAgICAgICAgICAgICBydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAw
ZGV2LCAzMCwgMHgxMCk7DQo+ICsgICAgICAgICAgICAgICAgICAgICAgIHJ0MjgwMF9yZmNzcl93
cml0ZShydDJ4MDBkZXYsIDMxLCAweDgwKTsNCj4gKyAgICAgICAgICAgICAgICAgICAgICAgcnQy
ODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgMzIsIDB4MjApOw0KPiArICAgICAgICAgICAgICAg
ICAgICAgICBydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAzMywgMHhDMCk7DQo+ICsgICAg
ICAgICAgICAgICAgICAgICAgIHJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDM0LCAweDA3
KTsNCj4gKyAgICAgICAgICAgICAgICAgICAgICAgcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRl
diwgMzUsIDB4MTIpOw0KPiArICAgICAgICAgICAgICAgICAgICAgICBydDI4MDBfcmZjc3Jfd3Jp
dGUocnQyeDAwZGV2LCAzNiwgMHgwMCk7DQo+ICsgICAgICAgICAgICAgICAgICAgICAgIHJ0Mjgw
MF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDM3LCAweDA4KTsNCj4gKyAgICAgICAgICAgICAgICAg
ICAgICAgcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgMzgsIDB4ODkpOw0KPiArICAgICAg
ICAgICAgICAgICAgICAgICBydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCAzOSwgMHgxYik7
DQo+ICsgICAgICAgICAgICAgICAgICAgICAgIHJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYs
IDQwLCAweDBmKTsNCj4gKyAgICAgICAgICAgICAgICAgICAgICAgcnQyODAwX3JmY3NyX3dyaXRl
KHJ0MngwMGRldiwgNDEsIDB4YmIpOw0KPiArICAgICAgICAgICAgICAgICAgICAgICBydDI4MDBf
cmZjc3Jfd3JpdGUocnQyeDAwZGV2LCA0MiwgMHhkNSk7DQo+ICsgICAgICAgICAgICAgICAgICAg
ICAgIHJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDQzLCAweDliKTsNCj4gKyAgICAgICAg
ICAgICAgICAgICAgICAgcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgNDQsIDB4MGUpOw0K
PiArICAgICAgICAgICAgICAgICAgICAgICBydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCA0
NSwgMHhhMik7DQo+ICsgICAgICAgICAgICAgICAgICAgICAgIHJ0MjgwMF9yZmNzcl93cml0ZShy
dDJ4MDBkZXYsIDQ2LCAweDczKTsNCj4gKyAgICAgICAgICAgICAgICAgICAgICAgcnQyODAwX3Jm
Y3NyX3dyaXRlKHJ0MngwMGRldiwgNDcsIDB4MGMpOw0KPiArICAgICAgICAgICAgICAgICAgICAg
ICBydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCA0OCwgMHgxMCk7DQo+ICsgICAgICAgICAg
ICAgICAgICAgICAgIHJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDQ5LCAweDk0KTsNCj4g
KyAgICAgICAgICAgICAgICAgICAgICAgcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgNTAs
IDB4OTQpOw0KPiArICAgICAgICAgICAgICAgICAgICAgICBydDI4MDBfcmZjc3Jfd3JpdGUocnQy
eDAwZGV2LCA1MSwgMHgzYSk7DQo+ICsgICAgICAgICAgICAgICAgICAgICAgIHJ0MjgwMF9yZmNz
cl93cml0ZShydDJ4MDBkZXYsIDUyLCAweDQ4KTsNCj4gKyAgICAgICAgICAgICAgICAgICAgICAg
cnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgNTMsIDB4NDQpOw0KPiArICAgICAgICAgICAg
ICAgICAgICAgICBydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCA1NCwgMHgzOCk7DQo+ICsg
ICAgICAgICAgICAgICAgICAgICAgIHJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDU1LCAw
eDQzKTsNCj4gKyAgICAgICAgICAgICAgICAgICAgICAgcnQyODAwX3JmY3NyX3dyaXRlKHJ0Mngw
MGRldiwgNTYsIDB4YTEpOw0KPiArICAgICAgICAgICAgICAgICAgICAgICBydDI4MDBfcmZjc3Jf
d3JpdGUocnQyeDAwZGV2LCA1NywgMHgwMCk7DQo+ICsgICAgICAgICAgICAgICAgICAgICAgIHJ0
MjgwMF9yZmNzcl93cml0ZShydDJ4MDBkZXYsIDU4LCAweDM5KTsNCj4gKyAgICAgICAgICAgICAg
ICAgICAgICAgcnQyODAwX3JmY3NyX3dyaXRlKHJ0MngwMGRldiwgNTksIDB4MDcpOw0KPiArICAg
ICAgICAgICAgICAgICAgICAgICBydDI4MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCA2MCwgMHg0
NSk7DQo+ICsgICAgICAgICAgICAgICAgICAgICAgIHJ0MjgwMF9yZmNzcl93cml0ZShydDJ4MDBk
ZXYsIDYxLCAweDkxKTsNCj4gKyAgICAgICAgICAgICAgICAgICAgICAgcnQyODAwX3JmY3NyX3dy
aXRlKHJ0MngwMGRldiwgNjIsIDB4MzkpOw0KPiArICAgICAgICAgICAgICAgICAgICAgICBydDI4
MDBfcmZjc3Jfd3JpdGUocnQyeDAwZGV2LCA2MywgMHgwNyk7DQo+ICAgICAgICB9DQo+DQo+ICAg
ICAgICBpZiAocnQyeDAwX3J0X3Jldl9sdChydDJ4MDBkZXYsIFJUMzA3MCwgUkVWX1JUMzA3MEYp
KSB7IEBADQo+IC0zNTQ5LDcgKzM2NDcsOCBAQCBzdGF0aWMgaW50IHJ0MjgwMF9pbml0X3JmY3Ny
KHN0cnVjdCBydDJ4MDBfZGV2DQo+ICpydDJ4MDBkZXYpDQo+ICAgICAgICAgICAgICAgICAgICAg
ICAgcnQyODAwX2luaXRfcnhfZmlsdGVyKHJ0MngwMGRldiwgdHJ1ZSwgMHgyNywNCj4gMHgxNSk7
DQo+ICAgICAgICB9DQo+DQo+IC0gICAgICAgaWYgKCFydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUz
OTApKSB7DQo+ICsgICAgICAgaWYgKCFydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTApICYmDQo+
ICsgICAgICAgICAgICAgICAhcnQyeDAwX3J0KHJ0MngwMGRldiwgUlQ1MzkyKSkgew0KPiAgICAg
ICAgICAgICAgICAvKg0KPiAgICAgICAgICAgICAgICAgKiBTZXQgYmFjayB0byBpbml0aWFsIHN0
YXRlDQo+ICAgICAgICAgICAgICAgICAqLw0KPiBAQCAtMzU3Nyw3ICszNjc2LDggQEAgc3RhdGlj
IGludCBydDI4MDBfaW5pdF9yZmNzcihzdHJ1Y3QgcnQyeDAwX2Rldg0KPiAqcnQyeDAwZGV2KQ0K
PiAgICAgICAgcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIE9QVF8xNF9DU1JfQklUMCwgMSk7DQo+
ICAgICAgICBydDI4MDBfcmVnaXN0ZXJfd3JpdGUocnQyeDAwZGV2LCBPUFRfMTRfQ1NSLCByZWcp
Ow0KPg0KPiAtICAgICAgIGlmICghcnQyeDAwX3J0KHJ0MngwMGRldiwgUlQ1MzkwKSkgew0KPiAr
ICAgICAgIGlmICghcnQyeDAwX3J0KHJ0MngwMGRldiwgUlQ1MzkwKSAmJg0KPiArICAgICAgICAg
ICAgICAgIXJ0MngwMF9ydChydDJ4MDBkZXYsIFJUNTM5MikpIHsNCj4gICAgICAgICAgICAgICAg
cnQyODAwX3JmY3NyX3JlYWQocnQyeDAwZGV2LCAxNywgJnJmY3NyKTsNCj4gICAgICAgICAgICAg
ICAgcnQyeDAwX3NldF9maWVsZDgoJnJmY3NyLCBSRkNTUjE3X1RYX0xPMV9FTiwgMCk7DQo+ICAg
ICAgICAgICAgICAgIGlmIChydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDMwNzApIHx8IEBAIC0zNjQ1
LDcgKzM3NDUsOA0KPiBAQCBzdGF0aWMgaW50IHJ0MjgwMF9pbml0X3JmY3NyKHN0cnVjdCBydDJ4
MDBfZGV2ICpydDJ4MDBkZXYpDQo+ICAgICAgICAgICAgICAgIHJ0MjgwMF9yZmNzcl93cml0ZShy
dDJ4MDBkZXYsIDI3LCByZmNzcik7DQo+ICAgICAgICB9DQo+DQo+IC0gICAgICAgaWYgKHJ0Mngw
MF9ydChydDJ4MDBkZXYsIFJUNTM5MCkpIHsNCj4gKyAgICAgICBpZiAocnQyeDAwX3J0KHJ0Mngw
MGRldiwgUlQ1MzkwKSB8fA0KPiArICAgICAgICAgICAgICAgcnQyeDAwX3J0KHJ0MngwMGRldiwg
UlQ1MzkyKSkgew0KPiAgICAgICAgICAgICAgICBydDI4MDBfcmZjc3JfcmVhZChydDJ4MDBkZXYs
IDM4LCAmcmZjc3IpOw0KPiAgICAgICAgICAgICAgICBydDJ4MDBfc2V0X2ZpZWxkOCgmcmZjc3Is
IFJGQ1NSMzhfUlhfTE8xX0VOLCAwKTsNCj4gICAgICAgICAgICAgICAgcnQyODAwX3JmY3NyX3dy
aXRlKHJ0MngwMGRldiwgMzgsIHJmY3NyKTsgQEAgLTM5MjksNw0KPiArNDAzMCw4IEBAIGludCBy
dDI4MDBfaW5pdF9lZXByb20oc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldikNCj4gICAgICAg
ICAqIFJUNTN4eDogZGVmaW5lZCBpbiAiRUVQUk9NX0NISVBfSUQiIGZpZWxkDQo+ICAgICAgICAg
Ki8NCj4gICAgICAgIHJ0MjgwMF9yZWdpc3Rlcl9yZWFkKHJ0MngwMGRldiwgTUFDX0NTUjAsICZy
ZWcpOw0KPiAtICAgICAgIGlmIChydDJ4MDBfZ2V0X2ZpZWxkMzIocmVnLCBNQUNfQ1NSMF9DSElQ
U0VUKSA9PSBSVDUzOTApDQo+ICsgICAgICAgaWYgKHJ0MngwMF9nZXRfZmllbGQzMihyZWcsIE1B
Q19DU1IwX0NISVBTRVQpID09IFJUNTM5MCB8fA0KPiArICAgICAgICAgICAgICAgcnQyeDAwX2dl
dF9maWVsZDMyKHJlZywgTUFDX0NTUjBfQ0hJUFNFVCkgPT0gUlQ1MzkyKQ0KPiAgICAgICAgICAg
ICAgICBydDJ4MDBfZWVwcm9tX3JlYWQocnQyeDAwZGV2LCBFRVBST01fQ0hJUF9JRCwgJnZhbHVl
KTsNCj4gICAgICAgIGVsc2UNCj4gICAgICAgICAgICAgICAgdmFsdWUgPSBydDJ4MDBfZ2V0X2Zp
ZWxkMTYoZWVwcm9tLA0KPiBFRVBST01fTklDX0NPTkYwX1JGX1RZUEUpOyBAQCAtMzk0Nyw2ICs0
MDQ5LDcgQEAgaW50DQo+IHJ0MjgwMF9pbml0X2VlcHJvbShzdHJ1Y3QgcnQyeDAwX2RldiAqcnQy
eDAwZGV2KQ0KPiAgICAgICAgY2FzZSBSVDMzOTA6DQo+ICAgICAgICBjYXNlIFJUMzU3MjoNCj4g
ICAgICAgIGNhc2UgUlQ1MzkwOg0KPiArICAgICAgIGNhc2UgUlQ1MzkyOg0KPiAgICAgICAgICAg
ICAgICBicmVhazsNCj4gICAgICAgIGRlZmF1bHQ6DQo+ICAgICAgICAgICAgICAgIEVSUk9SKHJ0
MngwMGRldiwgIkludmFsaWQgUlQgY2hpcHNldCBkZXRlY3RlZC5cbiIpOyBAQA0KPiAtMzk2NSw2
ICs0MDY4LDcgQEAgaW50IHJ0MjgwMF9pbml0X2VlcHJvbShzdHJ1Y3QgcnQyeDAwX2Rldg0KPiAq
cnQyeDAwZGV2KQ0KPiAgICAgICAgY2FzZSBSRjMwNTI6DQo+ICAgICAgICBjYXNlIFJGMzMyMDoN
Cj4gICAgICAgIGNhc2UgUkY1MzcwOg0KPiArICAgICAgIGNhc2UgUkY1MzcyOg0KPiAgICAgICAg
Y2FzZSBSRjUzOTA6DQo+ICAgICAgICAgICAgICAgIGJyZWFrOw0KPiAgICAgICAgZGVmYXVsdDoN
Cj4gQEAgLTQyNzEsNiArNDM3NSw3IEBAIGludCBydDI4MDBfcHJvYmVfaHdfbW9kZShzdHJ1Y3Qg
cnQyeDAwX2Rldg0KPiAqcnQyeDAwZGV2KQ0KPiAgICAgICAgICAgICAgICAgICBydDJ4MDBfcmYo
cnQyeDAwZGV2LCBSRjMwMjIpIHx8DQo+ICAgICAgICAgICAgICAgICAgIHJ0MngwMF9yZihydDJ4
MDBkZXYsIFJGMzMyMCkgfHwNCj4gICAgICAgICAgICAgICAgICAgcnQyeDAwX3JmKHJ0MngwMGRl
diwgUkY1MzcwKSB8fA0KPiArICAgICAgICAgICAgICAgICAgcnQyeDAwX3JmKHJ0MngwMGRldiwg
UkY1MzcyKSB8fA0KPiAgICAgICAgICAgICAgICAgICBydDJ4MDBfcmYocnQyeDAwZGV2LCBSRjUz
OTApKSB7DQo+ICAgICAgICAgICAgICAgIHNwZWMtPm51bV9jaGFubmVscyA9IDE0Ow0KPiAgICAg
ICAgICAgICAgICBzcGVjLT5jaGFubmVscyA9IHJmX3ZhbHNfM3g7IGRpZmYgLS1naXQNCj4gYS9k
cml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwcGNpLmMNCj4gYi9kcml2ZXJzL25ldC93
aXJlbGVzcy9ydDJ4MDAvcnQyODAwcGNpLmMNCj4gaW5kZXggODM3YjQ2MC4uYmYwZjgzYyAxMDA2
NDQNCj4gLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMHBjaS5jDQo+ICsr
KyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDBwY2kuYw0KPiBAQCAtNDgwLDcg
KzQ4MCw4IEBAIHN0YXRpYyBpbnQgcnQyODAwcGNpX2luaXRfcmVnaXN0ZXJzKHN0cnVjdA0KPiBy
dDJ4MDBfZGV2ICpydDJ4MDBkZXYpDQo+DQo+ICAgICAgICBpZiAocnQyeDAwX2lzX3BjaWUocnQy
eDAwZGV2KSAmJg0KPiAgICAgICAgICAgIChydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDM1NzIpIHx8
DQo+IC0gICAgICAgICAgICBydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTApKSkgew0KPiArICAg
ICAgICAgICAgcnQyeDAwX3J0KHJ0MngwMGRldiwgUlQ1MzkwKSB8fA0KPiArICAgICAgICAgICAg
cnQyeDAwX3J0KHJ0MngwMGRldiwgUlQ1MzkyKSkpIHsNCj4gICAgICAgICAgICAgICAgcnQyeDAw
cGNpX3JlZ2lzdGVyX3JlYWQocnQyeDAwZGV2LCBBVVhfQ1RSTCwgJnJlZyk7DQo+ICAgICAgICAg
ICAgICAgIHJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBBVVhfQ1RSTF9GT1JDRV9QQ0lFX0NMSywg
MSk7DQo+ICAgICAgICAgICAgICAgIHJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBBVVhfQ1RSTF9X
QUtFX1BDSUVfRU4sIDEpOw0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQy
eDAwL3J0MjgwMHVzYi5jDQo+IGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMHVz
Yi5jDQo+IGluZGV4IDdmMjEwMDUuLjY1NjUxMTMgMTAwNjQ0DQo+IC0tLSBhL2RyaXZlcnMvbmV0
L3dpcmVsZXNzL3J0MngwMC9ydDI4MDB1c2IuYw0KPiArKysgYi9kcml2ZXJzL25ldC93aXJlbGVz
cy9ydDJ4MDAvcnQyODAwdXNiLmMNCj4gQEAgLTExMDEsMTIgKzExMDEsMjYgQEAgc3RhdGljIHN0
cnVjdCB1c2JfZGV2aWNlX2lkDQo+IHJ0MjgwMHVzYl9kZXZpY2VfdGFibGVbXSA9IHsNCj4gICAg
ICAgIHsgVVNCX0RFVklDRSgweDVhNTcsIDB4MDI4NCkgfSwNCj4gICNlbmRpZg0KPiAgI2lmZGVm
IENPTkZJR19SVDI4MDBVU0JfUlQ1M1hYDQo+ICsgICAgICAgLyogQWxwaGEgKi8NCj4gKyAgICAg
ICB7IFVTQl9ERVZJQ0UoMHgyMDAxLCAweDNjMTUpIH0sDQo+ICsgICAgICAgeyBVU0JfREVWSUNF
KDB4MjAwMSwgMHgzYzE5KSB9LA0KPiArICAgICAgIC8qIEFyY2FkeWFuICovDQo+ICsgICAgICAg
eyBVU0JfREVWSUNFKDB4MDQzZSwgMHg3YTEyKSB9LA0KPiAgICAgICAgLyogQXp1cmV3YXZlICov
DQo+ICAgICAgICB7IFVTQl9ERVZJQ0UoMHgxM2QzLCAweDMzMjkpIH0sDQo+ICAgICAgICB7IFVT
Ql9ERVZJQ0UoMHgxM2QzLCAweDMzNjUpIH0sDQo+ICsgICAgICAgLyogTEcgaW5ub3RlayAqLw0K
PiArICAgICAgIHsgVVNCX0RFVklDRSgweDA0M2UsIDB4N2EyMikgfSwNCj4gKyAgICAgICAvKiBQ
YW5hc29uaWMgKi8NCj4gKyAgICAgICB7IFVTQl9ERVZJQ0UoMHgwNGRhLCAweDE4MDEpIH0sDQo+
ICsgICAgICAgeyBVU0JfREVWSUNFKDB4MDRkYSwgMHgxODAwKSB9LA0KPiArICAgICAgIC8qIFBo
aWxpcHMgKi8NCj4gKyAgICAgICB7IFVTQl9ERVZJQ0UoMHgwNDcxLCAweDIxMDQpIH0sDQo+ICAg
ICAgICAvKiBSYWxpbmsgKi8NCj4gICAgICAgIHsgVVNCX0RFVklDRSgweDE0OGYsIDB4NTM3MCkg
fSwNCj4gICAgICAgIHsgVVNCX0RFVklDRSgweDE0OGYsIDB4NTM3MikgfSwNCj4gKyAgICAgICAv
KiBVbmtub3duICovDQo+ICsgICAgICAgeyBVU0JfREVWSUNFKDB4MDRkYSwgMHgyM2Y2KSB9LA0K
PiAgI2VuZGlmDQo+ICAjaWZkZWYgQ09ORklHX1JUMjgwMFVTQl9VTktOT1dODQo+ICAgICAgICAv
Kg0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMC5oDQo+
IGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMC5oDQo+IGluZGV4IGIwM2IyMmMu
LmJmNzQzY2QgMTAwNjQ0DQo+IC0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4
MDAuaA0KPiArKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwLmgNCj4gQEAg
LTE5Miw2ICsxOTIsNyBAQCBzdHJ1Y3QgcnQyeDAwX2NoaXAgew0KPiAgI2RlZmluZSBSVDM1OTMg
ICAgICAgICAweDM1OTMNCj4gICNkZWZpbmUgUlQzODgzICAgICAgICAgMHgzODgzICAvKiBXU09D
ICovDQo+ICAjZGVmaW5lIFJUNTM5MCAgICAgICAgIDB4NTM5MCAgLyogMi40R0h6ICovDQo+ICsj
ZGVmaW5lIFJUNTM5MiAgICAgICAgIDB4NTM5MiAgLyogMi40R0h6ICovDQo+DQo+ICAgICAgICB1
MTYgcmY7DQo+ICAgICAgICB1MTYgcmV2Ow0KPiAtLQ0KPiAxLjcuNi41DQo+DQo+IC0tDQo+IFRv
IHVuc3Vic2NyaWJlIGZyb20gdGhpcyBsaXN0OiBzZW5kIHRoZSBsaW5lICJ1bnN1YnNjcmliZQ0K
PiBsaW51eC13aXJlbGVzcyIgaW4gdGhlIGJvZHkgb2YgYSBtZXNzYWdlIHRvIG1ham9yZG9tb0B2
Z2VyLmtlcm5lbC5vcmcNCj4gTW9yZSBtYWpvcmRvbW8gaW5mbyBhdCAgaHR0cDovL3ZnZXIua2Vy
bmVsLm9yZy9tYWpvcmRvbW8taW5mby5odG1sDQoKKioqKioqKioqKioqKiBFbWFpbCBDb25maWRl
bnRpYWxpdHkgTm90aWNlICoqKioqKioqKioqKioqKioqKioqDQpUaGUgaW5mb3JtYXRpb24gY29u
dGFpbmVkIGluIHRoaXMgZS1tYWlsIG1lc3NhZ2UgKGluY2x1ZGluZyBhbnkgDQphdHRhY2htZW50
cykgbWF5IGJlIGNvbmZpZGVudGlhbCwgcHJvcHJpZXRhcnksIHByaXZpbGVnZWQsIG9yIG90aGVy
d2lzZQ0KZXhlbXB0IGZyb20gZGlzY2xvc3VyZSB1bmRlciBhcHBsaWNhYmxlIGxhd3MuIEl0IGlz
IGludGVuZGVkIHRvIGJlIA0KY29udmV5ZWQgb25seSB0byB0aGUgZGVzaWduYXRlZCByZWNpcGll
bnQocykuIEFueSB1c2UsIGRpc3NlbWluYXRpb24sIA0KZGlzdHJpYnV0aW9uLCBwcmludGluZywg
cmV0YWluaW5nIG9yIGNvcHlpbmcgb2YgdGhpcyBlLW1haWwgKGluY2x1ZGluZyBpdHMgDQphdHRh
Y2htZW50cykgYnkgdW5pbnRlbmRlZCByZWNpcGllbnQocykgaXMgc3RyaWN0bHkgcHJvaGliaXRl
ZCBhbmQgbWF5IA0KYmUgdW5sYXdmdWwuIElmIHlvdSBhcmUgbm90IGFuIGludGVuZGVkIHJlY2lw
aWVudCBvZiB0aGlzIGUtbWFpbCwgb3IgYmVsaWV2ZSANCnRoYXQgeW91IGhhdmUgcmVjZWl2ZWQg
dGhpcyBlLW1haWwgaW4gZXJyb3IsIHBsZWFzZSBub3RpZnkgdGhlIHNlbmRlciANCmltbWVkaWF0
ZWx5IChieSByZXBseWluZyB0byB0aGlzIGUtbWFpbCksIGRlbGV0ZSBhbnkgYW5kIGFsbCBjb3Bp
ZXMgb2YgDQp0aGlzIGUtbWFpbCAoaW5jbHVkaW5nIGFueSBhdHRhY2htZW50cykgZnJvbSB5b3Vy
IHN5c3RlbSwgYW5kIGRvIG5vdA0KZGlzY2xvc2UgdGhlIGNvbnRlbnQgb2YgdGhpcyBlLW1haWwg
dG8gYW55IG90aGVyIHBlcnNvbi4gVGhhbmsgeW91IQ==


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] rt2x00:Add RT5372 chipset support
  2012-02-17  9:33 John Li
  2012-02-17 13:06 ` Gertjan van Wingerde
@ 2012-02-18 12:24 ` Ivo Van Doorn
  2012-02-20  6:13   ` Chen-Yang Li (黎振陽)
  1 sibling, 1 reply; 10+ messages in thread
From: Ivo Van Doorn @ 2012-02-18 12:24 UTC (permalink / raw)
  To: John Li; +Cc: users, linux-wireless, John Linville, John Li

2012/2/17 John Li <john.li.mediatek@gmail.com>:
> From: John Li <chen-yang.li@mediatek.com>
>
> Signed-off-by: John Li <chen-yang.li@mediatek.com>

Acked-by: Ivo van Doorn <IvDoorn@gmail.com>

> ---
>  drivers/net/wireless/rt2x00/rt2800.h    |    1 +
>  drivers/net/wireless/rt2x00/rt2800lib.c |  153 ++++++++++++++++++++++++++-----
>  drivers/net/wireless/rt2x00/rt2800pci.c |    3 +-
>  drivers/net/wireless/rt2x00/rt2800usb.c |   14 +++
>  drivers/net/wireless/rt2x00/rt2x00.h    |    1 +
>  5 files changed, 147 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/net/wireless/rt2x00/rt2800.h b/drivers/net/wireless/rt2x00/rt2800.h
> index 2571a2f..56b78c8 100644
> --- a/drivers/net/wireless/rt2x00/rt2800.h
> +++ b/drivers/net/wireless/rt2x00/rt2800.h
> @@ -68,6 +68,7 @@
>  #define RF3322                         0x000c
>  #define RF3053                         0x000d
>  #define RF5370                         0x5370
> +#define RF5372                         0x5372
>  #define RF5390                         0x5390
>
>  /*
> diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
> index 22a1a8f..90d7a36 100644
> --- a/drivers/net/wireless/rt2x00/rt2800lib.c
> +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
> @@ -402,7 +402,8 @@ int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
>
>        if (rt2x00_is_pci(rt2x00dev)) {
>                if (rt2x00_rt(rt2x00dev, RT3572) ||
> -                   rt2x00_rt(rt2x00dev, RT5390)) {
> +                   rt2x00_rt(rt2x00dev, RT5390) ||
> +                   rt2x00_rt(rt2x00dev, RT5392)) {
>                        rt2800_register_read(rt2x00dev, AUX_CTRL, &reg);
>                        rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1);
>                        rt2x00_set_field32(&reg, AUX_CTRL_WAKE_PCIE_EN, 1);
> @@ -1906,7 +1907,8 @@ static void rt2800_config_channel_rf53xx(struct rt2x00_dev *rt2x00dev,
>                                                   r55_nonbt_rev[idx]);
>                                rt2800_rfcsr_write(rt2x00dev, 59,
>                                                   r59_nonbt_rev[idx]);
> -                       } else if (rt2x00_rt(rt2x00dev, RT5390)) {
> +                       } else if (rt2x00_rt(rt2x00dev, RT5390) ||
> +                                          rt2x00_rt(rt2x00dev, RT5392)) {
>                                static const char r59_non_bt[] = {0x8f, 0x8f,
>                                        0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8d,
>                                        0x8a, 0x88, 0x88, 0x87, 0x87, 0x86};
> @@ -1956,6 +1958,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
>                rt2800_config_channel_rf3052(rt2x00dev, conf, rf, info);
>                break;
>        case RF5370:
> +       case RF5372:
>        case RF5390:
>                rt2800_config_channel_rf53xx(rt2x00dev, conf, rf, info);
>                break;
> @@ -1972,7 +1975,8 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
>        rt2800_bbp_write(rt2x00dev, 86, 0);
>
>        if (rf->channel <= 14) {
> -               if (!rt2x00_rt(rt2x00dev, RT5390)) {
> +               if (!rt2x00_rt(rt2x00dev, RT5390) &&
> +                       !rt2x00_rt(rt2x00dev, RT5392)) {
>                        if (test_bit(CAPABILITY_EXTERNAL_LNA_BG,
>                                     &rt2x00dev->cap_flags)) {
>                                rt2800_bbp_write(rt2x00dev, 82, 0x62);
> @@ -2502,7 +2506,8 @@ static u8 rt2800_get_default_vgc(struct rt2x00_dev *rt2x00dev)
>                    rt2x00_rt(rt2x00dev, RT3071) ||
>                    rt2x00_rt(rt2x00dev, RT3090) ||
>                    rt2x00_rt(rt2x00dev, RT3390) ||
> -                   rt2x00_rt(rt2x00dev, RT5390))
> +                   rt2x00_rt(rt2x00dev, RT5390) ||
> +                   rt2x00_rt(rt2x00dev, RT5392))
>                        return 0x1c + (2 * rt2x00dev->lna_gain);
>                else
>                        return 0x2e + rt2x00dev->lna_gain;
> @@ -2637,7 +2642,8 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
>        } else if (rt2x00_rt(rt2x00dev, RT3572)) {
>                rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400);
>                rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
> -       } else if (rt2x00_rt(rt2x00dev, RT5390)) {
> +       } else if (rt2x00_rt(rt2x00dev, RT5390) ||
> +                          rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
>                rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
>                rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
> @@ -3013,7 +3019,8 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
>                     rt2800_wait_bbp_ready(rt2x00dev)))
>                return -EACCES;
>
> -       if (rt2x00_rt(rt2x00dev, RT5390)) {
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_bbp_read(rt2x00dev, 4, &value);
>                rt2x00_set_field8(&value, BBP4_MAC_IF_CTRL, 1);
>                rt2800_bbp_write(rt2x00dev, 4, value);
> @@ -3021,19 +3028,22 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
>
>        if (rt2800_is_305x_soc(rt2x00dev) ||
>            rt2x00_rt(rt2x00dev, RT3572) ||
> -           rt2x00_rt(rt2x00dev, RT5390))
> +           rt2x00_rt(rt2x00dev, RT5390) ||
> +           rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 31, 0x08);
>
>        rt2800_bbp_write(rt2x00dev, 65, 0x2c);
>        rt2800_bbp_write(rt2x00dev, 66, 0x38);
>
> -       if (rt2x00_rt(rt2x00dev, RT5390))
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 68, 0x0b);
>
>        if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860C)) {
>                rt2800_bbp_write(rt2x00dev, 69, 0x16);
>                rt2800_bbp_write(rt2x00dev, 73, 0x12);
> -       } else if (rt2x00_rt(rt2x00dev, RT5390)) {
> +       } else if (rt2x00_rt(rt2x00dev, RT5390) ||
> +                          rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_bbp_write(rt2x00dev, 69, 0x12);
>                rt2800_bbp_write(rt2x00dev, 73, 0x13);
>                rt2800_bbp_write(rt2x00dev, 75, 0x46);
> @@ -3051,7 +3061,8 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
>            rt2x00_rt(rt2x00dev, RT3090) ||
>            rt2x00_rt(rt2x00dev, RT3390) ||
>            rt2x00_rt(rt2x00dev, RT3572) ||
> -           rt2x00_rt(rt2x00dev, RT5390)) {
> +           rt2x00_rt(rt2x00dev, RT5390) ||
> +           rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_bbp_write(rt2x00dev, 79, 0x13);
>                rt2800_bbp_write(rt2x00dev, 80, 0x05);
>                rt2800_bbp_write(rt2x00dev, 81, 0x33);
> @@ -3063,64 +3074,88 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
>        }
>
>        rt2800_bbp_write(rt2x00dev, 82, 0x62);
> -       if (rt2x00_rt(rt2x00dev, RT5390))
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 83, 0x7a);
>        else
>                rt2800_bbp_write(rt2x00dev, 83, 0x6a);
>
>        if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860D))
>                rt2800_bbp_write(rt2x00dev, 84, 0x19);
> -       else if (rt2x00_rt(rt2x00dev, RT5390))
> +       else if (rt2x00_rt(rt2x00dev, RT5390) ||
> +                        rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 84, 0x9a);
>        else
>                rt2800_bbp_write(rt2x00dev, 84, 0x99);
>
> -       if (rt2x00_rt(rt2x00dev, RT5390))
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 86, 0x38);
>        else
>                rt2800_bbp_write(rt2x00dev, 86, 0x00);
>
> +       if (rt2x00_rt(rt2x00dev, RT5392))
> +               rt2800_bbp_write(rt2x00dev, 88, 0x90);
> +
>        rt2800_bbp_write(rt2x00dev, 91, 0x04);
>
> -       if (rt2x00_rt(rt2x00dev, RT5390))
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 92, 0x02);
>        else
>                rt2800_bbp_write(rt2x00dev, 92, 0x00);
>
> +       if (rt2x00_rt(rt2x00dev, RT5392)) {
> +               rt2800_bbp_write(rt2x00dev, 95, 0x9a);
> +               rt2800_bbp_write(rt2x00dev, 98, 0x12);
> +       }
> +
>        if (rt2x00_rt_rev_gte(rt2x00dev, RT3070, REV_RT3070F) ||
>            rt2x00_rt_rev_gte(rt2x00dev, RT3071, REV_RT3071E) ||
>            rt2x00_rt_rev_gte(rt2x00dev, RT3090, REV_RT3090E) ||
>            rt2x00_rt_rev_gte(rt2x00dev, RT3390, REV_RT3390E) ||
>            rt2x00_rt(rt2x00dev, RT3572) ||
>            rt2x00_rt(rt2x00dev, RT5390) ||
> +           rt2x00_rt(rt2x00dev, RT5392) ||
>            rt2800_is_305x_soc(rt2x00dev))
>                rt2800_bbp_write(rt2x00dev, 103, 0xc0);
>        else
>                rt2800_bbp_write(rt2x00dev, 103, 0x00);
>
> -       if (rt2x00_rt(rt2x00dev, RT5390))
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 104, 0x92);
>
>        if (rt2800_is_305x_soc(rt2x00dev))
>                rt2800_bbp_write(rt2x00dev, 105, 0x01);
> -       else if (rt2x00_rt(rt2x00dev, RT5390))
> +       else if (rt2x00_rt(rt2x00dev, RT5390) ||
> +                        rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 105, 0x3c);
>        else
>                rt2800_bbp_write(rt2x00dev, 105, 0x05);
>
>        if (rt2x00_rt(rt2x00dev, RT5390))
>                rt2800_bbp_write(rt2x00dev, 106, 0x03);
> +       else if (rt2x00_rt(rt2x00dev, RT5392))
> +               rt2800_bbp_write(rt2x00dev, 106, 0x12);
>        else
>                rt2800_bbp_write(rt2x00dev, 106, 0x35);
>
> -       if (rt2x00_rt(rt2x00dev, RT5390))
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 128, 0x12);
>
> +       if (rt2x00_rt(rt2x00dev, RT5392)) {
> +               rt2800_bbp_write(rt2x00dev, 134, 0xd0);
> +               rt2800_bbp_write(rt2x00dev, 135, 0xf6);
> +       }
> +
>        if (rt2x00_rt(rt2x00dev, RT3071) ||
>            rt2x00_rt(rt2x00dev, RT3090) ||
>            rt2x00_rt(rt2x00dev, RT3390) ||
>            rt2x00_rt(rt2x00dev, RT3572) ||
> -           rt2x00_rt(rt2x00dev, RT5390)) {
> +           rt2x00_rt(rt2x00dev, RT5390) ||
> +           rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_bbp_read(rt2x00dev, 138, &value);
>
>                rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &eeprom);
> @@ -3132,7 +3167,8 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
>                rt2800_bbp_write(rt2x00dev, 138, value);
>        }
>
> -       if (rt2x00_rt(rt2x00dev, RT5390)) {
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392)) {
>                int ant, div_mode;
>
>                rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom);
> @@ -3258,13 +3294,15 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
>            !rt2x00_rt(rt2x00dev, RT3390) &&
>            !rt2x00_rt(rt2x00dev, RT3572) &&
>            !rt2x00_rt(rt2x00dev, RT5390) &&
> +           !rt2x00_rt(rt2x00dev, RT5392) &&
>            !rt2800_is_305x_soc(rt2x00dev))
>                return 0;
>
>        /*
>         * Init RF calibration.
>         */
> -       if (rt2x00_rt(rt2x00dev, RT5390)) {
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_rfcsr_read(rt2x00dev, 2, &rfcsr);
>                rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 1);
>                rt2800_rfcsr_write(rt2x00dev, 2, rfcsr);
> @@ -3482,6 +3520,66 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
>                        rt2800_rfcsr_write(rt2x00dev, 61, 0xdd);
>                rt2800_rfcsr_write(rt2x00dev, 62, 0x00);
>                rt2800_rfcsr_write(rt2x00dev, 63, 0x00);
> +       }       else if (rt2x00_rt(rt2x00dev, RT5392)) {
> +                       rt2800_rfcsr_write(rt2x00dev, 1, 0x17);
> +                       rt2800_rfcsr_write(rt2x00dev, 2, 0x80);
> +                       rt2800_rfcsr_write(rt2x00dev, 3, 0x88);
> +                       rt2800_rfcsr_write(rt2x00dev, 5, 0x10);
> +                       rt2800_rfcsr_write(rt2x00dev, 6, 0xe0);
> +                       rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 10, 0x53);
> +                       rt2800_rfcsr_write(rt2x00dev, 11, 0x4a);
> +                       rt2800_rfcsr_write(rt2x00dev, 12, 0x46);
> +                       rt2800_rfcsr_write(rt2x00dev, 13, 0x9f);
> +                       rt2800_rfcsr_write(rt2x00dev, 14, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 15, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 16, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 18, 0x03);
> +                       rt2800_rfcsr_write(rt2x00dev, 19, 0x4d);
> +                       rt2800_rfcsr_write(rt2x00dev, 20, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 21, 0x8d);
> +                       rt2800_rfcsr_write(rt2x00dev, 22, 0x20);
> +                       rt2800_rfcsr_write(rt2x00dev, 23, 0x0b);
> +                       rt2800_rfcsr_write(rt2x00dev, 24, 0x44);
> +                       rt2800_rfcsr_write(rt2x00dev, 25, 0x80);
> +                       rt2800_rfcsr_write(rt2x00dev, 26, 0x82);
> +                       rt2800_rfcsr_write(rt2x00dev, 27, 0x09);
> +                       rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 29, 0x10);
> +                       rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
> +                       rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
> +                       rt2800_rfcsr_write(rt2x00dev, 32, 0x20);
> +                       rt2800_rfcsr_write(rt2x00dev, 33, 0xC0);
> +                       rt2800_rfcsr_write(rt2x00dev, 34, 0x07);
> +                       rt2800_rfcsr_write(rt2x00dev, 35, 0x12);
> +                       rt2800_rfcsr_write(rt2x00dev, 36, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 37, 0x08);
> +                       rt2800_rfcsr_write(rt2x00dev, 38, 0x89);
> +                       rt2800_rfcsr_write(rt2x00dev, 39, 0x1b);
> +                       rt2800_rfcsr_write(rt2x00dev, 40, 0x0f);
> +                       rt2800_rfcsr_write(rt2x00dev, 41, 0xbb);
> +                       rt2800_rfcsr_write(rt2x00dev, 42, 0xd5);
> +                       rt2800_rfcsr_write(rt2x00dev, 43, 0x9b);
> +                       rt2800_rfcsr_write(rt2x00dev, 44, 0x0e);
> +                       rt2800_rfcsr_write(rt2x00dev, 45, 0xa2);
> +                       rt2800_rfcsr_write(rt2x00dev, 46, 0x73);
> +                       rt2800_rfcsr_write(rt2x00dev, 47, 0x0c);
> +                       rt2800_rfcsr_write(rt2x00dev, 48, 0x10);
> +                       rt2800_rfcsr_write(rt2x00dev, 49, 0x94);
> +                       rt2800_rfcsr_write(rt2x00dev, 50, 0x94);
> +                       rt2800_rfcsr_write(rt2x00dev, 51, 0x3a);
> +                       rt2800_rfcsr_write(rt2x00dev, 52, 0x48);
> +                       rt2800_rfcsr_write(rt2x00dev, 53, 0x44);
> +                       rt2800_rfcsr_write(rt2x00dev, 54, 0x38);
> +                       rt2800_rfcsr_write(rt2x00dev, 55, 0x43);
> +                       rt2800_rfcsr_write(rt2x00dev, 56, 0xa1);
> +                       rt2800_rfcsr_write(rt2x00dev, 57, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 58, 0x39);
> +                       rt2800_rfcsr_write(rt2x00dev, 59, 0x07);
> +                       rt2800_rfcsr_write(rt2x00dev, 60, 0x45);
> +                       rt2800_rfcsr_write(rt2x00dev, 61, 0x91);
> +                       rt2800_rfcsr_write(rt2x00dev, 62, 0x39);
> +                       rt2800_rfcsr_write(rt2x00dev, 63, 0x07);
>        }
>
>        if (rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070F)) {
> @@ -3549,7 +3647,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
>                        rt2800_init_rx_filter(rt2x00dev, true, 0x27, 0x15);
>        }
>
> -       if (!rt2x00_rt(rt2x00dev, RT5390)) {
> +       if (!rt2x00_rt(rt2x00dev, RT5390) &&
> +               !rt2x00_rt(rt2x00dev, RT5392)) {
>                /*
>                 * Set back to initial state
>                 */
> @@ -3577,7 +3676,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
>        rt2x00_set_field32(&reg, OPT_14_CSR_BIT0, 1);
>        rt2800_register_write(rt2x00dev, OPT_14_CSR, reg);
>
> -       if (!rt2x00_rt(rt2x00dev, RT5390)) {
> +       if (!rt2x00_rt(rt2x00dev, RT5390) &&
> +               !rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_rfcsr_read(rt2x00dev, 17, &rfcsr);
>                rt2x00_set_field8(&rfcsr, RFCSR17_TX_LO1_EN, 0);
>                if (rt2x00_rt(rt2x00dev, RT3070) ||
> @@ -3645,7 +3745,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
>                rt2800_rfcsr_write(rt2x00dev, 27, rfcsr);
>        }
>
> -       if (rt2x00_rt(rt2x00dev, RT5390)) {
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_rfcsr_read(rt2x00dev, 38, &rfcsr);
>                rt2x00_set_field8(&rfcsr, RFCSR38_RX_LO1_EN, 0);
>                rt2800_rfcsr_write(rt2x00dev, 38, rfcsr);
> @@ -3929,7 +4030,8 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
>         * RT53xx: defined in "EEPROM_CHIP_ID" field
>         */
>        rt2800_register_read(rt2x00dev, MAC_CSR0, &reg);
> -       if (rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5390)
> +       if (rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5390 ||
> +               rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5392)
>                rt2x00_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &value);
>        else
>                value = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);
> @@ -3947,6 +4049,7 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
>        case RT3390:
>        case RT3572:
>        case RT5390:
> +       case RT5392:
>                break;
>        default:
>                ERROR(rt2x00dev, "Invalid RT chipset detected.\n");
> @@ -3965,6 +4068,7 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
>        case RF3052:
>        case RF3320:
>        case RF5370:
> +       case RF5372:
>        case RF5390:
>                break;
>        default:
> @@ -4271,6 +4375,7 @@ int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
>                   rt2x00_rf(rt2x00dev, RF3022) ||
>                   rt2x00_rf(rt2x00dev, RF3320) ||
>                   rt2x00_rf(rt2x00dev, RF5370) ||
> +                  rt2x00_rf(rt2x00dev, RF5372) ||
>                   rt2x00_rf(rt2x00dev, RF5390)) {
>                spec->num_channels = 14;
>                spec->channels = rf_vals_3x;
> diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c
> index 837b460..bf0f83c 100644
> --- a/drivers/net/wireless/rt2x00/rt2800pci.c
> +++ b/drivers/net/wireless/rt2x00/rt2800pci.c
> @@ -480,7 +480,8 @@ static int rt2800pci_init_registers(struct rt2x00_dev *rt2x00dev)
>
>        if (rt2x00_is_pcie(rt2x00dev) &&
>            (rt2x00_rt(rt2x00dev, RT3572) ||
> -            rt2x00_rt(rt2x00dev, RT5390))) {
> +            rt2x00_rt(rt2x00dev, RT5390) ||
> +            rt2x00_rt(rt2x00dev, RT5392))) {
>                rt2x00pci_register_read(rt2x00dev, AUX_CTRL, &reg);
>                rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1);
>                rt2x00_set_field32(&reg, AUX_CTRL_WAKE_PCIE_EN, 1);
> diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c
> index 7f21005..6565113 100644
> --- a/drivers/net/wireless/rt2x00/rt2800usb.c
> +++ b/drivers/net/wireless/rt2x00/rt2800usb.c
> @@ -1101,12 +1101,26 @@ static struct usb_device_id rt2800usb_device_table[] = {
>        { USB_DEVICE(0x5a57, 0x0284) },
>  #endif
>  #ifdef CONFIG_RT2800USB_RT53XX
> +       /* Alpha */
> +       { USB_DEVICE(0x2001, 0x3c15) },
> +       { USB_DEVICE(0x2001, 0x3c19) },
> +       /* Arcadyan */
> +       { USB_DEVICE(0x043e, 0x7a12) },
>        /* Azurewave */
>        { USB_DEVICE(0x13d3, 0x3329) },
>        { USB_DEVICE(0x13d3, 0x3365) },
> +       /* LG innotek */
> +       { USB_DEVICE(0x043e, 0x7a22) },
> +       /* Panasonic */
> +       { USB_DEVICE(0x04da, 0x1801) },
> +       { USB_DEVICE(0x04da, 0x1800) },
> +       /* Philips */
> +       { USB_DEVICE(0x0471, 0x2104) },
>        /* Ralink */
>        { USB_DEVICE(0x148f, 0x5370) },
>        { USB_DEVICE(0x148f, 0x5372) },
> +       /* Unknown */
> +       { USB_DEVICE(0x04da, 0x23f6) },
>  #endif
>  #ifdef CONFIG_RT2800USB_UNKNOWN
>        /*
> diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
> index b03b22c..bf743cd 100644
> --- a/drivers/net/wireless/rt2x00/rt2x00.h
> +++ b/drivers/net/wireless/rt2x00/rt2x00.h
> @@ -192,6 +192,7 @@ struct rt2x00_chip {
>  #define RT3593         0x3593
>  #define RT3883         0x3883  /* WSOC */
>  #define RT5390         0x5390  /* 2.4GHz */
> +#define RT5392         0x5392  /* 2.4GHz */
>
>        u16 rf;
>        u16 rev;
> --
> 1.7.6.5
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] rt2x00:Add RT5372 chipset support
  2012-02-17  9:33 John Li
@ 2012-02-17 13:06 ` Gertjan van Wingerde
  2012-02-18 12:24 ` Ivo Van Doorn
  1 sibling, 0 replies; 10+ messages in thread
From: Gertjan van Wingerde @ 2012-02-17 13:06 UTC (permalink / raw)
  To: John Li; +Cc: users, linux-wireless, John Linville, John Li

2012/2/17 John Li <john.li.mediatek@gmail.com>:
> From: John Li <chen-yang.li@mediatek.com>
>
> Signed-off-by: John Li <chen-yang.li@mediatek.com>

Thanks to Marc Dietrich for spotting my oversight in the reviewing.
Anyway, this updated patch still is:

Acked-by: Gertjan van Wingerde <gwingerde@gmail.com>

> ---
>  drivers/net/wireless/rt2x00/rt2800.h    |    1 +
>  drivers/net/wireless/rt2x00/rt2800lib.c |  153 ++++++++++++++++++++++++++-----
>  drivers/net/wireless/rt2x00/rt2800pci.c |    3 +-
>  drivers/net/wireless/rt2x00/rt2800usb.c |   14 +++
>  drivers/net/wireless/rt2x00/rt2x00.h    |    1 +
>  5 files changed, 147 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/net/wireless/rt2x00/rt2800.h b/drivers/net/wireless/rt2x00/rt2800.h
> index 2571a2f..56b78c8 100644
> --- a/drivers/net/wireless/rt2x00/rt2800.h
> +++ b/drivers/net/wireless/rt2x00/rt2800.h
> @@ -68,6 +68,7 @@
>  #define RF3322                         0x000c
>  #define RF3053                         0x000d
>  #define RF5370                         0x5370
> +#define RF5372                         0x5372
>  #define RF5390                         0x5390
>
>  /*
> diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
> index 22a1a8f..90d7a36 100644
> --- a/drivers/net/wireless/rt2x00/rt2800lib.c
> +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
> @@ -402,7 +402,8 @@ int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
>
>        if (rt2x00_is_pci(rt2x00dev)) {
>                if (rt2x00_rt(rt2x00dev, RT3572) ||
> -                   rt2x00_rt(rt2x00dev, RT5390)) {
> +                   rt2x00_rt(rt2x00dev, RT5390) ||
> +                   rt2x00_rt(rt2x00dev, RT5392)) {
>                        rt2800_register_read(rt2x00dev, AUX_CTRL, &reg);
>                        rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1);
>                        rt2x00_set_field32(&reg, AUX_CTRL_WAKE_PCIE_EN, 1);
> @@ -1906,7 +1907,8 @@ static void rt2800_config_channel_rf53xx(struct rt2x00_dev *rt2x00dev,
>                                                   r55_nonbt_rev[idx]);
>                                rt2800_rfcsr_write(rt2x00dev, 59,
>                                                   r59_nonbt_rev[idx]);
> -                       } else if (rt2x00_rt(rt2x00dev, RT5390)) {
> +                       } else if (rt2x00_rt(rt2x00dev, RT5390) ||
> +                                          rt2x00_rt(rt2x00dev, RT5392)) {
>                                static const char r59_non_bt[] = {0x8f, 0x8f,
>                                        0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8d,
>                                        0x8a, 0x88, 0x88, 0x87, 0x87, 0x86};
> @@ -1956,6 +1958,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
>                rt2800_config_channel_rf3052(rt2x00dev, conf, rf, info);
>                break;
>        case RF5370:
> +       case RF5372:
>        case RF5390:
>                rt2800_config_channel_rf53xx(rt2x00dev, conf, rf, info);
>                break;
> @@ -1972,7 +1975,8 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
>        rt2800_bbp_write(rt2x00dev, 86, 0);
>
>        if (rf->channel <= 14) {
> -               if (!rt2x00_rt(rt2x00dev, RT5390)) {
> +               if (!rt2x00_rt(rt2x00dev, RT5390) &&
> +                       !rt2x00_rt(rt2x00dev, RT5392)) {
>                        if (test_bit(CAPABILITY_EXTERNAL_LNA_BG,
>                                     &rt2x00dev->cap_flags)) {
>                                rt2800_bbp_write(rt2x00dev, 82, 0x62);
> @@ -2502,7 +2506,8 @@ static u8 rt2800_get_default_vgc(struct rt2x00_dev *rt2x00dev)
>                    rt2x00_rt(rt2x00dev, RT3071) ||
>                    rt2x00_rt(rt2x00dev, RT3090) ||
>                    rt2x00_rt(rt2x00dev, RT3390) ||
> -                   rt2x00_rt(rt2x00dev, RT5390))
> +                   rt2x00_rt(rt2x00dev, RT5390) ||
> +                   rt2x00_rt(rt2x00dev, RT5392))
>                        return 0x1c + (2 * rt2x00dev->lna_gain);
>                else
>                        return 0x2e + rt2x00dev->lna_gain;
> @@ -2637,7 +2642,8 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
>        } else if (rt2x00_rt(rt2x00dev, RT3572)) {
>                rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400);
>                rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
> -       } else if (rt2x00_rt(rt2x00dev, RT5390)) {
> +       } else if (rt2x00_rt(rt2x00dev, RT5390) ||
> +                          rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
>                rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
>                rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
> @@ -3013,7 +3019,8 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
>                     rt2800_wait_bbp_ready(rt2x00dev)))
>                return -EACCES;
>
> -       if (rt2x00_rt(rt2x00dev, RT5390)) {
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_bbp_read(rt2x00dev, 4, &value);
>                rt2x00_set_field8(&value, BBP4_MAC_IF_CTRL, 1);
>                rt2800_bbp_write(rt2x00dev, 4, value);
> @@ -3021,19 +3028,22 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
>
>        if (rt2800_is_305x_soc(rt2x00dev) ||
>            rt2x00_rt(rt2x00dev, RT3572) ||
> -           rt2x00_rt(rt2x00dev, RT5390))
> +           rt2x00_rt(rt2x00dev, RT5390) ||
> +           rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 31, 0x08);
>
>        rt2800_bbp_write(rt2x00dev, 65, 0x2c);
>        rt2800_bbp_write(rt2x00dev, 66, 0x38);
>
> -       if (rt2x00_rt(rt2x00dev, RT5390))
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 68, 0x0b);
>
>        if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860C)) {
>                rt2800_bbp_write(rt2x00dev, 69, 0x16);
>                rt2800_bbp_write(rt2x00dev, 73, 0x12);
> -       } else if (rt2x00_rt(rt2x00dev, RT5390)) {
> +       } else if (rt2x00_rt(rt2x00dev, RT5390) ||
> +                          rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_bbp_write(rt2x00dev, 69, 0x12);
>                rt2800_bbp_write(rt2x00dev, 73, 0x13);
>                rt2800_bbp_write(rt2x00dev, 75, 0x46);
> @@ -3051,7 +3061,8 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
>            rt2x00_rt(rt2x00dev, RT3090) ||
>            rt2x00_rt(rt2x00dev, RT3390) ||
>            rt2x00_rt(rt2x00dev, RT3572) ||
> -           rt2x00_rt(rt2x00dev, RT5390)) {
> +           rt2x00_rt(rt2x00dev, RT5390) ||
> +           rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_bbp_write(rt2x00dev, 79, 0x13);
>                rt2800_bbp_write(rt2x00dev, 80, 0x05);
>                rt2800_bbp_write(rt2x00dev, 81, 0x33);
> @@ -3063,64 +3074,88 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
>        }
>
>        rt2800_bbp_write(rt2x00dev, 82, 0x62);
> -       if (rt2x00_rt(rt2x00dev, RT5390))
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 83, 0x7a);
>        else
>                rt2800_bbp_write(rt2x00dev, 83, 0x6a);
>
>        if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860D))
>                rt2800_bbp_write(rt2x00dev, 84, 0x19);
> -       else if (rt2x00_rt(rt2x00dev, RT5390))
> +       else if (rt2x00_rt(rt2x00dev, RT5390) ||
> +                        rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 84, 0x9a);
>        else
>                rt2800_bbp_write(rt2x00dev, 84, 0x99);
>
> -       if (rt2x00_rt(rt2x00dev, RT5390))
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 86, 0x38);
>        else
>                rt2800_bbp_write(rt2x00dev, 86, 0x00);
>
> +       if (rt2x00_rt(rt2x00dev, RT5392))
> +               rt2800_bbp_write(rt2x00dev, 88, 0x90);
> +
>        rt2800_bbp_write(rt2x00dev, 91, 0x04);
>
> -       if (rt2x00_rt(rt2x00dev, RT5390))
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 92, 0x02);
>        else
>                rt2800_bbp_write(rt2x00dev, 92, 0x00);
>
> +       if (rt2x00_rt(rt2x00dev, RT5392)) {
> +               rt2800_bbp_write(rt2x00dev, 95, 0x9a);
> +               rt2800_bbp_write(rt2x00dev, 98, 0x12);
> +       }
> +
>        if (rt2x00_rt_rev_gte(rt2x00dev, RT3070, REV_RT3070F) ||
>            rt2x00_rt_rev_gte(rt2x00dev, RT3071, REV_RT3071E) ||
>            rt2x00_rt_rev_gte(rt2x00dev, RT3090, REV_RT3090E) ||
>            rt2x00_rt_rev_gte(rt2x00dev, RT3390, REV_RT3390E) ||
>            rt2x00_rt(rt2x00dev, RT3572) ||
>            rt2x00_rt(rt2x00dev, RT5390) ||
> +           rt2x00_rt(rt2x00dev, RT5392) ||
>            rt2800_is_305x_soc(rt2x00dev))
>                rt2800_bbp_write(rt2x00dev, 103, 0xc0);
>        else
>                rt2800_bbp_write(rt2x00dev, 103, 0x00);
>
> -       if (rt2x00_rt(rt2x00dev, RT5390))
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 104, 0x92);
>
>        if (rt2800_is_305x_soc(rt2x00dev))
>                rt2800_bbp_write(rt2x00dev, 105, 0x01);
> -       else if (rt2x00_rt(rt2x00dev, RT5390))
> +       else if (rt2x00_rt(rt2x00dev, RT5390) ||
> +                        rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 105, 0x3c);
>        else
>                rt2800_bbp_write(rt2x00dev, 105, 0x05);
>
>        if (rt2x00_rt(rt2x00dev, RT5390))
>                rt2800_bbp_write(rt2x00dev, 106, 0x03);
> +       else if (rt2x00_rt(rt2x00dev, RT5392))
> +               rt2800_bbp_write(rt2x00dev, 106, 0x12);
>        else
>                rt2800_bbp_write(rt2x00dev, 106, 0x35);
>
> -       if (rt2x00_rt(rt2x00dev, RT5390))
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 128, 0x12);
>
> +       if (rt2x00_rt(rt2x00dev, RT5392)) {
> +               rt2800_bbp_write(rt2x00dev, 134, 0xd0);
> +               rt2800_bbp_write(rt2x00dev, 135, 0xf6);
> +       }
> +
>        if (rt2x00_rt(rt2x00dev, RT3071) ||
>            rt2x00_rt(rt2x00dev, RT3090) ||
>            rt2x00_rt(rt2x00dev, RT3390) ||
>            rt2x00_rt(rt2x00dev, RT3572) ||
> -           rt2x00_rt(rt2x00dev, RT5390)) {
> +           rt2x00_rt(rt2x00dev, RT5390) ||
> +           rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_bbp_read(rt2x00dev, 138, &value);
>
>                rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &eeprom);
> @@ -3132,7 +3167,8 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
>                rt2800_bbp_write(rt2x00dev, 138, value);
>        }
>
> -       if (rt2x00_rt(rt2x00dev, RT5390)) {
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392)) {
>                int ant, div_mode;
>
>                rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom);
> @@ -3258,13 +3294,15 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
>            !rt2x00_rt(rt2x00dev, RT3390) &&
>            !rt2x00_rt(rt2x00dev, RT3572) &&
>            !rt2x00_rt(rt2x00dev, RT5390) &&
> +           !rt2x00_rt(rt2x00dev, RT5392) &&
>            !rt2800_is_305x_soc(rt2x00dev))
>                return 0;
>
>        /*
>         * Init RF calibration.
>         */
> -       if (rt2x00_rt(rt2x00dev, RT5390)) {
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_rfcsr_read(rt2x00dev, 2, &rfcsr);
>                rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 1);
>                rt2800_rfcsr_write(rt2x00dev, 2, rfcsr);
> @@ -3482,6 +3520,66 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
>                        rt2800_rfcsr_write(rt2x00dev, 61, 0xdd);
>                rt2800_rfcsr_write(rt2x00dev, 62, 0x00);
>                rt2800_rfcsr_write(rt2x00dev, 63, 0x00);
> +       }       else if (rt2x00_rt(rt2x00dev, RT5392)) {
> +                       rt2800_rfcsr_write(rt2x00dev, 1, 0x17);
> +                       rt2800_rfcsr_write(rt2x00dev, 2, 0x80);
> +                       rt2800_rfcsr_write(rt2x00dev, 3, 0x88);
> +                       rt2800_rfcsr_write(rt2x00dev, 5, 0x10);
> +                       rt2800_rfcsr_write(rt2x00dev, 6, 0xe0);
> +                       rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 10, 0x53);
> +                       rt2800_rfcsr_write(rt2x00dev, 11, 0x4a);
> +                       rt2800_rfcsr_write(rt2x00dev, 12, 0x46);
> +                       rt2800_rfcsr_write(rt2x00dev, 13, 0x9f);
> +                       rt2800_rfcsr_write(rt2x00dev, 14, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 15, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 16, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 18, 0x03);
> +                       rt2800_rfcsr_write(rt2x00dev, 19, 0x4d);
> +                       rt2800_rfcsr_write(rt2x00dev, 20, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 21, 0x8d);
> +                       rt2800_rfcsr_write(rt2x00dev, 22, 0x20);
> +                       rt2800_rfcsr_write(rt2x00dev, 23, 0x0b);
> +                       rt2800_rfcsr_write(rt2x00dev, 24, 0x44);
> +                       rt2800_rfcsr_write(rt2x00dev, 25, 0x80);
> +                       rt2800_rfcsr_write(rt2x00dev, 26, 0x82);
> +                       rt2800_rfcsr_write(rt2x00dev, 27, 0x09);
> +                       rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 29, 0x10);
> +                       rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
> +                       rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
> +                       rt2800_rfcsr_write(rt2x00dev, 32, 0x20);
> +                       rt2800_rfcsr_write(rt2x00dev, 33, 0xC0);
> +                       rt2800_rfcsr_write(rt2x00dev, 34, 0x07);
> +                       rt2800_rfcsr_write(rt2x00dev, 35, 0x12);
> +                       rt2800_rfcsr_write(rt2x00dev, 36, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 37, 0x08);
> +                       rt2800_rfcsr_write(rt2x00dev, 38, 0x89);
> +                       rt2800_rfcsr_write(rt2x00dev, 39, 0x1b);
> +                       rt2800_rfcsr_write(rt2x00dev, 40, 0x0f);
> +                       rt2800_rfcsr_write(rt2x00dev, 41, 0xbb);
> +                       rt2800_rfcsr_write(rt2x00dev, 42, 0xd5);
> +                       rt2800_rfcsr_write(rt2x00dev, 43, 0x9b);
> +                       rt2800_rfcsr_write(rt2x00dev, 44, 0x0e);
> +                       rt2800_rfcsr_write(rt2x00dev, 45, 0xa2);
> +                       rt2800_rfcsr_write(rt2x00dev, 46, 0x73);
> +                       rt2800_rfcsr_write(rt2x00dev, 47, 0x0c);
> +                       rt2800_rfcsr_write(rt2x00dev, 48, 0x10);
> +                       rt2800_rfcsr_write(rt2x00dev, 49, 0x94);
> +                       rt2800_rfcsr_write(rt2x00dev, 50, 0x94);
> +                       rt2800_rfcsr_write(rt2x00dev, 51, 0x3a);
> +                       rt2800_rfcsr_write(rt2x00dev, 52, 0x48);
> +                       rt2800_rfcsr_write(rt2x00dev, 53, 0x44);
> +                       rt2800_rfcsr_write(rt2x00dev, 54, 0x38);
> +                       rt2800_rfcsr_write(rt2x00dev, 55, 0x43);
> +                       rt2800_rfcsr_write(rt2x00dev, 56, 0xa1);
> +                       rt2800_rfcsr_write(rt2x00dev, 57, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 58, 0x39);
> +                       rt2800_rfcsr_write(rt2x00dev, 59, 0x07);
> +                       rt2800_rfcsr_write(rt2x00dev, 60, 0x45);
> +                       rt2800_rfcsr_write(rt2x00dev, 61, 0x91);
> +                       rt2800_rfcsr_write(rt2x00dev, 62, 0x39);
> +                       rt2800_rfcsr_write(rt2x00dev, 63, 0x07);
>        }
>
>        if (rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070F)) {
> @@ -3549,7 +3647,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
>                        rt2800_init_rx_filter(rt2x00dev, true, 0x27, 0x15);
>        }
>
> -       if (!rt2x00_rt(rt2x00dev, RT5390)) {
> +       if (!rt2x00_rt(rt2x00dev, RT5390) &&
> +               !rt2x00_rt(rt2x00dev, RT5392)) {
>                /*
>                 * Set back to initial state
>                 */
> @@ -3577,7 +3676,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
>        rt2x00_set_field32(&reg, OPT_14_CSR_BIT0, 1);
>        rt2800_register_write(rt2x00dev, OPT_14_CSR, reg);
>
> -       if (!rt2x00_rt(rt2x00dev, RT5390)) {
> +       if (!rt2x00_rt(rt2x00dev, RT5390) &&
> +               !rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_rfcsr_read(rt2x00dev, 17, &rfcsr);
>                rt2x00_set_field8(&rfcsr, RFCSR17_TX_LO1_EN, 0);
>                if (rt2x00_rt(rt2x00dev, RT3070) ||
> @@ -3645,7 +3745,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
>                rt2800_rfcsr_write(rt2x00dev, 27, rfcsr);
>        }
>
> -       if (rt2x00_rt(rt2x00dev, RT5390)) {
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_rfcsr_read(rt2x00dev, 38, &rfcsr);
>                rt2x00_set_field8(&rfcsr, RFCSR38_RX_LO1_EN, 0);
>                rt2800_rfcsr_write(rt2x00dev, 38, rfcsr);
> @@ -3929,7 +4030,8 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
>         * RT53xx: defined in "EEPROM_CHIP_ID" field
>         */
>        rt2800_register_read(rt2x00dev, MAC_CSR0, &reg);
> -       if (rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5390)
> +       if (rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5390 ||
> +               rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5392)
>                rt2x00_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &value);
>        else
>                value = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);
> @@ -3947,6 +4049,7 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
>        case RT3390:
>        case RT3572:
>        case RT5390:
> +       case RT5392:
>                break;
>        default:
>                ERROR(rt2x00dev, "Invalid RT chipset detected.\n");
> @@ -3965,6 +4068,7 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
>        case RF3052:
>        case RF3320:
>        case RF5370:
> +       case RF5372:
>        case RF5390:
>                break;
>        default:
> @@ -4271,6 +4375,7 @@ int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
>                   rt2x00_rf(rt2x00dev, RF3022) ||
>                   rt2x00_rf(rt2x00dev, RF3320) ||
>                   rt2x00_rf(rt2x00dev, RF5370) ||
> +                  rt2x00_rf(rt2x00dev, RF5372) ||
>                   rt2x00_rf(rt2x00dev, RF5390)) {
>                spec->num_channels = 14;
>                spec->channels = rf_vals_3x;
> diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c
> index 837b460..bf0f83c 100644
> --- a/drivers/net/wireless/rt2x00/rt2800pci.c
> +++ b/drivers/net/wireless/rt2x00/rt2800pci.c
> @@ -480,7 +480,8 @@ static int rt2800pci_init_registers(struct rt2x00_dev *rt2x00dev)
>
>        if (rt2x00_is_pcie(rt2x00dev) &&
>            (rt2x00_rt(rt2x00dev, RT3572) ||
> -            rt2x00_rt(rt2x00dev, RT5390))) {
> +            rt2x00_rt(rt2x00dev, RT5390) ||
> +            rt2x00_rt(rt2x00dev, RT5392))) {
>                rt2x00pci_register_read(rt2x00dev, AUX_CTRL, &reg);
>                rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1);
>                rt2x00_set_field32(&reg, AUX_CTRL_WAKE_PCIE_EN, 1);
> diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c
> index 7f21005..6565113 100644
> --- a/drivers/net/wireless/rt2x00/rt2800usb.c
> +++ b/drivers/net/wireless/rt2x00/rt2800usb.c
> @@ -1101,12 +1101,26 @@ static struct usb_device_id rt2800usb_device_table[] = {
>        { USB_DEVICE(0x5a57, 0x0284) },
>  #endif
>  #ifdef CONFIG_RT2800USB_RT53XX
> +       /* Alpha */
> +       { USB_DEVICE(0x2001, 0x3c15) },
> +       { USB_DEVICE(0x2001, 0x3c19) },
> +       /* Arcadyan */
> +       { USB_DEVICE(0x043e, 0x7a12) },
>        /* Azurewave */
>        { USB_DEVICE(0x13d3, 0x3329) },
>        { USB_DEVICE(0x13d3, 0x3365) },
> +       /* LG innotek */
> +       { USB_DEVICE(0x043e, 0x7a22) },
> +       /* Panasonic */
> +       { USB_DEVICE(0x04da, 0x1801) },
> +       { USB_DEVICE(0x04da, 0x1800) },
> +       /* Philips */
> +       { USB_DEVICE(0x0471, 0x2104) },
>        /* Ralink */
>        { USB_DEVICE(0x148f, 0x5370) },
>        { USB_DEVICE(0x148f, 0x5372) },
> +       /* Unknown */
> +       { USB_DEVICE(0x04da, 0x23f6) },
>  #endif
>  #ifdef CONFIG_RT2800USB_UNKNOWN
>        /*
> diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
> index b03b22c..bf743cd 100644
> --- a/drivers/net/wireless/rt2x00/rt2x00.h
> +++ b/drivers/net/wireless/rt2x00/rt2x00.h
> @@ -192,6 +192,7 @@ struct rt2x00_chip {
>  #define RT3593         0x3593
>  #define RT3883         0x3883  /* WSOC */
>  #define RT5390         0x5390  /* 2.4GHz */
> +#define RT5392         0x5392  /* 2.4GHz */
>
>        u16 rf;
>        u16 rev;
> --
> 1.7.6.5
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html



-- 
---
Gertjan

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH] rt2x00:Add RT5372 chipset support
@ 2012-02-17  9:33 John Li
  2012-02-17 13:06 ` Gertjan van Wingerde
  2012-02-18 12:24 ` Ivo Van Doorn
  0 siblings, 2 replies; 10+ messages in thread
From: John Li @ 2012-02-17  9:33 UTC (permalink / raw)
  To: users; +Cc: linux-wireless, John Linville, John Li

From: John Li <chen-yang.li@mediatek.com>

Signed-off-by: John Li <chen-yang.li@mediatek.com>
---
 drivers/net/wireless/rt2x00/rt2800.h    |    1 +
 drivers/net/wireless/rt2x00/rt2800lib.c |  153 ++++++++++++++++++++++++++-----
 drivers/net/wireless/rt2x00/rt2800pci.c |    3 +-
 drivers/net/wireless/rt2x00/rt2800usb.c |   14 +++
 drivers/net/wireless/rt2x00/rt2x00.h    |    1 +
 5 files changed, 147 insertions(+), 25 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2800.h b/drivers/net/wireless/rt2x00/rt2800.h
index 2571a2f..56b78c8 100644
--- a/drivers/net/wireless/rt2x00/rt2800.h
+++ b/drivers/net/wireless/rt2x00/rt2800.h
@@ -68,6 +68,7 @@
 #define RF3322				0x000c
 #define RF3053				0x000d
 #define RF5370				0x5370
+#define RF5372				0x5372
 #define RF5390				0x5390
 
 /*
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index 22a1a8f..90d7a36 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -402,7 +402,8 @@ int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
 
 	if (rt2x00_is_pci(rt2x00dev)) {
 		if (rt2x00_rt(rt2x00dev, RT3572) ||
-		    rt2x00_rt(rt2x00dev, RT5390)) {
+		    rt2x00_rt(rt2x00dev, RT5390) ||
+		    rt2x00_rt(rt2x00dev, RT5392)) {
 			rt2800_register_read(rt2x00dev, AUX_CTRL, &reg);
 			rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1);
 			rt2x00_set_field32(&reg, AUX_CTRL_WAKE_PCIE_EN, 1);
@@ -1906,7 +1907,8 @@ static void rt2800_config_channel_rf53xx(struct rt2x00_dev *rt2x00dev,
 						   r55_nonbt_rev[idx]);
 				rt2800_rfcsr_write(rt2x00dev, 59,
 						   r59_nonbt_rev[idx]);
-			} else if (rt2x00_rt(rt2x00dev, RT5390)) {
+			} else if (rt2x00_rt(rt2x00dev, RT5390) ||
+					   rt2x00_rt(rt2x00dev, RT5392)) {
 				static const char r59_non_bt[] = {0x8f, 0x8f,
 					0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8d,
 					0x8a, 0x88, 0x88, 0x87, 0x87, 0x86};
@@ -1956,6 +1958,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
 		rt2800_config_channel_rf3052(rt2x00dev, conf, rf, info);
 		break;
 	case RF5370:
+	case RF5372:
 	case RF5390:
 		rt2800_config_channel_rf53xx(rt2x00dev, conf, rf, info);
 		break;
@@ -1972,7 +1975,8 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
 	rt2800_bbp_write(rt2x00dev, 86, 0);
 
 	if (rf->channel <= 14) {
-		if (!rt2x00_rt(rt2x00dev, RT5390)) {
+		if (!rt2x00_rt(rt2x00dev, RT5390) &&
+			!rt2x00_rt(rt2x00dev, RT5392)) {
 			if (test_bit(CAPABILITY_EXTERNAL_LNA_BG,
 				     &rt2x00dev->cap_flags)) {
 				rt2800_bbp_write(rt2x00dev, 82, 0x62);
@@ -2502,7 +2506,8 @@ static u8 rt2800_get_default_vgc(struct rt2x00_dev *rt2x00dev)
 		    rt2x00_rt(rt2x00dev, RT3071) ||
 		    rt2x00_rt(rt2x00dev, RT3090) ||
 		    rt2x00_rt(rt2x00dev, RT3390) ||
-		    rt2x00_rt(rt2x00dev, RT5390))
+		    rt2x00_rt(rt2x00dev, RT5390) ||
+		    rt2x00_rt(rt2x00dev, RT5392))
 			return 0x1c + (2 * rt2x00dev->lna_gain);
 		else
 			return 0x2e + rt2x00dev->lna_gain;
@@ -2637,7 +2642,8 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
 	} else if (rt2x00_rt(rt2x00dev, RT3572)) {
 		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400);
 		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
-	} else if (rt2x00_rt(rt2x00dev, RT5390)) {
+	} else if (rt2x00_rt(rt2x00dev, RT5390) ||
+			   rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
 		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
 		rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
@@ -3013,7 +3019,8 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
 		     rt2800_wait_bbp_ready(rt2x00dev)))
 		return -EACCES;
 
-	if (rt2x00_rt(rt2x00dev, RT5390)) {
+	if (rt2x00_rt(rt2x00dev, RT5390) ||
+		rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_bbp_read(rt2x00dev, 4, &value);
 		rt2x00_set_field8(&value, BBP4_MAC_IF_CTRL, 1);
 		rt2800_bbp_write(rt2x00dev, 4, value);
@@ -3021,19 +3028,22 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
 
 	if (rt2800_is_305x_soc(rt2x00dev) ||
 	    rt2x00_rt(rt2x00dev, RT3572) ||
-	    rt2x00_rt(rt2x00dev, RT5390))
+	    rt2x00_rt(rt2x00dev, RT5390) ||
+	    rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 31, 0x08);
 
 	rt2800_bbp_write(rt2x00dev, 65, 0x2c);
 	rt2800_bbp_write(rt2x00dev, 66, 0x38);
 
-	if (rt2x00_rt(rt2x00dev, RT5390))
+	if (rt2x00_rt(rt2x00dev, RT5390) ||
+		rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 68, 0x0b);
 
 	if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860C)) {
 		rt2800_bbp_write(rt2x00dev, 69, 0x16);
 		rt2800_bbp_write(rt2x00dev, 73, 0x12);
-	} else if (rt2x00_rt(rt2x00dev, RT5390)) {
+	} else if (rt2x00_rt(rt2x00dev, RT5390) ||
+			   rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_bbp_write(rt2x00dev, 69, 0x12);
 		rt2800_bbp_write(rt2x00dev, 73, 0x13);
 		rt2800_bbp_write(rt2x00dev, 75, 0x46);
@@ -3051,7 +3061,8 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
 	    rt2x00_rt(rt2x00dev, RT3090) ||
 	    rt2x00_rt(rt2x00dev, RT3390) ||
 	    rt2x00_rt(rt2x00dev, RT3572) ||
-	    rt2x00_rt(rt2x00dev, RT5390)) {
+	    rt2x00_rt(rt2x00dev, RT5390) ||
+	    rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_bbp_write(rt2x00dev, 79, 0x13);
 		rt2800_bbp_write(rt2x00dev, 80, 0x05);
 		rt2800_bbp_write(rt2x00dev, 81, 0x33);
@@ -3063,64 +3074,88 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
 	}
 
 	rt2800_bbp_write(rt2x00dev, 82, 0x62);
-	if (rt2x00_rt(rt2x00dev, RT5390))
+	if (rt2x00_rt(rt2x00dev, RT5390) ||
+		rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 83, 0x7a);
 	else
 		rt2800_bbp_write(rt2x00dev, 83, 0x6a);
 
 	if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860D))
 		rt2800_bbp_write(rt2x00dev, 84, 0x19);
-	else if (rt2x00_rt(rt2x00dev, RT5390))
+	else if (rt2x00_rt(rt2x00dev, RT5390) ||
+			 rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 84, 0x9a);
 	else
 		rt2800_bbp_write(rt2x00dev, 84, 0x99);
 
-	if (rt2x00_rt(rt2x00dev, RT5390))
+	if (rt2x00_rt(rt2x00dev, RT5390) ||
+		rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 86, 0x38);
 	else
 		rt2800_bbp_write(rt2x00dev, 86, 0x00);
 
+	if (rt2x00_rt(rt2x00dev, RT5392))
+		rt2800_bbp_write(rt2x00dev, 88, 0x90);
+
 	rt2800_bbp_write(rt2x00dev, 91, 0x04);
 
-	if (rt2x00_rt(rt2x00dev, RT5390))
+	if (rt2x00_rt(rt2x00dev, RT5390) ||
+		rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 92, 0x02);
 	else
 		rt2800_bbp_write(rt2x00dev, 92, 0x00);
 
+	if (rt2x00_rt(rt2x00dev, RT5392)) {
+		rt2800_bbp_write(rt2x00dev, 95, 0x9a);
+		rt2800_bbp_write(rt2x00dev, 98, 0x12);
+	}
+
 	if (rt2x00_rt_rev_gte(rt2x00dev, RT3070, REV_RT3070F) ||
 	    rt2x00_rt_rev_gte(rt2x00dev, RT3071, REV_RT3071E) ||
 	    rt2x00_rt_rev_gte(rt2x00dev, RT3090, REV_RT3090E) ||
 	    rt2x00_rt_rev_gte(rt2x00dev, RT3390, REV_RT3390E) ||
 	    rt2x00_rt(rt2x00dev, RT3572) ||
 	    rt2x00_rt(rt2x00dev, RT5390) ||
+	    rt2x00_rt(rt2x00dev, RT5392) ||
 	    rt2800_is_305x_soc(rt2x00dev))
 		rt2800_bbp_write(rt2x00dev, 103, 0xc0);
 	else
 		rt2800_bbp_write(rt2x00dev, 103, 0x00);
 
-	if (rt2x00_rt(rt2x00dev, RT5390))
+	if (rt2x00_rt(rt2x00dev, RT5390) ||
+		rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 104, 0x92);
 
 	if (rt2800_is_305x_soc(rt2x00dev))
 		rt2800_bbp_write(rt2x00dev, 105, 0x01);
-	else if (rt2x00_rt(rt2x00dev, RT5390))
+	else if (rt2x00_rt(rt2x00dev, RT5390) ||
+			 rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 105, 0x3c);
 	else
 		rt2800_bbp_write(rt2x00dev, 105, 0x05);
 
 	if (rt2x00_rt(rt2x00dev, RT5390))
 		rt2800_bbp_write(rt2x00dev, 106, 0x03);
+	else if (rt2x00_rt(rt2x00dev, RT5392))
+		rt2800_bbp_write(rt2x00dev, 106, 0x12);
 	else
 		rt2800_bbp_write(rt2x00dev, 106, 0x35);
 
-	if (rt2x00_rt(rt2x00dev, RT5390))
+	if (rt2x00_rt(rt2x00dev, RT5390) ||
+		rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 128, 0x12);
 
+	if (rt2x00_rt(rt2x00dev, RT5392)) {
+		rt2800_bbp_write(rt2x00dev, 134, 0xd0);
+		rt2800_bbp_write(rt2x00dev, 135, 0xf6);
+	}
+
 	if (rt2x00_rt(rt2x00dev, RT3071) ||
 	    rt2x00_rt(rt2x00dev, RT3090) ||
 	    rt2x00_rt(rt2x00dev, RT3390) ||
 	    rt2x00_rt(rt2x00dev, RT3572) ||
-	    rt2x00_rt(rt2x00dev, RT5390)) {
+	    rt2x00_rt(rt2x00dev, RT5390) ||
+	    rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_bbp_read(rt2x00dev, 138, &value);
 
 		rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &eeprom);
@@ -3132,7 +3167,8 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
 		rt2800_bbp_write(rt2x00dev, 138, value);
 	}
 
-	if (rt2x00_rt(rt2x00dev, RT5390)) {
+	if (rt2x00_rt(rt2x00dev, RT5390) ||
+		rt2x00_rt(rt2x00dev, RT5392)) {
 		int ant, div_mode;
 
 		rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom);
@@ -3258,13 +3294,15 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
 	    !rt2x00_rt(rt2x00dev, RT3390) &&
 	    !rt2x00_rt(rt2x00dev, RT3572) &&
 	    !rt2x00_rt(rt2x00dev, RT5390) &&
+	    !rt2x00_rt(rt2x00dev, RT5392) &&
 	    !rt2800_is_305x_soc(rt2x00dev))
 		return 0;
 
 	/*
 	 * Init RF calibration.
 	 */
-	if (rt2x00_rt(rt2x00dev, RT5390)) {
+	if (rt2x00_rt(rt2x00dev, RT5390) ||
+		rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_rfcsr_read(rt2x00dev, 2, &rfcsr);
 		rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 1);
 		rt2800_rfcsr_write(rt2x00dev, 2, rfcsr);
@@ -3482,6 +3520,66 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
 			rt2800_rfcsr_write(rt2x00dev, 61, 0xdd);
 		rt2800_rfcsr_write(rt2x00dev, 62, 0x00);
 		rt2800_rfcsr_write(rt2x00dev, 63, 0x00);
+	}	else if (rt2x00_rt(rt2x00dev, RT5392)) {
+			rt2800_rfcsr_write(rt2x00dev, 1, 0x17);
+			rt2800_rfcsr_write(rt2x00dev, 2, 0x80);
+			rt2800_rfcsr_write(rt2x00dev, 3, 0x88);
+			rt2800_rfcsr_write(rt2x00dev, 5, 0x10);
+			rt2800_rfcsr_write(rt2x00dev, 6, 0xe0);
+			rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 10, 0x53);
+			rt2800_rfcsr_write(rt2x00dev, 11, 0x4a);
+			rt2800_rfcsr_write(rt2x00dev, 12, 0x46);
+			rt2800_rfcsr_write(rt2x00dev, 13, 0x9f);
+			rt2800_rfcsr_write(rt2x00dev, 14, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 15, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 16, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 18, 0x03);
+			rt2800_rfcsr_write(rt2x00dev, 19, 0x4d);
+			rt2800_rfcsr_write(rt2x00dev, 20, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 21, 0x8d);
+			rt2800_rfcsr_write(rt2x00dev, 22, 0x20);
+			rt2800_rfcsr_write(rt2x00dev, 23, 0x0b);
+			rt2800_rfcsr_write(rt2x00dev, 24, 0x44);
+			rt2800_rfcsr_write(rt2x00dev, 25, 0x80);
+			rt2800_rfcsr_write(rt2x00dev, 26, 0x82);
+			rt2800_rfcsr_write(rt2x00dev, 27, 0x09);
+			rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 29, 0x10);
+			rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
+			rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
+			rt2800_rfcsr_write(rt2x00dev, 32, 0x20);
+			rt2800_rfcsr_write(rt2x00dev, 33, 0xC0);
+			rt2800_rfcsr_write(rt2x00dev, 34, 0x07);
+			rt2800_rfcsr_write(rt2x00dev, 35, 0x12);
+			rt2800_rfcsr_write(rt2x00dev, 36, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 37, 0x08);
+			rt2800_rfcsr_write(rt2x00dev, 38, 0x89);
+			rt2800_rfcsr_write(rt2x00dev, 39, 0x1b);
+			rt2800_rfcsr_write(rt2x00dev, 40, 0x0f);
+			rt2800_rfcsr_write(rt2x00dev, 41, 0xbb);
+			rt2800_rfcsr_write(rt2x00dev, 42, 0xd5);
+			rt2800_rfcsr_write(rt2x00dev, 43, 0x9b);
+			rt2800_rfcsr_write(rt2x00dev, 44, 0x0e);
+			rt2800_rfcsr_write(rt2x00dev, 45, 0xa2);
+			rt2800_rfcsr_write(rt2x00dev, 46, 0x73);
+			rt2800_rfcsr_write(rt2x00dev, 47, 0x0c);
+			rt2800_rfcsr_write(rt2x00dev, 48, 0x10);
+			rt2800_rfcsr_write(rt2x00dev, 49, 0x94);
+			rt2800_rfcsr_write(rt2x00dev, 50, 0x94);
+			rt2800_rfcsr_write(rt2x00dev, 51, 0x3a);
+			rt2800_rfcsr_write(rt2x00dev, 52, 0x48);
+			rt2800_rfcsr_write(rt2x00dev, 53, 0x44);
+			rt2800_rfcsr_write(rt2x00dev, 54, 0x38);
+			rt2800_rfcsr_write(rt2x00dev, 55, 0x43);
+			rt2800_rfcsr_write(rt2x00dev, 56, 0xa1);
+			rt2800_rfcsr_write(rt2x00dev, 57, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 58, 0x39);
+			rt2800_rfcsr_write(rt2x00dev, 59, 0x07);
+			rt2800_rfcsr_write(rt2x00dev, 60, 0x45);
+			rt2800_rfcsr_write(rt2x00dev, 61, 0x91);
+			rt2800_rfcsr_write(rt2x00dev, 62, 0x39);
+			rt2800_rfcsr_write(rt2x00dev, 63, 0x07);
 	}
 
 	if (rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070F)) {
@@ -3549,7 +3647,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
 			rt2800_init_rx_filter(rt2x00dev, true, 0x27, 0x15);
 	}
 
-	if (!rt2x00_rt(rt2x00dev, RT5390)) {
+	if (!rt2x00_rt(rt2x00dev, RT5390) &&
+		!rt2x00_rt(rt2x00dev, RT5392)) {
 		/*
 		 * Set back to initial state
 		 */
@@ -3577,7 +3676,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
 	rt2x00_set_field32(&reg, OPT_14_CSR_BIT0, 1);
 	rt2800_register_write(rt2x00dev, OPT_14_CSR, reg);
 
-	if (!rt2x00_rt(rt2x00dev, RT5390)) {
+	if (!rt2x00_rt(rt2x00dev, RT5390) &&
+		!rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_rfcsr_read(rt2x00dev, 17, &rfcsr);
 		rt2x00_set_field8(&rfcsr, RFCSR17_TX_LO1_EN, 0);
 		if (rt2x00_rt(rt2x00dev, RT3070) ||
@@ -3645,7 +3745,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
 		rt2800_rfcsr_write(rt2x00dev, 27, rfcsr);
 	}
 
-	if (rt2x00_rt(rt2x00dev, RT5390)) {
+	if (rt2x00_rt(rt2x00dev, RT5390) ||
+		rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_rfcsr_read(rt2x00dev, 38, &rfcsr);
 		rt2x00_set_field8(&rfcsr, RFCSR38_RX_LO1_EN, 0);
 		rt2800_rfcsr_write(rt2x00dev, 38, rfcsr);
@@ -3929,7 +4030,8 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
 	 * RT53xx: defined in "EEPROM_CHIP_ID" field
 	 */
 	rt2800_register_read(rt2x00dev, MAC_CSR0, &reg);
-	if (rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5390)
+	if (rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5390 ||
+		rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5392)
 		rt2x00_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &value);
 	else
 		value = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);
@@ -3947,6 +4049,7 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
 	case RT3390:
 	case RT3572:
 	case RT5390:
+	case RT5392:
 		break;
 	default:
 		ERROR(rt2x00dev, "Invalid RT chipset detected.\n");
@@ -3965,6 +4068,7 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
 	case RF3052:
 	case RF3320:
 	case RF5370:
+	case RF5372:
 	case RF5390:
 		break;
 	default:
@@ -4271,6 +4375,7 @@ int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
 		   rt2x00_rf(rt2x00dev, RF3022) ||
 		   rt2x00_rf(rt2x00dev, RF3320) ||
 		   rt2x00_rf(rt2x00dev, RF5370) ||
+		   rt2x00_rf(rt2x00dev, RF5372) ||
 		   rt2x00_rf(rt2x00dev, RF5390)) {
 		spec->num_channels = 14;
 		spec->channels = rf_vals_3x;
diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c
index 837b460..bf0f83c 100644
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
@@ -480,7 +480,8 @@ static int rt2800pci_init_registers(struct rt2x00_dev *rt2x00dev)
 
 	if (rt2x00_is_pcie(rt2x00dev) &&
 	    (rt2x00_rt(rt2x00dev, RT3572) ||
-	     rt2x00_rt(rt2x00dev, RT5390))) {
+	     rt2x00_rt(rt2x00dev, RT5390) ||
+	     rt2x00_rt(rt2x00dev, RT5392))) {
 		rt2x00pci_register_read(rt2x00dev, AUX_CTRL, &reg);
 		rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1);
 		rt2x00_set_field32(&reg, AUX_CTRL_WAKE_PCIE_EN, 1);
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c
index 7f21005..6565113 100644
--- a/drivers/net/wireless/rt2x00/rt2800usb.c
+++ b/drivers/net/wireless/rt2x00/rt2800usb.c
@@ -1101,12 +1101,26 @@ static struct usb_device_id rt2800usb_device_table[] = {
 	{ USB_DEVICE(0x5a57, 0x0284) },
 #endif
 #ifdef CONFIG_RT2800USB_RT53XX
+	/* Alpha */
+	{ USB_DEVICE(0x2001, 0x3c15) },
+	{ USB_DEVICE(0x2001, 0x3c19) },
+	/* Arcadyan */
+	{ USB_DEVICE(0x043e, 0x7a12) },
 	/* Azurewave */
 	{ USB_DEVICE(0x13d3, 0x3329) },
 	{ USB_DEVICE(0x13d3, 0x3365) },
+	/* LG innotek */
+	{ USB_DEVICE(0x043e, 0x7a22) },
+	/* Panasonic */
+	{ USB_DEVICE(0x04da, 0x1801) },
+	{ USB_DEVICE(0x04da, 0x1800) },
+	/* Philips */
+	{ USB_DEVICE(0x0471, 0x2104) },
 	/* Ralink */
 	{ USB_DEVICE(0x148f, 0x5370) },
 	{ USB_DEVICE(0x148f, 0x5372) },
+	/* Unknown */
+	{ USB_DEVICE(0x04da, 0x23f6) },
 #endif
 #ifdef CONFIG_RT2800USB_UNKNOWN
 	/*
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
index b03b22c..bf743cd 100644
--- a/drivers/net/wireless/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
@@ -192,6 +192,7 @@ struct rt2x00_chip {
 #define RT3593		0x3593
 #define RT3883		0x3883	/* WSOC */
 #define RT5390		0x5390  /* 2.4GHz */
+#define RT5392		0x5392  /* 2.4GHz */
 
 	u16 rf;
 	u16 rev;
-- 
1.7.6.5


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH] rt2x00:Add RT5372 chipset support
  2012-02-16  5:32 John Li
@ 2012-02-17  7:31 ` Gertjan van Wingerde
  0 siblings, 0 replies; 10+ messages in thread
From: Gertjan van Wingerde @ 2012-02-17  7:31 UTC (permalink / raw)
  To: John Li; +Cc: users, linux-wireless, John Linville, John Li

2012/2/16 John Li <john.li.mediatek@gmail.com>:
> From: John Li <chen-yang.li@mediatek.com>
>
> Signed-off-by: John Li <chen-yang.li@mediatek.com>

Acked-by: Gertjan van Wingerde <gwingerde@gmail.com>

> ---
>  drivers/net/wireless/rt2x00/rt2800.h    |    1 +
>  drivers/net/wireless/rt2x00/rt2800lib.c |  153 ++++++++++++++++++++++++++-----
>  drivers/net/wireless/rt2x00/rt2800pci.c |    3 +-
>  drivers/net/wireless/rt2x00/rt2800usb.c |   14 +++
>  drivers/net/wireless/rt2x00/rt2x00.h    |    1 +
>  5 files changed, 147 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/net/wireless/rt2x00/rt2800.h b/drivers/net/wireless/rt2x00/rt2800.h
> index 2571a2f..56b78c8 100644
> --- a/drivers/net/wireless/rt2x00/rt2800.h
> +++ b/drivers/net/wireless/rt2x00/rt2800.h
> @@ -68,6 +68,7 @@
>  #define RF3322                         0x000c
>  #define RF3053                         0x000d
>  #define RF5370                         0x5370
> +#define RF5372                         0x5372
>  #define RF5390                         0x5390
>
>  /*
> diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
> index 22a1a8f..7c6c1b5 100644
> --- a/drivers/net/wireless/rt2x00/rt2800lib.c
> +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
> @@ -402,7 +402,8 @@ int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
>
>        if (rt2x00_is_pci(rt2x00dev)) {
>                if (rt2x00_rt(rt2x00dev, RT3572) ||
> -                   rt2x00_rt(rt2x00dev, RT5390)) {
> +                   rt2x00_rt(rt2x00dev, RT5390) ||
> +                   rt2x00_rt(rt2x00dev, RT5392)) {
>                        rt2800_register_read(rt2x00dev, AUX_CTRL, &reg);
>                        rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1);
>                        rt2x00_set_field32(&reg, AUX_CTRL_WAKE_PCIE_EN, 1);
> @@ -1906,7 +1907,8 @@ static void rt2800_config_channel_rf53xx(struct rt2x00_dev *rt2x00dev,
>                                                   r55_nonbt_rev[idx]);
>                                rt2800_rfcsr_write(rt2x00dev, 59,
>                                                   r59_nonbt_rev[idx]);
> -                       } else if (rt2x00_rt(rt2x00dev, RT5390)) {
> +                       } else if (rt2x00_rt(rt2x00dev, RT5390) ||
> +                                          rt2x00_rt(rt2x00dev, RT5392)) {
>                                static const char r59_non_bt[] = {0x8f, 0x8f,
>                                        0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8d,
>                                        0x8a, 0x88, 0x88, 0x87, 0x87, 0x86};
> @@ -1956,6 +1958,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
>                rt2800_config_channel_rf3052(rt2x00dev, conf, rf, info);
>                break;
>        case RF5370:
> +       case RF5372:
>        case RF5390:
>                rt2800_config_channel_rf53xx(rt2x00dev, conf, rf, info);
>                break;
> @@ -1972,7 +1975,8 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
>        rt2800_bbp_write(rt2x00dev, 86, 0);
>
>        if (rf->channel <= 14) {
> -               if (!rt2x00_rt(rt2x00dev, RT5390)) {
> +               if (!rt2x00_rt(rt2x00dev, RT5390) ||
> +                       !rt2x00_rt(rt2x00dev, RT5392)) {
>                        if (test_bit(CAPABILITY_EXTERNAL_LNA_BG,
>                                     &rt2x00dev->cap_flags)) {
>                                rt2800_bbp_write(rt2x00dev, 82, 0x62);
> @@ -2502,7 +2506,8 @@ static u8 rt2800_get_default_vgc(struct rt2x00_dev *rt2x00dev)
>                    rt2x00_rt(rt2x00dev, RT3071) ||
>                    rt2x00_rt(rt2x00dev, RT3090) ||
>                    rt2x00_rt(rt2x00dev, RT3390) ||
> -                   rt2x00_rt(rt2x00dev, RT5390))
> +                   rt2x00_rt(rt2x00dev, RT5390) ||
> +                   rt2x00_rt(rt2x00dev, RT5392))
>                        return 0x1c + (2 * rt2x00dev->lna_gain);
>                else
>                        return 0x2e + rt2x00dev->lna_gain;
> @@ -2637,7 +2642,8 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
>        } else if (rt2x00_rt(rt2x00dev, RT3572)) {
>                rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400);
>                rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
> -       } else if (rt2x00_rt(rt2x00dev, RT5390)) {
> +       } else if (rt2x00_rt(rt2x00dev, RT5390) ||
> +                          rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
>                rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
>                rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
> @@ -3013,7 +3019,8 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
>                     rt2800_wait_bbp_ready(rt2x00dev)))
>                return -EACCES;
>
> -       if (rt2x00_rt(rt2x00dev, RT5390)) {
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_bbp_read(rt2x00dev, 4, &value);
>                rt2x00_set_field8(&value, BBP4_MAC_IF_CTRL, 1);
>                rt2800_bbp_write(rt2x00dev, 4, value);
> @@ -3021,19 +3028,22 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
>
>        if (rt2800_is_305x_soc(rt2x00dev) ||
>            rt2x00_rt(rt2x00dev, RT3572) ||
> -           rt2x00_rt(rt2x00dev, RT5390))
> +           rt2x00_rt(rt2x00dev, RT5390) ||
> +           rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 31, 0x08);
>
>        rt2800_bbp_write(rt2x00dev, 65, 0x2c);
>        rt2800_bbp_write(rt2x00dev, 66, 0x38);
>
> -       if (rt2x00_rt(rt2x00dev, RT5390))
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 68, 0x0b);
>
>        if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860C)) {
>                rt2800_bbp_write(rt2x00dev, 69, 0x16);
>                rt2800_bbp_write(rt2x00dev, 73, 0x12);
> -       } else if (rt2x00_rt(rt2x00dev, RT5390)) {
> +       } else if (rt2x00_rt(rt2x00dev, RT5390) ||
> +                          rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_bbp_write(rt2x00dev, 69, 0x12);
>                rt2800_bbp_write(rt2x00dev, 73, 0x13);
>                rt2800_bbp_write(rt2x00dev, 75, 0x46);
> @@ -3051,7 +3061,8 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
>            rt2x00_rt(rt2x00dev, RT3090) ||
>            rt2x00_rt(rt2x00dev, RT3390) ||
>            rt2x00_rt(rt2x00dev, RT3572) ||
> -           rt2x00_rt(rt2x00dev, RT5390)) {
> +           rt2x00_rt(rt2x00dev, RT5390) ||
> +           rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_bbp_write(rt2x00dev, 79, 0x13);
>                rt2800_bbp_write(rt2x00dev, 80, 0x05);
>                rt2800_bbp_write(rt2x00dev, 81, 0x33);
> @@ -3063,64 +3074,88 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
>        }
>
>        rt2800_bbp_write(rt2x00dev, 82, 0x62);
> -       if (rt2x00_rt(rt2x00dev, RT5390))
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 83, 0x7a);
>        else
>                rt2800_bbp_write(rt2x00dev, 83, 0x6a);
>
>        if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860D))
>                rt2800_bbp_write(rt2x00dev, 84, 0x19);
> -       else if (rt2x00_rt(rt2x00dev, RT5390))
> +       else if (rt2x00_rt(rt2x00dev, RT5390) ||
> +                        rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 84, 0x9a);
>        else
>                rt2800_bbp_write(rt2x00dev, 84, 0x99);
>
> -       if (rt2x00_rt(rt2x00dev, RT5390))
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 86, 0x38);
>        else
>                rt2800_bbp_write(rt2x00dev, 86, 0x00);
>
> +       if (rt2x00_rt(rt2x00dev, RT5392))
> +               rt2800_bbp_write(rt2x00dev, 88, 0x90);
> +
>        rt2800_bbp_write(rt2x00dev, 91, 0x04);
>
> -       if (rt2x00_rt(rt2x00dev, RT5390))
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 92, 0x02);
>        else
>                rt2800_bbp_write(rt2x00dev, 92, 0x00);
>
> +       if (rt2x00_rt(rt2x00dev, RT5392)) {
> +               rt2800_bbp_write(rt2x00dev, 95, 0x9a);
> +               rt2800_bbp_write(rt2x00dev, 98, 0x12);
> +       }
> +
>        if (rt2x00_rt_rev_gte(rt2x00dev, RT3070, REV_RT3070F) ||
>            rt2x00_rt_rev_gte(rt2x00dev, RT3071, REV_RT3071E) ||
>            rt2x00_rt_rev_gte(rt2x00dev, RT3090, REV_RT3090E) ||
>            rt2x00_rt_rev_gte(rt2x00dev, RT3390, REV_RT3390E) ||
>            rt2x00_rt(rt2x00dev, RT3572) ||
>            rt2x00_rt(rt2x00dev, RT5390) ||
> +           rt2x00_rt(rt2x00dev, RT5392) ||
>            rt2800_is_305x_soc(rt2x00dev))
>                rt2800_bbp_write(rt2x00dev, 103, 0xc0);
>        else
>                rt2800_bbp_write(rt2x00dev, 103, 0x00);
>
> -       if (rt2x00_rt(rt2x00dev, RT5390))
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 104, 0x92);
>
>        if (rt2800_is_305x_soc(rt2x00dev))
>                rt2800_bbp_write(rt2x00dev, 105, 0x01);
> -       else if (rt2x00_rt(rt2x00dev, RT5390))
> +       else if (rt2x00_rt(rt2x00dev, RT5390) ||
> +                        rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 105, 0x3c);
>        else
>                rt2800_bbp_write(rt2x00dev, 105, 0x05);
>
>        if (rt2x00_rt(rt2x00dev, RT5390))
>                rt2800_bbp_write(rt2x00dev, 106, 0x03);
> +       else if (rt2x00_rt(rt2x00dev, RT5392))
> +               rt2800_bbp_write(rt2x00dev, 106, 0x12);
>        else
>                rt2800_bbp_write(rt2x00dev, 106, 0x35);
>
> -       if (rt2x00_rt(rt2x00dev, RT5390))
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 128, 0x12);
>
> +       if (rt2x00_rt(rt2x00dev, RT5392)) {
> +               rt2800_bbp_write(rt2x00dev, 134, 0xd0);
> +               rt2800_bbp_write(rt2x00dev, 135, 0xf6);
> +       }
> +
>        if (rt2x00_rt(rt2x00dev, RT3071) ||
>            rt2x00_rt(rt2x00dev, RT3090) ||
>            rt2x00_rt(rt2x00dev, RT3390) ||
>            rt2x00_rt(rt2x00dev, RT3572) ||
> -           rt2x00_rt(rt2x00dev, RT5390)) {
> +           rt2x00_rt(rt2x00dev, RT5390) ||
> +           rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_bbp_read(rt2x00dev, 138, &value);
>
>                rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &eeprom);
> @@ -3132,7 +3167,8 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
>                rt2800_bbp_write(rt2x00dev, 138, value);
>        }
>
> -       if (rt2x00_rt(rt2x00dev, RT5390)) {
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392)) {
>                int ant, div_mode;
>
>                rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom);
> @@ -3258,13 +3294,15 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
>            !rt2x00_rt(rt2x00dev, RT3390) &&
>            !rt2x00_rt(rt2x00dev, RT3572) &&
>            !rt2x00_rt(rt2x00dev, RT5390) &&
> +           !rt2x00_rt(rt2x00dev, RT5392) &&
>            !rt2800_is_305x_soc(rt2x00dev))
>                return 0;
>
>        /*
>         * Init RF calibration.
>         */
> -       if (rt2x00_rt(rt2x00dev, RT5390)) {
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_rfcsr_read(rt2x00dev, 2, &rfcsr);
>                rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 1);
>                rt2800_rfcsr_write(rt2x00dev, 2, rfcsr);
> @@ -3482,6 +3520,66 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
>                        rt2800_rfcsr_write(rt2x00dev, 61, 0xdd);
>                rt2800_rfcsr_write(rt2x00dev, 62, 0x00);
>                rt2800_rfcsr_write(rt2x00dev, 63, 0x00);
> +       }       else if (rt2x00_rt(rt2x00dev, RT5392)) {
> +                       rt2800_rfcsr_write(rt2x00dev, 1, 0x17);
> +                       rt2800_rfcsr_write(rt2x00dev, 2, 0x80);
> +                       rt2800_rfcsr_write(rt2x00dev, 3, 0x88);
> +                       rt2800_rfcsr_write(rt2x00dev, 5, 0x10);
> +                       rt2800_rfcsr_write(rt2x00dev, 6, 0xe0);
> +                       rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 10, 0x53);
> +                       rt2800_rfcsr_write(rt2x00dev, 11, 0x4a);
> +                       rt2800_rfcsr_write(rt2x00dev, 12, 0x46);
> +                       rt2800_rfcsr_write(rt2x00dev, 13, 0x9f);
> +                       rt2800_rfcsr_write(rt2x00dev, 14, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 15, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 16, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 18, 0x03);
> +                       rt2800_rfcsr_write(rt2x00dev, 19, 0x4d);
> +                       rt2800_rfcsr_write(rt2x00dev, 20, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 21, 0x8d);
> +                       rt2800_rfcsr_write(rt2x00dev, 22, 0x20);
> +                       rt2800_rfcsr_write(rt2x00dev, 23, 0x0b);
> +                       rt2800_rfcsr_write(rt2x00dev, 24, 0x44);
> +                       rt2800_rfcsr_write(rt2x00dev, 25, 0x80);
> +                       rt2800_rfcsr_write(rt2x00dev, 26, 0x82);
> +                       rt2800_rfcsr_write(rt2x00dev, 27, 0x09);
> +                       rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 29, 0x10);
> +                       rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
> +                       rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
> +                       rt2800_rfcsr_write(rt2x00dev, 32, 0x20);
> +                       rt2800_rfcsr_write(rt2x00dev, 33, 0xC0);
> +                       rt2800_rfcsr_write(rt2x00dev, 34, 0x07);
> +                       rt2800_rfcsr_write(rt2x00dev, 35, 0x12);
> +                       rt2800_rfcsr_write(rt2x00dev, 36, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 37, 0x08);
> +                       rt2800_rfcsr_write(rt2x00dev, 38, 0x89);
> +                       rt2800_rfcsr_write(rt2x00dev, 39, 0x1b);
> +                       rt2800_rfcsr_write(rt2x00dev, 40, 0x0f);
> +                       rt2800_rfcsr_write(rt2x00dev, 41, 0xbb);
> +                       rt2800_rfcsr_write(rt2x00dev, 42, 0xd5);
> +                       rt2800_rfcsr_write(rt2x00dev, 43, 0x9b);
> +                       rt2800_rfcsr_write(rt2x00dev, 44, 0x0e);
> +                       rt2800_rfcsr_write(rt2x00dev, 45, 0xa2);
> +                       rt2800_rfcsr_write(rt2x00dev, 46, 0x73);
> +                       rt2800_rfcsr_write(rt2x00dev, 47, 0x0c);
> +                       rt2800_rfcsr_write(rt2x00dev, 48, 0x10);
> +                       rt2800_rfcsr_write(rt2x00dev, 49, 0x94);
> +                       rt2800_rfcsr_write(rt2x00dev, 50, 0x94);
> +                       rt2800_rfcsr_write(rt2x00dev, 51, 0x3a);
> +                       rt2800_rfcsr_write(rt2x00dev, 52, 0x48);
> +                       rt2800_rfcsr_write(rt2x00dev, 53, 0x44);
> +                       rt2800_rfcsr_write(rt2x00dev, 54, 0x38);
> +                       rt2800_rfcsr_write(rt2x00dev, 55, 0x43);
> +                       rt2800_rfcsr_write(rt2x00dev, 56, 0xa1);
> +                       rt2800_rfcsr_write(rt2x00dev, 57, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 58, 0x39);
> +                       rt2800_rfcsr_write(rt2x00dev, 59, 0x07);
> +                       rt2800_rfcsr_write(rt2x00dev, 60, 0x45);
> +                       rt2800_rfcsr_write(rt2x00dev, 61, 0x91);
> +                       rt2800_rfcsr_write(rt2x00dev, 62, 0x39);
> +                       rt2800_rfcsr_write(rt2x00dev, 63, 0x07);
>        }
>
>        if (rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070F)) {
> @@ -3549,7 +3647,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
>                        rt2800_init_rx_filter(rt2x00dev, true, 0x27, 0x15);
>        }
>
> -       if (!rt2x00_rt(rt2x00dev, RT5390)) {
> +       if (!rt2x00_rt(rt2x00dev, RT5390) ||
> +               !rt2x00_rt(rt2x00dev, RT5392)) {
>                /*
>                 * Set back to initial state
>                 */
> @@ -3577,7 +3676,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
>        rt2x00_set_field32(&reg, OPT_14_CSR_BIT0, 1);
>        rt2800_register_write(rt2x00dev, OPT_14_CSR, reg);
>
> -       if (!rt2x00_rt(rt2x00dev, RT5390)) {
> +       if (!rt2x00_rt(rt2x00dev, RT5390) ||
> +               !rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_rfcsr_read(rt2x00dev, 17, &rfcsr);
>                rt2x00_set_field8(&rfcsr, RFCSR17_TX_LO1_EN, 0);
>                if (rt2x00_rt(rt2x00dev, RT3070) ||
> @@ -3645,7 +3745,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
>                rt2800_rfcsr_write(rt2x00dev, 27, rfcsr);
>        }
>
> -       if (rt2x00_rt(rt2x00dev, RT5390)) {
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_rfcsr_read(rt2x00dev, 38, &rfcsr);
>                rt2x00_set_field8(&rfcsr, RFCSR38_RX_LO1_EN, 0);
>                rt2800_rfcsr_write(rt2x00dev, 38, rfcsr);
> @@ -3929,7 +4030,8 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
>         * RT53xx: defined in "EEPROM_CHIP_ID" field
>         */
>        rt2800_register_read(rt2x00dev, MAC_CSR0, &reg);
> -       if (rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5390)
> +       if (rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5390 ||
> +               rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5392)
>                rt2x00_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &value);
>        else
>                value = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);
> @@ -3947,6 +4049,7 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
>        case RT3390:
>        case RT3572:
>        case RT5390:
> +       case RT5392:
>                break;
>        default:
>                ERROR(rt2x00dev, "Invalid RT chipset detected.\n");
> @@ -3965,6 +4068,7 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
>        case RF3052:
>        case RF3320:
>        case RF5370:
> +       case RF5372:
>        case RF5390:
>                break;
>        default:
> @@ -4271,6 +4375,7 @@ int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
>                   rt2x00_rf(rt2x00dev, RF3022) ||
>                   rt2x00_rf(rt2x00dev, RF3320) ||
>                   rt2x00_rf(rt2x00dev, RF5370) ||
> +                  rt2x00_rf(rt2x00dev, RF5372) ||
>                   rt2x00_rf(rt2x00dev, RF5390)) {
>                spec->num_channels = 14;
>                spec->channels = rf_vals_3x;
> diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c
> index 837b460..bf0f83c 100644
> --- a/drivers/net/wireless/rt2x00/rt2800pci.c
> +++ b/drivers/net/wireless/rt2x00/rt2800pci.c
> @@ -480,7 +480,8 @@ static int rt2800pci_init_registers(struct rt2x00_dev *rt2x00dev)
>
>        if (rt2x00_is_pcie(rt2x00dev) &&
>            (rt2x00_rt(rt2x00dev, RT3572) ||
> -            rt2x00_rt(rt2x00dev, RT5390))) {
> +            rt2x00_rt(rt2x00dev, RT5390) ||
> +            rt2x00_rt(rt2x00dev, RT5392))) {
>                rt2x00pci_register_read(rt2x00dev, AUX_CTRL, &reg);
>                rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1);
>                rt2x00_set_field32(&reg, AUX_CTRL_WAKE_PCIE_EN, 1);
> diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c
> index 7f21005..6565113 100644
> --- a/drivers/net/wireless/rt2x00/rt2800usb.c
> +++ b/drivers/net/wireless/rt2x00/rt2800usb.c
> @@ -1101,12 +1101,26 @@ static struct usb_device_id rt2800usb_device_table[] = {
>        { USB_DEVICE(0x5a57, 0x0284) },
>  #endif
>  #ifdef CONFIG_RT2800USB_RT53XX
> +       /* Alpha */
> +       { USB_DEVICE(0x2001, 0x3c15) },
> +       { USB_DEVICE(0x2001, 0x3c19) },
> +       /* Arcadyan */
> +       { USB_DEVICE(0x043e, 0x7a12) },
>        /* Azurewave */
>        { USB_DEVICE(0x13d3, 0x3329) },
>        { USB_DEVICE(0x13d3, 0x3365) },
> +       /* LG innotek */
> +       { USB_DEVICE(0x043e, 0x7a22) },
> +       /* Panasonic */
> +       { USB_DEVICE(0x04da, 0x1801) },
> +       { USB_DEVICE(0x04da, 0x1800) },
> +       /* Philips */
> +       { USB_DEVICE(0x0471, 0x2104) },
>        /* Ralink */
>        { USB_DEVICE(0x148f, 0x5370) },
>        { USB_DEVICE(0x148f, 0x5372) },
> +       /* Unknown */
> +       { USB_DEVICE(0x04da, 0x23f6) },
>  #endif
>  #ifdef CONFIG_RT2800USB_UNKNOWN
>        /*
> diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
> index b03b22c..bf743cd 100644
> --- a/drivers/net/wireless/rt2x00/rt2x00.h
> +++ b/drivers/net/wireless/rt2x00/rt2x00.h
> @@ -192,6 +192,7 @@ struct rt2x00_chip {
>  #define RT3593         0x3593
>  #define RT3883         0x3883  /* WSOC */
>  #define RT5390         0x5390  /* 2.4GHz */
> +#define RT5392         0x5392  /* 2.4GHz */
>
>        u16 rf;
>        u16 rev;
> --
> 1.7.6.5
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html



-- 
---
Gertjan

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH] rt2x00:Add RT5372 chipset support
@ 2012-02-16  5:32 John Li
  2012-02-17  7:31 ` Gertjan van Wingerde
  0 siblings, 1 reply; 10+ messages in thread
From: John Li @ 2012-02-16  5:32 UTC (permalink / raw)
  To: users; +Cc: linux-wireless, John Linville, John Li

From: John Li <chen-yang.li@mediatek.com>

Signed-off-by: John Li <chen-yang.li@mediatek.com>
---
 drivers/net/wireless/rt2x00/rt2800.h    |    1 +
 drivers/net/wireless/rt2x00/rt2800lib.c |  153 ++++++++++++++++++++++++++-----
 drivers/net/wireless/rt2x00/rt2800pci.c |    3 +-
 drivers/net/wireless/rt2x00/rt2800usb.c |   14 +++
 drivers/net/wireless/rt2x00/rt2x00.h    |    1 +
 5 files changed, 147 insertions(+), 25 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2800.h b/drivers/net/wireless/rt2x00/rt2800.h
index 2571a2f..56b78c8 100644
--- a/drivers/net/wireless/rt2x00/rt2800.h
+++ b/drivers/net/wireless/rt2x00/rt2800.h
@@ -68,6 +68,7 @@
 #define RF3322				0x000c
 #define RF3053				0x000d
 #define RF5370				0x5370
+#define RF5372				0x5372
 #define RF5390				0x5390
 
 /*
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index 22a1a8f..7c6c1b5 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -402,7 +402,8 @@ int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
 
 	if (rt2x00_is_pci(rt2x00dev)) {
 		if (rt2x00_rt(rt2x00dev, RT3572) ||
-		    rt2x00_rt(rt2x00dev, RT5390)) {
+		    rt2x00_rt(rt2x00dev, RT5390) ||
+		    rt2x00_rt(rt2x00dev, RT5392)) {
 			rt2800_register_read(rt2x00dev, AUX_CTRL, &reg);
 			rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1);
 			rt2x00_set_field32(&reg, AUX_CTRL_WAKE_PCIE_EN, 1);
@@ -1906,7 +1907,8 @@ static void rt2800_config_channel_rf53xx(struct rt2x00_dev *rt2x00dev,
 						   r55_nonbt_rev[idx]);
 				rt2800_rfcsr_write(rt2x00dev, 59,
 						   r59_nonbt_rev[idx]);
-			} else if (rt2x00_rt(rt2x00dev, RT5390)) {
+			} else if (rt2x00_rt(rt2x00dev, RT5390) ||
+					   rt2x00_rt(rt2x00dev, RT5392)) {
 				static const char r59_non_bt[] = {0x8f, 0x8f,
 					0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8d,
 					0x8a, 0x88, 0x88, 0x87, 0x87, 0x86};
@@ -1956,6 +1958,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
 		rt2800_config_channel_rf3052(rt2x00dev, conf, rf, info);
 		break;
 	case RF5370:
+	case RF5372:
 	case RF5390:
 		rt2800_config_channel_rf53xx(rt2x00dev, conf, rf, info);
 		break;
@@ -1972,7 +1975,8 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
 	rt2800_bbp_write(rt2x00dev, 86, 0);
 
 	if (rf->channel <= 14) {
-		if (!rt2x00_rt(rt2x00dev, RT5390)) {
+		if (!rt2x00_rt(rt2x00dev, RT5390) ||
+			!rt2x00_rt(rt2x00dev, RT5392)) {
 			if (test_bit(CAPABILITY_EXTERNAL_LNA_BG,
 				     &rt2x00dev->cap_flags)) {
 				rt2800_bbp_write(rt2x00dev, 82, 0x62);
@@ -2502,7 +2506,8 @@ static u8 rt2800_get_default_vgc(struct rt2x00_dev *rt2x00dev)
 		    rt2x00_rt(rt2x00dev, RT3071) ||
 		    rt2x00_rt(rt2x00dev, RT3090) ||
 		    rt2x00_rt(rt2x00dev, RT3390) ||
-		    rt2x00_rt(rt2x00dev, RT5390))
+		    rt2x00_rt(rt2x00dev, RT5390) ||
+		    rt2x00_rt(rt2x00dev, RT5392))
 			return 0x1c + (2 * rt2x00dev->lna_gain);
 		else
 			return 0x2e + rt2x00dev->lna_gain;
@@ -2637,7 +2642,8 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
 	} else if (rt2x00_rt(rt2x00dev, RT3572)) {
 		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400);
 		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
-	} else if (rt2x00_rt(rt2x00dev, RT5390)) {
+	} else if (rt2x00_rt(rt2x00dev, RT5390) ||
+			   rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
 		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
 		rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
@@ -3013,7 +3019,8 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
 		     rt2800_wait_bbp_ready(rt2x00dev)))
 		return -EACCES;
 
-	if (rt2x00_rt(rt2x00dev, RT5390)) {
+	if (rt2x00_rt(rt2x00dev, RT5390) ||
+		rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_bbp_read(rt2x00dev, 4, &value);
 		rt2x00_set_field8(&value, BBP4_MAC_IF_CTRL, 1);
 		rt2800_bbp_write(rt2x00dev, 4, value);
@@ -3021,19 +3028,22 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
 
 	if (rt2800_is_305x_soc(rt2x00dev) ||
 	    rt2x00_rt(rt2x00dev, RT3572) ||
-	    rt2x00_rt(rt2x00dev, RT5390))
+	    rt2x00_rt(rt2x00dev, RT5390) ||
+	    rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 31, 0x08);
 
 	rt2800_bbp_write(rt2x00dev, 65, 0x2c);
 	rt2800_bbp_write(rt2x00dev, 66, 0x38);
 
-	if (rt2x00_rt(rt2x00dev, RT5390))
+	if (rt2x00_rt(rt2x00dev, RT5390) ||
+		rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 68, 0x0b);
 
 	if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860C)) {
 		rt2800_bbp_write(rt2x00dev, 69, 0x16);
 		rt2800_bbp_write(rt2x00dev, 73, 0x12);
-	} else if (rt2x00_rt(rt2x00dev, RT5390)) {
+	} else if (rt2x00_rt(rt2x00dev, RT5390) ||
+			   rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_bbp_write(rt2x00dev, 69, 0x12);
 		rt2800_bbp_write(rt2x00dev, 73, 0x13);
 		rt2800_bbp_write(rt2x00dev, 75, 0x46);
@@ -3051,7 +3061,8 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
 	    rt2x00_rt(rt2x00dev, RT3090) ||
 	    rt2x00_rt(rt2x00dev, RT3390) ||
 	    rt2x00_rt(rt2x00dev, RT3572) ||
-	    rt2x00_rt(rt2x00dev, RT5390)) {
+	    rt2x00_rt(rt2x00dev, RT5390) ||
+	    rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_bbp_write(rt2x00dev, 79, 0x13);
 		rt2800_bbp_write(rt2x00dev, 80, 0x05);
 		rt2800_bbp_write(rt2x00dev, 81, 0x33);
@@ -3063,64 +3074,88 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
 	}
 
 	rt2800_bbp_write(rt2x00dev, 82, 0x62);
-	if (rt2x00_rt(rt2x00dev, RT5390))
+	if (rt2x00_rt(rt2x00dev, RT5390) ||
+		rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 83, 0x7a);
 	else
 		rt2800_bbp_write(rt2x00dev, 83, 0x6a);
 
 	if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860D))
 		rt2800_bbp_write(rt2x00dev, 84, 0x19);
-	else if (rt2x00_rt(rt2x00dev, RT5390))
+	else if (rt2x00_rt(rt2x00dev, RT5390) ||
+			 rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 84, 0x9a);
 	else
 		rt2800_bbp_write(rt2x00dev, 84, 0x99);
 
-	if (rt2x00_rt(rt2x00dev, RT5390))
+	if (rt2x00_rt(rt2x00dev, RT5390) ||
+		rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 86, 0x38);
 	else
 		rt2800_bbp_write(rt2x00dev, 86, 0x00);
 
+	if (rt2x00_rt(rt2x00dev, RT5392))
+		rt2800_bbp_write(rt2x00dev, 88, 0x90);
+
 	rt2800_bbp_write(rt2x00dev, 91, 0x04);
 
-	if (rt2x00_rt(rt2x00dev, RT5390))
+	if (rt2x00_rt(rt2x00dev, RT5390) ||
+		rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 92, 0x02);
 	else
 		rt2800_bbp_write(rt2x00dev, 92, 0x00);
 
+	if (rt2x00_rt(rt2x00dev, RT5392)) {
+		rt2800_bbp_write(rt2x00dev, 95, 0x9a);
+		rt2800_bbp_write(rt2x00dev, 98, 0x12);
+	}
+
 	if (rt2x00_rt_rev_gte(rt2x00dev, RT3070, REV_RT3070F) ||
 	    rt2x00_rt_rev_gte(rt2x00dev, RT3071, REV_RT3071E) ||
 	    rt2x00_rt_rev_gte(rt2x00dev, RT3090, REV_RT3090E) ||
 	    rt2x00_rt_rev_gte(rt2x00dev, RT3390, REV_RT3390E) ||
 	    rt2x00_rt(rt2x00dev, RT3572) ||
 	    rt2x00_rt(rt2x00dev, RT5390) ||
+	    rt2x00_rt(rt2x00dev, RT5392) ||
 	    rt2800_is_305x_soc(rt2x00dev))
 		rt2800_bbp_write(rt2x00dev, 103, 0xc0);
 	else
 		rt2800_bbp_write(rt2x00dev, 103, 0x00);
 
-	if (rt2x00_rt(rt2x00dev, RT5390))
+	if (rt2x00_rt(rt2x00dev, RT5390) ||
+		rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 104, 0x92);
 
 	if (rt2800_is_305x_soc(rt2x00dev))
 		rt2800_bbp_write(rt2x00dev, 105, 0x01);
-	else if (rt2x00_rt(rt2x00dev, RT5390))
+	else if (rt2x00_rt(rt2x00dev, RT5390) ||
+			 rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 105, 0x3c);
 	else
 		rt2800_bbp_write(rt2x00dev, 105, 0x05);
 
 	if (rt2x00_rt(rt2x00dev, RT5390))
 		rt2800_bbp_write(rt2x00dev, 106, 0x03);
+	else if (rt2x00_rt(rt2x00dev, RT5392))
+		rt2800_bbp_write(rt2x00dev, 106, 0x12);
 	else
 		rt2800_bbp_write(rt2x00dev, 106, 0x35);
 
-	if (rt2x00_rt(rt2x00dev, RT5390))
+	if (rt2x00_rt(rt2x00dev, RT5390) ||
+		rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 128, 0x12);
 
+	if (rt2x00_rt(rt2x00dev, RT5392)) {
+		rt2800_bbp_write(rt2x00dev, 134, 0xd0);
+		rt2800_bbp_write(rt2x00dev, 135, 0xf6);
+	}
+
 	if (rt2x00_rt(rt2x00dev, RT3071) ||
 	    rt2x00_rt(rt2x00dev, RT3090) ||
 	    rt2x00_rt(rt2x00dev, RT3390) ||
 	    rt2x00_rt(rt2x00dev, RT3572) ||
-	    rt2x00_rt(rt2x00dev, RT5390)) {
+	    rt2x00_rt(rt2x00dev, RT5390) ||
+	    rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_bbp_read(rt2x00dev, 138, &value);
 
 		rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &eeprom);
@@ -3132,7 +3167,8 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
 		rt2800_bbp_write(rt2x00dev, 138, value);
 	}
 
-	if (rt2x00_rt(rt2x00dev, RT5390)) {
+	if (rt2x00_rt(rt2x00dev, RT5390) ||
+		rt2x00_rt(rt2x00dev, RT5392)) {
 		int ant, div_mode;
 
 		rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom);
@@ -3258,13 +3294,15 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
 	    !rt2x00_rt(rt2x00dev, RT3390) &&
 	    !rt2x00_rt(rt2x00dev, RT3572) &&
 	    !rt2x00_rt(rt2x00dev, RT5390) &&
+	    !rt2x00_rt(rt2x00dev, RT5392) &&
 	    !rt2800_is_305x_soc(rt2x00dev))
 		return 0;
 
 	/*
 	 * Init RF calibration.
 	 */
-	if (rt2x00_rt(rt2x00dev, RT5390)) {
+	if (rt2x00_rt(rt2x00dev, RT5390) ||
+		rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_rfcsr_read(rt2x00dev, 2, &rfcsr);
 		rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 1);
 		rt2800_rfcsr_write(rt2x00dev, 2, rfcsr);
@@ -3482,6 +3520,66 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
 			rt2800_rfcsr_write(rt2x00dev, 61, 0xdd);
 		rt2800_rfcsr_write(rt2x00dev, 62, 0x00);
 		rt2800_rfcsr_write(rt2x00dev, 63, 0x00);
+	}	else if (rt2x00_rt(rt2x00dev, RT5392)) {
+			rt2800_rfcsr_write(rt2x00dev, 1, 0x17);
+			rt2800_rfcsr_write(rt2x00dev, 2, 0x80);
+			rt2800_rfcsr_write(rt2x00dev, 3, 0x88);
+			rt2800_rfcsr_write(rt2x00dev, 5, 0x10);
+			rt2800_rfcsr_write(rt2x00dev, 6, 0xe0);
+			rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 10, 0x53);
+			rt2800_rfcsr_write(rt2x00dev, 11, 0x4a);
+			rt2800_rfcsr_write(rt2x00dev, 12, 0x46);
+			rt2800_rfcsr_write(rt2x00dev, 13, 0x9f);
+			rt2800_rfcsr_write(rt2x00dev, 14, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 15, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 16, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 18, 0x03);
+			rt2800_rfcsr_write(rt2x00dev, 19, 0x4d);
+			rt2800_rfcsr_write(rt2x00dev, 20, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 21, 0x8d);
+			rt2800_rfcsr_write(rt2x00dev, 22, 0x20);
+			rt2800_rfcsr_write(rt2x00dev, 23, 0x0b);
+			rt2800_rfcsr_write(rt2x00dev, 24, 0x44);
+			rt2800_rfcsr_write(rt2x00dev, 25, 0x80);
+			rt2800_rfcsr_write(rt2x00dev, 26, 0x82);
+			rt2800_rfcsr_write(rt2x00dev, 27, 0x09);
+			rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 29, 0x10);
+			rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
+			rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
+			rt2800_rfcsr_write(rt2x00dev, 32, 0x20);
+			rt2800_rfcsr_write(rt2x00dev, 33, 0xC0);
+			rt2800_rfcsr_write(rt2x00dev, 34, 0x07);
+			rt2800_rfcsr_write(rt2x00dev, 35, 0x12);
+			rt2800_rfcsr_write(rt2x00dev, 36, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 37, 0x08);
+			rt2800_rfcsr_write(rt2x00dev, 38, 0x89);
+			rt2800_rfcsr_write(rt2x00dev, 39, 0x1b);
+			rt2800_rfcsr_write(rt2x00dev, 40, 0x0f);
+			rt2800_rfcsr_write(rt2x00dev, 41, 0xbb);
+			rt2800_rfcsr_write(rt2x00dev, 42, 0xd5);
+			rt2800_rfcsr_write(rt2x00dev, 43, 0x9b);
+			rt2800_rfcsr_write(rt2x00dev, 44, 0x0e);
+			rt2800_rfcsr_write(rt2x00dev, 45, 0xa2);
+			rt2800_rfcsr_write(rt2x00dev, 46, 0x73);
+			rt2800_rfcsr_write(rt2x00dev, 47, 0x0c);
+			rt2800_rfcsr_write(rt2x00dev, 48, 0x10);
+			rt2800_rfcsr_write(rt2x00dev, 49, 0x94);
+			rt2800_rfcsr_write(rt2x00dev, 50, 0x94);
+			rt2800_rfcsr_write(rt2x00dev, 51, 0x3a);
+			rt2800_rfcsr_write(rt2x00dev, 52, 0x48);
+			rt2800_rfcsr_write(rt2x00dev, 53, 0x44);
+			rt2800_rfcsr_write(rt2x00dev, 54, 0x38);
+			rt2800_rfcsr_write(rt2x00dev, 55, 0x43);
+			rt2800_rfcsr_write(rt2x00dev, 56, 0xa1);
+			rt2800_rfcsr_write(rt2x00dev, 57, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 58, 0x39);
+			rt2800_rfcsr_write(rt2x00dev, 59, 0x07);
+			rt2800_rfcsr_write(rt2x00dev, 60, 0x45);
+			rt2800_rfcsr_write(rt2x00dev, 61, 0x91);
+			rt2800_rfcsr_write(rt2x00dev, 62, 0x39);
+			rt2800_rfcsr_write(rt2x00dev, 63, 0x07);
 	}
 
 	if (rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070F)) {
@@ -3549,7 +3647,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
 			rt2800_init_rx_filter(rt2x00dev, true, 0x27, 0x15);
 	}
 
-	if (!rt2x00_rt(rt2x00dev, RT5390)) {
+	if (!rt2x00_rt(rt2x00dev, RT5390) ||
+		!rt2x00_rt(rt2x00dev, RT5392)) {
 		/*
 		 * Set back to initial state
 		 */
@@ -3577,7 +3676,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
 	rt2x00_set_field32(&reg, OPT_14_CSR_BIT0, 1);
 	rt2800_register_write(rt2x00dev, OPT_14_CSR, reg);
 
-	if (!rt2x00_rt(rt2x00dev, RT5390)) {
+	if (!rt2x00_rt(rt2x00dev, RT5390) ||
+		!rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_rfcsr_read(rt2x00dev, 17, &rfcsr);
 		rt2x00_set_field8(&rfcsr, RFCSR17_TX_LO1_EN, 0);
 		if (rt2x00_rt(rt2x00dev, RT3070) ||
@@ -3645,7 +3745,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
 		rt2800_rfcsr_write(rt2x00dev, 27, rfcsr);
 	}
 
-	if (rt2x00_rt(rt2x00dev, RT5390)) {
+	if (rt2x00_rt(rt2x00dev, RT5390) ||
+		rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_rfcsr_read(rt2x00dev, 38, &rfcsr);
 		rt2x00_set_field8(&rfcsr, RFCSR38_RX_LO1_EN, 0);
 		rt2800_rfcsr_write(rt2x00dev, 38, rfcsr);
@@ -3929,7 +4030,8 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
 	 * RT53xx: defined in "EEPROM_CHIP_ID" field
 	 */
 	rt2800_register_read(rt2x00dev, MAC_CSR0, &reg);
-	if (rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5390)
+	if (rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5390 ||
+		rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5392)
 		rt2x00_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &value);
 	else
 		value = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);
@@ -3947,6 +4049,7 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
 	case RT3390:
 	case RT3572:
 	case RT5390:
+	case RT5392:
 		break;
 	default:
 		ERROR(rt2x00dev, "Invalid RT chipset detected.\n");
@@ -3965,6 +4068,7 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
 	case RF3052:
 	case RF3320:
 	case RF5370:
+	case RF5372:
 	case RF5390:
 		break;
 	default:
@@ -4271,6 +4375,7 @@ int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
 		   rt2x00_rf(rt2x00dev, RF3022) ||
 		   rt2x00_rf(rt2x00dev, RF3320) ||
 		   rt2x00_rf(rt2x00dev, RF5370) ||
+		   rt2x00_rf(rt2x00dev, RF5372) ||
 		   rt2x00_rf(rt2x00dev, RF5390)) {
 		spec->num_channels = 14;
 		spec->channels = rf_vals_3x;
diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c
index 837b460..bf0f83c 100644
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
@@ -480,7 +480,8 @@ static int rt2800pci_init_registers(struct rt2x00_dev *rt2x00dev)
 
 	if (rt2x00_is_pcie(rt2x00dev) &&
 	    (rt2x00_rt(rt2x00dev, RT3572) ||
-	     rt2x00_rt(rt2x00dev, RT5390))) {
+	     rt2x00_rt(rt2x00dev, RT5390) ||
+	     rt2x00_rt(rt2x00dev, RT5392))) {
 		rt2x00pci_register_read(rt2x00dev, AUX_CTRL, &reg);
 		rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1);
 		rt2x00_set_field32(&reg, AUX_CTRL_WAKE_PCIE_EN, 1);
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c
index 7f21005..6565113 100644
--- a/drivers/net/wireless/rt2x00/rt2800usb.c
+++ b/drivers/net/wireless/rt2x00/rt2800usb.c
@@ -1101,12 +1101,26 @@ static struct usb_device_id rt2800usb_device_table[] = {
 	{ USB_DEVICE(0x5a57, 0x0284) },
 #endif
 #ifdef CONFIG_RT2800USB_RT53XX
+	/* Alpha */
+	{ USB_DEVICE(0x2001, 0x3c15) },
+	{ USB_DEVICE(0x2001, 0x3c19) },
+	/* Arcadyan */
+	{ USB_DEVICE(0x043e, 0x7a12) },
 	/* Azurewave */
 	{ USB_DEVICE(0x13d3, 0x3329) },
 	{ USB_DEVICE(0x13d3, 0x3365) },
+	/* LG innotek */
+	{ USB_DEVICE(0x043e, 0x7a22) },
+	/* Panasonic */
+	{ USB_DEVICE(0x04da, 0x1801) },
+	{ USB_DEVICE(0x04da, 0x1800) },
+	/* Philips */
+	{ USB_DEVICE(0x0471, 0x2104) },
 	/* Ralink */
 	{ USB_DEVICE(0x148f, 0x5370) },
 	{ USB_DEVICE(0x148f, 0x5372) },
+	/* Unknown */
+	{ USB_DEVICE(0x04da, 0x23f6) },
 #endif
 #ifdef CONFIG_RT2800USB_UNKNOWN
 	/*
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
index b03b22c..bf743cd 100644
--- a/drivers/net/wireless/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
@@ -192,6 +192,7 @@ struct rt2x00_chip {
 #define RT3593		0x3593
 #define RT3883		0x3883	/* WSOC */
 #define RT5390		0x5390  /* 2.4GHz */
+#define RT5392		0x5392  /* 2.4GHz */
 
 	u16 rf;
 	u16 rev;
-- 
1.7.6.5


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH] rt2x00:Add RT5372 chipset support
  2012-02-08 13:00 John Li
  2012-02-08 13:44 ` Helmut Schaa
@ 2012-02-08 22:34 ` Gertjan van Wingerde
  1 sibling, 0 replies; 10+ messages in thread
From: Gertjan van Wingerde @ 2012-02-08 22:34 UTC (permalink / raw)
  To: John Li; +Cc: users, linux-wireless, John Linville, John Li

Hi John,

On 02/08/12 14:00, John Li wrote:
> From: John Li <chen-yang.li@mediatek.com>
> 
> Signed-off-by: John Li <chen-yang.li@mediatek.com>

In addition to Helmut and Stanislaw, here are also some nitpicks and one
more serious question / comment from me.

> ---
>  drivers/net/wireless/rt2x00/rt2800.h    |    1 +
>  drivers/net/wireless/rt2x00/rt2800lib.c |  157 ++++++++++++++++++++++++++-----
>  drivers/net/wireless/rt2x00/rt2800pci.c |    3 +-
>  drivers/net/wireless/rt2x00/rt2800usb.c |   14 +++
>  drivers/net/wireless/rt2x00/rt2x00.h    |    2 +
>  5 files changed, 152 insertions(+), 25 deletions(-)
> 

<snip>

> diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
> index 22a1a8f..852b57e 100644
> --- a/drivers/net/wireless/rt2x00/rt2800lib.c
> +++ b/drivers/net/wireless/rt2x00/rt2800lib.c

<snip>

> @@ -3482,6 +3522,67 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
>  			rt2800_rfcsr_write(rt2x00dev, 61, 0xdd);
>  		rt2800_rfcsr_write(rt2x00dev, 62, 0x00);
>  		rt2800_rfcsr_write(rt2x00dev, 63, 0x00);
> +	}	else if (rt2x00_rt(rt2x00dev, RT5392) || 
> +			rt2x00_rt(rt2x00dev, RT5372)) {

I would prefer it here if you could list the checks in the numeric order
of the RT chipset (so just switch the two checks).

> +			rt2800_rfcsr_write(rt2x00dev, 1, 0x17);
> +			rt2800_rfcsr_write(rt2x00dev, 2, 0x80);
> +			rt2800_rfcsr_write(rt2x00dev, 3, 0x88);
> +			rt2800_rfcsr_write(rt2x00dev, 5, 0x10);
> +			rt2800_rfcsr_write(rt2x00dev, 6, 0xe0);
> +			rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
> +			rt2800_rfcsr_write(rt2x00dev, 10, 0x53);
> +			rt2800_rfcsr_write(rt2x00dev, 11, 0x4a);
> +			rt2800_rfcsr_write(rt2x00dev, 12, 0x46);
> +			rt2800_rfcsr_write(rt2x00dev, 13, 0x9f);
> +			rt2800_rfcsr_write(rt2x00dev, 14, 0x00);
> +			rt2800_rfcsr_write(rt2x00dev, 15, 0x00);
> +			rt2800_rfcsr_write(rt2x00dev, 16, 0x00);
> +			rt2800_rfcsr_write(rt2x00dev, 18, 0x03);
> +			rt2800_rfcsr_write(rt2x00dev, 19, 0x4d);
> +			rt2800_rfcsr_write(rt2x00dev, 20, 0x00);
> +			rt2800_rfcsr_write(rt2x00dev, 21, 0x8d);
> +			rt2800_rfcsr_write(rt2x00dev, 22, 0x20);
> +			rt2800_rfcsr_write(rt2x00dev, 23, 0x0b);
> +			rt2800_rfcsr_write(rt2x00dev, 24, 0x44);
> +			rt2800_rfcsr_write(rt2x00dev, 25, 0x80);
> +			rt2800_rfcsr_write(rt2x00dev, 26, 0x82);
> +			rt2800_rfcsr_write(rt2x00dev, 27, 0x09);
> +			rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
> +			rt2800_rfcsr_write(rt2x00dev, 29, 0x10);
> +			rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
> +			rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
> +			rt2800_rfcsr_write(rt2x00dev, 32, 0x20);
> +			rt2800_rfcsr_write(rt2x00dev, 33, 0xC0);
> +			rt2800_rfcsr_write(rt2x00dev, 34, 0x07);
> +			rt2800_rfcsr_write(rt2x00dev, 35, 0x12);
> +			rt2800_rfcsr_write(rt2x00dev, 36, 0x00);
> +			rt2800_rfcsr_write(rt2x00dev, 37, 0x08);
> +			rt2800_rfcsr_write(rt2x00dev, 38, 0x89);
> +			rt2800_rfcsr_write(rt2x00dev, 39, 0x1b);
> +			rt2800_rfcsr_write(rt2x00dev, 40, 0x0f);
> +			rt2800_rfcsr_write(rt2x00dev, 41, 0xbb);
> +			rt2800_rfcsr_write(rt2x00dev, 42, 0xd5);
> +			rt2800_rfcsr_write(rt2x00dev, 43, 0x9b);
> +			rt2800_rfcsr_write(rt2x00dev, 44, 0x0e);
> +			rt2800_rfcsr_write(rt2x00dev, 45, 0xa2);
> +			rt2800_rfcsr_write(rt2x00dev, 46, 0x73);
> +			rt2800_rfcsr_write(rt2x00dev, 47, 0x0c);
> +			rt2800_rfcsr_write(rt2x00dev, 48, 0x10);
> +			rt2800_rfcsr_write(rt2x00dev, 49, 0x94);
> +			rt2800_rfcsr_write(rt2x00dev, 50, 0x94);
> +			rt2800_rfcsr_write(rt2x00dev, 51, 0x3a);
> +			rt2800_rfcsr_write(rt2x00dev, 52, 0x48);
> +			rt2800_rfcsr_write(rt2x00dev, 53, 0x44);
> +			rt2800_rfcsr_write(rt2x00dev, 54, 0x38);
> +			rt2800_rfcsr_write(rt2x00dev, 55, 0x43);
> +			rt2800_rfcsr_write(rt2x00dev, 56, 0xa1);
> +			rt2800_rfcsr_write(rt2x00dev, 57, 0x00);
> +			rt2800_rfcsr_write(rt2x00dev, 58, 0x39);
> +			rt2800_rfcsr_write(rt2x00dev, 59, 0x07);
> +			rt2800_rfcsr_write(rt2x00dev, 60, 0x45);
> +			rt2800_rfcsr_write(rt2x00dev, 61, 0x91);
> +			rt2800_rfcsr_write(rt2x00dev, 62, 0x39);
> +			rt2800_rfcsr_write(rt2x00dev, 63, 0x07);
>  	}
>  
>  	if (rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070F)) {

<snip>

> @@ -3947,6 +4052,8 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
>  	case RT3390:
>  	case RT3572:
>  	case RT5390:
> +	case RT5392:
> +	case RT5372:
>  		break;
>  	default:
>  		ERROR(rt2x00dev, "Invalid RT chipset detected.\n");

Again, please put the RT chipset numbers in numeric order here.

> @@ -3966,6 +4073,7 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
>  	case RF3320:
>  	case RF5370:
>  	case RF5390:
> +	case RF5372:
>  		break;
>  	default:
>  		ERROR(rt2x00dev, "Invalid RF chipset 0x%x detected.\n",

Same here

<snip>

> diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c
> index 7f21005..c8619eb 100644
> --- a/drivers/net/wireless/rt2x00/rt2800usb.c
> +++ b/drivers/net/wireless/rt2x00/rt2800usb.c
> @@ -1107,6 +1107,20 @@ static struct usb_device_id rt2800usb_device_table[] = {
>  	/* Ralink */
>  	{ USB_DEVICE(0x148f, 0x5370) },
>  	{ USB_DEVICE(0x148f, 0x5372) },
> +	/* Alpha */
> +	{ USB_DEVICE(0x2001, 0x3c15) },
> +	{ USB_DEVICE(0x2001, 0x3c19) },
> +	/* Arcadyan */
> +	{ USB_DEVICE(0x043e, 0x7a12) },
> +	/* LG innotek */
> +	{ USB_DEVICE(0x043e, 0x7a22) },
> +	/* Panasonic */
> +	{ USB_DEVICE(0x04da, 0x1801) },
> +	{ USB_DEVICE(0x04da, 0x1800) },
> +	/* Unknown */
> +	{ USB_DEVICE(0x04da, 0x23f6) },
> +	/* Philips */
> +	{ USB_DEVICE(0x0471, 0x2104) },
>  #endif
>  #ifdef CONFIG_RT2800USB_UNKNOWN
>  	/*

Could you please insert these devices in the list in the correct
alphabetical ordering with respect to the vendor name (the one that is
in the comment above the USB device IDs)?

> diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
> index b03b22c..7bc5cee 100644
> --- a/drivers/net/wireless/rt2x00/rt2x00.h
> +++ b/drivers/net/wireless/rt2x00/rt2x00.h
> @@ -192,6 +192,8 @@ struct rt2x00_chip {
>  #define RT3593		0x3593
>  #define RT3883		0x3883	/* WSOC */
>  #define RT5390		0x5390  /* 2.4GHz */
> +#define RT5392		0x5392  /* 2.4GHz */
> +#define RT5372		0x5372  /* 2.4GHz */
>  
>  	u16 rf;
>  	u16 rev;

Again, please insert the RT chipset in the correct numeric order.

Also, a question from my side on the RT5372 chipset define here (and the
chip in general). The define is actually only used twice in the entire
patch, while the RT5392 define is used all over the place. In my
experience with Ralink chipsets this has not happened before (i.e.
needing a lot of code for the PCI / PCIe devices that is not needed for
USB devices). Are you sure that your patch is correct with respect to
this RT5372 chipset define?


---
Gertjan

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] rt2x00:Add RT5372 chipset support
  2012-02-08 13:00 John Li
@ 2012-02-08 13:44 ` Helmut Schaa
  2012-02-08 22:34 ` Gertjan van Wingerde
  1 sibling, 0 replies; 10+ messages in thread
From: Helmut Schaa @ 2012-02-08 13:44 UTC (permalink / raw)
  To: John Li; +Cc: users, linux-wireless, John Linville, John Li

2012/2/8 John Li <john.li.mediatek@gmail.com>:
> From: John Li <chen-yang.li@mediatek.com>
>
> Signed-off-by: John Li <chen-yang.li@mediatek.com>
> ---
>  drivers/net/wireless/rt2x00/rt2800.h    |    1 +
>  drivers/net/wireless/rt2x00/rt2800lib.c |  157 ++++++++++++++++++++++++++-----
>  drivers/net/wireless/rt2x00/rt2800pci.c |    3 +-
>  drivers/net/wireless/rt2x00/rt2800usb.c |   14 +++
>  drivers/net/wireless/rt2x00/rt2x00.h    |    2 +
>  5 files changed, 152 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/net/wireless/rt2x00/rt2800.h b/drivers/net/wireless/rt2x00/rt2800.h
> index 2571a2f..56b78c8 100644
> --- a/drivers/net/wireless/rt2x00/rt2800.h
> +++ b/drivers/net/wireless/rt2x00/rt2800.h
> @@ -68,6 +68,7 @@
>  #define RF3322                         0x000c
>  #define RF3053                         0x000d
>  #define RF5370                         0x5370
> +#define RF5372                         0x5372
>  #define RF5390                         0x5390
>
>  /*
> diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
> index 22a1a8f..852b57e 100644
> --- a/drivers/net/wireless/rt2x00/rt2800lib.c
> +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
> @@ -402,7 +402,8 @@ int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
>
>        if (rt2x00_is_pci(rt2x00dev)) {
>                if (rt2x00_rt(rt2x00dev, RT3572) ||
> -                   rt2x00_rt(rt2x00dev, RT5390)) {
> +                   rt2x00_rt(rt2x00dev, RT5390) ||
> +                   rt2x00_rt(rt2x00dev, RT5392)) {
>                        rt2800_register_read(rt2x00dev, AUX_CTRL, &reg);
>                        rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1);
>                        rt2x00_set_field32(&reg, AUX_CTRL_WAKE_PCIE_EN, 1);
> @@ -1906,7 +1907,8 @@ static void rt2800_config_channel_rf53xx(struct rt2x00_dev *rt2x00dev,
>                                                   r55_nonbt_rev[idx]);
>                                rt2800_rfcsr_write(rt2x00dev, 59,
>                                                   r59_nonbt_rev[idx]);
> -                       } else if (rt2x00_rt(rt2x00dev, RT5390)) {
> +                       } else if (rt2x00_rt(rt2x00dev, RT5390) ||
> +                                          rt2x00_rt(rt2x00dev, RT5392)) {
>                                static const char r59_non_bt[] = {0x8f, 0x8f,
>                                        0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8d,
>                                        0x8a, 0x88, 0x88, 0x87, 0x87, 0x86};
> @@ -1956,6 +1958,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
>                rt2800_config_channel_rf3052(rt2x00dev, conf, rf, info);
>                break;
>        case RF5370:
> +       case RF5372:
>        case RF5390:
>                rt2800_config_channel_rf53xx(rt2x00dev, conf, rf, info);
>                break;
> @@ -1972,7 +1975,8 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
>        rt2800_bbp_write(rt2x00dev, 86, 0);
>
>        if (rf->channel <= 14) {
> -               if (!rt2x00_rt(rt2x00dev, RT5390)) {
> +               if (!rt2x00_rt(rt2x00dev, RT5390) ||
> +                       !rt2x00_rt(rt2x00dev, RT5392)) {
>                        if (test_bit(CAPABILITY_EXTERNAL_LNA_BG,
>                                     &rt2x00dev->cap_flags)) {
>                                rt2800_bbp_write(rt2x00dev, 82, 0x62);
> @@ -2502,7 +2506,8 @@ static u8 rt2800_get_default_vgc(struct rt2x00_dev *rt2x00dev)
>                    rt2x00_rt(rt2x00dev, RT3071) ||
>                    rt2x00_rt(rt2x00dev, RT3090) ||
>                    rt2x00_rt(rt2x00dev, RT3390) ||
> -                   rt2x00_rt(rt2x00dev, RT5390))
> +                   rt2x00_rt(rt2x00dev, RT5390) ||
> +                   rt2x00_rt(rt2x00dev, RT5392))
>                        return 0x1c + (2 * rt2x00dev->lna_gain);
>                else
>                        return 0x2e + rt2x00dev->lna_gain;
> @@ -2637,7 +2642,8 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
>        } else if (rt2x00_rt(rt2x00dev, RT3572)) {
>                rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400);
>                rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
> -       } else if (rt2x00_rt(rt2x00dev, RT5390)) {
> +       } else if (rt2x00_rt(rt2x00dev, RT5390) ||
> +                          rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
>                rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
>                rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
> @@ -3013,7 +3019,8 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
>                     rt2800_wait_bbp_ready(rt2x00dev)))
>                return -EACCES;
>
> -       if (rt2x00_rt(rt2x00dev, RT5390)) {
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_bbp_read(rt2x00dev, 4, &value);
>                rt2x00_set_field8(&value, BBP4_MAC_IF_CTRL, 1);
>                rt2800_bbp_write(rt2x00dev, 4, value);
> @@ -3021,19 +3028,22 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
>
>        if (rt2800_is_305x_soc(rt2x00dev) ||
>            rt2x00_rt(rt2x00dev, RT3572) ||
> -           rt2x00_rt(rt2x00dev, RT5390))
> +           rt2x00_rt(rt2x00dev, RT5390) ||
> +           rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 31, 0x08);
>
>        rt2800_bbp_write(rt2x00dev, 65, 0x2c);
>        rt2800_bbp_write(rt2x00dev, 66, 0x38);
>
> -       if (rt2x00_rt(rt2x00dev, RT5390))
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 68, 0x0b);
>
>        if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860C)) {
>                rt2800_bbp_write(rt2x00dev, 69, 0x16);
>                rt2800_bbp_write(rt2x00dev, 73, 0x12);
> -       } else if (rt2x00_rt(rt2x00dev, RT5390)) {
> +       } else if (rt2x00_rt(rt2x00dev, RT5390) ||
> +                          rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_bbp_write(rt2x00dev, 69, 0x12);
>                rt2800_bbp_write(rt2x00dev, 73, 0x13);
>                rt2800_bbp_write(rt2x00dev, 75, 0x46);
> @@ -3051,7 +3061,8 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
>            rt2x00_rt(rt2x00dev, RT3090) ||
>            rt2x00_rt(rt2x00dev, RT3390) ||
>            rt2x00_rt(rt2x00dev, RT3572) ||
> -           rt2x00_rt(rt2x00dev, RT5390)) {
> +           rt2x00_rt(rt2x00dev, RT5390) ||
> +           rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_bbp_write(rt2x00dev, 79, 0x13);
>                rt2800_bbp_write(rt2x00dev, 80, 0x05);
>                rt2800_bbp_write(rt2x00dev, 81, 0x33);
> @@ -3063,64 +3074,90 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
>        }
>
>        rt2800_bbp_write(rt2x00dev, 82, 0x62);
> -       if (rt2x00_rt(rt2x00dev, RT5390))
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 83, 0x7a);
>        else
>                rt2800_bbp_write(rt2x00dev, 83, 0x6a);
>
>        if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860D))
>                rt2800_bbp_write(rt2x00dev, 84, 0x19);
> -       else if (rt2x00_rt(rt2x00dev, RT5390))
> +       else if (rt2x00_rt(rt2x00dev, RT5390) ||
> +                        rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 84, 0x9a);
>        else
>                rt2800_bbp_write(rt2x00dev, 84, 0x99);
>
> -       if (rt2x00_rt(rt2x00dev, RT5390))
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 86, 0x38);
>        else
>                rt2800_bbp_write(rt2x00dev, 86, 0x00);
>
> +       if (rt2x00_rt(rt2x00dev, RT5392))
> +               rt2800_bbp_write(rt2x00dev, 88, 0x90);
> +
>        rt2800_bbp_write(rt2x00dev, 91, 0x04);
>
> -       if (rt2x00_rt(rt2x00dev, RT5390))
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 92, 0x02);
>        else
>                rt2800_bbp_write(rt2x00dev, 92, 0x00);
>
> +       if (rt2x00_rt(rt2x00dev, RT5392))
> +       {
> +               rt2800_bbp_write(rt2x00dev, 95, 0x9a);
> +               rt2800_bbp_write(rt2x00dev, 98, 0x12);
> +       }
> +

Coding style, please put the brace into the same line as the if clause.

>        if (rt2x00_rt_rev_gte(rt2x00dev, RT3070, REV_RT3070F) ||
>            rt2x00_rt_rev_gte(rt2x00dev, RT3071, REV_RT3071E) ||
>            rt2x00_rt_rev_gte(rt2x00dev, RT3090, REV_RT3090E) ||
>            rt2x00_rt_rev_gte(rt2x00dev, RT3390, REV_RT3390E) ||
>            rt2x00_rt(rt2x00dev, RT3572) ||
>            rt2x00_rt(rt2x00dev, RT5390) ||
> +           rt2x00_rt(rt2x00dev, RT5392) ||
>            rt2800_is_305x_soc(rt2x00dev))
>                rt2800_bbp_write(rt2x00dev, 103, 0xc0);
>        else
>                rt2800_bbp_write(rt2x00dev, 103, 0x00);
>
> -       if (rt2x00_rt(rt2x00dev, RT5390))
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 104, 0x92);
>
>        if (rt2800_is_305x_soc(rt2x00dev))
>                rt2800_bbp_write(rt2x00dev, 105, 0x01);
> -       else if (rt2x00_rt(rt2x00dev, RT5390))
> +       else if (rt2x00_rt(rt2x00dev, RT5390) ||
> +                        rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 105, 0x3c);
>        else
>                rt2800_bbp_write(rt2x00dev, 105, 0x05);
>
>        if (rt2x00_rt(rt2x00dev, RT5390))
>                rt2800_bbp_write(rt2x00dev, 106, 0x03);
> +       else if (rt2x00_rt(rt2x00dev, RT5392))
> +               rt2800_bbp_write(rt2x00dev, 106, 0x12);
>        else
>                rt2800_bbp_write(rt2x00dev, 106, 0x35);
>
> -       if (rt2x00_rt(rt2x00dev, RT5390))
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392))
>                rt2800_bbp_write(rt2x00dev, 128, 0x12);
>
> +       if (rt2x00_rt(rt2x00dev, RT5392))
> +       {
> +               rt2800_bbp_write(rt2x00dev, 134, 0xd0);
> +               rt2800_bbp_write(rt2x00dev, 135, 0xf6);
> +       }
> +

Same here.

>        if (rt2x00_rt(rt2x00dev, RT3071) ||
>            rt2x00_rt(rt2x00dev, RT3090) ||
>            rt2x00_rt(rt2x00dev, RT3390) ||
>            rt2x00_rt(rt2x00dev, RT3572) ||
> -           rt2x00_rt(rt2x00dev, RT5390)) {
> +           rt2x00_rt(rt2x00dev, RT5390) ||
> +           rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_bbp_read(rt2x00dev, 138, &value);
>
>                rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &eeprom);
> @@ -3132,7 +3169,8 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
>                rt2800_bbp_write(rt2x00dev, 138, value);
>        }
>
> -       if (rt2x00_rt(rt2x00dev, RT5390)) {
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392)) {
>                int ant, div_mode;
>
>                rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom);
> @@ -3258,13 +3296,15 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
>            !rt2x00_rt(rt2x00dev, RT3390) &&
>            !rt2x00_rt(rt2x00dev, RT3572) &&
>            !rt2x00_rt(rt2x00dev, RT5390) &&
> +           !rt2x00_rt(rt2x00dev, RT5392) &&
>            !rt2800_is_305x_soc(rt2x00dev))
>                return 0;
>
>        /*
>         * Init RF calibration.
>         */
> -       if (rt2x00_rt(rt2x00dev, RT5390)) {
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_rfcsr_read(rt2x00dev, 2, &rfcsr);
>                rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 1);
>                rt2800_rfcsr_write(rt2x00dev, 2, rfcsr);
> @@ -3482,6 +3522,67 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
>                        rt2800_rfcsr_write(rt2x00dev, 61, 0xdd);
>                rt2800_rfcsr_write(rt2x00dev, 62, 0x00);
>                rt2800_rfcsr_write(rt2x00dev, 63, 0x00);
> +       }       else if (rt2x00_rt(rt2x00dev, RT5392) ||
> +                       rt2x00_rt(rt2x00dev, RT5372)) {

You've done it right here :)

> +                       rt2800_rfcsr_write(rt2x00dev, 1, 0x17);
> +                       rt2800_rfcsr_write(rt2x00dev, 2, 0x80);
> +                       rt2800_rfcsr_write(rt2x00dev, 3, 0x88);
> +                       rt2800_rfcsr_write(rt2x00dev, 5, 0x10);
> +                       rt2800_rfcsr_write(rt2x00dev, 6, 0xe0);
> +                       rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 10, 0x53);
> +                       rt2800_rfcsr_write(rt2x00dev, 11, 0x4a);
> +                       rt2800_rfcsr_write(rt2x00dev, 12, 0x46);
> +                       rt2800_rfcsr_write(rt2x00dev, 13, 0x9f);
> +                       rt2800_rfcsr_write(rt2x00dev, 14, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 15, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 16, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 18, 0x03);
> +                       rt2800_rfcsr_write(rt2x00dev, 19, 0x4d);
> +                       rt2800_rfcsr_write(rt2x00dev, 20, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 21, 0x8d);
> +                       rt2800_rfcsr_write(rt2x00dev, 22, 0x20);
> +                       rt2800_rfcsr_write(rt2x00dev, 23, 0x0b);
> +                       rt2800_rfcsr_write(rt2x00dev, 24, 0x44);
> +                       rt2800_rfcsr_write(rt2x00dev, 25, 0x80);
> +                       rt2800_rfcsr_write(rt2x00dev, 26, 0x82);
> +                       rt2800_rfcsr_write(rt2x00dev, 27, 0x09);
> +                       rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 29, 0x10);
> +                       rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
> +                       rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
> +                       rt2800_rfcsr_write(rt2x00dev, 32, 0x20);
> +                       rt2800_rfcsr_write(rt2x00dev, 33, 0xC0);
> +                       rt2800_rfcsr_write(rt2x00dev, 34, 0x07);
> +                       rt2800_rfcsr_write(rt2x00dev, 35, 0x12);
> +                       rt2800_rfcsr_write(rt2x00dev, 36, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 37, 0x08);
> +                       rt2800_rfcsr_write(rt2x00dev, 38, 0x89);
> +                       rt2800_rfcsr_write(rt2x00dev, 39, 0x1b);
> +                       rt2800_rfcsr_write(rt2x00dev, 40, 0x0f);
> +                       rt2800_rfcsr_write(rt2x00dev, 41, 0xbb);
> +                       rt2800_rfcsr_write(rt2x00dev, 42, 0xd5);
> +                       rt2800_rfcsr_write(rt2x00dev, 43, 0x9b);
> +                       rt2800_rfcsr_write(rt2x00dev, 44, 0x0e);
> +                       rt2800_rfcsr_write(rt2x00dev, 45, 0xa2);
> +                       rt2800_rfcsr_write(rt2x00dev, 46, 0x73);
> +                       rt2800_rfcsr_write(rt2x00dev, 47, 0x0c);
> +                       rt2800_rfcsr_write(rt2x00dev, 48, 0x10);
> +                       rt2800_rfcsr_write(rt2x00dev, 49, 0x94);
> +                       rt2800_rfcsr_write(rt2x00dev, 50, 0x94);
> +                       rt2800_rfcsr_write(rt2x00dev, 51, 0x3a);
> +                       rt2800_rfcsr_write(rt2x00dev, 52, 0x48);
> +                       rt2800_rfcsr_write(rt2x00dev, 53, 0x44);
> +                       rt2800_rfcsr_write(rt2x00dev, 54, 0x38);
> +                       rt2800_rfcsr_write(rt2x00dev, 55, 0x43);
> +                       rt2800_rfcsr_write(rt2x00dev, 56, 0xa1);
> +                       rt2800_rfcsr_write(rt2x00dev, 57, 0x00);
> +                       rt2800_rfcsr_write(rt2x00dev, 58, 0x39);
> +                       rt2800_rfcsr_write(rt2x00dev, 59, 0x07);
> +                       rt2800_rfcsr_write(rt2x00dev, 60, 0x45);
> +                       rt2800_rfcsr_write(rt2x00dev, 61, 0x91);
> +                       rt2800_rfcsr_write(rt2x00dev, 62, 0x39);
> +                       rt2800_rfcsr_write(rt2x00dev, 63, 0x07);
>        }
>
>        if (rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070F)) {
> @@ -3549,7 +3650,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
>                        rt2800_init_rx_filter(rt2x00dev, true, 0x27, 0x15);
>        }
>
> -       if (!rt2x00_rt(rt2x00dev, RT5390)) {
> +       if (!rt2x00_rt(rt2x00dev, RT5390) ||
> +               !rt2x00_rt(rt2x00dev, RT5392)) {
>                /*
>                 * Set back to initial state
>                 */
> @@ -3577,7 +3679,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
>        rt2x00_set_field32(&reg, OPT_14_CSR_BIT0, 1);
>        rt2800_register_write(rt2x00dev, OPT_14_CSR, reg);
>
> -       if (!rt2x00_rt(rt2x00dev, RT5390)) {
> +       if (!rt2x00_rt(rt2x00dev, RT5390) ||
> +               !rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_rfcsr_read(rt2x00dev, 17, &rfcsr);
>                rt2x00_set_field8(&rfcsr, RFCSR17_TX_LO1_EN, 0);
>                if (rt2x00_rt(rt2x00dev, RT3070) ||
> @@ -3645,7 +3748,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
>                rt2800_rfcsr_write(rt2x00dev, 27, rfcsr);
>        }
>
> -       if (rt2x00_rt(rt2x00dev, RT5390)) {
> +       if (rt2x00_rt(rt2x00dev, RT5390) ||
> +               rt2x00_rt(rt2x00dev, RT5392)) {
>                rt2800_rfcsr_read(rt2x00dev, 38, &rfcsr);
>                rt2x00_set_field8(&rfcsr, RFCSR38_RX_LO1_EN, 0);
>                rt2800_rfcsr_write(rt2x00dev, 38, rfcsr);
> @@ -3929,7 +4033,8 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
>         * RT53xx: defined in "EEPROM_CHIP_ID" field
>         */
>        rt2800_register_read(rt2x00dev, MAC_CSR0, &reg);
> -       if (rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5390)
> +       if (rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5390 ||
> +               rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5392)
>                rt2x00_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &value);
>        else
>                value = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);
> @@ -3947,6 +4052,8 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
>        case RT3390:
>        case RT3572:
>        case RT5390:
> +       case RT5392:
> +       case RT5372:
>                break;
>        default:
>                ERROR(rt2x00dev, "Invalid RT chipset detected.\n");
> @@ -3966,6 +4073,7 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
>        case RF3320:
>        case RF5370:
>        case RF5390:
> +       case RF5372:
>                break;
>        default:
>                ERROR(rt2x00dev, "Invalid RF chipset 0x%x detected.\n",
> @@ -4271,6 +4379,7 @@ int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
>                   rt2x00_rf(rt2x00dev, RF3022) ||
>                   rt2x00_rf(rt2x00dev, RF3320) ||
>                   rt2x00_rf(rt2x00dev, RF5370) ||
> +                  rt2x00_rf(rt2x00dev, RF5372) ||
>                   rt2x00_rf(rt2x00dev, RF5390)) {
>                spec->num_channels = 14;
>                spec->channels = rf_vals_3x;
> diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c
> index 837b460..a3aa2b0 100644
> --- a/drivers/net/wireless/rt2x00/rt2800pci.c
> +++ b/drivers/net/wireless/rt2x00/rt2800pci.c
> @@ -480,7 +480,8 @@ static int rt2800pci_init_registers(struct rt2x00_dev *rt2x00dev)
>
>        if (rt2x00_is_pcie(rt2x00dev) &&
>            (rt2x00_rt(rt2x00dev, RT3572) ||
> -            rt2x00_rt(rt2x00dev, RT5390))) {
> +            rt2x00_rt(rt2x00dev, RT5390) ||
> +            rt2x00_rt(rt2x00dev, RT5392))) {
>                rt2x00pci_register_read(rt2x00dev, AUX_CTRL, &reg);
>                rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1);
>                rt2x00_set_field32(&reg, AUX_CTRL_WAKE_PCIE_EN, 1);
> diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c
> index 7f21005..c8619eb 100644
> --- a/drivers/net/wireless/rt2x00/rt2800usb.c
> +++ b/drivers/net/wireless/rt2x00/rt2800usb.c
> @@ -1107,6 +1107,20 @@ static struct usb_device_id rt2800usb_device_table[] = {
>        /* Ralink */
>        { USB_DEVICE(0x148f, 0x5370) },
>        { USB_DEVICE(0x148f, 0x5372) },
> +       /* Alpha */
> +       { USB_DEVICE(0x2001, 0x3c15) },
> +       { USB_DEVICE(0x2001, 0x3c19) },
> +       /* Arcadyan */
> +       { USB_DEVICE(0x043e, 0x7a12) },
> +       /* LG innotek */
> +       { USB_DEVICE(0x043e, 0x7a22) },
> +       /* Panasonic */
> +       { USB_DEVICE(0x04da, 0x1801) },
> +       { USB_DEVICE(0x04da, 0x1800) },
> +       /* Unknown */
> +       { USB_DEVICE(0x04da, 0x23f6) },
> +       /* Philips */
> +       { USB_DEVICE(0x0471, 0x2104) },
>  #endif
>  #ifdef CONFIG_RT2800USB_UNKNOWN
>        /*
> diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
> index b03b22c..7bc5cee 100644
> --- a/drivers/net/wireless/rt2x00/rt2x00.h
> +++ b/drivers/net/wireless/rt2x00/rt2x00.h
> @@ -192,6 +192,8 @@ struct rt2x00_chip {
>  #define RT3593         0x3593
>  #define RT3883         0x3883  /* WSOC */
>  #define RT5390         0x5390  /* 2.4GHz */
> +#define RT5392         0x5392  /* 2.4GHz */
> +#define RT5372         0x5372  /* 2.4GHz */
>
>        u16 rf;
>        u16 rev;
> --
> 1.7.6.5
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH] rt2x00:Add RT5372 chipset support
@ 2012-02-08 13:00 John Li
  2012-02-08 13:44 ` Helmut Schaa
  2012-02-08 22:34 ` Gertjan van Wingerde
  0 siblings, 2 replies; 10+ messages in thread
From: John Li @ 2012-02-08 13:00 UTC (permalink / raw)
  To: users; +Cc: linux-wireless, John Linville, John Li

From: John Li <chen-yang.li@mediatek.com>

Signed-off-by: John Li <chen-yang.li@mediatek.com>
---
 drivers/net/wireless/rt2x00/rt2800.h    |    1 +
 drivers/net/wireless/rt2x00/rt2800lib.c |  157 ++++++++++++++++++++++++++-----
 drivers/net/wireless/rt2x00/rt2800pci.c |    3 +-
 drivers/net/wireless/rt2x00/rt2800usb.c |   14 +++
 drivers/net/wireless/rt2x00/rt2x00.h    |    2 +
 5 files changed, 152 insertions(+), 25 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2800.h b/drivers/net/wireless/rt2x00/rt2800.h
index 2571a2f..56b78c8 100644
--- a/drivers/net/wireless/rt2x00/rt2800.h
+++ b/drivers/net/wireless/rt2x00/rt2800.h
@@ -68,6 +68,7 @@
 #define RF3322				0x000c
 #define RF3053				0x000d
 #define RF5370				0x5370
+#define RF5372				0x5372
 #define RF5390				0x5390
 
 /*
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index 22a1a8f..852b57e 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -402,7 +402,8 @@ int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
 
 	if (rt2x00_is_pci(rt2x00dev)) {
 		if (rt2x00_rt(rt2x00dev, RT3572) ||
-		    rt2x00_rt(rt2x00dev, RT5390)) {
+		    rt2x00_rt(rt2x00dev, RT5390) ||
+		    rt2x00_rt(rt2x00dev, RT5392)) {
 			rt2800_register_read(rt2x00dev, AUX_CTRL, &reg);
 			rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1);
 			rt2x00_set_field32(&reg, AUX_CTRL_WAKE_PCIE_EN, 1);
@@ -1906,7 +1907,8 @@ static void rt2800_config_channel_rf53xx(struct rt2x00_dev *rt2x00dev,
 						   r55_nonbt_rev[idx]);
 				rt2800_rfcsr_write(rt2x00dev, 59,
 						   r59_nonbt_rev[idx]);
-			} else if (rt2x00_rt(rt2x00dev, RT5390)) {
+			} else if (rt2x00_rt(rt2x00dev, RT5390) || 
+					   rt2x00_rt(rt2x00dev, RT5392)) {
 				static const char r59_non_bt[] = {0x8f, 0x8f,
 					0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8d,
 					0x8a, 0x88, 0x88, 0x87, 0x87, 0x86};
@@ -1956,6 +1958,7 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
 		rt2800_config_channel_rf3052(rt2x00dev, conf, rf, info);
 		break;
 	case RF5370:
+	case RF5372:
 	case RF5390:
 		rt2800_config_channel_rf53xx(rt2x00dev, conf, rf, info);
 		break;
@@ -1972,7 +1975,8 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
 	rt2800_bbp_write(rt2x00dev, 86, 0);
 
 	if (rf->channel <= 14) {
-		if (!rt2x00_rt(rt2x00dev, RT5390)) {
+		if (!rt2x00_rt(rt2x00dev, RT5390) || 
+			!rt2x00_rt(rt2x00dev, RT5392)) {
 			if (test_bit(CAPABILITY_EXTERNAL_LNA_BG,
 				     &rt2x00dev->cap_flags)) {
 				rt2800_bbp_write(rt2x00dev, 82, 0x62);
@@ -2502,7 +2506,8 @@ static u8 rt2800_get_default_vgc(struct rt2x00_dev *rt2x00dev)
 		    rt2x00_rt(rt2x00dev, RT3071) ||
 		    rt2x00_rt(rt2x00dev, RT3090) ||
 		    rt2x00_rt(rt2x00dev, RT3390) ||
-		    rt2x00_rt(rt2x00dev, RT5390))
+		    rt2x00_rt(rt2x00dev, RT5390) ||
+		    rt2x00_rt(rt2x00dev, RT5392))
 			return 0x1c + (2 * rt2x00dev->lna_gain);
 		else
 			return 0x2e + rt2x00dev->lna_gain;
@@ -2637,7 +2642,8 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
 	} else if (rt2x00_rt(rt2x00dev, RT3572)) {
 		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400);
 		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
-	} else if (rt2x00_rt(rt2x00dev, RT5390)) {
+	} else if (rt2x00_rt(rt2x00dev, RT5390) || 
+			   rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
 		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
 		rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
@@ -3013,7 +3019,8 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
 		     rt2800_wait_bbp_ready(rt2x00dev)))
 		return -EACCES;
 
-	if (rt2x00_rt(rt2x00dev, RT5390)) {
+	if (rt2x00_rt(rt2x00dev, RT5390) || 
+		rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_bbp_read(rt2x00dev, 4, &value);
 		rt2x00_set_field8(&value, BBP4_MAC_IF_CTRL, 1);
 		rt2800_bbp_write(rt2x00dev, 4, value);
@@ -3021,19 +3028,22 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
 
 	if (rt2800_is_305x_soc(rt2x00dev) ||
 	    rt2x00_rt(rt2x00dev, RT3572) ||
-	    rt2x00_rt(rt2x00dev, RT5390))
+	    rt2x00_rt(rt2x00dev, RT5390) || 
+	    rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 31, 0x08);
 
 	rt2800_bbp_write(rt2x00dev, 65, 0x2c);
 	rt2800_bbp_write(rt2x00dev, 66, 0x38);
 
-	if (rt2x00_rt(rt2x00dev, RT5390))
+	if (rt2x00_rt(rt2x00dev, RT5390) || 
+		rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 68, 0x0b);
 
 	if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860C)) {
 		rt2800_bbp_write(rt2x00dev, 69, 0x16);
 		rt2800_bbp_write(rt2x00dev, 73, 0x12);
-	} else if (rt2x00_rt(rt2x00dev, RT5390)) {
+	} else if (rt2x00_rt(rt2x00dev, RT5390) || 
+			   rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_bbp_write(rt2x00dev, 69, 0x12);
 		rt2800_bbp_write(rt2x00dev, 73, 0x13);
 		rt2800_bbp_write(rt2x00dev, 75, 0x46);
@@ -3051,7 +3061,8 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
 	    rt2x00_rt(rt2x00dev, RT3090) ||
 	    rt2x00_rt(rt2x00dev, RT3390) ||
 	    rt2x00_rt(rt2x00dev, RT3572) ||
-	    rt2x00_rt(rt2x00dev, RT5390)) {
+	    rt2x00_rt(rt2x00dev, RT5390) ||
+	    rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_bbp_write(rt2x00dev, 79, 0x13);
 		rt2800_bbp_write(rt2x00dev, 80, 0x05);
 		rt2800_bbp_write(rt2x00dev, 81, 0x33);
@@ -3063,64 +3074,90 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
 	}
 
 	rt2800_bbp_write(rt2x00dev, 82, 0x62);
-	if (rt2x00_rt(rt2x00dev, RT5390))
+	if (rt2x00_rt(rt2x00dev, RT5390) || 
+		rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 83, 0x7a);
 	else
 		rt2800_bbp_write(rt2x00dev, 83, 0x6a);
 
 	if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860D))
 		rt2800_bbp_write(rt2x00dev, 84, 0x19);
-	else if (rt2x00_rt(rt2x00dev, RT5390))
+	else if (rt2x00_rt(rt2x00dev, RT5390) || 
+			 rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 84, 0x9a);
 	else
 		rt2800_bbp_write(rt2x00dev, 84, 0x99);
 
-	if (rt2x00_rt(rt2x00dev, RT5390))
+	if (rt2x00_rt(rt2x00dev, RT5390) || 
+		rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 86, 0x38);
 	else
 		rt2800_bbp_write(rt2x00dev, 86, 0x00);
 
+	if (rt2x00_rt(rt2x00dev, RT5392))
+		rt2800_bbp_write(rt2x00dev, 88, 0x90);
+
 	rt2800_bbp_write(rt2x00dev, 91, 0x04);
 
-	if (rt2x00_rt(rt2x00dev, RT5390))
+	if (rt2x00_rt(rt2x00dev, RT5390) || 
+		rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 92, 0x02);
 	else
 		rt2800_bbp_write(rt2x00dev, 92, 0x00);
 
+	if (rt2x00_rt(rt2x00dev, RT5392))
+	{
+		rt2800_bbp_write(rt2x00dev, 95, 0x9a);
+		rt2800_bbp_write(rt2x00dev, 98, 0x12);
+	}
+
 	if (rt2x00_rt_rev_gte(rt2x00dev, RT3070, REV_RT3070F) ||
 	    rt2x00_rt_rev_gte(rt2x00dev, RT3071, REV_RT3071E) ||
 	    rt2x00_rt_rev_gte(rt2x00dev, RT3090, REV_RT3090E) ||
 	    rt2x00_rt_rev_gte(rt2x00dev, RT3390, REV_RT3390E) ||
 	    rt2x00_rt(rt2x00dev, RT3572) ||
 	    rt2x00_rt(rt2x00dev, RT5390) ||
+	    rt2x00_rt(rt2x00dev, RT5392) ||
 	    rt2800_is_305x_soc(rt2x00dev))
 		rt2800_bbp_write(rt2x00dev, 103, 0xc0);
 	else
 		rt2800_bbp_write(rt2x00dev, 103, 0x00);
 
-	if (rt2x00_rt(rt2x00dev, RT5390))
+	if (rt2x00_rt(rt2x00dev, RT5390) || 
+		rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 104, 0x92);
 
 	if (rt2800_is_305x_soc(rt2x00dev))
 		rt2800_bbp_write(rt2x00dev, 105, 0x01);
-	else if (rt2x00_rt(rt2x00dev, RT5390))
+	else if (rt2x00_rt(rt2x00dev, RT5390) || 
+			 rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 105, 0x3c);
 	else
 		rt2800_bbp_write(rt2x00dev, 105, 0x05);
 
 	if (rt2x00_rt(rt2x00dev, RT5390))
 		rt2800_bbp_write(rt2x00dev, 106, 0x03);
+	else if (rt2x00_rt(rt2x00dev, RT5392))
+		rt2800_bbp_write(rt2x00dev, 106, 0x12);
 	else
 		rt2800_bbp_write(rt2x00dev, 106, 0x35);
 
-	if (rt2x00_rt(rt2x00dev, RT5390))
+	if (rt2x00_rt(rt2x00dev, RT5390) || 
+		rt2x00_rt(rt2x00dev, RT5392))
 		rt2800_bbp_write(rt2x00dev, 128, 0x12);
 
+	if (rt2x00_rt(rt2x00dev, RT5392))
+	{
+		rt2800_bbp_write(rt2x00dev, 134, 0xd0);
+		rt2800_bbp_write(rt2x00dev, 135, 0xf6);
+	}
+
 	if (rt2x00_rt(rt2x00dev, RT3071) ||
 	    rt2x00_rt(rt2x00dev, RT3090) ||
 	    rt2x00_rt(rt2x00dev, RT3390) ||
 	    rt2x00_rt(rt2x00dev, RT3572) ||
-	    rt2x00_rt(rt2x00dev, RT5390)) {
+	    rt2x00_rt(rt2x00dev, RT5390) || 
+	    rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_bbp_read(rt2x00dev, 138, &value);
 
 		rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &eeprom);
@@ -3132,7 +3169,8 @@ static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
 		rt2800_bbp_write(rt2x00dev, 138, value);
 	}
 
-	if (rt2x00_rt(rt2x00dev, RT5390)) {
+	if (rt2x00_rt(rt2x00dev, RT5390) || 
+		rt2x00_rt(rt2x00dev, RT5392)) {
 		int ant, div_mode;
 
 		rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1, &eeprom);
@@ -3258,13 +3296,15 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
 	    !rt2x00_rt(rt2x00dev, RT3390) &&
 	    !rt2x00_rt(rt2x00dev, RT3572) &&
 	    !rt2x00_rt(rt2x00dev, RT5390) &&
+	    !rt2x00_rt(rt2x00dev, RT5392) &&
 	    !rt2800_is_305x_soc(rt2x00dev))
 		return 0;
 
 	/*
 	 * Init RF calibration.
 	 */
-	if (rt2x00_rt(rt2x00dev, RT5390)) {
+	if (rt2x00_rt(rt2x00dev, RT5390) || 
+		rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_rfcsr_read(rt2x00dev, 2, &rfcsr);
 		rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 1);
 		rt2800_rfcsr_write(rt2x00dev, 2, rfcsr);
@@ -3482,6 +3522,67 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
 			rt2800_rfcsr_write(rt2x00dev, 61, 0xdd);
 		rt2800_rfcsr_write(rt2x00dev, 62, 0x00);
 		rt2800_rfcsr_write(rt2x00dev, 63, 0x00);
+	}	else if (rt2x00_rt(rt2x00dev, RT5392) || 
+			rt2x00_rt(rt2x00dev, RT5372)) {
+			rt2800_rfcsr_write(rt2x00dev, 1, 0x17);
+			rt2800_rfcsr_write(rt2x00dev, 2, 0x80);
+			rt2800_rfcsr_write(rt2x00dev, 3, 0x88);
+			rt2800_rfcsr_write(rt2x00dev, 5, 0x10);
+			rt2800_rfcsr_write(rt2x00dev, 6, 0xe0);
+			rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 10, 0x53);
+			rt2800_rfcsr_write(rt2x00dev, 11, 0x4a);
+			rt2800_rfcsr_write(rt2x00dev, 12, 0x46);
+			rt2800_rfcsr_write(rt2x00dev, 13, 0x9f);
+			rt2800_rfcsr_write(rt2x00dev, 14, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 15, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 16, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 18, 0x03);
+			rt2800_rfcsr_write(rt2x00dev, 19, 0x4d);
+			rt2800_rfcsr_write(rt2x00dev, 20, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 21, 0x8d);
+			rt2800_rfcsr_write(rt2x00dev, 22, 0x20);
+			rt2800_rfcsr_write(rt2x00dev, 23, 0x0b);
+			rt2800_rfcsr_write(rt2x00dev, 24, 0x44);
+			rt2800_rfcsr_write(rt2x00dev, 25, 0x80);
+			rt2800_rfcsr_write(rt2x00dev, 26, 0x82);
+			rt2800_rfcsr_write(rt2x00dev, 27, 0x09);
+			rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 29, 0x10);
+			rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
+			rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
+			rt2800_rfcsr_write(rt2x00dev, 32, 0x20);
+			rt2800_rfcsr_write(rt2x00dev, 33, 0xC0);
+			rt2800_rfcsr_write(rt2x00dev, 34, 0x07);
+			rt2800_rfcsr_write(rt2x00dev, 35, 0x12);
+			rt2800_rfcsr_write(rt2x00dev, 36, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 37, 0x08);
+			rt2800_rfcsr_write(rt2x00dev, 38, 0x89);
+			rt2800_rfcsr_write(rt2x00dev, 39, 0x1b);
+			rt2800_rfcsr_write(rt2x00dev, 40, 0x0f);
+			rt2800_rfcsr_write(rt2x00dev, 41, 0xbb);
+			rt2800_rfcsr_write(rt2x00dev, 42, 0xd5);
+			rt2800_rfcsr_write(rt2x00dev, 43, 0x9b);
+			rt2800_rfcsr_write(rt2x00dev, 44, 0x0e);
+			rt2800_rfcsr_write(rt2x00dev, 45, 0xa2);
+			rt2800_rfcsr_write(rt2x00dev, 46, 0x73);
+			rt2800_rfcsr_write(rt2x00dev, 47, 0x0c);
+			rt2800_rfcsr_write(rt2x00dev, 48, 0x10);
+			rt2800_rfcsr_write(rt2x00dev, 49, 0x94);
+			rt2800_rfcsr_write(rt2x00dev, 50, 0x94);
+			rt2800_rfcsr_write(rt2x00dev, 51, 0x3a);
+			rt2800_rfcsr_write(rt2x00dev, 52, 0x48);
+			rt2800_rfcsr_write(rt2x00dev, 53, 0x44);
+			rt2800_rfcsr_write(rt2x00dev, 54, 0x38);
+			rt2800_rfcsr_write(rt2x00dev, 55, 0x43);
+			rt2800_rfcsr_write(rt2x00dev, 56, 0xa1);
+			rt2800_rfcsr_write(rt2x00dev, 57, 0x00);
+			rt2800_rfcsr_write(rt2x00dev, 58, 0x39);
+			rt2800_rfcsr_write(rt2x00dev, 59, 0x07);
+			rt2800_rfcsr_write(rt2x00dev, 60, 0x45);
+			rt2800_rfcsr_write(rt2x00dev, 61, 0x91);
+			rt2800_rfcsr_write(rt2x00dev, 62, 0x39);
+			rt2800_rfcsr_write(rt2x00dev, 63, 0x07);
 	}
 
 	if (rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070F)) {
@@ -3549,7 +3650,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
 			rt2800_init_rx_filter(rt2x00dev, true, 0x27, 0x15);
 	}
 
-	if (!rt2x00_rt(rt2x00dev, RT5390)) {
+	if (!rt2x00_rt(rt2x00dev, RT5390) || 
+		!rt2x00_rt(rt2x00dev, RT5392)) {
 		/*
 		 * Set back to initial state
 		 */
@@ -3577,7 +3679,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
 	rt2x00_set_field32(&reg, OPT_14_CSR_BIT0, 1);
 	rt2800_register_write(rt2x00dev, OPT_14_CSR, reg);
 
-	if (!rt2x00_rt(rt2x00dev, RT5390)) {
+	if (!rt2x00_rt(rt2x00dev, RT5390) || 
+		!rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_rfcsr_read(rt2x00dev, 17, &rfcsr);
 		rt2x00_set_field8(&rfcsr, RFCSR17_TX_LO1_EN, 0);
 		if (rt2x00_rt(rt2x00dev, RT3070) ||
@@ -3645,7 +3748,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
 		rt2800_rfcsr_write(rt2x00dev, 27, rfcsr);
 	}
 
-	if (rt2x00_rt(rt2x00dev, RT5390)) {
+	if (rt2x00_rt(rt2x00dev, RT5390) || 
+		rt2x00_rt(rt2x00dev, RT5392)) {
 		rt2800_rfcsr_read(rt2x00dev, 38, &rfcsr);
 		rt2x00_set_field8(&rfcsr, RFCSR38_RX_LO1_EN, 0);
 		rt2800_rfcsr_write(rt2x00dev, 38, rfcsr);
@@ -3929,7 +4033,8 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
 	 * RT53xx: defined in "EEPROM_CHIP_ID" field
 	 */
 	rt2800_register_read(rt2x00dev, MAC_CSR0, &reg);
-	if (rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5390)
+	if (rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5390 || 
+		rt2x00_get_field32(reg, MAC_CSR0_CHIPSET) == RT5392)
 		rt2x00_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &value);
 	else
 		value = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);
@@ -3947,6 +4052,8 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
 	case RT3390:
 	case RT3572:
 	case RT5390:
+	case RT5392:
+	case RT5372:
 		break;
 	default:
 		ERROR(rt2x00dev, "Invalid RT chipset detected.\n");
@@ -3966,6 +4073,7 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
 	case RF3320:
 	case RF5370:
 	case RF5390:
+	case RF5372:
 		break;
 	default:
 		ERROR(rt2x00dev, "Invalid RF chipset 0x%x detected.\n",
@@ -4271,6 +4379,7 @@ int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
 		   rt2x00_rf(rt2x00dev, RF3022) ||
 		   rt2x00_rf(rt2x00dev, RF3320) ||
 		   rt2x00_rf(rt2x00dev, RF5370) ||
+		   rt2x00_rf(rt2x00dev, RF5372) ||
 		   rt2x00_rf(rt2x00dev, RF5390)) {
 		spec->num_channels = 14;
 		spec->channels = rf_vals_3x;
diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c
index 837b460..a3aa2b0 100644
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
@@ -480,7 +480,8 @@ static int rt2800pci_init_registers(struct rt2x00_dev *rt2x00dev)
 
 	if (rt2x00_is_pcie(rt2x00dev) &&
 	    (rt2x00_rt(rt2x00dev, RT3572) ||
-	     rt2x00_rt(rt2x00dev, RT5390))) {
+	     rt2x00_rt(rt2x00dev, RT5390) || 
+	     rt2x00_rt(rt2x00dev, RT5392))) {
 		rt2x00pci_register_read(rt2x00dev, AUX_CTRL, &reg);
 		rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1);
 		rt2x00_set_field32(&reg, AUX_CTRL_WAKE_PCIE_EN, 1);
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c
index 7f21005..c8619eb 100644
--- a/drivers/net/wireless/rt2x00/rt2800usb.c
+++ b/drivers/net/wireless/rt2x00/rt2800usb.c
@@ -1107,6 +1107,20 @@ static struct usb_device_id rt2800usb_device_table[] = {
 	/* Ralink */
 	{ USB_DEVICE(0x148f, 0x5370) },
 	{ USB_DEVICE(0x148f, 0x5372) },
+	/* Alpha */
+	{ USB_DEVICE(0x2001, 0x3c15) },
+	{ USB_DEVICE(0x2001, 0x3c19) },
+	/* Arcadyan */
+	{ USB_DEVICE(0x043e, 0x7a12) },
+	/* LG innotek */
+	{ USB_DEVICE(0x043e, 0x7a22) },
+	/* Panasonic */
+	{ USB_DEVICE(0x04da, 0x1801) },
+	{ USB_DEVICE(0x04da, 0x1800) },
+	/* Unknown */
+	{ USB_DEVICE(0x04da, 0x23f6) },
+	/* Philips */
+	{ USB_DEVICE(0x0471, 0x2104) },
 #endif
 #ifdef CONFIG_RT2800USB_UNKNOWN
 	/*
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
index b03b22c..7bc5cee 100644
--- a/drivers/net/wireless/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
@@ -192,6 +192,8 @@ struct rt2x00_chip {
 #define RT3593		0x3593
 #define RT3883		0x3883	/* WSOC */
 #define RT5390		0x5390  /* 2.4GHz */
+#define RT5392		0x5392  /* 2.4GHz */
+#define RT5372		0x5372  /* 2.4GHz */
 
 	u16 rf;
 	u16 rev;
-- 
1.7.6.5


^ permalink raw reply related	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2012-02-20  6:18 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-02-08  6:02 [PATCH] rt2x00:Add RT5372 chipset support John Li
2012-02-08 13:00 John Li
2012-02-08 13:44 ` Helmut Schaa
2012-02-08 22:34 ` Gertjan van Wingerde
2012-02-16  5:32 John Li
2012-02-17  7:31 ` Gertjan van Wingerde
2012-02-17  9:33 John Li
2012-02-17 13:06 ` Gertjan van Wingerde
2012-02-18 12:24 ` Ivo Van Doorn
2012-02-20  6:13   ` Chen-Yang Li (黎振陽)

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.