qlcnic: check device class
authorSucheta Chakraborty <sucheta.chakraborty@qlogic.com>
Thu, 13 May 2010 03:07:48 +0000 (03:07 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 14 May 2010 10:08:01 +0000 (03:08 -0700)
pci-func class can be other than ethernet in Qlogic CNA device.

Signed-off-by: Sucheta Chakraborty <sucheta.chakraborty@qlogic.com>
Signed-off-by: Amit Kumar Salecha <amit.salecha@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/qlcnic/qlcnic.h
drivers/net/qlcnic/qlcnic_init.c
drivers/net/qlcnic/qlcnic_main.c

index 8a9412fd2ff531e4a7f9f897d6dba10bd9d558a1..5c89f4e4635b173a90713cafc712b0bcfff6dbe5 100644 (file)
@@ -1037,7 +1037,7 @@ int qlcnic_need_fw_reset(struct qlcnic_adapter *adapter);
 void qlcnic_request_firmware(struct qlcnic_adapter *adapter);
 void qlcnic_release_firmware(struct qlcnic_adapter *adapter);
 int qlcnic_pinit_from_rom(struct qlcnic_adapter *adapter);
-void qlcnic_setup_idc_param(struct qlcnic_adapter *adapter);
+int qlcnic_setup_idc_param(struct qlcnic_adapter *adapter);
 
 int qlcnic_rom_fast_read(struct qlcnic_adapter *adapter, int addr, int *valp);
 int qlcnic_rom_fast_read_words(struct qlcnic_adapter *adapter, int addr,
index c4bef57b9cd0196b9e3a0c31ae6b7968645b9867..77bfdaba83e8772666cb5c3a76caf21639a6715b 100644 (file)
@@ -514,10 +514,22 @@ int qlcnic_pinit_from_rom(struct qlcnic_adapter *adapter)
        return 0;
 }
 
-void
+int
 qlcnic_setup_idc_param(struct qlcnic_adapter *adapter) {
 
        int timeo;
+       u32 val;
+
+       val = QLCRD32(adapter, QLCNIC_CRB_DEV_PARTITION_INFO);
+       val = (val >> (adapter->portnum * 4)) & 0xf;
+
+       if ((val & 0x3) != 1) {
+               dev_err(&adapter->pdev->dev, "Not an Ethernet NIC func=%u\n",
+                                                                       val);
+               return -EIO;
+       }
+
+       adapter->physical_port = (val >> 2);
 
        if (qlcnic_rom_fast_read(adapter, QLCNIC_ROM_DEV_INIT_TIMEOUT, &timeo))
                timeo = 30;
@@ -528,6 +540,8 @@ qlcnic_setup_idc_param(struct qlcnic_adapter *adapter) {
                timeo = 10;
 
        adapter->reset_ack_timeo = timeo;
+
+       return 0;
 }
 
 static int
index 54a6bb20ec073f61f791e740d071fe0b8650ebc5..79c6e0517bad400f485ddbc58c45d8d47e916edc 100644 (file)
@@ -1080,17 +1080,13 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                goto err_out_iounmap;
        }
 
-       qlcnic_setup_idc_param(adapter);
+       if (qlcnic_setup_idc_param(adapter))
+               goto err_out_iounmap;
 
        err = qlcnic_start_firmware(adapter);
        if (err)
                goto err_out_decr_ref;
 
-       /*
-        * See if the firmware gave us a virtual-physical port mapping.
-        */
-       adapter->physical_port = adapter->portnum;
-
        qlcnic_clear_stats(adapter);
 
        qlcnic_setup_intr(adapter);