int cw1200_register_common(struct ieee80211_hw *dev) { struct cw1200_common *priv = dev->priv; int err; err = cw1200_pm_init(&priv->pm_state, priv); if (err) { cw1200_dbg(CW1200_DBG_ERROR, "Cannot init PM. (%d).\n", err); return err; } err = ieee80211_register_hw(dev); if (err) { cw1200_dbg(CW1200_DBG_ERROR, "Cannot register device (%d).\n", err); cw1200_pm_deinit(&priv->pm_state); return err; } #ifdef CONFIG_CW1200_LEDS err = cw1200_init_leds(priv); if (err) { cw1200_pm_deinit(&priv->pm_state); ieee80211_unregister_hw(dev); return err; } #endif /* CONFIG_CW1200_LEDS */ cw1200_debug_init(priv); cw1200_dbg(CW1200_DBG_MSG, "is registered as '%s'\n", wiphy_name(dev->wiphy)); return 0; }
/* Probe Function to be called by SDIO stack when device is discovered */ static int cw1200_sdio_probe(struct sdio_func *func, const struct sdio_device_id *id) { struct sbus_priv *self; int status; cw1200_dbg(CW1200_DBG_INIT, "Probe called\n"); self = kzalloc(sizeof(*self), GFP_KERNEL); if (!self) { cw1200_dbg(CW1200_DBG_ERROR, "Can't allocate SDIO sbus_priv."); return -ENOMEM; } spin_lock_init(&self->lock); self->pdata = cw1200_get_platform_data(); self->func = func; sdio_set_drvdata(func, self); sdio_claim_host(func); sdio_enable_func(func); sdio_release_host(func); status = cw1200_probe(&cw1200_sdio_sbus_ops, self, &func->dev, &self->core); if (status) { sdio_claim_host(func); sdio_disable_func(func); sdio_release_host(func); sdio_set_drvdata(func, NULL); kfree(self); } return status; }