Skip to content

Commit

Permalink
iwlagn: remove knowledge of ucode image location from upper layers
Browse files Browse the repository at this point in the history
The upper layers of the driver do not need to know where the ucode is
stored.  It already passes in an enum of which ucode to load.  Let the
lower layer routines select the ucode to load.

Signed-off-by: Don Fry <donald.h.fry@intel.com>
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Don Fry authored and John W. Linville committed Nov 11, 2011
1 parent 5703ddb commit 8929c24
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 14 deletions.
26 changes: 23 additions & 3 deletions drivers/net/wireless/iwlwifi/iwl-agn-ucode.c
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,22 @@ static int iwlagn_load_section(struct iwl_trans *trans, const char *name,
return 0;
}

static inline struct fw_img *iwl_get_ucode_image(struct iwl_priv *priv,
enum iwlagn_ucode_type ucode_type)
{
switch (ucode_type) {
case IWL_UCODE_INIT:
return &priv->ucode_init;
case IWL_UCODE_WOWLAN:
return &priv->ucode_wowlan;
case IWL_UCODE_REGULAR:
return &priv->ucode_rt;
case IWL_UCODE_NONE:
break;
}
return NULL;
}

static int iwlagn_load_given_ucode(struct iwl_priv *priv,
struct fw_img *image)
{
Expand Down Expand Up @@ -520,13 +536,18 @@ static void iwlagn_alive_fn(struct iwl_priv *priv,
#define UCODE_CALIB_TIMEOUT (2*HZ)

int iwlagn_load_ucode_wait_alive(struct iwl_priv *priv,
struct fw_img *image,
enum iwlagn_ucode_type ucode_type)
{
struct iwl_notification_wait alive_wait;
struct iwlagn_alive_data alive_data;
int ret;
enum iwlagn_ucode_type old_type;
struct fw_img *image = iwl_get_ucode_image(priv, ucode_type);

if (!image) {
IWL_ERR(priv, "Invalid ucode requested (%d)\n", ucode_type);
return -EINVAL;
}

ret = iwl_trans_start_device(trans(priv));
if (ret)
Expand Down Expand Up @@ -609,8 +630,7 @@ int iwlagn_run_init_ucode(struct iwl_priv *priv)
NULL, NULL);

/* Will also start the device */
ret = iwlagn_load_ucode_wait_alive(priv, &priv->ucode_init,
IWL_UCODE_INIT);
ret = iwlagn_load_ucode_wait_alive(priv, IWL_UCODE_INIT);
if (ret)
goto error;

Expand Down
7 changes: 2 additions & 5 deletions drivers/net/wireless/iwlwifi/iwl-agn.c
Original file line number Diff line number Diff line change
Expand Up @@ -1452,9 +1452,7 @@ static int __iwl_up(struct iwl_priv *priv)
goto error;
}

ret = iwlagn_load_ucode_wait_alive(priv,
&priv->ucode_rt,
IWL_UCODE_REGULAR);
ret = iwlagn_load_ucode_wait_alive(priv, IWL_UCODE_REGULAR);
if (ret) {
IWL_ERR(priv, "Failed to start RT ucode: %d\n", ret);
goto error;
Expand Down Expand Up @@ -2102,8 +2100,7 @@ static int iwlagn_mac_suspend(struct ieee80211_hw *hw,

priv->shrd->wowlan = true;

ret = iwlagn_load_ucode_wait_alive(priv, &priv->ucode_wowlan,
IWL_UCODE_WOWLAN);
ret = iwlagn_load_ucode_wait_alive(priv, IWL_UCODE_WOWLAN);
if (ret)
goto error;

Expand Down
1 change: 0 additions & 1 deletion drivers/net/wireless/iwlwifi/iwl-agn.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,6 @@ int iwlagn_send_bt_env(struct iwl_priv *priv, u8 action, u8 type);
void iwlagn_send_prio_tbl(struct iwl_priv *priv);
int iwlagn_run_init_ucode(struct iwl_priv *priv);
int iwlagn_load_ucode_wait_alive(struct iwl_priv *priv,
struct fw_img *image,
enum iwlagn_ucode_type ucode_type);

/* lib */
Expand Down
7 changes: 2 additions & 5 deletions drivers/net/wireless/iwlwifi/iwl-sv-open.c
Original file line number Diff line number Diff line change
Expand Up @@ -396,8 +396,7 @@ static int iwl_testmode_driver(struct ieee80211_hw *hw, struct nlattr **tb)
break;

case IWL_TM_CMD_APP2DEV_LOAD_INIT_FW:
status = iwlagn_load_ucode_wait_alive(priv, &priv->ucode_init,
IWL_UCODE_INIT);
status = iwlagn_load_ucode_wait_alive(priv, IWL_UCODE_INIT);
if (status)
IWL_DEBUG_INFO(priv,
"Error loading init ucode: %d\n", status);
Expand All @@ -409,9 +408,7 @@ static int iwl_testmode_driver(struct ieee80211_hw *hw, struct nlattr **tb)
break;

case IWL_TM_CMD_APP2DEV_LOAD_RUNTIME_FW:
status = iwlagn_load_ucode_wait_alive(priv,
&priv->ucode_rt,
IWL_UCODE_REGULAR);
status = iwlagn_load_ucode_wait_alive(priv, IWL_UCODE_REGULAR);
if (status) {
IWL_DEBUG_INFO(priv,
"Error loading runtime ucode: %d\n", status);
Expand Down

0 comments on commit 8929c24

Please sign in to comment.