rpms/kernel/F-8 linux-2.6-cfg80211-extras.patch, NONE, 1.1 kernel.spec, 1.271, 1.272 linux-2.6-b43-rev-d.patch, 1.1, 1.2

John W. Linville (linville) fedora-extras-commits at redhat.com
Wed Nov 21 21:44:15 UTC 2007


Author: linville

Update of /cvs/pkgs/rpms/kernel/F-8
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv32281

Modified Files:
	kernel.spec linux-2.6-b43-rev-d.patch 
Added Files:
	linux-2.6-cfg80211-extras.patch 
Log Message:
Revise b43 rev D support, Restore ability to add/remove virtual i/fs to mac80211 devices

linux-2.6-cfg80211-extras.patch:

--- NEW FILE linux-2.6-cfg80211-extras.patch ---
diff -up linux-2.6.23.noarch/net/wireless/sysfs.c.orig linux-2.6.23.noarch/net/wireless/sysfs.c
--- linux-2.6.23.noarch/net/wireless/sysfs.c.orig	2007-11-21 16:19:19.000000000 -0500
+++ linux-2.6.23.noarch/net/wireless/sysfs.c	2007-11-21 16:21:07.000000000 -0500
@@ -39,9 +39,61 @@ static ssize_t _show_permaddr(struct dev
 		       addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
 }
 
+static ssize_t _store_add_iface(struct device *dev,
+				struct device_attribute *attr,
+				const char *buf, size_t len)
+{
+	struct cfg80211_registered_device *rdev = dev_to_rdev(dev);
+	int res;
+
+	if (!capable(CAP_NET_ADMIN))
+		return -EPERM;
+	if (len > IFNAMSIZ)
+		return -EINVAL;
+	if (!rdev->ops->add_virtual_intf)
+		return -ENOSYS;
+
+	rtnl_lock();
+	res = rdev->ops->add_virtual_intf(&rdev->wiphy, (char*)buf,
+					  NL80211_IFTYPE_UNSPECIFIED);
+	rtnl_unlock();
+
+	return res ? res : len;
+}
+
+static ssize_t _store_remove_iface(struct device *dev,
+				   struct device_attribute *attr,
+				   const char *buf, size_t len)
+{
+	struct cfg80211_registered_device *rdev = dev_to_rdev(dev);
+	int res, ifidx;
+	struct net_device *netdev;
+
+	if (!capable(CAP_NET_ADMIN))
+		return -EPERM;
+	if (len > IFNAMSIZ)
+		return -EINVAL;
+	if (!rdev->ops->del_virtual_intf)
+		return -ENOSYS;
+
+	netdev = dev_get_by_name(buf);
+	if (!netdev)
+		return -ENODEV;
+	ifidx = netdev->ifindex;
+	dev_put(netdev);
+
+	rtnl_lock();
+	res = rdev->ops->del_virtual_intf(&rdev->wiphy, ifidx);
+	rtnl_unlock();
+
+	return res ? res : len;
+}
+
 static struct device_attribute ieee80211_dev_attrs[] = {
 	__ATTR(index, S_IRUGO, _show_index, NULL),
 	__ATTR(macaddress, S_IRUGO, _show_permaddr, NULL),
+	__ATTR(add_iface, S_IWUGO, NULL, _store_add_iface),
+	__ATTR(remove_iface, S_IWUGO, NULL, _store_remove_iface),
 	{}
 };
 


Index: kernel.spec
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-8/kernel.spec,v
retrieving revision 1.271
retrieving revision 1.272
diff -u -r1.271 -r1.272
--- kernel.spec	20 Nov 2007 18:56:08 -0000	1.271
+++ kernel.spec	21 Nov 2007 21:43:40 -0000	1.272
@@ -676,6 +676,7 @@
 Patch692: linux-2.6-zd1211rw-mac80211.patch
 Patch693: linux-2.6-rtl8180.patch
 Patch694: linux-2.6-b43-rev-d.patch
+Patch700: linux-2.6-cfg80211-extras.patch
 Patch710: linux-2.6-netdev-e1000e-01.patch
 Patch711: linux-2.6-netdev-e1000e-02.patch
 Patch712: linux-2.6-netdev-e1000e-03.patch
