diff options
| author | Casey Leedom <leedom@chelsio.com> | 2010-11-11 04:06:53 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2010-11-12 15:31:01 -0500 |
| commit | e68e6133e2daef6fc40e91621a1e26938e428e9e (patch) | |
| tree | 21759991e47e782de8ebb4153396b651a0ef0095 | |
| parent | e7a3795f56122cc92530c3f9412b8ff19b70184c (diff) | |
cxgb4vf: add call to Firmware to reset VF State.
Add call to Firmware to reset its VF State when we first attach to the VF.
Signed-off-by: Casey Leedom <leedom@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | drivers/net/cxgb4vf/cxgb4vf_main.c | 16 | ||||
| -rw-r--r-- | drivers/net/cxgb4vf/t4vf_common.h | 1 | ||||
| -rw-r--r-- | drivers/net/cxgb4vf/t4vf_hw.c | 19 |
3 files changed, 36 insertions, 0 deletions
diff --git a/drivers/net/cxgb4vf/cxgb4vf_main.c b/drivers/net/cxgb4vf/cxgb4vf_main.c index 8da3bda13f33..c3449bbc585a 100644 --- a/drivers/net/cxgb4vf/cxgb4vf_main.c +++ b/drivers/net/cxgb4vf/cxgb4vf_main.c | |||
| @@ -2065,6 +2065,22 @@ static int adap_init0(struct adapter *adapter) | |||
| 2065 | } | 2065 | } |
| 2066 | 2066 | ||
| 2067 | /* | 2067 | /* |
| 2068 | * Some environments do not properly handle PCIE FLRs -- e.g. in Linux | ||
| 2069 | * 2.6.31 and later we can't call pci_reset_function() in order to | ||
| 2070 | * issue an FLR because of a self- deadlock on the device semaphore. | ||
| 2071 | * Meanwhile, the OS infrastructure doesn't issue FLRs in all the | ||
| 2072 | * cases where they're needed -- for instance, some versions of KVM | ||
| 2073 | * fail to reset "Assigned Devices" when the VM reboots. Therefore we | ||
| 2074 | * use the firmware based reset in order to reset any per function | ||
| 2075 | * state. | ||
| 2076 | */ | ||
| 2077 | err = t4vf_fw_reset(adapter); | ||
| 2078 | if (err < 0) { | ||
| 2079 | dev_err(adapter->pdev_dev, "FW reset failed: err=%d\n", err); | ||
| 2080 | return err; | ||
| 2081 | } | ||
| 2082 | |||
| 2083 | /* | ||
| 2068 | * Grab basic operational parameters. These will predominantly have | 2084 | * Grab basic operational parameters. These will predominantly have |
| 2069 | * been set up by the Physical Function Driver or will be hard coded | 2085 | * been set up by the Physical Function Driver or will be hard coded |
| 2070 | * into the adapter. We just have to live with them ... Note that | 2086 | * into the adapter. We just have to live with them ... Note that |
diff --git a/drivers/net/cxgb4vf/t4vf_common.h b/drivers/net/cxgb4vf/t4vf_common.h index 873cb7d86c57..a65c80aed1f2 100644 --- a/drivers/net/cxgb4vf/t4vf_common.h +++ b/drivers/net/cxgb4vf/t4vf_common.h | |||
| @@ -235,6 +235,7 @@ static inline int t4vf_wr_mbox_ns(struct adapter *adapter, const void *cmd, | |||
| 235 | int __devinit t4vf_wait_dev_ready(struct adapter *); | 235 | int __devinit t4vf_wait_dev_ready(struct adapter *); |
| 236 | int __devinit t4vf_port_init(struct adapter *, int); | 236 | int __devinit t4vf_port_init(struct adapter *, int); |
| 237 | 237 | ||
| 238 | int t4vf_fw_reset(struct adapter *); | ||
| 238 | int t4vf_query_params(struct adapter *, unsigned int, const u32 *, u32 *); | 239 | int t4vf_query_params(struct adapter *, unsigned int, const u32 *, u32 *); |
| 239 | int t4vf_set_params(struct adapter *, unsigned int, const u32 *, const u32 *); | 240 | int t4vf_set_params(struct adapter *, unsigned int, const u32 *, const u32 *); |
| 240 | 241 | ||
diff --git a/drivers/net/cxgb4vf/t4vf_hw.c b/drivers/net/cxgb4vf/t4vf_hw.c index ea1c123f0cb4..e306c20dfaee 100644 --- a/drivers/net/cxgb4vf/t4vf_hw.c +++ b/drivers/net/cxgb4vf/t4vf_hw.c | |||
| @@ -326,6 +326,25 @@ int __devinit t4vf_port_init(struct adapter *adapter, int pidx) | |||
| 326 | } | 326 | } |
| 327 | 327 | ||
| 328 | /** | 328 | /** |
| 329 | * t4vf_fw_reset - issue a reset to FW | ||
| 330 | * @adapter: the adapter | ||
| 331 | * | ||
| 332 | * Issues a reset command to FW. For a Physical Function this would | ||
| 333 | * result in the Firmware reseting all of its state. For a Virtual | ||
| 334 | * Function this just resets the state associated with the VF. | ||
| 335 | */ | ||
| 336 | int t4vf_fw_reset(struct adapter *adapter) | ||
| 337 | { | ||
| 338 | struct fw_reset_cmd cmd; | ||
| 339 | |||
| 340 | memset(&cmd, 0, sizeof(cmd)); | ||
| 341 | cmd.op_to_write = cpu_to_be32(FW_CMD_OP(FW_RESET_CMD) | | ||
| 342 | FW_CMD_WRITE); | ||
| 343 | cmd.retval_len16 = cpu_to_be32(FW_LEN16(cmd)); | ||
| 344 | return t4vf_wr_mbox(adapter, &cmd, sizeof(cmd), NULL); | ||
| 345 | } | ||
| 346 | |||
| 347 | /** | ||
| 329 | * t4vf_query_params - query FW or device parameters | 348 | * t4vf_query_params - query FW or device parameters |
| 330 | * @adapter: the adapter | 349 | * @adapter: the adapter |
| 331 | * @nparams: the number of parameters | 350 | * @nparams: the number of parameters |
