aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/sun
diff options
context:
space:
mode:
authorBen Hutchings <ben@decadent.org.uk>2013-06-30 19:13:27 -0400
committerDavid S. Miller <davem@davemloft.net>2013-07-02 02:47:33 -0400
commit15627e847e4356ebdd49e7c3f10a671819995be6 (patch)
tree1f6e88ec2d8396611055b61e5b256b6b4bc1ee81 /drivers/net/ethernet/sun
parentd8eb8f9963a55ccf6ebafa4bfdb9f70c17067825 (diff)
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>
Diffstat (limited to 'drivers/net/ethernet/sun')
-rw-r--r--drivers/net/ethernet/sun/cassini.c18
1 files changed, 8 insertions, 10 deletions
diff --git a/drivers/net/ethernet/sun/cassini.c b/drivers/net/ethernet/sun/cassini.c
index 4c682a3d0424..759441b29e53 100644
--- a/drivers/net/ethernet/sun/cassini.c
+++ b/drivers/net/ethernet/sun/cassini.c
@@ -808,44 +808,43 @@ static int cas_reset_mii_phy(struct cas *cp)
808 return limit <= 0; 808 return limit <= 0;
809} 809}
810 810
811static int cas_saturn_firmware_init(struct cas *cp) 811static void cas_saturn_firmware_init(struct cas *cp)
812{ 812{
813 const struct firmware *fw; 813 const struct firmware *fw;
814 const char fw_name[] = "sun/cassini.bin"; 814 const char fw_name[] = "sun/cassini.bin";
815 int err; 815 int err;
816 816
817 if (PHY_NS_DP83065 != cp->phy_id) 817 if (PHY_NS_DP83065 != cp->phy_id)
818 return 0; 818 return;
819 819
820 err = request_firmware(&fw, fw_name, &cp->pdev->dev); 820 err = request_firmware(&fw, fw_name, &cp->pdev->dev);
821 if (err) { 821 if (err) {
822 pr_err("Failed to load firmware \"%s\"\n", 822 pr_err("Failed to load firmware \"%s\"\n",
823 fw_name); 823 fw_name);
824 return err; 824 return;
825 } 825 }
826 if (fw->size < 2) { 826 if (fw->size < 2) {
827 pr_err("bogus length %zu in \"%s\"\n", 827 pr_err("bogus length %zu in \"%s\"\n",
828 fw->size, fw_name); 828 fw->size, fw_name);
829 err = -EINVAL;
830 goto out; 829 goto out;
831 } 830 }
832 cp->fw_load_addr= fw->data[1] << 8 | fw->data[0]; 831 cp->fw_load_addr= fw->data[1] << 8 | fw->data[0];
833 cp->fw_size = fw->size - 2; 832 cp->fw_size = fw->size - 2;
834 cp->fw_data = vmalloc(cp->fw_size); 833 cp->fw_data = vmalloc(cp->fw_size);
835 if (!cp->fw_data) { 834 if (!cp->fw_data)
836 err = -ENOMEM;
837 goto out; 835 goto out;
838 }
839 memcpy(cp->fw_data, &fw->data[2], cp->fw_size); 836 memcpy(cp->fw_data, &fw->data[2], cp->fw_size);
840out: 837out:
841 release_firmware(fw); 838 release_firmware(fw);
842 return err;
843} 839}
844 840
845static void cas_saturn_firmware_load(struct cas *cp) 841static void cas_saturn_firmware_load(struct cas *cp)
846{ 842{
847 int i; 843 int i;
848 844
845 if (!cp->fw_data)
846 return;
847
849 cas_phy_powerdown(cp); 848 cas_phy_powerdown(cp);
850 849
851 /* expanded memory access mode */ 850 /* expanded memory access mode */
@@ -5083,8 +5082,7 @@ static int cas_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
5083 if (cas_check_invariants(cp)) 5082 if (cas_check_invariants(cp))
5084 goto err_out_iounmap; 5083 goto err_out_iounmap;
5085 if (cp->cas_flags & CAS_FLAG_SATURN) 5084 if (cp->cas_flags & CAS_FLAG_SATURN)
5086 if (cas_saturn_firmware_init(cp)) 5085 cas_saturn_firmware_init(cp);
5087 goto err_out_iounmap;
5088 5086
5089 cp->init_block = (struct cas_init_block *) 5087 cp->init_block = (struct cas_init_block *)
5090 pci_alloc_consistent(pdev, sizeof(struct cas_init_block), 5088 pci_alloc_consistent(pdev, sizeof(struct cas_init_block),