@@ -1262,6 +1263,7 @@
 ApplyPatch linux-2.6-wireless.patch
 # wireless patches staged for 2.6.25
 ApplyPatch linux-2.6-wireless-pending.patch
+
 # Add misc wireless bits from upstream wireless tree
 ApplyPatch linux-2.6-at76.patch
 ApplyPatch linux-2.6-ath5k.patch
@@ -1269,6 +1271,9 @@
 ApplyPatch linux-2.6-rtl8180.patch
 ApplyPatch linux-2.6-b43-rev-d.patch
 
+# Restore ability to add/remove virtual i/fs to mac80211 devices
+ApplyPatch linux-2.6-cfg80211-extras.patch
+
 # latest Intel driver for ich9
 ApplyPatch linux-2.6-netdev-e1000e-01.patch
 ApplyPatch linux-2.6-netdev-e1000e-02.patch
@@ -1957,6 +1962,10 @@
 
 
 %changelog
+* Wed Nov 21 2007 John W. Linville <linville at redhat.com>
+- Revise b43 rev D support (new upstream patch)
+- Restore ability to add/remove virtual i/fs to mac80211 devices
+
 * Tue Nov 20 2007 Chuck Ebbert <cebbert at redhat.com>
 - Linux 2.6.23.9-rc1
 

linux-2.6-b43-rev-d.patch:

