Skip to content

Commit

Permalink
orinoco: firmware: consistently compile out fw cache support if not r…
Browse files Browse the repository at this point in the history
…equested

Currently part of support for FW caching is unconditionally compiled
in even if it is never used. Consistently remove caching support if
not requested by user.

Signed-off-by: Andrey Borzenkov <arvidjaar@mail.ru>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Andrey Borzenkov authored and John W. Linville committed Mar 16, 2009
1 parent afece1c commit 2bfc5cb
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 13 deletions.
37 changes: 24 additions & 13 deletions drivers/net/wireless/orinoco/fw.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,19 @@ static const char *validate_fw(const struct orinoco_fw_header *hdr, size_t len)
return NULL;
}

#if defined(CONFIG_HERMES_CACHE_FW_ON_INIT) || defined(CONFIG_PM_SLEEP)
static inline const struct firmware *
orinoco_cached_fw_get(struct orinoco_private *priv, bool primary)
{
if (primary)
return priv->cached_pri_fw;
else
return priv->cached_fw;
}
#else
#define orinoco_cached_fw_get(priv, primary) (NULL)
#endif

/* Download either STA or AP firmware into the card. */
static int
orinoco_dl_firmware(struct orinoco_private *priv,
Expand Down Expand Up @@ -107,7 +120,7 @@ orinoco_dl_firmware(struct orinoco_private *priv,
if (err)
goto free;

if (!priv->cached_fw) {
if (!orinoco_cached_fw_get(priv, false)) {
err = request_firmware(&fw_entry, firmware, priv->dev);

if (err) {
Expand All @@ -117,7 +130,7 @@ orinoco_dl_firmware(struct orinoco_private *priv,
goto free;
}
} else
fw_entry = priv->cached_fw;
fw_entry = orinoco_cached_fw_get(priv, false);

hdr = (const struct orinoco_fw_header *) fw_entry->data;

Expand Down Expand Up @@ -170,7 +183,7 @@ orinoco_dl_firmware(struct orinoco_private *priv,

abort:
/* If we requested the firmware, release it. */
if (!priv->cached_fw)
if (!orinoco_cached_fw_get(priv, false))
release_firmware(fw_entry);

free:
Expand Down Expand Up @@ -273,40 +286,40 @@ symbol_dl_firmware(struct orinoco_private *priv,
int ret;
const struct firmware *fw_entry;

if (!priv->cached_pri_fw) {
if (!orinoco_cached_fw_get(priv, true)) {
if (request_firmware(&fw_entry, fw->pri_fw, priv->dev) != 0) {
printk(KERN_ERR "%s: Cannot find firmware: %s\n",
dev->name, fw->pri_fw);
return -ENOENT;
}
} else
fw_entry = priv->cached_pri_fw;
fw_entry = orinoco_cached_fw_get(priv, true);

/* Load primary firmware */
ret = symbol_dl_image(priv, fw, fw_entry->data,
fw_entry->data + fw_entry->size, 0);

if (!priv->cached_pri_fw)
if (!orinoco_cached_fw_get(priv, true))
release_firmware(fw_entry);
if (ret) {
printk(KERN_ERR "%s: Primary firmware download failed\n",
dev->name);
return ret;
}

if (!priv->cached_fw) {
if (!orinoco_cached_fw_get(priv, false)) {
if (request_firmware(&fw_entry, fw->sta_fw, priv->dev) != 0) {
printk(KERN_ERR "%s: Cannot find firmware: %s\n",
dev->name, fw->sta_fw);
return -ENOENT;
}
} else
fw_entry = priv->cached_fw;
fw_entry = orinoco_cached_fw_get(priv, false);

/* Load secondary firmware */
ret = symbol_dl_image(priv, fw, fw_entry->data,
fw_entry->data + fw_entry->size, 1);
if (!priv->cached_fw)
if (!orinoco_cached_fw_get(priv, false))
release_firmware(fw_entry);
if (ret) {
printk(KERN_ERR "%s: Secondary firmware download failed\n",
Expand Down Expand Up @@ -340,9 +353,9 @@ int orinoco_download(struct orinoco_private *priv)
return err;
}

#if defined(CONFIG_HERMES_CACHE_FW_ON_INIT) || defined(CONFIG_PM_SLEEP)
void orinoco_cache_fw(struct orinoco_private *priv, int ap)
{
#if defined(CONFIG_HERMES_CACHE_FW_ON_INIT) || defined(CONFIG_PM_SLEEP)
const struct firmware *fw_entry = NULL;
const char *pri_fw;
const char *fw;
Expand All @@ -362,18 +375,16 @@ void orinoco_cache_fw(struct orinoco_private *priv, int ap)
if (request_firmware(&fw_entry, fw, priv->dev) == 0)
priv->cached_fw = fw_entry;
}
#endif
}

void orinoco_uncache_fw(struct orinoco_private *priv)
{
#if defined(CONFIG_HERMES_CACHE_FW_ON_INIT) || defined(CONFIG_PM_SLEEP)
if (priv->cached_pri_fw)
release_firmware(priv->cached_pri_fw);
if (priv->cached_fw)
release_firmware(priv->cached_fw);

priv->cached_pri_fw = NULL;
priv->cached_fw = NULL;
#endif
}
#endif
5 changes: 5 additions & 0 deletions drivers/net/wireless/orinoco/fw.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,12 @@ struct orinoco_private;

int orinoco_download(struct orinoco_private *priv);

#if defined(CONFIG_HERMES_CACHE_FW_ON_INIT) || defined(CONFIG_PM_SLEEP)
void orinoco_cache_fw(struct orinoco_private *priv, int ap);
void orinoco_uncache_fw(struct orinoco_private *priv);
#else
#define orinoco_cache_fw(priv, ap) do { } while(0)
#define orinoco_uncache_fw(priv) do { } while (0)
#endif

#endif /* _ORINOCO_FW_H_ */
2 changes: 2 additions & 0 deletions drivers/net/wireless/orinoco/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2580,8 +2580,10 @@ struct net_device
netif_carrier_off(dev);
priv->last_linkstatus = 0xffff;

#if defined(CONFIG_HERMES_CACHE_FW_ON_INIT) || defined(CONFIG_PM_SLEEP)
priv->cached_pri_fw = NULL;
priv->cached_fw = NULL;
#endif

/* Register PM notifiers */
orinoco_register_pm_notifier(priv);
Expand Down
2 changes: 2 additions & 0 deletions drivers/net/wireless/orinoco/orinoco.h
Original file line number Diff line number Diff line change
Expand Up @@ -159,9 +159,11 @@ struct orinoco_private {
unsigned int tkip_cm_active:1;
unsigned int key_mgmt:3;

#if defined(CONFIG_HERMES_CACHE_FW_ON_INIT) || defined(CONFIG_PM_SLEEP)
/* Cached in memory firmware to use during ->resume. */
const struct firmware *cached_pri_fw;
const struct firmware *cached_fw;
#endif

struct notifier_block pm_notifier;
};
Expand Down

0 comments on commit 2bfc5cb

Please sign in to comment.