Skip to content

Commit

Permalink
be2net: fix support for PCI hot plug
Browse files Browse the repository at this point in the history
Before issuing any cmds to the FW, the driver must first wait
till the fW becomes ready. This is needed for PCI hot plug when
the driver can be probed while the card fw is being initialized.

Signed-off-by: Sathya Perla <sathyap@serverengines.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Sathya Perla authored and David S. Miller committed Oct 15, 2009
1 parent 73d540f commit 43a04fd
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 11 deletions.
25 changes: 18 additions & 7 deletions drivers/net/benet/be_cmds.c
Original file line number Diff line number Diff line change
Expand Up @@ -243,15 +243,26 @@ static int be_POST_stage_get(struct be_adapter *adapter, u16 *stage)

int be_cmd_POST(struct be_adapter *adapter)
{
u16 stage, error;
u16 stage;
int status, timeout = 0;

error = be_POST_stage_get(adapter, &stage);
if (error || stage != POST_STAGE_ARMFW_RDY) {
dev_err(&adapter->pdev->dev, "POST failed.\n");
return -1;
}
do {
status = be_POST_stage_get(adapter, &stage);
if (status) {
dev_err(&adapter->pdev->dev, "POST error; stage=0x%x\n",
stage);
return -1;
} else if (stage != POST_STAGE_ARMFW_RDY) {
set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(2 * HZ);
timeout += 2;
} else {
return 0;
}
} while (timeout < 20);

return 0;
dev_err(&adapter->pdev->dev, "POST timeout; stage=0x%x\n", stage);
return -1;
}

static inline void *embedded_payload(struct be_mcc_wrb *wrb)
Expand Down
8 changes: 4 additions & 4 deletions drivers/net/benet/be_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2058,6 +2058,10 @@ static int be_hw_up(struct be_adapter *adapter)
if (status)
return status;

status = be_cmd_reset_function(adapter);
if (status)
return status;

status = be_cmd_get_fw_ver(adapter, adapter->fw_ver);
if (status)
return status;
Expand Down Expand Up @@ -2111,10 +2115,6 @@ static int __devinit be_probe(struct pci_dev *pdev,
if (status)
goto free_netdev;

status = be_cmd_reset_function(adapter);
if (status)
goto ctrl_clean;

status = be_stats_init(adapter);
if (status)
goto ctrl_clean;
Expand Down

0 comments on commit 43a04fd

Please sign in to comment.