Index: linux-2.6-b43-rev-d.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/F-8/linux-2.6-b43-rev-d.patch,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- linux-2.6-b43-rev-d.patch	16 Nov 2007 04:00:40 -0000	1.1
+++ linux-2.6-b43-rev-d.patch	21 Nov 2007 21:43:40 -0000	1.2
@@ -1,6 +1,70 @@
-diff -up linux-2.6.23.noarch/drivers/net/wireless/b43/dma.c.orig linux-2.6.23.noarch/drivers/net/wireless/b43/dma.c
---- linux-2.6.23.noarch/drivers/net/wireless/b43/dma.c.orig	2007-11-15 22:41:08.000000000 -0500
-+++ linux-2.6.23.noarch/drivers/net/wireless/b43/dma.c	2007-11-15 22:44:59.000000000 -0500
+From Larry.Finger at lwfinger.net Wed Nov 21 14:32:10 2007
+Return-Path: <Larry.Finger at lwfinger.net>
+Received: from hrndva-omtalb.mail.rr.com (hrndva-omtalb.mail.rr.com [71.74.56.123])
+	by ra.tuxdriver.com (8.14.0/8.13.7) with ESMTP id lALJVxqi008841
+	for <linville at tuxdriver.com>; Wed, 21 Nov 2007 14:32:10 -0500
+Received: from localhost ([69.76.246.60]) by hrndva-omta02.mail.rr.com
+          with SMTP
+          id <20071121193154.VQJG9083.hrndva-omta02.mail.rr.com at localhost>;
+          Wed, 21 Nov 2007 19:31:54 +0000
+Date: Wed, 21 Nov 2007 13:31:53 -0600
+From: Larry Finger <Larry.Finger at lwfinger.net>
+To: John Linville <linville at tuxdriver.com>, Michael Buesch <mb at bu3sch.de>
+Cc: Bcm43xx-dev at lists.berlios.de, linux-wireless at vger.kernel.org
+Subject: [PATCH] b43: Changes to enable BCM4311 rev 02 with wireless core
+ revision 13
+Message-ID: <474487a9.9c54/m97tX72L4+l%Larry.Finger at lwfinger.net>
+User-Agent: Heirloom mailx 12.2 01/07/07
+MIME-Version: 1.0
+Content-Type: text/plain; charset=utf-8
+Content-Transfer-Encoding: 8bit
+X-Spam-Status: No, score=-2.6 required=3.0 tests=AWL,BAYES_00 autolearn=ham
+	version=3.1.8-gr1
+X-Spam-Checker-Version: SpamAssassin 3.1.8-gr1 (2007-02-13) on ra.tuxdriver.com
+Status: RO
+X-Status: A
+Content-Length: 8397
+
+The BCM94311MCG rev 02 chip has an 802.11 core with revision 13 and
+has not been supported until now. The changes include the following:
+
+(1) Add the 802.11 rev 13 device to the ssb_device_id table to load b43.
+(2) Add PHY revision 9 to the supported list.
+(3) Fix 64-bit addressing errors.
+(4) Remove some magic numbers in the DMA setup.
+
+The DMA implementation for this chip supports full 64-bit addressing with
+one exception. Whenever the Descriptor Ring Buffer is in high memory, a
+fatal DMA error occurs. This problem was not present in 2.6.24-rc2 due
+to code to "Bias the placement of kernel pages at lower PFNs". When
+commit 44048d70 reverted that code, the DMA error appeared. As a "fix",
+use the GFP_DMA flag when allocating the buffer for 64-bit DMA. At present,
+this problem is thought to arise from a hardware error. The present driver
+allocates one ring buffer for RX and six for TX; however, only one of the
+TX buffers is used. To minimize any system impact associated with using low
+memory, this patch removes the allocation of the unused buffers.
+
+This patch has been tested by Cédric Caumont <icare40 at hotmail.com>.
+
+Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
+---
+
+John,
+
+This patch is intended for the everything branch of wireless-2.6.
+
+Larry
+---
+
+ dma.c  |   86 ++++++++++++++++++++++++++++++++++-------------------------------
+ main.c |    3 +-
+ wa.c   |    1
+ 3 files changed, 49 insertions(+), 41 deletions(-)
+
+Index: wireless-2.6/drivers/net/wireless/b43/dma.c
+===================================================================
+--- wireless-2.6.orig/drivers/net/wireless/b43/dma.c
++++ wireless-2.6/drivers/net/wireless/b43/dma.c
 @@ -165,7 +165,7 @@ static void op64_fill_descriptor(struct 
  	addrhi = (((u64) dmaaddr >> 32) & ~SSB_DMA_TRANSLATION_MASK);
  	addrext = (((u64) dmaaddr >> 32) & SSB_DMA_TRANSLATION_MASK)
@@ -10,25 +74,29 @@
  	if (slot == ring->nr_slots - 1)
  		ctl0 |= B43_DMA64_DCTL0_DTABLEEND;
  	if (start)
-@@ -426,14 +426,15 @@ static inline
+@@ -426,9 +426,20 @@ static inline
  static int alloc_ringmemory(struct b43_dmaring *ring)
  {
  	struct device *dev = ring->dev->dev->dev;
-+	int size = (ring->dma64) ? 8192 : B43_DMA_RINGMEMSIZE;
++	gfp_t flags = GFP_KERNEL;
  
--	ring->descbase = dma_alloc_coherent(dev, B43_DMA_RINGMEMSIZE,
-+	ring->descbase = dma_alloc_coherent(dev, size,
- 					    &(ring->dmabase), GFP_KERNEL);
++	/* The specs call for 4K buffers for 30- and 32-bit DMA
++	 * and 8K buffers for 64-bit DMA; however, 4K is sufficient for
++	 * the latter as long as the buffer does not cross an 8K boundary.
++	 *
++	 * For unknown reasons - possibly a hardware error - the BCM4311 rev
++	 * 02, which uses 64-bit DMA, needs the ring buffer in very low memory,
++	 * which accounts for the GFP_DMA flag below.
++	 */
++	if (ring->dma64)
++		flags = GFP_DMA;
+ 	ring->descbase = dma_alloc_coherent(dev, B43_DMA_RINGMEMSIZE,
+-					    &(ring->dmabase), GFP_KERNEL);
++					    &(ring->dmabase), flags);
  	if (!ring->descbase) {
  		b43err(ring->dev->wl, "DMA ringmemory allocation failed\n");
  		return -ENOMEM;
- 	}
--	memset(ring->descbase, 0, B43_DMA_RINGMEMSIZE);
-+	memset(ring->descbase, 0, size);
- 
- 	return 0;
- }
-@@ -483,7 +484,7 @@ int b43_dmacontroller_rx_reset(struct b4
+@@ -483,7 +494,7 @@ int b43_dmacontroller_rx_reset(struct b4
  	return 0;
  }
  
@@ -37,7 +105,7 @@
  int b43_dmacontroller_tx_reset(struct b43_wldev *dev, u16 mmio_base, int dma64)
  {
  	int i;
-@@ -636,18 +637,13 @@ static int dmacontroller_setup(struct b4
+@@ -636,18 +647,12 @@ static int dmacontroller_setup(struct b4
  		if (ring->dma64) {
  			u64 ringbase = (u64) (ring->dmabase);
  
@@ -52,14 +120,14 @@
  			b43_dma_write(ring, B43_DMA64_TXRINGLO,
  				      (ringbase & 0xFFFFFFFF));
  			b43_dma_write(ring, B43_DMA64_TXRINGHI,
- 				      ((ringbase >> 32) &
+-				      ((ringbase >> 32) &
 -				       ~SSB_DMA_TRANSLATION_MASK)
 -				      | trans);
-+				       0xFFFFFFFF));
++				      (ringbase >> 32));
  		} else {
  			u32 ringbase = (u32) (ring->dmabase);
  
-@@ -668,20 +664,16 @@ static int dmacontroller_setup(struct b4
+@@ -668,20 +673,15 @@ static int dmacontroller_setup(struct b4
  		if (ring->dma64) {
  			u64 ringbase = (u64) (ring->dmabase);
  
@@ -75,17 +143,17 @@
  			b43_dma_write(ring, B43_DMA64_RXRINGLO,
  				      (ringbase & 0xFFFFFFFF));
  			b43_dma_write(ring, B43_DMA64_RXRINGHI,
- 				      ((ringbase >> 32) &
+-				      ((ringbase >> 32) &
 -				       ~SSB_DMA_TRANSLATION_MASK)
 -				      | trans);
 -			b43_dma_write(ring, B43_DMA64_RXINDEX, 200);
-+				       0xFFFFFFFF));
++				      (ringbase >> 32));
 +			b43_dma_write(ring, B43_DMA64_RXINDEX, ring->nr_slots *
 +				      sizeof(struct b43_dmadesc64));
  		} else {
  			u32 ringbase = (u32) (ring->dmabase);
  
-@@ -695,11 +687,12 @@ static int dmacontroller_setup(struct b4
+@@ -695,11 +695,12 @@ static int dmacontroller_setup(struct b4
  			b43_dma_write(ring, B43_DMA32_RXRING,
  				      (ringbase & ~SSB_DMA_TRANSLATION_MASK)
  				      | trans);
@@ -100,9 +168,89 @@
  	return err;
  }
  
-diff -up linux-2.6.23.noarch/drivers/net/wireless/b43/main.c.orig linux-2.6.23.noarch/drivers/net/wireless/b43/main.c
---- linux-2.6.23.noarch/drivers/net/wireless/b43/main.c.orig	2007-11-15 22:41:09.000000000 -0500
-+++ linux-2.6.23.noarch/drivers/net/wireless/b43/main.c	2007-11-15 22:44:59.000000000 -0500
+@@ -954,19 +955,21 @@ int b43_dma_init(struct b43_wldev *dev)
+ 
+ 	err = -ENOMEM;
+ 	/* setup TX DMA channels. */
+-	ring = b43_setup_dmaring(dev, 0, 1, dma64);
++	ring = b43_setup_dmaring(dev, 1, 1, dma64);
+ 	if (!ring)
+ 		goto out;
+-	dma->tx_ring0 = ring;
++	dma->tx_ring1 = ring;
+ 
+-	ring = b43_setup_dmaring(dev, 1, 1, dma64);
++	/* The driver only uses ring1 for TX - skip setup for the rest */
++#if 0
++	ring = b43_setup_dmaring(dev, 0, 1, dma64);
+ 	if (!ring)
+-		goto err_destroy_tx0;
+-	dma->tx_ring1 = ring;
++		goto err_destroy_tx1;
++	dma->tx_ring0 = ring;
+ 
+ 	ring = b43_setup_dmaring(dev, 2, 1, dma64);
+ 	if (!ring)
+-		goto err_destroy_tx1;
++		goto err_destroy_tx0;
+ 	dma->tx_ring2 = ring;
+ 
+ 	ring = b43_setup_dmaring(dev, 3, 1, dma64);
+@@ -983,6 +986,7 @@ int b43_dma_init(struct b43_wldev *dev)
+ 	if (!ring)
+ 		goto err_destroy_tx4;
+ 	dma->tx_ring5 = ring;
++#endif
+ 
+ 	/* setup RX DMA channels. */
+ 	ring = b43_setup_dmaring(dev, 0, 0, dma64);
+@@ -1001,30 +1005,32 @@ int b43_dma_init(struct b43_wldev *dev)
+ 	       (dmamask == DMA_64BIT_MASK) ? 64 :
+ 	       (dmamask == DMA_32BIT_MASK) ? 32 : 30);
+ 	err = 0;
+-      out:
++out:
+ 	return err;
+ 
+-      err_destroy_rx0:
++err_destroy_rx0:
+ 	b43_destroy_dmaring(dma->rx_ring0);
+ 	dma->rx_ring0 = NULL;
+-      err_destroy_tx5:
++err_destroy_tx5:
++#if 0
+ 	b43_destroy_dmaring(dma->tx_ring5);
+ 	dma->tx_ring5 = NULL;
+-      err_destroy_tx4:
++err_destroy_tx4:
+ 	b43_destroy_dmaring(dma->tx_ring4);
+ 	dma->tx_ring4 = NULL;
+-      err_destroy_tx3:
++err_destroy_tx3:
+ 	b43_destroy_dmaring(dma->tx_ring3);
+ 	dma->tx_ring3 = NULL;
+-      err_destroy_tx2:
++err_destroy_tx2:
+ 	b43_destroy_dmaring(dma->tx_ring2);
+ 	dma->tx_ring2 = NULL;
+-      err_destroy_tx1:
+-	b43_destroy_dmaring(dma->tx_ring1);
+-	dma->tx_ring1 = NULL;
+-      err_destroy_tx0:
++err_destroy_tx0:
+ 	b43_destroy_dmaring(dma->tx_ring0);
+ 	dma->tx_ring0 = NULL;
++err_destroy_tx1:
++#endif
++	b43_destroy_dmaring(dma->tx_ring1);
++	dma->tx_ring1 = NULL;
+ 	goto out;
+ }
+ 
+Index: wireless-2.6/drivers/net/wireless/b43/main.c
+===================================================================
+--- wireless-2.6.orig/drivers/net/wireless/b43/main.c
++++ wireless-2.6/drivers/net/wireless/b43/main.c
 @@ -93,6 +93,7 @@ static const struct ssb_device_id b43_ss
  	SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 7),
  	SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 9),
@@ -111,7 +259,7 @@
  	SSB_DEVTABLE_END
  };
  
-@@ -3063,7 +3064,7 @@ static int b43_phy_versioning(struct b43
+@@ -3064,7 +3065,7 @@ static int b43_phy_versioning(struct b43
  			unsupported = 1;
  		break;
  	case B43_PHYTYPE_G:
@@ -120,20 +268,16 @@
  			unsupported = 1;
  		break;
  	default:
-diff -up linux-2.6.23.noarch/drivers/net/wireless/b43/dma.h.orig linux-2.6.23.noarch/drivers/net/wireless/b43/dma.h
---- linux-2.6.23.noarch/drivers/net/wireless/b43/dma.h.orig	2007-11-15 22:41:09.000000000 -0500
-+++ linux-2.6.23.noarch/drivers/net/wireless/b43/dma.h	2007-11-15 22:44:59.000000000 -0500
-@@ -260,6 +260,13 @@ static inline u32 b43_dma_read(struct b4
- static inline
-     void b43_dma_write(struct b43_dmaring *ring, u16 offset, u32 value)
- {
-+	/* temporary debugging code */
-+	if (((offset == 8) || (offset == 0x28)) && ring->dma64 &&
-+	     ((value & 0x1FFF) != 0)) {
-+		printk(KERN_ERR "b43: bad desc ring address for 64-bit DMA"
-+		       " - offset, value: 0x%.2X 0x%.4X\n", offset, value);
-+		dump_stack();
-+	}
- 	b43_write32(ring->dev, ring->mmio_base + offset, value);
- }
- 
+Index: wireless-2.6/drivers/net/wireless/b43/wa.c
+===================================================================
+--- wireless-2.6.orig/drivers/net/wireless/b43/wa.c
++++ wireless-2.6/drivers/net/wireless/b43/wa.c
+@@ -642,6 +642,7 @@ void b43_wa_all(struct b43_wldev *dev)
+ 		case 6:
+ 		case 7:
+ 		case 8:
++		case 9:
+ 			b43_wa_tr_ltov(dev);
+ 			b43_wa_crs_ed(dev);
+ 			b43_wa_rssi_lt(dev);
+




More information about the fedora-extras-commits mailing list