static int sdioh_probe(struct sdio_func *func) { int host_idx = func->card->host->index; uint32 rca = func->card->rca; wifi_adapter_info_t *adapter; osl_t *osh = NULL; sdioh_info_t *sdioh = NULL; sd_err(("bus num (host idx)=%d, slot num (rca)=%d\n", host_idx, rca)); adapter = dhd_wifi_platform_get_adapter(SDIO_BUS, host_idx, rca); if (adapter != NULL) sd_err(("found adapter info '%s'\n", adapter->name)); else sd_err(("can't find adapter info for this chip\n")); #ifdef WL_CFG80211 wl_cfg80211_set_parent_dev(&func->dev); #endif /* allocate SDIO Host Controller state info */ osh = osl_attach(&func->dev, SDIO_BUS, TRUE); if (osh == NULL) { sd_err(("%s: osl_attach failed\n", __FUNCTION__)); goto fail; } osl_static_mem_init(osh, adapter); sdioh = sdioh_attach(osh, func); if (sdioh == NULL) { sd_err(("%s: sdioh_attach failed\n", __FUNCTION__)); goto fail; } sdioh->bcmsdh = bcmsdh_probe(osh, &func->dev, sdioh, adapter, SDIO_BUS, host_idx, rca); if (sdioh->bcmsdh == NULL) { sd_err(("%s: bcmsdh_probe failed\n", __FUNCTION__)); goto fail; } sdio_set_drvdata(func, sdioh); return 0; fail: if (sdioh != NULL) sdioh_detach(osh, sdioh); if (osh != NULL) osl_detach(osh); return -ENOMEM; }
/* * Description: This function is called when the user application enables * EMF on a bridge interface. It primarily allocates memory * for instance data and calls the common code init function. * * Input: emf - EMF module global data pointer * inst_id - EMF instance name * br_ptr - Bridge device pointer */ static emf_info_t * emf_instance_add(emf_struct_t *emf, int8 *inst_id, struct net_device *br_ptr) { emf_info_t *emfi; osl_t *osh; #ifdef CONFIG_PROC_FS uint8 proc_name[64]; #endif /* CONFIG_PROC_FS */ emfc_wrapper_t emfl; if (emf->inst_count > EMF_MAX_INST) { EMF_ERROR("Max instance limit %d exceeded\n", EMF_MAX_INST); return (NULL); } emf->inst_count++; EMF_INFO("Creating EMF instance for %s\n", inst_id); osh = osl_attach(NULL, PCI_BUS, FALSE); ASSERT(osh); /* Allocate os specfic EMF info object */ emfi = MALLOC(osh, sizeof(emf_info_t)); if (emfi == NULL) { EMF_ERROR("Out of memory allocating emf_info\n"); osl_detach(osh); return (NULL); } emfi->osh = osh; /* Save the EMF instance identifier */ strncpy(emfi->inst_id, inst_id, IFNAMSIZ); emfi->inst_id[IFNAMSIZ - 1] = 0; /* Save the device pointer */ emfi->br_dev = br_ptr; /* Fill the linux wrapper specific functions */ emfl.forward_fn = (forward_fn_ptr)emf_forward; emfl.sendup_fn = (sendup_fn_ptr)emf_sendup; emfl.hooks_register_fn = (hooks_register_fn_ptr)emf_hooks_register; emfl.hooks_unregister_fn = (hooks_unregister_fn_ptr)emf_hooks_unregister; /* Initialize EMFC instance */ if ((emfi->emfci = emfc_init(inst_id, (void *)emfi, osh, &emfl)) == NULL) { EMF_ERROR("EMFC init failed\n"); MFREE(osh, emfi, sizeof(emf_info_t)); osl_detach(osh); return (NULL); } EMF_INFO("Created EMFC instance for %s\n", inst_id); /* Initialize the iflist head */ emfi->iflist_head = NULL; #ifdef CONFIG_PROC_FS sprintf(proc_name, "net/emf_stats_%s", inst_id); create_proc_read_entry(proc_name, 0, 0, emf_stats_get, emfi); sprintf(proc_name, "net/emfdb_%s", inst_id); create_proc_read_entry(proc_name, 0, 0, emf_mfdb_list, emfi); #endif /* CONFIG_PROC_FS */ /* Add to the global EMF instance list */ emfi->next = emf->list_head; emf->list_head = emfi; return (emfi); }
static int dev_nvram_init(void) { int order = 0, ret = 0; struct page *page, *end; unsigned int i; osl_t *osh; /* Allocate and reserve memory to mmap() */ while ((PAGE_SIZE << order) < nvram_space) order++; end = virt_to_page(nvram_buf + (PAGE_SIZE << order) - 1); for (page = virt_to_page(nvram_buf); page <= end; page++) { SetPageReserved(page); } #if defined(CONFIG_MTD) || defined(CONFIG_MTD_MODULE) /* Find associated MTD device */ for (i = 0; i < MAX_MTD_DEVICES; i++) { nvram_mtd = get_mtd_device(NULL, i); if (!IS_ERR(nvram_mtd)) { if (!strcmp(nvram_mtd->name, "nvram") && nvram_mtd->size >= nvram_space) { break; } put_mtd_device(nvram_mtd); } } if (i >= MAX_MTD_DEVICES) nvram_mtd = NULL; #endif /* Initialize hash table lock */ spin_lock_init(&nvram_lock); /* Initialize commit semaphore */ init_MUTEX(&nvram_sem); /* Register char device */ if ((nvram_major = register_chrdev(0, "nvram", &dev_nvram_fops)) < 0) { ret = nvram_major; goto err; } if (si_osh(sih) == NULL) { osh = osl_attach(NULL, SI_BUS, FALSE); if (osh == NULL) { printk("Error allocating osh\n"); unregister_chrdev(nvram_major, "nvram"); goto err; } si_setosh(sih, osh); } printk("dev_nvram_init: _nvram_init\n"); /* Initialize hash table */ _nvram_init((void *)sih); /* Create /dev/nvram handle */ nvram_class = class_create(THIS_MODULE, "nvram"); if (IS_ERR(nvram_class)) { printk("Error creating nvram class\n"); goto err; } /* Add the device nvram0 */ class_device_create(nvram_class, NULL, MKDEV(nvram_major, 0), NULL, "nvram"); /* reserve commit read buffer */ /* Backup sector blocks to be erased */ if (!(nvram_commit_buf = kmalloc(ROUNDUP(nvram_space, nvram_mtd->erasesize), GFP_KERNEL))) { printk("dev_nvram_init: nvram_commit_buf out of memory\n"); goto err; } /* Set the SDRAM NCDL value into NVRAM if not already done */ if (getintvar(NULL, "sdram_ncdl") == 0) { unsigned int ncdl; char buf[] = "0x00000000"; if ((ncdl = si_memc_get_ncdl(sih))) { sprintf(buf, "0x%08x", ncdl); nvram_set("sdram_ncdl", buf); nvram_commit(); } } return 0; err: dev_nvram_exit(); return ret; }
/* * Description: This function is called when user application enables snooping * on a bridge interface. It primarily allocates memory for IGS * instance data and calls common code initialization function. */ static igs_info_t * igs_instance_add(int8 *inst_id, struct net_device *br_ptr) { igs_info_t *igs_info; osl_t *osh; uint8 proc_name[64]; igsc_wrapper_t igsl; if (igs.inst_count > IGS_MAX_INST) { IGS_ERROR("Max instance limit %d exceeded\n", IGS_MAX_INST); return (NULL); } igs.inst_count++; IGS_INFO("Creating IGS instance for %s\n", inst_id); osh = osl_attach(NULL, PCI_BUS, FALSE); ASSERT(osh); /* Allocate os specfic IGS info object */ igs_info = MALLOC(osh, sizeof(igs_info_t)); if (igs_info == NULL) { IGS_ERROR("Out of memory allocating igs_info\n"); osl_detach(osh); return (NULL); } igs_info->osh = osh; /* Save the IGS instance identifier */ strncpy(igs_info->inst_id, inst_id, IFNAMSIZ); igs_info->inst_id[IFNAMSIZ - 1] = 0; /* Save the device pointer */ igs_info->br_dev = br_ptr; /* Fill in linux specific wrapper functions*/ igsl.igs_broadcast = (igs_broadcast_fn_ptr)igs_broadcast; /* Initialize IGSC layer */ if ((igs_info->igsc_info = igsc_init(inst_id, (void *)igs_info, osh, &igsl)) == NULL) { IGS_ERROR("IGSC init failed\n"); MFREE(osh, igs_info, sizeof(igs_info_t)); osl_detach(osh); return (NULL); } #ifdef CONFIG_PROC_FS sprintf(proc_name, "net/igs_stats_%s", inst_id); create_proc_read_entry(proc_name, 0, 0, igs_stats_get, igs_info); sprintf(proc_name, "net/igsdb_%s", inst_id); create_proc_read_entry(proc_name, 0, 0, igs_sdb_list, igs_info); #endif /* CONFIG_PROC_FS */ IGS_INFO("Created IGSC instance for %s\n", inst_id); /* Add to global IGS instance list */ OSL_LOCK(igs.lock); igs_info->next = igs.list_head; igs.list_head = igs_info; OSL_UNLOCK(igs.lock); return (igs_info); }
static int dev_nvram_init(void) { int order = 0, ret = 0; struct page *page, *end; unsigned int i; osl_t *osh; /* Allocate and reserve memory to mmap() */ while ((PAGE_SIZE << order) < NVRAM_SPACE) order++; end = virt_to_page(nvram_buf + (PAGE_SIZE << order) - 1); for (page = virt_to_page(nvram_buf); page <= end; page++) { SetPageReserved(page); } #if defined(CONFIG_MTD) || defined(CONFIG_MTD_MODULE) /* Find associated MTD device */ for (i = 0; i < MAX_MTD_DEVICES; i++) { nvram_mtd = get_mtd_device(NULL, i); if (!IS_ERR(nvram_mtd)) { if (!strcmp(nvram_mtd->name, "nvram") && nvram_mtd->size >= NVRAM_SPACE) { break; } put_mtd_device(nvram_mtd); } } if (i >= MAX_MTD_DEVICES) nvram_mtd = NULL; #endif #ifdef RTN66U_NVRAM_64K_SUPPORT int ret32; char *log_buf; u_int32_t offset_t; size_t log_len; DECLARE_WAITQUEUE(wait, current); wait_queue_head_t wait_q; struct erase_info erase; offset_t = 0x18000; ret32 = nvram_mtd->read(nvram_mtd, offset_t, 4, &log_len, &log_buf); if(log_buf==0xffffffff) { /* Erase sector blocks */ init_waitqueue_head(&wait_q); erase.mtd = nvram_mtd; erase.addr = 0; erase.len = nvram_mtd->erasesize; erase.callback = erase_callback; erase.priv = (u_long) &wait_q; set_current_state(TASK_INTERRUPTIBLE); add_wait_queue(&wait_q, &wait); /* Unlock sector blocks */ if (nvram_mtd->unlock) nvram_mtd->unlock(nvram_mtd, 0, nvram_mtd->erasesize); if ((ret = nvram_mtd->erase(nvram_mtd, &erase))) { set_current_state(TASK_RUNNING); remove_wait_queue(&wait_q, &wait); printk("nvram mtd erase error\n"); } /* Wait for erase to finish */ schedule(); remove_wait_queue(&wait_q, &wait); } #endif /* Initialize hash table lock */ spin_lock_init(&nvram_lock); /* Initialize commit semaphore */ init_MUTEX(&nvram_sem); /* Register char device */ if ((nvram_major = register_chrdev(0, "nvram", &dev_nvram_fops)) < 0) { ret = nvram_major; goto err; } if (si_osh(sih) == NULL) { osh = osl_attach(NULL, SI_BUS, FALSE); if (osh == NULL) { printk("Error allocating osh\n"); unregister_chrdev(nvram_major, "nvram"); goto err; } si_setosh(sih, osh); } /* Initialize hash table */ _nvram_init(sih); /* Create /dev/nvram handle */ nvram_class = class_create(THIS_MODULE, "nvram"); if (IS_ERR(nvram_class)) { printk("Error creating nvram class\n"); goto err; } /* Add the device nvram0 */ class_device_create(nvram_class, NULL, MKDEV(nvram_major, 0), NULL, "nvram"); /* reserve commit read buffer */ /* Backup sector blocks to be erased */ if (!(nvram_commit_buf = kmalloc(ROUNDUP(NVRAM_SPACE, nvram_mtd->erasesize), GFP_KERNEL))) { printk("dev_nvram_init: nvram_commit_buf out of memory\n"); goto err; } /* Set the SDRAM NCDL value into NVRAM if not already done */ if (getintvar(NULL, "sdram_ncdl") == 0) { unsigned int ncdl; char buf[] = "0x00000000"; if ((ncdl = si_memc_get_ncdl(sih))) { sprintf(buf, "0x%08x", ncdl); nvram_set("sdram_ncdl", buf); nvram_commit(); } } return 0; err: dev_nvram_exit(); return ret; }
static int dev_nvram_init(void) { int order = 0, ret = 0; struct page *page, *end; osl_t *osh; #if defined(CONFIG_MTD) || defined(CONFIG_MTD_MODULE) unsigned int i; #endif /* Allocate and reserve memory to mmap() */ while ((PAGE_SIZE << order) < nvram_space) order++; end = virt_to_page(nvram_buf + (PAGE_SIZE << order) - 1); for (page = virt_to_page(nvram_buf); page <= end; page++) { SetPageReserved(page); } #if defined(CONFIG_MTD) || defined(CONFIG_MTD_MODULE) /* Find associated MTD device */ for (i = 0; i < MAX_MTD_DEVICES; i++) { nvram_mtd = get_mtd_device(NULL, i); if (!IS_ERR(nvram_mtd)) { if (!strcmp(nvram_mtd->name, "nvram") && nvram_mtd->size >= nvram_space) { break; } put_mtd_device(nvram_mtd); } } if (i >= MAX_MTD_DEVICES) nvram_mtd = NULL; #endif /* Initialize hash table lock */ spin_lock_init(&nvram_lock); /* Initialize commit semaphore */ init_MUTEX(&nvram_sem); /* Register char device */ if ((nvram_major = register_chrdev(0, "nvram", &dev_nvram_fops)) < 0) { ret = nvram_major; goto err; } if (si_osh(sih) == NULL) { osh = osl_attach(NULL, SI_BUS, FALSE); if (osh == NULL) { printk("Error allocating osh\n"); unregister_chrdev(nvram_major, "nvram"); goto err; } si_setosh(sih, osh); } /* Initialize hash table */ _nvram_init(sih); /* Create /dev/nvram handle */ nvram_class = class_create(THIS_MODULE, "nvram"); if (IS_ERR(nvram_class)) { printk("Error creating nvram class\n"); goto err; } /* Add the device nvram0 */ #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 36) class_device_create(nvram_class, NULL, MKDEV(nvram_major, 0), NULL, "nvram"); #else /* Linux 2.6.36 and above */ device_create(nvram_class, NULL, MKDEV(nvram_major, 0), NULL, "nvram"); #endif /* Linux 2.6.36 */ return 0; err: dev_nvram_exit(); return ret; }
static #endif /* BCMLXSDMMC */ int bcmsdh_probe(struct device *dev) { struct osl_info *osh = NULL; bcmsdh_hc_t *sdhc = NULL; unsigned long regs = 0; bcmsdh_info_t *sdh = NULL; #if !defined(BCMLXSDMMC) && defined(BCMPLATFORM_BUS) struct platform_device *pdev; struct resource *r; #endif /* BCMLXSDMMC */ int irq = 0; u32 vendevid; unsigned long irq_flags = 0; #if !defined(BCMLXSDMMC) && defined(BCMPLATFORM_BUS) pdev = to_platform_device(dev); r = platform_get_resource(pdev, IORESOURCE_MEM, 0); irq = platform_get_irq(pdev, 0); if (!r || irq == NO_IRQ) return -ENXIO; #endif /* BCMLXSDMMC */ #if defined(OOB_INTR_ONLY) #ifdef HW_OOB irq_flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL | IORESOURCE_IRQ_SHAREABLE; #else irq_flags = IRQF_TRIGGER_FALLING; #endif /* HW_OOB */ irq = dhd_customer_oob_irq_map(&irq_flags); if (irq < 0) { SDLX_MSG(("%s: Host irq is not defined\n", __func__)); return 1; } #endif /* defined(OOB_INTR_ONLY) */ /* allocate SDIO Host Controller state info */ osh = osl_attach(dev, PCI_BUS); if (!osh) { SDLX_MSG(("%s: osl_attach failed\n", __func__)); goto err; } sdhc = kzalloc(sizeof(bcmsdh_hc_t), GFP_ATOMIC); if (!sdhc) { SDLX_MSG(("%s: out of memory\n", __func__)); goto err; } sdhc->osh = osh; sdhc->dev = (void *)dev; #ifdef BCMLXSDMMC sdh = bcmsdh_attach(osh, (void *)0, (void **)®s, irq); if (!sdh) { SDLX_MSG(("%s: bcmsdh_attach failed\n", __func__)); goto err; } #else sdh = bcmsdh_attach(osh, (void *)r->start, (void **)®s, irq); if (!sdh) { SDLX_MSG(("%s: bcmsdh_attach failed\n", __func__)); goto err; } #endif /* BCMLXSDMMC */ sdhc->sdh = sdh; sdhc->oob_irq = irq; sdhc->oob_flags = irq_flags; sdhc->oob_irq_registered = false; /* to make sure.. */ #if defined(OOB_INTR_ONLY) spin_lock_init(&sdhc->irq_lock); #endif /* chain SDIO Host Controller info together */ sdhc->next = sdhcinfo; sdhcinfo = sdhc; /* Read the vendor/device ID from the CIS */ vendevid = bcmsdh_query_device(sdh); /* try to attach to the target device */ sdhc->ch = drvinfo.attach((vendevid >> 16), (vendevid & 0xFFFF), 0, 0, 0, 0, (void *)regs, NULL, sdh); if (!sdhc->ch) { SDLX_MSG(("%s: device attach failed\n", __func__)); goto err; } return 0; /* error handling */ err: if (sdhc) { if (sdhc->sdh) bcmsdh_detach(sdhc->osh, sdhc->sdh); kfree(sdhc); } if (osh) osl_detach(osh); return -ENODEV; }