diff options
Diffstat (limited to 'package/mac80211/patches/300-rt2x00-Move-Move-pci_dev-specific-access-to-rt2x00p.patch')
| -rw-r--r-- | package/mac80211/patches/300-rt2x00-Move-Move-pci_dev-specific-access-to-rt2x00p.patch | 150 | 
1 files changed, 150 insertions, 0 deletions
diff --git a/package/mac80211/patches/300-rt2x00-Move-Move-pci_dev-specific-access-to-rt2x00p.patch b/package/mac80211/patches/300-rt2x00-Move-Move-pci_dev-specific-access-to-rt2x00p.patch new file mode 100644 index 000000000..91f5a2ad8 --- /dev/null +++ b/package/mac80211/patches/300-rt2x00-Move-Move-pci_dev-specific-access-to-rt2x00p.patch @@ -0,0 +1,150 @@ +From 313314263fda19db8eed94a7d7259b595634212e Mon Sep 17 00:00:00 2001 +From: Ivo van Doorn <IvDoorn@gmail.com> +Date: Sat, 14 Mar 2009 20:02:51 +0100 +Subject: [PATCH] rt2x00: Move Move pci_dev specific access to rt2x00pci + +pci_dev->irq and pci_name(pci_dev) access should be limited +to rt2x00pci only. This is more generic and allows a rt2x00 pci +driver to be controlled as PCI device but also as platform driver +(needed for rt2800pci SoC support). + +Signed-off-by: Felix Fietkau <nbd@openwrt.org> +Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> +--- + drivers/net/wireless/rt2x00/rt2400pci.c |    2 +- + drivers/net/wireless/rt2x00/rt2500pci.c |    2 +- + drivers/net/wireless/rt2x00/rt2x00.h    |   18 ++++++++++++++++++ + drivers/net/wireless/rt2x00/rt2x00pci.c |   16 ++++++++++++---- + drivers/net/wireless/rt2x00/rt61pci.c   |    7 +------ + 5 files changed, 33 insertions(+), 12 deletions(-) + +--- a/drivers/net/wireless/rt2x00/rt2400pci.c ++++ b/drivers/net/wireless/rt2x00/rt2400pci.c +@@ -1361,7 +1361,7 @@ static int rt2400pci_init_eeprom(struct  + 	 */ + 	value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE); + 	rt2x00pci_register_read(rt2x00dev, CSR0, ®); +-	rt2x00_set_chip(rt2x00dev, RT2460, value, reg); ++	rt2x00_set_chip_rf(rt2x00dev, value, reg); +  + 	if (!rt2x00_rf(&rt2x00dev->chip, RF2420) && + 	    !rt2x00_rf(&rt2x00dev->chip, RF2421)) { +--- a/drivers/net/wireless/rt2x00/rt2500pci.c ++++ b/drivers/net/wireless/rt2x00/rt2500pci.c +@@ -1525,7 +1525,7 @@ static int rt2500pci_init_eeprom(struct  + 	 */ + 	value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE); + 	rt2x00pci_register_read(rt2x00dev, CSR0, ®); +-	rt2x00_set_chip(rt2x00dev, RT2560, value, reg); ++	rt2x00_set_chip_rf(rt2x00dev, value, reg); +  + 	if (!rt2x00_rf(&rt2x00dev->chip, RF2522) && + 	    !rt2x00_rf(&rt2x00dev->chip, RF2523) && +--- a/drivers/net/wireless/rt2x00/rt2x00.h ++++ b/drivers/net/wireless/rt2x00/rt2x00.h +@@ -672,6 +672,12 @@ struct rt2x00_dev { + 	unsigned long flags; +  + 	/* ++	 * Device information, Bus IRQ and name (PCI, SoC) ++	 */ ++	int irq; ++	const char *name; ++ ++	/* + 	 * Chipset identification. + 	 */ + 	struct rt2x00_chip chip; +@@ -860,6 +866,18 @@ static inline void rt2x00_set_chip(struc + 	rt2x00dev->chip.rev = rev; + } +  ++static inline void rt2x00_set_chip_rt(struct rt2x00_dev *rt2x00dev, ++				      const u16 rt) ++{ ++	rt2x00dev->chip.rt = rt; ++} ++ ++static inline void rt2x00_set_chip_rf(struct rt2x00_dev *rt2x00dev, ++				      const u16 rf, const u32 rev) ++{ ++	rt2x00_set_chip(rt2x00dev, rt2x00dev->chip.rt, rf, rev); ++} ++ + static inline char rt2x00_rt(const struct rt2x00_chip *chipset, const u16 chip) + { + 	return (chipset->rt == chip); +--- a/drivers/net/wireless/rt2x00/rt2x00pci.c ++++ b/drivers/net/wireless/rt2x00/rt2x00pci.c +@@ -170,7 +170,6 @@ static void rt2x00pci_free_queue_dma(str +  + int rt2x00pci_initialize(struct rt2x00_dev *rt2x00dev) + { +-	struct pci_dev *pci_dev = to_pci_dev(rt2x00dev->dev); + 	struct data_queue *queue; + 	int status; +  +@@ -186,11 +185,11 @@ int rt2x00pci_initialize(struct rt2x00_d + 	/* + 	 * Register interrupt handler. + 	 */ +-	status = request_irq(pci_dev->irq, rt2x00dev->ops->lib->irq_handler, +-			     IRQF_SHARED, pci_name(pci_dev), rt2x00dev); ++	status = request_irq(rt2x00dev->irq, rt2x00dev->ops->lib->irq_handler, ++			     IRQF_SHARED, rt2x00dev->name, rt2x00dev); + 	if (status) { + 		ERROR(rt2x00dev, "IRQ %d allocation failed (error %d).\n", +-		      pci_dev->irq, status); ++		      rt2x00dev->irq, status); + 		goto exit; + 	} +  +@@ -270,6 +269,7 @@ int rt2x00pci_probe(struct pci_dev *pci_ + 	struct ieee80211_hw *hw; + 	struct rt2x00_dev *rt2x00dev; + 	int retval; ++	u16 chip; +  + 	retval = pci_request_regions(pci_dev, pci_name(pci_dev)); + 	if (retval) { +@@ -307,6 +307,14 @@ int rt2x00pci_probe(struct pci_dev *pci_ + 	rt2x00dev->dev = &pci_dev->dev; + 	rt2x00dev->ops = ops; + 	rt2x00dev->hw = hw; ++	rt2x00dev->irq = pci_dev->irq; ++	rt2x00dev->name = pci_name(pci_dev); ++ ++	/* ++	 * Determine RT chipset by reading PCI header. ++	 */ ++	pci_read_config_word(pci_dev, PCI_DEVICE_ID, &chip); ++	rt2x00_set_chip_rt(rt2x00dev, chip); +  + 	retval = rt2x00pci_alloc_reg(rt2x00dev); + 	if (retval) +--- a/drivers/net/wireless/rt2x00/rt61pci.c ++++ b/drivers/net/wireless/rt2x00/rt61pci.c +@@ -2308,7 +2308,6 @@ static int rt61pci_init_eeprom(struct rt + 	u32 reg; + 	u16 value; + 	u16 eeprom; +-	u16 device; +  + 	/* + 	 * Read EEPROM word for configuration. +@@ -2317,14 +2316,10 @@ static int rt61pci_init_eeprom(struct rt +  + 	/* + 	 * Identify RF chipset. +-	 * To determine the RT chip we have to read the +-	 * PCI header of the device. + 	 */ +-	pci_read_config_word(to_pci_dev(rt2x00dev->dev), +-			     PCI_CONFIG_HEADER_DEVICE, &device); + 	value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE); + 	rt2x00pci_register_read(rt2x00dev, MAC_CSR0, ®); +-	rt2x00_set_chip(rt2x00dev, device, value, reg); ++	rt2x00_set_chip_rf(rt2x00dev, value, reg); +  + 	if (!rt2x00_rf(&rt2x00dev->chip, RF5225) && + 	    !rt2x00_rf(&rt2x00dev->chip, RF5325) &&  | 
