[kernel] r11643 - in dists/trunk/linux-2.6/debian: . patches/features/all patches/series

Maximilian Attems maks at alioth.debian.org
Mon Jun 16 11:29:21 UTC 2008


Author: maks
Date: Mon Jun 16 11:28:20 2008
New Revision: 11643

Log:
add acenic request_firmware patch

hmm nr of disabled drivers goes down, thanks to upstream effort.


Added:
   dists/trunk/linux-2.6/debian/patches/features/all/drivers-net-acenic-firmwar_request.patch
Modified:
   dists/trunk/linux-2.6/debian/changelog
   dists/trunk/linux-2.6/debian/patches/series/1~experimental.1

Modified: dists/trunk/linux-2.6/debian/changelog
==============================================================================
--- dists/trunk/linux-2.6/debian/changelog	(original)
+++ dists/trunk/linux-2.6/debian/changelog	Mon Jun 16 11:28:20 2008
@@ -40,6 +40,7 @@
   * 486: enable OLPC support thanks Andres Salomon for merge. 
     Kconfig variable patch by Robert Millan (closes: #485063).
   * Add request_firmware patch for ip2.
+  * Add request_firmware patch for acenic. (closes: #284221)
 
   [ Martin Michlmayr ]
   * [arm/orion5x] Update the config to reflect upstream renaming this

Added: dists/trunk/linux-2.6/debian/patches/features/all/drivers-net-acenic-firmwar_request.patch
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/features/all/drivers-net-acenic-firmwar_request.patch	Mon Jun 16 11:28:20 2008
@@ -0,0 +1,296 @@
+Subject: [PATCH] firmware: convert acenic driver to request_firmware()
+From: David Woodhouse <dwmw2 at infradead.org>
+To: Jes Sorensen <jes at trained-monkey.org>
+Cc: netdev at vger.kernel.org, jaswinder at infradead.org
+
+Again with help from Jaswinder Singh.
+
+Omitting the large part of the patch which actually moves the firmware
+around, since you'll need to pull from the git tree to get the preceding
+patches if you want to test it anyway.
+
+We store the firmware in little-endian form now, and thus use
+__raw_writel() to write it to the device, to avoid byteswapping by
+writel(). I've revamped that loop in ace_copy() a little bit so it could
+probably do with being tested.
+
+I've dropped the information about SBSS and BSS sections of the firmware
+-- we were clearing the whole of the device's memory in advance anyway,
+so clearing the BSS sections for a _second_ time seems pointless. And
+since the text,rodata,data sections were (almost) contiguous, we now
+just load those as a single blob rather than keeping them separate.
+
+Although it probably isn't necessary, we do preserve the ability to
+change the load and start addresses from 0x4000, by putting them into a
+header at the beginning of the firmware blob, along with the version
+number.
+
+[ ported to debian -maks ]
+
+diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
+index f80c839..7677680 100644
+--- a/drivers/net/Kconfig
++++ b/drivers/net/Kconfig
+@@ -1912,8 +1912,8 @@ if NETDEV_1000
+ 
+ config ACENIC
+ 	tristate "Alteon AceNIC/3Com 3C985/NetGear GA620 Gigabit support"
+-	depends on BROKEN
+ 	depends on PCI
++	select FW_LOADER
+ 	---help---
+ 	  Say Y here if you have an Alteon AceNIC, 3Com 3C985(B), NetGear
+ 	  GA620, SGI Gigabit or Farallon PN9000-SX PCI Gigabit Ethernet
+@@ -1945,6 +1946,23 @@ config ACENIC_OMIT_TIGON_I
+ 
+ 	  The safe and default value for this is N.
+ 
++config ACENIC_TG1_FIRMWARE
++	bool "Include firmware for old Tigon I based AceNICs"
++	depends on ACENIC && !ACENIC_OMIT_TIGON_I
++	---help---
++	  This includes firmware for the original Alteon AceNIC and 3Com 3C985
++	  (non B version) in the kernel image.
++	  Say 'N' and let it get loaded from userspace on demand 
++
++config ACENIC_TG2_FIRMWARE
++	bool "Include firmware for Alteon AceNIC/3Com 3C985/NetGear GA620 Gigabit"
++	depends on ACENIC
++	---help---
++	  This includes firmware for later Alteon AceNIC, 3Com 3C985B,
++	  NetGear GA620, SGI Gigabit or Farallon PN9000-SX PCI Gigabit
++	  Ethernet adapter.
++	  Say 'N' and let it get loaded from userspace on demand 
++
+ config DL2K
+ 	tristate "DL2000/TC902x-based Gigabit Ethernet support"
+ 	depends on PCI
+diff --git a/drivers/net/acenic.c b/drivers/net/acenic.c
+index 6c19265..1e42734 100644
+--- a/drivers/net/acenic.c
++++ b/drivers/net/acenic.c
+@@ -67,6 +67,7 @@
+ #include <linux/mm.h>
+ #include <linux/highmem.h>
+ #include <linux/sockios.h>
++#include <linux/firmware.h>
+ 
+ #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
+ #include <linux/if_vlan.h>
+@@ -187,8 +188,6 @@ MODULE_DEVICE_TABLE(pci, acenic_pci_tbl);
+ #define MAX_RODATA_LEN	8*1024
+ #define MAX_DATA_LEN	2*1024
+ 
+-#include "acenic_firmware.h"
+-
+ #ifndef tigon2FwReleaseLocal
+ #define tigon2FwReleaseLocal 0
+ #endif
+@@ -418,6 +417,8 @@ static int dis_pci_mem_inval[ACE_MAX_MOD_PARMS] = {1, 1, 1, 1, 1, 1, 1, 1};
+ MODULE_AUTHOR("Jes Sorensen <jes at trained-monkey.org>");
+ MODULE_LICENSE("GPL");
+ MODULE_DESCRIPTION("AceNIC/3C985/GA620 Gigabit Ethernet driver");
++MODULE_FIRMWARE("acenic_tg1.bin");
++MODULE_FIRMWARE("acenic_tg2.bin");
+ 
+ module_param_array_named(link, link_state, int, NULL, 0);
+ module_param_array(trace, int, NULL, 0);
+@@ -939,8 +940,8 @@ static int __devinit ace_init(struct net_device *dev)
+ 	case 4:
+ 	case 5:
+ 		printk(KERN_INFO "  Tigon I  (Rev. %i), Firmware: %i.%i.%i, ",
+-		       tig_ver, tigonFwReleaseMajor, tigonFwReleaseMinor,
+-		       tigonFwReleaseFix);
++		       tig_ver, ap->firmware_major, ap->firmware_minor,
++		       ap->firmware_fix);
+ 		writel(0, &regs->LocalCtrl);
+ 		ap->version = 1;
+ 		ap->tx_ring_entries = TIGON_I_TX_RING_ENTRIES;
+@@ -948,8 +949,8 @@ static int __devinit ace_init(struct net_device *dev)
+ #endif
+ 	case 6:
+ 		printk(KERN_INFO "  Tigon II (Rev. %i), Firmware: %i.%i.%i, ",
+-		       tig_ver, tigon2FwReleaseMajor, tigon2FwReleaseMinor,
+-		       tigon2FwReleaseFix);
++		       tig_ver, ap->firmware_major, ap->firmware_minor,
++		       ap->firmware_fix);
+ 		writel(readl(&regs->CpuBCtrl) | CPU_HALT, &regs->CpuBCtrl);
+ 		readl(&regs->CpuBCtrl);		/* PCI write posting */
+ 		/*
+@@ -1201,7 +1202,9 @@ static int __devinit ace_init(struct net_device *dev)
+ 	memset(ap->info, 0, sizeof(struct ace_info));
+ 	memset(ap->skb, 0, sizeof(struct ace_skb));
+ 
+-	ace_load_firmware(dev);
++	if (ace_load_firmware(dev))
++		goto init_error;
++
+ 	ap->fw_running = 0;
+ 
+ 	tmp_ptr = ap->info_dma;
+@@ -1437,10 +1440,7 @@ static int __devinit ace_init(struct net_device *dev)
+ 	if (ap->version >= 2)
+ 		writel(tmp, &regs->TuneFastLink);
+ 
+-	if (ACE_IS_TIGON_I(ap))
+-		writel(tigonFwStartAddr, &regs->Pc);
+-	if (ap->version == 2)
+-		writel(tigon2FwStartAddr, &regs->Pc);
++	writel(ap->firmware_start, &regs->Pc);
+ 
+ 	writel(0, &regs->Mb0Lo);
+ 
+@@ -2763,8 +2763,8 @@ static void ace_get_drvinfo(struct net_device *dev,
+ 
+ 	strlcpy(info->driver, "acenic", sizeof(info->driver));
+ 	snprintf(info->version, sizeof(info->version), "%i.%i.%i",
+-		tigonFwReleaseMajor, tigonFwReleaseMinor,
+-		tigonFwReleaseFix);
++		 ap->firmware_major, ap->firmware_minor,
++		 ap->firmware_fix);
+ 
+ 	if (ap->pdev)
+ 		strlcpy(info->bus_info, pci_name(ap->pdev),
+@@ -2871,11 +2871,10 @@ static struct net_device_stats *ace_get_stats(struct net_device *dev)
+ }
+ 
+
+-static void __devinit ace_copy(struct ace_regs __iomem *regs, void *src,
+-			    u32 dest, int size)
++static void __devinit ace_copy(struct ace_regs __iomem *regs, const __le32 *src,
++			       u32 dest, int size)
+ {
+ 	void __iomem *tdest;
+-	u32 *wsrc;
+ 	short tsize, i;
+ 
+ 	if (size <= 0)
+@@ -2887,20 +2886,15 @@ static void __devinit ace_copy(struct ace_regs __iomem *regs, void *src,
+ 		tdest = (void __iomem *) &regs->Window +
+ 			(dest & (ACE_WINDOW_SIZE - 1));
+ 		writel(dest & ~(ACE_WINDOW_SIZE - 1), &regs->WinBase);
+-		/*
+-		 * This requires byte swapping on big endian, however
+-		 * writel does that for us
+-		 */
+-		wsrc = src;
+ 		for (i = 0; i < (tsize / 4); i++) {
+-			writel(wsrc[i], tdest + i*4);
++			/* Firmware is stored as little-endian */
++			__raw_writel(*src, tdest);
++			src++;
++			tdest += 4;
++			dest += 4;
++			size -= 4;
+ 		}
+-		dest += tsize;
+-		src += tsize;
+-		size -= tsize;
+ 	}
+-
+-	return;
+ }
+ 
+
+@@ -2939,8 +2933,13 @@ static void __devinit ace_clear(struct ace_regs __iomem *regs, u32 dest, int siz
+  */
+ static int __devinit ace_load_firmware(struct net_device *dev)
+ {
++	const struct firmware *fw;
++	const char *fw_name = "acenic_tg2.bin";
+ 	struct ace_private *ap = netdev_priv(dev);
+ 	struct ace_regs __iomem *regs = ap->regs;
++	const __le32 *fw_data;
++	u32 load_addr;
++	int ret;
+ 
+ 	if (!(readl(&regs->CpuCtrl) & CPU_HALTED)) {
+ 		printk(KERN_ERR "%s: trying to download firmware while the "
+@@ -2948,28 +2947,52 @@ static int __devinit ace_load_firmware(struct net_device *dev)
+ 		return -EFAULT;
+ 	}
+ 
++	if (ACE_IS_TIGON_I(ap))
++		fw_name = "acenic_tg1.bin";
++
++	ret = request_firmware(&fw, fw_name, &ap->pdev->dev);
++	if (ret) {
++		printk(KERN_ERR "%s: Failed to load firmware \"%s\"\n",
++		       ap->name, fw_name);
++		return ret;
++	}
++
++	fw_data = (void *)fw->data;
++
++	/* Firmware blob starts with version numbers, followed by
++	   load and start address. Remainder is the blob to be loaded
++	   contiguously from load address. We don't bother to represent
++	   the BSS/SBSS sections any more, since we were clearing the
++	   whole thing anyway. */
++	ap->firmware_major = fw->data[0];
++	ap->firmware_minor = fw->data[1];
++	ap->firmware_fix = fw->data[2];
++
++	ap->firmware_start = le32_to_cpu(fw_data[1]);
++	if (ap->firmware_start < 0x4000 || ap->firmware_start >= 0x80000) {
++		printk(KERN_ERR "%s: bogus load address %08x in \"%s\"\n",
++		       ap->name, ap->firmware_start, fw_name);
++		ret = -EINVAL;
++		goto out;
++	}
++
++	load_addr = le32_to_cpu(fw_data[2]);
++	if (load_addr < 0x4000 || load_addr >= 0x80000) {
++		printk(KERN_ERR "%s: bogus load address %08x in \"%s\"\n",
++		       ap->name, load_addr, fw_name);
++		ret = -EINVAL;
++		goto out;
++	}
++
+ 	/*
+-	 * Do not try to clear more than 512KB or we end up seeing
+-	 * funny things on NICs with only 512KB SRAM
++	 * Do not try to clear more than 512KiB or we end up seeing
++	 * funny things on NICs with only 512KiB SRAM
+ 	 */
+ 	ace_clear(regs, 0x2000, 0x80000-0x2000);
+-	if (ACE_IS_TIGON_I(ap)) {
+-		ace_copy(regs, tigonFwText, tigonFwTextAddr, tigonFwTextLen);
+-		ace_copy(regs, tigonFwData, tigonFwDataAddr, tigonFwDataLen);
+-		ace_copy(regs, tigonFwRodata, tigonFwRodataAddr,
+-			 tigonFwRodataLen);
+-		ace_clear(regs, tigonFwBssAddr, tigonFwBssLen);
+-		ace_clear(regs, tigonFwSbssAddr, tigonFwSbssLen);
+-	}else if (ap->version == 2) {
+-		ace_clear(regs, tigon2FwBssAddr, tigon2FwBssLen);
+-		ace_clear(regs, tigon2FwSbssAddr, tigon2FwSbssLen);
+-		ace_copy(regs, tigon2FwText, tigon2FwTextAddr,tigon2FwTextLen);
+-		ace_copy(regs, tigon2FwRodata, tigon2FwRodataAddr,
+-			 tigon2FwRodataLen);
+-		ace_copy(regs, tigon2FwData, tigon2FwDataAddr,tigon2FwDataLen);
+-	}
+-
+-	return 0;
++	ace_copy(regs, &fw_data[3], load_addr, fw->size-12);
++ out:
++	release_firmware(fw);
++	return ret;
+ }
+ 
+
+diff --git a/drivers/net/acenic.h b/drivers/net/acenic.h
+index 60ed183..cf7e80e 100644
+--- a/drivers/net/acenic.h
++++ b/drivers/net/acenic.h
+@@ -695,6 +695,10 @@ struct ace_private
+ #endif
+ 	struct net_device_stats stats;
+ 	int			pci_using_dac;
++	u8			firmware_major;
++	u8			firmware_minor;
++	u8			firmware_fix;
++	u32			firmware_start;
+ };
+ 
+
+

Modified: dists/trunk/linux-2.6/debian/patches/series/1~experimental.1
==============================================================================
--- dists/trunk/linux-2.6/debian/patches/series/1~experimental.1	(original)
+++ dists/trunk/linux-2.6/debian/patches/series/1~experimental.1	Mon Jun 16 11:28:20 2008
@@ -11,6 +11,7 @@
 #+ debian/dfsg/drivers-net-bnx2-request_firmware-1.patch
 + features/all/drivers-usb-serial-keyspan-request_firmware.patch
 + features/all/drivers-char-ip2-request_firmware.patch
++ features/all/drivers-net-acenic-firmwar_request.patch
 + features/all/export-gfs2-locking-symbols.patch
 + features/all/export-unionfs-symbols.patch
 



More information about the Kernel-svn-changes mailing list