Преглед на файлове

cassini: Make missing firmware non-fatal

The firmware patch for the Saturn PHY fixes a bug, but is not absolutely
essential.  And its licence is unclear, so it is not included in all
distributions.  Just log an error message and continue if it is missing
or invalid.

References: http://bugs.debian.org/712674
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Tested-by: Jose Andres Arias Velichko <Andres.Arias@PaisLinux.net> (against 3.2)
Signed-off-by: David S. Miller <davem@davemloft.net>
Ben Hutchings преди 12 години
родител
ревизия
15627e847e
променени са 1 файла, в които са добавени 8 реда и са изтрити 10 реда
  1. 8 10
      drivers/net/ethernet/sun/cassini.c

+ 8 - 10
drivers/net/ethernet/sun/cassini.c

@@ -808,44 +808,43 @@ static int cas_reset_mii_phy(struct cas *cp)
 	return limit <= 0;
 	return limit <= 0;
 }
 }
 
 
-static int cas_saturn_firmware_init(struct cas *cp)
+static void cas_saturn_firmware_init(struct cas *cp)
 {
 {
 	const struct firmware *fw;
 	const struct firmware *fw;
 	const char fw_name[] = "sun/cassini.bin";
 	const char fw_name[] = "sun/cassini.bin";
 	int err;
 	int err;
 
 
 	if (PHY_NS_DP83065 != cp->phy_id)
 	if (PHY_NS_DP83065 != cp->phy_id)
-		return 0;
+		return;
 
 
 	err = request_firmware(&fw, fw_name, &cp->pdev->dev);
 	err = request_firmware(&fw, fw_name, &cp->pdev->dev);
 	if (err) {
 	if (err) {
 		pr_err("Failed to load firmware \"%s\"\n",
 		pr_err("Failed to load firmware \"%s\"\n",
 		       fw_name);
 		       fw_name);
-		return err;
+		return;
 	}
 	}
 	if (fw->size < 2) {
 	if (fw->size < 2) {
 		pr_err("bogus length %zu in \"%s\"\n",
 		pr_err("bogus length %zu in \"%s\"\n",
 		       fw->size, fw_name);
 		       fw->size, fw_name);
-		err = -EINVAL;
 		goto out;
 		goto out;
 	}
 	}
 	cp->fw_load_addr= fw->data[1] << 8 | fw->data[0];
 	cp->fw_load_addr= fw->data[1] << 8 | fw->data[0];
 	cp->fw_size = fw->size - 2;
 	cp->fw_size = fw->size - 2;
 	cp->fw_data = vmalloc(cp->fw_size);
 	cp->fw_data = vmalloc(cp->fw_size);
-	if (!cp->fw_data) {
-		err = -ENOMEM;
+	if (!cp->fw_data)
 		goto out;
 		goto out;
-	}
 	memcpy(cp->fw_data, &fw->data[2], cp->fw_size);
 	memcpy(cp->fw_data, &fw->data[2], cp->fw_size);
 out:
 out:
 	release_firmware(fw);
 	release_firmware(fw);
-	return err;
 }
 }
 
 
 static void cas_saturn_firmware_load(struct cas *cp)
 static void cas_saturn_firmware_load(struct cas *cp)
 {
 {
 	int i;
 	int i;
 
 
+	if (!cp->fw_data)
+		return;
+
 	cas_phy_powerdown(cp);
 	cas_phy_powerdown(cp);
 
 
 	/* expanded memory access mode */
 	/* expanded memory access mode */
@@ -5083,8 +5082,7 @@ static int cas_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 	if (cas_check_invariants(cp))
 	if (cas_check_invariants(cp))
 		goto err_out_iounmap;
 		goto err_out_iounmap;
 	if (cp->cas_flags & CAS_FLAG_SATURN)
 	if (cp->cas_flags & CAS_FLAG_SATURN)
-		if (cas_saturn_firmware_init(cp))
-			goto err_out_iounmap;
+		cas_saturn_firmware_init(cp);
 
 
 	cp->init_block = (struct cas_init_block *)
 	cp->init_block = (struct cas_init_block *)
 		pci_alloc_consistent(pdev, sizeof(struct cas_init_block),
 		pci_alloc_consistent(pdev, sizeof(struct cas_init_block),