[kernel] r12930 - in dists/trunk/linux-2.6/debian: . patches/debian/dfsg patches/features/all patches/series
Ben Hutchings
benh at alioth.debian.org
Sun Feb 22 21:30:56 UTC 2009
Author: benh
Date: Sun Feb 22 21:30:55 2009
New Revision: 12930
Log:
Remove remaining sourceless firmware
Added:
dists/trunk/linux-2.6/debian/patches/features/all/drivers-gpu-drm-mga-request_firmware.patch
dists/trunk/linux-2.6/debian/patches/features/all/drivers-gpu-drm-r128-request_firmware.patch
dists/trunk/linux-2.6/debian/patches/features/all/drivers-gpu-drm-radeon-request_firmware.patch
dists/trunk/linux-2.6/debian/patches/features/all/drivers-net-tehuti-request_firmware.patch
dists/trunk/linux-2.6/debian/patches/features/all/drivers-net-typhoon-request_firmware.patch
dists/trunk/linux-2.6/debian/patches/features/all/drivers-scsi-qla1280-request_firmware.patch
Modified:
dists/trunk/linux-2.6/debian/changelog
dists/trunk/linux-2.6/debian/patches/debian/dfsg/files-1
dists/trunk/linux-2.6/debian/patches/series/1~experimental.1
dists/trunk/linux-2.6/debian/patches/series/orig-0
Modified: dists/trunk/linux-2.6/debian/changelog
==============================================================================
--- dists/trunk/linux-2.6/debian/changelog (original)
+++ dists/trunk/linux-2.6/debian/changelog Sun Feb 22 21:30:55 2009
@@ -32,7 +32,16 @@
the option cannot be made modular at the moment and bloats the kernel
image too much.
- -- maximilian attems <maks at debian.org> Thu, 19 Feb 2009 13:25:20 +0100
+ [ Ben Hutchings ]
+ * Remove firmware from drivers and make them use request_firmware():
+ - mga (closes: #502666)
+ - qla1280 (closes: #502667)
+ - r128 (closes: #494007)
+ - radeon (closes: #494009)
+ - tehuti (closes: #501153)
+ - typhoon (closes: #502669)
+
+ -- Ben Hutchings <ben at decadent.org.uk> Sun, 22 Feb 2009 03:14:38 +0000
linux-2.6 (2.6.28-2) UNRELEASED; urgency=low
Modified: dists/trunk/linux-2.6/debian/patches/debian/dfsg/files-1
==============================================================================
--- dists/trunk/linux-2.6/debian/patches/debian/dfsg/files-1 (original)
+++ dists/trunk/linux-2.6/debian/patches/debian/dfsg/files-1 Sun Feb 22 21:30:55 2009
@@ -23,6 +23,12 @@
rm firmware/vicam
rm firmware/yamaha
+rm drivers/gpu/drm/mga/mga_ucode.h
+
+unifdef drivers/gpu/drm/r128/r128_cce.c -UREMOVE_DFSG
+
+rm drivers/gpu/drm/radeon/radeon_microcode.h
+
rm drivers/net/appletalk/cops.c
rm drivers/net/appletalk/cops.h
rm drivers/net/appletalk/cops_ffdrv.h
@@ -38,10 +44,18 @@
rm drivers/net/myri_code.h
+rm drivers/net/tehuti_fw.h
+
rm drivers/net/tokenring/3c359.c
rm drivers/net/tokenring/3c359.h
rm drivers/net/tokenring/3c359_microcode.h
+rm drivers/net/typhoon-firmware.h
+
+rm drivers/scsi/ql1040_fw.h
+rm drivers/scsi/ql12160_fw.h
+rm drivers/scsi/ql1280_fw.h
+
rm drivers/scsi/qlogicpti_asm.c
rm sound/pci/cs46xx/cs46xx_image.h
Added: dists/trunk/linux-2.6/debian/patches/features/all/drivers-gpu-drm-mga-request_firmware.patch
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/features/all/drivers-gpu-drm-mga-request_firmware.patch Sun Feb 22 21:30:55 2009
@@ -0,0 +1,295 @@
+From 0175b4bdefff22f837203fd47f568c4647f24a4f Mon Sep 17 00:00:00 2001
+From: Ben Hutchings <ben at decadent.org.uk>
+Date: Sat, 18 Oct 2008 04:28:10 +0100
+Subject: [PATCH 18/24] mga: Use request_firmware() to load microcode
+
+Image format is IHEX, one record for each pipe in order (record
+addresses are ignored).
+
+Compile-tested only.
+---
+ drivers/gpu/drm/Kconfig | 2 +-
+ drivers/gpu/drm/mga/mga_dma.c | 4 +-
+ drivers/gpu/drm/mga/mga_drv.h | 1 -
+ drivers/gpu/drm/mga/mga_warp.c | 180 +++++++++++++++++-----------------------
+ include/drm/mga_drm.h | 2 +-
+ 5 files changed, 82 insertions(+), 107 deletions(-)
+
+diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
+index 853814c..a61d10a 100644
+--- a/drivers/gpu/drm/Kconfig
++++ b/drivers/gpu/drm/Kconfig
+@@ -81,7 +81,7 @@ endchoice
+ config DRM_MGA
+ tristate "Matrox g200/g400"
+ depends on DRM
+- depends on BROKEN
++ select FW_LOADER
+ help
+ Choose this option if you have a Matrox G200, G400 or G450 graphics
+ card. If M is selected, the module will be called mga. AGP
+diff --git a/drivers/gpu/drm/mga/mga_dma.c b/drivers/gpu/drm/mga/mga_dma.c
+index b49c5ff..7e0b106 100644
+--- a/drivers/gpu/drm/mga/mga_dma.c
++++ b/drivers/gpu/drm/mga/mga_dma.c
+@@ -447,7 +447,7 @@ static int mga_do_agp_dma_bootstrap(struct drm_device * dev,
+ {
+ drm_mga_private_t *const dev_priv =
+ (drm_mga_private_t *) dev->dev_private;
+- unsigned int warp_size = mga_warp_microcode_size(dev_priv);
++ unsigned int warp_size = MGA_WARP_UCODE_SIZE;
+ int err;
+ unsigned offset;
+ const unsigned secondary_size = dma_bs->secondary_bin_count
+@@ -622,7 +622,7 @@ static int mga_do_pci_dma_bootstrap(struct drm_device * dev,
+ {
+ drm_mga_private_t *const dev_priv =
+ (drm_mga_private_t *) dev->dev_private;
+- unsigned int warp_size = mga_warp_microcode_size(dev_priv);
++ unsigned int warp_size = MGA_WARP_UCODE_SIZE;
+ unsigned int primary_size;
+ unsigned int bin_count;
+ int err;
+diff --git a/drivers/gpu/drm/mga/mga_drv.h b/drivers/gpu/drm/mga/mga_drv.h
+index 88257c2..9e40226 100644
+--- a/drivers/gpu/drm/mga/mga_drv.h
++++ b/drivers/gpu/drm/mga/mga_drv.h
+@@ -177,7 +177,6 @@ extern void mga_do_dma_wrap_end(drm_mga_private_t * dev_priv);
+ extern int mga_freelist_put(struct drm_device * dev, struct drm_buf * buf);
+
+ /* mga_warp.c */
+-extern unsigned int mga_warp_microcode_size(const drm_mga_private_t * dev_priv);
+ extern int mga_warp_install_microcode(drm_mga_private_t * dev_priv);
+ extern int mga_warp_init(drm_mga_private_t * dev_priv);
+
+diff --git a/drivers/gpu/drm/mga/mga_warp.c b/drivers/gpu/drm/mga/mga_warp.c
+index 651b93c..9aad484 100644
+--- a/drivers/gpu/drm/mga/mga_warp.c
++++ b/drivers/gpu/drm/mga/mga_warp.c
+@@ -27,132 +27,108 @@
+ * Gareth Hughes <gareth at valinux.com>
+ */
+
++#include <linux/firmware.h>
++#include <linux/ihex.h>
++#include <linux/platform_device.h>
++
+ #include "drmP.h"
+ #include "drm.h"
+ #include "mga_drm.h"
+ #include "mga_drv.h"
+-#include "mga_ucode.h"
++
++#define FIRMWARE_G200 "matrox/g200_warp.fw"
++#define FIRMWARE_G400 "matrox/g400_warp.fw"
++
++MODULE_FIRMWARE(FIRMWARE_G200);
++MODULE_FIRMWARE(FIRMWARE_G400);
+
+ #define MGA_WARP_CODE_ALIGN 256 /* in bytes */
+
+-#define WARP_UCODE_SIZE( which ) \
+- ((sizeof(which) / MGA_WARP_CODE_ALIGN + 1) * MGA_WARP_CODE_ALIGN)
+-
+-#define WARP_UCODE_INSTALL( which, where ) \
+-do { \
+- DRM_DEBUG( " pcbase = 0x%08lx vcbase = %p\n", pcbase, vcbase );\
+- dev_priv->warp_pipe_phys[where] = pcbase; \
+- memcpy( vcbase, which, sizeof(which) ); \
+- pcbase += WARP_UCODE_SIZE( which ); \
+- vcbase += WARP_UCODE_SIZE( which ); \
+-} while (0)
+-
+-static const unsigned int mga_warp_g400_microcode_size =
+- (WARP_UCODE_SIZE(warp_g400_tgz) +
+- WARP_UCODE_SIZE(warp_g400_tgza) +
+- WARP_UCODE_SIZE(warp_g400_tgzaf) +
+- WARP_UCODE_SIZE(warp_g400_tgzf) +
+- WARP_UCODE_SIZE(warp_g400_tgzs) +
+- WARP_UCODE_SIZE(warp_g400_tgzsa) +
+- WARP_UCODE_SIZE(warp_g400_tgzsaf) +
+- WARP_UCODE_SIZE(warp_g400_tgzsf) +
+- WARP_UCODE_SIZE(warp_g400_t2gz) +
+- WARP_UCODE_SIZE(warp_g400_t2gza) +
+- WARP_UCODE_SIZE(warp_g400_t2gzaf) +
+- WARP_UCODE_SIZE(warp_g400_t2gzf) +
+- WARP_UCODE_SIZE(warp_g400_t2gzs) +
+- WARP_UCODE_SIZE(warp_g400_t2gzsa) +
+- WARP_UCODE_SIZE(warp_g400_t2gzsaf) + WARP_UCODE_SIZE(warp_g400_t2gzsf));
+-
+-static const unsigned int mga_warp_g200_microcode_size =
+- (WARP_UCODE_SIZE(warp_g200_tgz) +
+- WARP_UCODE_SIZE(warp_g200_tgza) +
+- WARP_UCODE_SIZE(warp_g200_tgzaf) +
+- WARP_UCODE_SIZE(warp_g200_tgzf) +
+- WARP_UCODE_SIZE(warp_g200_tgzs) +
+- WARP_UCODE_SIZE(warp_g200_tgzsa) +
+- WARP_UCODE_SIZE(warp_g200_tgzsaf) + WARP_UCODE_SIZE(warp_g200_tgzsf));
+-
+-unsigned int mga_warp_microcode_size(const drm_mga_private_t * dev_priv)
++#define WARP_UCODE_SIZE(size) ALIGN(size, MGA_WARP_CODE_ALIGN)
++
++int mga_warp_install_microcode(drm_mga_private_t * dev_priv)
+ {
++ unsigned char *vcbase = dev_priv->warp->handle;
++ unsigned long pcbase = dev_priv->warp->offset;
++ const char *firmware_name;
++ struct platform_device *pdev;
++ const struct firmware *fw = NULL;
++ const struct ihex_binrec *rec;
++ unsigned int size;
++ int n_pipes, where;
++ int rc = 0;
++
+ switch (dev_priv->chipset) {
+ case MGA_CARD_TYPE_G400:
+ case MGA_CARD_TYPE_G550:
+- return PAGE_ALIGN(mga_warp_g400_microcode_size);
++ firmware_name = FIRMWARE_G400;
++ n_pipes = MGA_MAX_G400_PIPES;
++ break;
+ case MGA_CARD_TYPE_G200:
+- return PAGE_ALIGN(mga_warp_g200_microcode_size);
++ firmware_name = FIRMWARE_G200;
++ n_pipes = MGA_MAX_G200_PIPES;
++ break;
+ default:
+- return 0;
++ return -EINVAL;
+ }
+-}
+-
+-static int mga_warp_install_g400_microcode(drm_mga_private_t * dev_priv)
+-{
+- unsigned char *vcbase = dev_priv->warp->handle;
+- unsigned long pcbase = dev_priv->warp->offset;
+-
+- memset(dev_priv->warp_pipe_phys, 0, sizeof(dev_priv->warp_pipe_phys));
+-
+- WARP_UCODE_INSTALL(warp_g400_tgz, MGA_WARP_TGZ);
+- WARP_UCODE_INSTALL(warp_g400_tgzf, MGA_WARP_TGZF);
+- WARP_UCODE_INSTALL(warp_g400_tgza, MGA_WARP_TGZA);
+- WARP_UCODE_INSTALL(warp_g400_tgzaf, MGA_WARP_TGZAF);
+- WARP_UCODE_INSTALL(warp_g400_tgzs, MGA_WARP_TGZS);
+- WARP_UCODE_INSTALL(warp_g400_tgzsf, MGA_WARP_TGZSF);
+- WARP_UCODE_INSTALL(warp_g400_tgzsa, MGA_WARP_TGZSA);
+- WARP_UCODE_INSTALL(warp_g400_tgzsaf, MGA_WARP_TGZSAF);
+-
+- WARP_UCODE_INSTALL(warp_g400_t2gz, MGA_WARP_T2GZ);
+- WARP_UCODE_INSTALL(warp_g400_t2gzf, MGA_WARP_T2GZF);
+- WARP_UCODE_INSTALL(warp_g400_t2gza, MGA_WARP_T2GZA);
+- WARP_UCODE_INSTALL(warp_g400_t2gzaf, MGA_WARP_T2GZAF);
+- WARP_UCODE_INSTALL(warp_g400_t2gzs, MGA_WARP_T2GZS);
+- WARP_UCODE_INSTALL(warp_g400_t2gzsf, MGA_WARP_T2GZSF);
+- WARP_UCODE_INSTALL(warp_g400_t2gzsa, MGA_WARP_T2GZSA);
+- WARP_UCODE_INSTALL(warp_g400_t2gzsaf, MGA_WARP_T2GZSAF);
+-
+- return 0;
+-}
+-
+-static int mga_warp_install_g200_microcode(drm_mga_private_t * dev_priv)
+-{
+- unsigned char *vcbase = dev_priv->warp->handle;
+- unsigned long pcbase = dev_priv->warp->offset;
+-
+- memset(dev_priv->warp_pipe_phys, 0, sizeof(dev_priv->warp_pipe_phys));
+-
+- WARP_UCODE_INSTALL(warp_g200_tgz, MGA_WARP_TGZ);
+- WARP_UCODE_INSTALL(warp_g200_tgzf, MGA_WARP_TGZF);
+- WARP_UCODE_INSTALL(warp_g200_tgza, MGA_WARP_TGZA);
+- WARP_UCODE_INSTALL(warp_g200_tgzaf, MGA_WARP_TGZAF);
+- WARP_UCODE_INSTALL(warp_g200_tgzs, MGA_WARP_TGZS);
+- WARP_UCODE_INSTALL(warp_g200_tgzsf, MGA_WARP_TGZSF);
+- WARP_UCODE_INSTALL(warp_g200_tgzsa, MGA_WARP_TGZSA);
+- WARP_UCODE_INSTALL(warp_g200_tgzsaf, MGA_WARP_TGZSAF);
+
+- return 0;
+-}
++ pdev = platform_device_register_simple("mga_warp", 0, NULL, 0);
++ if (IS_ERR(pdev)) {
++ DRM_ERROR("mga: Failed to register microcode\n");
++ return PTR_ERR(pdev);
++ }
++ rc = request_ihex_firmware(&fw, firmware_name, &pdev->dev);
++ platform_device_unregister(pdev);
++ if (rc) {
++ DRM_ERROR("mga: Failed to load microcode \"%s\"\n",
++ firmware_name);
++ return rc;
++ }
+
+-int mga_warp_install_microcode(drm_mga_private_t * dev_priv)
+-{
+- const unsigned int size = mga_warp_microcode_size(dev_priv);
++ size = 0;
++ where = 0;
++ for (rec = (const struct ihex_binrec *)fw->data;
++ rec;
++ rec = ihex_next_binrec(rec)) {
++ size += WARP_UCODE_SIZE(be16_to_cpu(rec->len));
++ where++;
++ }
+
++ if (where != n_pipes) {
++ DRM_ERROR("mga: Invalid microcode \"%s\"\n", firmware_name);
++ rc = -EINVAL;
++ goto out;
++ }
++ size = PAGE_ALIGN(size);
+ DRM_DEBUG("MGA ucode size = %d bytes\n", size);
+ if (size > dev_priv->warp->size) {
+ DRM_ERROR("microcode too large! (%u > %lu)\n",
+ size, dev_priv->warp->size);
+- return -ENOMEM;
++ rc = -ENOMEM;
++ goto out;
+ }
+
+- switch (dev_priv->chipset) {
+- case MGA_CARD_TYPE_G400:
+- case MGA_CARD_TYPE_G550:
+- return mga_warp_install_g400_microcode(dev_priv);
+- case MGA_CARD_TYPE_G200:
+- return mga_warp_install_g200_microcode(dev_priv);
+- default:
+- return -EINVAL;
++ memset(dev_priv->warp_pipe_phys, 0, sizeof(dev_priv->warp_pipe_phys));
++
++ where = 0;
++ for (rec = (const struct ihex_binrec *)fw->data;
++ rec;
++ rec = ihex_next_binrec(rec)) {
++ unsigned int src_size, dst_size;
++
++ DRM_DEBUG(" pcbase = 0x%08lx vcbase = %p\n", pcbase, vcbase);
++ dev_priv->warp_pipe_phys[where] = pcbase;
++ src_size = be16_to_cpu(rec->len);
++ dst_size = WARP_UCODE_SIZE(src_size);
++ memcpy(vcbase, rec->data, src_size);
++ pcbase += dst_size;
++ vcbase += dst_size;
++ where++;
+ }
++
++out:
++ release_firmware(fw);
++ return rc;
+ }
+
+ #define WMISC_EXPECTED (MGA_WUCODECACHE_ENABLE | MGA_WMASTER_ENABLE)
+diff --git a/include/drm/mga_drm.h b/include/drm/mga_drm.h
+index 944b50a..0b8fc27 100644
+--- a/include/drm/mga_drm.h
++++ b/include/drm/mga_drm.h
+@@ -69,7 +69,7 @@
+ #define MGA_MAX_G200_PIPES 8 /* no multitex */
+ #define MGA_MAX_G400_PIPES 16
+ #define MGA_MAX_WARP_PIPES MGA_MAX_G400_PIPES
+-#define MGA_WARP_UCODE_SIZE 32768 /* in bytes */
++#define MGA_WARP_UCODE_SIZE 40960 /* in bytes */
+
+ #define MGA_CARD_TYPE_G200 1
+ #define MGA_CARD_TYPE_G400 2
+--
+1.6.1.3
+
Added: dists/trunk/linux-2.6/debian/patches/features/all/drivers-gpu-drm-r128-request_firmware.patch
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/features/all/drivers-gpu-drm-r128-request_firmware.patch Sun Feb 22 21:30:55 2009
@@ -0,0 +1,139 @@
+From 870bed4eea53fbaeb8f585fb9b89d23d9d8c2436 Mon Sep 17 00:00:00 2001
+From: Ben Hutchings <ben at decadent.org.uk>
+Date: Sat, 18 Oct 2008 02:27:57 +0100
+Subject: [PATCH 03/24] r128: Use request_firmware() to load CCE microcode
+
+Firmware blob looks like this:
+ __be32 datah
+ __be32 datal
+
+Compile-tested only.
+---
+ drivers/gpu/drm/Kconfig | 2 +-
+ drivers/gpu/drm/r128/r128_cce.c | 54 ++++++++++++++++++++++++++++++++++----
+ 2 files changed, 49 insertions(+), 7 deletions(-)
+
+diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
+index 725f244..e6f4401 100644
+--- a/drivers/gpu/drm/Kconfig
++++ b/drivers/gpu/drm/Kconfig
+@@ -26,7 +26,7 @@ config DRM_TDFX
+ config DRM_R128
+ tristate "ATI Rage 128"
+ depends on DRM && PCI
+- depends on BROKEN
++ select FW_LOADER
+ help
+ Choose this option if you have an ATI Rage 128 graphics card. If M
+ is selected, the module will be called r128. AGP support for
+diff --git a/drivers/gpu/drm/r128/r128_cce.c b/drivers/gpu/drm/r128/r128_cce.c
+index a9ee89a..63bed21 100644
+--- a/drivers/gpu/drm/r128/r128_cce.c
++++ b/drivers/gpu/drm/r128/r128_cce.c
+@@ -29,6 +29,9 @@
+ * Gareth Hughes <gareth at valinux.com>
+ */
+
++#include <linux/firmware.h>
++#include <linux/platform_device.h>
++
+ #include "drmP.h"
+ #include "drm.h"
+ #include "r128_drm.h"
+@@ -36,6 +39,9 @@
+
+ #define R128_FIFO_DEBUG 0
+
++#define FIRMWARE_NAME "r128/r128_cce.bin"
++
++MODULE_FIRMWARE(FIRMWARE_NAME);
+
+ static int R128_READ_PLL(struct drm_device * dev, int addr)
+ {
+@@ -132,20 +138,50 @@ static int r128_do_wait_for_idle(drm_r128_private_t * dev_priv)
+ */
+
+ /* Load the microcode for the CCE */
+-static void r128_cce_load_microcode(drm_r128_private_t * dev_priv)
++static int r128_cce_load_microcode(drm_r128_private_t *dev_priv)
+ {
+- int i;
++ struct platform_device *pdev;
++ const struct firmware *fw;
++ const __be32 *fw_data;
++ int rc, i;
+
+ DRM_DEBUG("\n");
+
++ pdev = platform_device_register_simple("r128_cce", 0, NULL, 0);
++ if (IS_ERR(pdev)) {
++ printk(KERN_ERR "r128_cce: Failed to register firmware\n");
++ return PTR_ERR(pdev);
++ }
++ rc = request_firmware(&fw, FIRMWARE_NAME, &pdev->dev);
++ platform_device_unregister(pdev);
++ if (rc) {
++ printk(KERN_ERR "r128_cce: Failed to load firmware \"%s\"\n",
++ FIRMWARE_NAME);
++ return rc;
++ }
++
++ if (fw->size != 256 * 8) {
++ printk(KERN_ERR
++ "r128_cce: Bogus length %zu in firmware \"%s\"\n",
++ fw->size, FIRMWARE_NAME);
++ rc = -EINVAL;
++ goto out_release;
++ }
++
+ r128_do_wait_for_idle(dev_priv);
+
++ fw_data = (const __be32 *)fw->data;
+ R128_WRITE(R128_PM4_MICROCODE_ADDR, 0);
+ for (i = 0; i < 256; i++) {
+- R128_WRITE(R128_PM4_MICROCODE_DATAH, r128_cce_microcode[i * 2]);
++ R128_WRITE(R128_PM4_MICROCODE_DATAH,
++ be32_to_cpup(&fw_data[i * 2]));
+ R128_WRITE(R128_PM4_MICROCODE_DATAL,
+- r128_cce_microcode[i * 2 + 1]);
++ be32_to_cpup(&fw_data[i * 2 + 1]));
+ }
++
++out_release:
++ release_firmware(fw);
++ return rc;
+ }
+
+ /* Flush any pending commands to the CCE. This should only be used just
+@@ -306,6 +342,7 @@ static void r128_cce_init_ring_buffer(struct drm_device * dev,
+ static int r128_do_init_cce(struct drm_device * dev, drm_r128_init_t * init)
+ {
+ drm_r128_private_t *dev_priv;
++ int rc;
+
+ DRM_DEBUG("\n");
+
+@@ -532,13 +569,18 @@ static int r128_do_init_cce(struct drm_device * dev, drm_r128_init_t * init)
+ #endif
+
+ r128_cce_init_ring_buffer(dev, dev_priv);
+- r128_cce_load_microcode(dev_priv);
++ rc = r128_cce_load_microcode(dev_priv);
+
+ dev->dev_private = (void *)dev_priv;
+
+ r128_do_engine_reset(dev);
+
+- return 0;
++ if (rc) {
++ DRM_ERROR("Failed to load firmware!\n");
++ r128_do_cleanup_cce(dev);
++ }
++
++ return rc;
+ }
+
+ int r128_do_cleanup_cce(struct drm_device * dev)
+--
+1.6.1.3
+
Added: dists/trunk/linux-2.6/debian/patches/features/all/drivers-gpu-drm-radeon-request_firmware.patch
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/features/all/drivers-gpu-drm-radeon-request_firmware.patch Sun Feb 22 21:30:55 2009
@@ -0,0 +1,239 @@
+From 3e3f2f1f9514969b9df1b64a9a12a7a5a1aa7550 Mon Sep 17 00:00:00 2001
+From: Ben Hutchings <ben at decadent.org.uk>
+Date: Wed, 15 Oct 2008 01:29:35 +0100
+Subject: [PATCH 06/24] radeon: Use request_firmware() to load CP microcode
+
+Tested on Radeon 7500 (RV200) with and without firmware installed.
+---
+ drivers/gpu/drm/Kconfig | 2 +-
+ drivers/gpu/drm/radeon/radeon_cp.c | 115 +++++++++++++++++++++++------------
+ drivers/gpu/drm/radeon/radeon_drv.h | 6 ++
+ 3 files changed, 83 insertions(+), 40 deletions(-)
+
+diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
+index a93d249..09ed655 100644
+--- a/drivers/gpu/drm/Kconfig
++++ b/drivers/gpu/drm/Kconfig
+@@ -35,7 +35,7 @@ config DRM_R128
+ config DRM_RADEON
+ tristate "ATI Radeon"
+ depends on DRM && PCI
+- depends on BROKEN
++ select FW_LOADER
+ help
+ Choose this option if you have an ATI Radeon graphics card. There
+ are both PCI and AGP versions. You don't need to choose this to
+diff --git a/drivers/gpu/drm/radeon/radeon_cp.c b/drivers/gpu/drm/radeon/radeon_cp.c
+index dcebb4b..a460149 100644
+--- a/drivers/gpu/drm/radeon/radeon_cp.c
++++ b/drivers/gpu/drm/radeon/radeon_cp.c
+@@ -35,10 +35,23 @@
+ #include "radeon_drv.h"
+ #include "r300_reg.h"
+
+-#include "radeon_microcode.h"
+-
+ #define RADEON_FIFO_DEBUG 0
+
++/* Firmware Names */
++#define FIRMWARE_R100 "radeon/R100_cp.bin"
++#define FIRMWARE_R200 "radeon/R200_cp.bin"
++#define FIRMWARE_R300 "radeon/R300_cp.bin"
++#define FIRMWARE_R420 "radeon/R420_cp.bin"
++#define FIRMWARE_RS690 "radeon/RS690_cp.bin"
++#define FIRMWARE_R520 "radeon/R520_cp.bin"
++
++MODULE_FIRMWARE(FIRMWARE_R100);
++MODULE_FIRMWARE(FIRMWARE_R200);
++MODULE_FIRMWARE(FIRMWARE_R300);
++MODULE_FIRMWARE(FIRMWARE_R420);
++MODULE_FIRMWARE(FIRMWARE_RS690);
++MODULE_FIRMWARE(FIRMWARE_R520);
++
+ static int radeon_do_cleanup_cp(struct drm_device * dev);
+ static void radeon_do_cp_start(drm_radeon_private_t * dev_priv);
+
+@@ -318,37 +331,34 @@ static void radeon_init_pipes(drm_radeon_private_t *dev_priv)
+ */
+
+ /* Load the microcode for the CP */
+-static void radeon_cp_load_microcode(drm_radeon_private_t * dev_priv)
++static int radeon_cp_init_microcode(drm_radeon_private_t *dev_priv)
+ {
+- int i;
++ struct platform_device *pdev;
++ const char *fw_name = NULL;
++ int err;
++
+ DRM_DEBUG("\n");
+
+- radeon_do_wait_for_idle(dev_priv);
++ pdev = platform_device_register_simple("radeon_cp", 0, NULL, 0);
++ err = IS_ERR(pdev);
++ if (err) {
++ printk(KERN_ERR "radeon_cp: Failed to register firmware\n");
++ return -EINVAL;
++ }
+
+- RADEON_WRITE(RADEON_CP_ME_RAM_ADDR, 0);
+ if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R100) ||
+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV100) ||
+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV200) ||
+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS100) ||
+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS200)) {
+ DRM_INFO("Loading R100 Microcode\n");
+- for (i = 0; i < 256; i++) {
+- RADEON_WRITE(RADEON_CP_ME_RAM_DATAH,
+- R100_cp_microcode[i][1]);
+- RADEON_WRITE(RADEON_CP_ME_RAM_DATAL,
+- R100_cp_microcode[i][0]);
+- }
++ fw_name = FIRMWARE_R100;
+ } else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R200) ||
+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV250) ||
+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV280) ||
+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS300)) {
+ DRM_INFO("Loading R200 Microcode\n");
+- for (i = 0; i < 256; i++) {
+- RADEON_WRITE(RADEON_CP_ME_RAM_DATAH,
+- R200_cp_microcode[i][1]);
+- RADEON_WRITE(RADEON_CP_ME_RAM_DATAL,
+- R200_cp_microcode[i][0]);
+- }
++ fw_name = FIRMWARE_R200;
+ } else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R300) ||
+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R350) ||
+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV350) ||
+@@ -356,31 +366,16 @@ static void radeon_cp_load_microcode(drm_radeon_private_t * dev_priv)
+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS400) ||
+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS480)) {
+ DRM_INFO("Loading R300 Microcode\n");
+- for (i = 0; i < 256; i++) {
+- RADEON_WRITE(RADEON_CP_ME_RAM_DATAH,
+- R300_cp_microcode[i][1]);
+- RADEON_WRITE(RADEON_CP_ME_RAM_DATAL,
+- R300_cp_microcode[i][0]);
+- }
++ fw_name = FIRMWARE_R300;
+ } else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R420) ||
+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R423) ||
+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV410)) {
+ DRM_INFO("Loading R400 Microcode\n");
+- for (i = 0; i < 256; i++) {
+- RADEON_WRITE(RADEON_CP_ME_RAM_DATAH,
+- R420_cp_microcode[i][1]);
+- RADEON_WRITE(RADEON_CP_ME_RAM_DATAL,
+- R420_cp_microcode[i][0]);
+- }
++ fw_name = FIRMWARE_R420;
+ } else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690) ||
+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS740)) {
+ DRM_INFO("Loading RS690/RS740 Microcode\n");
+- for (i = 0; i < 256; i++) {
+- RADEON_WRITE(RADEON_CP_ME_RAM_DATAH,
+- RS690_cp_microcode[i][1]);
+- RADEON_WRITE(RADEON_CP_ME_RAM_DATAL,
+- RS690_cp_microcode[i][0]);
+- }
++ fw_name = FIRMWARE_RS690;
+ } else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV515) ||
+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R520) ||
+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV530) ||
+@@ -388,11 +383,41 @@ static void radeon_cp_load_microcode(drm_radeon_private_t * dev_priv)
+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV560) ||
+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV570)) {
+ DRM_INFO("Loading R500 Microcode\n");
+- for (i = 0; i < 256; i++) {
++ fw_name = FIRMWARE_R520;
++ }
++
++ err = request_firmware(&dev_priv->fw, fw_name, &pdev->dev);
++ platform_device_unregister(pdev);
++ if (err) {
++ printk(KERN_ERR "radeon_cp: Failed to load firmware \"%s\"\n",
++ fw_name);
++ } else if (dev_priv->fw->size % 8) {
++ printk(KERN_ERR
++ "radeon_cp: Bogus length %zu in firmware \"%s\"\n",
++ dev_priv->fw->size, fw_name);
++ err = -EINVAL;
++ release_firmware(dev_priv->fw);
++ dev_priv->fw = NULL;
++ }
++ return err;
++}
++
++static void radeon_cp_load_microcode(drm_radeon_private_t *dev_priv)
++{
++ const __be32 *fw_data;
++ int i, size;
++
++ radeon_do_wait_for_idle(dev_priv);
++
++ if (dev_priv->fw) {
++ size = dev_priv->fw->size / 4;
++ fw_data = (const __be32 *)&dev_priv->fw->data[0];
++ RADEON_WRITE(RADEON_CP_ME_RAM_ADDR, 0);
++ for (i = 0; i < size; i += 2) {
+ RADEON_WRITE(RADEON_CP_ME_RAM_DATAH,
+- R520_cp_microcode[i][1]);
++ be32_to_cpup(&fw_data[i]));
+ RADEON_WRITE(RADEON_CP_ME_RAM_DATAL,
+- R520_cp_microcode[i][0]);
++ be32_to_cpup(&fw_data[i + 1]));
+ }
+ }
+ }
+@@ -1216,6 +1241,14 @@ static int radeon_do_init_cp(struct drm_device * dev, drm_radeon_init_t * init)
+ radeon_set_pcigart(dev_priv, 1);
+ }
+
++ if (!dev_priv->fw) {
++ int err = radeon_cp_init_microcode(dev_priv);
++ if (err) {
++ DRM_ERROR("Failed to load firmware!\n");
++ radeon_do_cleanup_cp(dev);
++ return err;
++ }
++ }
+ radeon_cp_load_microcode(dev_priv);
+ radeon_cp_init_ring_buffer(dev, dev_priv);
+
+@@ -1442,6 +1475,10 @@ void radeon_do_release(struct drm_device * dev)
+
+ /* deallocate kernel resources */
+ radeon_do_cleanup_cp(dev);
++ if (dev_priv->fw) {
++ release_firmware(dev_priv->fw);
++ dev_priv->fw = NULL;
++ }
+ }
+ }
+
+diff --git a/drivers/gpu/drm/radeon/radeon_drv.h b/drivers/gpu/drm/radeon/radeon_drv.h
+index 3bbb871..51984d7 100644
+--- a/drivers/gpu/drm/radeon/radeon_drv.h
++++ b/drivers/gpu/drm/radeon/radeon_drv.h
+@@ -31,6 +31,9 @@
+ #ifndef __RADEON_DRV_H__
+ #define __RADEON_DRV_H__
+
++#include <linux/firmware.h>
++#include <linux/platform_device.h>
++
+ /* General customization:
+ */
+
+@@ -317,6 +320,9 @@ typedef struct drm_radeon_private {
+ int num_gb_pipes;
+ int track_flush;
+ drm_local_map_t *mmio;
++
++ /* firmware */
++ const struct firmware *fw;
+ } drm_radeon_private_t;
+
+ typedef struct drm_radeon_buf_priv {
+--
+1.6.1.3
+
Added: dists/trunk/linux-2.6/debian/patches/features/all/drivers-net-tehuti-request_firmware.patch
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/features/all/drivers-net-tehuti-request_firmware.patch Sun Feb 22 21:30:55 2009
@@ -0,0 +1,131 @@
+From de21b16293fc9251aa28f501c8fb2399298cc6b3 Mon Sep 17 00:00:00 2001
+From: Ben Hutchings <ben at decadent.org.uk>
+Date: Sun, 22 Feb 2009 19:22:39 +0000
+Subject: [PATCH 06/18] tehuti: Use request_firmware()
+
+Firmware blob is little endian.
+
+Compile-tested only.
+---
+ drivers/net/Kconfig | 2 +-
+ drivers/net/tehuti.c | 39 ++++++++++++++++++++++-----------------
+ drivers/net/tehuti.h | 1 +
+ 3 files changed, 24 insertions(+), 18 deletions(-)
+
+diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
+index 8ea6b4f..9e78152 100644
+--- a/drivers/net/Kconfig
++++ b/drivers/net/Kconfig
+@@ -2584,7 +2584,7 @@ config MLX4_DEBUG
+ config TEHUTI
+ tristate "Tehuti Networks 10G Ethernet"
+ depends on PCI
+- depends on BROKEN
++ select FW_LOADER
+ help
+ Tehuti Networks 10G Ethernet NIC
+
+diff --git a/drivers/net/tehuti.c b/drivers/net/tehuti.c
+index a7a4dc4..934d976 100644
+--- a/drivers/net/tehuti.c
++++ b/drivers/net/tehuti.c
+@@ -63,7 +63,6 @@
+ */
+
+ #include "tehuti.h"
+-#include "tehuti_fw.h"
+
+ static struct pci_device_id __devinitdata bdx_pci_tbl[] = {
+ {0x1FC9, 0x3009, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+@@ -318,28 +317,41 @@ static int bdx_poll(struct napi_struct *napi, int budget)
+
+ static int bdx_fw_load(struct bdx_priv *priv)
+ {
++ const struct firmware *fw = NULL;
+ int master, i;
++ int rc;
+
+ ENTER;
+ master = READ_REG(priv, regINIT_SEMAPHORE);
+ if (!READ_REG(priv, regINIT_STATUS) && master) {
+- bdx_tx_push_desc_safe(priv, s_firmLoad, sizeof(s_firmLoad));
++ rc = request_firmware(&fw, "tehuti/firmware.bin", &priv->pdev->dev);
++ if (rc)
++ goto out;
++ bdx_tx_push_desc_safe(priv, (char *)fw->data, fw->size);
+ mdelay(100);
+ }
+ for (i = 0; i < 200; i++) {
+- if (READ_REG(priv, regINIT_STATUS))
+- break;
++ if (READ_REG(priv, regINIT_STATUS)) {
++ rc = 0;
++ goto out;
++ }
+ mdelay(2);
+ }
++ rc = -EIO;
++out:
+ if (master)
+ WRITE_REG(priv, regINIT_SEMAPHORE, 1);
++ if (fw)
++ release_firmware(fw);
+
+- if (i == 200) {
++ if (rc) {
+ ERR("%s: firmware loading failed\n", priv->ndev->name);
+- DBG("VPC = 0x%x VIC = 0x%x INIT_STATUS = 0x%x i=%d\n",
+- READ_REG(priv, regVPC),
+- READ_REG(priv, regVIC), READ_REG(priv, regINIT_STATUS), i);
+- RET(-EIO);
++ if (rc == -EIO)
++ DBG("VPC = 0x%x VIC = 0x%x INIT_STATUS = 0x%x i=%d\n",
++ READ_REG(priv, regVPC),
++ READ_REG(priv, regVIC),
++ READ_REG(priv, regINIT_STATUS), i);
++ RET(rc);
+ } else {
+ DBG("%s: firmware loading success\n", priv->ndev->name);
+ RET(0);
+@@ -617,13 +629,6 @@ err:
+ RET(rc);
+ }
+
+-static void __init bdx_firmware_endianess(void)
+-{
+- int i;
+- for (i = 0; i < ARRAY_SIZE(s_firmLoad); i++)
+- s_firmLoad[i] = CPU_CHIP_SWAP32(s_firmLoad[i]);
+-}
+-
+ static int bdx_range_check(struct bdx_priv *priv, u32 offset)
+ {
+ return (offset > (u32) (BDX_REGS_SIZE / priv->nic->port_num)) ?
+@@ -2501,7 +2506,6 @@ static void __init print_driver_id(void)
+ static int __init bdx_module_init(void)
+ {
+ ENTER;
+- bdx_firmware_endianess();
+ init_txd_sizes();
+ print_driver_id();
+ RET(pci_register_driver(&bdx_pci_driver));
+@@ -2521,3 +2525,4 @@ module_exit(bdx_module_exit);
+ MODULE_LICENSE("GPL");
+ MODULE_AUTHOR(DRIVER_AUTHOR);
+ MODULE_DESCRIPTION(BDX_DRV_DESC);
++MODULE_FIRMWARE("tehuti/firmware.bin");
+diff --git a/drivers/net/tehuti.h b/drivers/net/tehuti.h
+index efaf84d..dec67e0 100644
+--- a/drivers/net/tehuti.h
++++ b/drivers/net/tehuti.h
+@@ -29,6 +29,7 @@
+ #include <linux/if_vlan.h>
+ #include <linux/interrupt.h>
+ #include <linux/vmalloc.h>
++#include <linux/firmware.h>
+ #include <asm/byteorder.h>
+
+ /* Compile Time Switches */
+--
+1.6.1.3
+
Added: dists/trunk/linux-2.6/debian/patches/features/all/drivers-net-typhoon-request_firmware.patch
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/features/all/drivers-net-typhoon-request_firmware.patch Sun Feb 22 21:30:55 2009
@@ -0,0 +1,96 @@
+From 410a5105f5ad7d89bdbd1142a6b27937696b858f Mon Sep 17 00:00:00 2001
+From: Ben Hutchings <ben at decadent.org.uk>
+Date: Sun, 22 Feb 2009 19:25:27 +0000
+Subject: [PATCH 09/18] typhoon: Use request_firmware()
+
+Based on a patch by Jaswinder Singh <jaswinder at infradead.org>.
+
+Compile-tested only.
+---
+ drivers/net/Kconfig | 2 +-
+ drivers/net/typhoon.c | 23 +++++++++++++++++------
+ 2 files changed, 18 insertions(+), 7 deletions(-)
+
+diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
+index c639aea..334472d 100644
+--- a/drivers/net/Kconfig
++++ b/drivers/net/Kconfig
+@@ -733,7 +733,7 @@ config VORTEX
+ config TYPHOON
+ tristate "3cr990 series \"Typhoon\" support"
+ depends on NET_VENDOR_3COM && PCI
+- depends on BROKEN
++ select FW_LOADER
+ select CRC32
+ ---help---
+ This option enables driver support for the 3cr990 series of cards:
+diff --git a/drivers/net/typhoon.c b/drivers/net/typhoon.c
+index 3af9a95..83226a2 100644
+--- a/drivers/net/typhoon.c
++++ b/drivers/net/typhoon.c
+@@ -129,16 +129,18 @@ static const int multicast_filter_limit = 32;
+ #include <asm/uaccess.h>
+ #include <linux/in6.h>
+ #include <linux/dma-mapping.h>
++#include <linux/firmware.h>
+
+ #include "typhoon.h"
+-#include "typhoon-firmware.h"
+
+ static char version[] __devinitdata =
+ "typhoon.c: version " DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
+
++#define FIRMWARE_NAME "3com/typhoon.bin"
+ MODULE_AUTHOR("David Dillow <dave at thedillows.org>");
+ MODULE_VERSION(DRV_MODULE_VERSION);
+ MODULE_LICENSE("GPL");
++MODULE_FIRMWARE(FIRMWARE_NAME);
+ MODULE_DESCRIPTION("3Com Typhoon Family (3C990, 3CR990, and variants)");
+ MODULE_PARM_DESC(rx_copybreak, "Packets smaller than this are copied and "
+ "the buffer given back to the NIC. Default "
+@@ -1349,9 +1351,10 @@ typhoon_download_firmware(struct typhoon *tp)
+ {
+ void __iomem *ioaddr = tp->ioaddr;
+ struct pci_dev *pdev = tp->pdev;
+- struct typhoon_file_header *fHdr;
+- struct typhoon_section_header *sHdr;
+- u8 *image_data;
++ const struct firmware *fw;
++ const struct typhoon_file_header *fHdr;
++ const struct typhoon_section_header *sHdr;
++ const u8 *image_data;
+ void *dpage;
+ dma_addr_t dpage_dma;
+ __sum16 csum;
+@@ -1365,11 +1368,18 @@ typhoon_download_firmware(struct typhoon *tp)
+ int i;
+ int err;
+
++ err = request_firmware(&fw, FIRMWARE_NAME, &tp->pdev->dev);
++ if (err) {
++ printk(KERN_ERR "%s: Failed to load firmware \"%s\"\n",
++ tp->name, FIRMWARE_NAME);
++ return err;
++ }
++
+ err = -EINVAL;
+- fHdr = (struct typhoon_file_header *) typhoon_firmware_image;
++ fHdr = (struct typhoon_file_header *) fw->data;
+ image_data = (u8 *) fHdr;
+
+- if(memcmp(fHdr->tag, "TYPHOON", 8)) {
++ if(fw->size < sizeof(*fHdr) || memcmp(fHdr->tag, "TYPHOON", 8)) {
+ printk(KERN_ERR "%s: Invalid firmware image!\n", tp->name);
+ goto err_out;
+ }
+@@ -1491,6 +1501,7 @@ err_out_irq:
+ pci_free_consistent(pdev, PAGE_SIZE, dpage, dpage_dma);
+
+ err_out:
++ release_firmware(fw);
+ return err;
+ }
+
+--
+1.6.1.3
+
Added: dists/trunk/linux-2.6/debian/patches/features/all/drivers-scsi-qla1280-request_firmware.patch
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/features/all/drivers-scsi-qla1280-request_firmware.patch Sun Feb 22 21:30:55 2009
@@ -0,0 +1,296 @@
+From 8217f31fa9232dad67b0d596e9f7e6678ad44616 Mon Sep 17 00:00:00 2001
+From: Ben Hutchings <ben at decadent.org.uk>
+Date: Sat, 18 Oct 2008 16:43:31 +0100
+Subject: [PATCH 24/24] qla1280: use request_firmware
+
+Based on patch by Jaswinder Singh <jaswinder at infradead.org>
+and David Woodhouse <David.Woodhouse at intel.com>
+
+Firmware blob is little endian looks like this...
+ unsigned char Version1
+ unsigned char Version2
+ unsigned char Version3
+ unsigned char Padding
+ unsigned short start_address
+ unsigned short data
+---
+ drivers/scsi/Kconfig | 2 +-
+ drivers/scsi/qla1280.c | 116 +++++++++++++++++++++++++++++++-----------------
+ drivers/scsi/qla1280.h | 6 +++
+ 3 files changed, 82 insertions(+), 42 deletions(-)
+
+diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig
+index 3d97641..0fca0d2 100644
+--- a/drivers/scsi/Kconfig
++++ b/drivers/scsi/Kconfig
+@@ -1328,7 +1328,7 @@ config SCSI_QLOGIC_FAS
+ config SCSI_QLOGIC_1280
+ tristate "Qlogic QLA 1240/1x80/1x160 SCSI support"
+ depends on PCI && SCSI
+- depends on BROKEN
++ select FW_LOADER
+ help
+ Say Y if you have a QLogic ISP1240/1x80/1x160 SCSI host adapter.
+
+diff --git a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c
+index b6cd12b..5536676 100644
+--- a/drivers/scsi/qla1280.c
++++ b/drivers/scsi/qla1280.c
+@@ -348,6 +348,7 @@
+ #include <linux/interrupt.h>
+ #include <linux/init.h>
+ #include <linux/dma-mapping.h>
++#include <linux/firmware.h>
+
+ #include <asm/io.h>
+ #include <asm/irq.h>
+@@ -384,11 +385,7 @@
+ #define MEMORY_MAPPED_IO 1
+ #endif
+
+-#define UNIQUE_FW_NAME
+ #include "qla1280.h"
+-#include "ql12160_fw.h" /* ISP RISC codes */
+-#include "ql1280_fw.h"
+-#include "ql1040_fw.h"
+
+ #ifndef BITS_PER_LONG
+ #error "BITS_PER_LONG not defined!"
+@@ -541,10 +538,7 @@ __setup("qla1280=", qla1280_setup);
+ struct qla_boards {
+ unsigned char name[9]; /* Board ID String */
+ int numPorts; /* Number of SCSI ports */
+- unsigned short *fwcode; /* pointer to FW array */
+- unsigned short *fwlen; /* number of words in array */
+- unsigned short *fwstart; /* start address for F/W */
+- unsigned char *fwver; /* Ptr to F/W version array */
++ char *fwname; /* firmware name */
+ };
+
+ /* NOTE: the last argument in each entry is used to index ql1280_board_tbl */
+@@ -567,19 +561,13 @@ MODULE_DEVICE_TABLE(pci, qla1280_pci_tbl);
+
+ static struct qla_boards ql1280_board_tbl[] = {
+ /* Name , Number of ports, FW details */
+- {"QLA12160", 2, &fw12160i_code01[0], &fw12160i_length01,
+- &fw12160i_addr01, &fw12160i_version_str[0]},
+- {"QLA1040", 1, &risc_code01[0], &risc_code_length01,
+- &risc_code_addr01, &firmware_version[0]},
+- {"QLA1080", 1, &fw1280ei_code01[0], &fw1280ei_length01,
+- &fw1280ei_addr01, &fw1280ei_version_str[0]},
+- {"QLA1240", 2, &fw1280ei_code01[0], &fw1280ei_length01,
+- &fw1280ei_addr01, &fw1280ei_version_str[0]},
+- {"QLA1280", 2, &fw1280ei_code01[0], &fw1280ei_length01,
+- &fw1280ei_addr01, &fw1280ei_version_str[0]},
+- {"QLA10160", 1, &fw12160i_code01[0], &fw12160i_length01,
+- &fw12160i_addr01, &fw12160i_version_str[0]},
+- {" ", 0}
++ {"QLA12160", 2, "qlogic/12160.bin"},
++ {"QLA1040", 1, "qlogic/1040.bin"},
++ {"QLA1080", 1, "qlogic/1280.bin"},
++ {"QLA1240", 2, "qlogic/1280.bin"},
++ {"QLA1280", 2, "qlogic/1280.bin"},
++ {"QLA10160", 1, "qlogic/12160.bin"},
++ {" ", 0, " "},
+ };
+
+ static int qla1280_verbose = 1;
+@@ -704,7 +692,7 @@ qla1280_info(struct Scsi_Host *host)
+ sprintf (bp,
+ "QLogic %s PCI to SCSI Host Adapter\n"
+ " Firmware version: %2d.%02d.%02d, Driver version %s",
+- &bdp->name[0], bdp->fwver[0], bdp->fwver[1], bdp->fwver[2],
++ &bdp->name[0], ha->fwver1, ha->fwver2, ha->fwver3,
+ QLA1280_VERSION);
+ return bp;
+ }
+@@ -1648,36 +1636,60 @@ qla1280_chip_diag(struct scsi_qla_host *ha)
+ static int
+ qla1280_load_firmware_pio(struct scsi_qla_host *ha)
+ {
+- uint16_t risc_address, *risc_code_address, risc_code_size;
++ const struct firmware *fw;
++ const __le16 *fw_data;
++ uint16_t risc_address, risc_code_size;
+ uint16_t mb[MAILBOX_REGISTER_COUNT], i;
+ int err;
+
++ err = request_firmware(&fw, ql1280_board_tbl[ha->devnum].fwname,
++ &ha->pdev->dev);
++ if (err) {
++ printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
++ ql1280_board_tbl[ha->devnum].fwname, err);
++ return err;
++ }
++ if ((fw->size % 2) || (fw->size < 6)) {
++ printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",
++ fw->size, ql1280_board_tbl[ha->devnum].fwname);
++ err = -EINVAL;
++ goto out;
++ }
++ ha->fwver1 = fw->data[0];
++ ha->fwver2 = fw->data[1];
++ ha->fwver3 = fw->data[2];
++ fw_data = (const __le16 *)&fw->data[0];
++ ha->fwstart = __le16_to_cpu(fw_data[2]);
++
+ /* Load RISC code. */
+- risc_address = *ql1280_board_tbl[ha->devnum].fwstart;
+- risc_code_address = ql1280_board_tbl[ha->devnum].fwcode;
+- risc_code_size = *ql1280_board_tbl[ha->devnum].fwlen;
++ risc_address = ha->fwstart;
++ fw_data = (const __le16 *)&fw->data[4];
++ risc_code_size = (fw->size - 6) / 2;
+
+ for (i = 0; i < risc_code_size; i++) {
+ mb[0] = MBC_WRITE_RAM_WORD;
+ mb[1] = risc_address + i;
+- mb[2] = risc_code_address[i];
++ mb[2] = __le16_to_cpu(fw_data[i]);
+
+ err = qla1280_mailbox_command(ha, BIT_0 | BIT_1 | BIT_2, mb);
+ if (err) {
+ printk(KERN_ERR "scsi(%li): Failed to load firmware\n",
+ ha->host_no);
+- return err;
++ goto out;
+ }
+ }
+-
+- return 0;
++out:
++ release_firmware(fw);
++ return err;
+ }
+
+ #define DUMP_IT_BACK 0 /* for debug of RISC loading */
+ static int
+ qla1280_load_firmware_dma(struct scsi_qla_host *ha)
+ {
+- uint16_t risc_address, *risc_code_address, risc_code_size;
++ const struct firmware *fw;
++ const __le16 *fw_data;
++ uint16_t risc_address, risc_code_size;
+ uint16_t mb[MAILBOX_REGISTER_COUNT], cnt;
+ int err = 0, num, i;
+ #if DUMP_IT_BACK
+@@ -1689,10 +1701,29 @@ qla1280_load_firmware_dma(struct scsi_qla_host *ha)
+ return -ENOMEM;
+ #endif
+
++ err = request_firmware(&fw, ql1280_board_tbl[ha->devnum].fwname,
++ &ha->pdev->dev);
++ if (err) {
++ printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
++ ql1280_board_tbl[ha->devnum].fwname, err);
++ return err;
++ }
++ if ((fw->size % 2) || (fw->size < 6)) {
++ printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",
++ fw->size, ql1280_board_tbl[ha->devnum].fwname);
++ err = -EINVAL;
++ goto out;
++ }
++ ha->fwver1 = fw->data[0];
++ ha->fwver2 = fw->data[1];
++ ha->fwver3 = fw->data[2];
++ fw_data = (const __le16 *)&fw->data[0];
++ ha->fwstart = __le16_to_cpu(fw_data[2]);
++
+ /* Load RISC code. */
+- risc_address = *ql1280_board_tbl[ha->devnum].fwstart;
+- risc_code_address = ql1280_board_tbl[ha->devnum].fwcode;
+- risc_code_size = *ql1280_board_tbl[ha->devnum].fwlen;
++ risc_address = ha->fwstart;
++ fw_data = (const __le16 *)&fw->data[4];
++ risc_code_size = (fw->size - 6) / 2;
+
+ dprintk(1, "%s: DMA RISC code (%i) words\n",
+ __func__, risc_code_size);
+@@ -1708,10 +1739,9 @@ qla1280_load_firmware_dma(struct scsi_qla_host *ha)
+
+ dprintk(2, "qla1280_setup_chip: loading risc @ =(0x%p),"
+ "%d,%d(0x%x)\n",
+- risc_code_address, cnt, num, risc_address);
++ fw_data, cnt, num, risc_address);
+ for(i = 0; i < cnt; i++)
+- ((__le16 *)ha->request_ring)[i] =
+- cpu_to_le16(risc_code_address[i]);
++ ((__le16 *)ha->request_ring)[i] = fw_data[i];
+
+ mb[0] = MBC_LOAD_RAM;
+ mb[1] = risc_address;
+@@ -1763,7 +1793,7 @@ qla1280_load_firmware_dma(struct scsi_qla_host *ha)
+ #endif
+ risc_address += cnt;
+ risc_code_size = risc_code_size - cnt;
+- risc_code_address = risc_code_address + cnt;
++ fw_data = fw_data + cnt;
+ num++;
+ }
+
+@@ -1771,6 +1801,7 @@ qla1280_load_firmware_dma(struct scsi_qla_host *ha)
+ #if DUMP_IT_BACK
+ pci_free_consistent(ha->pdev, 8000, tbuf, p_tbuf);
+ #endif
++ release_firmware(fw);
+ return err;
+ }
+
+@@ -1786,7 +1817,7 @@ qla1280_start_firmware(struct scsi_qla_host *ha)
+ /* Verify checksum of loaded RISC code. */
+ mb[0] = MBC_VERIFY_CHECKSUM;
+ /* mb[1] = ql12_risc_code_addr01; */
+- mb[1] = *ql1280_board_tbl[ha->devnum].fwstart;
++ mb[1] = ha->fwstart;
+ err = qla1280_mailbox_command(ha, BIT_1 | BIT_0, mb);
+ if (err) {
+ printk(KERN_ERR "scsi(%li): RISC checksum failed.\n", ha->host_no);
+@@ -1796,7 +1827,7 @@ qla1280_start_firmware(struct scsi_qla_host *ha)
+ /* Start firmware execution. */
+ dprintk(1, "%s: start firmware running.\n", __func__);
+ mb[0] = MBC_EXECUTE_FIRMWARE;
+- mb[1] = *ql1280_board_tbl[ha->devnum].fwstart;
++ mb[1] = ha->fwstart;
+ err = qla1280_mailbox_command(ha, BIT_1 | BIT_0, &mb[0]);
+ if (err) {
+ printk(KERN_ERR "scsi(%li): Failed to start firmware\n",
+@@ -1821,7 +1852,7 @@ qla1280_load_firmware(struct scsi_qla_host *ha)
+ if (err)
+ goto out;
+ err = qla1280_start_firmware(ha);
+- out:
++out:
+ return err;
+ }
+
+@@ -4451,6 +4482,9 @@ module_exit(qla1280_exit);
+ MODULE_AUTHOR("Qlogic & Jes Sorensen");
+ MODULE_DESCRIPTION("Qlogic ISP SCSI (qla1x80/qla1x160) driver");
+ MODULE_LICENSE("GPL");
++MODULE_FIRMWARE("qlogic/1040.bin");
++MODULE_FIRMWARE("qlogic/1280.bin");
++MODULE_FIRMWARE("qlogic/12160.bin");
+ MODULE_VERSION(QLA1280_VERSION);
+
+ /*
+diff --git a/drivers/scsi/qla1280.h b/drivers/scsi/qla1280.h
+index ff2c363..d7c44b8 100644
+--- a/drivers/scsi/qla1280.h
++++ b/drivers/scsi/qla1280.h
+@@ -1069,6 +1069,12 @@ struct scsi_qla_host {
+
+ struct nvram nvram;
+ int nvram_valid;
++
++ /* Firmware Info */
++ unsigned short fwstart; /* start address for F/W */
++ unsigned char fwver1; /* F/W version first char */
++ unsigned char fwver2; /* F/W version second char */
++ unsigned char fwver3; /* F/W version third char */
+ };
+
+ #endif /* _QLA1280_H */
+--
+1.6.1.3
+
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 Sun Feb 22 21:30:55 2009
@@ -8,6 +8,12 @@
#+ debian/dfsg/drivers-net-bnx2-request_firmware-1.patch
#+ features/all/drivers-net-acenic-firmwar_request.patch
++ features/all/drivers-gpu-drm-mga-request_firmware.patch
++ features/all/drivers-gpu-drm-r128-request_firmware.patch
++ features/all/drivers-gpu-drm-radeon-request_firmware.patch
++ features/all/drivers-net-tehuti-request_firmware.patch
++ features/all/drivers-net-typhoon-request_firmware.patch
++ features/all/drivers-scsi-qla1280-request_firmware.patch
+ features/all/export-gfs2-locking-symbols.patch
+ features/all/export-unionfs-symbols.patch
Modified: dists/trunk/linux-2.6/debian/patches/series/orig-0
==============================================================================
--- dists/trunk/linux-2.6/debian/patches/series/orig-0 (original)
+++ dists/trunk/linux-2.6/debian/patches/series/orig-0 Sun Feb 22 21:30:55 2009
@@ -1,10 +1,16 @@
-X debian/dfsg/files-1
++ debian/dfsg/drivers-gpu-drm-mga-disable.patch
++ debian/dfsg/drivers-gpu-drm-r128-disable.patch
++ debian/dfsg/drivers-gpu-drm-radeon-disable.patch
+ debian/dfsg/drivers-net-bnx2-disable.patch
+ debian/dfsg/drivers-net-bnx2x-disable.patch
+ debian/dfsg/drivers-net-appletalk-cops.patch
+ debian/dfsg/drivers-net-hamradio-yam.patch
+ debian/dfsg/drivers-net-myri.patch
++ debian/dfsg/drivers-net-tehuti-disable.patch
+ debian/dfsg/drivers-net-tokenring-3c359-smctr.patch
++ debian/dfsg/drivers-net-typhoon-disable.patch
++ debian/dfsg/drivers-scsi-qla1280-disable.patch
+ debian/dfsg/drivers-scsi-qlogicpti.patch
+ debian/dfsg/firmware-cleanup.patch
+ debian/dfsg/sound-pci.patch
+X debian/dfsg/files-1
More information about the Kernel-svn-changes
mailing list