Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 49e721ec authored by Gertjan van Wingerde's avatar Gertjan van Wingerde Committed by John W. Linville
Browse files

rt2x00: rework RT chipset and revision determination for PCI an SOC devices.



The recent rt2800 devices are no longer really identified by their PCI
ID's, but rather by the contents of their CSR0 register. Also for the
other chipsets is the contents of this CSR0 register important.
Change the chipset determination logic to be more aligned with the rt2800
model.
Preparation for the support of rt3070 / rt3090 based devices.

Signed-off-by: default avatarGertjan van Wingerde <gwingerde@gmail.com>
Acked-by: default avatarIvo van Doorn <IvDoorn@gmail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 714fa663
Loading
Loading
Loading
Loading
+2 −7
Original line number Original line Diff line number Diff line
@@ -1327,7 +1327,6 @@ static int rt2400pci_validate_eeprom(struct rt2x00_dev *rt2x00dev)
static int rt2400pci_init_eeprom(struct rt2x00_dev *rt2x00dev)
static int rt2400pci_init_eeprom(struct rt2x00_dev *rt2x00dev)
{
{
	u32 reg;
	u32 reg;
	u16 chip;
	u16 value;
	u16 value;
	u16 eeprom;
	u16 eeprom;


@@ -1336,17 +1335,13 @@ static int rt2400pci_init_eeprom(struct rt2x00_dev *rt2x00dev)
	 */
	 */
	rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &eeprom);
	rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &eeprom);


	/*
	 * Identify RT chipset.
	 */
	pci_read_config_word(to_pci_dev(rt2x00dev->dev), PCI_DEVICE_ID, &chip);

	/*
	/*
	 * Identify RF chipset.
	 * Identify RF chipset.
	 */
	 */
	value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE);
	value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE);
	rt2x00pci_register_read(rt2x00dev, CSR0, &reg);
	rt2x00pci_register_read(rt2x00dev, CSR0, &reg);
	rt2x00_set_chip(rt2x00dev, chip, value, reg);
	rt2x00_set_chip(rt2x00dev, RT2460, value,
			rt2x00_get_field32(reg, CSR0_REVISION));


	if (!rt2x00_rf(rt2x00dev, RF2420) && !rt2x00_rf(rt2x00dev, RF2421)) {
	if (!rt2x00_rf(rt2x00dev, RF2420) && !rt2x00_rf(rt2x00dev, RF2421)) {
		ERROR(rt2x00dev, "Invalid RF chipset detected.\n");
		ERROR(rt2x00dev, "Invalid RF chipset detected.\n");
+1 −0
Original line number Original line Diff line number Diff line
@@ -65,6 +65,7 @@
 * CSR0: ASIC revision number.
 * CSR0: ASIC revision number.
 */
 */
#define CSR0				0x0000
#define CSR0				0x0000
#define CSR0_REVISION			FIELD32(0x0000ffff)


/*
/*
 * CSR1: System control register.
 * CSR1: System control register.
+2 −7
Original line number Original line Diff line number Diff line
@@ -1490,7 +1490,6 @@ static int rt2500pci_validate_eeprom(struct rt2x00_dev *rt2x00dev)
static int rt2500pci_init_eeprom(struct rt2x00_dev *rt2x00dev)
static int rt2500pci_init_eeprom(struct rt2x00_dev *rt2x00dev)
{
{
	u32 reg;
	u32 reg;
	u16 chip;
	u16 value;
	u16 value;
	u16 eeprom;
	u16 eeprom;


@@ -1499,17 +1498,13 @@ static int rt2500pci_init_eeprom(struct rt2x00_dev *rt2x00dev)
	 */
	 */
	rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &eeprom);
	rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &eeprom);


	/*
	 * Identify RT chipset.
	 */
	pci_read_config_word(to_pci_dev(rt2x00dev->dev), PCI_DEVICE_ID, &chip);

	/*
	/*
	 * Identify RF chipset.
	 * Identify RF chipset.
	 */
	 */
	value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE);
	value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE);
	rt2x00pci_register_read(rt2x00dev, CSR0, &reg);
	rt2x00pci_register_read(rt2x00dev, CSR0, &reg);
	rt2x00_set_chip(rt2x00dev, chip, value, reg);
	rt2x00_set_chip(rt2x00dev, RT2560, value,
			rt2x00_get_field32(reg, CSR0_REVISION));


	if (!rt2x00_rf(rt2x00dev, RF2522) &&
	if (!rt2x00_rf(rt2x00dev, RF2522) &&
	    !rt2x00_rf(rt2x00dev, RF2523) &&
	    !rt2x00_rf(rt2x00dev, RF2523) &&
+1 −0
Original line number Original line Diff line number Diff line
@@ -76,6 +76,7 @@
 * CSR0: ASIC revision number.
 * CSR0: ASIC revision number.
 */
 */
#define CSR0				0x0000
#define CSR0				0x0000
#define CSR0_REVISION			FIELD32(0x0000ffff)


/*
/*
 * CSR1: System control register.
 * CSR1: System control register.
+1 −2
Original line number Original line Diff line number Diff line
@@ -1409,8 +1409,7 @@ static int rt2500usb_init_eeprom(struct rt2x00_dev *rt2x00dev)
	rt2500usb_register_read(rt2x00dev, MAC_CSR0, &reg);
	rt2500usb_register_read(rt2x00dev, MAC_CSR0, &reg);
	rt2x00_set_chip(rt2x00dev, RT2570, value, reg);
	rt2x00_set_chip(rt2x00dev, RT2570, value, reg);


	if (!rt2x00_check_rev(rt2x00dev, 0x000ffff0, 0) ||
	if (((reg & 0xfff0) != 0) || ((reg & 0x0000000f) == 0)) {
	    rt2x00_check_rev(rt2x00dev, 0x0000000f, 0)) {
		ERROR(rt2x00dev, "Invalid RT chipset detected.\n");
		ERROR(rt2x00dev, "Invalid RT chipset detected.\n");
		return -ENODEV;
		return -ENODEV;
	}
	}
Loading